2015-04-01 2 views
1

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

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

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

+0

Решение, которое вы задаете, слишком велико для SO (ИМХО). Вы можете начать здесь: http://www.oraclerecipes.com/dynamic-sql/get-columns-from-ref-cursor/. Также попробуйте найти другие примеры использования пакета «DBMS_SQL». – Dmitry

+0

Какую версию Oracle вы используете? –

+0

Я использую Версия 11g –

ответ

2

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

Путь следующая последовательность шагов:

  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

+0

Да, я думал, что это возможно с некоторым творчеством. Благодаря! –

Смежные вопросы