2016年2月23日火曜日

JavaからAS/400 ~ メンバー編

こんにちは、寺田です。



前回の私からの投稿『JavaからAS/400のコマンドを発行するには』の続きです。

以前、IBM Toolbox for Javaに含まれているJDBCドライバーであるJT400を使って、AS/400上の物理ファイルのダウンロード/アップロードを行うJavaプログラムを作ったことがあります。その中で、AS/400特有の仕様からいろいろと問題に遭遇し、調査に時間を要しました。今回は、そのいくつかを紹介したいと思います。

まずは、「メンバー」についてです。

前回、「AS/400の物理ファイルとは、その実体はDB2のテーブルです。」と言いました。なので、JDBCで以下のようにSQLを発行することで、物理ファイルの中身を取得することができます。
SELECT * FROM ライブラリ名.ファイル名

物理ファイルは、実際に(物理的に)はデータ・レコードを収容しているデータベース・ファイルです。データ・レコードは物理ファイル・メンバーにまとめられ、各メンバーにはそのデータに対する独自のアクセス・パスがあります。通常、物理ファイルは1つのメンバーからなるので、上記SQLのように「ライブラリ名.ファイル名」で指定ができます。

しかし、物理ファイル内に複数のメンバーを持たせることもできるので、そのとき、SQLでどうやってメンバーを指定すればいいのか?例えば、
SELECT * FROM ライブラリ名.ファイル名(メンバー名)
とすると、当然ながら構文エラーとなります。

いろいろ調べてみた結果、別名(ALIAS)を作成すれば良いということが分かりました。
事前に以下のような「CREATE ALIAS」ステートメントでALIASを作成しておきます。
CREATE ALIAS MYLIB.MYALIAS FOR MYLIB.MYFILE (MBR)

そうすることで、SQLでの検索が可能になります。
SELECT * FROM MYLIB.MYALIAS

終わったら、「DROP ALIAS」で削除しておきます。
DROP ALIAS MYLIB.MYALIAS


もうひとつ、メンバーの話のついでに、「メンバーの一覧を取得」する方法を紹介します。

物理ファイル(テーブル)の一覧の取得はJDBCで可能なのですが、JDBCに「メンバー」という概念はないので一覧を取得することはできません。

そこで、JT400(JTOpen)のユーティリティクラスの登場です。前回も言いましたが、JT400(JTOpen)にはJDBCの実装だけではなく、JavaからAS/400のさまざまなリソースにアクセスするためのユーティリティクラスが含まれています。そのユーティリティクラスを使ってメンバー一覧を取得するサンプルが、以下になります。

AS400 as400 = new AS400("172.22.1.10", "USERID", "PASSWD");
as400.setGuiAvailable(false);
as400.connectService(AS400.SIGNON);

MemberList members = new MemberList(as400, "MYLIB", "MYFILE");
members.load();
MemberDescription[] descs = members.getMemberDescriptions();
for (int i = 0; i < descs.length; i++) {
    String val = (String)descs[i].getValue(MemberDescription.MEMBER_NAME);
    System.out.println("member name=" + val);
}

まさにMemberListというクラスがあり、MemberDescriptionの配列が取得できます。MemberDescriptionには、メンバー名や属性などの情報が含まれています。

このように、メンバーに限らず、物理ファイルやライブラリの一覧や情報を取得することができるので、JT400、なかなか便利です。

次回もJT400を使ったお話をしようと思います。


0 件のコメント:

コメントを投稿