Sql 错误:创建视图时没有参数$1
当我们尝试在函数中创建视图时,我们得到一个错误:没有参数$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 =
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
- 删除
返回新代码代码>
下一步是检查所有字段名。或者,使用一些可视化查询生成器并创建这些联合查询,以确保所有字段名都正确 我认为你可以把那些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
- 删除
返回新代码代码>
下一步是检查所有字段名。或者,使用一些可视化查询生成器并创建这些联合查询,以确保所有字段名都正确 我认为你可以把那些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请注意,上面的代码不考虑引用,它肯定不会按原样工作(因为这个示例是出于教育目的,所以留给读者参考)