如何在APEX交互式网格查询中添加动态PIVOT列?
关于APEX交互式网格添加动态PIVOT列的解决方案
可以实现,你当前使用PL/SQL函数体返回SQL的思路正确,按以下步骤调整配置即可生效:
- 首先修正数据源配置
交互式网格的数据源类型选择「PL/SQL函数体返回SQL查询」,将你写的PL/SQL代码粘贴进去后,做两处调整:- 在交互式网格的**「要提交的页面项」**属性中添加
P1_DEP_PIVOT,确保每次刷新网格时会先提交该页面项的最新值到会话状态,避免读取到旧值 - 检查
P1_DEP_PIVOT的取值格式:如果页面项存储的是10 DEP1, 20 DEP2, null DEP3(无外层括号),你现有代码的拼接逻辑正确;如果页面项取值已经包含外层括号,需要把SQL中的IN (##PIV_COL##)改为IN ##PIV_COL##避免语法重复
修正后的参考代码如下:
DECLARE l_piv_col VARCHAR2(1000) := NVL(:P1_DEP_PIVOT,'10 DEP1, 20 DEP2, null DEP3'); -- 如果PIVOT列是完全动态的,也可以拆分l_piv_col提取别名拼到select子句中,不用写死DEP1/DEP2/DEP3 l_statement VARCHAR2(4000):= q'~ select rownum row_num,JOB,MGR,DEP1,DEP2,DEP3 from (select JOB, MGR, SAL, DEPTNO from EMP ) src PIVOT (sum(sal) for deptno IN (##PIV_COL##)) Piv ~'; BEGIN RETURN REPLACE(l_statement,'##PIV_COL##',l_piv_col); END; - 在交互式网格的**「要提交的页面项」**属性中添加
- 开启通用列适配动态结构
APEX默认会在设计时固定解析SQL的列结构,要适配动态变化的PIVOT列,需要打开交互式网格**「属性>高级>使用通用列」**开关,开启后APEX会在每次运行时自动识别返回的查询列结构,不需要提前在设计时定义所有PIVOT生成的列。 - 可选优化:固定列提前配置
如果JOB、MGR等非PIVOT列需要固定展示格式、编辑属性,可以提前在交互式网格的列定义中手动添加这些列,设置好对应的属性,动态生成的PIVOT列会自动追加在固定列之后。
内容的提问来源于stack exchange,提问作者user10777723
相关产品推荐
相关产品推荐

