Mysql 在Sequelize中调用输入/输出类型存储过程

Mysql 在Sequelize中调用输入/输出类型存储过程,mysql,stored-procedures,sails.js,sequelize.js,Mysql,Stored Procedures,Sails.js,Sequelize.js,我在MySQL中创建了一个存储过程,它需要一些输入并返回一些输出。 要在MySQL中调用存储过程,我正在运行 CALL createCoupon(1236,321, @message); SELECT @message AS message 以及在消息对象中获取输出 现在我需要在sequelize中调用此SP。我正在从事sailsjs项目,并使用sequelize模块进行queering 我已经在config/db\u config中创建了数据库连接,我的连接字符串是: var sequeli

我在MySQL中创建了一个存储过程,它需要一些输入并返回一些输出。 要在MySQL中调用存储过程,我正在运行

CALL createCoupon(1236,321, @message);
SELECT @message AS message
以及在消息对象中获取输出

现在我需要在sequelize中调用此SP。我正在从事sailsjs项目,并使用sequelize模块进行queering

我已经在config/db\u config中创建了数据库连接,我的连接字符串是:

var sequelize = new Sequelize(db.name, db.user, db.pass, {
    host: db.host,
    dialect: "mysql", // or 'sqlite', 'postgres', 'mariadb'
    port:    3306, // or 5432 (for postgres)
    maxConcurrentQueries: 100,
    pool: {
    maxConnections: 50,
    maxIdleTime: 2000
    },
    queue: true
})
我在控制器中调用它,就像:

var Sequelize = require('sequelize');
var sequelize = require('../../config/db_config').dbase;

function setCoupon(couponCode, userId, setCouponResponse) {
    var createCouponSQL = "some raw query";


    sequelize.query(createCouponSQL, null, {
        raw: true
    }).success(function(createCoupon) {
            sails.log.info(createCoupon);
            setCouponResponse(null, createCoupon);
    }).error(function(err) {
        sails.log.error(err);
            setCouponResponse(err, null);
    });
}


module.exports = {
    'createCoupon': function(req, callback) {
        setCoupon(req.param('coupon_code'), req.session.userSession, function(err, setCouponResponse){

        })

    }
}
现在我需要在sequelize中调用SP,因此我只需尝试:

 var createCouponSQL = "CALL createCoupon(1236,321, @message);";
          createCouponSQL += "SELECT @message AS message";

    sequelize.query(createCouponSQL, null, {
        raw: true
    }).success(function(createCoupon) {
            sails.log.info(createCoupon);
            setCouponResponse(null, createCoupon);
    }).error(function(err) {
        sails.log.error(err);
            setCouponResponse(err, null);
    });
但Sequalize会触发错误:

Executing (default): CALL createCoupon(1236,321, @message);SELECT @message AS m
essage
error: Error: ER_PARSE_ERROR: You have an error in your SQL syntax; check the m
anual that corresponds to your MySQL server version for the right syntax to use
 near 'SELECT @message AS message' at line 1
    at Query.Sequence._packetToError (C:\Users\asd\Desktop\CardCash P2\Website\
node_modules\mysql\lib\protocol\sequences\Sequence.js:30:14)
我已经做了一些研究和开发,但没有找到任何合适的方法来调用存储过程,该存储过程正在@message中向我返回响应,我需要执行另一个select语句来获得结果

请指导我如何使用连接数据库的方式正确执行此操作


谢谢。

虽然很晚了,但我们正在一个项目中做类似的事情。 整个旅程看起来

我们已经在单个SQL文件中创建了所有SP,并且有一个部署步骤,该步骤将所有SP插入数据库,并从该特定位置获取它们

所有SP基本上都是通过在SP末尾运行
SELECT
语句返回的。在SP之外没有单独的SELECT语句

所以一个基本的结构像

DELIMITER $$
DROP PROCEDURE IF EXISTS sp_copy_cleansheet;
$$
CREATE PROCEDURE `take_over_the_world` (#Some Input Args)

BEGIN
  DECLARE method_to_be_used  VARCHAR(1000);
  # Define how to take over the world, 
  # SET method_to_be_used = "Approach A";
  ...
  ...
  SELECT method_to_be_used as Result;
END
现在我们使用sequelize原始查询调用SP

const query = 'CALL take_over_the_world(:someArg)';
return Model.sequelize.query(query, 
 { 
   replacements : { someArg},
   type : Model.sequelize.QueryTypes.SELECT 
})
.then((response) => {

//Access response here. Its of the form [{Result: /*How to take over*/}]
});

到目前为止,这一切似乎都运行得很好:)

我认为您可以分别调用两个原始查询,它将显示正确的结果,但这不是正确的方法。