2011-11-16 42 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'。 –