Подтвердить что ты не робот

Как я могу использовать 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: Возможно, вы знаете, как script использовать это с помощью Python?

EDIT 2: На сервере MSFT SQL я могу просто набрать это:

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
------

Я так близко... пожалуйста, помогите.

* РЕДАКТИРОВАТЬ 5: *

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

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)

Script Вывод (на 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? Ни одна линия не растянулась так далеко...

4b9b3361

Ответ 1

Не только есть способ сделать это, есть более чем один способ сделать это (что я уступаю не очень Pythonic, но тогда SQL * Developer написан на Java).

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

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

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 и нажмите okay. В области Running-Log (нижний правый угол, если вы не закрыли/не переместили/не скрыли его), я вижу следующий вывод:

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

Чтобы быть справедливым, бегун менее дружелюбен для функций, которые возвращают Ref Cursor, как этот: 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. 

В качестве альтернативы мы можем использовать старые команды SQLPLus на рабочем листе SQLDeveloper:

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

В этом случае вывод появляется в области Script Output (по умолчанию это вкладка справа от вкладки "Результаты" ).

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


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

Есть функция - или ошибка - в том, как рабочий лист интерпретирует команды SQLPlus. Предполагается, что команды SQLPlus являются частью script. Итак, если мы вводим строку SQL * Plus, скажем var rc refcursor и нажимаем Execute Statement (или F9), рабочий лист бросает ORA-900, потому что это не исполняемый оператор, то есть он не SQL. Нам нужно нажать Run Script (или F5) даже для одной строки 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. Параметры IN могут передаваться как литералы. Первые два оператора EXEC присваивают значения нескольким параметрам IN OUT. Третий EXEC вызывает процедуру. Процедуры не возвращают значение (в отличие от функций), поэтому мы не используем синтаксис присваивания. Наконец, этот Script отображает значение пары переменных, отображаемых на параметры OUT.

Ответ 2

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

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

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

var rc refcursor
exec proc_name(:rc)

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

print rc

Ответ 3

Моя рекомендация TORA