Запустить хранимую процедуру в SQL Developer?
Я пытаюсь запустить хранимую процедуру, которая имеет несколько параметров in и out. Процедура может быть просмотрена только на панели "мои подключения" путем навигации по другим пользователям | / Packages//
если я щелкну Правой Кнопкой Мыши, пункты меню будут "заказать членов по..."и" создать модульный тест " (выделено серым цветом). Возможность "запустить" процедуру не представляется возможным, когда к ней обращается пользователь.
Я пытался найти пример того, как создать анонимный блок, чтобы я мог запустите процедуру как файл SQL, но не нашли ничего, что работает.
кто-нибудь знает как я могу выполнить эту процедуру от разработчика SQL? Я использую версию 2.1.1.64.
спасибо заранее!
EDIT 1:
процедура, которую я хочу вызвать, имеет такую подпись:
user.package.procedure(
p_1 IN NUMBER,
p_2 IN NUMBER,
p_3 OUT VARCHAR2,
p_4 OUT VARCHAR2,
p_5 OUT VARCHAR2,
p_6 OUT NUMBER)
если я напишу свой анонимный блок так:
DECLARE
out1 VARCHAR2(100);
out2 VARCHAR2(100);
out3 VARCHAR2(100);
out4 NUMBER(100);
BEGIN
EXECUTE user.package.procedure (33,89, :out1, :out2, :out3, :out4);
END;
я получаю ошибку:
Bind Varialbe "out1" is NOT DECLCARED
anonymous block completed
Я пробовал инициализировать из* переменные:
out1 VARCHAR2(100) := '';
но получаю ту же ошибку:
EDIT 2:
основываясь на ответе Алекса, я попытался удалить двоеточия перед парами и получить это:
Error starting at line 1 in command:
DECLARE
out1 VARCHAR2(100);
out2 VARCHAR2(100);
out3 VARCHAR2(100);
out4 NUMBER(100);
BEGIN
EXECUTE user.package.procedure (33,89, out1, out2, out3, out4);
END;
Error report:
ORA-06550: line 13, column 17:
PLS-00103: Encountered the symbol "USER" when expecting one of the following:
:= . ( @ % ; immediate
The symbol ":=" was substituted for "USER" to continue.
06550. 00000 - "line %s, column %s:n%s"
*Cause: Usually a PL/SQL compilation error.
*Action:
12 ответов:
С простыми типами параметров (т. е. не refcursors и т. д.) вы можете сделать что-то вроде этого:
SET serveroutput on; DECLARE InParam1 number; InParam2 number; OutParam1 varchar2(100); OutParam2 varchar2(100); OutParam3 varchar2(100); OutParam4 number; BEGIN /* Assign values to IN parameters */ InParam1 := 33; InParam2 := 89; /* Call procedure within package, identifying schema if necessary */ schema.package.procedure(InParam1, InParam2, OutParam1, OutParam2, OutParam3, OutParam4); /* Display OUT parameters */ dbms_output.put_line('OutParam1: ' || OutParam1); dbms_output.put_line('OutParam2: ' || OutParam2); dbms_output.put_line('OutParam3: ' || OutParam3); dbms_output.put_line('OutParam4: ' || OutParam4); END; /
редактировать использовать спецификацию OP и с альтернативным подходом использовать:varпеременные связывания :var InParam1 number; var InParam2 number; var OutParam1 varchar2(100); var OutParam2 varchar2(100); var OutParam3 varchar2(100); var OutParam4 number; BEGIN /* Assign values to IN parameters */ :InParam1 := 33; :InParam2 := 89; /* Call procedure within package, identifying schema if necessary */ schema.package.procedure(:InParam1, :InParam2, :OutParam1, :OutParam2, :OutParam3, :OutParam4); END; / -- Display OUT parameters print :OutParam1; print :OutParam2; print :OutParam3; print :OutParam4;
выполняется легко. Получение результатов может быть трудно.
взгляните на этот вопрос, который я задал лучший способ / инструмент для получения результатов от процедуры пакета oracle
резюме это выглядит так.
предполагая, что у вас есть пакет с именем mypackage и процедура getQuestions. Он возвращает refcursor и принимает строковое имя пользователя.
все, что вам нужно сделать, это создать новый файл SQL (file new). Установите соединение и вставьте его следующее и выполняем.
var r refcursor; exec mypackage.getquestions(:r, 'OMG Ponies'); print r;
для тех, кто использует SqlDeveloper 3+, в случае, если вы пропустили, что:
SqlDeveloper имеет функцию для непосредственного выполнения сохраненного proc / функции, а выходные данные отображаются в удобном для чтения виде.
просто щелкните правой кнопкой мыши на пакете / сохраненном proc / сохраненной функции, нажмите на
Runи выбратьtargetчтобы быть proc / func, который вы хотите выполнить, SqlDeveloper будет генерировать фрагмент кода для выполнения (так что вы можете поместить свои входные параметры). После выполнения выходные параметры: отображается в нижней половине диалогового окна, и в нем даже есть встроенная поддержка курсора ref: результат курсора будет отображаться в виде отдельной вкладки вывода.
откройте процедуру в SQL Developer и запустите ее оттуда. Разработчик SQL отображает SQL, который он выполняет.
BEGIN PROCEEDURE_NAME_HERE(); END;
использование:
BEGIN PACKAGE_NAME.PROCEDURE_NAME(parameter_value, ...); END;замените "PACKAGE_NAME", "PROCEDURE_NAME" и "parameter_value" на то, что вам нужно. Параметры OUT должны быть объявлены до этого.
ни один из этих ответов работал для меня. Вот что мне нужно было сделать, чтобы запустить процедуру в SQL Developer 3.2.20.10:
SET serveroutput on; DECLARE testvar varchar(100); BEGIN testvar := 'dude'; schema.MY_PROC(testvar); dbms_output.enable; dbms_output.put_line(testvar); END;и тогда вам нужно будет проверить таблицу на то, что ваш proc должен был сделать с этой переданной переменной-выход просто подтвердит, что переменная получила значение (и теоретически передала его в proc).
Примечание (различия с моим против других):
- нет
:до имени переменной- не
.package.или.packages.между именем схемы и именем процедуры- нет необходимости положить
&в значении переменной.- не используя
- не используя
varчтобы объявить переменнуювсе эти проблемы заставили меня почесывать голову дольше всего, и эти ответы, которые имеют эти вопиющие ошибки, должны быть выведены и просмолены и оперены.
не могу поверить, что это не будет выполняться в SQL Developer:
var r refcursor; exec PCK.SOME_SP(:r, '02619857'); print r;а это:
var r refcursor; exec TAPI_OVLASCENJA.ARH_SELECT_NAKON_PRESTANKA_REG(:r, '02619857'); print r;очевидно, что все должно быть в одной строке..
С помощью SQL Developer версии 4.0.2.15 Build 15.21 выполняются следующие работы:
SET SERVEROUTPUT ON var InParam1 varchar2(100) var InParam2 varchar2(100) var InParam3 varchar2(100) var OutParam1 varchar2(100) BEGIN /* Assign values to IN parameters */ :InParam1 := 'one'; :InParam2 := 'two'; :InParam3 := 'three'; /* Call procedure within package, identifying schema if necessary */ schema.package.procedure(:InParam1, :InParam2, :InParam3, :OutParam1); dbms_output.enable; dbms_output.put_line('OutParam1: ' || :OutParam1); END; /
хотя этот вопрос довольно старый, я продолжаю натыкаться на тот же результат, не находя простого способа запуска от разработчика sql. После нескольких попыток, я нашел простой способ, чтобы выполнить хранимую процедуру из самого разработчика SQL.
В разделе пакеты выберите нужный пакет и щелкните правой кнопкой мыши на имени пакета (не на имени хранимой процедуры).
вы найдете вариант для запуска. Выбрать и необходимые аргументы. Нажмите кнопку ОК, и вы можете увидеть вывод в разделе выходных переменных ниже
Я использую SQL developer версии 4.1.3.20
Я не смог получить @Alex Poole ответы работают. Однако методом проб и ошибок я нашел следующие работы (используя SQL Developer версии 3.0.04). Разместите его здесь, если это поможет другим:
SET serveroutput on; DECLARE var InParam1 number; var InParam2 number; var OutParam1 varchar2(100); var OutParam2 varchar2(100); var OutParam3 varchar2(100); var OutParam4 number; BEGIN /* Assign values to IN parameters */ InParam1 := 33; InParam2 := 89; /* Call procedure within package, identifying schema if necessary */ schema.package.procedure(InParam1, InParam2, OutParam1, OutParam2, OutParam3, OutParam4); /* Display OUT parameters */ dbms_output.put_line('OutParam1: ' || OutParam1); dbms_output.put_line('OutParam2: ' || OutParam2); dbms_output.put_line('OutParam3: ' || OutParam3); dbms_output.put_line('OutParam4: ' || OutParam4); END;
создание блока Pl / SQL может быть болезненным, если у вас есть много процедур, которые имеют много параметров. Существует приложение написано на python, которые делают это за вас. Он анализирует файл с объявлениями процедур и создает веб-приложение для удобных вызовов процедур.
var out_para_name refcursor; execute package_name.procedure_name(inpu_para_val1,input_para_val2,... ,:out_para_name); print :out_para_name;
Comments