반응형
저장 프로시저 SQLWARN 종료 처리기가 호출되지 않았습니다.
(첫번째 글.세관이나 프로토콜을 위반한 경우 사과합니다.)
저장 프로시저에서 발생한 SQL WARNING에 대한 종료 처리기를 정의하려고 합니다.하지만 핸들러는 무시당하고 있어요 절대 발사되지 않아요그리고 저는 매우 혼란스럽습니다.
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 ;
null 값을 추가하려고 하면 올바른 처리기가 호출됩니다.
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)
이것은 제가 기대하거나 바라는 것이 아닙니다.제가 뭔가 잘못하고 있는 게 틀림없어요.내가 여기서 뭘 놓쳤지요?
경고는 저장 프로시저 내가 아닌 저장 프로시저 호출에서 발생하므로 경고(저장 프로시저 내)는 실행되지 않습니다.
다음 예제에서는 매개 변수를 볼 수 있습니다.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)
언급URL : https://stackoverflow.com/questions/37696022/stored-procedure-sqlwarning-exit-handler-not-invoked
반응형
'programing' 카테고리의 다른 글
| 테이블에 값 삽입 Oracle SQL (0) | 2023.08.06 |
|---|---|
| 각도:HttpClient에서 파일을 다운로드하는 방법은 무엇입니까? (0) | 2023.08.06 |
| php로 일반 텍스트 파일 읽기 (0) | 2023.08.06 |
| 덱스를 병합할 수 없습니다. (0) | 2023.08.01 |
| Angular 5에서 타이머를 실행하는 방법 (0) | 2023.08.01 |