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

Sql 错误:创建视图时没有参数$1,sql,postgresql,join,views,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 =

当我们尝试在函数中创建视图时,我们得到一个错误:没有参数$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行的new.artikelnr替换为值1时,它会正常工作,但该函数需要与不同的artikelnr一起工作

示例第7行:
在artikel.artikelnr=new.artikelnr上加入artikel

请给我们指出正确的方向

响应:我们必须创建此视图以用于教育目的。我上传了 我们数据库的视图和表结构:

我们的第一个目标是创造 一个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
我们唯一无法实现的就是从insert语句中获取Artikernr的值

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;
当我们替换
时,在artikel.artikelnr=new.artikelnr
在线7与

JOIN artikel ON artikel.artikelnr = 1 
它很好用。很抱歉,我的问题没有条理。我不知道哪些信息对回答这个问题很重要。

这是什么数据库

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

  • JOIN
    子句中用正确的表名替换
    new
  • 删除
    返回新代码
如果我没记错的话,MsAccess会在您拼错字段名时报告类似的错误。
下一步是检查所有字段名。或者,使用一些可视化查询生成器并创建这些联合查询,以确保所有字段名都正确

我认为你可以把那些CASE语句去掉,只把
0写成“somefieldname”

试试这个。它应该会起作用。(我没有对数据库进行测试)

编辑:
我对Postgresql了解不多,但您可能应该将-send
artikelnr
作为参数,然后在脚本中构造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

请注意,上面的代码不考虑引用,它肯定不会按原样工作(因为这个示例是出于教育目的,所以请读者将其作为练习进行更正:)

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

这是什么数据库

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

  • JOIN
    子句中用正确的表名替换
    new
  • 删除
    返回新代码
如果我没记错的话,MsAccess会在您拼错字段名时报告类似的错误。
下一步是检查所有字段名。或者,使用一些可视化查询生成器并创建这些联合查询,以确保所有字段名都正确

我认为你可以把那些CASE语句去掉,只把
0写成“somefieldname”

试试这个。它应该会起作用。(我没有对数据库进行测试)

编辑:
我对Postgresql了解不多,但您可能应该将-send
artikelnr
作为参数,然后在脚本中构造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

请注意,上面的代码不考虑引用,它肯定不会按原样工作(因为这个示例是出于教育目的,所以留给读者参考)