2

Oracle オブジェクト型にデフォルト値を設定したいのですが、そのためにはすべての属性をコンストラクタ関数で渡す必要があります。

とにかく、デフォルト値が必要なコンストラクター関数で必要な属性のみを渡すことができるようにします。

以下の詳細をご覧ください

    SQL> CREATE TYPE_SUB AS OBJECT(
      2 COL1 番号、
      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) RETURN SELF AS RESULT)
      7 最終ではない
      8 /

    タイプが作成されました。

    SQL> CREATE OR REPLACE TYPE BODY TYPE_MAIN IS
      2 コンストラクター関数 TYPE_MAIN (COL1 NUMBER、COL2 VARCHAR2、COL3 varchar2、COL4 VARCHAR2) RETURN SELF AS RESULT IS
      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> CREATE TABLE TAB_MAIN (
      2 PKEY番号、
      3 コルテスト VARCHAR2(100)、
      4 コルニュー TYPE_MAIN)
      5 /

    テーブルが作成されました。

    SQL> TAB_MAIN(PKEY) 値に挿入(1)
      2 /

    1 行が作成されました。

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

    1 行が作成されました。

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

    1 行が作成されました。

    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_SUB AS OBJECT(
      2 COL1 番号、
      3 COL2 VARCHAR2(100)
      4 )
      5 未確定
      6 /

    タイプが作成されました。

    SQL> TYPE_MAIN の作成または置換タイプ
      2 TYPE_SUB の下
      3 (
      4 COL3 varchar2(10),
      5 COL4 VARCHAR2(10)、
      6 コンストラクター関数 TYPE_MAIN(COL3 varchar2, COL4 VARCHAR2) RETURN SELF AS RESULT)
      7 最終ではない
      8 /

    タイプが作成されました。

    SQL> CREATE OR REPLACE TYPE BODY TYPE_MAIN IS
      2 CONSTRUCTOR FUNCTION TYPE_MAIN (COL3 varchar2, COL4 VARCHAR2) RETURN SELF AS RESULT IS
      3 はじめる
      4 SELF.COL3 := nvl(COL3,'NA');
      5 SELF.COL4 := nvl(COL4,NULL);
      6 リターン;
      7終了;
      8 エンド;
      9 /

    型本体が作成されました。

    SQL> CREATE TABLE TAB_MAIN (
      2 PKEY番号、
      3 コルテスト VARCHAR2(100)、
      4 コルニュー TYPE_MAIN)
      5 /

    テーブルが作成されました。

    SQL> TAB_MAIN(PKEY) 値に挿入(1)
      2 /

    1 行が作成されました。

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

    1 行が作成されました。

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

    1 行が作成されました。

    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)

4

1 に答える 1

5

2 番目のコード ブロックでは、引数が 2 つしかないコンストラクターを呼び出していません。null 引数を渡すことは、他のコンストラクターを使用することを意味するわけではありません。4 つの引数を使用して (既定の) コンストラクターを呼び出しており、そのうちの 2 つがたまたま意図的に 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;
/

次に、引数の 1 つだけを渡す場合 (または、すべてを渡さない場合、または から順にオーバーライドする最初のいくつかを渡す場合)、他の引数を渡すのでは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')         

両方を渡すには、引数に名前を付ける必要がcol3ありcol4ます。そうしないと、から開始していると見なされます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')          
于 2013-07-30T07:46:22.223 に答える