Я выполняю следующие действия, но продолжаю получать сообщение об ошибке и не вижу проблемы:
1) Создайте пользовательский тип данных Oracle, представляющий столбцы базы данных, которые вы хотите получить:
CREATE TYPE my_object AS OBJECT
(COL1 VARCHAR2(50),
COL2 VARCHAR2(50),
COL3 VARCHAR2(50));
2) Создайте другой тип данных, который является таблицей объекта, который вы только что создали:
TYPE MY_OBJ_TABLE AS TABLE OF my_object;
3) Создайте функцию, которая возвращает эту таблицу. Также используйте предложение конвейера, чтобы результаты передавались по конвейеру обратно в вызывающий SQL, например:
CREATE OR REPLACE
FUNCTION MY_FUNC (PXOBJCLASS varchar2)
RETURN MY_OBJ_TABLE pipelined IS
TYPE ref1 IS REF CURSOR
Cur1 ref1,
out_rec_my_object := my_object(null,null,null);
myObjClass VARCHAR2(50);
BEGIN
myObjClass := PXOBJCLASS
OPEN Cur1 For ‘select PYID, PXINSNAME, PZINSKEY from PC_WORK where PXOBJCLass = ;1’USING myObjClass,
LOOP
FETCH cur1 INTO out_rec.COL1, out_rec.COL2, out_rec.COL3;
EXIT WHEN Cur1%NOTFOUND;
PIPE ROW (out_rec);
END LOOP;
CLOSE Cur1;
RETURN;
END MY_FUNC;
ПРИМЕЧАНИЕ. В приведенном выше примере вы можете легко заменить оператор выбора вызовом другой хранимой процедуры, которая возвращает переменную курсора.
4) В вашем приложении вызовите эту функцию как табличную функцию, используя следующую инструкцию SQL:
select COL1, COL2, COL3 from TABLE(MY_FUNC('SomeSampletask'));