2011-11-16 67 views
0

沒有的功能,我可以這樣做:PLPGSQL:將參數傳遞給函數的休息,我的引號

DELETE FROM table1 
WHERE something='hello' 

我與事物的值的行=「你好」被刪除,但一旦我實現的功能,我開始有引號問題。

CREATE OR REPLACE FUNCTION somefunc(varchar) 
RETURNS varchar AS $$ 
BEGIN 

    DELETE FROM table1 
    WHERE something='$1'; 

    DELETE FROM table2 
    WHERE something='$1'; 

    RETURN $1; 

END; 
$$ LANGUAGE plpgsql;` 

似乎沒什麼可行的。我試過了(我在SO或別處看到過的所有變化):

something=$1 <-- says column "hello" doesn't exist (because no quotes are given) 
something=''$1'' 
something='''$1''' 
something=''''$1'''' 
something='''||$1||''' 
something=$Q$$1$Q1$ <--- gives syntax error 
something=$Q1$ $1 $Q1$ 
something=$$ $1 $$ 
something=quote_literal($1) 

還有很多其他的變化。我如何解決這個問題?

順便說一句,我正在使用python腳本來運行該功能。這是運行它的線。我也嘗試在這行中加入引號以及無效:

cur.execute("SELECT somefunc(%s);" % (sys.argv[2])) 

謝謝!

+0

使用'DELETE FROM表1 WHERE東西= $ 1;'和'SELECT somefunc( '你好')'爲我工作。所以我想它應該與你如何從python調用函數有關(我不知道Python,所以我不知道它可能是什麼) –

回答

1

此行爲基於準備語句的隱式使用。使用預準備語句時,查詢和參數將分別傳遞到數據庫服務器。不要在這種情況下引用值。 PL/pgSQL的使用準備語句,psycopg2使用準備語句,也:

... 
DECLARE myvar int; 
BEGIN 
    DELETE FROM mytab WHERE column = myvar; -- quietly using prepared statement 

DECLARE myvar int; 
BEGIN 
    -- using dynamic SQL is similar to classic languages, quoting is necessary 
    -- but use the quote_literal() function to protect against SQL injection 
    EXECUTE 'DELETE FROM mytab WHERE column = ' || quote_literal(myvar); 

    -- or dynamic SQL with "USING" clause 
    EXECUTE 'DELETE FROM mytab WHERE column = $1' USING myvar; 
+0

即使我的實現工作,當我使用ints ...它只停止當我使用varchars工作。即使實施了你的建議,我也遇到了同樣的問題。不過,我會將你的答案標記爲正確的。謝謝! – Nathron

+0

@Ronny:你在問題中的例子無法正確工作 - 既不是'integer'也不是'varchar'。 –