如何通过Node.js+TypeORM获取Oracle存储过程返回的游标数据?
如何从TypeORM调用Oracle存储过程返回的游标中提取行数据?
场景重现
你有如下Oracle存储过程:
PROCEDURE STORED_TEST( PARAM_1 IN NVARCHAR2, REF_CURSOR OUT SYS_REFCURSOR, MESSAGE OUT VARCHAR2 );
在Node.js(TypeScript)应用中使用TypeORM调用该存储过程的代码如下:
import { dataSource } from '../utils/database'; const oracledb = require('oracledb'); // 调用代码 const sql = 'BEGIN PKG_TEST.STORED_TEST(:PARAM_1, :REF_CURSOR, :MESSAGE); END;'; const result = await dataSource.query( sql, [ { val: param1, dir: oracledb.BIND_IN, type: oracledb.VARCHAR }, { dir: oracledb.BIND_OUT, type: oracledb.CURSOR }, { dir: oracledb.BIND_OUT, type: oracledb.VARCHAR }] ); console.log("result:", result);
控制台输出返回了一个包含ResultSet对象和状态信息的数组:
result: [ ResultSet { _rowCache: [], _processingStarted: false, _convertedToStream: false, _allowGetRowCall: false, _parentObj: Connection { ... } }, 'OK' ]
解决方案
要提取游标中的行数据,需利用oracledb提供的ResultSet对象的getRows()方法,步骤如下:
- 提取ResultSet对象:从返回结果数组中取出第一个元素,即游标对应的
ResultSet实例 - 获取行数据:调用
getRows()方法(可传入数字参数指定获取行数,不传则获取全部),该方法返回Promise,需用await处理 - 关闭ResultSet:数据提取完成后,务必调用
close()方法关闭ResultSet,释放数据库连接资源
修改后的完整代码示例
import { dataSource } from '../utils/database'; const oracledb = require('oracledb'); async function callStoredProcedure(param1: string) { const sql = 'BEGIN PKG_TEST.STORED_TEST(:PARAM_1, :REF_CURSOR, :MESSAGE); END;'; const result = await dataSource.query( sql, [ { val: param1, dir: oracledb.BIND_IN, type: oracledb.VARCHAR }, { dir: oracledb.BIND_OUT, type: oracledb.CURSOR }, { dir: oracledb.BIND_OUT, type: oracledb.VARCHAR }] ); const resultSet = result[0] as oracledb.ResultSet; const message = result[1] as string; // 获取所有行数据 const rows = await resultSet.getRows(); console.log("返回的行数据:", rows); console.log("返回消息:", message); // 关闭ResultSet,释放资源 await resultSet.close(); return rows; }
说明
getRows()返回的是包含行数据的数组,每一行默认以对象形式存在(键为数据库列名),可通过oracledb配置调整为数组格式- 必须关闭ResultSet,否则会导致数据库连接泄漏,影响应用稳定性和性能
内容的提问来源于stack exchange,提问作者Igorov
相关产品推荐
相关产品推荐

