我正在尝试将行数作为整数分配给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”,因为这是一个错字。
答案 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
应该是首选。