9.3.6 搬入時に作成される定義系SQLが2,000,000バイトを超えた場合の修正例
pdexpで搬入をする場合,定義系SQLが作成され,その定義系SQLが実行されます。その際,次に示す原因によって,作成されるSQL文が,SQL文の最大長2,000,000バイトを超えることがあります。
-
次に示す構文,及び識別子が省略された表をpdexpで搬入する場合
表9‒1 定義系SQL文に記述される構文及び識別子の,デフォルト値及び引用符 項番
構文及び識別子
デフォルト値及び引用符
1
列制約定義
PARTIAL
2
PCTFREE(未使用領域の比率)
30
3
PCTFREE(セグメント内の空きページ比率)
10
4
削除動作
RESTRICT
5
更新動作
RESTRICT
6
制約名定義
制約定義時のタイムスタンプ
7
識別子
大文字,小文字を区別するため引用符が付与されます
8
バージョン09-50より前のCREATE TABLEでのSEGMENT REUSE
SEGMENT REUSE NO
9
バージョン09-50以降のCREATE TABLEでのSEGMENT REUSE
SEGMENT REUSE
デフォルト値の構文や識別子の引用符が定義系SQL文に記述されるため,2,000,000バイトを超えるおそれがあります。
定義系SQLが2,000,000バイトを超えた場合の修正例を次に示します。ここでは,CREATE TABLEを例に説明します。
- <CREATE TABLEが2,000,000バイトを超えた場合の例>
-
CREATE TABLEが2,000,000バイトを超えた場合,2,000,000バイト以内に収まるように,列IDの大きいものから列定義部分を削除した状態でCREATE TABLEが作成されます。このとき,削除された列定義部分を追加する必要があるため,削除された列定義部分を追加するALTER TABLEが作成されます。例を次に示します。
CREATE TABLE "root"."T1" ("C1" INTEGER NOT NULL, "C2" CHAR(100), : : "C98" VARCHAR(100) ) IN (("RDUSER01") "C100" < 1500 ("RDUSER02")) PCTFREE=(30,10) FOREIGN KEY ("C1","C2") REFERENCES "root"."T2" ON DELETE RESTRICT ON UPDATE RESTRICT CONSTRAINT CNST01 ; ........................................................1 ALTER TABLE "root"."T1" ADD "C99" INTEGER ; ........................................................2 ALTER TABLE "root"."T1" ADD "C100" INTEGER NOT NULL ; ........................................................2
- [説明]
-
-
列C99,及び列C100が除かれた状態のCREATE TABLEが作成されます。
-
CREATE TABLEから削除された列C99,及び列C100を追加するALTER TABLEが作成されます。
-
- [ALTER TABLEの列定義部分に追加されたことによって発生するSQLエラー]
-
2.で追加される列が,次のどれかに該当する場合,SQLエラーとなります。
-
分割キー
-
クラスタキー
-
参照制約で指定した列
-
検査制約の探索条件で指定した列
この例では,分割キーである列C100が追加されているため,作成されるALTER TABLEはSQLエラーとなります。
-
- <SQLエラーを回避する方法>
-
SQLエラーとなる場合,次の手順で回避できます。
-
搬入時に-oオプションを指定し,定義系SQLを生成します(定義系SQLをファイルに出力します)。
-
1.で出力した定義系SQLの,先頭のALTER TABLEから,該当するALTER TABLE(SQLエラーとなる列定義)までを,CREATE TABLEの列定義に移動します。
-
1.で出力した定義系SQLの,CREATE TABLEの省略時仮定値の部分を削除し,2,000,000バイト以内に収まるようにします。
-
編集した定義系SQLを,pddefで実行します。
上記の定義系SQLの編集例を次に示します。
CREATE TABLE "root"."T1" ("C1" INTEGER NOT NULL, "C2" CHAR(100), : : "C98" VARCHAR(100), "C99" INTEGER, ...............上記手順2.で追加 "C100" INTEGER NOT NULL .....上記手順2.で追加 ) IN (("RDUSER01") "C100" < 1500 ("RDUSER02")) PCTFREE=(30,10) FOREIGN KEY ("C1","C2") REFERENCES "root"."T2" CONSTRAINT CNST01 .........上記手順の3.で一部分を削除 ;
-