我相信目前 MySQL 中没有任何东西可以允许访问SQLSTATE
MySQL 存储过程中最后执行的语句。这意味着当泛型SQLException
在存储过程中引发,很难/不可能得出错误的确切性质。
有没有人有一个解决方法来派生SQLSTATE
MySQL 存储过程中的错误是否涉及为每个可能的 SQLSTATE 声明处理程序?
例如 - 想象一下我正在尝试返回一个超出通用“SQLException 发生在这个位置”的 error_statusBEGIN....END
块”如下:
DELIMITER $$
CREATE PROCEDURE `myProcedure`(OUT o_error_status varchar(50))
MY_BLOCK: BEGIN
DECLARE EXIT handler for 1062 set o_error_status := "Duplicate entry in table";
DECLARE EXIT handler for 1048 set o_error_status := "Trying to populate a non-null column with null value";
-- declare handlers ad nauseum here....
DECLARE EXIT handler for sqlexception set o_error_status:= "Generic SQLException. You'll just have to figure out the SQLSTATE yourself...." ;
-- Procedure logic that might error to follow here...
END MY_BLOCK$$
有小费吗?
PS我正在运行MySQL 5.1.49
我相信目前 MySQL 中没有任何东西可以允许访问 MySQL 存储过程中最后执行的语句的 SQLSTATE。这意味着......很难/不可能得出错误的确切性质。
幸运的是这不是真的。
SHOW ERRORS LIMIT 1 -- for SQL-state > 2
SHOW WARNINGS LIMIT 1 -- for SQL-state 1,2
将显示最后一个错误或警告。
为了防止列出每个错误,您可以像这样处理一类 SQL 错误:
SQLWARNING 是以“01”开头的 SQLSTATE 值类的简写。
NOT FOUND 是以“02”开头的 SQLSTATE 值类的简写。这仅在游标上下文中相关,用于控制游标到达数据集末尾时发生的情况。如果没有更多行可用,则会出现“无数据”条件,SQLSTATE 值为 02000。要检测此条件,您可以为其设置处理程序(或为 NOT FOUND 条件设置处理程序)。第 12.7.5 节“光标”中显示了一个示例。对于不检索任何行的 SELECT ... INTO var_list 语句,也会出现这种情况。
SQLEXCEPTION 是不以“00”、“01”或“02”开头的 SQLSTATE 值类的简写。
所以要处理异常,你需要only do:
DECLARE EXIT HANDLER FOR SQLSTATE SQLEXCEPTION .....;
Links:
http://dev.mysql.com/doc/refman/5.5/en/signal.html http://dev.mysql.com/doc/refman/5.5/en/signal.html
http://dev.mysql.com/doc/refman/5.0/en/declare-handler.html http://dev.mysql.com/doc/refman/5.0/en/declare-handler.html
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)