2015-06-04 3 views
5

Ho creato una procedura di archiviazione in MySQL che prevede alcuni input e restituisce alcuni output. Per chiamare procedura di memorizzazione in MySQL sto facendo funzionareChiamare il tipo di input/output Memorizzare la procedura in Sequenza

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

e ottenere l'output in oggetto messaggio.

ora arriva la situazione che ho bisogno di chiamare questo SP in sequelize. Sto lavorando al progetto sailsjs e uso il modulo sequelize per queering.

ho creato la connessione al database in config/DB_CONFIG, la mia stringa di connessione è:

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

e sto chiamando in controllo come:

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){ 

     }) 

    } 
} 

Ora ho bisogno di chiamare SP in sequelize così ho semplicemente provare:

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

ma il sequlize innescare l'errore:

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) 

Ho fatto qualche ricerca & D ma non in grado di trovare qualsiasi cosa giusta per chiamare una procedura di memorizzazione che mi sta mandando indietro la risposta in @message e ho bisogno di eseguire un altro dichiarazione prescelta per ottenere il risultato .

Per favore indicami come posso farlo correttamente usando il modo in cui ho collegato il database.

Grazie.

+0

penso che può chiamare separatamente due query non elaborate e ti mostrerà il risultato corretto, ma questo non è il modo corretto. –

risposta

0

Anche se in ritardo, ma stiamo facendo qualcosa di simile in un progetto. L'intero percorso è simile,

Abbiamo creato tutti gli SP in singoli file SQL e c'è un passo di distribuzione, che inserisce tutti gli SP nel database, recuperandoli da quella particolare posizione.

Tutti gli SP restituiscono sostanzialmente eseguendo un'istruzione SELECT alla fine dell'SP. E non avendo una selezione separata al di fuori della SP.

Quindi una struttura di base come

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 

Ora noi chiamiamo utilizzando sequelize query prime del 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*/}] 
}); 

Tutto sembra funzionare perfettamente finora :)

Problemi correlati