无法处理MYSQL函数中的异常

无法处理MYSQL函数中的异常,mysql,error-handling,mysql-function,Mysql,Error Handling,Mysql Function,我不太熟悉MYSQL函数和异常处理。经过下面所有的研究,我可以得出结论,但毫无收获 如果insert语句执行失败,我尝试返回0,否则返回1。异常被引发,而不是被处理。我哪里做错了 CREATE DEFINER=`myusr`@`localhost` FUNCTION `func1`(p1 varchar(50), p2 varchar(6)) RETURNS int(1) READS SQL DATA DETERMINISTIC BEGIN

我不太熟悉MYSQL函数和异常处理。经过下面所有的研究,我可以得出结论,但毫无收获

如果insert语句执行失败,我尝试返回0,否则返回1。异常被引发,而不是被处理。我哪里做错了


    CREATE DEFINER=`myusr`@`localhost` FUNCTION `func1`(p1 varchar(50), p2 varchar(6)) RETURNS int(1)
        READS SQL DATA
        DETERMINISTIC
    BEGIN
        DECLARE EXP DATETIME;
        DECLARE RINT INT(1);
        DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
        BEGIN
           RETURN  0;
        END;
        SET exp = DATE_ADD(NOW(), INTERVAL 15 MINUTE);
        INSERT INTO `mydb`.`my_tbl`
            (`C1`,
            `C2`,
            `C3`)
            VALUES
            (p1, p2, exp);
        SET RINT = 1;
        RETURN RINT;
    END

表格-我的tbl

成功案例-func1('ABC','123456')

异常情况-func1('ABC','123456789')


编辑-添加屏幕截图

看来mysql 8.0.19无法捕获所有错误并正确处理它们

错误代码:1406。第1行的列“p2”的数据太长

错误代码:1049。未知数据库“mydb”

有两个例子是我测试过的,但都不起作用,其他的都是这样,我想这更适合mysql论坛

DELIMITER $$
CREATE DEFINER=`mydb`@`localhost` FUNCTION `func1`(p1 varchar(50), p2 varchar(6)) RETURNS int
    READS SQL DATA
    DETERMINISTIC
BEGIN
    DECLARE EXP DATETIME;
    DECLARE RINT INT(1);
    DECLARE CONTINUE HANDLER FOR SQLEXCEPTION 
    BEGIn
       RETURN  0;
    END;
    SET exp = DATE_ADD(NOW(), INTERVAL 15 MINUTE);
    INSERT INTO `mydb`.`func1`
        (`C1`,
        `C2`,
        `C3`)
        VALUES
        (p1, p2, exp);
    SET RINT = 1;
    RETURN RINT;
END;
DE§LIMITER ;
这种情况是可行的。我增加了引用变量p2的大小,以适应输入的数据,并为错误1265添加了一个退出处理程序,当您尝试插入长文本时,您会遇到这个错误

错误代码:1265。第1行“c2”列的数据被截断


您遇到的错误,甚至在添加处理程序之前都会传递错误消息,mysql 8.0.19似乎无法捕获所有错误并正确处理它们

错误代码:1406。第1行的列“p2”的数据太长

错误代码:1049。未知数据库“mydb”

有两个例子是我测试过的,但都不起作用,其他的都是这样,我想这更适合mysql论坛

DELIMITER $$
CREATE DEFINER=`mydb`@`localhost` FUNCTION `func1`(p1 varchar(50), p2 varchar(6)) RETURNS int
    READS SQL DATA
    DETERMINISTIC
BEGIN
    DECLARE EXP DATETIME;
    DECLARE RINT INT(1);
    DECLARE CONTINUE HANDLER FOR SQLEXCEPTION 
    BEGIn
       RETURN  0;
    END;
    SET exp = DATE_ADD(NOW(), INTERVAL 15 MINUTE);
    INSERT INTO `mydb`.`func1`
        (`C1`,
        `C2`,
        `C3`)
        VALUES
        (p1, p2, exp);
    SET RINT = 1;
    RETURN RINT;
END;
DE§LIMITER ;
这种情况是可行的。我增加了引用变量p2的大小,以适应输入的数据,并为错误1265添加了一个退出处理程序,当您尝试插入长文本时,您会遇到这个错误

错误代码:1265。第1行“c2”列的数据被截断


您得到的错误在添加处理程序之前传递错误消息。TRY语句的作用是捕获异常。(由于此过程通常包含多个语句,因此通常使用术语“TRY块”而不是“TRY语句”。)如果TRY块内发生异常,则称为异常处理程序的系统部分将异常传递给程序的另一部分,该部分将处理异常。该程序部分由关键字CATCH表示,因此称为CATCH块

使用TRY-and-CATCH语句处理异常是现代编程语言(如C#和Java)处理错误的常见方式

使用TRY-and-CATCH块处理异常给程序员带来了很多好处,例如:

Exceptions provide a clean way to check for errors without cluttering code
Exceptions provide a mechanism to signal errors directly rather than using some side effects
Exceptions can be seen by the programmer and checked during the compilation process
SQL Server 2012引入了与处理错误相关的第三条语句:THROW。此语句允许您抛出异常处理块中捕获的异常。简单地说,THROW语句是另一种返回机制,其行为类似于已经描述的RAISEERROR语句

示例1显示了TRY/CATCH/THROW异常处理的工作原理。它展示了如何使用异常处理在批处理中插入所有语句,或者在发生错误时回滚整个语句组。该示例基于department表和employee表之间的引用完整性。因此,必须使用主键和外键约束创建这两个表

例1

0270_001

在执行示例1中的批处理后,批处理中的所有三条语句都不会执行,本例的输出为:

0271_001

示例1的执行过程如下所示。第一条INSERT语句已成功执行。然后,第二条语句导致引用完整性错误。因为这三条语句都写在TRY块中,所以异常被“抛出”,异常处理程序启动CATCH块。CATCH回滚所有语句并打印相应的消息。之后,THROW语句将批处理的执行返回给调用方。因此,employee表的内容不会更改


语句BEGIN TRANSACTION、COMMIT TRANSACTION和ROLLBACK是关于事务的Transact-SQL语句。这些语句分别启动、提交和回滚事务。有关这些语句和事务的一般讨论,请参见第13章。

TRY语句的作用是捕获异常。(由于此过程通常包含多个语句,因此通常使用术语“TRY块”而不是“TRY语句”。)如果TRY块内发生异常,则称为异常处理程序的系统部分将异常传递给程序的另一部分,该部分将处理异常。该程序部分由关键字CATCH表示,因此称为CATCH块

使用TRY-and-CATCH语句处理异常是现代编程语言(如C#和Java)处理错误的常见方式

使用TRY-and-CATCH块处理异常给程序员带来了很多好处,例如:

Exceptions provide a clean way to check for errors without cluttering code
Exceptions provide a mechanism to signal errors directly rather than using some side effects
Exceptions can be seen by the programmer and checked during the compilation process
SQL Server 2012引入了与处理错误相关的第三条语句:THROW。此语句允许您抛出异常处理块中捕获的异常。简单地说,THROW语句是另一种返回机制,其行为类似于已经描述的RAISEERROR语句

示例1显示了TRY/CATCH/THROW异常处理的工作原理。它展示了如何使用异常处理在批处理中插入所有语句,或者在发生错误时回滚整个语句组。该示例基于department表和employee表之间的引用完整性。因此,必须使用主键和外键约束创建这两个表

例1

0270_001

在执行示例1中的批处理之后,所有三个