Вызов пакетных процедур Oracle, которые возвращают ссылочные курсоры в прямом PL / SQL

У меня есть база данных Oracle 10g, доступ к которой осуществляется из приложения ASP.NET. Хотя я активно использовал SQL Server во многих различных аспектах и ​​Oracle для запросов и отчетов, я впервые использую Oracle в качестве базы данных OLTP для приложения.

Процедуры уровня базы данных в пакетах обычно имеют следующий вид:

-- TYPE refcur IS REF CURSOR;

PROCEDURE get_some_stuff(o_cursor OUT refcur, p_param1 IN INTEGER, p_param2 IN INTEGER) IS
BEGIN
    OPEN o_cursor FOR
    SELECT whatever
    FROM whatever
END

Я предполагаю, что это сделано таким образом, чтобы уровень ADO.NET мог использовать курсор из выходного параметра, и, насколько я понимаю, это приемлемая передовая практика для вызова процессов Oracle из .NET.

В SQL Server, например, у нас нет явных курсоров ref, если процедура возвращает набор результатов (или несколько наборов результатов), который доступен как набор результатов вывода как в ADO.NET, так и в SSMS, и вы можете просто протестировать SP, выполнив EXEC spname param1, param2.

Проблема, с которой я столкнулся, заключается в том, что я не знаю, как вызывать их непосредственно в SQL в Toad, например, чтобы иметь возможность сначала протестировать изменения на уровне PL / SQL, прежде чем переходить в приложение. Я очень привык к возможности выполнять и даже повторно смешивать хранимые процессы и функции в SQL Server, чтобы иметь возможность реорганизовать уровень интерфейса базы данных, не влияя на внешний интерфейс кода уровня приложения.


person Cade Roux    schedule 19.10.2010    source источник
comment
возможный дубликат Самый простой метод тестирования хранимой процедуры Oracle   -  person OMG Ponies    schedule 20.10.2010
comment
@OMG Ponies Всегда легко найти примеры только после того, как вы перестанете искать ... Хотя, похоже, мне нужна более новая Toad.   -  person Cade Roux    schedule 20.10.2010
comment
Что - Toad не позволяет использовать анонимный блок PLSQL ?! Я использовал только Toad для SQL Server, PLSQLDeveloper (бесплатная версия) для меня, когда имел дело с Oracle =)   -  person OMG Ponies    schedule 20.10.2010
comment
@OMG Ponies - ошибка в 10.1 согласно heather.koyuk.net/refractions/?p= 343 Ставлю 10,5 и все работает.   -  person Cade Roux    schedule 20.10.2010
comment
Подумал, что для Жаба было странно не поддерживать что-то столь распространенное в Oracle. Плохой QA на Toad со стороны Oracle: /   -  person OMG Ponies    schedule 20.10.2010


Ответы (4)


посмотрите ссылку, которую опубликовали OMG Ponies, но вы можете

    var x refcursor;


declare

    PROCEDURE GET_SOME_STUFF(O_CURSOR OUT SYS_REFCURSOR, P_PARAM1 IN NUMBER, P_PARAM2 IN NUMBER) IS
    BEGIN
         OPEN O_CURSOR FOR
         SELECT LEVEL, p_param1 ,P_PARAM2  FROM DUAL CONNECT BY LEVEL < 3;
    END ;

BEGIN
GET_SOME_STUFF(:x , 5, 10); 
END;
/

PRINT X;

вы в значительной степени просто оборачиваете его анонимным блоком, который он будет запускать. Я использую SQL Developer (настоятельно рекомендуется, бесплатно с большим количеством поддержки) или SQL plus, поэтому я не могу помочь с TOAD, но я ожидал, что это будет то же самое. В SQL Developer (и в SQL Navigator, если память не исправна) вы можете просто щелкнуть правой кнопкой мыши нужный пакет / метод, и он создаст для вас сценарий.
в жабе и навигаторе Я считаю, что вы сможете получить ссылку курсор в красивой сетке, в то время как в разработчике вы получаете его в тексте.

Разработчик SQL, вы также можете выполнить модульное тестирование

person Harrison    schedule 19.10.2010

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

DECLARE
  aCursor       SYS_REFCURSOR;
  someVariable  SOME_TYPE;

  FUNCTION SOME_FUNC_RETURNING_A_CURSOR RETURN SYS_REFCURSOR IS
    csrLocal  SYS_REFCURSOR;
  BEGIN
    OPEN csrLocal FOR SELECT whatever FROM wherever;

    RETURN csrLocal;
  END SOME_FUNC_RETURNING_A_CURSOR;

BEGIN
  aCursor := SOME_FUNC_RETURNING_A_CURSOR;

  WHILE TRUE LOOP
    FETCH aCursor INTO someVariable;
    EXIT WHEN aCursor%NOTFOUND;

    ...do whatever with variables...
  END LOOP;

  COMMIT;
END;

Делитесь и наслаждайтесь.

person Bob Jarvis - Reinstate Monica    schedule 19.10.2010

Лучшее решение было найдено по ссылке, предоставленной OMG Ponies:

Самый простой метод тестирования хранимой процедуры Oracle

и тут:

http://heather.koyuk.net/refractions/?p=343

person Cade Roux    schedule 28.10.2010

Я нашел более простой способ ... попробуйте (он также сгенерирует для вас скрипт)

В редакторе процедур загрузите вашу процедуру. Нажмите на молнию, чтобы выполнить, и вы увидите окно «Установить параметры», которое также доступно через кнопку на панели инструментов редактора Proc, на которой есть изображение, похожее на (...), рядом с молнией. Нажмите кнопку параметров вывода, и вы увидите свои варианты. Если это слабый указатель ссылки, вы должны использовать опцию сетки в памяти. После выполнения результаты переходят на вкладку результатов курсора в нижней части PE.

http://toad.10940.n7.nabble.com/display-ref-cursor-in-toad-td1427.html.

person Zeus    schedule 06.02.2013