【问题标题】:Setting default value in Oracle Object Type Constructor Function在 Oracle 对象类型构造函数中设置默认值
【发布时间】:2013-07-30 04:16:46
【问题描述】:

我想在 Oracle 对象类型中设置默认值,但它要求所有属性都需要在构造函数中传递。

无论如何,我只能在构造函数中传递需要默认值的必需属性。

请看以下详情

SQL> 创建类型 TYPE_SUB 作为对象( 2 列 1 号, 3 COL2 VARCHAR2(100) 4) 5 不是最终的 6 / 创建的类型。 SQL> 创建或替换类型 TYPE_MAIN 2 在 TYPE_SUB 下 3 ( 4 COL3 varchar2(10), 5 COL4 VARCHAR2(10), 6 CONSTRUCTOR FUNCTION TYPE_MAIN(COL1 NUMBER,COL2 VARCHAR2,COL3 varchar2,COL4 VARCHAR2)返回自我作为结果) 7 不是最终的 8 / 创建的类型。 SQL> CREATE OR REPLACE TYPE BODY TYPE_MAIN IS 2 CONSTRUCTOR FUNCTION TYPE_MAIN (COL1 NUMBER, COL2 VARCHAR2, COL3 varchar2, COL4 VARCHAR2) 按结果返回自我 3 开始 4 SELF.COL1 := nvl(COL1,123); 5 SELF.COL2 := nvl(COL2,'NA'); 6 SELF.COL3 := nvl(COL3,'NA'); 7 SELF.COL4 := nvl(COL4,NULL); 8 返回; 9 结束; 10 结束; 11 / 创建的类型主体。 SQL> 创建表 TAB_MAIN ( 2 个密钥号码, 3 COLTEST VARCHAR2(100), 4 COLNEW TYPE_MAIN) 5 / 表已创建。 SQL> 插入 TAB_MAIN(PKEY) 值(1) 2 / 创建了 1 行。 SQL> INSERT INTO TAB_MAIN(PKEY,COLTEST,COLNEW) 值(1,'TESTCOL',TYPE_MAIN('1','2',NULL,NULL)) 2 / 创建了 1 行。 SQL> INSERT INTO TAB_MAIN(PKEY,COLTEST,COLNEW) 值(1,'TESTCOL2',TYPE_MAIN('1',NULL,NULL,NULL)) 2 / 创建了 1 行。 SQL> SELECT * FROM TAB_MAIN 2 / PKEY COLEST COLNEW(COL1、COL2、COL3、COL4) ---------- ---------- ------------------ ---------- 1 1 TESTCOL TYPE_MAIN(1, '2', 'NA', NULL) 1 TESTCOL2 TYPE_MAIN(1, 'NA', 'NA', NULL)

现在,在上面的例子中,如果我只在构造函数中传递 Col3 和 Col4 属性作为默认值,那么它就不起作用了。请看下面的例子。

SQL> 创建类型 TYPE_SUB 作为对象( 2 列 1 号, 3 COL2 VARCHAR2(100) 4) 5 不是最终的 6 / 创建的类型。 SQL> 创建或替换类型 TYPE_MAIN 2 在 TYPE_SUB 下 3 ( 4 COL3 varchar2(10), 5 COL4 VARCHAR2(10), 6 CONSTRUCTOR FUNCTION TYPE_MAIN(COL3 varchar2, COL4 VARCHAR2) 作为结果返回自身) 7 不是最终的 8 / 创建的类型。 SQL> CREATE OR REPLACE TYPE BODY TYPE_MAIN IS 2 CONSTRUCTOR FUNCTION TYPE_MAIN (COL3 varchar2, COL4 VARCHAR2) 按结果返回自我 3 开始 4 SELF.COL3 := nvl(COL3,'NA'); 5 SELF.COL4 := nvl(COL4,NULL); 6 返回; 7 结束; 8 结束; 9 / 创建的类型主体。 SQL> 创建表 TAB_MAIN ( 2 个密钥号码, 3 COLTEST VARCHAR2(100), 4 COLNEW TYPE_MAIN) 5 / 表已创建。 SQL> 插入 TAB_MAIN(PKEY) 值(1) 2 / 创建了 1 行。 SQL> INSERT INTO TAB_MAIN(PKEY,COLTEST,COLNEW) 值(1,'TESTCOL',TYPE_MAIN('1','2',NULL,NULL)) 2 / 创建了 1 行。 SQL> INSERT INTO TAB_MAIN(PKEY,COLTEST,COLNEW) 值(1,'TESTCOL2',TYPE_MAIN('1',NULL,NULL,NULL)) 2 / 创建了 1 行。 SQL> SELECT * FROM TAB_MAIN 2 / PKEY COLEST COLNEW(COL1、COL2、COL3、COL4) ---------- ---------- ------------------ ---------- 1 1 TESTCOL TYPE_MAIN(1, '2', NULL, NULL) 1 TESTCOL2 TYPE_MAIN(1,空,空,空)

【问题讨论】:

    标签: oracle function types plsql object-type


    【解决方案1】:

    在您的第二个代码块中,您没有调用只有两个参数的构造函数。传递一个空参数并不意味着您使用另一个构造函数,您正在使用四个参数调用(默认)构造函数,其中两个恰好是故意为空的。你正在有效地做:

    TYPE_MAIN(col1 => '1', col2 => NULL, col3 => NULL, col4 => NULL)
    

    不是

    TYPE_MAIN(col3 => '1', col4 => NULL)
    

    所以这行得通:

    INSERT INTO TAB_MAIN(PKEY,COLTEST,COLNEW) VALUES(1,'TESTCOL2',TYPE_MAIN('3','4'))
    /
    
    ...
    
          PKEY COLTEST         COLNEW                                           
    ---------- --------------- --------------------------------------------------
             1                                                                    
             1 TESTCOL         TYPE_MAIN(1,'2',NULL,NULL)           
             1 TESTCOL2        TYPE_MAIN(1,NULL,NULL,NULL)          
             1 TESTCOL2        TYPE_MAIN(NULL,NULL,'3','4')         
    

    要让默认值按照我认为您在第一个代码块中的意图工作,请在构造函数参数中设置它们,而不是在构造函数的主体中:

    CREATE OR REPLACE TYPE TYPE_MAIN
    UNDER TYPE_SUB
    (
    COL3 varchar2(10),
    COL4 VARCHAR2(10),
    CONSTRUCTOR FUNCTION TYPE_MAIN(COL1 number default 123,
      COL2 VARCHAR2 default 'NA',
      COL3 varchar2 default 'NA',
      COL4 VARCHAR2 default null) RETURN SELF AS RESULT)
    NOT FINAL
    /
    
    CREATE OR REPLACE TYPE BODY TYPE_MAIN  IS
    CONSTRUCTOR FUNCTION TYPE_MAIN (COL1 number default 123,
      COL2 VARCHAR2 default 'NA',
      COL3 varchar2 default 'NA',
      COL4 VARCHAR2 default null) RETURN SELF AS RESULT IS
    BEGIN
     SELF.COL1 := COL1;
     SELF.COL2 := COL2;
     SELF.COL3 := COL3;
     SELF.COL4 := COL4;
    RETURN;
    end;
    END;
    /
    

    然后当只传递一个参数时(或者任何时候你没有传递它们,或者你想要覆盖的前几个参数从col1开始)你需要命名它,而不是传递@ 987654326@ 对于其他人,因为这只会覆盖默认值。

    INSERT INTO TAB_MAIN(PKEY) VALUES(1)
    /
    
    INSERT INTO TAB_MAIN(PKEY,COLTEST,COLNEW)
    VALUES(1,'TESTCOL',TYPE_MAIN(1,'2'))
    /
    
    INSERT INTO TAB_MAIN(PKEY,COLTEST,COLNEW)
    VALUES(1,'TESTCOL2',TYPE_MAIN(1))
    /
    
    INSERT INTO TAB_MAIN(PKEY,COLTEST,COLNEW)
    VALUES(1,'TESTCOL3',TYPE_MAIN(col3 => '3'))
    /
    
    INSERT INTO TAB_MAIN(PKEY,COLTEST,COLNEW)
    VALUES(1,'TESTCOL4',TYPE_MAIN(col4 => '4'))
    /
    
          PKEY COLTEST         COLNEW                                           
    ---------- --------------- --------------------------------------------------
             1                                                                    
             1 TESTCOL         TYPE_MAIN(1,'2','NA',NULL)           
             1 TESTCOL2        TYPE_MAIN(1,'NA','NA',NULL)          
             1 TESTCOL3        TYPE_MAIN(123,'NA','3',NULL)         
             1 TESTCOL4        TYPE_MAIN(123,'NA','NA','4')         
    

    要同时传递col3col4,您仍然需要命名参数,否则它会假定您从col1 开始:

    INSERT INTO TAB_MAIN(PKEY,COLTEST,COLNEW)
    VALUES(1,'TESTCOL5',TYPE_MAIN(col3 => '3', col4 => '4'))
    /
    
          PKEY COLTEST         COLNEW                                           
    ---------- --------------- --------------------------------------------------
             1                                                                    
             1 TESTCOL         TYPE_MAIN(1,'2','NA',NULL)           
             1 TESTCOL2        TYPE_MAIN(1,'NA','NA',NULL)          
             1 TESTCOL3        TYPE_MAIN(123,'NA','3',NULL)         
             1 TESTCOL4        TYPE_MAIN(123,'NA','NA','4')         
             1 TESTCOL5        TYPE_MAIN(123,'NA','3','4')          
    

    【讨论】:

      猜你喜欢
      • 2011-07-12
      • 1970-01-01
      • 2011-03-19
      • 1970-01-01
      • 1970-01-01
      • 2017-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多