我正在尝试将行数作为整数分配给 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”,因为这是一个打字错误。
最佳答案
你的例子有点乱。
第一个示例是错误的 - 可能是 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
quote_literal()
当您不能使用 USING
子句时,对于动态 SQL 通常是必需的。在你的例子中:
EXECUTE 'SELECT count(*) FROM xxx WHERE xxx.v = ' || quote_literal(val1)
INTO ...
它防止 SQL 注入(inject)并确保正确转义。
现代版本有 format()
功能:
EXECUTE format('SELECT count(*) FROM xxx WHERE xxx.v = %L', val1) INTO ...
但是 EXECUTE ... USING
应该是首选。
关于postgresql - 无法将行数分配给 plpgsql 中的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21811212/