首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >PostgreSQL - SQL状态: 42601语法错误

PostgreSQL - SQL状态: 42601语法错误
EN

Stack Overflow用户
提问于 2013-04-30 12:00:32
回答 1查看 154.9K关注 0票数 8

我想知道如何在函数中使用动态查询。我已经尝试了很多方法,但是,当我试图编译我的函数时,会显示一条消息SQL 42601。

我使用的代码:

代码语言:javascript
运行
复制
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;

我收到错误消息:

代码语言:javascript
运行
复制
ERROR:  syntax error at or near "return"
LINE 5:     WITH v_tb_person AS (return query execute sql)

我尝试使用:

代码语言:javascript
运行
复制
WITH v_tb_person AS (execute sql)

WITH v_tb_person AS (query execute)

WITH v_tb_person AS (return query execute)

怎么啦?我该如何解决这个问题?

这是一个与PostgreSQL equivalent of Oracle “bulk collect”相关的问题

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-04-30 13:20:48

你的函数是这样工作的:

代码语言:javascript
运行
复制
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;

呼叫:

代码语言:javascript
运行
复制
SELECT * FROM prc_tst_bulk($$SELECT a AS name, b AS nome, c AS gender FROM tbl$$)

SQL您不能以您尝试的方式混合使用纯和动态

  • 。整个语句要么全是动态的,要么全是纯SQL。因此,我正在构建一条动态语句来实现这一点。您可能对关于executing dynamic commands in the manual.
  • The聚合函数count()返回bigint的章节感兴趣,但是您已经将rowcount定义为integer,因此您需要一个显式的强制转换::int才能使其工作,我使用
  • dollar quoting来避免引用地狱。

<>F216>

然而,,这是被认为是 攻击的蜜罐,还是你真的要使用它?对于您非常私密和安全的使用,它可能是可以的-尽管我甚至不相信自己会有这样的功能。如果有任何不受信任的用户可能访问,这样的功能是一把上了膛的步枪。要保证安全是不可能的。

Craig ( SQL注入的死敌!)当他看到你在your preceding question的答案中从他的代码中伪造的东西时,他可能会被轻描淡写。:)

顺便说一句,这个查询本身看起来相当奇怪。但这并不是这里的重点。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16291944

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档