sql oracle procedure IN OUT参数,如何执行它

时间:2014-05-12 09:13:33

标签: sql oracle stored-procedures

我的程序如下:

create or replace procedure odcitaj_surovinu_zo_skladu
(
v_id_suroviny IN surovina.id_suroviny%TYPE,
odcitaj IN OUT number
)
as
begin
...//some code here 
        odcitaj:=odcitaj-22;
...//some code here 
end;

程序编译没有错误。我正在尝试执行它:

execute odcitaj_surovinu_zo_skladu(1,200);

但是它给出了错误,'200'不能用作分配的目标。
那么如何执行呢? ODCITAJ甚至需要IN OUT吗?因为我知道,如果它只是IN,那么它将作为常数,我将无法分配任何东西

1 个答案:

答案 0 :(得分:1)

正如Dmitry Bychenko所说,你必须使用变量作为OUTIN OUT参数的目标,你不能提供常量。您的参数确实必须为IN OUT,因为您在此过程中对其进行了修改。您可以使用匿名块:

declare
  l_odcitaj number;
begin
  l_odcitaj := 200;
  odcitaj_surovinu_zo_skladu(1, l_odcitaj);
  -- do something with the updated value of l_odcitaj
end;
/

如果您想使用SQL * Plus / SQL Developer execute简写包装来代替匿名阻止you can declare a bind variable

variable l_odcitaj number;
exec :l_odcitaj := 200;
exec odcitaj_surovinu_zo_skladu(1, :l_odcitaj);

请注意,变量名在设置时和调用过程时前面有一个冒号,因为它是一个绑定变量。

如果您愿意,可以在其他调用中使用该更新的绑定变量,或者打印它的程序后值:

print l_odcitaj

如果更新的值 - 来自odcitaj:=odcitaj-22; - 不需要返回并且仅在过程中使用,您可以将参数声明为IN并且有一个局部变量从参数设置,然后在程序中操作和使用。

create or replace procedure odcitaj_surovinu_zo_skladu
(
  v_id_suroviny IN surovina.id_suroviny%TYPE,
  v_odcitaj IN number
)
as
  l_odcitaj number;
begin
  l_odcitaj := v_odcitaj;
  ...//some code here 
  l_odcitaj:=l_odcitaj-22;
  ...//some code here 
end;
/

然后,您可以使用常量值调用该过程。它只取决于调用者是否需要知道修改后的值。