我有一个存储过程,由于退出处理程序捕获了警告并退出了该块,因此该存储过程在MySQL 8.0.17中不再起作用。我猜测由于@transql变量而引发了错误,但我不确定100%。这样做的主要问题是,由于退出,被调用的存储过程永远不会到达它。
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
我检查了其他几个问题,但无法将其翻译成该查询。
Imports System
Imports System.Xml
Imports HtmlAgilityPack
Imports System.Net
Imports System.IO
Imports System.Collections.Generic
答案 0 :(得分:1)
这是警告,不是错误消息,但是您的错误处理程序也会在出现警告时退出。
警告信息非常清楚:您应该在复合mysql语句块中使用局部变量,而不是用户(会话)变量。
用户变量用@
前缀(@variablename
表示,而局部变量没有前缀,但在使用前必须声明(declare variablename type
)。声明必须位于其他声明之前。
答案 1 :(得分:1)
警告
不建议在表达式中设置用户变量,并且将 在将来的版本中删除。考虑替代方案:'SET variable = expression,...'或'SELECT expression(s)INTO 变量”。
几乎是您问题的完美答案。但是请帮忙。.第一个建议不适用于准备好的语句,因此您需要使用第二个建议:
SET @transql = CONCAT('SELECT cckey INTO @cckey FROM `', key1,
'_kr` AS t1 WHERE `transkey` = ?');