Oracle - Как иметь параметр курсора out ref в хранимой процедуре? - PullRequest
1 голос
/ 15 мая 2009

Стандартным способом, которым наши приложения передают информацию из хранимых процедур oracle поставщику oracle .net, является параметр курсора out ref.

Раньше все наши хранимые процедуры были в пакетах и ​​имели что-то вроде этого:

CREATE OR REPLACE PACKAGE test_package IS
   TYPE refcur IS REF CURSOR;
   PROCEDURE get_info ( o_cursor            OUT      refcur );
END test_package;
/
CREATE OR REPLACE PACKAGE BODY test_package IS
   PROCEDURE get_info ( o_cursor            OUT      refcur ) AS
   BEGIN
     OPEN o_cursor FOR
       SELECT * FROM v$database;
   END get_info;
END test_package;
/

Теперь я хотел бы переместить эту процедуру get_info из пакета в обычную процедуру, но не знаю, что делать, чтобы получить тип refcur. Как мне создать его за пределами пакета?

СОЗДАТЬ ИЛИ ЗАМЕНИТЬ ТИП refcur IS REF CURSOR;

не работает.

Ответы [ 3 ]

8 голосов
/ 15 мая 2009

Я не могу проверить это здесь (нет Oracle), но вы можете сделать:

create or replace procedure get_info(p_cursor out sys_refcursor)
is
begin
  open p_cursor for
    select *
    from   v$database; 
end;
/

В Oracle 9 и выше больше нет необходимости объявлять TYPE result_crsr IS REF CURSOR

Используйте взамен sys_refcursor .

0 голосов
/ 15 мая 2009

Попробуйте это:

CREATE OR REPLACE PROCEDURE get_info(o_cursor OUT sys_refcursor) IS
BEGIN
  OPEN o_cursor FOR SELECT * FROM dual;
END;
/

Ваш вопрос поднимает два важных вопроса:

1) Вы говорите, что это "не работает". Я предполагаю, что это означает, что Oracle возвращает исключение при выполнении оператора. Какое сообщение об ошибке возвращает Oracle? Он должен начинаться с ORA-nnnnn и сопровождаться текстом.

2) Какой цели послужит перемещение ПРОЦЕДУРЫ из ПАКЕТА? Пакет содержит еще несколько строк кода, подпись процедуры повторяется как в спецификации пакета, так и в теле пакета, но наличие процедуры в пакете дает несколько важных преимуществ.

0 голосов
/ 15 мая 2009
TYPE result_crsr IS REF CURSOR;

Пример анонимного блока SQL с использованием курсора ref:

DECLARE
   TYPE result_crsr IS REF CURSOR;
   crsr_test_result   result_crsr;
BEGIN


   OPEN crsr_test_result FOR
        SELECT * from user_objects;
     ? := crsr_test_result;
END;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...