2014-11-05 44 views
1

我試圖做這個工作,我沒有兩個artikli_racun更新測試它,它的工作。所以,如果我只有cena(價格),它會起作用,它將花費2美元,但很明顯,這裏說「artikel」行不存在,我不知道該怎麼做。這需要$ 1,我需要一個解決方案,爲什麼需要這個變量...PL/pgSQL函數似乎是選擇了錯誤的變量?

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; 
+0

要獲取英文錯誤消息,請在會話中運行SET c_messages ='C''。爲了正確地修復你的代碼,我們需要查看錶定義,重要的是(但不限於)'psql'中的'\ d artikli_racun'。 – 2014-11-07 02:30:52

+0

[那麼你有答案嗎?](http://meta.stackexchange.com/a/5235/169168) – 2015-07-24 03:23:55

回答

0

根據錯誤信息表artikli_racun缺少列artikel。 順便說一下,有多個更新語句在相同的表上運行 - 它們可以合併爲一個。

+0

這不是問題所在。我的問題是這句話KONTEKST:SQL語句「UPDATE artikli_racun SET id_artikla =(SELECT id FROM artikli WHERE ime = $ 1)where artikel = $ 1」它表明它與第一個變量匹配,它應該與$ 2變量匹配 – someone123 2014-11-06 00:04:13

+1

@ someone123 - 不,它不是。每個語句都是自己準備好的查詢,因此$ 1是從查詢的「內部」查看的。試着給你的函數參數名稱,你會看到。 – 2014-11-06 00:58:18

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

旁白:你的功能還有待改進,但最好的解決方案取決於你的實際表定義和要求。