MySQL对表达式内的SET用户变量抛出警告

时间:2019-09-28 15:00:45

标签: mysql stored-procedures

我有一个存储过程,由于退出处理程序捕获了警告并退出了该块,因此该存储过程在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

2 个答案:

答案 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` = ?');

请参阅:SELECT ... INTO Syntax