Лучший способ использовать курсоры пакета PL / SQL из Pro * C
-
26-09-2019 - |
Вопрос
У меня есть курсор, определенный в PL / SQL, и мне интересно, какой лучший способ использовать его из ProC есть. Обычно для курсора, определенного в ProC Вы бы сделали:
EXEC SQL DECLARE curs CURSOR FOR SELECT 1 FROM DUAL;
EXEC SQL OPEN curs;
EXEC SQL FETCH curs INTO :foo;
EXEC SQL CLOSE cusr;
Я надеялся, что тот же (или аналогичный) синтаксис будет работать для упакованного курсора. Например, у меня есть пакет MyPack, с декларацией
type MyType is record (X integer);
cursor MyCurs(x in integer) return MyType;
Теперь у меня в моем процессе Pro * C довольно неудовлетворительный кусок встроенного PL / SQL, который открывает курсор, делает выборку и т. Д., Как я не мог получить первый стиль синтаксиса для работы. Используя пример
EXEC SQL EXECUTE
DECLARE
XTable is table of MyPack.MyType;
BEGIN
OPEN MyPack.MyCurs(:param);
FETCH MyPack.MyCurs INTO XTable;
CLOSE MyPack.MyCurs;
END;
END-EXEC;
Кто-нибудь знает, есть ли более «чистый» подход Pro * C?
Решение
На самом деле он не будет сильно отличаться от вашего первого примера, просто убедитесь, что ваше определение курсора находится в спецификации пакета, а не тело пакета. Не «заявляйте» это и просто пойти с чем-то вроде:
Объект базы данных:
create or replace package mypkg as
cursor mycur is
SELECT 1 FROM DUAL;
end;
В Pro * C:
EXEC SQL OPEN schema.mypkg.mycur;
EXEC SQL FETCH schema.mypkg.mycur INTO :foo;
EXEC SQL CLOSE schema.mypkg.mycur;
Конечно, пакет должен быть доступен для доступов пользователя Oracle, с которым вы подключаетесь и т. Д. Если пакет принадлежит пользователю подключением, или на месте есть синоним, «Схема». не требуется в вызовах Pro * C.
Другие советы
Да. Выполните поиск Google на термин Ref Cursor, и вы должны увидеть примеры того, что вы хотите сделать.