当我们试图在函数中创建视图时,会得到错误:没有参数$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中,您将找到使用引号函数的示例,这些引号函数应用于正确构造上述命令。

10-05 23:09