Как я могу использовать Oracle SQL Developer для запуска хранимых процедур? - PullRequest
19 голосов
/ 28 июня 2010

* РЕДАКТИРОВАТЬ6: * Вот что у меня получилось (из принятого ответа):

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.

РЕДАКТИРОВАТЬ: Возможно, вы знаете, как написать это с помощью Python?

РЕДАКТИРОВАТЬ 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: *

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

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 ]

35 голосов
/ 29 июня 2010

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

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

. Я выделяю ее в Навигаторе объектов SQL * Developer, вызываю контекстное меню и выбираю Выполнить .(Я мог бы использовать 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. 

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

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

В этом случае выходные данные отображаются в области Вывод сценария (расположение по умолчанию - вкладка справа от вкладки Results ).

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


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

Есть функция -или ошибка - в способе, которым лист интерпретирует команды SQL Plus.Предполагается, что команды SQL Plus являются частью сценария.Таким образом, если мы введем строку 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 вызывает процедуру.Процедуры не возвращают значение (в отличие от функций), поэтому мы не используем синтаксис присваивания.Наконец, этот скрипт отображает значение пары переменных, сопоставленных с параметрами OUT.

4 голосов
/ 29 июня 2010

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

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

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

print rc
3 голосов
/ 29 июня 2010

Моя рекомендация ТОРА

2 голосов
/ 28 июня 2010

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

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

0 голосов
/ 04 июля 2010

Существует две возможности: от 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

...