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

* 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: В SQL-сервере MSFT я могу просто ввести это:

get_user 1;

затем выделите его и поразите F5, и я добираюсь:

login   name    
NULL    Somename

распечатанный к окну вывода. Разработчик SQL Oracle не помогает с этим вообще. Я не уверен, как передать в 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? Никакая строка не расширила это далеко...

19
задан APC 7 October 2010 в 05:31
поделиться

5 ответов

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

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

Я выделяю его в навигаторе объектов разработчика 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 :

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

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

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


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

Есть особенность - или ошибка - в том, как рабочий лист интерпретирует команды SQL Plus. Предполагается, что команды SQL Plus являются частью сценария. Итак, если мы введем строка SQL * Plus, скажем var rc refcursor и нажмите Выполнить оператор (или F9 ), рабочий лист выбрасывает ORA-900 , потому что это не исполняемый оператор , то есть это не SQL. Нам нужно нажать Выполнить сценарий (или 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.

35
ответ дан 30 November 2019 в 03:02
поделиться

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

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

2
ответ дан 30 November 2019 в 03:02
поделиться

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

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

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

var rc refcursor
exec proc_name(:rc)

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

print rc
4
ответ дан 30 November 2019 в 03:02
поделиться

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

3
ответ дан 30 November 2019 в 03:02
поделиться

Есть два варианта, оба от Quest Software, TOAD & SQL Navigator:

Вот TOAD Freeware download: http://www.toadworld.com/Downloads/FreewareandTrials/ToadforOracleFreeware/tabid/558/Default.aspx

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

0
ответ дан 30 November 2019 в 03:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: