使用Node和TypeORM获取Oracle游标

ruyhziif  于 2023-08-04  发布在  Oracle
关注(0)|答案(1)|浏览(117)

我有这个Oracle存储过程:

PROCEDURE STORED_TEST(
      PARAM_1     IN NVARCHAR2
      REF_CURSOR OUT SYS_REFCURSOR,
      MESSAGE    OUT VARCHAR2
      );

字符串
我用TypeORM从node(TypeScript)应用程序调用它:
进口:

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);


我在console中得到了这个结果:

result: [
  ResultSet {
    _rowCache: [],
    _processingStarted: false,
    _convertedToStream: false,
    _allowGetRowCall: false,
    _parentObj: Connection {
      _events: [Object: null prototype],
      _eventsCount: 1,
      _maxListeners: undefined,
      _dbObjectClasses: {},
      _pool: [Pool],
      _newSession: false,
      [Symbol(kCapture)]: false
    }
  },
  'OK'
]


如何检索此游标的行?

ht4b089n

ht4b089n1#

看起来你正在打印的内容中已经有两个OUT绑定变量:REF CURSOR已作为ResultSet(结果数组中的第一个值)返回,OUT绑定消息为“OK”。
要从ResultSet获取数据,请参阅GitHub上的examples/refcursor.js
在您的情况下,尝试类似于:

const resultSet = result[0];
    const rows = await resultSet.getRows();  // no parameter means get all rows
    console.log(rows);

    await resultSet.close();                  // always close the ResultSet

字符串
如果行数很大,你可能需要循环getRows():请参阅GitHub中的示例。

相关问题