EXCEPTION(Snowflake Scripting)¶
Snowflake Scripting 블록에서 발생한 예외를 처리하는 방법을 지정합니다.
예외에 대한 자세한 내용은 예외 처리하기 섹션을 참조하십시오.
- 참고 항목:
구문¶
EXCEPTION
WHEN <exception_name> [ OR <exception_name> ... ] THEN
<statement>;
[ <statement>; ... ]
[ WHEN ... ]
[ WHEN OTHER THEN ]
<statement>;
[ <statement>; ... ]
여기서:
exception_name현재 블록의 DECLARE 부분 또는 둘러싸는 블록에 정의된 예외 이름입니다.
사용법 노트¶
각 블록 은 고유한 예외 처리기를 가질 수 있습니다.
Snowflake는 블록당 둘 이상의 예외 처리기를 지원하지는 않습니다. 그러나 해당 처리기는 둘 이상의
WHEN절을 사용하여 둘 이상의 예외 타입을 포착할 수 있습니다.예외 처리기는 블록 끝에 있어야 합니다. 블록에 예외 처리기 뒤에 문이 포함되어 있으면 해당 문이 실행되지 않습니다.
WHEN OTHER THEN절은 아직 지정되지 않은 예외를 포착합니다.둘 이상의
WHEN절이 특정 예외와 일치할 수 있는 경우, 일치하는 첫 번째WHEN절이 실행되는 절입니다. 다른 절은 실행되지 않습니다.지정된 예외가 범위 내에 있는 경우에만 예외 처리기는 지정된 예외를 처리할 수 있습니다.
저장 프로시저가 값을 반환하려는 경우, 예외 처리기의 각
WHEN절을 포함하여 가능한 각 경로에서 값을 반환해야 합니다.예외 처리기에서 변수를 사용하려면 해당 변수를 DECLARE 섹션에 선언하거나 저장 프로시저에 인자로 전달해야 합니다. BEGIN … END 섹션에서는 변수를 선언할 수 없습니다. 자세한 내용은 예외 처리기에 변수 전달하기 섹션을 참조하십시오.
예¶
이 예에서는 예외를 선언하고, 발생시키고, 처리합니다. 참고:
예외 처리기는 둘 이상의 예외 타입을 처리하도록 설계되었습니다.
예외 처리기의
WHEN절 중 하나에는 단일 문이 포함되는 한편, 나머지 절에는 블록 이 포함됩니다.DECLARE RESULT VARCHAR; EXCEPTION_1 EXCEPTION (-20001, 'I caught the expected exception.'); EXCEPTION_2 EXCEPTION (-20002, 'Not the expected exception!'); BEGIN RESULT := 'If you see this, I did not catch any exception.'; IF (TRUE) THEN RAISE EXCEPTION_1; END IF; RETURN RESULT; EXCEPTION WHEN EXCEPTION_2 THEN RETURN SQLERRM; WHEN EXCEPTION_1 THEN RETURN SQLERRM; END;
참고: Python Connector 코드에서 Snowflake CLI, SnowSQL, Classic Console, 또는
execute_stream또는execute_string메서드를 사용하는 경우 이 예제를 대신 사용하십시오(Snowflake CLI, SnowSQL, Classic Console 및 Python Connector에서 Snowflake Scripting 사용하기 참조).EXECUTE IMMEDIATE $$ DECLARE RESULT VARCHAR; EXCEPTION_1 EXCEPTION (-20001, 'I caught the expected exception.'); EXCEPTION_2 EXCEPTION (-20002, 'Not the expected exception!'); BEGIN RESULT := 'If you see this, I did not catch any exception.'; IF (TRUE) THEN RAISE EXCEPTION_1; END IF; RETURN RESULT; EXCEPTION WHEN EXCEPTION_2 THEN RETURN SQLERRM; WHEN EXCEPTION_1 THEN RETURN SQLERRM; END; $$ ;
다음은 예외를 발생시키는 예를 실행한 결과입니다. 이는 예외 처리기가 예외를 포착했음을 보여줍니다.
+----------------------------------+ | anonymous block | |----------------------------------| | I caught the expected exception. | +----------------------------------+
이 다음 예는 이전 예와 유사하지만, 중첩 블록을 나타내며, 내부 블록이 내부 블록이나 외부 블록에서 선언된 예외를 발생시킬 수 있음을 보여줍니다.
DECLARE e1 EXCEPTION (-20001, 'Exception e1'); BEGIN -- Inner block. DECLARE e2 EXCEPTION (-20002, 'Exception e2'); selector BOOLEAN DEFAULT TRUE; BEGIN IF (selector) THEN RAISE e1; ELSE RAISE e2; END IF; END; EXCEPTION WHEN e1 THEN RETURN SQLERRM || ' caught in outer block.'; END;참고: Python Connector 코드에서 Snowflake CLI, SnowSQL, Classic Console, 또는
execute_stream또는execute_string메서드를 사용하는 경우 이 예제를 대신 사용하십시오(Snowflake CLI, SnowSQL, Classic Console 및 Python Connector에서 Snowflake Scripting 사용하기 참조).EXECUTE IMMEDIATE $$ DECLARE e1 EXCEPTION (-20001, 'Exception e1'); BEGIN -- Inner block. DECLARE e2 EXCEPTION (-20002, 'Exception e2'); selector BOOLEAN DEFAULT TRUE; BEGIN IF (selector) THEN RAISE e1; ELSE RAISE e2; END IF; END; EXCEPTION WHEN e1 THEN BEGIN RETURN SQLERRM || ' caught in outer block.'; END; END; $$ ;
다음은 예외를 발생시키는 예를 실행한 결과입니다. 이는 예외 처리기가 예외를 포착했음을 보여줍니다.
+-------------------------------------+ | anonymous block | |-------------------------------------| | Exception e1 caught in outer block. | +-------------------------------------+
이 다음 예는 이전 예와 유사하지만, 각각 고유한 예외 처리기가 있는 중첩 블록을 나타냅니다.
DECLARE RESULT VARCHAR; e1 EXCEPTION (-20001, 'Outer exception e1'); BEGIN RESULT := 'No error so far (but there will be).'; DECLARE e1 EXCEPTION (-20101, 'Inner exception e1'); BEGIN RAISE e1; EXCEPTION WHEN e1 THEN RESULT := 'Inner exception raised.'; RETURN RESULT; END; RETURN RESULT; EXCEPTION WHEN e1 THEN RESULT := 'Outer exception raised.'; RETURN RESULT; END;참고: Python Connector 코드에서 Snowflake CLI, SnowSQL, Classic Console, 또는
execute_stream또는execute_string메서드를 사용하는 경우 이 예제를 대신 사용하십시오(Snowflake CLI, SnowSQL, Classic Console 및 Python Connector에서 Snowflake Scripting 사용하기 참조).EXECUTE IMMEDIATE $$ DECLARE RESULT VARCHAR; e1 EXCEPTION (-20001, 'Outer exception e1'); BEGIN RESULT := 'No error so far (but there will be).'; DECLARE e1 EXCEPTION (-20101, 'Inner exception e1'); BEGIN RAISE e1; EXCEPTION WHEN e1 THEN RESULT := 'Inner exception raised.'; RETURN RESULT; END; RETURN RESULT; EXCEPTION WHEN e1 THEN RESULT := 'Outer exception raised.'; RETURN RESULT; END; $$ ;
참고
이 예에서는 외부 및 내부 블록에서 같은 예외 이름(e1)을 사용합니다.
이는 권장되지 않습니다.
이 예에서는 예외 이름의 범위 를 설명하기 위해 이 작업을 수행합니다. e1 이름이 있는 두 예외는 다른 예외입니다.
외부 블록의 e1 핸들러는 내부 블록에서 선언되어 발생한 예외 e1을 처리하지 않습니다.
다음은 예외를 발생시키는 예를 실행한 결과입니다. 이는 내부 예외 처리기가 실행되었음을 보여줍니다.
+-------------------------+ | anonymous block | |-------------------------| | Inner exception raised. | +-------------------------+
이 예 조각은 다음을 보여줍니다.
OR을 사용하여 동일 절에서 둘 이상의 예외를 포착하는 방법.WHEN OTHER THEN을 사용하여, 지정되지 않은 예외를 포착하는 방법.EXCEPTION WHEN MY_FIRST_EXCEPTION OR MY_SECOND_EXCEPTION OR MY_THIRD_EXCEPTION THEN RETURN 123; WHEN MY_FOURTH_EXCEPTION THEN RETURN 4; WHEN OTHER THEN RETURN 99;
다음 예에서는 예외를 포착할 때 SQLCODE, SQLERRM(SQL 오류 메시지), SQLSTATE를 반환하는 방법을 보여줍니다.
DECLARE MY_EXCEPTION EXCEPTION (-20001, 'Sample message'); BEGIN RAISE MY_EXCEPTION; EXCEPTION WHEN STATEMENT_ERROR THEN RETURN OBJECT_CONSTRUCT('Error type', 'STATEMENT_ERROR', 'SQLCODE', SQLCODE, 'SQLERRM', SQLERRM, 'SQLSTATE', SQLSTATE); WHEN EXPRESSION_ERROR THEN RETURN OBJECT_CONSTRUCT('Error type', 'EXPRESSION_ERROR', 'SQLCODE', SQLCODE, 'SQLERRM', SQLERRM, 'SQLSTATE', SQLSTATE); WHEN OTHER THEN RETURN OBJECT_CONSTRUCT('Error type', 'Other error', 'SQLCODE', SQLCODE, 'SQLERRM', SQLERRM, 'SQLSTATE', SQLSTATE); END;참고: Python Connector 코드에서 Snowflake CLI, SnowSQL, Classic Console, 또는
execute_stream또는execute_string메서드를 사용하는 경우 이 예제를 대신 사용하십시오(Snowflake CLI, SnowSQL, Classic Console 및 Python Connector에서 Snowflake Scripting 사용하기 참조).EXECUTE IMMEDIATE $$ DECLARE MY_EXCEPTION EXCEPTION (-20001, 'Sample message'); BEGIN RAISE MY_EXCEPTION; EXCEPTION WHEN STATEMENT_ERROR THEN RETURN OBJECT_CONSTRUCT('Error type', 'STATEMENT_ERROR', 'SQLCODE', SQLCODE, 'SQLERRM', SQLERRM, 'SQLSTATE', SQLSTATE); WHEN EXPRESSION_ERROR THEN RETURN OBJECT_CONSTRUCT('Error type', 'EXPRESSION_ERROR', 'SQLCODE', SQLCODE, 'SQLERRM', SQLERRM, 'SQLSTATE', SQLSTATE); WHEN OTHER THEN RETURN OBJECT_CONSTRUCT('Error type', 'Other error', 'SQLCODE', SQLCODE, 'SQLERRM', SQLERRM, 'SQLSTATE', SQLSTATE); END; $$ ;
이 예를 실행하면 다음 출력이 생성됩니다.
+--------------------------------+ | anonymous block | |--------------------------------| | { | | "Error type": "Other error", | | "SQLCODE": -20001, | | "SQLERRM": "Sample message", | | "SQLSTATE": "P0001" | | } | +--------------------------------+
이 예에서는 가능한 각 경로에서 값을 반환하는 방법을 보여줍니다.
declare e1 exception; e2 exception; begin statement_1; ... RETURN x; exception when e1 then begin ... RETURN y; end; when e2 then begin ... RETURN z; end; end;