gpt4 book ai didi

sql - 错误 : there is no parameter $1 when creating view

转载 作者:行者123 更新时间:2023-11-29 12:28:04 25 4
gpt4 key购买 nike

当我们尝试在函数中创建 View 时,我们得到错误:没有参数 $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 行:JOIN artikel ON artikel.artikelnr = new.artikelnr

请为我们指出正确的方向。

回应:出于教育目的,我们必须创建此 View 。我已经上传了一张图像我们数据库的 View 和表结构:

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

我们唯一无法实现的是从我们的插入语句中获取 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 关键字是什么?这段代码是从某个触发器复制的吗?

  • JOIN 子句中的 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 服务器)的经验,我认为您不应该为每条记录创建一个 View 。你想用这种方法完成什么?

如果目标是拥有预编译 View 并提高执行速度,那么参数化查询也可以达到同样的效果。将其放入存储过程并将 artikelnr 作为参数发送。

如果不是出于性能原因,您能否解释一下为什么要这样做。

编辑 2:
重新回答:您不能以这种方式创建 View 。问题是 CREATE VIEW 在不替换值的情况下获取语句 - 它尝试使用 new.artikelnr 创建 View 然后失败,因为你没有表 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您会发现使用引用函数的示例,这些函数应该用于正确构造上述命令。

关于sql - 错误 : there is no parameter $1 when creating view,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2593277/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com