Как я могу использовать 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.

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

ИЗМЕНИТЬ 2:. На сервере MSFT SQL я могу просто ввести следующее:

get_user 1;

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

login   name    
NULL    Somename

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

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

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

РЕДАКТИРОВАТЬ4:

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

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


person Hamish Grubijan    schedule 28.06.2010    source источник
comment
Что такого сложного в запуске процедур в SQLDeveloper? Вы найдете процедуру, щелкните ее правой кнопкой мыши и выберите «Выполнить» (или нажмите Ctrl-F11), затем укажите параметры в генерируемом блоке PL / SQL.   -  person Powerlord    schedule 28.06.2010
comment
Хорошо, я также хочу увидеть результат сохраненной процедуры, спасибо.   -  person Hamish Grubijan    schedule 28.06.2010
comment
Почему бы не сформулировать это как вопрос о том, как использовать SQL Developer?   -  person APC    schedule 28.06.2010
comment
@APC, потому что я не верю в это. Пожалуйста, докажите, что я ошибаюсь.   -  person Hamish Grubijan    schedule 29.06.2010
comment
Я изменил название вашего вопроса, потому что думаю, что мы дошли до того момента, когда боевой тон больше не требуется. Я обратился к вашему четвертому редактированию   -  person APC    schedule 07.07.2010
comment
@Powerlord: в моем текущем Oracle SQL dev я могу сделать это правой кнопкой мыши, чтобы создать сгенерированный блок SQL. НО 1) он не отражает обновления, сделанные для процесса (все еще дает старый блок sql, даже когда параметры изменены и перекомпилирован процесс) и 2) сгенерированный код. не работает, когда есть параметры OUT (переменная привязки RESULTTXT НЕ ОБЪЯВЛЯЕТСЯ) И по сравнению с SQL Server это действительно сложно ...   -  person Guillaume    schedule 22.03.2012


Ответы (5)


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

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

Я выделяю его в навигаторе объектов разработчика SQL *, вызываю контекстное меню и выбираю Выполнить. (Я мог бы использовать 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 и нажимаю ОК. На панели Выполняется - Журнал (нижний правый угол, если вы не закрыли / переместили / скрыли его) я могу увидеть следующий результат:

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

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

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

Самые ранние версии 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.

person APC    schedule 29.06.2010
comment
Я не уверен, что у меня установлена ​​функция SQL * Plus. Как мне проверить, есть ли оно у меня? - person Hamish Grubijan; 29.06.2010
comment
@HamishGrubijan - самый простой способ проверки - запустить окно командной строки и ввести sqlplus - person APC; 29.06.2010
comment
Итак ... когда я набираю sqlplus в командной строке (cmd.exe), он запрашивает у меня пароль - он там. Однако, когда я набираю эту команду сама по себе: var rc refcursor;, она жалуется на это. Я предполагаю, что это потому, что я не нахожусь в SQL * Plus Developer Worksheet ... итак, как мне туда добраться? - person Hamish Grubijan; 29.06.2010
comment
@HamishGrubijan - Какую версию SQL * Dev вы используете? VAR не поддерживался до версии 1.2.1. - person APC; 29.06.2010
comment
Версия 1.5.5 Сборка MAIN-5969 | Версия CVS, внутренняя для Oracle SQL Developer (только для клиента) | Платформа Java (TM) 1.5.0_06 | Oracle IDE 1.5.5.59.69 | Поддержка версий 1.5.5.59.69. Я мог бы сделать больше обновлений, но это ›1.2.1, так что оно должно быть достаточно свежим. - person Hamish Grubijan; 29.06.2010
comment
@HamishGrubijan - действительно, должно быть достаточно недавно. Итак, когда вы говорите, что он жалуется на это, что жалуется? И как это сделать? Удаленная диагностика в лучшие времена - непростая задача. Так что чем точнее будут детали, тем лучше. - person APC; 30.06.2010
comment
@HamishGrubjian - Я отредактировал свой ответ, указав, что, по моему мнению, может быть решением вашей проблемы. - person APC; 06.07.2010
comment
+150 баллов. Пожалуйста, обратитесь к моему окончательному редактированию для получения дополнительных 25 (я думаю) очков бонуса. - person Hamish Grubijan; 07.07.2010
comment
У меня проблемы с запуском как с F5, так и с F9. Какой мне использовать? Что вы имели в виду под позиционным обозначением? Следует ли удалять пробелы и новые строки? - person Hamish Grubijan; 07.07.2010
comment
@HamishGrubijan - F5 для запуска всего скрипта, F9 для выполнения одного оператора. Так какие у вас проблемы? Увы, телепатия и удаленное наблюдение не входят в мои навыки. - person APC; 07.07.2010
comment
Спасибо за терпение; Я добавил еще одно изменение в конце вопроса. - person Hamish Grubijan; 08.07.2010
comment
@HamishGrubijan - эта ошибка связана с опечаткой в ​​моем опубликованном примере. Перед ссылками на переменные SQL * Plus нужно ставить двоеточие. Так что это должно было быть :rc, а не rc. Извинения. - person APC; 08.07.2010
comment
Буйя! Хотелось бы, чтобы сообщения об ошибках ORA были более полезными. Не стесняйтесь добавлять print :rc, print :tran_count к ответу, чтобы сделать его более полезным для тех, кто найдет его позже. Я тоже его добавлю (к своему вопросу). - person Hamish Grubijan; 08.07.2010
comment
@HamishGrubijan - если вас это утешит, вы далеко не первый, кого обманывают сообщения об ошибках Oracle. Некоторые из них действительно очень наклонные. В любом случае, по крайней мере, мы в конце концов доберемся до цели! - person APC; 08.07.2010

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

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

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

var rc refcursor
exec proc_name(:rc)

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

print rc
person Gary Myers    schedule 28.06.2010

Я рекомендую TORA

person Sujee    schedule 29.06.2010
comment
Я думал, что TORA умерла несколько лет назад. Приятно видеть, что кто-то его реанимировал. - person APC; 29.06.2010
comment
Я так не думаю. Я использую его каждый день на работе в течение последнего года. Изначально было несколько сбоев, но теперь работает хорошо после нескольких обновлений. Перешел на TORA после того, как был недоволен бесплатным программным обеспечением TOAD и разработчиком SQL, который требовал много памяти. - person Sujee; 29.06.2010
comment
Какие функции он не имеет, что есть в SQL Developer? - person Hamish Grubijan; 29.06.2010
comment
Меня также интересует обратное. - person Hamish Grubijan; 29.06.2010

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

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

person redcayuga    schedule 28.06.2010
comment
Спасибо, у вас есть пример использования? - person Hamish Grubijan; 29.06.2010
comment
Например, как мне с ним подключиться к базе данных Oracle? - person Hamish Grubijan; 29.06.2010
comment
Я никогда им не пользовался, но слышал о нем хорошие отзывы. Он основан на java jdbc, поэтому вам, вероятно, придется загрузить драйверы Oracle jdbc. - person redcayuga; 29.06.2010
comment
Хм ... пока звучит хорошо; Я просто хочу, чтобы кто-нибудь дал мне более подробные инструкции. - person Hamish Grubijan; 04.07.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

person Matthew Farwell    schedule 03.07.2010
comment
Есть ли примеры использования TOAD для того, что я хочу делать? - person Hamish Grubijan; 07.07.2010