Oracleで英数字シーケンスを作成したい。テーブル名はrel_details
4 つの列で構成されています。
rel_id
rel_name
rel_modified_date
rel_desc
のようなIDrel_id
を生成したいREL230420151001
REL
は文字列、
23042015
は今日の日付、
1001
は開始番号です。
このタイプ シーケンスの作成方法。
Oracleで英数字シーケンスを作成したい。テーブル名はrel_details
4 つの列で構成されています。
rel_id
rel_name
rel_modified_date
rel_desc
のようなIDrel_id
を生成したいREL230420151001
REL
は文字列、
23042015
は今日の日付、
1001
は開始番号です。
このタイプ シーケンスの作成方法。
12cを使用している場合は、 IDENTITY 列とVIRTUAL 列を使用する 1 つの方法を次に示します。
ID 列はバージョン 12c で導入され、仮想列はバージョン 11g で導入されました。
SQL> CREATE TABLE t
2 (
3 ID NUMBER GENERATED ALWAYS AS IDENTITY
4 START WITH 1000 INCREMENT BY 1,
5 text VARCHAR2(50),
6 dt DATE DEFAULT SYSDATE,
7 my_text varchar2(1000) GENERATED ALWAYS AS (text||to_char(dt, 'DDMMYYYY')||ID) VIRTUAL
8 );
Table created.
SQL>
SQL> INSERT INTO t(text) VALUES ('REL');
1 row created.
SQL>
SQL> SELECT text, my_text FROM t;
TEXT MY_TEXT
----- ------------------------------
REL REL230420151000
SQL>
1000 から始まる ID 列を作成しました。必要に応じてカスタマイズできます。
VIRTUAL 列には小さなトリックが 1 つあります。固定サイズのvarchar2 として明示的にキャストする必要があります。そうしないと、暗黙的な変換によって最大サイズになります。詳細については、これを参照してください仮想列式で数値を連結すると、ORA-12899 がスローされます: 値が列に対して大きすぎます
これをチェックすると、 seq を作成できない場合がありますが、以下のように select を使用できます。
シーケンス mysec minvalue 0 を作成 10001 で開始 nocache を 1 ずつ増やします。
デュアルから 'REL'||to_char(sysdate,'DDMMYYYY')||mysec.nextval を選択します。