Лучший способ использовать курсоры пакета PL / SQL из Pro * C

StackOverflow https://stackoverflow.com/questions/3023380

  •  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, и вы должны увидеть примеры того, что вы хотите сделать.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top