Лучший способ использовать PL / SQL Package Cursors от Pro * C - PullRequest
3 голосов
/ 11 июня 2010

У меня есть курсор, определенный в PL / SQL, и мне интересно, как лучше всего использовать его из Pro C.Обычно для курсора, определенного в Pro C, вы должны сделать:

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 подход?

Ответы [ 2 ]

1 голос
/ 28 июня 2010

На самом деле это не будет сильно отличаться от вашего первого примера, просто убедитесь, что ваше определение курсора находится в спецификации пакета, а не в теле пакета.Не "объявляйте" это и просто используйте что-то вроде:

Объект базы данных:

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; 

Конечно, пакетдолжен быть доступен пользователю оракула, с которым вы соединяетесь, и т. д. Если пакет принадлежит подключающемуся пользователю или имеется синоним «схема».не требуется в вызовах pro * c.

0 голосов
/ 11 июня 2010

Да. Выполните поиск в Google по слову REF CURSOR, и вы увидите примеры того, что вы хотите сделать.

...