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

标签 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”,因为这是一个打字错误。

最佳答案

你的例子有点乱。

第一个示例是错误的 - 可能是 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/

相关文章:

ubuntu-12.04 - Ubuntu 12.04、PostgreSQL-9.1 - 无法访问 $libdir/postgis-2.0

postgresql - 根据计数限制插入的通用触发器

postgresql - 如何将 "explain analyze"结果输出到表列?

sql - 如何在 PostgreSQL 中创建只读用户?

sql - 在 PostgreSQL 中给定一个触发器如何确定它的关系

postgresql - plpython 获取 INSERT TRIGGER 上的所有行

python - 最有效的 psycopg2 python 转义函数

postgresql - 如何返回未从存储过程中找到的记录

sql - 在 Go Postgresql 中防止 SQL 注入(inject)

python - 如何处理 Django 中的大型查询集