Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL为表达式中的SET用户变量抛出警告_Mysql_Stored Procedures - Fatal编程技术网

MySQL为表达式中的SET用户变量抛出警告

MySQL为表达式中的SET用户变量抛出警告,mysql,stored-procedures,Mysql,Stored Procedures,我有一个存储过程不再在MySQL 8.0.17中工作,因为退出处理程序捕捉到警告并退出块。我猜是由于@transql变量引发的错误,但我不是100%确定。这样做的主要问题是,由于退出,被调用的存储过程永远不会到达它 +-------+-------------------------------------------------------------------------------------------------------------------------------------

我有一个存储过程不再在MySQL 8.0.17中工作,因为退出处理程序捕捉到警告并退出块。我猜是由于@transql变量引发的错误,但我不是100%确定。这样做的主要问题是,由于退出,被调用的存储过程永远不会到达它

+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| @p1   | @p2                                                                                                                                                                                                                                                                                                                                                 |
+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| HY000 | Setting user variables within expressions is deprecated and will be removed in a future release. Consider alternatives: 'SET variable=expression, ...', or 'SELECT expression(s) INTO variables(s)'. |
+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
我检查了一些其他问题,但无法将它们转换为此查询

BEGIN
 DECLARE EXIT HANDLER FOR SQLEXCEPTION, sqlwarning
    BEGIN
   GET DIAGNOSTICS CONDITION 1 @p1 = RETURNED_SQLSTATE, @p2 = MESSAGE_TEXT;
   ROLLBACK;
   END;

  START TRANSACTION;
  SET @key1 = key1;
    SET @transkey = transkey;
    SET @transql = CONCAT('SELECT @cckey:=cckey FROM `', key1,
    '_kr` AS t1 WHERE `transkey` = ?');
    PREPARE stmt FROM @transql;
    EXECUTE stmt
    USING @transkey;
    DEALLOCATE PREPARE stmt;

    CALL sp_procedure1(key1, @cckey, @transkey)

  COMMIT;
END

这是一个警告,不是错误消息,但您的错误处理程序也会在出现警告时退出

警告很清楚:在复合mysql语句块中应该使用局部变量,而不是用户会话变量

用户变量由@prefix@variablename表示,而局部变量没有前缀,但在使用它们之前必须声明为variablename类型。声明必须在任何其他声明之前。

警告

在表达式中设置用户变量已被弃用,将被禁用 在将来的版本中删除。考虑替代方案:“设置” 变量=表达式,…',或“将表达式选择到” “上帝保佑”

这几乎是你问题的完美答案。但我想帮你一把。。第一个建议不适用于准备好的报表,因此您需要使用第二个建议:

SET @transql = CONCAT('SELECT cckey INTO @cckey FROM `', key1,
    '_kr` AS t1 WHERE `transkey` = ?');

请参阅:

SELECT@transql;您正在选择而不是选择。只需删除SELECT,它就会工作。抱歉,这是我试图通过查看它创建的内容来调试该语句。我已经编辑了存储过程以反映实际代码。