sql - 使用 PL/SQL 函数体返回 SQL 查询
问题描述
我正在使用 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 函数?
提前致谢。
解决方案
你应该
- 创建一个经典报表,其源是一个返回查询的函数
该查询应如下所示:
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 时提交
就是这样,我想。
推荐阅读
- vue.js - Vuetify 组合框项目模板未使用 vuex 更新
- apache-flink - 来自 KeyedCoProcessFunction 的 processElement1 和 processElement2 是原子状态吗?还是他们可以同时修改共享状态?
- react-native - 初始化后开玩笑更改模拟
- spring - 打印语句被执行两次,这在 Spring 启动中的 run 方法调用之前存在
- javascript - 在打字稿中通过引用传递变量[Angular 8]
- amazon-web-services - 创建 AWS 粘合作业是否需要爬网程序?
- firebase - 带有列表的 Flutter Futurebuilder 不起作用
- r - Pettitt - R 中的显着性水平
- odoo - Odoo 13:为 odoo 13 api 启用 cors origin
- c++ - 在 C++ 对象中初始化数据成员的正确顺序