์Šค์นผ๋ผ SQL UDFsยถ

์ด ํ•ญ๋ชฉ์—์„œ๋Š” SQL UDF(์‚ฌ์šฉ์ž ์ •์˜ ํ•จ์ˆ˜)์™€ ๊ด€๋ จ๋œ ๊ฐœ๋… ๋ฐ ์‚ฌ์šฉ ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ๋‹ค๋ฃน๋‹ˆ๋‹ค.

์ด ํ•ญ๋ชฉ์˜ ๋‚ด์šฉ:

์ผ๋ฐ˜ ์‚ฌ์šฉยถ

SQL UDF๋Š” ์ž„์˜์˜ SQL ์‹์„ ํ‰๊ฐ€ํ•˜๊ณ  ์‹์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

ํ•จ์ˆ˜ ์ •์˜๋Š” ์Šค์นผ๋ผ(์ฆ‰, ๋‹จ์ผ) ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๊ฑฐ๋‚˜, ํ…Œ์ด๋ธ” ํ•จ์ˆ˜๋กœ ์ •์˜๋œ ๊ฒฝ์šฐ ํ–‰ ์„ธํŠธ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” SQL ์‹์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ์€ ์›์˜ ๋ฉด์ ์„ ๊ณ„์‚ฐํ•˜๋Š” ์Šค์นผ๋ผ UDF์˜ ๊ธฐ๋ณธ ์˜ˆ์ž…๋‹ˆ๋‹ค.

CREATE FUNCTION area_of_circle(radius FLOAT)
  RETURNS FLOAT
  AS
  $$
    pi() * radius * radius
  $$
  ;
Copy
SELECT area_of_circle(1.0);
Copy

์ถœ๋ ฅ:

SELECT area_of_circle(1.0);
+---------------------+
| AREA_OF_CIRCLE(1.0) |
|---------------------|
|         3.141592654 |
+---------------------+
Copy

์‹์€ ์ฟผ๋ฆฌ ์‹(SELECT ์‹)์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ:

CREATE FUNCTION profit()
  RETURNS NUMERIC(11, 2)
  AS
  $$
    SELECT SUM((retail_price - wholesale_price) * number_sold)
        FROM purchases
  $$
  ;
Copy

SQL UDF์—์„œ ์ฟผ๋ฆฌ ์‹์„ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ์ฟผ๋ฆฌ ์‹์„ ์ข…๋ฃŒํ•˜๊ธฐ ์œ„ํ•ด UDF ๋ณธ๋ฌธ์— ์„ธ๋ฏธ์ฝœ๋ก ์„ ํฌํ•จํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

ํ•˜๋‚˜์˜ ์ฟผ๋ฆฌ ์‹๋งŒ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹์—๋Š” UNION [ALL]์ด ํฌํ•จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ 

UDF์˜ ๋ณธ๋ฌธ์€ ์™„์ „ํ•œ SELECT ๋ฌธ์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, DDL ๋ฌธ์ด๋‚˜ SELECT ์ด์™ธ์˜ DML ๋ฌธ์€ ํฌํ•จํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ 

์Šค์นผ๋ผ ํ•จ์ˆ˜(UDF)์˜ ์ž…๋ ฅ ์ธ์ž๋Š” 500๊ฐœ๋กœ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค.

๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๊ฐ€๋Šฅ UDFยถ

์Šค์นผ๋ผ SQL UDF๋Š” ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๊ฐ€๋Šฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๊ฐ€๋Šฅ ํ•จ์ˆ˜๋Š” ์Šค์นผ๋ผ SQL UDF๋ฅผ ํ˜ธ์ถœํ•œ ๊ฒฐ๊ณผ๋ฅผ ์บ์‹œํ–ˆ๋‹ค๊ฐ€ ๋‚˜์ค‘์— ์ถœ๋ ฅ์ด ํ•„์š”ํ•  ๋•Œ ์บ์‹œ๋œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๊ฐ€๋Šฅ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ–‰ ์•ก์„ธ์Šค ์ •์ฑ… ๋˜๋Š” ๋งˆ์Šคํ‚น ์ •์ฑ… ๋‚ด์—์„œ ์ฐธ์กฐ๋˜๋Š” ๋งคํ•‘ ํ…Œ์ด๋ธ” ์˜ ์—ฌ๋Ÿฌ ์—ด ์กฐํšŒ์™€ ๊ฐ™์€ ๋ณต์žกํ•œ ์ฟผ๋ฆฌ์˜ ์„ฑ๋Šฅ์ด ํ–ฅ์ƒ๋œ๋‹ค๋Š” ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ •์ฑ… ์†Œ์œ ์ž(์˜ˆ: ํ–‰ ์•ก์„ธ์Šค ์ •์ฑ…์— ๋Œ€ํ•œ OWNERSHIP ๊ถŒํ•œ์ด ์žˆ๋Š” ์—ญํ• )๋Š” ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๊ฐ€๋Šฅ ํ•จ์ˆ˜์ด ์žˆ๋Š” ๋งคํ•‘ ํ…Œ์ด๋ธ”์ด ์žˆ๋Š” ํ•˜์œ„ ์ฟผ๋ฆฌ๋ฅผ ๋Œ€์ฒดํ•˜๋„๋ก ์ •์ฑ… ์กฐ๊ฑด์„ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ๋‚˜์ค‘์— ์ฟผ๋ฆฌ์—์„œ ์ •์ฑ…์œผ๋กœ ๋ณดํ˜ธ๋œ ์—ด์„ ์ฐธ์กฐํ•  ๋•Œ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๊ฐ€๋Šฅ ํ•จ์ˆ˜์—์„œ ์บ์‹œ๋œ ๊ฒฐ๊ณผ๋ฅผ ํ•„์š”์— ๋”ฐ๋ผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๊ฐ€๋Šฅ ํ•จ์ˆ˜ ๋งŒ๋“ค๊ธฐยถ

MEMOIZABLE ํ‚ค์›Œ๋“œ๋ฅผ ์ง€์ •ํ•˜์—ฌ CREATE FUNCTION ๋ฌธ์—์„œ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๊ฐ€๋Šฅํ•˜๋„๋ก ์Šค์นผ๋ผ SQL UDF๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ธ์ž์˜ ์œ ๋ฌด์™€ ๊ด€๊ณ„์—†์ด ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๊ฐ€๋Šฅ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ธ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด SQL UDF๋ฅผ ๋” ์ž์œ ๋กญ๊ฒŒ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๊ฐ€๋Šฅ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์ •์ฑ…์„ ์ž‘์„ฑํ•˜๋ฉด ์ •์ฑ…์„ ์ •์˜ํ•˜๋Š” ๋ฐฉ๋ฒ• ์ธก๋ฉด์—์„œ ์œ ์—ฐ์„ฑ์ด ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

์ธ์ž๋ฅผ ์ง€์ •ํ•˜๋Š” ๊ฒฝ์šฐ ์ธ์ž๋Š” ๋‹ค์Œ ๋ฐ์ดํ„ฐ ํƒ€์ž… ์ค‘ ํ•˜๋‚˜๋ฅผ ๊ฐ–๋Š” ์ƒ์ˆ˜ ๊ฐ’์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • VARCHAR ๋ฐ ๊ธฐํƒ€ ๋ฌธ์ž์—ด ๋ฐ์ดํ„ฐ ํƒ€์ž….

  • NUMBER ๋ฐ ๊ธฐํƒ€ ์ˆซ์žํ˜• ๋ฐ์ดํ„ฐ ํƒ€์ž….

  • TIMESTAMP ๋ฐ ๊ธฐํƒ€ ๋‚ ์งœ ๋ฐ์ดํ„ฐ ํƒ€์ž….

  • BOOLEAN.

๋ฐ˜์ •ํ˜• ๋ฐ์ดํ„ฐ ํƒ€์ž… ๋ฐ ํ…Œ์ด๋ธ” ์—ด๊ณผ ๊ฐ™์€ ์ƒ์ˆ˜๊ฐ€ ์•„๋‹Œ ๊ฐ’๊ณผ ํ•ด๋‹น ๋ฐ์ดํ„ฐ ํƒ€์ž…์€ ์ง€์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๊ฐ€๋Šฅ ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•  ๋•Œ์˜ ์ง€์นจ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • BOOLEAN ๋˜๋Š” ๋‹ค๋ฅธ ์Šค์นผ๋ผ ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ result_data_type ์œผ๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

    ์บ์‹œ ํฌ๊ธฐ์— ์ œํ•œ์ด ์žˆ์œผ๋ฏ€๋กœ ARRAY๋ฅผ result_data_type ์œผ๋กœ ์ง€์ •ํ•  ๋•Œ๋Š” ์ฃผ์˜ํ•˜์‹ญ์‹œ์˜ค.

  • OBJECT ๋ฐ VARIANT์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ ํƒ€์ž…์€ ์ง€์ •ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

  • ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ๋“  ๋‹ค๋ฅธ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๊ฐ€๋Šฅ ํ•จ์ˆ˜๋ฅผ ์ฐธ์กฐํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๊ฐ€๋Šฅ ํ•จ์ˆ˜ ํ˜ธ์ถœํ•˜๊ธฐยถ

๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๊ฐ€๋Šฅ ํ•จ์ˆ˜๋Š” SELECT ๋ฌธ์—์„œ ํ˜ธ์ถœํ•˜๊ฑฐ๋‚˜ ์ •์ฑ… ์ •์˜์— ํฌํ•จ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด์ฒ˜๋Ÿผ ํฌํ•จํ•œ ๋‹ค์Œ์— ์ •์ฑ… ์กฐ๊ฑด์— ๋”ฐ๋ผ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๊ฐ€๋Šฅ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๊ฐ€๋Šฅ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ๋Š” ๋‹ค์Œ ์‚ฌํ•ญ์— ์œ ์˜ํ•˜์‹ญ์‹œ์˜ค.

  • ARRAY ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ๋ฐ˜ํ™˜ํ•˜๊ฑฐ๋‚˜ ์Šค์นผ๋ผ๊ฐ€ ์•„๋‹Œ ๊ฐ’์„ ์ง€์ •ํ•˜๋Š” SQL UDF์˜ ๊ฒฝ์šฐ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๊ฐ€๋Šฅ ํ•จ์ˆ˜๋ฅผ ARRAY_CONTAINS ํ•จ์ˆ˜์˜ ์ธ์ž๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

  • ์บ์‹œ ํฌ๊ธฐ ์ œํ•œ:

    ๊ฐ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๊ฐ€๋Šฅ ํ•จ์ˆ˜๋Š” ํ˜„์žฌ Snowflake ์„ธ์…˜์— ๋Œ€ํ•ด 10KB๋กœ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค.

    ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๊ฐ€๋Šฅ ํ•จ์ˆ˜๊ฐ€ ๊ฒฐ๊ณผ ์„ธํŠธ ์บ์‹œ์— ๋Œ€ํ•œ ์ด ์ œํ•œ์„ ์ดˆ๊ณผํ•  ๊ฒฝ์šฐ Snowflake๋Š” ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๊ฐ€๋Šฅ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ ๊ฒฐ๊ณผ๋ฅผ ์บ์‹œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  UDF์€ ํ•จ์ˆ˜์˜ ์ž‘์„ฑ ๋ฐฉ์‹์— ๋”ฐ๋ผ ์ผ๋ฐ˜ ์Šค์นผ๋ผ UDF๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

  • ์บ์‹œ ์‚ฌ์šฉ๋Ÿ‰:

    ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๊ฐ€๋Šฅ ํ•จ์ˆ˜์—๋Š” ์ฟผ๋ฆฌ ํ™˜๊ฒฝ๊ณผ ์ปจํ…์ŠคํŠธ๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์„ ๋•Œ ๋‹ค๋ฅธ SQL ๋ฌธ์— ๋Œ€ํ•ด ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฒฐ๊ณผ ์บ์‹œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ, ์ด๋Š” ๊ฒฐ๊ณผ ์บ์‹œ๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ์— ๋‹ค๋ฅธ SQL ๋ฌธ์— ์ ์šฉ๋จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

    • ์ฟผ๋ฆฌ์—์„œ ์ฐธ์กฐ๋˜๋Š” ์˜ค๋ธŒ์ ํŠธ์™€ ์—ด์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ์ œ์–ด ๊ถŒํ•œ์€ ๋™์ผํ•˜๊ฒŒ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.

    • ์ฟผ๋ฆฌ์—์„œ ์ฐธ์กฐ๋œ ์˜ค๋ธŒ์ ํŠธ๋Š” ์ˆ˜์ •๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(์˜ˆ: DML ๋ฌธ์„ ํ†ตํ•ด).

    Account Usage QUERY_HISTORY ๋ทฐ์˜ CHILD_QUERIES_WAIT_TIME ์—ด์€ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๊ฐ€๋Šฅ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ์บ์‹œ๋œ ์กฐํšŒ๋ฅผ ์™„๋ฃŒํ•˜๋Š” ๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„(๋ฐ€๋ฆฌ์ดˆ)์„ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค.

  • ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ์—๋Š” ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๊ฐ€๋Šฅ ํ•จ์ˆ˜๊ฐ€ ์บ์‹œ๋œ ๊ฒฐ๊ณผ๋ฅผ ์žฌ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

    • ํ•จ์ˆ˜๊ฐ€ ํ…Œ์ด๋ธ” ๋˜๋Š” ๊ธฐํƒ€ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์ฐธ์กฐ๋œ ํ…Œ์ด๋ธ”์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ.

    • ํ…Œ์ด๋ธ”์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ์ œ์–ด์— ๋ณ€ํ™”๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ.

    • ํ•จ์ˆ˜๊ฐ€ ๋น„๊ฒฐ์ •์  ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒฝ์šฐ.

    • ํ•จ์ˆ˜๊ฐ€ ์™ธ๋ถ€ ํ•จ์ˆ˜ ๋˜๋Š” SQL UDF๊ฐ€ ์•„๋‹Œ UDF๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒฝ์šฐ.

์˜ˆยถ

๊ธฐ๋ณธ SQL ์Šค์นผ๋ผ UDF ์˜ˆยถ

์ด ์˜ˆ๋Š” ์ˆ˜ํ•™ ์ƒ์ˆ˜ pi์˜ ํ•˜๋“œ ์ฝ”๋”ฉ๋œ ๊ทผ์‚ฟ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

CREATE FUNCTION pi_udf()
  RETURNS FLOAT
  AS '3.141592654::FLOAT'
  ;
Copy
SELECT pi_udf();   
Copy

์ถœ๋ ฅ:

SELECT pi_udf();
+-------------+
|    PI_UDF() |
|-------------|
| 3.141592654 |
+-------------+
Copy

์ผ๋ฐ˜ SQL ์˜ˆยถ

SELECT ๋ฌธ์„ ํฌํ•จํ•œ ์ฟผ๋ฆฌ ์‹ยถ

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉํ•  ํ…Œ์ด๋ธ”๊ณผ ๋ฐ์ดํ„ฐ๋ฅผ ๋งŒ๋“œ์‹ญ์‹œ์˜ค.

CREATE TABLE purchases (number_sold INTEGER, wholesale_price NUMBER(7,2), retail_price NUMBER(7,2));
INSERT INTO purchases (number_sold, wholesale_price, retail_price) VALUES 
   (3,  10.00,  20.00),
   (5, 100.00, 200.00)
   ;
Copy

UDF๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

CREATE FUNCTION profit()
  RETURNS NUMERIC(11, 2)
  AS
  $$
    SELECT SUM((retail_price - wholesale_price) * number_sold)
        FROM purchases
  $$
  ;
Copy

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ฟผ๋ฆฌ์—์„œ UDF๋ฅผ ํ˜ธ์ถœํ•˜์‹ญ์‹œ์˜ค.

SELECT profit();
Copy

์ถœ๋ ฅ:

SELECT profit();
+----------+
| PROFIT() |
|----------|
|   530.00 |
+----------+
Copy

WITH ์ ˆ์˜ UDFยถ

CREATE TABLE circles (diameter FLOAT);

INSERT INTO circles (diameter) VALUES
    (2.0),
    (4.0);

CREATE FUNCTION diameter_to_radius(f FLOAT) 
  RETURNS FLOAT
  AS 
  $$ f / 2 $$
  ;
Copy
WITH
    radii AS (SELECT diameter_to_radius(diameter) AS radius FROM circles)
  SELECT radius FROM radii
    ORDER BY radius
  ;
Copy

์ถœ๋ ฅ:

+--------+
| RADIUS |
|--------|
|      1 |
|      2 |
+--------+
Copy

JOIN ์ž‘์—…ยถ

์ด ์˜ˆ์—์„œ๋Š” JOIN ์ž‘์—…์„ ํฌํ•จํ•˜๋Š” ๋” ๋ณต์žกํ•œ ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉํ•  ํ…Œ์ด๋ธ”๊ณผ ๋ฐ์ดํ„ฐ๋ฅผ ๋งŒ๋“œ์‹ญ์‹œ์˜ค.

CREATE TABLE orders (product_ID varchar, quantity integer, price numeric(11, 2), buyer_info varchar);
CREATE TABLE inventory (product_ID varchar, quantity integer, price numeric(11, 2), vendor_info varchar);
INSERT INTO inventory (product_ID, quantity, price, vendor_info) VALUES 
  ('X24 Bicycle', 4, 1000.00, 'HelloVelo'),
  ('GreenStar Helmet', 8, 50.00, 'MellowVelo'),
  ('SoundFX', 5, 20.00, 'Annoying FX Corporation');
INSERT INTO orders (product_id, quantity, price, buyer_info) VALUES 
  ('X24 Bicycle', 1, 1500.00, 'Jennifer Juniper'),
  ('GreenStar Helmet', 1, 75.00, 'Donovan Liege'),
  ('GreenStar Helmet', 1, 75.00, 'Montgomery Python');
Copy

UDF๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

CREATE FUNCTION store_profit()
  RETURNS NUMERIC(11, 2)
  AS
  $$
  SELECT SUM( (o.price - i.price) * o.quantity) 
    FROM orders AS o, inventory AS i 
    WHERE o.product_id = i.product_id
  $$
  ;
Copy

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ฟผ๋ฆฌ์—์„œ UDF๋ฅผ ํ˜ธ์ถœํ•˜์‹ญ์‹œ์˜ค.

SELECT store_profit();
Copy

์ถœ๋ ฅ:

SELECT store_profit();
+----------------+
| STORE_PROFIT() |
|----------------|
|         550.00 |
+----------------+
Copy

CREATE FUNCTION ํ•ญ๋ชฉ์—๋Š” ์ถ”๊ฐ€ ์˜ˆ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์–‘ํ•œ ์ ˆ์—์„œ UDFs ์‚ฌ์šฉยถ

์Šค์นผ๋ผ UDF๋Š” ์Šค์นผ๋ผ ์‹์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๊ณณ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ:

-- ----- These examples show a UDF called from different clauses ----- --

select MyFunc(column1) from table1;

select * from table1 where column2 > MyFunc(column1);
Copy

UDF์—์„œ SQL ๋ณ€์ˆ˜ ์‚ฌ์šฉยถ

์ด ์˜ˆ๋Š” SQL ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•˜๊ณ  UDF ๋‚ด์—์„œ ํ•ด๋‹น ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

SET id_threshold = (SELECT COUNT(*)/2 FROM table1);
Copy
CREATE OR REPLACE FUNCTION my_filter_function()
RETURNS TABLE (id int)
AS
$$
SELECT id FROM table1 WHERE id > $id_threshold
$$
;
Copy

๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๊ฐ€๋Šฅ ํ•จ์ˆ˜ยถ

์˜ˆ๋Š” ๋‹ค์Œ์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.