Вызов процедур пакета Oracle, которые возвращают ref-курсоры в прямом PL / SQL - PullRequest
4 голосов
/ 20 октября 2010

У меня есть база данных 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 у нас нет явных курсоров ссылок, если процедура возвращает набор результатов (или несколько наборов результатов), который доступен как набор результатов вывода как в ADO.NET, так и в SSMS, и вы можно просто протестировать SP, выполнив EXEC spname param1, param2.

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

Ответы [ 4 ]

3 голосов
/ 20 октября 2010

посмотрите на ссылку, которую опубликовала 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, если память работает правильно), вы можете просто щелкнуть правой кнопкой мыши по нужному пакету / методу, и он создаст скрипт для вас.
в toad и навигаторе. Я полагаю, вы сможете получить ссылкукурсор в красивой сетке, в то время как в разработчику вы получаете его в тексте.

SQL Developer, вы также можете тестировать модуль

2 голосов
/ 20 октября 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;

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

1 голос
/ 06 февраля 2013

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

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

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

1 голос
/ 28 октября 2010

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

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

и здесь:

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

...