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

81

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

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

Я пытался найти пример того, как создать анонимный блок, чтобы я мог запустить процедуру как файл 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:
сдока
источник
Попробуйте поместить переменные OUT в BEGIN перед оператором выполнения процедуры.
OMG Ponies
Вам не нужен execute; в PL / SQL это интерпретируется как начало execute immediate, в отличие от SQL execute.
Alex Poole
2
@sdoca: теперь вы путаете два подхода; с вашей версией редактирования 2 просто удалите слово execute. declareДолжен быть перед begin. Я думаю, что @OMG имел в виду, что вы можете объявить переменные в SQL Developer перед анонимным блоком с помощью variableключевого слова, а затем использовать :out1синтаксис, который был у вас изначально, и в этом случае у вас вообще нет declareраздела. Но вы смешиваете два из своего последнего комментария.
Alex Poole,
1
Да, я знал, что запутался, но не знал, где и как.
sdoca

Ответы:

75

С простыми типами параметров (т.е. не рефкурсорами и т.д.) вы можете сделать что-то вроде этого:

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;
Алекс Пул
источник
1
+1 хороший ответ. Из любопытства знаете, что предпочтительнее?
Конрад Фрикс,
@ Конрад: Я полагаю, это вопрос предпочтений, хотя, возможно, нужно больше переключать контекст :var. Я бы использовал этот declareспособ по умолчанию, если бы что-то делал с PL / SQL; но я мог бы использовать, :varесли бы, скажем, я использовал часть существующего кода, скопированного из Pro * C, который уже имел этот синтаксис, и я не хотел бы касаться параметров в вызове.
Alex Poole,
2
Спасибо за помощь и подробный ответ. Я уверен, что это поможет и другим. Следует отметить, что они должны выполняться как сценарии, а не операторы.
sdoca
1
При запуске в sql-разработчике мне не нужно было ставить перед именами переменных префикс :(на самом деле, это не сработало).
haridsv
29

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

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

Краткое изложение этого выглядит так.

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

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

var r refcursor;
exec mypackage.getquestions(:r, 'OMG Ponies');
print r;
Конрад Фрикс
источник
3
Мне пришлось использовать полное слово «выполнить», а не «выполнить»
Патрик
21

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

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

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

Адриан Шум
источник
2
Это должен быть выбранный ответ.
EvilTeach
12

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

BEGIN
  PROCEEDURE_NAME_HERE();
END;
Ноэль
источник
6

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

BEGIN

  PACKAGE_NAME.PROCEDURE_NAME(parameter_value, ...);

END;

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

OMG Пони
источник
2

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

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

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

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

Нарасимха
источник
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;

И затем вам нужно будет проверить таблицу на предмет того, что ваша процедура должна была сделать с этой переданной переменной - вывод просто подтвердит, что переменная получила значение (и теоретически передала его в процесс).

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

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

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

vapcguy
источник
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команды]. Это не ответ на вопрос, который был задан, и в любом случае на него были даны более уместные ответы на другие вопросы .
Alex Poole
Смог использовать его в SQL Developer. Спасибо
Sergejs
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;
/
Джек
источник
Нет, извините - varдо того, как переменные НЕ РАБОТАЮТ - по крайней мере, в SQL Developer 3.2.20.10, и не должны использовать двоеточия перед ними - в этом нет необходимости, опять же, по крайней мере, в 3.2.20.10 (единственная причина, по которой я не использовал не голосуйте и не редактируйте). Также потребуется точка с запятой после SET SERVEROUTPUT ON.
vapcguy
0

Чтобы запустить процедуру только от разработчика SQL, выполните следующую команду

EXECUTE PROCEDURE_NAME;

Амол Раван
источник
-1

Мне не удалось получить ответы @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;
ggkmath
источник
2
Это то же самое, что и первая версия в моем ответе, за исключением того, что вы добавили varк каждой переменной в declareблоке, что недопустимо. При попытке запустить это дает «PLS-00103: Обнаружен символ« ЧИСЛО »при ожидании одного из следующих ...» и аналогичные ошибки для других пяти переменных.
Alex Poole
Я согласен с Алексом. Проголосовали против var, потому что , и мне не нужно было использовать .package.в моем вызове, по крайней мере, в 3.2.20.10, который не должен был быть таким другим, и при этом у меня были ошибки. Потратил много времени на этот ответ.
vapcguy
-1
--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;
v8-E
источник
-2

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

nmax
источник
-3
var out_para_name refcursor; 
execute package_name.procedure_name(inpu_para_val1,input_para_val2,... ,:out_para_name);
print :out_para_name;
Помощник
источник