'Why mysql procedure returns session variables along with the OUT parameters?

This was very strange. My store procedure called with nodejs returns the internal session variables instead only the OUT parameters :s

initialize_round

CREATE PROCEDURE initialize_round(
  IN initial_hp_life INT,
  IN player_1_pattern VARCHAR(100),
  IN player_2_pattern VARCHAR(100),
  OUT response_code INT,
  OUT response_message VARCHAR(100)
)
PROCEDURE_ID:BEGIN

   
  DECLARE room_id_in_round INT;
  ...
  select
    @room_id_in_round:=room_id
  from
    round
  where
    room_id = found_room_id;
  ...
  SET response_code=200;
  SET response_message='the first round was created';    
  select response_code,response_message;
END

This is the execution using nodejs and knex. Note that mysql driver, samples and mysql itself guide us to use session variables to get the output parameters:

response = await this.dbSession.raw(
`call initialize_round(?,?,?, @response_code, @response_message); SELECT @response_code, @response_message;`,params);
console.log(JSON.stringify(response));    

Also note the SELECT @response_code, @response_message; to get the expected values.

And the result is something like this:

[
  [
    [{
      "@room_id_in_round:=room_id": 3
    }, {
      "@room_id_in_round:=room_id": 3
    }, {
      "@room_id_in_round:=room_id": 3
    }, {
      "@room_id_in_round:=room_id": 3
    }], {
      "fieldCount": 0,
      "affectedRows": 0,
      "insertId": 0,
      "serverStatus": 234,
      "warningCount": 0,
      "message": "",
      "protocol41": true,
      "changedRows": 0
    },
    [{
      "@response_code": 200,
      "@response_message": "the first round was created"
    }]
  ],

As you can see the repeated @room_id_in_round is a session variable returned along with the expected OUT parameters (@response_code, @response_message).

I could not find any explanation on google nor stackoverflow. Some related questions are:

I will try with java and c# to determine if it is a nodejs problem.

Research

//CREATE PROCEDURE get_count_name1
// (IN the_name VARCHAR(64),OUT the_count INT)
stmt = conn.prepareCall({call get_count_name(?, ?)});
stmt.setString(1, name); 
stmt.registerOutParameter(2, java.sql.Types.INTEGER);
stmt.execute();
//get the out param which is in the 2 position
int count=stmt.getInt(2);


Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source