【问题标题】:how to pass in and out parameters to a mysql stored procedure and return the stored procedure result in the nodejs code如何向mysql存储过程传入​​和传出参数并在nodejs代码中返回存储过程结果
【发布时间】:2014-08-09 13:29:05
【问题描述】:
connection.query("call vts_active_tagid('"+RFIDNumber+"','"+Latitude+"','"+Longitude+"','"+datetime+"','"+imeno+"',@passengers,@trip)");

这个存储过程给出一个输出,其中包含名字、电话号码和乘客 ID,如何在 nodejs 代码中获取这些值

【问题讨论】:

    标签: mysql node.js stored-procedures


    【解决方案1】:

    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
    

    Out 参数在节点中的参数:

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

    【讨论】:

    • 欢迎来到 SO!当你只用代码回答一个问题时,即使是对的,也要试着解释一下。在您的情况下,还有其他一些答案,所以请展示您的 POV 的优点
    【解决方案2】:

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

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

    【讨论】:

    • 最好通过适当的格式和至少一句关于正在发生的事情来改进你的答案。
    【解决方案3】:
    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); });

    输出:

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

    【讨论】:

      【解决方案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();
          });
      

      【讨论】:

      • 你在哪里传递参数并得到它的值?
      • out 参数在哪里?在我看来,您只传递了 IN 参数。
      猜你喜欢
      • 1970-01-01
      • 2013-08-14
      • 2018-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-17
      • 2015-09-02
      相关资源
      最近更新 更多