【问题标题】:PL/pgSQL function seems be be choosing the wrong variable?PL/pgSQL 函数似乎选择了错误的变量?
【发布时间】:2014-11-05 22:54:22
【问题描述】:

我正在尝试完成这项工作,并且在没有两次 artikli_racun 更新的情况下对其进行了测试,并且它有效。因此,如果我只有 cena(price),它将起作用,并且需要 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;

【问题讨论】:

  • 要获取英文错误消息,请在会话中运行 SET lc_messages = 'C'。要正确修复您的代码,我们需要查看表定义,最重要的是(但不限于)psql 中的\d artikli_racun

标签: sql function postgresql error-handling plpgsql


【解决方案1】:

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

【讨论】:

  • 这不是问题。我的问题是这句话 KONTEKST: SQL statement "UPDATE artikli_racun SET id_artikla=(SELECT id FROM artikli WHERE ime=$1 ) WHERE artikel= $1 " 它显示它与第一个变量匹配,它应该与 $2 变量匹配
  • @someone123 - 不,不是。每个语句都是它自己准备好的查询,因此 $1 是从查询的“内部”查看的。试着给你的函数参数命名,你会看到的。
【解决方案2】:

错误信息中的位置参数$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

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

【讨论】:

    猜你喜欢
    • 2017-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-04
    • 1970-01-01
    • 2012-07-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多