๋ณ์ ์์ ํ๊ธฐยถ
Snowflake Scripting์์๋ ์, Snowflake Scripting ๋ฌธ, SQL ๋ฌธ์ ๋ณ์๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๋ณ์ ์ ์ธํ๊ธฐยถ
๋ณ์๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ๋จผ์ ๋ณ์๋ฅผ ์ ์ธํด์ผ ํฉ๋๋ค. ๋ณ์๋ฅผ ์ ์ธํ ๋๋ ๋ค์ ์ค ํ ๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ๋ณ์ ์ ํ์ ์ง์ ํด์ผ ํฉ๋๋ค.
๋ฐ์ดํฐ ํ์ ์ ๋ช ์์ ์ผ๋ก ์ง์ ํฉ๋๋ค.
๋ณ์์ ์ด๊ธฐ ๊ฐ์ ๋ํ ์์ ์ง์ ํฉ๋๋ค. Snowflake Scripting์ ์์ ์ฌ์ฉํ์ฌ ๋ณ์์ ๋ฐ์ดํฐ ํ์ ์ ๊ฒฐ์ ํฉ๋๋ค. Snowflake Scripting์ด ๋ณ์์ ๋ฐ์ดํฐ ํ์ ์ ์ ์ถํ๋ ๋ฐฉ๋ฒ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
๋ค์๊ณผ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ๋ณ์๋ฅผ ์ ์ธํ ์ ์์ต๋๋ค.
๋ค์ ์ค ํ๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ธ๋ก์ DECLARE ์น์ ๋ด์์:
<variable_name> <type> ; <variable_name> DEFAULT <expression> ; <variable_name> <type> DEFAULT <expression> ;
๋ค์ ๋ฐฉ๋ฒ ์ค ํ๋๋ก LET ๋ช ๋ น์ ์ฌ์ฉํ์ฌ ๋ธ๋ก์ BEGIN โฆ END ์น์ ๋ด์์(๋ณ์๋ฅผ ์ฌ์ฉํ๊ธฐ ์ ์):
LET <variable_name> <type> { DEFAULT | := } <expression> ; LET <variable_name> { DEFAULT | := } <expression> ;
์ฌ๊ธฐ์:
variable_name
๋ณ์์ ์ด๋ฆ์ ๋๋ค. ์ด๋ฆ์ ์ค๋ธ์ ํธ ์๋ณ์ ์ ๋ํ ๋ช ๋ช ๊ท์น์ ๋ฐ๋ผ์ผ ํฉ๋๋ค.
type
๋ณ์์ ๋ฐ์ดํฐ ํ์ ์ ๋๋ค. ๋ฐ์ดํฐ ํ์ ์ ๋ค์ ์ค ํ๋์ผ ์ ์์ต๋๋ค.
DEFAULT expression
๋๋ .:= expression
๋ณ์์
expression
์ ๊ฐ์ ํ ๋นํฉ๋๋ค.
type
๋ฐexpression
์ด ๋ ๋ค ์ง์ ๋ ๊ฒฝ์ฐ, ์์ ์ผ์นํ๋ ๋ฐ์ดํฐ ํ์ ์ผ๋ก ํ๊ฐ๋์ด์ผ ํฉ๋๋ค. ํ์ ์ด ์ผ์นํ์ง ์๋ ๊ฒฝ์ฐ, ๊ฐ์ ์ง์ ๋type
์ผ๋ก ์บ์คํ ํ ์ ์์ต๋๋ค.
๋ค์ ์์์๋ ๋ธ๋ก์ DECLARE ์น์ ๊ณผ BEGIN โฆ END ์น์ ์์ ๋ณ์๋ฅผ ์ ์ธํฉ๋๋ค.
DECLARE
profit number(38, 2) DEFAULT 0.0;
BEGIN
LET cost number(38, 2) := 100.0;
LET revenue number(38, 2) DEFAULT 110.0;
profit := revenue - cost;
RETURN profit;
END;
์ฐธ๊ณ : Python Connector ์ฝ๋์์ Snowflake CLI, SnowSQL, Classic Console, ๋๋ execute_stream
๋๋ execute_string
๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ด ์์ ๋ฅผ ๋์ ์ฌ์ฉํ์ญ์์ค(Snowflake CLI, SnowSQL, Classic Console ๋ฐ Python Connector์์ Snowflake Scripting ์ฌ์ฉํ๊ธฐ ์ฐธ์กฐ).
EXECUTE IMMEDIATE
$$
DECLARE
profit number(38, 2) DEFAULT 0.0;
BEGIN
LET cost number(38, 2) := 100.0;
LET revenue number(38, 2) DEFAULT 110.0;
profit := revenue - cost;
RETURN profit;
END;
$$
;
+-----------------+
| anonymous block |
|-----------------|
| 10.00 |
+-----------------+
๋ค์ ์น์ ์์๋ ๋ณ์์ ๋ฐ์ดํฐ ํ์ ๊ณผ ๋ฒ์๊ฐ ๊ฒฐ์ ๋๋ ๋ฐฉ๋ฒ์ ์ค๋ช ํฉ๋๋ค.
๋ณ์์ ๊ฐ์ ํ ๋นํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์์ธํ ๋ด์ฉ์ ์ ์ธ๋ ๋ณ์์ ๊ฐ ํ ๋นํ๊ธฐ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
Snowflake Scripting์ด ๋ณ์์ ๋ฐ์ดํฐ ํ์ ์ ์ ์ถํ๋ ๋ฐฉ๋ฒยถ
๋ฐ์ดํฐ ํ์ ์ ๋ช ์์ ์ผ๋ก ์ง์ ํ์ง ์๊ณ ๋ณ์๋ฅผ ์ ์ธํ๋ฉด Snowflake Scripting์ ๋ณ์์ ํ ๋นํ ์์์ ๋ฐ์ดํฐ ํ์ ์ ์ ์ถํฉ๋๋ค.
์ ์ธ์์ ๋ฐ์ดํฐ ํ์ ์ ์๋ตํ๋๋ก ์ ํํ ๊ฒฝ์ฐ, ๋ค์ ์ฌํญ์ ์ ์ํ์ญ์์ค.
์์ด ํฌ๊ธฐ๊ฐ ๋ค๋ฅธ ๋ค์ํ ๋ฐ์ดํฐ ํ์ ์ผ๋ก ํด์๋ ์ ์๋ ๊ฒฝ์ฐ, ์ผ๋ฐ์ ์ผ๋ก Snowflake๋ ์ ์ฐํ๊ณ (์: NUMBER(3, 1) ์ด ์๋ FLOAT) ์ ์ฅ ์ฉ๋์ด ํฐ(์: VARCHAR(4)๊ฐ ์๋ VARCHAR) ํ์ ์ ์ ํํฉ๋๋ค.
์๋ฅผ ๋ค์ด ๋ณ์๋ฅผ ๊ฐ
12.3
์ผ๋ก ์ค์ ํ๋ฉด Snowflake๋ ๋ค์์ ํฌํจํ์ฌ ๋ณ์์ ๋ํ ์ฌ๋ฌ ๋ฐ์ดํฐ ํ์ ์ค ํ๋๋ฅผ ์ ํํ ์ ์์ต๋๋ค.NUMBER(3, 1)
NUMBER(38, 1)
FLOAT
์ด ์์์ Snowflake๋ FLOAT๋ฅผ ์ ํํฉ๋๋ค.
๋ณ์์ ๋ํ ํน์ ๋ฐ์ดํฐ ํ์ (ํนํ ์ซ์ ๋๋ ํ์์คํฌํ ํ์ )์ด ํ์ํ ๊ฒฝ์ฐ, Snowflake๋ ์ฌ์ฉ์๊ฐ ์ด๊ธฐ ๊ฐ์ ์ ๊ณตํ๋๋ผ๋ ๋ฐ์ดํฐ ํ์ ์ ๋ช ์์ ์ผ๋ก ์ง์ ํ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค.
Snowflake๊ฐ ์๋๋ ๋ฐ์ดํฐ ํ์ ์ ์ ์ถํ ์ ์๋ ๊ฒฝ์ฐ, Snowflake๋ SQL ์ปดํ์ผ ์ค๋ฅ๋ฅผ ๋ณด๊ณ ํฉ๋๋ค.
์๋ฅผ ๋ค์ด ๋ค์ ์ฝ๋๋ ๋ฐ์ดํฐ ํ์ ์ ๋ช ์์ ์ผ๋ก ์ง์ ํ์ง ์๊ณ ๋ณ์๋ฅผ ์ ์ธํฉ๋๋ค. ์ฝ๋๋ ๋ณ์๋ฅผ ์ปค์์ ๊ฐ์ผ๋ก ์ค์ ํฉ๋๋ค.
... FOR current_row IN cursor_1 DO: LET price := current_row.price_column; ...
Snowflake Scripting ๋ธ๋ก์ด ์ปดํ์ผ๋๋ฉด(์: CREATE PROCEDURE ๋ช ๋ น์ด ์คํ๋ ๋) ์ปค์๋ ์ด๋ฆฌ์ง ์๊ณ , ์ปค์์ ์๋ ์ด์ ๋ฐ์ดํฐ ํ์ ์ ์ ์ ์์ต๋๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก Snowflake๋ SQL ์ปดํ์ผ ์ค๋ฅ๋ฅผ ๋ณด๊ณ ํฉ๋๋ค.
092228 (P0000): SQL compilation error: error line 7 at position 4 variable 'PRICE' cannot have its type inferred from initializer
์ ์ธ ๋ฒ์ ์ดํดํ๊ธฐยถ
Snowflake Scripting์ ์ดํ์ ๋ฒ์ ์ง์ ์ ์ฌ์ฉํฉ๋๋ค. ๊ฐ, ๊ฒฐ๊ณผ ์ธํธ, ์ปค์ ๋๋ ์์ธ์ ๋ํ ๋ณ์๊ฐ ๋ธ๋ก์ DECLARE ์น์ ์์ ์ ์ธ๋ ๊ฒฝ์ฐ, ์ ์ธ๋ ์ค๋ธ์ ํธ์ ๋ฒ์(๋๋ ๊ฐ์์ฑ)๋ ํด๋น ๋ธ๋ก๊ณผ ํด๋น ๋ธ๋ก์ ์ค์ฒฉ๋ ๋ชจ๋ ๋ธ๋ก์ ๋๋ค.
๋ธ๋ก์ด ์ธ๋ถ ๋ธ๋ก์ ์ ์ธ๋ ์ค๋ธ์ ํธ์ ์ด๋ฆ์ด ๊ฐ์ ์ค๋ธ์ ํธ๋ฅผ ์ ์ธํ๋ ๊ฒฝ์ฐ, ๋ด๋ถ ๋ธ๋ก(๋ฐ ํด๋น ๋ธ๋ก ๋ด๋ถ์ ๋ชจ๋ ๋ธ๋ก) ๋ด์์, ๋ด๋ถ ๋ธ๋ก์ ์ค๋ธ์ ํธ๋ง ๋ฒ์ ๋ด์ ์์ต๋๋ค. ์ค๋ธ์ ํธ ์ด๋ฆ์ด ์ฐธ์กฐ๋ ๊ฒฝ์ฐ, Snowflake๋ ํ์ฌ ๋ธ๋ก์์ ๋จผ์ ์์ํ์ฌ ์ด๋ฆ์ด ์ผ์นํ๋ ์ค๋ธ์ ํธ๋ฅผ ์ฐพ์ ๋๊น์ง ๋ฐ๊นฅ์ชฝ์ผ๋ก ํ ๋ฒ์ ํ ๋ธ๋ก์ฉ ์์ ํ์ฌ, ํด๋น ์ด๋ฆ์ ๊ฐ์ง ์ค๋ธ์ ํธ๋ฅผ ์ฐพ์ต๋๋ค.
์๋ฅผ ๋ค์ด ์ ์ฅ ํ๋ก์์ ๋ด์์ ์์ธ๊ฐ ์ ์ธ๋ ๊ฒฝ์ฐ, ์์ธ์ ๋ฒ์๋ ํด๋น ์ ์ฅ ํ๋ก์์ ๋ก ์ ํ๋ฉ๋๋ค. ํด๋น ์ ์ฅ ํ๋ก์์ ์ ์ํด ํธ์ถ๋ ์ ์ฅ ํ๋ก์์ ๋ ํด๋น ์์ธ๋ฅผ ๋ฐ์์ํฌ(๋๋ ์ฒ๋ฆฌํ ) ์ ์์ต๋๋ค. ํด๋น ํ๋ก์์ ๋ฅผ ํธ์ถํ๋ ์ ์ฅ ํ๋ก์์ ๋ ํด๋น ์์ธ๋ฅผ ์ฒ๋ฆฌํ (๋๋ ๋ฐ์์ํฌ) ์ ์์ต๋๋ค.
์ ์ธ๋ ๋ณ์์ ๊ฐ ํ ๋นํ๊ธฐยถ
์ด๋ฏธ ์ ์ธ๋ ๋ณ์์ ๊ฐ์ ํ ๋นํ๋ ค๋ฉด :=
์ฐ์ฐ์๋ฅผ ์ฌ์ฉํฉ๋๋ค.
<variable_name> := <expression> ;
์ฌ๊ธฐ์:
variable_name
๋ณ์์ ์ด๋ฆ์ ๋๋ค. ์ด๋ฆ์ ์ค๋ธ์ ํธ ์๋ณ์ ์ ๋ํ ๋ช ๋ช ๊ท์น์ ๋ฐ๋ผ์ผ ํฉ๋๋ค.
expression
์์ด ํ๊ฐ๋๊ณ ๊ฒฐ๊ณผ ๊ฐ์ด ๋ณ์์ ํ ๋น๋ฉ๋๋ค.
์์ ๋ณ์ ํ์ ๊ณผ ์ผ์นํ๋ ๋ฐ์ดํฐ ํ์ ์ผ๋ก ํ๊ฐ๋์ด์ผ ํฉ๋๋ค. ์์ด ํ์ ๊ณผ ์ผ์นํ์ง ์์ผ๋ฉด ๊ฐ์ ํ์ ์ ํ์ผ๋ก ์บ์คํ ํ ์ ์์ต๋๋ค.
์์์ ๊ธฐ๋ณธ ์ ๊ณต SQL ํจ์ ๋ฐ UDFs (์ฌ์ฉ์ ์ ์ ํจ์)๋ฅผ ํฌํจํ ํจ์๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๋ณ์ ์ฌ์ฉํ๊ธฐยถ
Snowflake Scripting ์ธ์ด ์์(์: RETURN)์ ํจ๊ป ์์ ๋ณ์๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์๋ ์ฝ๋์์๋ ์์ ๋ณ์ revenue
์ cost
๋ฅผ ์ฌ์ฉํ๊ณ RETURN ๋ฌธ์ ๋ณ์ profit
์ ์ฌ์ฉํฉ๋๋ค.
DECLARE
profit NUMBER(38, 2);
revenue NUMBER(38, 2);
cost NUMBER(38, 2);
BEGIN
...
profit := revenue - cost;
...
RETURN profit;
์์ธ ์ฒ๋ฆฌ๊ธฐ(๋ธ๋ก์ EXCEPTION ์น์ )์์ ๋ณ์๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ํด๋น ๋ณ์๋ฅผ DECLARE ์น์ ์ ์ ์ธํ๊ฑฐ๋ ์ ์ฅ ํ๋ก์์ ์ ์ธ์๋ก ์ ๋ฌํด์ผ ํฉ๋๋ค. BEGIN โฆ END ์น์ ์์๋ ๋ณ์๋ฅผ ์ ์ธํ ์ ์์ต๋๋ค. ์์ธํ ๋ด์ฉ์ ์์ธ ์ฒ๋ฆฌ๊ธฐ์ ๋ณ์ ์ ๋ฌํ๊ธฐ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
ํ
๋ํ Snowflake Scripting ์ต๋ช ๋ธ๋ก๊ณผ ํธ์ถ์ ๊ถํ์ผ๋ก ์คํ๋๋ ์ ์ฅ ํ๋ก์์ ์์ SQL (์ธ์ ) ๋ณ์๋ฅผ ์ฌ์ฉํ๊ณ ์ค์ ํ ์ ์์ต๋๋ค. ์์ธํ ๋ด์ฉ์ ์ ์ฅ ํ๋ก์์ ์์ SQL ๋ณ์ ์ฌ์ฉ ๋ฐ ์ค์ ํ๊ธฐ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
SQL ๋ฌธ์์ ๋ณ์ ์ฌ์ฉํ๊ธฐ(๋ฐ์ธ๋ฉ)ยถ
SQL ๋ฌธ์์ ๋ณ์๋ฅผ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, ์ด๋ฅผ ๋ณ์ ๋ฐ์ธ๋ฉ ์ด๋ผ๊ณ ๋ ํฉ๋๋ค. ์ด๋ฅผ ์ํด์๋ ๋ณ์ ์ด๋ฆ ์์ ์ฝ๋ก ์ ๋ถ์ ๋๋ค. ์:
INSERT INTO my_table (x) VALUES (:my_variable)
์คํ๋ ๋ ์ฐ์ฐ์(**
)๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐฐ์ด ์ ๋ํ๋ด๋ ๋ฐ์ธ๋ ๋ณ์๋ฅผ ๊ฐ๋ณ ๊ฐ ๋ชฉ๋ก์ผ๋ก ํ์ฅํ ์ ์์ต๋๋ค. ์์ธํ ๋ด์ฉ์ ํ์ฅ ์ฐ์ฐ์ ์น์
์ ์ฐธ์กฐํ์ญ์์ค.
Snowflake Scripting ์ ์ฅ ํ๋ก์์ ์ ๋ฐ์ธ๋ฉ ๋ณ์์ ๋ํ ์์ธํ ๋ด์ฉ์ SQL ๋ฌธ์์ ์ธ์ ์ฌ์ฉํ๊ธฐ(๋ฐ์ธ๋ฉ) ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
๋ณ์๋ฅผ ์ค๋ธ์ ํธ์ ์ด๋ฆ์ผ๋ก ์ฌ์ฉํ๋ ๊ฒฝ์ฐ(์: SELECT ๋ฌธ์ FROM ์ ์ ์๋ ํ ์ด๋ธ์ ์ด๋ฆ) IDENTIFIER ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ณ์๊ฐ ์ค๋ธ์ ํธ ์๋ณ์๋ฅผ ๋ํ๋์ ํ์ํฉ๋๋ค. ์:
SELECT COUNT(*) FROM IDENTIFIER(:table_name)
์์์ ๋ณ์๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ Snowflake Scripting ์ธ์ด ์์ (์: RETURN)๋ฅผ ํจ๊ป ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๋ณ์ ์์ ์ฝ๋ก ์ ์ ๋์ฌ๋ก ๋ถ์ผ ํ์๊ฐ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด, ๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ์๋ ์ฝ๋ก ์ ๋์ฌ๊ฐ ํ์ํ์ง ์์ต๋๋ค.
RETURN๊ณผ ํจ๊ป ๋ณ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ. ์ด ์์์๋ ๋ณ์
profit
์ด Snowflake Scripting ์ธ์ด ์์์ ํจ๊ป ์ฌ์ฉ๋๋ฉฐ ์ฝ๋ก ์ ๋์ฌ๊ฐ ๋ถํ์ํฉ๋๋ค.RETURN profit;
์คํํ SQL ๋ฌธ์ ํฌํจํ ๋ฌธ์์ด์ ์์ฑ ์ค์ธ ๊ฒฝ์ฐ. ์ด ์์์๋ ๋ณ์
id_variable
์ด ์์ ์ฌ์ฉ๋๋ฉฐ ์ฝ๋ก ์ ๋์ฌ๊ฐ ๋ถํ์ํฉ๋๋ค.LET select_statement := 'SELECT * FROM invoices WHERE id = ' || id_variable;
๋ํ TO_QUERY ํจ์๋ SELECT ๋ฌธ์ FROM ์ ์์ ์ง์ SQL ๋ฌธ์์ด์ ๋ฐ๋ ๊ฐ๋จํ ๊ตฌ๋ฌธ์ ์ ๊ณตํฉ๋๋ค. TO_QUERY ํจ์์ ๋์ SQL์ ๋น๊ต๋ ๋ฐํ์์ SQL ๊ตฌ์ฑํ๊ธฐ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
SELECT ๋ฌธ์ ๊ฒฐ๊ณผ์ ๋ํ ๋ณ์ ์ค์ ํ๊ธฐยถ
Snowflake Scripting ๋ธ๋ก์์ INTO ์ ์ ์ฌ์ฉํด ๋ณ์๋ฅผ SELECT ์ ์ ์ง์ ๋ ์์ ๊ฐ์ผ๋ก ์ค์ ํ ์ ์์ต๋๋ค.
SELECT <expression1>, <expression2>, ... INTO :<variable1>, :<variable2>, ... FROM ... WHERE ...;
์ด ๊ตฌ๋ฌธ์ ์ฌ์ฉํ ๋ ๋ค์ ์ฌํญ์ด ์ ์ฉ๋ฉ๋๋ค.
variable1
์expression1
์ ๊ฐ์ผ๋ก ์ค์ ๋ฉ๋๋ค.variable2
๋expression2
์ ๊ฐ์ผ๋ก ์ค์ ๋ฉ๋๋ค.
SELECT ๋ฌธ์ ๋จ์ผ ํ์ ๋ฐํํด์ผ ํฉ๋๋ค.
๋ค์ ์์๋ ๋จ์ผ ํ์ ๋ฐํํ๋ SELECT ๋ฌธ์ด ํฌํจ๋์ด ์์ต๋๋ค. ์ด ์์์๋ ๋ค์ ํ ์ด๋ธ์ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
CREATE OR REPLACE TABLE some_data (id INTEGER, name VARCHAR);
INSERT INTO some_data (id, name) VALUES
(1, 'a'),
(2, 'b');
์ด ์์์๋ Snowflake Scripting ๋ณ์ id
๋ฐ name
์ ํด๋น ์ด๋ฆ์ด ์๋ ์ด์ ๋ํด ๋ฐํ๋ ๊ฐ์ผ๋ก ์ค์ ํฉ๋๋ค.
DECLARE
id INTEGER;
name VARCHAR;
BEGIN
SELECT id, name INTO :id, :name FROM some_data WHERE id = 1;
RETURN id || ' ' || name;
END;
์ฐธ๊ณ : Python Connector ์ฝ๋์์ Snowflake CLI, SnowSQL, Classic Console, ๋๋ execute_stream
๋๋ execute_string
๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ด ์์ ๋ฅผ ๋์ ์ฌ์ฉํ์ญ์์ค(Snowflake CLI, SnowSQL, Classic Console ๋ฐ Python Connector์์ Snowflake Scripting ์ฌ์ฉํ๊ธฐ ์ฐธ์กฐ).
EXECUTE IMMEDIATE $$
DECLARE
id INTEGER;
name VARCHAR;
BEGIN
SELECT id, name INTO :id, :name FROM some_data WHERE id = 1;
RETURN :id || ' ' || :name;
END;
$$
;
์ด ์์์๋ SELECT ๋ฌธ์ ์ํด ๋ฐํ๋ ํ์์ id
๋ฐ name
์ ์ถ๋ ฅํฉ๋๋ค.
+-----------------+
| anonymous block |
|-----------------|
| 1 a |
+-----------------+
๋ณ์๋ฅผ ์ ์ฅ ํ๋ก์์ ์ ๋ฐํ ๊ฐ์ผ๋ก ์ค์ ํ๊ธฐยถ
์ ์ฅ ํ๋ก์์ ํธ์ถ์์ ๋ฐํ๋ ๊ฐ ์ฌ์ฉํ๊ธฐ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
๋ณ์ ์ฌ์ฉ์ ์ยถ
๋ค์ ์์์๋ ๋ณ์๋ฅผ ์ ์ธํ๊ณ , ๋ณ์์ ๊ฐ์ด๋ ์์ ํ ๋นํ๊ณ , ๋ณ์์ ๋ฐ์ดํฐ ํ์ ์ ๊ฐ์ ์บ์คํ ํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค.
DECLARE
w INTEGER;
x INTEGER DEFAULT 0;
dt DATE;
result_string VARCHAR;
BEGIN
w := 1; -- Assign a value.
w := 24 * 7; -- Assign the result of an expression.
dt := '2020-09-30'::DATE; -- Explicit cast.
dt := '2020-09-30'; -- Implicit cast.
result_string := w::VARCHAR || ', ' || dt::VARCHAR;
RETURN result_string;
END;
์ฐธ๊ณ : Python Connector ์ฝ๋์์ Snowflake CLI, SnowSQL, Classic Console, ๋๋ execute_stream
๋๋ execute_string
๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ด ์์ ๋ฅผ ๋์ ์ฌ์ฉํ์ญ์์ค(Snowflake CLI, SnowSQL, Classic Console ๋ฐ Python Connector์์ Snowflake Scripting ์ฌ์ฉํ๊ธฐ ์ฐธ์กฐ).
EXECUTE IMMEDIATE $$
DECLARE
w INTEGER;
x INTEGER DEFAULT 0;
dt DATE;
result_string VARCHAR;
BEGIN
w := 1; -- Assign a value.
w := 24 * 7; -- Assign the result of an expression.
dt := '2020-09-30'::DATE; -- Explicit cast.
dt := '2020-09-30'; -- Implicit cast.
result_string := w::VARCHAR || ', ' || dt::VARCHAR;
RETURN result_string;
END;
$$
;
+-----------------+
| anonymous block |
|-----------------|
| 168, 2020-09-30 |
+-----------------+
๋ค์ ์์์๋ ์์ ๊ธฐ๋ณธ ์ ๊ณต SQL ํจ์๋ฅผ ์ฌ์ฉํฉ๋๋ค.
my_variable := SQRT(variable_x);
๋ค์ ์ ์ธ์ ๊ฐ ๋ณ์์ ๋ํด ์๋๋ ๋ฐ์ดํฐ ํ์
์ ์ด๊ธฐ ๊ฐ์ ์ง์ ํ์ฌ ๋ณ์ profit
, cost
, revenue
์ ๋ฐ์ดํฐ ํ์
์ ์์์ ์ผ๋ก ์ง์ ํฉ๋๋ค.
์ด ์์์๋ LET ๋ฌธ์ ์ฌ์ฉํ์ฌ ๋ธ๋ก์ DECLARE ๋ถ๋ถ ์ธ๋ถ์ cost
๋ฐ revenue
๋ณ์๋ฅผ ์ ์ธํ๋ ๋ฐฉ๋ฒ๋ ๋ณด์ฌ์ค๋๋ค.
DECLARE
profit number(38, 2) DEFAULT 0.0;
BEGIN
LET cost number(38, 2) := 100.0;
LET revenue number(38, 2) DEFAULT 110.0;
profit := revenue - cost;
RETURN profit;
END;
์ฐธ๊ณ : Python Connector ์ฝ๋์์ Snowflake CLI, SnowSQL, Classic Console, ๋๋ execute_stream
๋๋ execute_string
๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ด ์์ ๋ฅผ ๋์ ์ฌ์ฉํ์ญ์์ค(Snowflake CLI, SnowSQL, Classic Console ๋ฐ Python Connector์์ Snowflake Scripting ์ฌ์ฉํ๊ธฐ ์ฐธ์กฐ).
EXECUTE IMMEDIATE $$
DECLARE
profit DEFAULT 0.0;
BEGIN
LET cost := 100.0;
LET revenue DEFAULT 110.0;
profit := revenue - cost;
RETURN profit;
END;
$$
;
+-----------------+
| anonymous block |
|-----------------|
| 10 |
+-----------------+
๋ค์ ์๋ ๋ณ์์ ๋ฒ์๋ฅผ ๋ณด์ฌ์ค๋๋ค. ์ด ์์๋ ์ด๋ฆ์ ๊ฐ์ง๋ง ๋ฒ์๊ฐ ๋ค๋ฅธ ๋ ๊ฐ์ ๋ณ์์ ๋งค๊ฐ ๋ณ์๊ฐ ํฌํจ๋์ด ์์ต๋๋ค.
์ด ์์๋ ์ธ ๊ฐ์ง ๋ธ๋ก, ์ฆ ๊ฐ์ฅ ๋ฐ๊นฅ์ชฝ, ์ค๊ฐ, ๊ฐ์ฅ ์์ชฝ ๋ธ๋ก์ด ์์ต๋๋ค.
๊ฐ์ฅ ์์ชฝ ๋ธ๋ก ๋ด์์ PV_NAME์ ๊ฐ์ฅ ์์ชฝ ๋ธ๋ก์์ ์ ์ธ๋๊ณ ์ค์ ๋ ๋ณ์(
innermost block variable
๋ก ์ค์ ๋จ)๋ก ํด์๋ฉ๋๋ค.์ค๊ฐ ๋ธ๋ก ๋ด์์(๋ฐ ๊ฐ์ฅ ์์ชฝ ๋ธ๋ก์ ์ธ๋ถ์์) PV_NAME์ ์ค๊ฐ ๋ธ๋ก์์ ์ ์ธ๋๊ณ ์ค์ ๋ ๋ณ์(
middle block variable
๋ก ์ค์ ๋จ)๋ก ํด์๋ฉ๋๋ค.๊ฐ์ฅ ๋ฐ๊นฅ์ชฝ ๋ธ๋ก ๋ด์์(๋ฐ ์ค์ฒฉ ๋ธ๋ก์ ์ธ๋ถ์์) PV_NAME์ ์ ์ฅ ํ๋ก์์ ์ ์ ๋ฌ๋ ๋งค๊ฐ ๋ณ์(CALL ๋ฌธ์ ์ํด
parameter
๋ก ์ค์ ๋จ)๋ก ํ์ธ๋ฉ๋๋ค.
์ด ์์ ์์๋ ๋ค์ ํ ์ด๋ธ์ ์ฌ์ฉํฉ๋๋ค.
CREATE OR REPLACE TABLE names (v VARCHAR);
์ด ์์ ์์, ๊ฐ์ฅ ์์ชฝ ๋ธ๋ก์ PV_NAME์ ๋ฌธ์์ด innermost block variable
์ ํ ๋นํด๋ ์ค๊ฐ ๋ธ๋ก์ ๋ณ์ ๊ฐ์๋ ์ํฅ์ ๋ฏธ์น์ง ์์ต๋๋ค. ๊ฐ์ฅ ์์ชฝ ๋ธ๋ก์ ๋ณ์๋ ์ค๊ฐ ๋ธ๋ก์ ๋ณ์์ ๋ค๋ฆ
๋๋ค. ๋ ๋ณ์์ ์ด๋ฆ์ด ๊ฐ๋๋ผ๋ ๋ง์ฐฌ๊ฐ์ง์
๋๋ค.
CREATE OR REPLACE PROCEDURE duplicate_name(pv_name VARCHAR)
RETURNS VARCHAR
LANGUAGE SQL
AS
BEGIN
DECLARE
PV_NAME VARCHAR;
BEGIN
PV_NAME := 'middle block variable';
DECLARE
PV_NAME VARCHAR;
BEGIN
PV_NAME := 'innermost block variable';
INSERT INTO names (v) VALUES (:PV_NAME);
END;
-- Because the innermost and middle blocks have separate variables
-- named "pv_name", the INSERT below inserts the value
-- 'middle block variable'.
INSERT INTO names (v) VALUES (:PV_NAME);
END;
-- This inserts the value of the input parameter.
INSERT INTO names (v) VALUES (:PV_NAME);
RETURN 'Completed.';
END;
์ฐธ๊ณ : Python Connector ์ฝ๋์์ Snowflake CLI, SnowSQL, Classic Console, ๋๋ execute_stream
๋๋ execute_string
๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ด ์์ ๋ฅผ ๋์ ์ฌ์ฉํ์ญ์์ค(Snowflake CLI, SnowSQL, Classic Console ๋ฐ Python Connector์์ Snowflake Scripting ์ฌ์ฉํ๊ธฐ ์ฐธ์กฐ).
CREATE OR REPLACE PROCEDURE duplicate_name(pv_name VARCHAR)
RETURNS VARCHAR
LANGUAGE SQL
AS
$$
BEGIN
DECLARE
PV_NAME VARCHAR;
BEGIN
PV_NAME := 'middle block variable';
DECLARE
PV_NAME VARCHAR;
BEGIN
PV_NAME := 'innermost block variable';
INSERT INTO names (v) VALUES (:PV_NAME);
END;
-- Because the innermost and middle blocks have separate variables
-- named "pv_name", the INSERT below inserts the value
-- 'middle block variable'.
INSERT INTO names (v) VALUES (:PV_NAME);
END;
-- This inserts the value of the input parameter.
INSERT INTO names (v) VALUES (:PV_NAME);
RETURN 'Completed.';
END;
$$
;
์ ์ฅ ํ๋ก์์ ๋ฅผ ํธ์ถํฉ๋๋ค.
CALL duplicate_name('parameter');
ํ ์ด๋ธ์ ๊ฐ์ ํ์ธํฉ๋๋ค.
SELECT *
FROM names
ORDER BY v;
+--------------------------+
| V |
|--------------------------|
| innermost block variable |
| middle block variable |
| parameter |
+--------------------------+
์ถ๋ ฅ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๊ฐ์ฅ ์์ชฝ์ ์ค์ฒฉ๋ ๋ธ๋ก(๋ ๊ฐ์ ๋ ์ด์ด๊ฐ ์ค์ฒฉ๋จ)์๋ ๋ด๋ถ ๋ธ๋ก์ ๋ณ์
PV_NAME
์ด ์ฌ์ฉ๋์์ต๋๋ค.์ค๊ฐ ๋ธ๋ก(ํ ๋ ์ด์ด๊ฐ ์ค์ฒฉ๋จ)์์๋ ์ค๊ฐ ๋ธ๋ก์ ๋ณ์
PV_NAME
์ด ์ฌ์ฉ๋์์ต๋๋ค.๊ฐ์ฅ ๋ฐ๊นฅ์ชฝ ๋ธ๋ก์๋ ๋งค๊ฐ ๋ณ์๊ฐ ์ฌ์ฉ๋์์ต๋๋ค.
์ปค์๋ฅผ ์ด ๋ ๋ณ์๋ฅผ ๋ฐ์ธ๋ฉํ๋ ์๋ ์ปค์ ์ด๊ธฐ์ ์ ๋ฅผ ์ฐธ์กฐํ์ญ์์ค.