You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 10:52:54