我想知道如何在函数中使用动态查询。我已经尝试了很多方法,但是,当我试图编译我的函数时,会显示一条消息SQL 42601。
我使用的代码:
CREATE OR REPLACE FUNCTION prc_tst_bulk(sql text)
RETURNS TABLE (name text, rowcount integer) AS
$$
BEGIN
WITH v_tb_person AS (return query execute sql)
select name, count(*) from v_tb_person where nome like '%a%' group by name
union
select name, count(*) from v_tb_person where gender = 1 group by name;
END
$$ LANGUAGE plpgsql;
我收到错误消息:
ERROR: syntax error at or near "return"
LINE 5: WITH v_tb_person AS (return query execute sql)
我尝试使用:
WITH v_tb_person AS (execute sql)
WITH v_tb_person AS (query execute)
WITH v_tb_person AS (return query execute)
怎么啦?我该如何解决这个问题?
发布于 2013-04-30 13:20:48
你的函数是这样工作的:
CREATE OR REPLACE FUNCTION prc_tst_bulk(sql text)
RETURNS TABLE (name text, rowcount integer) AS
$$
BEGIN
RETURN QUERY EXECUTE '
WITH v_tb_person AS (' || sql || $x$)
SELECT name, count(*)::int FROM v_tb_person WHERE nome LIKE '%a%' GROUP BY name
UNION
SELECT name, count(*)::int FROM v_tb_person WHERE gender = 1 GROUP BY name$x$;
END
$$ LANGUAGE plpgsql;
呼叫:
SELECT * FROM prc_tst_bulk($$SELECT a AS name, b AS nome, c AS gender FROM tbl$$)
SQL您不能以您尝试的方式混合使用纯和动态
count()
返回bigint
的章节感兴趣,但是您已经将rowcount
定义为integer
,因此您需要一个显式的强制转换::int
才能使其工作,我使用<>F216>
然而,,这是被认为是 攻击的蜜罐,还是你真的要使用它?对于您非常私密和安全的使用,它可能是可以的-尽管我甚至不相信自己会有这样的功能。如果有任何不受信任的用户可能访问,这样的功能是一把上了膛的步枪。要保证安全是不可能的。
Craig ( SQL注入的死敌!)当他看到你在your preceding question的答案中从他的代码中伪造的东西时,他可能会被轻描淡写。:)
顺便说一句,这个查询本身看起来相当奇怪。但这并不是这里的重点。
https://stackoverflow.com/questions/16291944
复制相似问题