2013-11-02 100 views
1

我正在使用Postgres upsert示例。我可以讓它像示例中所示那樣工作,但我需要使函數調用變爲動態。該功能是帶綁定參數的用戶定義函數

CREATE TABLE db (a INT PRIMARY KEY, b TEXT); 

CREATE FUNCTION merge_db(key INT, data TEXT) RETURNS VOID AS 
$$ 
BEGIN 
LOOP 
    UPDATE db SET b = data WHERE a = key; 
    IF found THEN 
     RETURN; 
    END IF; 
    BEGIN 
     INSERT INTO db(a,b) VALUES (key, data); 
     RETURN; 
    EXCEPTION WHEN unique_violation THEN 
    END; 
END LOOP; 
END; 
$$ 
LANGUAGE plpgsql; 

我能得到它的工作是這樣的:

SELECT merge_db(1, 'david'); 
SELECT merge_db(1, 'dennis'); 

但我想這樣做:

SELECT merge_db($1,$2); 

這可能嗎?我知道我可以通過串聯字符串來實現這一點,但我想準備我的聲明並使用綁定參數。

+0

如果你想打電話'merge_db'?從客戶端程序?從另一個PostgreSQL函數? –

+0

客戶端程序。我想使用像我將使用「INSERT INTO表VALUES($ 1,$ 2)」,然後用動態值執行語句。 – MParker

回答

1

不知道爲什麼我沒有想到之前嘗試這一點,但這裏的答案:

CREATE TABLE db (a INT PRIMARY KEY, b TEXT); 

CREATE FUNCTION merge_db(INT, TEXT) RETURNS VOID AS 
$$ 
BEGIN 
LOOP 
    UPDATE db SET b = $2 WHERE a = $1; 
    IF found THEN 
     RETURN; 
    END IF; 
    BEGIN 
     INSERT INTO db(a,b) VALUES ($1, $2); 
     RETURN; 
    EXCEPTION WHEN unique_violation THEN 
    END; 
END LOOP; 
END; 
$$ 
LANGUAGE plpgsql; 

這樣,您可以使用

SELECT merge_db($1, $2) 
+0

該函數與之前的函數沒有區別。參數的名稱只是一個佔位符('$ 1'和'key'引用同樣的東西),你應該能夠以同樣的方式調用原始版本。 –