2010-10-21 3 views
60

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

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

Я пытался найти пример того, как создать анонимный блок, чтобы я мог запускать процедуру как файл SQL, но не нашел ничего, что работает.

Кто-нибудь знает, как я могу выполнить эту процедуру от SQL Developer? Я использую версию 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: 
+0

Возможный дубликат [Лучший способ/инструмент для получения результатов от процедуры пакета oracle] (http://stackoverflow.com/questions/3526798/best-way-tool-to-get-the-results-from- a-oracle-package-procedure) –

+0

Попробуйте помещать переменные OUT внутри BEGIN перед выполнением процедуры. –

+0

Вам не нужен 'execute'; в PL/SQL, который интерпретируется как начало 'execute немедленный', который отличается от SQL' execute'. –

ответ

63

С простыми типами параметров (т. Е. Не 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; 
+1

+1 приятный ответ. Из любопытства вы знаете, что предпочитаете? –

+0

@Conrad: Я думаю, это предпочтение вещь, хотя может быть больше контекста, переключая путь ': var'. Я бы использовал метод 'declare' по умолчанию, если бы я делал что-либо с PL/SQL; но я мог бы использовать ': var', если, скажем, я использовал немного существующего кода, скопированного из Pro * C, который уже имел этот синтаксис, и я не хотел касаться парм в вызове. –

+1

Спасибо за помощь и подробный ответ. Я уверен, что это поможет и другим. Следует отметить, что они должны выполняться как скрипты, а не инструкции. – sdoca

23

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

Взгляните на этот вопрос я спросил Best way/tool to get the results from an oracle package procedure

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

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

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

var r refcursor; 
exec mypackage.getquestions(:r, 'OMG Ponies'); 
print r; 
+3

Мне пришлось использовать полное слово «выполнить», а не «exec» – Patrick

4

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

BEGIN 

    PACKAGE_NAME.PROCEDURE_NAME(parameter_value, ...); 

END; 

Заменить "PACKAGE_NAME", "имя_процедуры", и "PARAMETER_VALUE" с тем, что вам нужно. Параметры OUT должны быть объявлены до.

7

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

BEGIN 
    PROCEEDURE_NAME_HERE(); 
END; 
-3
var out_para_name refcursor; 
execute package_name.procedure_name(inpu_para_val1,input_para_val2,... ,:out_para_name); 
print :out_para_name; 
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 docs для команды 'execute']. Это не ответ на вопрос, который был задан, и был рассмотрен [в более релевантных ответах на другие вопросы] (http://stackoverflow.com/a/15649958/266304) до этого. –

+0

Был в состоянии использовать его в SQL Developer. Спасибо – Sergejs

-1

Я не смог получить @Alex Poole a Работает. Однако, по результатам проб и ошибок, я нашел следующие работы (используя 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: встречается символ« NUMBER »при ожидании одного из следующих ...» и подобных ошибок в отношении других пяти переменных. –

+0

Я согласен с Алексом. Downvoted, потому что 'var', и мне не нужно было использовать' .package.' в моем вызове, по крайней мере в 3.2.20.10, который не должен был быть таким разным, и получил ошибки, когда я это сделал. Потерпел много времени с этим ответом. – vapcguy

0

Использование версии SQL Developer 4.0.2.15 Построить 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'. – vapcguy

8

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

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

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

+0

Это должен быть выбранный ответ. – EvilTeach

-2

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

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; 

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

ПРИМЕЧАНИЕ (отличия от мин против vs.не другие):

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

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

Смежные вопросы