2015-06-04 46 views
5

我在MySQL中創建了一個存儲過程,它需要一些輸入並返回一些輸出。 要調用存儲過程在MySQL我運行在Sequelize中調用輸入/輸出類型存儲過程

CALL createCoupon(1236,321, @message); 
SELECT @message AS message 

並獲得在消息對象的輸出。

現在這裏出現了我需要在後續調用中調用此SP的情況。我正在開發sailsjs項目並使用sequelize模塊進行排隊。

我創建了一個配置/ DB_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){ 

     }) 

    } 
} 

現在我需要調用SP在sequelize,所以我只是嘗試:

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); 
    }); 

但sequlize引發錯誤:

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) 

我已經做了一些[R & d,但沒能找到合適的調用這是送我回@message響應中的存儲過程的任何事情,我需要執行另一個select語句得到的結果。

請指導我如何正確使用連接數據庫的方式來做到這一點。

謝謝。

+0

我想你可以分別調用兩個原始查詢,它會向您顯示正確的結果,但這不是正確的方法。 –

回答

0

雖然很晚,但我們在一個項目中做了類似的事情。 整個旅程看起來像,

我們已經在單個SQL文件中創建了所有的SP,並且有一個部署步驟,它將所有SP插入到數據庫中,從該特定位置獲取它們。

所有的SP基本上都是通過在SP末尾運行SELECT聲明返回的。而不是在SP之外單獨選擇。

因此,一個基本的結構是怎樣的

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 

現在我們所說的SP的使用sequelize生疑問,

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*/}] 
}); 

這一切似乎完全到目前爲止是工作:)

相關問題