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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 14:45:03