【问题标题】:Default Values to Stored Procedure in OracleOracle 中存储过程的默认值
【发布时间】:2014-04-27 23:19:21
【问题描述】:

我有一个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 值作为输入传递,并且我们想用default 值替换null 值怎么办?

【问题讨论】:

    标签: stored-procedures parameters plsql oracle11g default


    【解决方案1】:

    默认值仅用于未提供给函数的参数。

    所以给定一个函数

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

    【讨论】:

      【解决方案2】:

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

      EXEC TEST()
      

      分享和享受。

      附录:过程参数的默认值肯定隐藏在某个系统表中(参见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;
      

      【讨论】:

      • 有没有办法检查输入值是否为空并替换为默认值?
      • 查看我的答案的附录。
      猜你喜欢
      • 1970-01-01
      • 2010-09-14
      • 2015-11-12
      • 2012-08-06
      • 1970-01-01
      • 1970-01-01
      • 2018-05-09
      • 1970-01-01
      • 2011-11-02
      相关资源
      最近更新 更多