Получить SYS_REFCURSOR в таблицу с неизвестными столбцами

У меня есть процедура, которая возвращает SYS_REFCURSOR в качестве параметра OUT. Что я хотел бы сделать, так это вызвать эту процедуру и использовать возвращенное SYS_REFCURSOR в другой процедуре. В этой второй процедуре мне нужно будет запустить GROUP BY для результатов и вернуть их в другом SYS_REFCURSOR.

Проблема, с которой я сталкиваюсь, заключается в том, что я заранее не знаю имя или количество столбцов.

У кого-нибудь есть идеи для решения? Заранее спасибо.


person Ron M    schedule 01.04.2015    source источник
comment
Решение, которое вы просите, слишком велико для SO (ИМХО). Вы можете начать отсюда: oraclerecipes.com/dynamic-sql /get-columns-from-ref-cursor. Также попробуйте поискать другие примеры использования пакета DBMS_SQL.   -  person Dmitriy    schedule 01.04.2015
comment
Какую версию Oracle вы используете?   -  person Justin Cave    schedule 02.04.2015
comment
Я использую версию 11g   -  person Ron M    schedule 02.04.2015


Ответы (1)


На самом деле, вы можете это сделать, но это требует некоторых усилий, и в большинстве случаев это просто излишество.

Способ представляет собой следующую последовательность шагов:

  1. Создать XMLTYPE из sys_refcursor
  2. Разобрать sys_refcursor через dbms_sql, получить информацию о колонках
  3. Создайте динамический sql, который будет выбран из XMLTYPE через xpath, на основе информации из шага 2.

простой пример, иллюстрирующий идею:

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

person finidigeorge    schedule 02.04.2015
comment
Да, я думал, что это возможно с некоторым творчеством. Спасибо! - person Ron M; 02.04.2015