我的程序如下:
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,那么它将作为常数,我将无法分配任何东西
答案 0 :(得分:1)
正如Dmitry Bychenko所说,你必须使用变量作为OUT
或IN 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;
/
然后,您可以使用常量值调用该过程。它只取决于调用者是否需要知道修改后的值。