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

如何在Node.js oracledb中调用Oracle包内的PL/SQL存储过程

我完全懂你的需求——就是想像C#里那样直接调用Oracle包中的存储过程,而不是在Node.js代码里写原生SELECT语句。咱们来重构你的代码实现这个功能:

修改后的完整代码

const oracledb = require('oracledb');
const config = { /* 这里放你的数据库连接配置 */ };

app.get('/api/courses', (req, res) => {
  // 用PL/SQL块包裹包存储过程的调用,这是Oracle驱动要求的格式
  const plsqlCall = `BEGIN PKGCommonConstants.GetRightsGranted(:O_CUR_RGTSGRAN_TYP); END;`;
  
  // 定义绑定变量:这里是存储过程的输出游标参数
  let bindVars = {
    O_CUR_RGTSGRAN_TYP: { type: oracledb.CURSOR, dir: oracledb.BIND_OUT }
  };

  oracledb.getConnection(config)
    .then(conn => {
      return conn.execute(plsqlCall, bindVars)
        .then(queryResult => {
          // 从输出游标中提取实际数据,getRows()是异步方法
          return queryResult.outBinds.O_CUR_RGTSGRAN_TYP.getRows()
            .then(rows => {
              console.log('获取到的数据:', rows);
              res.json(rows); // 直接返回JSON格式,无需手动stringify
              conn.close(); // 务必关闭连接,避免泄漏
            });
        })
        .catch(error => {
          console.error('执行存储过程出错:', error);
          conn.close(); // 出错也要关闭连接
          res.status(500).send({ error: error.message });
        });
    })
    .catch(error => {
      console.error('数据库连接失败:', error);
      res.status(500).send({ error: error.message });
    });
});

app.listen(3000, () => {
  console.log('Listening on port 3000');
});

关键修改点说明

  • PL/SQL块格式:Oracle驱动要求执行存储过程时必须用BEGIN...END;包裹调用语句,不能直接写包名.过程名
  • 绑定变量处理:如果你的存储过程需要输入参数(比如用户ID),只需在bindVars中新增输入变量即可,示例如下:
    bindVars = {
      P_USER_ID: { type: oracledb.NUMBER, val: 1001 }, // 输入参数,指定类型和值
      O_CUR_RGTSGRAN_TYP: { type: oracledb.CURSOR, dir: oracledb.BIND_OUT }
    };
    // 同时修改PL/SQL块为:
    const plsqlCall = `BEGIN PKGCommonConstants.GetRightsGranted(:P_USER_ID, :O_CUR_RGTSGRAN_TYP); END;`;
    
  • 游标数据提取:输出游标需要调用getRows()方法才能拿到实际的行数据,这个方法是异步的,所以要通过链式then处理
  • 连接管理:无论成功还是失败,都要关闭数据库连接,避免连接池耗尽导致性能问题

内容的提问来源于stack exchange,提问作者Vaibhav Phutane

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:38:07