将 SYS_REFCURSOR 提取到具有未知列的 table
Fetch SYS_REFCURSOR into a table with unknown columns
我有一个程序,其中 return 将 SYS_REFCURSOR
作为 OUT
参数。我想做的是调用该过程,并在另一个过程中使用 returned SYS_REFCURSOR
。在第二个过程中,我需要 运行 一个 GROUP BY
结果, return 它在另一个 SYS_REFCURSOR
.
我遇到的问题是我事先不知道列名或列数。
有人有解决方案吗?提前谢谢你。
实际上,你可以做到这一点,但它需要一些努力,而且在大多数情况下,它只是矫枉过正。
方法是接下来的步骤:
- 从 sys_refcursor
创建 XMLTYPE
- 通过 dbms_sql 解析 sys_refcursor,获取有关列的信息
- 根据步骤 2
中的信息,通过 xpath 从 XMLTYPE select 创建动态 sql
简单的例子,来说明这个想法:
select EMPNO, count(*) from
xmltable(
‘/ROWSET/ROW’
PASSING xmltype(CURSOR( SELECT E.EMPNO, E.ENAME, D.DNAME, D.DEPTNO FROM SCOTT.EMP E, SCOTT.DEPT D WHERE e.deptno=D.DEPTNO ))
columns
EMPNO PATH ‘EMPNO’,
ENAME PATH ‘ENAME’,
DNAME PATH ‘DNAME’ ,
DEPTNO PATH ‘DEPTNO’
)
group by EMPNO
我有一个程序,其中 return 将 SYS_REFCURSOR
作为 OUT
参数。我想做的是调用该过程,并在另一个过程中使用 returned SYS_REFCURSOR
。在第二个过程中,我需要 运行 一个 GROUP BY
结果, return 它在另一个 SYS_REFCURSOR
.
我遇到的问题是我事先不知道列名或列数。
有人有解决方案吗?提前谢谢你。
实际上,你可以做到这一点,但它需要一些努力,而且在大多数情况下,它只是矫枉过正。
方法是接下来的步骤:
- 从 sys_refcursor 创建 XMLTYPE
- 通过 dbms_sql 解析 sys_refcursor,获取有关列的信息
- 根据步骤 2 中的信息,通过 xpath 从 XMLTYPE select 创建动态 sql
简单的例子,来说明这个想法:
select EMPNO, count(*) from
xmltable(
‘/ROWSET/ROW’
PASSING xmltype(CURSOR( SELECT E.EMPNO, E.ENAME, D.DNAME, D.DEPTNO FROM SCOTT.EMP E, SCOTT.DEPT D WHERE e.deptno=D.DEPTNO ))
columns
EMPNO PATH ‘EMPNO’,
ENAME PATH ‘ENAME’,
DNAME PATH ‘DNAME’ ,
DEPTNO PATH ‘DEPTNO’
)
group by EMPNO