Oracle中存储过程的缺省值

时间:2014-03-20 20:30:27

标签: stored-procedures parameters plsql oracle11g default

我有stored procedure如下。

 CREATE OR REPLACE PROCEDURE TEST(X IN VARCHAR2 DEFAULT 'P',Y IN NUMBER DEFAULT 1) AS
 BEGIN
 DBMS_OUTPUT.PUT_LINE('X'|| X||'--'||'Y'||Y);
 END;

当我执行上述程序时

 EXEC TEST(NULL,NULL);

它将打印X--Y。当输入参数为null时,输入参数不会默认为过程签名中的指定值。 那么default值的用途是什么?如果我们将null值作为输入传递,并且我们想要将null值替换为default值,该怎么办?

2 个答案:

答案 0 :(得分:45)

仅在未指定参数时使用默认值。在你的情况下,你指定参数 - 两者都是提供的,值为NULL。 (是的,在这种情况下,NULL被认为是真正的值:-)。尝试:

EXEC TEST()

分享并享受。

附录:过程参数的默认值肯定隐藏在某个系统表中(请参阅SYS.ALL_ARGUMENTS视图),但从视图中获取默认值涉及从中提取文本一个长期的领域,可能会证明比它的价值更痛苦。 easy 方法是向过程添加一些代码:

CREATE OR REPLACE PROCEDURE TEST(X IN VARCHAR2 DEFAULT 'P',
                                 Y IN NUMBER DEFAULT 1)
AS
  varX VARCHAR2(32767) := NVL(X, 'P');
  varY NUMBER          := NVL(Y, 1);
BEGIN
  DBMS_OUTPUT.PUT_LINE('X=' || varX || ' -- ' || 'Y=' || varY);
END TEST;

答案 1 :(得分:0)

仅对未赋予该功能的参数考虑默认值。

给定一个功能

procedure foo( bar1 IN number DEFAULT 3,
     bar2 IN number DEFAULT 5,
     bar3 IN number DEFAULT 8 );

如果不带任何参数调用此过程,则其行为将与使用

foo( bar1 => 3,
     bar2 => 5,
     bar3 => 8 );

但是'NULL'仍然是参数。

foo( 4,
     bar3 => NULL );

这将像

foo( bar1 => 4,
     bar2 => 5,
     bar3 => Null );

(oracle允许您按照在过程中指定的顺序给出参数,按名称指定,或者先按顺序输入,然后按名称输入)

将NULL与默认值相同的一种方法是将值默认为NULL

procedure foo( bar1 IN number DEFAULT NULL,
     bar2 IN number DEFAULT NULL,
     bar3 IN number DEFAULT NULL );

然后使用具有所需值的变量

procedure foo( bar1 IN number DEFAULT NULL,
     bar2 IN number DEFAULT NULL,
     bar3 IN number DEFAULT NULL )
AS
     v_bar1    number := NVL( bar1, 3);
     v_bar2    number := NVL( bar2, 5);
     v_bar3    number := NVL( bar3, 8);