2016-06-08 60 views
0

(第一篇文章。很抱歉,如果我违反任何海关或协议)。存储过程SQLWARNING退出处理程序不会被调用

我要定义在我的存储过程中引发的任何SQLWARNING退出处理。但处理程序正在被忽略,它从不会发生。我很困惑。

我正在使用MariaDB v。10.0.23。不过,我已经在MariaDB v 10.1.14上测试了这个,并得到了相同的结果。

下面是创建测试数据库的SQL。

CREATE DATABASE testerrorhandling; 

USE testerrorhandling; 

CREATE TABLE test 
(
    int_notnull   INT NOT NULL 
); 


DELIMITER // 
CREATE DEFINER=CURRENT_USER PROCEDURE create_record 
(
    IN p INT 
) 

BEGIN 

    DECLARE EXIT HANDLER FOR SQLEXCEPTION 
     SELECT 'Handler for SQLEXCEPTION fired.'; 

    DECLARE EXIT HANDLER FOR SQLWARNING 
     SELECT 'Handler for SQLWARNING fired.'; 

    INSERT INTO test (int_notnull) VALUES (p); 

END; 
// 

DELIMITER ; 

如果我试图添加一个空值,该过程将调用正确的处理函数。

MariaDB [testerrorhandling]> call create_record(null); 
+---------------------------------+ 
| Handler for SQLEXCEPTION fired. | 
+---------------------------------+ 
| Handler for SQLEXCEPTION fired. | 
+---------------------------------+ 
1 row in set (0.00 sec) 

但现在,如果我尝试添加非整数值,警告被抛出,但SQLWARNING错误处理程序永远不会触发。值为0存储在test表中。

MariaDB [testerrorhandling]> call create_record('this is not an integer'); 
Query OK, 1 row affected, 1 warning (0.04 sec) 

MariaDB [testerrorhandling]> show warnings; 
+---------+------+---------------------------------------------------------------------------+ 
| Level | Code | Message                 | 
+---------+------+---------------------------------------------------------------------------+ 
| Warning | 1366 | Incorrect integer value: 'this is not an integer' for column 'p' at row 1 | 
+---------+------+---------------------------------------------------------------------------+ 
1 row in set (0.00 sec) 

这不是我所期望或渴望的。我必须做错什么。我在这里错过了什么?

回答

0

警告发生在存储过程调用中,而不是存储过程中,所以警告(在存储过程内)不会被触发。

在下面的例子中,你可以看到参数p具有零(0)的值在存储过程中,所以没有警告:

MariaDB [_]> DROP TABLE IF EXISTS test; 
Query OK, 0 rows affected (0.00 sec) 

MariaDB [_]> DROP PROCEDURE IF EXISTS create_record; 
Query OK, 0 rows affected (0.00 sec) 

MariaDB [_]> CREATE TABLE IF NOT EXISTS test (
    -> int_notnull INT NOT NULL 
    ->); 
Query OK, 0 rows affected (0.00 sec) 

MariaDB [_]> DELIMITER // 

MariaDB [_]> CREATE PROCEDURE create_record (
    -> IN p INT 
    ->) 
    -> BEGIN 
    ->  DECLARE EXIT HANDLER FOR SQLEXCEPTION 
    ->   SELECT 'Handler for SQLEXCEPTION fired.'; 
    -> 
    ->  DECLARE EXIT HANDLER FOR SQLWARNING 
    ->   SELECT 'Handler for SQLWARNING fired.'; 
    -> 
    ->  SELECT CONCAT('VALUE OF p: ', p); 
    ->  INSERT INTO test (int_notnull) VALUES (p); 
    -> END// 
Query OK, 0 rows affected (0.00 sec) 

MariaDB [_]> DELIMITER ; 

MariaDB [_]> call create_record('this is not an integer'); 
+---------------------------+ 
| CONCAT('VALUE OF p: ', p) | 
+---------------------------+ 
| VALUE OF p: 0    | 
+---------------------------+ 
1 row in set (0.00 sec) 

Query OK, 1 row affected, 1 warning (0.00 sec) 

MariaDB [_]> SHOW WARNINGS; 
+---------+------+---------------------------------------------------------------------------+ 
| Level | Code | Message                 | 
+---------+------+---------------------------------------------------------------------------+ 
| Warning | 1366 | Incorrect integer value: 'this is not an integer' for column 'p' at row 1 | 
+---------+------+---------------------------------------------------------------------------+ 
1 row in set (0.00 sec) 

在以下例子中,该警告被激发在调用和存储过程中:

MariaDB [_]> DROP TABLE IF EXISTS test; 
Query OK, 0 rows affected (0.00 sec) 

MariaDB [_]> DROP PROCEDURE IF EXISTS create_record; 
Query OK, 0 rows affected (0.00 sec) 

MariaDB [_]> CREATE TABLE IF NOT EXISTS test (
    -> int_notnull INT NOT NULL 
    ->); 
Query OK, 0 rows affected (0.00 sec) 

MariaDB [_]> DELIMITER // 

MariaDB [_]> CREATE PROCEDURE create_record (
    -> IN p INT 
    ->) 
    -> BEGIN 
    ->  DECLARE EXIT HANDLER FOR SQLEXCEPTION 
    ->   SELECT 'Handler for SQLEXCEPTION fired.'; 
    -> 
    ->  DECLARE EXIT HANDLER FOR SQLWARNING 
    ->   SELECT 'Handler for SQLWARNING fired.'; 
    -> 
    ->  SELECT CONCAT('VALUE OF p: ', p); 
    ->  SET p := 'this is not an integer'; 
    ->  INSERT INTO test (int_notnull) VALUES (p); 
    -> END// 
Query OK, 0 rows affected (0.00 sec) 

MariaDB [_]> DELIMITER ; 

MariaDB [_]> call create_record('this is not an integer'); 
+---------------------------+ 
| CONCAT('VALUE OF p: ', p) | 
+---------------------------+ 
| VALUE OF p: 0    | 
+---------------------------+ 
1 row in set (0.00 sec) 

+-------------------------------+ 
| Handler for SQLWARNING fired. | 
+-------------------------------+ 
| Handler for SQLWARNING fired. | 
+-------------------------------+ 
1 row in set (0.00 sec) 

Query OK, 0 rows affected, 1 warning (0.00 sec) 

MariaDB [_]> SHOW WARNINGS; 
+---------+------+---------------------------------------------------------------------------+ 
| Level | Code | Message                 | 
+---------+------+---------------------------------------------------------------------------+ 
| Warning | 1366 | Incorrect integer value: 'this is not an integer' for column 'p' at row 1 | 
+---------+------+---------------------------------------------------------------------------+ 
1 row in set (0.00 sec)