2013-01-09 57 views
1

我想通過PostgreSQL中的Pl/pgSQL更新一行,但會發生錯誤。這是我的代碼:動態SQL中的參數串聯

CREATE OR REPLACE FUNCTION "Surrogate_Del"(tablename text, surro uuid) 
    RETURNS void AS 
$BODY$DECLARE 
tblname text; 
surrogate uuid; 
BEGIN 
tblname:=tablename; 
surrogate:=surro; 
execute 'UPDATE'||tblname||'SET ID=NULL WHERE surrogate='||surrogate|| ; 
END$BODY$ 
LANGUAGE plpgsql 

這是我要更新其備案基地的UUID

*syntax Error »ab7« 
cd32cdf0-5ab7-11e2-abda-1c4bd605a98d 
        ^* 

我怎樣才能解決這個問題?

+0

更新後和set之前缺少空格:''UPDATE'|| tblname ||' SET ...' –

+0

我編輯了我的查詢,但錯誤仍然存​​在 – Kabi

+0

請再次包含您的更新代碼以及任何新的錯誤消息。你的更新將解決一個語法錯誤,現在你有另一個語法錯誤。 –

回答

4

你需要逃出各地參數報價:

execute 'UPDATE ' || tblname || ' SET ID = NULL WHERE surrogate = ''' || surrogate || ''''; 

畝的建議是更清潔和更強大的:

execute 'UPDATE ' || tblname || ' SET ID = NULL WHERE surrogate = ' || quote_literal(surrogate); 

如果是PostgreSQL的較新版本(9.0或更高版本我猜的),你可以使用format功能:

execute format('UPDATE %I SET ID = NULL WHERE surrogate = %L', tblname, surrogate); 

%L逃脫它作爲SQL文字。

+0

@ muistooshort更新 –

3

通常優越的方法是insert values with a USING clause。這樣可以避免在鑄造到text以及後面的運行時間開銷以及引用特殊字符時可能帶來的危險。

您也可以直接使用您的命名參數。在聲明和分配另一層局部變量時沒有意義:

CREATE OR REPLACE FUNCTION surrogate_del (_tblname text, _surro uuid) 
    RETURNS void AS 
$BODY$ 
BEGIN 
    EXECUTE format('UPDATE %I SET ID = NULL WHERE surrogate = $1', _tblname) 
    USING _surro; 
END 
$BODY$ LANGUAGE plpgsql 

我還將函數名稱轉換爲小寫並刪除了雙引號。我個人的建議是從來沒有在PostgreSQL中使用CamelCase標識符。這是一個不斷的痛苦來源。

在相關說明上:請記住以區分大小寫的方式提供表名稱_tblnameformat() or quote_ident()保持拼寫逐字。