Как использовать Oracle SQL developer для запуска хранимых процедур?

* EDIT6: * это то, что в конечном итоге работает для меня (от принятого ответа):

var ret1 number
var tran_cnt number
var msg_cnt number
var rc refcursor
exec :tran_cnt := 0
exec :msg_cnt := 123
exec get_account(Vret_val => :ret1, Vtran_count => :tran_cnt, Vmessage_count => :msg_cnt, Vaccount_id => 1, rc1 => :rc)
print :tran_cnt
print :msg_cnt
print :rc

разработчик SQL делает это супер-трудно / невозможно?. Мне все равно, если утилита основана на командной строке; я просто хочу иметь возможность быстро запускать и просматривать ее. Было бы неплохо, если бы он также захватил ошибки. было бы неплохо иметь возможность входить постепенно(интерактивно), а также указывать все сразу (подобно тому, как типичный ftp / sftp клиент на основе cmd работает).

моя платформа-Windows Server 2008 + Cygwin.

EDIT: возможно, вы знаете, как написать это с помощью Python?

EDIT 2: в MSFT SQL server я могу просто ввести это:

get_user 1;

затем выделите его и нажмите F5, и я получу:

login   name    
NULL    Somename

печать в окне вывода. Разработчик Oracle SQL не помогает с этим вообще. Я не уверен, как пройти в 1, я не уверен, как увидеть фактические строки/записи, которые возвращаются.

EDIT3: когда я печатаю просто var rc refcursor; и выберите его и запустите, я получаю эту ошибку (GUI):

An error was encountered performing the requested operation:

ORA-00900: invalid SQL statement
00900.00000 - "invalid SQL statement"
* Cause:
* Action:
Vendor code 900Error at Line: 2

EDIT4:

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

create or replace procedure get_account
(
    Vret_val out number,
    Vtran_count in out number,
    Vmessage_count in out number,
    Vaccount_id     IN NUMBER
    , rc1 in out sys_refcursor
)as
begin
...

Я получаю сообщение об ошибке:

Error starting at line 2 in command:
exec :rc := get_account(1) 
Error report:
ORA-06550: line 1, column 24:
PLS-00306: wrong number or types of arguments in call to 'GET_ACCOUNT'
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored
06550. 00000 -  "line %s, column %s:n%s"
*Cause:    Usually a PL/SQL compilation error.
*Action:
rc
------

Я так близко ... пожалуйста помощь.

* EDIT 5:*

скрипт, который я запускаю (функционально одинаковый), ошибка всегда была одинаковой:

var ret1 number
var tran_cnt number
var msg_cnt number
var rc refcursor
exec :tran_cnt := 0
exec :msg_cnt := 123
exec get_account(Vret_val => :ret1, Vtran_count => :tran_cnt, Vmessage_count => :msg_cnt, Vaccount_id => 1, rc1 => rc)

вывод скрипта (на F5) (может быть несколько сообщений от нескольких запусков.):

Error report:
ORA-06550: line 1, column 134:
PLS-00201: identifier 'RC' must be declared
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored
06550. 00000 -  "line %s, column %s:n%s"
*Cause:    Usually a PL/SQL compilation error.
*Action:
anonymous block completed
anonymous block completed

Error starting at line 7 in command:
exec get_account(Vret_val => :ret1, Vtran_count => :tran_cnt, Vmessage_count => :msg_cnt, Vaccount_id => 1, rc1 => rc)
Error report:
ORA-06550: line 1, column 134:
PLS-00201: identifier 'RC' must be declared
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored
06550. 00000 -  "line %s, column %s:n%s"
*Cause:    Usually a PL/SQL compilation error.
*Action:
anonymous block completed
anonymous block completed

Error starting at line 7 in command:
exec get_account(Vret_val => :ret1, Vtran_count => :tran_cnt, Vmessage_count => :msg_cnt, Vaccount_id => 1, rc1 => rc)
Error report:
ORA-06550: line 1, column 134:
PLS-00201: identifier 'RC' must be declared
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored
06550. 00000 -  "line %s, column %s:n%s"
*Cause:    Usually a PL/SQL compilation error.
*Action:

почему в нем говорится строка 1, столбец 134? Ни одна линия не протянулась так далеко ...

5 ответов


мало того, что есть способ сделать это, есть несколько способов сделать это (что я признаю не очень Питоническим, но тогда SQL*Developer написан на Java ).

у меня есть процедура с этой подписью: get_maxsal_by_dept( dno number, maxsal out number).

я выделяю его в навигаторе объектов SQL * Developer, вызываю меню правой кнопкой мыши и выбираю выполнить. (Я мог бы использовать ctrl+F11.) Это порождает всплывающее окно с тестовым жгутом. (Примечание: если хранимая процедура живет в пакете, вам нужно щелкнуть правой кнопкой мыши пакет,не значок под пакетом, содержащий имя процедуры; затем вы выберете sproc из списка "цель" пакета, когда появится тестовая проводка.) В этом примере теста будет выглядеть следующим образом:

DECLARE
  DNO NUMBER;
  MAXSAL NUMBER;
BEGIN
  DNO := NULL;

  GET_MAXSAL_BY_DEPT(
    DNO => DNO,
    MAXSAL => MAXSAL
  );
  DBMS_OUTPUT.PUT_LINE('MAXSAL = ' || MAXSAL);
END;

я установил переменную DNO в 50 и нажмите OK. В Running - Log панель (нижний правый угол если вы не закрыли/не переместили / не скрыли его), я вижу следующий вывод:

Connecting to the database apc.
MAXSAL = 4500
Process exited.
Disconnecting from the database apc. 

справедливости ради бегун менее дружелюбен для функций, которые возвращают курсор Ref, как этот:get_emps_by_dept (dno number) return sys_refcursor.

DECLARE
  DNO NUMBER;
  v_Return sys_refcursor;
BEGIN
  DNO := 50;

  v_Return := GET_EMPS_BY_DEPT(
    DNO => DNO
  );
  -- Modify the code to output the variable
  -- DBMS_OUTPUT.PUT_LINE('v_Return = ' || v_Return);
END;

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

DECLARE
  DNO NUMBER;
  v_Return sys_refcursor;
  v_rec emp%rowtype;
BEGIN
  DNO := 50;

  v_Return := GET_EMPS_BY_DEPT(
    DNO => DNO
  );

  loop
    fetch v_Return into v_rec;
    exit when v_Return%notfound;
    DBMS_OUTPUT.PUT_LINE('name = ' || v_rec.ename);
  end loop;
END;

выход из того же места:

Connecting to the database apc.
name = TRICHLER
name = VERREYNNE
name = FEUERSTEIN
name = PODER
Process exited.
Disconnecting from the database apc. 

кроме того, мы можем использовать старый В SQLплюс команды в SQLразработчик листе:

var rc refcursor 
exec :rc := get_emps_by_dept(30) 
print rc

в этом случае результат отображается в Результат Работы Скрипта панель (расположение по умолчанию-вкладка справа от результаты tab).

самые ранние версии IDE не очень поддерживали SQL * Plus. Однако все вышеперечисленные команды поддерживаются начиная с версии 1.2.1. См.матрица в онлайн-документации дополнительные информация.


" когда я печатаю просто var rc refcursor; и выберите его и запустите, я получу это ошибка (GUI):"

есть функция - или ошибка-в том, как рабочий лист интерпретирует SQLкоманды плюс. Он предполагает SQLPlus являются частью скрипта. Итак, если мы введем строку SQL * Plus, скажем var rc refcursor и нажмите кнопку Execute Statement (или F9 ) рабочий лист швыряет ORA-900 потому что это не исполняемый файл заявление т. е. это не SQL . Что нам нужно сделать, это нажать Run Script (или Ф5), даже для одной строки SQL*Plus.


"я так близко ... пожалуйста помочь."

вы программы процедура с подписью пяти обязательных параметров. Вы получаете ошибку, потому что вы вызываете ее как функцию и только с одним параметром:

exec :rc := get_account(1)

что вам нужно, это что-то примерно следующий. Я использовал названную нотацию для ясности.

var ret1 number
var tran_cnt number
var msg_cnt number
var rc refcursor

exec :tran_cnt := 0
exec :msg_cnt := 123

exec get_account (Vret_val => :ret1, 
                  Vtran_count => :tran_cnt, 
                  Vmessage_count => :msg_cnt, 
                  Vaccount_id   => 1,
                  rc1 => :rc )

print tran_count 
print rc

то есть вам нужна переменная для каждого параметра OUT или IN OUT. В параметрах можно передавать как литералы. Первые две инструкции EXEC присваивают значения паре параметров IN OUT. Третий исполнитель вызывает процедуру. Процедуры не возвращают значение (в отличие от функций), поэтому мы не используем синтаксис присваивания. Наконец, этот скрипт отображает значение нескольких переменных, сопоставленных с OUT параметры.


Я не уверен, как увидеть фактический строки / записи, которые возвращаются.

хранимые процедуры не возвращают записи. Они могут иметь курсор в качестве выходного параметра, который является указателем на инструкции Select. Но это требует дополнительных действий, чтобы фактически вернуть строки из этого курсора.

В SQL Developer вы можете выполнить процедуру, которая возвращает курсор ref следующим образом

var rc refcursor
exec proc_name(:rc)

после этого, если вы выполните следующий, это покажет результаты от курсора:

print rc

моя рекомендация Тора


вы слышали о "SQuirreL SQL Client"?

http://squirrel-sql.sourceforge.net/


есть две возможности, как из Quest Software, TOAD & SQL Navigator:

вот бесплатная загрузка TOAD: http://www.toadworld.com/Downloads/FreewareandTrials/ToadforOracleFreeware/tabid/558/Default.aspx

и SQL Navigator (пробная версия):http://www.quest.com/sql-navigator/software-downloads.aspx