我有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
值,该怎么办?
答案 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);