Я пытаюсь запустить хранимую процедуру с несколькими входящими и исходящими параметрами. Эту процедуру можно просмотреть только на моей панели «Подключения», выбрав «Другие пользователи | | Пакеты | |
Если я щелкну правой кнопкой мыши, пункты меню будут «Упорядочить участников по ...» и «Создать модульный тест» (выделены серым цветом). Возможность «запустить» процедуру не представляется возможной, когда к ней обращается пользователь.
Я пытался найти пример того, как создать анонимный блок, чтобы я мог запустить процедуру как файл SQL, но не нашел ничего, что работает.
Кто-нибудь знает, как я могу выполнить эту процедуру из SQL Developer? Я использую версию 2.1.1.64.
Заранее спасибо!
РЕДАКТИРОВАТЬ 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
Я пробовал инициализировать переменные out *:
out1 VARCHAR2(100) := '';
но получите ту же ошибку:
РЕДАКТИРОВАТЬ 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:
execute
; в PL / SQL это интерпретируется как началоexecute immediate
, в отличие от SQLexecute
.execute
.declare
Должен быть передbegin
. Я думаю, что @OMG имел в виду, что вы можете объявить переменные в SQL Developer перед анонимным блоком с помощьюvariable
ключевого слова, а затем использовать:out1
синтаксис, который был у вас изначально, и в этом случае у вас вообще нетdeclare
раздела. Но вы смешиваете два из своего последнего комментария.Ответы:
С простыми типами параметров (т.е. не рефкурсорами и т.д.) вы можете сделать что-то вроде этого:
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;
источник
:var
. Я бы использовал этотdeclare
способ по умолчанию, если бы что-то делал с PL / SQL; но я мог бы использовать,:var
если бы, скажем, я использовал часть существующего кода, скопированного из Pro * C, который уже имел этот синтаксис, и я не хотел бы касаться параметров в вызове.:
(на самом деле, это не сработало).Выполнение легко. Добиться результатов может быть сложно.
Взгляните на этот вопрос, который я задал. Лучший способ / инструмент для получения результатов процедуры пакета Oracle.
Краткое изложение этого выглядит так.
Предполагая, что у вас есть пакет с именем mypackage и процедура getQuestions. Он возвращает рефкурсор и принимает строковое имя пользователя.
Все, что вам нужно сделать, это создать новый файл SQL (новый файл). Установите соединение и вставьте следующее и выполните.
источник
Для тех, кто использует SqlDeveloper 3+, если вы это пропустили:
SqlDeveloper имеет возможность напрямую выполнять сохраненную процедуру / функцию, а вывод отображается в удобном для чтения виде.
Просто щелкните правой кнопкой мыши пакет / сохраненную функцию / сохраненную функцию, нажмите
Run
и выберите процедуруtarget
/ функцию, которую вы хотите выполнить, SqlDeveloper сгенерирует фрагмент кода для выполнения (чтобы вы могли ввести свои входные параметры). После выполнения параметры вывода отображаются в нижней половине диалогового окна, и в нем даже есть встроенная поддержка курсора ref: результат курсора будет отображаться как отдельная вкладка вывода.источник
Откройте процедуру в SQL Developer и запустите ее оттуда. SQL Developer отображает SQL, который он выполняет.
BEGIN PROCEEDURE_NAME_HERE(); END;
источник
Использование:
BEGIN PACKAGE_NAME.PROCEDURE_NAME(parameter_value, ...); END;
Замените "PACKAGE_NAME", "PROCEDURE_NAME" и "parameter_value" на то, что вам нужно. Параметры OUT необходимо будет объявить до.
источник
Хотя этот вопрос довольно старый, я все время натыкаюсь на тот же результат, не находя простого способа запустить его от разработчика sql. После пары попыток я нашел простой способ выполнить хранимую процедуру от самого разработчика sql.
В разделе «Пакеты» выберите нужный пакет и щелкните правой кнопкой мыши имя пакета (а не имя хранимой процедуры).
Вы найдете вариант для запуска. Выберите это и укажите необходимые аргументы. Нажмите OK, и вы увидите результат в разделе выходных переменных ниже.
Я использую версию разработчика SQL 4.1.3.20
источник
Ни один из этих других ответов не помог мне. Вот что мне нужно было сделать, чтобы запустить процедуру в 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;
И затем вам нужно будет проверить таблицу на предмет того, что ваша процедура должна была сделать с этой переданной переменной - вывод просто подтвердит, что переменная получила значение (и теоретически передала его в процесс).
ПРИМЕЧАНИЕ (различия с моим и другими):
:
перед именем переменной.package.
или.packages.
между именем схемы и именем процедуры&
в значение переменной.print
нигдеvar
для объявления переменнойВсе эти проблемы заставили меня долго чесать голову, и эти ответы, в которых есть эти вопиющие ошибки, должны быть удалены, смолены и покрыты перьями.
источник
Не могу поверить, в SQL Developer это не сработает:
НО это будет:
Очевидно, все должно быть в одной строке ..
источник
execute
команды]. Это не ответ на вопрос, который был задан, и в любом случае на него были даны более уместные ответы на другие вопросы .При использовании 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; /
источник
var
до того, как переменные НЕ РАБОТАЮТ - по крайней мере, в SQL Developer 3.2.20.10, и не должны использовать двоеточия перед ними - в этом нет необходимости, опять же, по крайней мере, в 3.2.20.10 (единственная причина, по которой я не использовал не голосуйте и не редактируйте). Также потребуется точка с запятой послеSET SERVEROUTPUT ON
.Чтобы запустить процедуру только от разработчика SQL, выполните следующую команду
EXECUTE PROCEDURE_NAME;
источник
Мне не удалось получить ответы @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;
источник
var
к каждой переменной вdeclare
блоке, что недопустимо. При попытке запустить это дает «PLS-00103: Обнаружен символ« ЧИСЛО »при ожидании одного из следующих ...» и аналогичные ошибки для других пяти переменных.var
, потому что , и мне не нужно было использовать.package.
в моем вызове, по крайней мере, в 3.2.20.10, который не должен был быть таким другим, и при этом у меня были ошибки. Потратил много времени на этот ответ.--for setting buffer size needed most of time to avoid `anonymous block completed` message set serveroutput on size 30000; -- declaration block in case output need to catch DECLARE --declaration for in and out parameter V_OUT_1 NUMBER; V_OUT_2 VARCHAR2(200); BEGIN --your stored procedure name schema.package.procedure( --declaration for in and out parameter V_OUT_1 => V_OUT_1, V_OUT_2 => V_OUT_2 ); V_OUT_1 := V_OUT_1; V_OUT_2 := V_OUT_2; -- console output, no need to open DBMS OUTPUT seperatly -- also no need to print each output on seperat line DBMS_OUTPUT.PUT_LINE('Ouput => ' || V_OUT_1 || ': ' || V_OUT_2); 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;
источник