2016-06-08 61 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)