Выполнение хранимой процедуры в Oracle - PullRequest
2 голосов
/ 27 мая 2011

У меня есть хранимая процедура, на Toad for Oracle я вызываю процедуру, используя

SELECT FROM PKGName.ProcedureName(1,'10/10/2010','10/23/2010',7,7) 
  FROM DUAL

У меня есть 3 выходных параметра для этой процедуры, и я получаю

ORA-00904: PKGName.ProcedureName: неверный идентификатор

Обязательно ли указывать выходной параметр в вызове процедуры?Если да, как я могу его использовать?

Ответы [ 6 ]

4 голосов
/ 27 мая 2011

Вы не можете использовать процедуру в операторе SELECT.Функции да (с соответствующими типами возврата), процедуры нет.Элементы в списке SELECT должны быть выражениями , которые должны соответствовать значению.Процедура не соответствует этому критерию.

И да, вам нужно упомянуть выходные переменные в вашем списке параметров.Процедура собирается установить эти параметры на некоторые значения, для каждого из них должен быть указан выходной параметр, чтобы получить их.@schurik показывает, как это обычно делается в PL / SQL.@Datajam близок к тому, как вы делаете это в SQL * Plus, но не учитывает выходные параметры:

SQL> var num_var number
SQL> var txt_var varchar2(15)
SQL> var txt_var2 varchar2(20)

SQL> exec PKGName.ProcedureName(1,'10/10/2010','10/23/2010',7,7, :num_var, :txt_var, :txt_var2);

PL/SQL procedure successfully completed
num_var
---------------
42
txt_var
-----------------
some text
txt_var2
-------------------
some other text

SQL> 
2 голосов
/ 27 мая 2011
declare 
  -- declare variables to keep output values
  output_par_1 varchar2(100);
  output_par_2 number(10);
  ...
begin
  PKGName.ProcedureName(1,'10/10/2010','10/23/2010',output_par_1,output_par_2);

  -- display output values
  dbms_output.put_line('output_par_1: ' || output_par_1);
  dbms_output.put_line('output_par_2: ' || output_par_2);
end;
/
1 голос
/ 27 мая 2011

Если вы хотите иметь возможность вызывать процедуры из select, оберните их функцией или табличной функцией.Смотрите здесь для получения более подробной информации: http://technology.amis.nl/blog/1017/calling-stored-procedures-using-plain-sql-for-when-sql-is-allowed-but-calls-to-stored-procedures-are-not (черт возьми, почти заголовок статьи хехехе).

0 голосов
/ 27 мая 2011

Код в вопросе синтаксически неверен, он должен быть

SELECT PKGName.ProcedureName(1,'10/10/2010','10/23/2010',7,7) FROM DUAL

Однако это будет работать только для функций.Но поскольку это очевидно работает в Toad, я предполагаю, что у плаката действительно была функция.Я также сделал предположение, что использование SQL было обязательным условием.

Если вопрос заключался в том, как использовать несколько выходных параметров - попробуйте создать определенный пользователем тип.Возможно, тогда вопрос следует переименовать в «Вызов процедуры с выходными параметрами из SQL в Oracle».

В противном случае простая функция-обертка без выходных параметров сделает эту работу.

0 голосов
/ 27 мая 2011

На самом деле вам не следует вызывать процедуру с использованием инструкции SELECT (и даже если вы это сделали, вызов был бы до части FROM).

Вместо этого используйте приглашение SQL * Plus (я думаю, что Toad имеет встроенный интерфейс SQL * Plus):

exec PKGName.ProcedureName(1,'10/10/2010','10/23/2010',7,7);
0 голосов
/ 27 мая 2011

Да, вы должны предоставить все аргументы. Объявите переменную соответствующего типа и передайте ее в качестве выходного аргумента.

...