使用 PL/SQL 函数体返回 SQL 查询

Posted

技术标签:

【中文标题】使用 PL/SQL 函数体返回 SQL 查询【英文标题】:Using the PL/SQL Function body returning SQL query 【发布时间】:2018-11-15 16:14:53 【问题描述】:

我正在使用 Oracle APEX,并且正在尝试将动态 sql 查询存储在 PL/SQL 函数正文中。这是我当前对经典报告的 SQL 查询:

SELECT 
    RELEASE,
    COUNT(*) as "Total Tests", --total
    SUM(CASE WHEN TYPE = 'P1' THEN 1 ELSE 0 END) as "P1",
    SUM(CASE WHEN TYPE = 'P2' THEN 1 ELSE 0 END) as "P2",
    SUM(CASE WHEN TYPE = 'P3' THEN 1 ELSE 0 END) as "P3",
    SUM(CASE WHEN TYPE = 'P4' THEN 1 ELSE 0 END) as "P4"
    FROM TABLENAME
group by RELEASE
ORDER BY case
    when RELEASE = '19.3' then 1
    when RELEASE = '18.11' then 2
    when RELEASE = '18.9' then 3
    when RELEASE = '18.7' then 4
    when RELEASE = '17.3' then 5
    else 6
end asc

我正在尝试将“表名”存储在页面项目中,以便每当用户更改页面项目时,此查询将自动从给定表中提取。我试图围绕这个构建一个 pl/sql 函数,但继续遇到“字符串”错误。

有人知道如何将其转换为动态 pl/sql 函数吗?

提前致谢。

【问题讨论】:

错误信息是什么? ORA-20999:解析返回的查询结果为“ORA-20999:无法解析 SQL 查询!

ORA-06550:第 24 行,第 8 列:ORA-00904:“18.7”:无效标识符

".
您能介绍一下您的 PL/SQL 函数代码吗? 【参考方案1】:

你应该

创建一个源是返回查询的函数的经典报表

该查询应如下所示:

return '
  SELECT 
    RELEASE,
    COUNT(*) as "Total Tests", --total
    SUM(CASE WHEN TYPE = ''P1'' THEN 1 ELSE 0 END) as "P1",
    SUM(CASE WHEN TYPE = ''P2'' THEN 1 ELSE 0 END) as "P2",
    SUM(CASE WHEN TYPE = ''P3'' THEN 1 ELSE 0 END) as "P3",
    SUM(CASE WHEN TYPE = ''P4'' THEN 1 ELSE 0 END) as "P4"
    FROM ' || 
    SYS.DBMS_ASSERT.sql_object_name(:P1_TABLE_NAME) ||
  ' group by RELEASE 
  ORDER BY case
    when RELEASE = ''19.3''  then 1
    when RELEASE = ''18.11'' then 2
    when RELEASE = ''18.9''  then 3
    when RELEASE = ''18.7''  then 4
    when RELEASE = ''17.3''  then 5
    else 6
  end asc';

DBMS_ASSERT 是为了防止 SQL 注入

将“使用通用列名”设置为“是” 页面项目的名称是:P1_TABLE_NAME(在我的例子中);它应该是一个文本字段,按Enter键提交

我想就是这样。

【讨论】:

谢谢你,这行得通!也感谢 DMBS_ASSERT 提示。 :)

以上是关于使用 PL/SQL 函数体返回 SQL 查询的主要内容,如果未能解决你的问题,请参考以下文章

带有参数的 PL/SQL 过程/函数从选择查询返回表

返回表查询的 PL/SQL 封装函数

从 PL/SQL 中的查询加硬编码变量返回用户定义的表

ORACLE PL/SQL:使用多个参数调用存储过程函数(DML 查询)

从 PL/SQL 函数返回多个值

使用 JDBC 从 PL/SQL 存储函数中获取表返回值