Db2 for i 既存のPF(テーブル)からSQL DDLを生成する手順

主題の手順です。

## SQL DDLの生成手順
### ① ACSで該当のテーブルを表示し、右クリックからSQLの生成をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/896d6325-b8d2-cf6e-de90-ed6c0a11e410.png)

※例では、ライブラリー：WESBDEMO、テーブル（PF）：TOKMSP を選択し、右クリックし ***SQLの生成***を選択しています。

### ②DDLの生成先を指定
下記のようなパネルが出るので、SQLスクリプト実行画面に貼り付けるか、PCテキストファイルに落とすかを指定します。ここでは、***C:\TEMP\TOKMSP.sql*** というテキストファイルに出力してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/92b1d693-baa9-b31c-c75b-5be36b2322af.png)

※画像が切れてしまいましたが、上記画面の右下にある、 ***生成ボタン*** を押すとDDLを生成してくれます。

下記のように無事生成されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/101c1209-be44-d220-e000-ef34a66c83c8.png)

このDDLを開いてみますと、下記のDDLが生成されています。
```
--  SQLの生成 
--  バージョン:                   	V7R5M0 220415 
--  生成:              	24/05/17 16:34:44 
--  リレーショナル・データベース:       	IBMI75 
--  規格オプション:          	Db2 for i 
CREATE TABLE WESBDEMO.TOKMSP ( 
--  SQL150B   10   WESBDEMOのテーブルTOKMSP中のREUSEDLT(*NO)は無視されます。 
	TKBANG CHAR(5) CCSID 1027 NOT NULL DEFAULT '' , 
	TKNAKN CHAR(20) CCSID 1027 NOT NULL DEFAULT '' , 
	TKNAKJ CHAR(20) CCSID 5035 NOT NULL DEFAULT '' , 
	TKADR1 CHAR(20) CCSID 5035 NOT NULL DEFAULT '' , 
	TKADR2 CHAR(20) CCSID 5035 NOT NULL DEFAULT '' , 
	TKTIKU CHAR(2) CCSID 1027 NOT NULL DEFAULT '' , 
	TKPOST CHAR(6) CCSID 1027 NOT NULL DEFAULT '' , 
	TKTELE CHAR(13) CCSID 1027 NOT NULL DEFAULT '' , 
	TKGURI DECIMAL(9, 0) NOT NULL DEFAULT 0 , 
	TKNURI DECIMAL(9, 0) NOT NULL DEFAULT 0 , 
	TKZURI DECIMAL(9, 0) NOT NULL DEFAULT 0 , 
	TKUZAN DECIMAL(9, 0) NOT NULL DEFAULT 0 , 
	TKGEND DECIMAL(9, 0) NOT NULL DEFAULT 0 , 
	TKNYUK DECIMAL(6, 0) NOT NULL DEFAULT 0 , 
	TKSIME CHAR(1) CCSID 1027 NOT NULL DEFAULT '' , 
	PRIMARY KEY( TKBANG ) )   
	  
	RCDFMT TOKMSR     ; 
  
LABEL ON TABLE WESBDEMO.TOKMSP 
	IS 'EOL/400得意先マスター物理ファイル' ; 
  
LABEL ON COLUMN WESBDEMO.TOKMSP 
( TKBANG IS '得意先            番号' , 
	TKNAKN IS '得意先            仮名' , 
	TKNAKJ IS '得意先            漢字' , 
	TKADR1 IS '住所１' , 
	TKADR2 IS '住所２' , 
	TKTIKU IS '地区              コード' , 
	TKPOST IS '郵便番号' , 
	TKTELE IS '電話番号' , 
	TKGURI IS '当月              売上高' , 
	TKNURI IS '当年              売上高' , 
	TKZURI IS '前年              売上高' , 
	TKUZAN IS '売掛金            残高' , 
	TKGEND IS '信用              限度額' , 
	TKNYUK IS '最終              入金日' , 
	TKSIME IS '締め日            コード' ) ; 
  
LABEL ON COLUMN WESBDEMO.TOKMSP 
( TKBANG TEXT IS '得意先 番号' , 
	TKNAKN TEXT IS '得意先 仮名' , 
	TKNAKJ TEXT IS '得意先 漢字' , 
	TKADR1 TEXT IS '住所１' , 
	TKADR2 TEXT IS '住所２' , 
	TKTIKU TEXT IS '地区 コード' , 
	TKPOST TEXT IS '郵便番号' , 
	TKTELE TEXT IS '電話番号' , 
	TKGURI TEXT IS '当月 売上高' , 
	TKNURI TEXT IS '当年 売上高' , 
	TKZURI TEXT IS '前年 売上高' , 
	TKUZAN TEXT IS '売掛金 残高' , 
	TKGEND TEXT IS '信用 限度額' , 
	TKNYUK TEXT IS '最終 入金日' , 
	TKSIME TEXT IS '締め日 コード' ) ; 
  
GRANT ALTER , DELETE , INDEX , INSERT , REFERENCES , SELECT , UPDATE   
ON WESBDEMO.TOKMSP TO GOMA WITH GRANT OPTION ; 
  
GRANT ALTER , DELETE , INDEX , INSERT , REFERENCES , SELECT , UPDATE   
ON WESBDEMO.TOKMSP TO PUBLIC WITH GRANT OPTION ; 
```
上記のDDLのテキストをACSのSQLスクリプト実行画面ほか任意のSQL実行画面にコピペ＆実行するとTOKMSPが生成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/2b7949b4-86db-36ab-8103-48f5376c0646.png)

この例ではテーブル名をTOKMSP99と変えて作成してみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/637df4e8-a144-0823-2cf9-c3ad4057ce7d.png)

## SQL実行時の警告メッセージSQL1508について
guriguriさんコメントご回答の通りなので、転載させていただきます。

Redbooks [Modernizing IBM Eserver iSeries Application Data Access](https://www.redbooks.ibm.com/redbooks/pdfs/sg246393.pdf) の 4.1.5 Reviewing the generated SQL DDL にSQL1508の説明があります。

sQL1508 REUSEDLT(*NO) in table ORDHDR in ITSO4710 ignored.
While creating a physical file with CRTPF you can specify the Reuse
deleted record option (REUSEDLT). The default value is *NO. That
means that when a record is deleted only the first bit will be changed.
To delete the record physically you have to execute the CL command
RGZPFM (Reorganize Physical File Member).
For SQL tables you do not have this option. When a record is deleted
in a SQL table, the allocated storage will be reused when a new row is
written. It is not possible to reactivate deleted records