RESIGNAL 문
RESIGNAL 문 (RESIGNAL Statement)
RESIGNAL 문은 조건(condition) 또는 예외 핸들러(exception handler) 안에서 오류를 다시 던져(re-raise) 상위 레벨에서 처리되도록 할 때 사용하는 문이에요.
출처: 문서
본문
구문 (Syntax):
RESIGNAL
RESIGNAL SQLSTATE [VALUE] sqlstate [SET MESSAGE_TEXT = message_text]
예제 1 (Example 1):
같은 오류를 다시 던집니다.
BEGIN
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
BEGIN
PRINT 'Error raised';
RESIGNAL;
END;
PRINT 'Before executing SQL';
SELECT * FROM abc.abc; -- Table does not exist, error will be raised
PRINT 'After executing SQL - will not be printed in case of error';
END;
결과:
Before executing SQL
Error raised
예제 2 (Example 2):
바깥쪽 조건 핸들러에서 다시 던져진 조건을 잡습니다.
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION
PRINT 'Error raised, outer handler';
BEGIN
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
BEGIN
PRINT 'Error raised, resignal';
RESIGNAL;
END;
PRINT 'Before executing SQL';
SELECT * FROM abc.abc; -- Table does not exist, error will be raised
PRINT 'After executing SQL - must not be printed';
END;
PRINT 'Continue outer block after exiting inner';
END;
결과:
Before executing SQL
Error raised, resignal
Error raised, outer handler
Continue outer block after exiting inner
예제 3 (Example 3):
지정된 SQLSTATE와 메시지 텍스트로 조건을 다시 던집니다.
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
GET DIAGNOSTICS EXCEPTION 1 text = MESSAGE_TEXT;
PRINT 'SQLSTATE: ' || SQLSTATE;
PRINT 'Text: ' || text;
END;
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION
RESIGNAL SQLSTATE '02031' SET MESSAGE_TEXT = 'Some error';
SELECT * FROM abc.abc; -- Table does not exist, raise an exception
END;
END;
결과:
SQLSTATE: 02031
Text: Some error
호환성 (Compatibility): IBM DB2, Teradata, MySQL
더 보기 (See also):
- 오류 처리 (Error Handling)
DECLARE CONDITIONDECLARE HANDLERSQLCODESQLSTATEGET DIAGNOSTICSSIGNAL
더 알아보기 (Learn more)
RESIGNAL은 한 번 잡았던 예외를 상위 핸들러로 다시 전파하고 싶을 때 유용해요. 조건 핸들러(DECLARE CONTINUE/EXIT HANDLER)와 함께 쓰며, SIGNAL과는 달리 이미 발생한 조건을 다시 던지는 역할을 합니다.