最近質問頂いた件で、元々業務で使ってるテーブルがあるのですが、外部からアクセスさせたい要件でカラムのタイプを変更して見せたい、ということでした。比較的小規模なテーブルでリアルタイムデータである必要はないとのことで単純にファイルコピーで解決する案をご紹介しました。
カラムタイプが異なるテーブル間でのデータコピーのキモは、カラム名(フィールド名)を同一にしてCPYFコマンドで *MAP *DROPを指定指定コピーする、となります。(当然ですがFrom/Toのカラム内のデータが変換可能であることが条件です)
■大まかな環境
テーブルのFrom/Toの概要は以下の通りで、数値フィールドの値をINTEGER型で外部で使用したい、とのことでした。
■手順
今回は外部に見せたいテーブルも新たに作るということでその手順もガイドしました。
1)ACSのスキーマ表などから対象のテーブルを表示します。対象のテーブル(例ではZAIKOM)を右クリックして SQLの生成 をクリック。
2)FromテーブルのDDLが生成されます。いくつかのカラムがDECIMALで定義されています。(最初の表とカラム名などがあってませんがご了承ください)。ここからカラムのデータ型を変更して外部に見せたいテーブル名に修正してこのDDLを実行して外部に見せるテーブルを作成します。
*下図の2つ目以降のDDLは元テーブルのラベル等の設定ですので不要な場合もあると思います。
3)数値のデータ型をすべてINTEGERに変更します。テーブル名も任意に変更しておきます。
4)一番左端の砂時計アイコンか、実行->すべて を選択しDDLを流します。メッセージ欄に成功、と表示されるのを確認します。これでToテーブルが生成されました。
5)Fromテーブルのレコードをコピーします。Db2 for i(IBM i OS)のCPYFコマンドでデータをコピーします。この際、パラメーターで *MAP *DROPを指定するのがポイントです。GUIやブラウザーからコマンド導入もできますがここではレガシーな5250で(操作が早いのでw)
TOファイル : 作成するテーブル名
レコードの置き換えまたは追加 : *ADD or *REPLACEを指定(今回の場合どちらでも同じ結果)
ファイル作成 : *NO
PF9キーを押して追加パラメーターを表示して、次ページを複数回押します、
下記画面は文字化け(あえて)してますが、FMTOPTパラメーターに *MAP と *DROPの2つを指定します。
エンターキーを押すとレコードがコピーされます。
6)レコードがコピーされたか確認します。ほぼ100%のシステムにQUERY/400が導入されていると思うのでこれを使って RUNQRY *N DEMOLIB/ZAIKOM5 (ZAIKOM5は作成したテーブル名)のように実行します。下記のようにコピーされたテーブルが表示されます。