在mysql存储过程中使用TRY-CATCH时发生异常

在mysql存储过程中使用TRY-CATCH时发生异常,mysql,stored-procedures,Mysql,Stored Procedures,以下是我试图捕获异常的过程(如果存储过程中有异常) DROP PROCEDURE IF EXISTS test; DELIMITER // CREATE PROCEDURE test( IN contextFilter TEXT) BEGIN TRY set @sub_query = 'SELECT id from test_table'; PREPARE stmt_query FROM @sub_query; SELECT @sub_query;

以下是我试图捕获异常的过程(如果存储过程中有异常)

DROP PROCEDURE IF EXISTS test;

DELIMITER //

CREATE PROCEDURE test( IN contextFilter TEXT)
   BEGIN TRY


  set  @sub_query = 'SELECT id from test_table';

   PREPARE stmt_query FROM @sub_query;
      SELECT @sub_query;
                EXECUTE stmt_query;
                DEALLOCATE PREPARE stmt_query;

   END TRY //
   BEGIN CATCH
    SELECT ERROR_NUMBER() AS ErrorNumber,ERROR_MESSAGE() AS ErrorMessage;
  END CATCH

 DELIMITER ;
当我试图为存储过程寻找源代码时,我得到了以下异常

source /home/test.sql;
Query OK, 0 rows affected (0.01 sec)

ERROR 1064 (42000) at line 5 in file: '/home/test.sql': You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'set  @sub_query = 'SELECT id from test_table';

   PREPARE stmt_query FROM @' at line 5
ERROR 1064 (42000) at line 17 in file: '/home/test.sql': You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'CATCH
    SELECT ERROR_NUMBER() AS ErrorNumber,ERROR_MESSAGE() AS ErrorMessage;
' at line 1

在mySql中,没有
try。。。catch
类似于Java中的块。我可以通过错误处理来处理错误吗

语法

DECLARE handler_action HANDLER
    FOR condition_value [, condition_value] ...
    statement

handler_action:
    CONTINUE
  | EXIT
  | UNDO

condition_value:
    mysql_error_code
  | SQLSTATE [VALUE] sqlstate_value
  | condition_name
  | SQLWARNING
  | NOT FOUND
  | SQLEXCEPTION
handler\u action值指示处理程序在执行handler语句后执行的操作:

继续:继续执行当前程序

退出:开始时执行终止。。。在其中声明处理程序的END复合语句。即使条件发生在内部块中,也是如此

撤消:不支持


要了解更多信息,请访问网站

上面的帖子对我有所帮助,但我仍然需要自己做一些研究。为了提供完整的示例,您可以在下面看到。此代码将声明一个用于“捕获”SQLExceptions的处理程序,然后在发生时退出

DROP PROCEDURE IF EXISTS `SP_TEST`;
DELIMITER //
CREATE PROCEDURE `SP_TEST`()
BEGIN
    DECLARE EXIT HANDLER FOR SQLEXCEPTION 
    BEGIN 
        GET DIAGNOSTICS CONDITION 1 @p1 = RETURNED_SQLSTATE, @p2 = MESSAGE_TEXT;
        SELECT CONCAT(@p1, ':', @p2);
    END;

    SELECT FAKE_COLUMN FROM MY_TABLE;
END //

CALL SP_TEST;
这在mySQL版本5.7中起作用,希望对您有所帮助。

您可以使用。