如何在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
相关产品推荐
相关产品推荐

