2015-03-31 27 views
0

我試圖使我的存儲過程工作的問題。簡單更新設置postgres存儲過程

這是我的問題:
我有一個表,名爲a的列,在這一欄中有電話號碼。

我要補充0039如果數字開頭1830(或保留原樣如果沒有),並存儲在B列的新號碼。

這是我的代碼:

CREATE OR REPLACE FUNCTION upg_table() RETURNS void AS $$ 
BEGIN 
IF (substring(a from 0 for 2)!='00') 
    AND (substring(a from 0 for 1)='3') 
    OR (substring(a from 0 for 1)='0') 
    OR (substring(a from 0 for 1)='1') 
    OR (substring(a from 0 for 1)='8') 
THEN 
UPDATE cdr 
SET 
    b = '0039'||a; 
ELSE 
UPDATE cdr 
SET 
    b = a; 
END IF; 
END; 
$$ LANGUAGE plpgsql; 

的錯誤是:

ERROR: the column "a" does not exist
ROW 1: SELECT substring(a from 0 for 2)!='00' AND ...

+0

乍一看,你的布爾邏輯看起來不合時宜。你應該在你的想法中加上括號。像'(sub1 AND sub2)或者(sub3 AND sub4)' – paqogomez 2015-03-31 16:03:32

+0

你的錯誤來自於你不從任何地方聲明或拉扯'a'的事實。我認爲你需要將你的if語句改成'select case'。 – paqogomez 2015-03-31 16:05:47

+0

在你的'if'語句中,你只能引用變量或參數。但是,您既沒有名爲'a'的變量也沒有名爲'a'的參數 – 2015-03-31 16:15:53

回答

0

你的代碼有兩個錯誤:

  • 不能引用列a就像是一個(不存在的)plpgsql變量。你也必須循環。你的方法根本不起作用根本就沒有
  • 您得到operator precedence錯誤。 ANDOR之前綁定。

但最重要的是,你不需要plpgsql函數。一個普通UPDATE將做的工作:

UPDATE cdr 
SET b = CASE WHEN left(a, 1) IN ('0', '1', '3', '8') 
       AND left(a, 2) <> '00' 
      THEN '0039' || a ELSE a END; 

這將更新b所有行,但只有一些具有改變a