使用 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 查询的主要内容,如果未能解决你的问题,请参考以下文章