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;