end0tknr's kipple - 新web写経開発

http://d.hatena.ne.jp/end0tknr/ から移転しました

System i Access for linux でas400のdbに連携

いよいよ、System i Access for linux をインストールして、AS400のデータベースに接続してみます。
ibmのサイト以外に参考させていただいたものは次の通り。

rpmパッケージやドキュメントの入手

rpmパッケージは次のURLからdownloadできます。
ただし、ibmアカウント?を登録する必要があります。
http://www-03.ibm.com/systems/i/software/access/index.html

install

http://www-03.ibm.com/systems/i/software/access/linux/guide/index.html#requirements
によれば、

Linux requirements for running iSeries Access for Linux

 * GLibc 2.2
 * RPM 3.0
 * OpenMotif 2.0 or later for the 5250 emulator
 * unixODBC driver manager version 2.0.11 or later must be installed on the client...

らしく、unixODBC以外にも必要なものはありますが、
今回の目的はlinuxからのas400のDB接続にあるので、次のようにrpmをインストールします。

# rpm --nodeps -ihv iSeriesAccess-5.4.0-1.4.i386.rpm

libstdc++.so.5

この後で利用する cwbping には、libstdc++.so.5 が必要らしい。

$ ./cwbping 10.209.XXX.XXX
./cwbping: error while loading shared libraries: libstdc++.so.5: cannot open shared object file: No such file or directory

今さらですが、installします。

# yum install compat-libstdc++-33

接続テスト

pingコマンドでも構いませんが、iSeriesAccess に付属の cwbping コマンドを利用します。

.odbc.ini

今回、テスト用に用意した.odbc.ini は次の通りです。
※unixODBCの設定ファイルには、/usr/local/etc/odbc.ini , /usr/local/etc/odbcinst.ini , ~/.odbc.ini があります

$ vi ~/.odbc.ini 

[ODBC Data Sources]

ASTEST =   ASTEST

[ASTEST]
Description     = iSeries Access ODBC Driver
Driver          = /opt/ibm/iSeriesAccess/lib/libcwbodbc.so
Setup           = /opt/ibm/iSeriesAccess/lib/libcwbodbcs.so
System          = 10.209.XX.XX
UserID          = 
Password        = 
Naming          = 0
DefaultLibraries = 
Database         = 
ConnectionType          = 0
CommitMode              = 2
ExtendedDynamic         = 1
DefaultPkgLibrary       = QGPL
DefaultPackage          = A/DEFAULT(IBM),2,0,1,0,512
AllowDataCompression    = 1
MaxFieldLength          = 32
BlockFetch              = 1
BlockSizeKB             = 128
ExtendedColInfo         = 0
LibraryView             = 0
AllowUnsupportedChar    = 0
ForceTranslation        = 0
Trace           = 0
CCSID = 1208

CCSID

.odbc.ini では文字コードをCCSID項目で指定する必要があります。
ibmから配布されているドキュメントを参照しながら、次のように設定しました。

※ちなみに System i Access では文字コード変換に iconv を使用しているそうです。


現行ロケールの確認

[colinux ~]$ locale
LANG=ja_JP.UTF-8
LC_CTYPE="ja_JP.UTF-8"
LC_NUMERIC="ja_JP.UTF-8"
LC_TIME="ja_JP.UTF-8"
LC_COLLATE="ja_JP.UTF-8"
LC_MONETARY="ja_JP.UTF-8"
LC_MESSAGES="ja_JP.UTF-8"
LC_PAPER="ja_JP.UTF-8"
LC_NAME="ja_JP.UTF-8"
LC_ADDRESS="ja_JP.UTF-8"
LC_TELEPHONE="ja_JP.UTF-8"
LC_MEASUREMENT="ja_JP.UTF-8"
LC_IDENTIFICATION="ja_JP.UTF-8"
LC_ALL=
[colinux ~]$ 

現行ロケールとCCSIDのマッピングを確認し、.odbc.iniに CCSID=1208を指定しました。

[colinux ~]$ /opt/ibm/iSeriesAccess/bin/cwbnltbl 

cwbnltbl - Download conversion table utility
Usage: cwbnltbl source-code-page target-code-page [host] [uid] [pwd]
Linux locale codeset=UTF-8 ccsid=1208
[colinux ~]$ 

sql テスト

$ isql ASTEST $USER  $PASSWD

select する際の対象テーブルにはライブラリを指定する必要があるそうです。
次の例の場合、HOGEがライブラリにあたります。

SQL> [endo@colinux ~]$ isql ASTEST $USER  $PASSWD
                                                                                • +
Connected!
sql-statement
help [tablename]
quit
                                                                                • +
SQL> SELECT TX001 FROM HOGE.TEST WHERE H1031='ANF1810' +---------------------+ | TX001 | +---------------------+ | TOKYO | | TOKYO | | トウキョウ | | トウキョウ | | 東京 | | 東京(株) | | 東京㈱ | +---------------------+

㈱のような機種依存文字も問題なく取得できることまで確認できたので、今回はここまでにしておきます。