単純なデフォルト値を割り当てたい場合、最も簡単な方法は、DEFAULT句を使用してテーブル上でそれを宣言することです。
SQL> create table t42
2 ( col1 number default 1 not null
3 , col2 date)
4 /
Table created.
SQL> insert into t42 (col2) values (sysdate)
2 /
1 row created.
SQL> select * from t42
2 /
COL1 COL2
---------- ---------
1 03-AUG-11
SQL>
これは、SYSDATEやUSERなどのリテラルまたは疑似列で機能します。ユーザー定義の関数またはシーケンスを使用してより複雑な値を導出する場合は、トリガーを使用する必要があります。
これがテーブルの新しいバージョンです...
SQL> create table t42
2 ( col1 number default 1 not null
3 , col2 date default sysdate
4 , col3 varchar2(30) default user
5 , col4 number )
6 /
Table created.
SQL>
...トリガー付き:
SQL> create or replace trigger t42_trg
2 before insert or update
3 on t42
4 for each row
5 begin
6 if :new.col4 is null
7 then
8 :new.col4 := my_seq.nextval;
9 end if;
10 end;
11 /
Trigger created.
SQL> insert into t42 (col1, col2, col3)
2 values (99, sysdate, 'MR KNOX')
3 /
1 row created.
SQL> select * from t42
2 /
COL1 COL2 COL3 COL4
---------- --------- ------------------------------ ----------
99 03-AUG-11 MR KNOX 161
SQL>
テーブルのすべての列はデフォルト設定可能ですが、SQLを有効にするには、少なくとも1つの列にデータを入力する必要があることに注意してください。
SQL> insert into t42 values ()
2 /
insert into t42 values ()
*
ERROR at line 1:
ORA-00936: missing expression
SQL>
しかし、NULLをCOL4に渡して、完全にデフォルトのレコードを取得することはできます:
SQL> insert into t42 (col4) values (null)
2 /
1 row created.
SQL> select * from t42
2 /
COL1 COL2 COL3 COL4
---------- --------- ------------------------------ ----------
99 03-AUG-11 MR KNOX 161
1 03-AUG-11 APC 162
SQL>
警告レクター:私のトリガーは新しい11g構文を使用しています。以前のバージョンでは、SELECTステートメントを使用してシーケンス値を割り当てる必要があります:
select my_seq.nextval
into :new.col4
from dual;