Quantcast
Channel: Node.jsタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 8883

Node.js + ibm_db + Db2 で、プレースホルダを用いたSQLを実行する

$
0
0

プレースホルダを用いたSQLを使って、Db2にアクセスします。

SQLの条件指定を固定値(リテラル)で記述すると、指定される条件が変わるごとに新しいSQLとしてコンパイルされることになり、where条件だけが異なる同じSQLでパッケージ・キャッシュがあふれてしまいます。コンパイルにかかる時間ももったいない。
そうならないよう、可変となる値の部分だけ(場合によっては列名なども)、疑問符「?」で表したSQLで記述することができます。JDBCなどではパラメーターマーカーと呼ばれますが、Node.jsではプレースホルダと表現されるようです。

ここから先は、Db2を使う場合に、プレースホルダにどうやって値を渡すかのメモです。

プレースホルダーを用いたSQL実行例

ibm_dbのqueryでは、値を配列として渡します。

test2.js
varibm_db=require('ibm_db');varsettings=require('./settings');vardb_con_str="DRIVER={DB2}"+";DATABASE="+settings.dbname+";HOSTNAME="+settings.host+";PORT="+settings.port+";PROTOCOL=TCPIP"+";UID="+settings.username+";PWD="+settings.password;varsql_str="select C1, C2 from db2inst1.T3 where C1=?";varparam1=[1];  ←ココで、「C1=?」の「?」に与える値を記述ibm_db.open(db_con_str,function(err,conn){if(err)returnconsole.log(err);conn.query(sql_str,param1,function(err,data){if(err)console.log(err);console.log(data);conn.close(function(){console.log('done');});});});

実行結果

$ node test2.js
[ { C1: 1, C2: 'a       ' } ]
done

なお、今回指定した値1は、データベース上は数値列(Integer)ですが、配列には文字列として記述してもちゃんと動きます。

var sql_str = "select C1, C2 from db2inst1.T3 where C1=?";
var param1 = ["1"];

失敗ケース その1(数値として渡した場合)

他のDBで検証されている例を見ていると、ただの数値でも問題なさそうなのですが
ibm_db では失敗します。

抜粋(SQL/プレースホルダ)
varsql_str="select C1, C2 from T3 where C1=?";varparam1=1;

実行結果:

$ node test2.js
[Error: [IBM][CLI Driver] CLI0100E  Wrong number of parameters. SQLSTATE=07001] {
  error: '[node-ibm_db] SQL_ERROR',
  sqlcode: -99999,
  message: '[IBM][CLI Driver] CLI0100E  Wrong number of parameters. SQLSTATE=07001',
  state: '07001'
}
[]
done

失敗ケース その2(文字列として渡した場合)

文字列としてダブルクオートで囲むパターンも試しましたがうまくいかず。
※ "1" ではなく ["1"] と記述し、文字列配列として指定すれば成功します

抜粋(SQL/プレースホルダ)
varsql_str="select C1, C2 from T3 where C1=?";varparam1="1";

実行結果:

node test2.js
/database/config/db2inst1/node_modules/ibm_db/lib/odbc.js:600
        self.conn.query(query, params, cbQuery);
                  ^

TypeError: Argument 1 must be an Array.
    at /database/config/db2inst1/node_modules/ibm_db/lib/odbc.js:600:19
    at SimpleQueue.next (/database/config/db2inst1/node_modules/ibm_db/lib/simple-queue.js:34:5)
    at SimpleQueue.maybeNext (/database/config/db2inst1/node_modules/ibm_db/lib/simple-queue.js:22:10)
    at SimpleQueue.push (/database/config/db2inst1/node_modules/ibm_db/lib/simple-queue.js:15:8)
    at Database.query (/database/config/db2inst1/node_modules/ibm_db/lib/odbc.js:470:14)
    at /database/config/db2inst1/work/node/test2.js:19:8
    at /database/config/db2inst1/node_modules/ibm_db/lib/odbc.js:111:11
    at /database/config/db2inst1/node_modules/ibm_db/lib/odbc.js:333:11

Viewing all articles
Browse latest Browse all 8883