MySQL为表达式中的SET用户变量抛出警告
我有一个存储过程不再在MySQL 8.0.17中工作,因为退出处理程序捕捉到警告并退出块。我猜是由于@transql变量引发的错误,但我不是100%确定。这样做的主要问题是,由于退出,被调用的存储过程永远不会到达它MySQL为表达式中的SET用户变量抛出警告,mysql,stored-procedures,Mysql,Stored Procedures,我有一个存储过程不再在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,它就会工作。抱歉,这是我试图通过查看它创建的内容来调试该语句。我已经编辑了存储过程以反映实际代码。