Запустить хранимую процедуру в 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 / function напрямую, а выходные данные отображаются простым для чтения способом.

просто щелкните правой кнопкой мыши на пакете / сохраненной proc / сохраненной функции, нажмите на Run и выбрать target чтобы быть proc / func, который вы хотите выполнить, 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 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. между именем схемы и именем процедуры
  • нет необходимости положить & в значении переменной.
  • не используя print в любом месте
  • не используя 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.

  • В разделе пакеты выберите нужный пакет и щелкните правой кнопкой мыши имя пакета (а не имя хранимой процедуры).

  • вы найдете опцию для запуска. Выбрать и необходимые аргументы. Нажмите OK, и вы увидите вывод в разделе выходные переменные ниже

Я использую 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;