Запустить хранимую процедуру в SQL Developer? - PullRequest
71 голосов
/ 22 октября 2010

Я пытаюсь запустить хранимую процедуру с несколькими входными и выходными параметрами.Процедуру можно просмотреть только на панели «Подключения», перейдя по ссылке «Другие пользователи» ||Пакеты ||

Если я щелкну правой кнопкой мыши, пункты меню будут «Упорядочить элементы по ...» и «Создать модульный тест» (выделены серым цветом).Возможность «Запустить» процедуру не представляется возможной, когда к ней обращается пользователь.

Я пытался найти пример того, как создать анонимный блок, чтобы я мог запустить процедуру в виде файла 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:

Ответы [ 13 ]

72 голосов
/ 22 октября 2010

С простыми типами параметров (т. Е. Без рекурсоров и т. Д.) Вы можете сделать что-то вроде этого:

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;
26 голосов
/ 22 октября 2010

Выполнение легко. Получить результаты может быть сложно.

Взгляните на этот вопрос, который я задал Лучший способ / инструмент для получения результатов процедуры пакета oracle

Сводка так выглядит.

Предполагается, что у вас есть Пакет с именем mypackage и процедура с именем getQuestions. Возвращает refcursor и принимает строковое имя пользователя.

Все, что вам нужно сделать, это создать новый файл SQL (файл new). Установите соединение и вставьте следующее и выполните.

var r refcursor;
exec mypackage.getquestions(:r, 'OMG Ponies');
print r;
17 голосов
/ 03 июня 2015

Для тех, кто использует SqlDeveloper 3+, на случай, если вы пропустили:

SqlDeveloper имеет функцию для непосредственного выполнения сохраненной процедуры / функции, а выходные данные отображаются в удобном для чтения виде.

Просто щелкните правой кнопкой мыши пакет / сохраненный процесс / сохраненную функцию, нажмите Run и выберите target в качестве процедуры / функции, которую вы хотите выполнить, SqlDeveloper сгенерирует фрагмент кода для выполнения (чтобы вы могли поставить свои входные параметры). После выполнения выходные параметры отображаются в нижней половине диалогового окна и даже имеют встроенную поддержку ref курсора: результат курсора будет отображаться в виде отдельной вкладки вывода.

11 голосов
/ 06 января 2012

Откройте процедуру в SQL Developer и запустите ее оттуда.SQL Developer отображает SQL, который он запускает.

BEGIN
  PROCEEDURE_NAME_HERE();
END;
6 голосов
/ 22 октября 2010

Использование:

BEGIN

  PACKAGE_NAME.PROCEDURE_NAME(parameter_value, ...);

END;

Замените "PACKAGE_NAME", "PROCEDURE_NAME" и "parameter_value" на то, что вам нужно. Параметры OUT должны быть объявлены до.

1 голос
/ 13 марта 2018

Хотя этот вопрос довольно старый, я продолжаю натыкаться на тот же результат, не находя простой способ запуска из sql developer. После нескольких попыток я нашел простой способ выполнить хранимую процедуру от самого разработчика sql.

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

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

Я использую SQL-разработчик версии 4.1.3.20

1 голос
/ 31 августа 2016

Ни один из этих ответов не помог мне.Вот что мне нужно было сделать, чтобы запустить процедуру в 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 для объявления переменной

Все эти проблемы оставили меня в покоемоя голова для самых длинных и эти ответы, которые имеют эти вопиющие ошибки, которые должны быть вынуты, отлиты и украшены.

0 голосов
/ 30 мая 2019
--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;
0 голосов
/ 11 декабря 2015

Создание блока Pl / SQL может быть болезненным, если у вас много процедур, которые имеют много параметров.Существует приложение , написанное на python, которое сделает это за вас.Он анализирует файл с объявлениями процедур и создает веб-приложение для удобных вызовов процедур.

0 голосов
/ 26 июля 2014

Использование 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;
/
...