背景
很久之前已经做好了 Node 与 MySQL 之间的接口,后来又优化重写了一遍,应该没有什么问题了。现在需要另外与 Oracle DB 做接口。
具体需求
因为出于很多因素考虑,数据库只暴露存储过程调用的接口,所以只需要在 Node 中做调用存储过程的接口即可。
步骤:
- 之前就调研好在 Node 中连 Oracle DB(以下称 Oracle) 的包选用 oracledb,
npm install oracledb
。 - 如果此刻运行会报错,提示需要在本地有 Oracle 的一些驱动等,去到 Oracle 官网根据自己特定的平台下载所谓 Instant Clients。这一步可能需要用户登录才能下载,不然下载不成功。下载成功后将目录路径放在系统的环境变量中,重新开一个 Shell 运行即可。此刻应该就可以运行成功了。
- 关于形参,可以使用变量名或者索引对应的方法。出于封装与向前兼容的考虑,使用索引的方法,当然后面的具体参数输入就需要传一个对应数组进来。
- 关于输出变量的注册与结果集的获取。
- 如果只注册了一个输出变量,那么在回调中使用
result.outBinds
下面的方法就可以取到结果数据。 - 如果注册了若干个输出变量,那么在回调中的
result.outBinds
就是个数组,需要依次取下面的元素,再使用上述方法取下面的具体数据。
const plsql = 'BEGIN pkg_medicare_payment.prc_getpersoninfo(:0, :1, :2, :3); END;'; const bindvars = [ '李健', '220104197811149217', { dir: oracledb.BIND_OUT, type: oracledb.CURSOR }, { dir: oracledb.BIND_OUT, type: oracledb.CURSOR } ]; connection.execute( plsql, bindvars, function (err, result) { if (err) { console.log(err); } result.outBinds[0].getRows(10).then(rows => console.log(rows)); result.outBinds[1].getRows(10, (err, rows) => console.log(rows)); // fetchRowsFromRS(connection, result.outBinds.cursor, numRows); });
- 如果只注册了一个输出变量,那么在回调中使用
- 以上代码只关乎上述逻辑,不包含获取连接与释放连接的部分。
网友评论