Запустить хранимую процедуру в SQL Developer?

60

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

Если я щелкнул правой кнопкой мыши, пункты меню - "Order Members By..." и "Create Unit Test" (greyed out). Возможность "запускать" процедуру не представляется возможной при ее доступе пользователем.

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

Я попытался инициализировать переменные *:

   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:
  • 0
    возможный дубликат Best way / tool для получения результатов процедуры пакета oracle
  • 0
    Попробуйте поместить переменные OUT внутри BEGIN перед оператором выполнения процедуры.
Показать ещё 5 комментариев
Теги:
stored-procedures
oracle-sqldeveloper

11 ответов

60
Лучший ответ

С простыми типами параметров (т.е. не 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 bind:
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;
  • 1
    +1 хороший ответ. Из любопытства знаете ли вы, что является предпочтительным?
  • 0
    @Conrad: я думаю, что это предпочтение, хотя может быть больше контекста, переключающего путь :var . Я бы использовал способ declare по умолчанию, если бы я что-то делал с PL / SQL; но я мог бы использовать :var если, скажем, я использовал немного существующего кода, скопированного из Pro * C, который уже имел этот синтаксис, и я не хотел касаться парсов в вызове.
Показать ещё 2 комментария
23

Выполнение простых действий. Получение результатов может быть затруднено.

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

Сводка этого вопроса выглядит следующим образом.

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

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

var r refcursor;
exec mypackage.getquestions(:r, 'OMG Ponies');
print r;
  • 3
    Я должен был использовать полное слово «выполнить», а не «exec»
8

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

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

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

  • 1
    Это должен быть выбранный ответ.
  • 0
    да, это должен быть ответ
7

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

BEGIN
  PROCEEDURE_NAME_HERE();
END;
4

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

BEGIN

  PACKAGE_NAME.PROCEDURE_NAME(parameter_value, ...);

END;

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

1

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

ПРИМЕЧАНИЕ (различия с моими и другими):

  • Нет : до имени переменной
  • Не помещайте .package. или .packages. между именем схемы и именем процедуры
  • Не нужно помещать & в значение переменной.
  • Без использования print где-либо
  • Без использования var для объявления переменной

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

0

Использование 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;
/
  • 0
    Нет, извините - var перед переменными не работает - по крайней мере , в SQL Developer 3.2.20.10, и не должны использовать двоеточие перед ними - нет необходимости в этом, опять же , по крайней мере , в 3.2.20.10 (только почему - то не проголосовал и не отредактировал) Также потребуется SET SERVEROUTPUT ON после SET SERVEROUTPUT ON .
0

Я не смог получить ответы @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;
  • 2
    Это так же , как первый вариант в моем ответе, за исключением того, как вы добавили var каждой переменной в declare блоке, который является недействительным. Попытка выполнить это дает «PLS-00103: обнаружен символ« НОМЕР »при ожидании одного из следующих ...» и аналогичные ошибки в отношении остальных пяти переменных.
  • 0
    Я согласен с Алексом. Проголосовал, потому что var , и мне не нужно было использовать .package. в моем вызове, по крайней мере, в 3.2.20.10, который не должен был быть таким разным, и когда я сделал, были ошибки. Потратил много времени с этим ответом.
0

Не могу поверить, это не будет выполняться в 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;

Очевидно, что все должно быть в одной строке.

  • 2
    [В документации SQL * Plus для команды execute ] указано это. Это не ответ на вопрос, который был задан, хотя и был рассмотрен в более релевантных ответах на другие вопросы, прежде чем в любом случае.
  • 0
    Был в состоянии использовать его в SQL Developer. Спасибо
-1

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

-3
var out_para_name refcursor; 
execute package_name.procedure_name(inpu_para_val1,input_para_val2,... ,:out_para_name);
print :out_para_name;

Ещё вопросы

Сообщество Overcoder
Наверх
Меню