我在Oracle数据库中有一个存储过程,它接收3个参数。
我知道我用1到3个参数调用它,但是可以在内部知道有多少参数是默认值或者真的通过了?
例如:
我问这个因为我使用Informix 4GL而且我可以使用" NARGS"知道我收到的论据数量。
答案 0 :(得分:2)
简短的回答是否定的......没有相当于NARGS或“C”的argc。
如果您使用空的默认值,您可以手动计算不等于默认值的参数数量..但是如果您明确地将默认值作为参数传递,则不会告诉您。
我能想到2个解决方案。 1.用户重载程序..即
procedure a (p_1 number);
procedure a (p_1 number, p_2 number);
procedure a (p_1 number, p_2 number, p_3 number);
然后在你将“知道”你所在的身体中。
选项2.将varray / plsql表作为单个参数传递,但实际传递参数会产生问题。
create or replace package x
is
type an_arg is record ( n number, v varchar2(2000), d date);
type args is table of an_arg;
procedure a(argv args);
end;
/
create or replace package body x
is
procedure a(argv args)
is
begin
dbms_output.put_line('i was passed '||argv.count||' arguments');
end;
end;
/
答案 1 :(得分:0)
类似于ShoeLace的答案,我认为计算不等于每个参数默认值的参数数量是可以的。
关键是给每个参数一个无意义的默认值。就像“〜#dummee_v @ 1u3#〜”一样。任何您确信不会真正传递的东西。这样,您就不必担心有人传递的参数值等于默认值。
所以:
create procedure p1 (id1 varchar2 default '~#dummee_v@1u3#~', id2 varchar2 default '~#dummee_v@1u3#~') is
lParamCount number := 0;
lDummyParamValue varchar2 := '~#dummee_v@1u3#~';
begin
if id1 <> lDummyParamValue then lParamCount := lParamCount + 1;
if id2 <> lDummyParamValue then lParamCount := lParamCount + 1;
end p1;