Вызов хранимой процедуры Oracle в Squirrel SQL
Мне удалось создать хранимую процедуру для базы данных Oracle, но теперь я не могу понять, как ее запустить. Я использую SQuirrel SQL, и это сработало для создания процедуры:
CREATE OR REPLACE PROCEDURE MyProc(label IN varchar2, results OUT sys_refcursor) AS
BEGIN
OPEN results FOR
SELECT Label, Count, Timestamp
FROM table1
LEFT JOIN table2 ON table1.Name=table2.Name
WHERE table1.Label=label
ORDER BY Timestamp;
END;
/
Я хочу получить и отобразить результирующий набор. Я пробовал использовать call MyProc('param')
, но это не работает (ошибка ошибочного числа аргументов). Я много раз искал этот сайт и другие, но ничего не было полезно. Пожалуйста, помогите!
Ответы
Ответ 1
Ниже приведено описание работы хранимой процедуры:
begin
procedurename;
end;
/
Да, требуется слэш в конце!
begin...end;
объявляет блок PL/SQL (специфичный для Oracle). Слэш - это команда для запуска блока.
/(слэш)
Выполняет последнюю выполненную команду SQL или PL/SQL-блок, который хранится в буфере SQL.
[...]
Oracle Database Online Documentation, 10g Release 2 (10.2)/SQL * Plus® Руководство пользователя и справочная информация
Ответ 2
Единственный синтаксис, который я получаю в Squirrel SQL, - это блок PL/SQL:
declare
v_label varchar2:='SOMELABEL';
TYPE ref_cursor IS REF CURSOR;
v_cur_results ref_cursor;
begin
MyProc (v_label, v_cur_results)
end;
/
Ответ 3
Как в этой статье объясняется, что использование "вызова" вместо "выполнить" должно решить проблему.
Ответ 4
var v_result sys_refcursor
exec MyProc ('test label',:v_result)
Ответ 5
Я долгое время боролся с этим, но мне удалось заставить его работать следующим образом:
{call DBMS_SESSION.SET_CONTEXT ( namespace => 'clientcontext', attribute => 'foo', value => 'bar' )}