Node.jsのアプリケーションを実行にあたって、ODBCパラメータを設定することができます。
ODBCパラメータはdb2dsdriver.cfgファイルに設定します。
db2dsdriver.cfg ファイルの作成
Db2 9.7 FP3 以降、db2dsdriver.cfg 構成ファイルはDb2には同梱されない代わりにサンプルファイルが同梱されるらしいです。(db2dsdriver.cfg.sample ※)
(※)Docker版Db2には、サンプルファイルも入っていないかも?
<configuration>
<dsncollection>
<dsn alias="DB1" name="TESTDB" description="alias_db1_description" host="localhost" port="50000"/>
</dsn>
</dsncollection>
<databases>
<database name="testdb" host="localhost" port="50000">
<parameter name="CurrentSchema" value="db2inst1"/>
<specialregisters>
<parameter name="CURRENT DEGREE" value="'ANY'"/>
</specialregisters>
</database>
</databases>
</configuration>
DB2DSDRIVER_CFG_PATH レジストリー変数に、db2dsdriver.cfg のパス名+ファイル名を指定します。
export DB2DSDRIVER_CFG_PATH=/work/node/db2dsdriver.cfg
余談:マニュアルに「DB2DSDRIVER_CFG_PATH レジストリー変数」と書かれているのでレジストリー変数なのかと思ったら、環境変数でした。db2setコマンドでは設定できません。このことにびっくり。
db2setで設定できるレジストリー変数なのかは、db2set -lr コマンドで確認。
db2set -lr | grep -i DB2DSDRIVER
(出力なし)
サンプルコード
- T3表のスキーマを指定せずSELECT実行する。(SELECT .. FROM T3)
- db2dsdriver.cfg (CurrentSchema = db2inst1) が有効であれば、db2inst1スキーマのT3表がSELECTされるはず。
- db2dsdriver.cfg が読み込まれていない場合、user1スキーマのT3表をSELECTしようとして、そんな表はないというエラーとなる。
exports.host = 'localhost';
exports.port = 50000;
exports.dbname = 'TESTDB';
exports.username = 'user1';
exports.password = 'xxxxxxxx';
var ibm_db = require( 'ibm_db' );
var settings = require( './settings' );
var db_con_str =
"DRIVER={DB2}"
+ ";DATABASE=" + settings.dbname
+ ";HOSTNAME=" + settings.host
+ ";UID=" + settings.username
+ ";PWD=" + settings.password
+ ";PORT=" + settings.port
+ ";PROTOCOL=TCPIP";
var sql_str = "select C1, C2 from T3 where C1=?";
var param1 = [1];
ibm_db.open( db_con_str, function( err, conn ){
if( err ) return console.log( err );
conn.query( sql_str, param1, function( err, data ){
if( err ) console.log( err );
console.log( data );
conn.close( function(){
console.log( 'done' );
});
});
});
実行結果
db2dsdriver.cfgに設定したとおり CurrentSchema が db2inst1 に設定され、
"select .. from T3" と書いたSQLが、"select ... from db2inst1.T3" として実行されました。
$ node test2.js
[
{ C1: 1, C2: 'a ' },
{ C1: 2, C2: 'b ' },
{ C1: 10001, C2: 'A10001 ' }
]
done