読者です 読者をやめる 読者になる 読者になる

HHeLiBeXの日記 正道編

日々の記憶の記録とメモ‥

型付表の定義

DB2 で型付表を作ろうとするときに必要な手順を、いつもいつも忘れるのでメモ。
まぁ、DB2のオンラインマニュアルには書いてあるんだけど‥探すといつも見つからない‥(ちなみに、キーワード「CREATE SEQUENCE」で探すと何番目かに出てくる。)

CREATE TYPE "TYPE_HOGE" AS (
    COL_A INTEGER,
    COL_B VARCHAR(8),
    COL_C TIMESTAMP
)
REF USING BIGINT
MODE DB2SQL
!
CREATE TABLE "TABLE_HOGE" OF "TYPE_HOGE"
    (REF IS "COL_REF" USER GENERATED)
!
CREATE SEQUENCE "SEQ_HOGE"
    AS REF("TYPE_HOGE")
    START WITH -9223372036854775808
    INCREMENT BY 1
    NO MAXVALUE
    NO CYCLE
!
CREATE TRIGGER "TRIGGER_HOGE"
    BEFORE INSERT ON "TABLE_HOGE"
    REFERENCING NEW AS nwr
    FOR EACH ROW
    BEGIN
        SET nwr.COL_REF = NEXTVAL FOR "SEQ_HOGE";
    END
!

CREATE TRIGGER 文にセミコロン(';')が入っているので、セパレータ文字をエクスクラメーションマーク('!')にしている。これをファイルに保存して実行する場合は次のようにする。

db2 -td! -vf test.sql

で、生成したテーブルに行を挿入。

INSERT INTO "TABLE_HOGE"(COL_A, COL_B, COL_C)
    VALUES(1, 'hello', CURRENT_TIMESTAMP)
!
INSERT INTO "TABLE_HOGE"(COL_A, COL_B, COL_C)
    VALUES(1, 'hello', CURRENT_TIMESTAMP)
!
INSERT INTO "TABLE_HOGE"(COL_A, COL_B, COL_C)
    VALUES(1, 'hello', CURRENT_TIMESTAMP)
!
INSERT INTO "TABLE_HOGE"(COL_A, COL_B, COL_C)
    VALUES(1, 'hello', CURRENT_TIMESTAMP)
!
SELECT * FROM "TABLE_HOGE"
!

挿入されたデータはこんな感じ。

COL_REF              COL_A       COL_B    COL_C
-------------------- ----------- -------- --------------------------
-9223372036854775808           1 hello    2009-11-24-02.02.49.778000
-9223372036854775807           1 hello    2009-11-24-02.02.49.791000
-9223372036854775806           1 hello    2009-11-24-02.02.49.804000
-9223372036854775805           1 hello    2009-11-24-02.02.49.817000

問題点は、

  • 生成できる ID が 18,446,744,073,709,551,615 個に限られる。
  • もちろん、BIGINT ではなく INT や SMALLINT を使うと、生成できる ID はもっと少なくなってしまう。


ちなみに‥
マニュアル上は、"USER GENERATED" しかサポートされていないと書いてあるが、"SYSTEM GENERATED" と書いても CREATE TABLE 文はエラーなく終了するが、システムは OID を生成してはくれない‥