* 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? Никакая строка не расширила это далеко...
Существует не только способ сделать это, но и несколько способов сделать это (я признаю, что это не совсем 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.
Я не уверен, как увидеть фактические строки/записи, которые возвращаются.
Хранимые процедуры не возвращают записи. Они могут иметь курсор в качестве выходного параметра, который является указателем на оператор select. Но для того, чтобы вернуть строки из курсора, требуется дополнительное действие.
В SQL Developer вы можете выполнить процедуру, возвращающую курсор ref, следующим образом
var rc refcursor
exec proc_name(:rc)
После этого, если вы выполните следующее, она покажет результаты из курсора:
print rc
Есть два варианта, оба от 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