2015-06-04 11 views
5

Utworzono procedurę składowania w MySQL, która oczekuje pewnych danych wejściowych i zwraca niektóre dane wyjściowe. Aby wywołać procedurę Przechowywać w MySQL używamWywołanie typu wejścia/wyjścia Procedura zapisu w Sequelize

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

i coraz wyjście w wiadomości obiektu.

teraz przychodzi sytuacja, w której muszę wywołać to SP w sequelu. Pracuję nad projektem sailsjs i korzystam z modułu sequelize do queerowania.

Utworzyłem połączenie z bazą danych w config/db_config, mój ciąg połączenia jest:

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

i jestem nazywając ją w sterowniku jak:

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

     }) 

    } 
} 

teraz muszę zadzwonić SP w sequelize więc ja po prostu spróbuj:

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

ale sequlize wywołać błąd:

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) 

Zrobiłem trochę R & D ale nie mógł znaleźć niczego odpowiedniego do wywołania procedury sklep który wysyła mi odpowiedź w @message i muszę wykonać inną SELECT, aby uzyskać wynik .

Proszę wskazać mi, w jaki sposób mogę zrobić to poprawnie, używając sposobu, w jaki połączyłem bazę danych.

Dzięki.

+0

myślę, że można wywołać osobno dwa nieprzetworzone zapytania, które pokażą poprawny wynik, ale nie jest to właściwy sposób. –

Odpowiedz

0

Chociaż dość późno, ale robimy coś podobnego w projekcie. Cała podróż wygląda tak:

Utworzyliśmy wszystkie pliki SP w poszczególnych plikach SQL i istnieje etap wdrażania, który wstawia wszystkie pliki SP do bazy danych, pobierając je z tej konkretnej lokalizacji.

Wszystkie SP są zasadniczo zwracane przez uruchomienie oświadczenia SELECT na końcu SP. I nie mając oddzielnego wyboru poza SP.

Tak więc podstawowa struktura jak

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 

Teraz nazywamy pomocą sequelize surowe zapytań SP, w

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

To wszystko wydaje się działać doskonale tak daleko :)