错误:创建视图时没有参数$ 1

时间:2010-04-07 14:31:09

标签: sql postgresql join views

当我们尝试在函数内创建视图时,我们得到错误:没有参数$ 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

我们的第一个目标是创造 一个artikel的视图。我们通过以下代码实现了这一目标:

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

我们唯一无法实现的是从插入语句中获取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 

它工作正常。很抱歉发布我的问题非常非结构化。我不太清楚哪些信息对回答这个问题很重要。

1 个答案:

答案 0 :(得分:0)

这是什么数据库?

这个new关键字是什么?这些代码是从某个触发器复制的吗?

  • new替换为JOIN子句中的正确表名。
  • 删除Return new;

如果我没记错的话,当你拼错字段名时,MsAccess会报告类似的错误 接下来要检查所有字段名称。或者,使用一些可视化查询构建器并创建这些联合查询,以确保所有字段名称都正确。

我认为你可以放弃那些CASE语句并只写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 - 发送artikelnr作为参数,然后在脚本中为视图构建DDL。

根据我对其他数据库(Oracle和SQL服务器)的经验,我认为你不应该为每条记录创建一个视图。你想用这种方法完成什么?

如果目标是预编译视图和此增益执行速度,则可以使用参数化查询实现相同的目标。将其放入存储过程并发送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; '

这是一个在正确位置插入new.artikelnr值的巨型concat。它将artikelnr的文字值“插入”到SQL代码中,然后获得通过EXECUTE语句执行的SQL。

请注意,上面的代码没有注意引用,它肯定不会按原样运行(因为这个例子是出于教育目的,所以留给读者纠正它作为练习:)。

documentation for EXECUTE statement中,您将找到使用引用函数的示例,这些函数应该用于正确构造上述命令。