PL / pgSQL函数似乎是选择了错误的变量?

时间:2014-11-05 22:54:23

标签: sql function postgresql error-handling plpgsql

我试图完成这项工作,并且我在没有两个artikli_racun更新的情况下对其进行了测试,但它确实有效。因此,如果我只有cena(价格)它将起作用,它将需要2美元,但显然在这里它说的是" artikel"不存在,我不知道该怎么做。这需要1美元,我需要一个解决方案,为什么它需要这个变量......

NAPAKA:  stolpec "artikel" ne obstaja

KONTEKST:  SQL statement "UPDATE artikli_racun SET id_artikla=(SELECT id FROM artikli WHERE ime=$1 ) WHERE artikel= $1 "
PL/pgSQL function "racun123" line 6 at SQL statement


CREATE OR REPLACE FUNCTION racun123(integer,varchar) RETURNS 
BOOLEAN AS
$$
BEGIN
IF (SELECT zaloga FROM artikli WHERE ime=$2)>0 THEN
INSERT INTO racun1(id,artikel) VALUES($1,$2);
UPDATE racun1 SET cena=(SELECT prodajna_cena FROM artikli WHERE 
ime=$2) WHERE artikel=$2;
UPDATE artikli_racun SET id_artikla=(SELECT id FROM artikli WHERE 
ime=$2) WHERE artikel=$2;
UPDATE artikli_racun SET id_racuna=(SELECT id FROM racun1 WHERE 
ime=$2) WHERE artikel=$2;
UPDATE artikli set zaloga=zaloga-1 WHERE ime=$2;
RETURN true;
ELSE RETURN false;
END IF;
END;
$$LANGUAGE plpgsql;

2 个答案:

答案 0 :(得分:0)

根据错误消息表artikli_racun缺少列artikel。 顺便说一句,有多个更新语句在同一个表上运行 - 它们可以合并为一个。

答案 1 :(得分:0)

错误消息中的位置参数 $1 是函数正文中位置参数$1$2完全独立 。同样的符号。

如果在函数中用命名参数替换$ 1和$ 2,您仍会在错误消息中看到$1$2,它们在预准备语句的上下文中使用:PL / pgSQL在内部执行每个语句作为预准备语句并缓存查询计划。

CREATE OR REPLACE FUNCTION racun123(_param1 integer, _param2 varchar)
  RETURNS ...

...

UPDATE artikli_racun
SET id_artikla = (SELECT id FROM artikli WHERE ime = _param2)
WHERE artikel = _param2;

...

错误消息仍然会说:

SQL statement "UPDATE artikli_racun
 SET id_artikla=(SELECT id FROM artikli WHERE ime=$1 ) WHERE artikel= $1

除此之外:您的功能可以改进,但最佳解决方案取决于您的实际表格定义和要求。