13.6.7.4 RESIGNAL 구문
RESIGNAL [condition_value
] [SETsignal_information_item
[,signal_information_item
] ...]condition_value
: SQLSTATE [VALUE]sqlstate_value
|condition_name
signal_information_item
:condition_information_item_name
=simple_value_specification
condition_information_item_name
: CLASS_ORIGIN | SUBCLASS_ORIGIN | MESSAGE_TEXT | MYSQL_ERRNO | CONSTRAINT_CATALOG | CONSTRAINT_SCHEMA | CONSTRAINT_NAME | CATALOG_NAME | SCHEMA_NAME | TABLE_NAME | COLUMN_NAME | CURSOR_NAMEcondition_name
,simple_value_specification
: (see following discussion)
RESIGNAL
저장 프로 시저 또는 저장 함수의 내부에있는 복합 문에서 조건 핸들러, 트리거 또는 이벤트의 실행 중에 사용 가능한 오류 조건 정보를 전달합니다. RESIGNAL
은 그 정보의 일부 또는 전부를 전달하기 전에 변경 될 수 있습니다. RESIGNAL
은 SIGNAL
에 관련되어 있지만, SIGNAL
같은 조건을 발신하는 대신 RESIGNAL
은 기존의 조건 정보를 (아마도 변경 후) 중계합니다.
RESIGNAL
오류를 처리 할 때 오류 정보를 반환 할 모두를 가능하게합니다. 그렇지 않으면 처리기에서 SQL 문을 실행함으로써 그 핸들러의 활성화를 발생시킨 정보가 파기됩니다. RESIGNAL
은 지정된 핸들러가 상황의 일부를 처리 할 경우 프로 시저의 일부를 짧게하고 조건을 "소급하여"다른 핸들러에 전달할 수 있습니다.
RESIGNAL
문을 실행하는 데 특별한 권한이 필요하지 않습니다.
RESIGNAL
의 모든 형식으로 현재의 문맥이 조건 핸들러이어야합니다. 그렇지 않은 경우 RESIGNAL
은 부정하고, RESIGNAL when handler not active
오류가 발생합니다.
진단 영역에서 정보를 검색하려면 GET DIAGNOSTICS
문을 사용합니다 ( 섹션 13.6.7.3 "GET DIAGNOSTICS 구문" 을 참조하십시오). 진단 영역은 섹션 13.6.7.7 "MySQL의 진단 영역" 을 참조하십시오.
RESIGNAL
대한 condition_value
과 signal_information_item
의 정의와 규칙은 SIGNAL
에 대한 것과 동일합니다. 예를 들어, condition_value
을 SQLSTATE
값에 수이 값은 오류, 경고 또는 "없음"을 나타내는 경우가 있습니다. 자세한 내용은 섹션 13.6.7.5 "SIGNAL 구문" 을 참조하십시오.
RESIGNAL
문은 모두 옵션 인 condition_value
와 SET
절을받습니다. 따라서 다음과 같은 몇 가지 사용법이 생각됩니다.
RESIGNAL
만 :RESIGNAL;
새로운 신호 정보를 포함
RESIGNAL
:RESIGNAL SET
signal_information_item
[,signal_information_item
] ...;조건 값과 경우에 따라서는 새로운 신호 정보를 포함
RESIGNAL
:RESIGNAL
condition_value
[SETsignal_information_item
[,signal_information_item
] ...];
이러한 사례는 모든 진단 및 조건 영역의 변경을 발생시킵니다.
진단 영역에는 하나 이상의 조건 영역이 포함되어 있습니다.
조건 영역에는
SQLSTATE
값MYSQL_ERRNO
,MESSAGE_TEXT
등의 조건 정보 항목이 포함되어 있습니다.
진단 영역의 조건 영역의 최대 수는 max_error_count
시스템 변수의 값에 의해 결정됩니다. 섹션 13.6.7.7.4 "진단 영역 관련 시스템 변수" 를 참조하십시오.
13.6.7.4.1 RESIGNAL 만
간단한 RESIGNAL
만은 "오류를 수정없이 통과"을 나타냅니다. 이것은 마지막 진단 영역을 복원하고 그것을 현재의 진단 영역에합니다. 즉, 진단 영역 스택을 "아빠"
조건을 잡으려고 조건 핸들러 내에서 RESIGNAL
만 한 사용법으로 다른 몇 가지 작업을 수행 한 뒤, 원래 조건 정보 (핸들러에 들어가기 전에 존재했던 정보)를 변경하지 않고 전달하는 방법이 있습니다.
예 :
DROP TABLE IF EXISTS xx; delimiter // CREATE PROCEDURE p () BEGIN DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN SET @error_count = @error_count + 1; IF @a = 0 THEN RESIGNAL; END IF; END; DROP TABLE xx; END // delimiter; SET @error_count = 0; SET @a = 0; CALL p ();
DROP TABLE xx
문이 실패했다고합니다. 진단 영역 스택은 다음과 같이됩니다.
DA 1. ERROR 1051 (42S02) : Unknown table 'xx'
그런 다음 실행이 EXIT
핸들러에 들어갑니다. 이 핸들러는 첫째, 진단 영역을 스택의 선두에 푸시합니다. 이제 진단 영역 스택은 다음과 같이됩니다.
DA 1. ERROR 1051 (42S02) : Unknown table 'xx' DA 2. ERROR 1051 (42S02) : Unknown table 'xx'
이 시점에서 첫 번째 (현재) 진단 영역과 두 번째 (스택) 진단 영역의 내용은 동일합니다. 처음 진단 영역은 그 후에 처리기에서 실행되는 문에 의해 변경 될 수 있습니다.
일반적으로 프로 시저 문은 처음 진단 영역을 지 웁니다. BEGIN
는 예외입니다. 이것은 지우지 않고 아무것도하지 않습니다. SET
는 예외가 없습니다. 이것은 지우고 작업을 수행하여 "성공"결과를 생성합니다. 이제 진단 영역 스택은 다음과 같이됩니다.
DA 1. ERROR 0000 (00000) : Successful operation DA 2. ERROR 1051 (42S02) : Unknown table 'xx'
이 시점에서 @a = 0
의 경우 RESIGNAL
진단 영역 스택을 팝합니다. 이제 진단 영역 스택은 다음과 같이됩니다.
DA 1. ERROR 1051 (42S02) : Unknown table 'xx'
그리고 이것이 호출자에 표시되는 내용입니다.
@a
가 0이 아닌 경우,이 핸들러는 단순히 종료합니다. 즉, 현재의 진단 영역은 더 이상 사용되지 않음 ( "처리 된"되었다) 때문에 파기 할 수 스택 된 진단 영역이 다시 현재의 진단 영역입니다. 진단 영역 스택은 다음과 같이됩니다.
DA 1. ERROR 0000 (00000) : Successful operation
자세히 살펴보면 복잡하게 보이지만 최종 결과는 매우 유효합니다. 처리기는 처리기의 활성화를 발생시킨 조건에 대한 정보를 파기하지 않고 실행할 수 있습니다.
13.6.7.4.2 새로운 신호 정보를 포함 RESIGNAL
SET
절을 포함 RESIGNAL
은 새로운 신호 정보를 제공하기 위해이 문은 "오류를 수정하고 전달"을 나타냅니다.
RESIGNAL SET signal_information_item
[, signal_information_item
] ...;
RESIGNAL
만 마찬가지로, 아이디어는 원래 정보가 사라지게 진단 영역 스택을 팝합니다. RESIGNAL
만 달리 SET
절에서 지정된 것은 모두 변경됩니다.
예 :
DROP TABLE IF EXISTS xx; delimiter // CREATE PROCEDURE p () BEGIN DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN SET @error_count = @error_count + 1; IF @a = 0 THEN RESIGNAL SET MYSQL_ERRNO = 5; END IF; END; DROP TABLE xx; END // delimiter; SET @error_count = 0; SET @a = 0; CALL p ();
이전 설명에서 RESIGNAL
에 의해서만 진단 영역 스택이 다음과 같이되는 것을 기억하십시오.
DA 1. ERROR 1051 (42S02) : Unknown table 'xx'
RESIGNAL SET MYSQL_ERRNO = 5
문은 대신 스택이 다음과 같이됩니다. 이것이 호출자에 표시되는 내용입니다.
DA 1. ERROR 5 (42S02) : Unknown table 'xx'
즉, 오류 번호 만 변경되어 다른 아무것도 변경되지 않습니다.
RESIGNAL
문은 신호 정보 항목의 일부 또는 전부를 변경할 수 있기 때문에 진단 영역의 첫 번째 조건 영역이 전혀 다른 것처럼 보입니다.
13.6.7.4.3 조건 값 및 옵션의 새로운 신호 정보를 포함 RESIGNAL
조건 값을 포함 RESIGNAL
는 "조건을 현재의 진단 영역에 푸시한다 '는 것을 보여줍니다. SET
절이 있으면 오류 정보도 변경됩니다.
RESIGNALcondition_value
[SETsignal_information_item
[,signal_information_item
] ...];
이 형식의 RESIGNAL
마지막 진단 영역을 복원하고 그것을 현재의 진단 영역에합니다. 즉, 진단 영역 스택을 "아빠" 이것은 간단한 RESIGNAL
만 수행 동작과 동일합니다. 그러나 조건 값 또는 신호 정보에 따라 진단 영역도 변경됩니다.
예 :
DROP TABLE IF EXISTS xx; delimiter // CREATE PROCEDURE p () BEGIN DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN SET @error_count = @error_count + 1; IF @a = 0 THEN RESIGNAL SQLSTATE '45000'SET MYSQL_ERRNO = 5; END IF; END; DROP TABLE xx; END // delimiter; SET @error_count = 0; SET @a = 0; SET @@ max_error_count = 2; CALL p (); SHOW ERRORS;
이것은 앞의 예와 비슷하고 그 효과도 동일하지만 RESIGNAL
가 발생한 경우에는 현재의 조건 영역이 마지막으로는 다른 것처럼 보이는 점이 다릅니다. (이 조건이 기존 조항을 대체하는 것이 아니라, 거기에 추가되는 이유는 조건 값이 사용되고 있기 때문입니다.)
이 RESIGNAL
문은 조건 값 ( SQLSTATE '45000'
)가 포함되어 있기 때문에 새로운 조건 영역이 추가되고 진단 영역 스택은 다음과 같이됩니다.
DA 1. (condition 2) ERROR 1051 (42S02) : Unknown table 'xx' (condition 1) ERROR 5 (45000) Unknown table 'xx'
이 예에서 CALL p()
과 SHOW ERRORS
의 결과는 다음과 같습니다.
mysql>CALL p();
ERROR 5 (45000): Unknown table 'xx' mysql>SHOW ERRORS;
+-------+------+----------------------------------+ | Level | Code | Message | +-------+------+----------------------------------+ | Error | 1051 | Unknown table 'xx' | | Error | 5 | Unknown table 'xx' | +-------+------+----------------------------------+
13.6.7.4.4 RESIGNAL은 조건 핸들러의 컨텍스트가 필요
RESIGNAL
의 모든 형식으로 현재의 문맥이 조건 핸들러이어야합니다. 그렇지 않은 경우 RESIGNAL
은 부정하고, RESIGNAL when handler not active
오류가 발생합니다. 예 :
mysql>CREATE PROCEDURE p () RESIGNAL;
Query OK, 0 rows affected (0.00 sec) mysql>CALL p();
ERROR 1645 (0K000) : RESIGNAL when handler not active
더 어려운 예를 보여줍니다.
delimiter // CREATE FUNCTION f () RETURNS INT BEGIN RESIGNAL; RETURN 5; END // CREATE PROCEDURE p () BEGIN DECLARE EXIT HANDLER FOR SQLEXCEPTION SET @ a = f (); SIGNAL SQLSTATE '55555'; END // delimiter; CALL p ();
RESIGNAL
이 스토어드 함수 f()
에 나타나 있습니다. f()
자체는 EXIT
핸들러의 컨텍스트에서 호출되지만, f()
내에서의 실행 자체 문맥을 가져, 그것은 처리기의 컨텍스트가 없습니다. 따라서 f()
내에서의 RESIGNAL
통해 "handler not active"오류가 발생합니다.
MySQL 5.5에서는 핸들러의 범위에 관한 규칙이 충분히 발달하지 않습니다. f()
핸들러의 컨텍스트 내에서 실행되는 것으로 간주되며 f()
내에서의 RESIGNAL
은 정당합니다.