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)
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)