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)