无法将行计数分配给plpgsql中的变量

时间:2014-02-16 12:38:44

标签: postgresql postgresql-9.1 plpgsql

我正在尝试将行数作为整数分配给plpgsql 9.1中的变量 尝试1:没有分配任何内容

maz int := (SELECT count(col1) FROM table WHERE col1 = quote_literal(val1));

尝试2:在INTO附近收到错误

EXECUTE 'SELECT count(col1) FROM table
         WHERE col1 = quote_literal(val1) INTO maz';

编辑:删除“in”,因为这是一个错字。

1 个答案:

答案 0 :(得分:3)

你的例子有点乱。

第一个例子是错误的 - 可能是错误地使用IN关键字,而quote_literal()在此上下文中绝对没用。第二个也可能是错误的 - 如果val1是一个变量。 plpgsql变量在EXECUTE语句的SQL字符串中不可见。下一期是SQL字符串中的INTO

postgres=# do $$
           DECLARE rc int;
                   val1 varchar := 'Hello'; 
           BEGIN
             rc := (SELECT count(*) FROM xxx WHERE xxx.v = val1);
             RAISE NOTICE '%', rc;
             EXECUTE 'SELECT count(*) FROM xxx WHERE xxx.v = $1'
             USING val1 INTO rc;
             RAISE NOTICE '%', rc;
           END;
           $$;
NOTICE:  1
NOTICE:  1
DO
当您不能使用USING子句时,动态SQL通常需要

quote_literal()。在您的示例中:

EXECUTE 'SELECT count(*) FROM xxx WHERE xxx.v = ' || quote_literal(val1)
INTO ...

它可以防止SQL注入并确保正确转义。

现代版本具有format()功能:

EXECUTE format('SELECT count(*) FROM xxx WHERE xxx.v = %L', val1) INTO ...

EXECUTE ... USING应该是首选。