我是否可以知道Oracle PL / SQL中存储过程中传递的参数数量

时间:2017-01-25 22:28:36

标签: oracle stored-procedures plsql

我在Oracle数据库中有一个存储过程,它接收3个参数。

我知道我用1到3个参数调用它,但是可以在内部知道有多少参数是默认值或者真的通过了?

例如:

  • dummy(1)一些关键词说我" 1"
  • dummy(1,2,3)说我" 3"

我问这个因为我使用Informix 4GL而且我可以使用" NARGS"知道我收到的论据数量。

2 个答案:

答案 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;