首页 文章

在Oracle Object Type Constructor Function中设置默认值

提问于
浏览
0

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

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

请参阅以下详细信息

SQL> CREATE TYPE TYPE_SUB AS OBJECT(
      2  COL1 NUMBER,
      3  COL2 VARCHAR2(100)
      4  )
      5  NOT FINAL
      6  /

    Type created.

    SQL> CREATE OR REPLACE TYPE TYPE_MAIN
      2  UNDER TYPE_SUB
      3  (
      4  COL3 varchar2(10),
      5  COL4 VARCHAR2(10),
      6  CONSTRUCTOR FUNCTION TYPE_MAIN(COL1 NUMBER, COL2 VARCHAR2, COL3 varchar2, COL4 VARCHAR2) RETURN SELF AS RESULT)
      7  NOT FINAL
      8  /

    Type created.

    SQL> CREATE OR REPLACE TYPE BODY TYPE_MAIN  IS
      2  CONSTRUCTOR FUNCTION TYPE_MAIN (COL1 NUMBER, COL2 VARCHAR2, COL3 varchar2, COL4 VARCHAR2) RETURN SELF AS RESULT IS
      3  BEGIN
      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   RETURN;
      9  end;
     10  END;
     11  /

    Type body created.

    SQL> CREATE TABLE TAB_MAIN  (
      2  PKEY NUMBER,
      3  COLTEST VARCHAR2(100),
      4  COLNEW TYPE_MAIN)
      5  /

    Table created.

    SQL> INSERT INTO TAB_MAIN(PKEY) VALUES(1)
      2  /

    1 row created.

    SQL> INSERT INTO TAB_MAIN(PKEY,COLTEST,COLNEW) VALUES(1,'TESTCOL',TYPE_MAIN('1','2',NULL,NULL))
      2  /

    1 row created.

    SQL> INSERT INTO TAB_MAIN(PKEY,COLTEST,COLNEW) VALUES(1,'TESTCOL2',TYPE_MAIN('1',NULL,NULL,NULL))
      2  /

    1 row created.

    SQL> SELECT * FROM TAB_MAIN
      2  /

          PKEY COLTEST    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> CREATE TYPE TYPE_SUB AS OBJECT(
      2  COL1 NUMBER,
      3  COL2 VARCHAR2(100)
      4  )
      5  NOT FINAL
      6  /

    Type created.

    SQL> CREATE OR REPLACE TYPE TYPE_MAIN
      2  UNDER TYPE_SUB
      3  (
      4  COL3 varchar2(10),
      5  COL4 VARCHAR2(10),
      6  CONSTRUCTOR FUNCTION TYPE_MAIN(COL3 varchar2, COL4 VARCHAR2) RETURN SELF AS RESULT)
      7  NOT FINAL
      8  /

    Type created.

    SQL> CREATE OR REPLACE TYPE BODY TYPE_MAIN  IS
      2  CONSTRUCTOR FUNCTION TYPE_MAIN (COL3 varchar2, COL4 VARCHAR2) RETURN SELF AS RESULT IS
      3  BEGIN
      4   SELF.COL3 := nvl(COL3,'NA');
      5   SELF.COL4 := nvl(COL4,NULL);
      6   RETURN;
      7  end;
      8  END;
      9  /

    Type body created.

    SQL> CREATE TABLE TAB_MAIN  (
      2  PKEY NUMBER,
      3  COLTEST VARCHAR2(100),
      4  COLNEW TYPE_MAIN)
      5  /

    Table created.

    SQL> INSERT INTO TAB_MAIN(PKEY) VALUES(1)
      2  /

    1 row created.

    SQL> INSERT INTO TAB_MAIN(PKEY,COLTEST,COLNEW) VALUES(1,'TESTCOL',TYPE_MAIN('1','2',NULL,NULL))
      2  /

    1 row created.

    SQL> INSERT INTO TAB_MAIN(PKEY,COLTEST,COLNEW) VALUES(1,'TESTCOL2',TYPE_MAIN('1',NULL,NULL,NULL))
      2  /

    1 row created.

    SQL> SELECT * FROM TAB_MAIN
      2  /

          PKEY COLTEST    COLNEW(COL1, COL2, COL3, COL4)
    ---------- ---------- ----------------------------------------
             1
             1 TESTCOL    TYPE_MAIN(1, '2', NULL, NULL)
             1 TESTCOL2   TYPE_MAIN(1, NULL, NULL, NULL)

1 回答

  • 3

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

    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 开始按顺序覆盖的前几个),你需要命名它,而不是将 null 传递给其他参数,如这只会覆盖默认值 .

    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 ,你'll still need to name the arguments, otherwise it will assume you'从 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')
    

相关问题