前回の記事、「お手軽SQLプログラム (VBS編)」ではVBScriptでWindowsからDB2 for i をアクセスしましたが、この記事ではJavaで同じ事をやってみます。Javaなので、プラットフォーム(OS)に依存せず、LinuxやIBM i などの上でも同じプログラムが動くところがミソです。
Javaの標準APIであるJDBCを使用し、DB2 for i のデータを読み込んで表示させます。
.
Java言語について今更説明は不要でしょう。Javaの開発・実行環境はJDKとして多くのプラットフォームに提供されており、同じプログラム(クラスファイル)を異なるプラットフォーム上で実行することができます。実行環境だけ切り出したものがJREとして配布されていますが、コンパイルも可能なJDKが必要であればSunのDownloadサイトから入手できます。IBM製のJDKもあり、「IBM developer kits」から入手できます。細かい部分でSun版との差異があるようです。
IBM i ではJDKはOSに同梱されているので、通常はGO LICPGMからインストールできます。詳細はIBM i Information Centerの「IBM Developer Kit for Java」あたりをご覧ください。この記事ではすでにIBM i にJDKがインストール済みとします。最近ではWindowsで「Rational Developer for i」を使うのが良いのでしょうが、ここではテキストエディター+JDKでIBM i 上でJavaプログラムを作成してみます。
DB2 for i にアクセスするには、前述のJDBCが必要になります。IBM i ではJDBCや他のIBM i の資源を利用したり、開発を容易にしたりするクラス群をまとめて「IBM ToolBox for Java」という名前で提供しています。JTOpenというオープンソース版もあり、基本的に同等の機能を提供します。オープンソースであるJTOpenが新しい機能を積極的に取り込み、その成果がToolBox for Javaにフィードバックされます。
前置きが長くなりました。早速Javaプログラムを作ってみましょう。
下記のソースをIBM i の「/tmp/JDBC」ディレクトリーに「JDBC.java」というファイル名で作成します。PCで作成してIBM i のIFSにFTPやNetServerで送るか、あるいは直接5250画面からEDTFコマンドでコピペします。
1 import java.io.*;
2 import java.sql.*;
3 import com.ibm.as400.access.*;
4
5 public class JDBC {
6
7 public static void main(String[] args) throws Exception{
8
9 Connection conn = null;
10
11 try {
12 Class.forName("com.ibm.as400.access.AS400JDBCDriver");
13 conn = DriverManager.getConnection("jdbc:as400:" + args[0] + ";extended metadata=true;trace=false;",
14 args[1], args[2]);
15 }
16 catch (SQLException se) {
17 System.out.println("! SQLException - " + se.getMessage());
18 se.printStackTrace();
19 }
20 catch (Exception e) {
21 System.out.println("! Exception - " + e.getMessage());
22 e.printStackTrace();
23 }
24
25 try {
26
27 Statement stmt = conn.createStatement();
28 ResultSet rs = stmt.executeQuery("select * from ライブラリー名.TOKMSP where TKBANG between '01080' and '02030'");
29
30 ResultSetMetaData rsmd = rs.getMetaData();
31
32 for (int i = 1 ; i <= rsmd.getColumnCount() ; i++) {
33 System.out.print(rsmd.getColumnLabel(i).trim().replaceAll(" ", ""));
34 if (i < rsmd.getColumnCount()) System.out.print("\t");
35 }
36 System.out.println();
37
38 while (rs.next()) {
39 for (int j = 1 ; j <= rsmd.getColumnCount() ; j++) {
40 System.out.print(rs.getString(j).trim());
41 if (j < rsmd.getColumnCount()) System.out.print("\t");
42 }
43 System.out.println();
44
45 }
46 rs.close();
47 stmt.close();
48
49 } finally {}
50 }
51 }
開発・実行環境に使用したIBM i は前の記事と同じくV5R4です。
プログラムでは、13行目でDB2 for i へのコネクションを張り、28行目でSQLを実行、32行目のfor文はCOLHDGを、38行目のfor文はSQLの結果を標準出力に出力しています。 13行目ではCOLHDGを取得するために、「extended metadata=true」を指定しています。引数のチェックをしていないとか、25行目のtryをcatchしていないとか、手抜きしている部分がありますがあしからず。(^-^;;;
次の手順でIBM i 上でコンパイルします。
> CHGJOB CCSID(5035) > qsh (以下Qshellでの操作) > cd /tmp/JDBC > ls -la total: 12.648 megabytes drwxrwsrwx 2 XXXXXXX 0 8192 Jan 4 14:45 . drwxrwsrwt 14 QSYS 0 36864 Jan 4 13:12 .. -rw-rw-rw- 1 XXXXXXX 0 1219 Jan 4 14:43 JDBC.java -rwxrwxrwx 1 XXXXXXX 0 4318170 Apr 26 2008 jt400.jar > javac -classpath .:jt400.jar JDBC.java
jt400.jarはToolBox for Java、またはJTOpenのクラスです。ここではJTOpenから最新版をダウンロードして使用しています。
コンパイルでエラーが出なければ、実行してみましょう。
> java -version java version "1.4.2" Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2_19-b04) Classic VM (build 1.4, build JDK-1.4, native threads, jitc_de) $ > java -cp .:jt400.jar JDBC IPアドレス ユーザーID パスワード 得意先番号 得意先仮名 得意先漢字 住所1 住所2 地区コード 郵便番号 電話番号 当月売上高 当年売上高 前年売上高 売掛金残高 信用限度額 最終入金日 締め日コー ド 01080 アイカワ コウクウK.K 相川広告K.K 東京都渋谷区 広 尾3?9 02 150 03-368-6366 318000 1461700 2205800 29 0000 2000000 880214 2 01090 アイカワ デンキK.K 相川電機K.K 東京都北区 滝 の川7?17 14 114 03-749-6271 877100 4731400 7135500 94 0000 900000 880519 2 01100 アイカワ ガツキテン 相川楽器店 東京都港区 虎 ノ門3?21 22 105 03-922-1801 501300 2973300 4800100 59 0000 1300000 880615 6 (中略) 02020 アイカワ セイサクシヨ 相川製作所 東京都葛飾区 東 立石2?21 21 124 03-735-9343 761300 4287700 6982800 21 00000 2300000 880508 5 02030 アイカワ ヤクヒンコウギヨウK.K 相川薬品工業K.K 東京都文京区 仙石2?1 13 112 03-342-7188 1035500 6018600 93920 00 1200000 1500000 880105 3 $
SQLの実行結果がCOLHDGとともに画面に表示されます。
.
冒頭にも書きましたが、JavaプログラムはJava実行環境(JDK/JRE)があれば他のプラットフォームでも実行できます。IBM i 上でコンパイルしたJavaプログラム、JDBC.classをWindowsで実行してみましょう。
FTPまたはNetServerでJDBC.classとjt400.jarをWindowsの適当なディレクトリーにコピーします。そこでコマンド・プロンプトを開き、cdで現行ディレクトリーをそのディレクトリーにして実行します。
C:\Documents and Settings\Administrator\デスクトップ\JDBC>java -cp .;jt400.jar J DBC IPアドレス ユーザーID パスワード 得意先番号 得意先仮名 得意先漢字 住所1 住所2 地区コード 郵便番号 電話番号 当月売上高 当年売上高 前年売上高 売掛金残高 信用限度額 最終入金日 締め日コード 01080 アイカワ コウクウK.K 相川広告K.K 東京都渋谷区 広尾3- 9 02 150 03-368-6366 318000 1461700 2205800 290000 2000000 880214 2 01090 アイカワ デンキK.K 相川電機K.K 東京都北区 滝の川7 -17 14 114 03-749-6271 877100 4731400 7135500 940000 900000 880519 2 (中略) 02010 アイカワ センタ- 相川センター 東京都江東区 新木場1 -4 23 136 03-512-9478 705200 4029900 6183600 2000000 2000000 880501 1 02020 アイカワ セイサクシヨ 相川製作所 東京都葛飾区 東立石2 -21 21 124 03-735-9343 761300 4287700 6982800 2100000 2300000 880508 5 02030 アイカワ ヤクヒンコウギヨウK.K 相川薬品工業K.K 東京都文京区 仙石2-1 13 112 03-342-7188 1035500 6018600 9392000 1200000 1500000 880105 3
当然ながら同じ結果になります。なお、IBM i とWindowsではクラスパス(-cp)の区切り文字がそれぞれ「:」と「;」で異なることに注意してください。CScriptコマンド同様、結果を標準出力にリダイレクトすればExcelなどで開くことができます。
IBM i 環境でもQshell環境からリダイレクトすれば同様に結果をファイルにできます。
> touch -C 943 結果 .txt $ > java -cp .:jt400.jar JDBC IPアドレス ユーザーID パスワード > 結果 .txt $
※ 「 結果 .txt」の空白はシフト文字を表しています。
なお、RUNJVAコマンドで標準出力をファイルにリダイレクトするため、パラメーターのPROP((os400.stdout 'file:///tmp/JDBC/SQLresult.txt'))を指定すると、出力先ファイル「SQLresult.txt」にはEBCDICのデータが書 き出されるようです。「CPY OBJ('/tmp/JDBC/SQLresult.txt') TOOBJ('/tmp/JDBC/SQLresultASCII.txt') FROMCCSID(5035) TOCCSID(943) DTAFMT(*TEXT) REPLACE(*YES)」のようにコード変換すればシフトJIS(CCSID 943)に変換できます。
.
さて、JDBC編はいかがだったでしょうか。Javaの実行環境さえあれば、UNIX系やメインフレームなどの他のプラットフォームでも動く可能性は高いです。
ToolBox for JavaはJDBCの他にも有用な機能を数多く提供していますので、JavaからIBM i の資源・情報を活用したい場合は一度ご覧になると良いでしょう。また、Javaプログラムに機能を追加して、POIでExcel形式にしたり、iTextでPDFにしたりするのも面白いかもしれません。
ではまた(^-^)/
ここに書かれている内容は私の所属する会社、組織とは関係ありません。 内容を誰かが保証する物ではありません。