当我们试图在函数中创建视图时,会得到错误:没有参数$1。这是示例代码。
Begin
CREATE VIEW artikelnr AS
SELECT datum, 'uitgifte' as "type", CASE WHEN 'test'='test' THEN 0 END as "aantal ontvangen", aantal as "aantal uitgegeven"
FROM uitgifteregel
JOIN artikel ON artikel.artikelnr = new.artikelnr
JOIN uitgifte ON uitgifte.uitgiftenr = uitgifteregel.uitgiftenr
UNION
SELECT datum, 'ontvangst' as "type", aantal as "aantal ontvangen" , CASE WHEN 'test'='test' THEN 0 END as "aantal uitgegeven"
FROM ontvangstregel
JOIN artikel ON artikel.artikelnr = new.artikelnr
JOIN ontvangst ON ontvangst.ontvangstnr = ontvangstregel.ontvangstnr;
Return new;
end;
当我们在第7行用值1替换new.artikelnr时,它的工作原理与应该的一样,但该函数需要与不同的artikelnr一起工作。
第7行示例:
JOIN artikel ON artikel.artikelnr = new.artikelnr
请指引我们正确的方向。
回应:为了教育目的,我们必须创造这种观点。我上传了一张
数据库的视图和表结构:
http://img208.imageshack.us/img208/5655/tablesk.jpg
我们的第一个目标是
一位艺术家的风景。我们通过以下代码实现了这一点:
CREATE VIEW artikelmutatiestotaal AS
SELECT null as "datum",'totaal' as "type",sum(ontvangstregel.aantal)as "aantal ontvangen",sum(uitgifteregel.aantal) as "aantal uitgegeven"
FROM uitgifteregel, ontvangstregel
UNION
SELECT datum,'uitgifte' as "type", CASE WHEN 'test'='test' THEN 0 END as "aantal ontvangen", aantal as "aantal uitgegeven"
FROM uitgifteregel
JOIN artikel ON artikel.artikelnr = 1
JOIN uitgifte ON uitgifte.uitgiftenr = uitgifteregel.uitgiftenr
UNION
SELECT datum,'ontvangst' as "type", aantal as "aantal ontvangen" , CASE WHEN 'test'='test' THEN 0 END as "aantal uitgegeven"
FROM ontvangstregel
JOIN artikel ON artikel.artikelnr = 1
JOIN ontvangst ON ontvangst.ontvangstnr = ontvangstregel.ontvangstnr
我们唯一不能实现的是从insert语句中获取artikelnr的值。
CREATE FUNCTION addview() returns trigger as '
Begin
CREATE VIEW artikelnr AS
SELECT null as "datum",'totaal' as "type",sum(ontvangstregel.aantal)as "aantal ontvangen",sum(uitgifteregel.aantal) as "aantal uitgegeven"
FROM uitgifteregel, ontvangstregel
UNION
SELECT datum,'uitgifte' as "type", CASE WHEN 'test'='test' THEN 0 END as "aantal ontvangen", aantal as "aantal uitgegeven"
FROM uitgifteregel
JOIN artikel ON artikel.artikelnr = new.artikelnr
JOIN uitgifte ON uitgifte.uitgiftenr = uitgifteregel.uitgiftenr
UNION
SELECT datum,'ontvangst' as "type", aantal as "aantal ontvangen" , CASE WHEN 'test'='test' THEN 0 END as "aantal uitgegeven"
FROM ontvangstregel
JOIN artikel ON artikel.artikelnr = artikelnr
JOIN ontvangst ON ontvangst.ontvangstnr = ontvangstregel.ontvangstnr
end;
'language plpgsql;
当我们替换
JOIN artikel ON artikel.artikelnr = new.artikelnr
在7号线上
JOIN artikel ON artikel.artikelnr = 1
它工作得很好。很抱歉把我的问题发得很无条理。我不知道什么信息对回答这个问题很重要。
最佳答案
这是什么数据库?
这个new
关键字是什么?这段代码是从某个触发器复制的吗?
在new
子句中将JOIN
替换为正确的表名。
删除Return new;
如果我没记错的话,MsAccess会在您拼错字段名时报告类似的错误。
接下来要检查所有字段名。或者,使用一些可视化查询生成器并创建这些联合查询,以确保所有字段名都是正确的。
我认为你可以把那些案例陈述放在一边,写下0 AS "Some Fieldname"
试试这个。它应该有用。(我没有根据数据库测试)
CREATE OR REPLACE VIEW artikelnr AS
SELECT datum, 'uitgifte' as "type", 0 as "aantal ontvangen",
aantal as "aantal uitgegeven"
FROM uitgifteregel
JOIN artikel ON artikel.artikelnr = uitgifteregel.artikelnr
JOIN uitgifte ON uitgifte.uitgiftenr = uitgifteregel.uitgiftenr
UNION
SELECT datum, 'ontvangst' as "type", aantal as "aantal ontvangen" ,
0 as "aantal uitgegeven"
FROM ontvangstregel
JOIN artikel ON artikel.artikelnr = ontvangstregel.artikelnr
JOIN ontvangst ON ontvangst.ontvangstnr = ontvangstregel.ontvangstnr;
编辑:
我对Postgresql了解不多,但您可能应该将
EXECUTE SCRIPT
-sendartikelnr
作为参数,然后在脚本中构造供查看的DDL。根据我对其他数据库(Oracle和SQL server)的经验,我认为不应该为每个记录创建一个视图。你想用这种方法来完成什么?
如果目标是拥有预编译视图并提高执行速度,那么参数化查询也可能实现同样的目的。将其放入存储过程,并将
artikelnr
作为参数发送。如果不是因为表演原因,你能解释一下你为什么这样做吗。
编辑2:
回答:你不能那样创建视图。问题是
CREATE VIEW
获取语句而不替换值-它尝试用new.artikelnr
创建视图,但失败,因为触发器之外没有表new
。您需要将语句构造为字符串或文件,然后执行该语句。我查看了PostgreSQL的文档,有一个EXECUTE
命令用于构造和执行动态命令。像这样的事情可能会奏效:EXECUTE
'CREATE OR REPLACE VIEW artikelnr AS '
|| ' SELECT datum, 'uitgifte' as "type", 0 as "aantal ontvangen",'
|| ' aantal as "aantal uitgegeven" '
|| ' FROM uitgifteregel '
|| ' JOIN artikel ON artikel.artikelnr = '
|| new.artikelnr
|| ' JOIN uitgifte ON uitgifte.uitgiftenr = uitgifteregel.uitgiftenr '
|| ' UNION '
|| ' SELECT datum, 'ontvangst' as "type", aantal as "aantal ontvangen" , '
|| ' 0 as "aantal uitgegeven" '
|| ' FROM ontvangstregel '
|| ' JOIN artikel ON artikel.artikelnr = '
|| new.artikelnr
|| ' JOIN ontvangst ON ontvangst.ontvangstnr = ontvangstregel.ontvangstnr; '
这是一个巨大的concat,
new.artikelnr
值插入正确的位置。它将artikelnr
的文本值“插入”到SQL代码中,然后通过EXECUTE
语句执行SQL。请注意,上面的代码并不关心引用,它肯定不会按原样工作(因为这个示例是为了教育目的,所以留给读者作为练习来更正它:)。
在documentation for
EXECUTE
statement中,您将找到使用引号函数的示例,这些引号函数应用于正确构造上述命令。