Oracle中存储过程的缺省值

use*_*468 26 parameters plsql stored-procedures default oracle11g

我有一个存储过程如下.

 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;
Run Code Online (Sandbox Code Playgroud)

当我执行上述程序时

 EXEC TEST(NULL,NULL);
Run Code Online (Sandbox Code Playgroud)

它将打印X - Y. 当输入参数为null时,输入参数不会默认为过程签名中的指定值

.那么默认值有什么用?如果我们将null值作为输入传递并且我们想要将null值替换为默认值,该怎么办?

Bob*_*ica 52

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

EXEC TEST()
Run Code Online (Sandbox Code Playgroud)

分享和享受.

附录:过程参数的默认值肯定隐藏在某个系统表中(参见SYS.ALL_ARGUMENTS视图),但是从视图中获取默认值涉及从LONG字段中提取文本,并且可能会比这是值得的.在简单的方法是添加一些代码的程序:

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;
Run Code Online (Sandbox Code Playgroud)

  • 请参阅我的答案附录。 (3认同)

ABa*_*mpf 7

Default-Values are only considered for parameters NOT given to the function.

So given a function

procedure foo( bar1 IN number DEFAULT 3,
     bar2 IN number DEFAULT 5,
     bar3 IN number DEFAULT 8 );
Run Code Online (Sandbox Code Playgroud)

if you call this procedure with no arguments then it will behave as if called with

foo( bar1 => 3,
     bar2 => 5,
     bar3 => 8 );
Run Code Online (Sandbox Code Playgroud)

but 'NULL' is still a parameter.

foo( 4,
     bar3 => NULL );
Run Code Online (Sandbox Code Playgroud)

This will then act like

foo( bar1 => 4,
     bar2 => 5,
     bar3 => Null );
Run Code Online (Sandbox Code Playgroud)

( oracle allows you to either give the parameter in order they are specified in the procedure, specified by name, or first in order and then by name )

one way to treat NULL the same as a default value would be to default the value to NULL

procedure foo( bar1 IN number DEFAULT NULL,
     bar2 IN number DEFAULT NULL,
     bar3 IN number DEFAULT NULL );
Run Code Online (Sandbox Code Playgroud)

and using a variable with the desired value then

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);
Run Code Online (Sandbox Code Playgroud)