Node.js Sequelize调用带出入参的存储过程如何获取out参数返回值
Sequelize 读取MySQL存储过程OUT参数的实现方法
核心逻辑
MySQL的OUT参数值会写入你指定的会话变量(你代码里的@retval),Sequelize不会在调用存储过程时自动返回这个值,你需要在同一会话下额外执行一次查询读取该会话变量的值即可。
为了避免连接池分配不同连接导致会话变量失效,推荐用事务将两次操作绑定在同一个连接会话中。
完整实现代码
const { QueryTypes } = require('sequelize'); // 用事务保证两次查询使用同一会话连接 const transaction = await db.sequelize.transaction(); try { // 第一步:调用存储过程,用@retval接收out参数 await db.sequelize.query( 'CALL signinVendor(:inputvalue, :pword, @retval);', { replacements: { inputvalue: req.body.inputvalue, pword: req.body.password }, transaction } ); // 第二步:查询会话变量获取out参数返回值 const [result] = await db.sequelize.query( 'SELECT @retval AS retval;', { type: QueryTypes.SELECT, raw: true, transaction } ); // 提交事务 await transaction.commit(); // 取出返回值 const retVal = result.retval; console.log('存储过程out参数返回值:', retVal); } catch (err) { // 出错回滚事务 await transaction.rollback(); throw err; }
注意事项
- 不需要在调用存储过程的
query配置中指定type: QueryTypes.SELECT,CALL语句不需要该配置 - 若不用事务,在连接池模式下有概率出现两次查询分配到不同连接,导致
@retval返回null的问题,因此强烈推荐用事务包裹两次查询操作
内容的提问来源于stack exchange,提问作者ReflexEcho
相关产品推荐
相关产品推荐

