CREATE EXTERNAL FUNCTIONยถ
์ ์ธ๋ถ ํจ์ ๋ฅผ ๋ง๋ญ๋๋ค.
์ด ๋ช ๋ น์ ๋ค์ ๋ณํ์ ์ง์ํฉ๋๋ค.
CREATE OR ALTER EXTERNAL FUNCTION: ์ธ๋ถ ํจ์๊ฐ ์๋ ๊ฒฝ์ฐ ์ธ๋ถ ํจ์๋ฅผ ์์ฑํ๊ฑฐ๋ ๊ธฐ์กด ์ธ๋ถ ํจ์๋ฅผ ๋ณ๊ฒฝํฉ๋๋ค.
- ์ฐธ๊ณ ํญ๋ชฉ:
ALTER FUNCTION , SHOW EXTERNAL FUNCTIONS , DROP FUNCTION , DESCRIBE FUNCTION , CREATE API INTEGRATION, CREATE OR ALTER <์ค๋ธ์ ํธ>
๊ตฌ๋ฌธยถ
CREATE [ OR REPLACE ] [ SECURE ] EXTERNAL FUNCTION <name> ( [ <arg_name> <arg_data_type> ] [ , ... ] )
RETURNS <result_data_type>
[ [ NOT ] NULL ]
[ { CALLED ON NULL INPUT | { RETURNS NULL ON NULL INPUT | STRICT } } ]
[ { VOLATILE | IMMUTABLE } ]
[ COMMENT = '<string_literal>' ]
API_INTEGRATION = <api_integration_name>
[ HEADERS = ( '<header_1>' = '<value_1>' [ , '<header_2>' = '<value_2>' ... ] ) ]
[ CONTEXT_HEADERS = ( <context_function_1> [ , <context_function_2> ...] ) ]
[ MAX_BATCH_ROWS = <integer> ]
[ COMPRESSION = <compression_type> ]
[ REQUEST_TRANSLATOR = <request_translator_udf_name> ]
[ RESPONSE_TRANSLATOR = <response_translator_udf_name> ]
AS '<url_of_proxy_and_resource>';
๋ฒ ๋ฆฌ์ธํธ ๊ตฌ๋ฌธยถ
CREATE OR ALTER EXTERNAL FUNCTIONยถ
์์ง ์กด์ฌํ์ง ์๋ ์ธ๋ถ ํจ์๋ฅผ ์๋ก ๋ง๋ค๊ฑฐ๋ ๊ธฐ์กด ์ธ๋ถ ํจ์๋ฅผ ๋ฌธ์ ์ ์๋ ํจ์๋ก ๋ณํํฉ๋๋ค. CREATE OR ALTER EXTERNAL FUNCTION ๋ฌธ์ CREATE EXTERNAL FUNCTION ๋ฌธ์ ๊ตฌ๋ฌธ ๊ท์น์ ๋ฐ๋ฅด๋ฉฐ ALTER FUNCTION ๋ฌธ๊ณผ ์ ํ ์ฌํญ์ด ๋์ผํฉ๋๋ค.
์ง์๋๋ ํจ์ ๋ณ๊ฒฝ์๋ ๋ค์๊ณผ ๊ฐ์ ๋ณ๊ฒฝ ์ฌํญ์ด ํฌํจ๋ฉ๋๋ค.
API_INTEGRATION
COMMENTS
COMPRESSION
CONTEXT_HEADERS
HEADERS
MAX_BATCH_ROWS
RESPONSE_TRANSLATOR
REQUEST_TRANSLATOR
SECURE
์์ธํ ๋ด์ฉ์ CREATE OR ALTER EXTERNAL FUNCTION ์ฌ์ฉ๋ฒ ๋ ธํธ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
CREATE [ OR ALTER ] EXTERNAL FUNCTION ...
ํ์ ๋งค๊ฐ ๋ณ์ยถ
name
:ํจ์์ ์๋ณ์๋ฅผ ์ง์ ํฉ๋๋ค.
์ด ์๋ณ์์๋ ํจ์ ์ด๋ฆ๋ฟ ์๋๋ผ ์คํค๋ง ์ด๋ฆ๊ณผ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ด๋ฆ๋ ํฌํจ๋ ์ ์์ต๋๋ค.
ํจ์๋ ๊ทธ ์ด๋ฆ๊ณผ ์ธ์ ์ ํ์ผ๋ก ์๋ณ๊ณผ ํ์ธ์ด ์ด๋ฃจ์ด์ง๋ฏ๋ก ํจ์๊ฐ ์์ฑ๋๋ ์คํค๋ง์ ๋ํด ๊ณ ์ ํ ์๋ณ์์ผ ํ์๋ ์์ต๋๋ค. ํ์ง๋ง ์คํค๋ง ๋ด์์ ์๋ช (์ด๋ฆ ๋ฐ ์ธ์ ๋ฐ์ดํฐ ํ์ )์ ๊ณ ์ ํด์ผ ํฉ๋๋ค.
name
์ Snowflake ์๋ณ์ ์ ๋ํ ๊ท์น์ ๋ฐ๋ผ์ผ ํฉ๋๋ค. ์์ธํ ๋ด์ฉ์ ์๋ณ์ ์๊ตฌ ์ฌํญ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.name
์ ์๊ฒฉ ์๋น์ค ์ด๋ฆ๊ณผ ๋๊ฐ์ด ์ค์ ํ๋ฉด ๊ด๊ณ๋ฅผ ๋ ๋ช ํํ๊ฒ ํ ์ ์์ต๋๋ค. ํ์ง๋ง ์ด๊ฒ์ด ํ์์ ์ธ ๊ฒ์ ์๋๋๋ค.( [ arg_name arg_data_type ] [ , ... ] )
์ธ๋ถ ํจ์์ ์ธ์/์ ๋ ฅ๊ฐ์ ์ง์ ํฉ๋๋ค. ์ด๋ ์๊ฒฉ ์๋น์ค๊ฐ ์์ํ๋ ์ธ์์ ์ผ์นํด์ผ ํฉ๋๋ค.
์ธ์๊ฐ ์์ผ๋ฉด ์ธ์ ์ด๋ฆ๊ณผ ๋ฐ์ดํฐ ํ์ ์์ด ๊ดํธ๋ฅผ ํฌํจํ์ญ์์ค.
RETURNS result_data_type
ํจ์๊ฐ ๋ฐํํ๋ ๋ฐ์ดํฐ ํ์ ์ ์ง์ ํฉ๋๋ค.
API_INTEGRATION = api_integration_name
์ด๊ฒ์ ํ๋ก์ ์๋น์ค ํธ์ถ์ ์ธ์ฆ์ ์ฌ์ฉํด์ผ ํ๋ API ํตํฉ ์ค๋ธ์ ํธ์ ์ด๋ฆ์ ๋๋ค.
AS 'url_of_proxy_and_resource'
์ด๊ฒ์ Snowflake๊ฐ ์๊ฒฉ ์๋น์ค(์: API Gateway ๋๋ API Management ์๋น์ค)๋ฅผ ํธ์ถํ๋ ์๋จ์ด ๋๋ ํ๋ก์ ์๋น์ค์ ๋ฆฌ์์ค์ ํธ์ถ URL์ ๋๋ค.
์ ํ์ ๋งค๊ฐ ๋ณ์ยถ
SECURE
ํจ์๊ฐ ์์ ํ ๊ฒ์ผ๋ก ์ง์ ํฉ๋๋ค. ํจ์๊ฐ ์์ ํ ๊ฒฝ์ฐ URL, HTTP ํค๋ ๋ฐ ์ปจํ ์คํธ ํค๋๋ ํจ์์ ์์ ์๊ฐ ์๋ ๋ชจ๋ ์ฌ์ฉ์๋ก๋ถํฐ ์จ๊ฒจ์ง๋๋ค.
[ [ NOT ] NULL ]
์ด ์ ์ ํจ์๊ฐ NULL ๊ฐ์ ๋ฐํํ ์ ์๊ฑฐ๋ NON-NULL ๊ฐ๋ง ๋ฐํํด์ผ ํ ์ง ์ฌ๋ถ๋ฅผ ๋ํ๋ ๋๋ค.
NOT NULL
์ ์ง์ ํ ๊ฒฝ์ฐ ์ด ํจ์๋ NULL์ด ์๋ ๊ฐ๋ง ๋ฐํํด์ผ ํฉ๋๋ค.NULL
์ ์ง์ ํ ๊ฒฝ์ฐ ์ด ํจ์๋ NULL ๊ฐ์ ๋ฐํํ ์ ์์ต๋๋ค.๊ธฐ๋ณธ๊ฐ: ๊ธฐ๋ณธ๊ฐ์ NULL์ ๋๋ค(์ฆ, ์ด ํจ์๋ NULL ๊ฐ์ ๋ฐํํ ์ ์์).
CALLED ON NULL INPUT
๋๋ .{ RETURNS NULL ON NULL INPUT | STRICT }
null ์ ๋ ฅ์ผ๋ก ํธ์ถ ์ ํจ์์ ๋์์ ์ง์ ํฉ๋๋ค. ์ ๋ ฅ๊ฐ์ด null์ผ ๋ ํญ์ null์ ๋ฐํํ๋ ์์คํ ์ ์ ํจ์์๋ ๋ฐ๋๋ก, ์ธ๋ถ ํจ์๋ null ์ ๋ ฅ์ ์ฒ๋ฆฌํ์ฌ ์ ๋ ฅ๊ฐ์ด null์ผ ๋๋ null์ด ์๋ ๊ฐ์ ๋ฐํํ ์ ์์ต๋๋ค.
CALLED ON NULL INPUT
์ ํญ์ null ์ ๋ ฅ์ผ๋ก ํจ์๋ฅผ ํธ์ถํฉ๋๋ค. ๊ทธ์ ๊ฐ์ ๊ฐ์ ์ ์ ํ ์ฒ๋ฆฌํ๋ ๊ฒ์ ์ด ํจ์์ ๋ฌ๋ ค ์์ต๋๋ค.์ ๋ ฅ๊ฐ์ด null์ธ ๊ฒฝ์ฐ
RETURNS NULL ON NULL INPUT
(๋๋ ๊ทธ ๋์์ด์ธSTRICT
)์ ํจ์๋ฅผ ํธ์ถํ์ง ์์ต๋๋ค. ๋์ , ํด๋น ํ์ ๋ํด ํญ์ null ๊ฐ์ด ๋ฐํ๋ฉ๋๋ค. ์ด ํจ์๋ null์ด ์๋ ์ ๋ ฅ๊ฐ์ ๋ํด ์ฌ์ ํ null์ ๋ฐํํ ์๋ ์์ต๋๋ค.
๊ธฐ๋ณธ๊ฐ:
CALLED ON NULL INPUT
{ VOLATILE | IMMUTABLE }
๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ ๋ ํจ์์ ๋์์ ์ง์ ํฉ๋๋ค.
VOLATILE
: (์: ๋น๊ฒฐ์ ์ฑ ๋ฐ ์ํ ์ ์ฅ์ผ๋ก ์ธํด) ์ด ํจ์๋ ๋๊ฐ์ ์ ๋ ฅ์ ๋ํด์๋ ๋ค๋ฅธ ํ์ ๋ํด ๋ค๋ฅธ ๊ฐ์ ๋ฐํํ ์ ์์ต๋๋ค.IMMUTABLE
: ์ด ํจ์๋ ๋๊ฐ์ ์ ๋ ฅ์ผ๋ก ํธ์ถ ์ ํญ์ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํฉ๋๋ค. Snowflake๋ ์ด๋ฅผ ํ์ธํ๊ฑฐ๋ ๋ณด์ฆํ์ง ์์ผ๋ฉฐ, ์๊ฒฉ ์๋น์ค๋ ์ด๋ฌํ ๋ฐฉ์์ผ๋ก ๋์ํ๋๋ก ์ค๊ณํด์ผ ํฉ๋๋ค. ๊ฐ์ ์ ๋ ฅ์ ๋ํด ์ค์ ๋ก ๋ค๋ฅธ ๊ฐ์ ๋ฐํํ๋ ํจ์์ ๋ํดIMMUTABLE
์ ์ง์ ํ๋ฉด ์ ์๋์ง ์์ ๋์์ด ์ด๋ฃจ์ด์ง๋๋ค.
๊ธฐ๋ณธ๊ฐ:
VOLATILE
Snowflake์์๋ ๊ธฐ๋ณธ๊ฐ์ ์๋ฝํ๋ ๋์ ์ด ๊ฐ์ ๋ช ์์ ์ผ๋ก ์ค์ ํ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค. ์ด ๊ฐ์ ๋ช ์์ ์ผ๋ก ์ค์ ํ๋ฉด ์ค๋ฅ ๊ฐ๋ฅ์ฑ์ด ์ค์ด๋ค๊ณ ์ฌ์ฉ์์๊ฒ ํจ์์ ๋์ ๋ฐฉ์์ ์๋ ค์ค ์ ์์ต๋๋ค. (SHOW EXTERNAL FUNCTIONS ๋ช ๋ น์ ํจ์๊ฐ ํ๋ฐ์ฑ์ธ์ง ๋ณ๊ฒฝํ ์ ์๋์ง ์ฌ๋ถ๋ฅผ ๋ณด์ฌ์ค๋๋ค.)
VOLATILE ๋ฐ IMMUTABLE ์ธ๋ถ ํจ์์ ๋ํ ์ค์ํ ์ถ๊ฐ ์ ๋ณด๋ ํจ์๋ฅผ ํ๋ฐ์ฑ ๋๋ ๋ณ๊ฒฝ ๋ถ๊ฐ๋ฅ์ผ๋ก ๋ถ๋ฅํ๊ธฐ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
COMMENT = 'string_literal'
SHOW FUNCTIONS ๋ฐ SHOW EXTERNAL FUNCTIONS ์ถ๋ ฅ์ DESCRIPTION ์ด์ ํ์๋๋ ํจ์์ ๋ํ ์ค๋ช ์ ์ง์ ํฉ๋๋ค.
๊ธฐ๋ณธ๊ฐ:
user-defined function
HEADERS = ( 'header_1' = 'value_1' [ , 'header_2' = 'value_2' ... ] )
์ฌ์ฉ์๋ ์ด ์ ์ ํตํด ๋ชจ๋ ์์ฒญ๊ณผ ํจ๊ป ์ ์ก๋๋ ํค-๊ฐ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ง์ ํ ์ ์์ต๋๋ค. ์ธ๋ถ ํจ์ ์์ฑ์๋ ํค๋์ ๋ค์ด๊ฐ ๋ด์ฉ์ ๊ฒฐ์ ํ๋ฉฐ ํธ์ถ์๋ ์ด์ ๋ํ ์ ์ด ๊ถํ์ด ์์ต๋๋ค. Snowflake๋ ์ง์ ๋ ๋ชจ๋ ํค๋ ์ด๋ฆ ์์ ์ ๋์ฌ โsf-custom-โ๋ฅผ ์ถ๊ฐํ์ฌ HTTP ํค๋๋ก ๋ณด๋ ๋๋ค.
์ด ๊ฐ์ ์์ด ์๋ ์์ ๋ฌธ์์ด์ด์ด์ผ ํฉ๋๋ค.
ํ ์๋ฅผ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
HEADERS = ( 'volume-measure' = 'liters', 'distance-measure' = 'kilometers' )
์ด๋ก ์ธํด Snowflake๋ ๋ชจ๋ HTTPS ์์ฒญ์ 2๊ฐ์ HTTP ํค๋
sf-custom-volume-measure
์sf-custom-distance-measure
๋ฅผ ํด๋น ๊ฐ๊ณผ ํจ๊ป ์ถ๊ฐํฉ๋๋ค.ํค๋ ์ด๋ฆ์ ๋ํ ๊ท์น์ Snowflake ๋ฐ์ดํฐ๋ฒ ์ด์ค ์๋ณ์์ ๋ํ ๊ท์น๊ณผ ๋ค๋ฆ ๋๋ค. ํค๋ ์ด๋ฆ์ ๋ค์์ ์ ์ธํ๊ณ ๊ฐ์ฅ ๋ง์ด ๋ณผ ์ ์๋ ํ์ค ASCII ๋ฌธ์(์ญ์ง์ 32 - 126)๋ก ๊ตฌ์ฑํ ์ ์์ต๋๋ค.
๊ณต๋ฐฑ ๋ฌธ์
(
)
,
/
:
;
<
>
=
"
?
@
[
]
\
{
}
_
ํนํ ํค๋ ์ด๋ฆ์๋ ๋ฐ์ค ๋ฌธ์๋ฅผ ์ธ ์ ์๋ค๋ ์ ์ ์ ์ํ์ญ์์ค.
ํค๋ ์ด๋ฆ๊ณผ ๊ฐ์ ์์๋ฐ์ดํ๋ก ๊ตฌ๋ถ๋๋ฏ๋ก, ํค๋ ์ด๋ฆ ๋๋ ๊ฐ ๋ด์ ์์๋ฐ์ดํ๋ ๋ชจ๋ ๋ฐฑ์ฌ๋์ ๋ฌธ์๋ก ์ด์ค์ผ์ดํํด์ผ ํฉ๋๋ค.
๋ฐฑ์ฌ๋์ ๋ฌธ์๊ฐ ํค๋ ๊ฐ ๋ด์์ ๋ฆฌํฐ๋ด ๋ฌธ์๋ก ์ฌ์ฉ๋๋ ๊ฒฝ์ฐ ์ด ๋ฌธ์๋ฅผ ์ด์ค์ผ์ดํํด์ผ ํฉ๋๋ค.
ํค๋ ๊ฐ์๋ ๊ณต๋ฐฑ๊ณผ ํญ์ด ๋ชจ๋ ํ์ฉ๋์ง๋ง, ํค๋ ๊ฐ์ ํ ํ์ ๊ณต๋ฐฑ ๋ฌธ์๋ฅผ ๋ ๊ฐ ์ด์ ํฌํจํ๋ฉด ์ ๋ฉ๋๋ค. ์ด ์ ํ์ ๊ฐ๋ณ ๊ณต๋ฐฑ ๋ฌธ์(์: ์ฐ์์ผ๋ก ๋ ๊ฐ์ ๊ณต๋ฐฑ)๋ฟ ์๋๋ผ ๊ณต๋ฐฑ ๋ฌธ์์ ์กฐํฉ(์: ๊ณต๋ฐฑ ๋ค์์ ํญ)์๋ ์ ์ฉ๋ฉ๋๋ค.
ํจ์ ์์ฑ์๊ฐ (
CREATE SECURE EXTERNAL FUNCTION...
์ ์ฌ์ฉํ์ฌ) ํจ์๋ฅผ ๋ณด์์ผ๋ก ํ์ํ๋ฉด ํค๋, ์ปจํ ์คํธ ํค๋, ์ด์ง ์ปจํ ์คํธ ํค๋, URL์ ํจ์ ์ฌ์ฉ์์๊ฒ ํ์๋์ง ์์ต๋๋ค.์ธ๋ถ ํจ์์ ๋ํ ํค๋ ์ด๋ฆ์ ํฌ๊ธฐ์ ํค๋ ๊ฐ์ ํฉ์ด 8KB๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์์ผ ํฉ๋๋ค.
CONTEXT_HEADERS = ( context_function_1 [ , context_function_2 ...] )
์ด๋ HEADERS ์ ์ ์ฌํ์ง๋ง, ์์ ๋ฌธ์์ด์ ์ฌ์ฉํ๋ ๋์ Snowflake ์ปจํ ์คํธ ํจ์ ๊ฒฐ๊ณผ๋ฅผ HTTP ํค๋์ ๋ฐ์ธ๋ฉํฉ๋๋ค. (Snowflake ์ปจํ ์คํธ ํจ์์ ๋ํ ์์ธํ ๋ด์ฉ์ ์ปจํ ์คํธ ํจ์ ๋ฅผ ์ฐธ์กฐํ์ญ์์ค.)
๋ชจ๋ ์ปจํ ์คํธ ํจ์๊ฐ ์ปจํ ์คํธ ํค๋์์ ์ง์๋๋ ๊ฒ์ ์๋๋๋ค. ๋ค์ ํจ์๊ฐ ์ง์๋ฉ๋๋ค.
CURRENT_ACCOUNT()
CURRENT_CLIENT()
CURRENT_DATABASE()
CURRENT_DATE()
CURRENT_IP_ADDRESS()
CURRENT_REGION()
CURRENT_ROLE()
CURRENT_SCHEMA()
CURRENT_SCHEMAS()
CURRENT_SESSION()
CURRENT_STATEMENT()
CURRENT_TIME()
CURRENT_TIMESTAMP()
CURRENT_TRANSACTION()
CURRENT_USER()
CURRENT_VERSION()
CURRENT_WAREHOUSE()
LAST_QUERY_ID()
LAST_TRANSACTION()
LOCALTIME()
LOCALTIMESTAMP()
ํจ์ ์ด๋ฆ์ด CONTEXT_HEADERS ์ ์ ๋์ด๋์ด ์์ ๋๋ ํจ์ ์ด๋ฆ์ ๋ฐ์ดํ๋ก ๋ฌถ์ผ๋ฉด ์ ๋ฉ๋๋ค.
Snowflake๋ ํค๋ ์์
sf-context
๋ฅผ ์ถ๊ฐํ ํ HTTP ์์ฒญ์ ์ด๋ฅผ ์๋๋ค.์:
CONTEXT_HEADERS = (current_timestamp)
์ด ์์์, Snowflake๋ ํค๋
sf-context-current-timestamp
๋ฅผ HTTP ์์ฒญ์ ์๋๋ค.์ปจํ ์คํธ ํค๋ ์ด๋ฆ๊ณผ ๊ฐ์ ํ์ฉ๋๋ ๋ฌธ์๋ ์ฌ์ฉ์ ์ง์ ํค๋ ์ด๋ฆ๊ณผ ๊ฐ ์ ํ์ฉ๋๋ ๋ฌธ์์ ๊ฐ์ต๋๋ค.
์ปจํ ์คํธ ํจ์๋ ๋ค์์ ํฌํจํ๋ ์ด์ ๊ตญํ๋์ง ์๋ HTTP ํค๋ ๊ฐ์์ ์๋ชป๋ ๋ฌธ์๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
์ค ๋ฐ๊ฟ
ร
ร
ร
รซ
ยฌ
ยฑ
ยฉ
ยฎ
Snowflake๋ ํ๋ ์ด์์ ์๋ชป๋ ๋ฌธ์๋ก ๊ตฌ์ฑ๋ ๊ฐ ์ํ์ค๋ฅผ ํ๋์ ๊ณต๋ฐฑ ๋ฌธ์๋ก ๋ฐ๊ฟ๋๋ค. (๋ฌธ์๊ฐ ์๋๋ผ ์ํ์ค ๋จ์๋ก ๋ฐ๋๋๋ค.)
์๋ฅผ ๋ค์ด, ์ปจํ ์คํธ ํจ์ CURRENT_STATEMENT()๊ฐ ๋ค์์ ๋ฐํํ๋ค๊ณ ๊ฐ์ ํด ๋ณด์ญ์์ค.
select /*รรรรซยฌยฑยฉยฎ*/ my_external_function(1);
sf-context-current-statement
์์ ๋ณด๋ธ ๊ฐ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.select /* */ my_external_function(1);
์๋ชป๋ ๋ฌธ์๋ฅผ ๋ฐ๊พผ ๊ฒฝ์ฐ์๋ ์๊ฒฉ ์๋น์ค๊ฐ ์ปจํ ์คํธ ํจ์์ ์๋ ๊ฒฐ๊ณผ(์๋ชป๋ ๋ฌธ์ ํฌํจ)์ ํ์คํ ์ก์ธ์คํ ์ ์๋๋ก, Snowflake๋ base64 ๋ก ์ธ์ฝ๋ฉ๋ ์ปจํ ์คํธ ํจ์ ๊ฒฐ๊ณผ๋ฅผ ํฌํจํ ์ด์ง ์ปจํ ์คํธ ํค๋๋ ๋ณด๋ ๋๋ค.
์์ ์์์, base64 ํค๋๋ก ์ ์ก๋ ๊ฐ์ ๋ค์์ ํธ์ถํ ๊ฒฐ๊ณผ์ ๋๋ค.
base64_encode('select\n/รรรรซยฌยฑยฉยฎ/\nmy_external_function(1)')
์๊ฒฉ ์๋น์ค๋ ํ์ํ ๊ฒฝ์ฐ base64 ๊ฐ์ ๋์ฝ๋ฉ์ ๋ด๋นํฉ๋๋ค.
์ด๋ฌํ ๊ฐ base64 ํค๋๋ ๋ค์ ๊ท์น์ ๋ฐ๋ผ ๋ช ๋ช ๋ฉ๋๋ค.
sf-context-<context-function>-base64
์์ ์์์ ํค๋์ ์ด๋ฆ์ ๋ค์์ด ๋ฉ๋๋ค.
sf-context-current-statement-base64
์ปจํ ์คํธ ํค๋๊ฐ ์ ์ก๋์ง ์์ผ๋ฉด base64 ์ปจํ ์คํธ ํค๋๋ ์ ์ก๋์ง ์์ต๋๋ค.
์ธ๋ถ ํจ์๋ก ๋ณด๋ธ ํ์ด ์ฌ๋ฌ ๋ฐฐ์น๋ก ๋ถํ ๋๋ฉด ๋ชจ๋ ์ผ๊ด ์์ ์ ๋๊ฐ์ ์ปจํ ์คํธ ํค๋์ ๋๊ฐ์ ์ด์ง ์ปจํ ์คํธ ํค๋๊ฐ ํฌํจ๋ฉ๋๋ค.
MAX_BATCH_ROWS = integer
์ด ๋งค๊ฐ ๋ณ์๋ ํ๋ก์ ์๋น์ค๋ก ์ ์ก๋๋ ๊ฐ ์ผ๊ด ์์ ์ ์ต๋ ํ ์๋ฅผ ์ง์ ํฉ๋๋ค.
์ด ๋งค๊ฐ ๋ณ์์ ๋ชฉ์ ์ ๋ฉ๋ชจ๋ฆฌ ์ ์ฝ ๋๋ ๊ธฐํ ์ ํ์ด ์๋ ์๊ฒฉ ์๋น์ค์ ์ผ๊ด ์์ ํฌ๊ธฐ๋ฅผ ์ ํํ๋ ๊ฒ์ ๋๋ค. ์ด ๋งค๊ฐ ๋ณ์๋ ์ฑ๋ฅ ์กฐ์ ๋งค๊ฐ ๋ณ์๊ฐ ์๋๋๋ค. ์ด ๋งค๊ฐ ๋ณ์๋ ๊ถ์ฅ ํฌ๊ธฐ๊ฐ ์๋ ์ต๋ ํฌ๊ธฐ๋ฅผ ์ง์ ํฉ๋๋ค.
MAX_BATCH_ROWS ๋ฅผ ์ง์ ํ์ง ์์ ๊ฒฝ์ฐ Snowflake๋ ์ต์ ์ ์ผ๊ด ์์ ํฌ๊ธฐ๋ฅผ ์ถ์ ํ๊ณ ๊ทธ ํฌ๊ธฐ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์๊ฒฉ ์๋น์ค์ ์ ํ์ด ํ์ํ์ง ์์ผ๋ฉด ์ด ๋งค๊ฐ ๋ณ์๋ฅผ ์ค์ ํ์ง ์์ ์ํ๋ก ๋๋ ๊ฒ์ด ์ข์ต๋๋ค.
COMPRESSION = compression_type
์ด ์ ์ ์ง์ ํ๋ฉด Snowflake์์ ํ๋ก์ ์๋น์ค๋ก ๋ณด๋ผ ๋์ ํ๋ก์ ์๋น์ค์์ Snowflake๋ก ๋ค์ ๋ณด๋ผ ๋ JSON ํ์ด๋ก๋๊ฐ ์์ถ๋ฉ๋๋ค.
์ ํจํ ๊ฐ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
NONE
.GZIP
.DEFLATE
.AUTO
.AWS์์๋
AUTO
๊ฐGZIP
๊ณผ ๊ฐ์ต๋๋ค.Azure์์๋
AUTO
๊ฐNONE
๊ณผ ๊ฐ์ต๋๋ค.GCP์์๋
AUTO
๊ฐNONE
๊ณผ ๊ฐ์ต๋๋ค.
Amazon API Gateway๋ ์์ฒญ์ ์๋์ผ๋ก ์์ถ/์์ถ ํด์ ํฉ๋๋ค. Amazon API Gateway ์์ถ ๋ฐ ์์ถ ํด์ ์ ๋ํ ์์ธํ ๋ด์ฉ์ https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-gzip-compression-decompression.html์ ์ฐธ์กฐํ์ญ์์ค.
๋ค๋ฅธ ํด๋ผ์ฐ๋ ํ๋ซํผ ํ๋ก์ ์๋น์ค์ ์์ถ ๋ฐ ์์ถ ํด์ ์ ๋ํ ์์ธํ ๋ด์ฉ์ ํด๋น ํด๋ผ์ฐ๋ ํ๋ซํผ์ ๋ํ ์ค๋ช ์๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
๊ธฐ๋ณธ๊ฐ: ๊ธฐ๋ณธ๊ฐ์
AUTO
์ ๋๋ค.REQUEST_TRANSLATOR = request_translator_udf_name
์ด๋ ์์ฒญ ๋ณํ๊ธฐ ํจ์์ ์ด๋ฆ์ ์ง์ ํฉ๋๋ค. ์์ธํ ๋ด์ฉ์ ์๊ฒฉ ์๋น์ค์ ๋ํ ๋ฐ์ดํฐ์ ํจ๊ป ์์ฒญ ๋ฐ ์๋ต ๋ณํ๊ธฐ ์ฌ์ฉํ๊ธฐ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
RESPONSE_TRANSLATOR = response_translator_udf_name
์ด๋ ์๋ต ๋ณํ๊ธฐ ํจ์์ ์ด๋ฆ์ ์ง์ ํฉ๋๋ค. ์์ธํ ๋ด์ฉ์ ์๊ฒฉ ์๋น์ค์ ๋ํ ๋ฐ์ดํฐ์ ํจ๊ป ์์ฒญ ๋ฐ ์๋ต ๋ณํ๊ธฐ ์ฌ์ฉํ๊ธฐ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
์ก์ธ์ค ์ ์ด ์๊ตฌ ์ฌํญยถ
์ด ์์ ์ ์คํํ๋ ๋ฐ ์ฌ์ฉ๋๋ ์ญํ ์๋ ์ต์ํ ๋ค์ ๊ถํ ์ด ์์ด์ผ ํฉ๋๋ค.
๊ถํ |
์ค๋ธ์ ํธ |
์ฐธ๊ณ |
---|---|---|
CREATE FUNCTION |
์คํค๋ง |
Operating on functions also requires the USAGE privilege on the parent database and schema. |
:emph:`` OWNERSHIP ๋๋ USAGE |
API ํตํฉ |
API ํตํฉ์ ์ฐธ์กฐํ๋ ์ธ๋ถ ํจ์๋ฅผ ๋ง๋๋ ๋ฐ ํ์ํฉ๋๋ค. |
์ง์ ๋ ๊ถํ ์ธํธ๋ก ์ฌ์ฉ์ ์ง์ ์ญํ ์ ๋ง๋๋ ๋ฐฉ๋ฒ์ ๋ํ ์ง์นจ์ ์ฌ์ฉ์ ์ง์ ์ญํ ๋ง๋ค๊ธฐ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
๋ณด์ ์ค๋ธ์ ํธ ์ ๋ํด SQL ์์ ์ ์ํํ๊ธฐ ์ํ ์ญํ ๊ณผ ๊ถํ ๋ถ์ฌ์ ๋ํ ์ผ๋ฐ์ ์ธ ์ ๋ณด๋ ์ก์ธ์ค ์ ์ด์ ๊ฐ์ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
์ผ๋ฐ์ ์ธ ์ฌ์ฉ๋ฒ ๋ ธํธยถ
์์ถ ์ฌ์ฉ ์, Snowflake๋ HTTP ํค๋ โContent-Encodingโ๊ณผ โAccept-Encodingโ์ ์ค์ ํฉ๋๋ค.
์ธ์ ์ ํ๊ณผ ๋ฐํ ์ ํ์ GEOGRAPHY์ผ ์ ์์ต๋๋ค.
๋ฉํ๋ฐ์ดํฐ ๊ด๋ จ:
์ฃผ์
๊ณ ๊ฐ์ Snowflake ์๋น์ค๋ฅผ ์ฌ์ฉํ ๋ ๊ฐ์ธ ๋ฐ์ดํฐ(์ฌ์ฉ์ ์ค๋ธ์ ํธ ์ ์ธ), ๋ฏผ๊ฐํ ๋ฐ์ดํฐ, ์์ถ ํต์ ๋์ ๋ฐ์ดํฐ ๋๋ ๊ธฐํ ๊ท์ ๋ฐ์ดํฐ๊ฐ ๋ฉํ๋ฐ์ดํฐ๋ก ์ ๋ ฅ๋์ง ์๋๋ก ํด์ผ ํฉ๋๋ค. ์์ธํ ๋ด์ฉ์ Snowflake์ ๋ฉํ๋ฐ์ดํฐ ํ๋ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
CREATE OR REPLACE <์ค๋ธ์ ํธ> ๋ฌธ์ ์์์ฑ์ ๋๋ค. ์ฆ, ์ค๋ธ์ ํธ๊ฐ ๋ฐ๋ ๋ ๋จ์ผ ํธ๋์ญ์ ์ผ๋ก ์ด์ ์ค๋ธ์ ํธ๊ฐ ์ญ์ ๋๊ณ ์ ์ค๋ธ์ ํธ๊ฐ ์์ฑ๋ฉ๋๋ค.
CREATE OR ALTER EXTERNAL FUNCTION ์ฌ์ฉ๋ฒ ๋ ธํธยถ
ํจ์ ์ ์ ๋ฐ ๋ฐํ ์ ํ์ ๋ํ ๋ณ๊ฒฝ์ ์ง์๋์ง ์์ต๋๋ค.
์ยถ
Amazon API ๊ฒ์ดํธ์จ์ด ํ๋ก์ ์๋น์ค๋ฅผ ํตํด ์ธ๋ถ ํจ์ ๋ง๋ค๊ธฐยถ
๋ค์ ์์์๋ Amazon API Gateway ํ๋ก์ ์๋น์ค๋ฅผ ํตํด ํธ์ถ๋๋ CREATE EXTERNAL FUNCTION ๋ฌธ์ ๋ณด์ฌ์ค๋๋ค.
CREATE OR REPLACE EXTERNAL FUNCTION local_echo(string_col VARCHAR)
RETURNS VARIANT
API_INTEGRATION = demonstration_external_api_integration_01
AS 'https://xyz.execute-api.us-west-2.amazonaws.com/prod/remote_echo';
์ด ์์ ์์:
local_echo
๋ SQL ๋ฌธ์์ ํธ์ถ๋ ์ด๋ฆ์ ๋๋ค(์:SELECT local_echo(varchar_column) ...;
์ ์คํํ ์ ์์).string_col VARCHAR
์ ์ ๋ ฅ ๋งค๊ฐ ๋ณ์์ ์ด๋ฆ๊ณผ ๋ฐ์ดํฐ ํ์ ์ ํฌํจํฉ๋๋ค. ์ธ๋ถ ํจ์์๋ 0๊ฐ ๋๋ ๊ทธ ์ด์์ ์ ๋ ฅ ๋งค๊ฐ ๋ณ์๊ฐ ์์ ์ ์์ต๋๋ค.variant
๋ ์ธ๋ถ ํจ์์์ ๋ฐํ๋ ๊ฐ์ ๋ฐ์ดํฐ ํ์ ์ ๋๋ค.์ด๋ฆ
demonstration_external_api_integration_01
์ CREATE API INTEGRATION ๋ฌธ์ ์๋ถ๋ถ์์ ์์ฑ๋ API ํตํฉ์ ์ด๋ฆ์ ๋๋ค.URL
https://xyz.execute-api.us-west-2.amazonaws.com/prod/remote_echo
๋ ํ๋ก์ ์๋น์ค์ ๋ฆฌ์์ค๋ฅผ ์๋ณํ๋ ๋ฌธ์์ด์ ๋๋ค. HTTP POST ๋ช ๋ น์ ์ด URL๋ก ์ ์ก๋ฉ๋๋ค.
CREATE OR ALTER EXTERNAL FUNCTION ๋ช ๋ น์ ์ฌ์ฉํ์ฌ ์ธ๋ถ ํจ์ ๋ณ๊ฒฝํ๊ธฐยถ
์์์ ์์ฑํ ์ธ๋ถ ํจ์ local_echo
๋ฅผ ๋ณ๊ฒฝํ์ฌ ๋ฐฐ์น ํ์ ์ต๋ ์๋ฅผ 100์ผ๋ก, ์์ถ์ GZIP ์ผ๋ก ์ค์ ํ๊ณ ํค๋์ ์ปจํ
์คํธ ํค๋๋ฅผ ์ถ๊ฐํฉ๋๋ค.
CREATE OR ALTER SECURE EXTERNAL FUNCTION local_echo(string_col VARCHAR)
RETURNS VARIANT
API_INTEGRATION = demonstration_external_api_integration_01
HEADERS = ('header_variable1'='header_value', 'header_variable2'='header_value2')
CONTEXT_HEADERS = (current_account)
MAX_BATCH_ROWS = 100
COMPRESSION = "GZIP"
AS 'https://xyz.execute-api.us-west-2.amazonaws.com/prod/remote_echo';