IBM Cloud Functions Node.js调用Db2带参查询报错原因及修正方法
IBM Cloud Functions/OpenWhisk Node.js Db2动作参数标记异常问题排查与修复
我在IBM Cloud Functions/OpenWhisk中开发了一个基于Node.js的动作,用于从Db2数据库获取数据。当查询语句不使用参数标记时可正常执行,但使用参数标记并传入
{"confname" : "IDUGEMEA2018"}参数时,动作触发错误并抛出异常。请问该问题的原因是什么?需要对代码进行哪些修改?
原代码如下:
var ibmdb = require('ibm_db'); function queryConferences(dsn, confname) { try { var conn=ibmdb.openSync(dsn); var data=conn.querySync("select shortname, location, begindate, enddate, uri from conference where shortname=?", confname); conn.closeSync(); return {result : data}; } catch (e) { return { dberror : e } } } function main({confname, __bx_creds: {dashDB:{dsn}}}) { return queryConferences(dsn,confname); }
问题原因
问题出在ibm_db模块的querySync方法的参数传递规则上。当SQL语句使用参数标记(?)时,该方法要求第二个参数必须是数组类型,用来按顺序存放所有要绑定的参数值。你现在直接传入了单个字符串confname,而非包含该字符串的数组,这会导致Db2无法正确解析参数绑定逻辑,进而触发异常。
代码修改方案
只需要调整querySync调用时的参数传递形式,把单个值包裹在数组里即可:
修改后的核心函数片段:
function queryConferences(dsn, confname) { try { var conn=ibmdb.openSync(dsn); // 将单个参数值放入数组中传递 var data=conn.querySync("select shortname, location, begindate, enddate, uri from conference where shortname=?", [confname]); conn.closeSync(); return {result : data}; } catch (e) { return { dberror : e } } }
完整修改后的代码:
var ibmdb = require('ibm_db'); function queryConferences(dsn, confname) { try { var conn=ibmdb.openSync(dsn); var data=conn.querySync("select shortname, location, begindate, enddate, uri from conference where shortname=?", [confname]); conn.closeSync(); return {result : data}; } catch (e) { return { dberror : e } } } function main({confname, __bx_creds: {dashDB:{dsn}}}) { return queryConferences(dsn,confname); }
额外扩展说明
如果后续你的查询需要多个参数标记,只需按SQL中标记的顺序,在数组中依次添加对应的值即可,示例如下:
conn.querySync("select * from conference where shortname=? and location=?", [confname, targetLocation]);
内容的提问来源于stack exchange,提问作者data_henrik
相关产品推荐
相关产品推荐

