Quick-n-dirty результаты: просмотреть результаты курсора процедуры OUT в SQL Worksheet? - PullRequest
0 голосов
/ 07 октября 2010

Платформа: Oracle
Язык: PL / SQL
Проблема: хотите вывести курсор OUT процедуры в SQLDeveloper SQLWosksheet.

Кто-нибудь знает, как использовать Oracle «Выбрать * из таблицы (PipelinedFunction (Param))» для проверки курсоров вывода кода процедуры?

Я использую Crsytal Reports для хранимой процедуры Oracle. Crystal требует, чтобы процедура возвращала курсор, который он выбирает и читает.

Код процедуры, который у меня есть, в настоящее время работает, но я хочу найти самый простой способ просмотреть последствия изменений в коде процедуры. У меня есть SQLDeveloper, и я занимаюсь созданием и тестированием SQL в этом. Я хотел бы получить быстрый результат, видимый в окне Результат запроса разработчика SQL («Рабочая таблица SQL»).

Есть ли (простой) способ использовать функцию для чтения курсора из процедуры? (и передать это в функцию Table?)

Свернутый, я знаю, но я лучше справляюсь, когда вижу результаты изменений кода. Если я смогу просмотреть результаты записи напрямую, это ускорит разработку отчета.

Я знаю о функции Table и немного о конвейерной обработке в Oracle. Я немного знаю о курсорах в целом и sys_refcursor. Я знаю о типах и почему они мне нужны. (Разве sys_regCursor не поможет нам избежать этого?)

Текущая процедура выполняет адекватную, но неблагодарную серию запросов, вставки в глобальные временные таблицы (GTT), объединения из GTT и исходных таблиц, дополнительные вставки и другие самостоятельные объединения, а затем ВЫБИРАЕТ результаты в курсор OUT. Я мог бы сделать лучше, полагаясь только на курсоры и тому подобное, но текущий метод достаточно хорош для получения результатов в отчете.

Я думаю, что могу неплохо справляться с SQL (для наших целей), но я не являюсь разработчиком для Oracle ... но мне нужна помощь.

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

Обновление:
Я попробовал несколько заяц-схем на основе щепок, которые я видел в Интернете ... таких как

Create or replace FUNCTION GET_BACKPLANE (
   Node VARCHAR2 ) RETURN SYS_REFCURSOR
AS

RESULTS SYS_REFCURSOR;

BEGIN
    Open Results for
        Select Backplane(Results, Node) from Dual ;
    ... etc.

и

Create or replace Function GET_BACKPLANE ( 
    NODE VARCHAR2 )  RETURN  My_Table_Stru%ROWTYPE  PIPELINED
AS

BEGIN ...

Я не думаю, что Oracle даже рассматривает возможность повторного обращения к выходному курсору из процедуры («Results» - это sys_refcursor, который содержит результаты последнего SELECT в процедуре). Я не знаю, как определить это, открыть его и ссылаться на него из процедуры.

Я никогда не добирался до места, где я мог попробовать

SELECT * FROM TABLE(GET_BACKPLANE( ... etc )

Извините за любые опечатки и плохую грамматику Oracle ... это было долгими днями.

Ответы [ 2 ]

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

SQL Developer позволяет нам использовать команды SQL * Plus на рабочем листе.Так что все, что вам нужно сделать, это определить переменную для хранения выходных данных курсора ref.

Возможно, я неверно истолковал реальный код, который вы хотите запустить, но я предполагаю, что ваша настоящая программа - это процедура Backplane(Results, Node), где results - это параметр OUT типа данных sys_refcursor, а node - некоторый входной параметр,

var rc refcursor

exec  Backplane(results=>:rc, Node=>42) 

print rc

Выходные данные оператора print записываются в панель Script Output .

Обратите внимание, что использование команд SQL * Plus означает, что мы должны использовать опцию Run Script F5 вместо оператора execute.

0 голосов
/ 08 октября 2010

Спасибо за помощь.В конце концов, я завел это методом грубой силы ... Шаг за шагом: создайте запрос, протестируйте запрос, создайте глобальную временную таблицу из структуры, добавьте код, чтобы сделать другой запрос из этого GTT, протестируйтезапросить, создать глобальную временную таблицу из структуры и т. д.

В конце я запустил (анонимный блок) скрипты и проверял содержимое GTT на каждом этапе.

Последняя частьдолжен был использовать тот же последний запрос из оригинальной процедуры, вставляя в Курсор все, что нравится кристаллу ...

завтра, я проверю это.

Но я просто заставлю его пройтидля следующей процедуры, и сделайте это за полтора дня вместо 2+ недель (смущенно).

Спасибо,

Марк

...