[英]Variable substitution in PL/pgSQL
我有一个基于提供的参数动态生成的select语句。 问题是postgresql总是说:
无论参数是什么argument of WHERE must be type boolean, not type character varying
。 我有想念吗?
CREATE OR REPLACE FUNCTION getuid(name character varying) RETURNS integer AS $$
DECLARE
statement varchar;
uid integer;
BEGIN
IF ($1 = '') THEN
statement := 'TRUE';
statement := CAST(statement AS BOOLEAN);
ELSE
statement := 'users.keywords ILIKE''' || '%' || $1 || '%''';
END IF;
SELECT INTO uid id FROM users WHERE "statement";
RETURN uid;
END;
$$ LANGUAGE plpgsql
如果要在函数内部生成动态命令,则需要EXECUTE 。 您还可以使用两个不同的部分:
CREATE OR REPLACE FUNCTION getuid(name character varying) RETURNS integer AS $$
DECLARE
statement varchar;
uid integer;
BEGIN
IF ($1 = '' OR $1 IS NULL) THEN -- section 1
SELECT id INTO uid FROM users;
ELSE -- section 2
SELECT id INTO uid FROM users WHERE users.keywords ILIKE '%' || $1 || '%';
END IF;
RETURN uid;
END;
$$ LANGUAGE plpgsql;
EXECUTE
是PL / pgSQL语句而不是SQL语句。 所以你必须将动态查询包装到PL / pgSQL存储过程中。
注意变量替换,在构建查询时不要忘记使用quote_literal()
或quote_nullable()
。
在这里查看文档: http : //www.postgresql.org/docs/current/static/plpgsql-statements.html#PLPGSQL-STATEMENTS-EXECUTING-DYN
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.