2013-11-02 55 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'引用同样的东西),你应该能够以同样的方式调用原始版本。 –