如何将参数传入和传出给mysql存储过程并在nodejs代码中返回存储过程结果

时间:2014-06-19 05:25:08

标签: mysql node.js stored-procedures

connection.query("call vts_active_tagid('"+RFIDNumber+"','"+Latitude+"','"+Longitude+"','"+datetime+"','"+imeno+"',@passengers,@trip)");

此存储过程提供一个输出,其中包含firstname,phone number和passengerid,如何在nodejs代码中获取这些值

4 个答案:

答案 0 :(得分:6)

  1. 首先,首先将mysql设置为接受多个语句

    set mysql.createConnection({multipleStatements: true});

  2. 查询

    query_str = "CALL sp_whatever(?,?,?,@output); select @output"; con.query(query_str, [param1, param2, param3], function(err,rows){ if(err) throw err; console.log(rows); });

  3. 输出:

    [OkPacket {
        fieldCount: 0,
        affectedRows: 0,
        insertId: 0,
        serverStatus: 10,
        warningCount: 0,
        message: '',
        protocol41: true,
        changedRows: 0 },
      [ RowDataPacket { '@output': -2 } ] ]
    

答案 1 :(得分:4)

为您准备的样本

dbConnection.getConnection(function(err, connection){
        var edituserSQL =  "CALL spEditTheme(?,?,?,?)";
        var resultt;
        connection.query(edituserSQL, [ object.selfid,object.theme_background,object.theme_foreground,dateTimeNow ], function(ERROR,RESULT) {
                if (ERROR) {
                    cb(ERROR, null);
                } else {
                    console.log("exEditUserTheme result");
                    console.log(RESULT);
                    var account = RESULT[0][0].result;
                    cb(null, account);
                }
            });

            connection.release();
    });

答案 2 :(得分:0)

让sql = CALL storedproc(${rfidnumber},${latitude},${longitude},${date})

connection.query(sql,(错误,结果,字段)= { 如果(错误)抛出错误 response.send(结果[0]) })

答案 3 :(得分:0)

Nodejs代码:

con.query("CALL sp_ReturnValue(?, @ret_value); CALL sp_ReadReturnValue;", [id], (err, rows) => {
                if (!err && rows[0].affectedrows != 0) {
                    console.log("Print return value ", rows[1][0].ret_value); 
                } 
            })

具有输入和输出参数的存储过程:

CREATE PROCEDURE `sp_ReturnValue`(
    p_Id int(11),                -- Input param
    OUT r_status INT(11)               -- output param
)
BEGIN 
    SELECT Status FROM tblUsers WHERE tblUsers_ID = p_Id; // use of input param
      SET r_status = 2; // use of output param
END

读取返回值:

CREATE PROCEDURE `sp_ReadReturnValue`()
BEGIN
    SELECT @ret_value AS ret_value;
END

您也可以在不使用存储过程的情况下读取值:

SELECT @ret_value AS ret_value;

示例:

con.query("CALL sp_ReturnValue(?, @ret_value); SELECT @ret_value AS ret_value", [id], (err, rows) => {
                    console.log("Print return value ", rows[1][0].ret_value);  
            })

您还可以返回多个值,例如:

CREATE PROCEDURE `sp_ReturnValue`(
    p_Id int(11),                -- Input param
    OUT r_status1 INT(11)               -- output param
    OUT r_status2 VARCHAR(11)               -- output param
    OUT r_status3 INT(11)               -- output param
)
BEGIN 
    SELECT Status FROM tblUsers WHERE tblUsers_ID = p_Id; // use of input param
      SET r_status1 = 2; // use of output param
      SET r_status2 = "ABCD"; // use of string output param
      SET r_status3 = 2; // use of output param
END

阅读类似:

CREATE PROCEDURE `sp_ReadReturnValue`()
BEGIN
    SELECT @ret_value1 AS ret_value1,
           @ret_value2 AS ret_value2,
           @ret_value3 AS ret_value3;
END

输出参数的节点输入参数:

con.query("CALL sp_ReturnValue(?, @ret_value1, @ret_value2, @ret_value3); CALL sp_ReadReturnValue;", [id], (err, rows) => {
            console.log("Print return value \n "); 
            console.log(rows[1][0].ret_value1 "\n");  
            console.log(rows[1][0].ret_value2 "\n");
            console.log(rows[1][0].ret_value3 );
    })