16-3.ÇÔ¼ö

1.»ç¿ëÀÚ Á¤ÀÇ ÇÔ¼ö

ÇÔ¼ö´Â Çʵ峪 º¯¼ö¸¦ Áý°è ¹× °¡°øÇÏ´Â ¿ªÇÒÀ» ÇÑ´Ù. Àμö¸¦ ¹Þ¾Æ °è»êÀ» ÅëÇØ °á°ú°ª Çϳª¸¦ ¸®ÅÏÇÑ´Ù. ¿À¶óŬÀÌ ±âº» Á¦°øÇÏ´Â ROUND, DECODE, NVL µîÀÇ ½Ã½ºÅÛ ÇÔ¼ö´Â ¾Õ¿¡¼­ ÀÌ¹Ì »ç¿ëÇØ º¸¾ÒÀ¸¸ç °á°ú°ªÀ» ¸®ÅÏÇÑ´Ù.

½Ã½ºÅÛÀÌ ÃæºÐÇÑ ÇÔ¼ö¸¦ Á¦°øÇÏÁö¸¸ ÀÀ¿ë ÇÁ·Î±×·¥ °íÀ¯ÀÇ Æ¯¼öÇÑ ±â´É±îÁö ´Ù Á¦°øÇÒ ¼ö´Â ¾ø´Ù. ÇÊ¿ä¿¡ µû¶ó Á÷Á¢ ¸¸µé¾î ¾²´Â ÇÔ¼ö¸¦ »ç¿ëÀÚ Á¤ÀÇ ÇÔ¼ö¶ó°í ºÎ¸¥´Ù. ¸í·ÉÀÇ ÁýÇÕÀ̶ó´Â Á¡¿¡¼­ ÀúÀå ÇÁ·Î½ÃÀú¿Í À¯»çÇÏ¸ç ¼±¾ðÇÏ´Â Çü½Äµµ ºñ½ÁÇÏÁö¸¸ ¸î °¡Áö Â÷ÀÌÁ¡ÀÌ ÀÖ´Ù.

 

l ÇÔ¼öÀÇ Àμö´Â ¸ðµÎ ÀԷ¿ëÀÌ´Ù. µû¶ó¼­ INÀ̶ó°í ¹àÈú ÇÊ¿ä°¡ ¾ø´Ù.

l RETURN ¹®À¸·Î ÇϳªÀÇ °á°ú°ªÀ» ¸®ÅÏÇÑ´Ù. ¸®ÅÏ°ªÀÌ ¾ø¾îµµ ¾ÈµÇ°í µÎ °³¿©¼­µµ ¾ÈµÈ´Ù.

l ÇÔ¼ö È£Ãâ¹®ÀÌ °ª Çϳª¿Í °°¾Æ SELECT ¹®À̳ª ¼ö½Ä ³»¿¡¼­µµ »ç¿ëÇÒ ¼ö ÀÖ´Ù.

 

°è»êÀ» À§ÇØ ÇÊ¿äÇÑ Àμö´Â ¸î °³µç ¹ÞÀ» ¼ö ÀÖÁö¸¸ ¸®ÅÏÀº µü Çϳª¸¸ °¡´ÉÇÏ´Ù. ±×·¡¾ß ÇÔ¼ö È£Ãâ¹®À» ¼ö½Ä¿¡¼­ ¹Ù·Î »ç¿ëÇÒ ¼ö ÀÖ´Ù.

CREATE FUNCTION ¸í·ÉÀ¸·Î Á¤ÀÇÇϸç Çü½ÄÀº ÇÁ·Î½ÃÀú Á¤Àǹ®°ú À¯»çÇÏ´Ù. AS ÀÌÀü¿¡ RETURN ¹®À¸·Î ¸®ÅÏÇÒ °ªÀÇ Å¸ÀÔÀ» ¹àÈ÷°í º»Ã¼¿¡¼­ RETURN ¸í·ÉÀ¸·Î °á°ú°ªÀ» ¸®ÅÏÇÑ´Ù. ´ÙÀ½ ÇÔ¼ö´Â Àμö·Î Àü´Þ¹ÞÀº µÎ °³ÀÇ Á¤¼ö¸¦ ´õÇÑ °ªÀ» °è»êÇÑ´Ù.

 

CREATE OR REPLACE FUNCTION FN_AddInt(a INT, b INT)

RETURN INT

AS

BEGIN

     RETURN a + b;

END;

 

ÇÔ¼ö´Â º¸Åë Á¢µÎ FN_À» ºÙÀδÙ. Àμö a, b´Â ¸ðµÎ Á¤¼öÇüÀÌ¸ç ¸®ÅÏ°ªµµ Á¤¼ö ŸÀÔÀÌ´Ù. º»Ã¼¿¡¼­´Â a + b¸¦ °è»êÇÏ¿© ¸®ÅÏÇÑ´Ù. ÇÔ¼ö´Â Äõ¸®¹® ³»¿¡¼­ À̸§À¸·Î ¹Ù·Î È£ÃâÇÏ¸ç ¼ö½Ä ³»¿¡¼­µµ »ç¿ëÇÒ ¼ö ÀÖ´Ù.

 

SELECT FN_AddInt(2, 3) FROM dual;

SELECT * FROM tCity WHERE popu > FN_AddInt(10, 20);

 

2¿Í 3À» ´õÇÑ 5¸¦ Ãâ·ÂÇÏ°í 10°ú 20À» ´õÇÑ 30º¸´Ù Àα¸°¡ ´õ ¸¹Àº µµ½Ã ¸ñ·ÏÀ» Ãâ·ÂÇÑ´Ù. º¸´Ù½ÃÇÇ ÇÊµå ¸ñ·ÏÀ̳ª WHERE Àý µî ¾îµð¿¡¼­³ª È£ÃâÇÒ ¼ö ÀÖ´Ù. ½Ã½ºÅÛ ÇÔ¼öÀÎ TRIM, POWER µîÀ» ¾îµð¼­³ª È£ÃâÇÒ ¼ö ÀÖ´Â °Í°ú °°´Ù. ÄÚµå ³»¿¡¼­µµ ¹°·Ð È£ÃâÇÒ ¼ö ÀÖ´Ù.

 

DECLARE v_sum INT;

BEGIN

    v_sum := FN_AddInt(2, 3);

    DBMS_OUTPUT.PUT_LINE(v_sum);

END;

 

FN_AddIntÀÇ ¸®ÅÏ°ªÀ» v_Sum º¯¼ö¿¡ ´ëÀÔÇÑ ÈÄ Ãâ·ÂÇß´Ù. »ç¿ëÀÚ°¡ Á¤ÀÇÇß´Ù´Â °Í ¿Ü¿¡´Â ½Ã½ºÅÛ ÇÔ¼ö¿Í ÀÚ°ÝÀÌ °°´Ù. ÇÔ¼öµµ ¿µ±¸ ÀúÀåµÇ´Â DB ¿ÀºêÁ§Æ®À̸ç DROP FUNCTION ¸í·ÉÀ¸·Î »èÁ¦ÇÑ´Ù. ´ÙÀ½Àº ´õ ½Ç¿ëÀûÀÎ ÇÔ¼ö¸¦ ¸¸µé¾î º¸ÀÚ.

 

CREATE OR REPLACE FUNCTION FN_GetSum(p_upBound INT)

RETURN INT

AS

    v_total INT := 0;

BEGIN

    FOR v_num IN 1 .. p_upBound

    LOOP

        v_total := v_total + v_num;

    END LOOP;

    RETURN v_total;

END;

 

ÀÌ ÇÔ¼ö´Â p_upBound Àμö¸¦ Àü´Þ¹Þ¾Æ 1 ~ p_upBound  ±îÁöÀÇ Çհ踦 ±¸ÇØ ¸®ÅÏÇÑ´Ù. Çհ踦 ±¸ÇÒ ¹üÀ§¸¦ Àμö·Î ÁöÁ¤ÇÒ ¼ö ÀÖ¾î È°¿ë¼ºÀÌ ³ô´Ù. ´ÙÀ½ ¸í·ÉÀº 1 ~ 10±îÁöÀÇ Á¤¼ö ÇÕ°èÀÎ 55¸¦ Ãâ·ÂÇÑ´Ù.

 

SELECT FN_GetSum(10) FROM dual;

 

ÇÔ¼ö¸¦ Àß È°¿ëÇÏ¸é ¿©·¯ °¡Áö ÀÌÁ¡ÀÌ ÀÖ´Ù. ÀúÀå ÇÁ·Î½ÃÀúÀÇ ÀåÁ¡°ú À¯»çÇ쵂 µ¿ÀÛÀ» ó¸®Çϱ⺸´Ù´Â °è»êÀ» ÇÑ´Ù´Â Á¡ÀÌ ´Ù¸£´Ù.

 

l ¹Ýº¹ÀûÀ¸·Î »ç¿ëÇÒ Äڵ带 ¸ðµâÈ­ÇÏ¿© ¼ö½Ä³»¿¡¼­ Àç»ç¿ëÇϱâ Æí¸®ÇÏ´Ù.

l ¹Ì¸® ÄÄÆÄÀÏÇØ ³õ¾Æ ¼Óµµ°¡ ºü¸£´Ù.

l ÇÔ¼ö È£Ãâ¹®Àº Äõ¸®º¸´Ù ª¾Æ ³×Æ®¿öÅ© Æ®·¡ÇÈÀÌ ÁÙ¾îµç´Ù.

 

¹Ý¸é ¹Ýº¹ÀûÀÎ ·çÇÁ³ª Á¶°ÇÀý¿¡ »ç¿ëÇÏ¸é ¸Å¹ø È£ÃâµÇ¾î ¼º´ÉÀ» ¶³¾î¶ß¸± ¼ÒÁö°¡ ÀÖ´Ù. ¸¸ °³ÀÇ ·¹Äڵ带 Àд Äõ¸®¹®ÀÇ WHERE Àý¿¡¼­ FN_GetSum ÇÔ¼ö¸¦ È£ÃâÇϸé Çհ踦 ¸¸ ¹øÀ̳ª ±¸ÇØ¾ß ÇÑ´Ù. ´Ü, ¿£ÁøÀÇ ÃÖÀûÈ­ ¿©ºÎ¿¡ µû¶ó ¾î´À Á¤µµ´Â ¼º´É °¨¼Ò¸¦ »ó¼âÇϱ⵵ ÇÑ´Ù.

¿¬½À ¹®Á¦

2.µµ½ÃÀÇ À̸§À» ÀÔ·Â¹Þ¾Æ Àα¸¹Ðµµ¸¦ ±¸ÇÏ´Â ÇÔ¼ö¸¦ ÀÛ¼ºÇØ º¸ÀÚ.

3.½ÃÀÛ°ª, ³¡°ª, Áõ°¡°ªÀ» Àμö·Î ¹Þ¾Æ ¹üÀ§ ³»ÀÇ ¸ðµç Á¤¼öÀÇ ÇÕÀ» ±¸ÇÏ´Â ÇÔ¼ö¸¦ ÀÛ¼ºÇ϶ó. ¿¹¸¦ µé¾î 10, 20, 2¸¦ Àü´ÞÇϸé 10ºÎÅÍ 20±îÁö 2¾¿ °Ç³Ê¶Ù¸ç 10 + 12 + 14 + 16 + 18 + 20À» °è»êÇÑ´Ù.

2.Å×ÀÌºí ¹Ýȯ ÇÔ¼ö

ÀϹÝÀûÀÎ ÇÔ¼ö´Â µü ÇϳªÀÇ °ªÀ» ¸®ÅÏÇϴµ¥ ºñÇØ Å×ÀÌºí ¹Ýȯ ÇÔ¼ö´Â Å×À̺íÀ» »ý¼ºÇÏ¿© ¸®ÅÏÇÑ´Ù. ¾î·°Å³ª ¸®ÅÏÇÏ´Â °ÍÀº Å×À̺í ÇϳªÀÌÁö¸¸ ÀÌ ¾È¿¡ ¿­°ú ÇàÀ¸·Î ±¸¼ºÇÑ ´ë±Ô¸ðÀÇ Á¤º¸¸¦ ÇѲ¨¹ø¿¡ ¸®ÅÏÇÒ ¼ö ÀÖ´Ù.

¸®ÅÏ ´ë»óÀÇ ±¸Á¶°¡ º¹ÀâÇÏ´Ù º¸´Ï ÇÔ¼ö¸¦ ¸¸µå´Â ÀýÂ÷µµ º¹ÀâÇÏ´Ù. ¸ÕÀú ÇàÀ» Á¤ÀÇÇÏ°í ±× ÇàÀ» ¸ð¾Æ Å×À̺íÀ» Á¤ÀÇÇÑ´Ù. ±×¸®°í Å×ÀÌºí ¾È¿¡ ³»¿ëÀ» ä¿ö ¸®ÅÏÇÑ´Ù. ±¸±¸´Ü Å×À̺íÀ» Ãâ·ÂÇÏ´Â ÇÔ¼ö¸¦ ¸¸µé¾î º¸ÀÚ. ¸ÕÀú ÇÑ Çà¿¡ ´ëÇÑ Å¸ÀÔÀ» Á¤ÀÇÇÑ´Ù.

 

CREATE OR REPLACE TYPE gu_row AS OBJECT

(

    dan INT,

    num INT,

    multi INT

);

 

±¸±¸´ÜÀÇ ÇÑ ÇàÀº 3 * 4 = 12 ½ÄÀ¸·Î ¼¼ ¼ýÀÚ·Î ±¸¼ºµÈ´Ù. gu_row ŸÀÔÀº ´Ü¼öÀÎ dan, °öÇÏ´Â °ª num, ±×¸®°í µÎ °ªÀ» °öÇÑ multi Çʵ带 °¡Áø´Ù. Çʵå´Â ÇÊ¿äÇÑ ¸¸Å­ ¾ó¸¶µçÁö Á¤ÀÇÇÒ ¼ö ÀÖ´Ù. ´ÙÀ½Àº ÀÌ ÇàÀ» ¸ð¾Æ Å×À̺í ŸÀÔÀ» Á¤ÀÇÇÑ´Ù.

 

CREATE OR REPLACE TYPE gu_table AS TABLE OF gu_row;

 

gu_row ·¹Äڵ带 ¸ð¾Æ Å×À̺íÀ» ±¸¼ºÇÏ¸é ±¸±¸´ÜÀÌ µÈ´Ù. ÇÔ¼ö´Â ´Ü¼öÀÎ p_danÀ» Àμö·Î ¹Þ¾Æ ±¸±¸´Ü Å×ÀÌºí¿¡ ·¹Äڵ带 ä¿ö ³Ö´Â´Ù.

 

CREATE OR REPLACE FUNCTION makeDan(p_dan INT)

RETURN gu_table PIPELINED

AS

    v_row gu_row;

BEGIN

    FOR v_num IN 1..9

    LOOP

        v_row := gu_row(p_dan, v_num, p_dan * v_num);

        PIPE ROW(v_row);

    END LOOP;

    RETURN;

END;

 

¸®ÅÏ Å¸ÀÔÀº gu_tableÀ̸ç Å×À̺íÀ» ¸®ÅÏÇÑ´Ù´Â Àǹ̷ΠPIPELINED Å°¿öµå¸¦ ¸í½ÃÇÑ´Ù. º»Ã¼¿¡¼­´Â Àμö·Î ¹ÞÀº p_dan¿¡ ´ëÇØ 1~9±îÁö ·çÇÁ¸¦ µ¹¸ç ÇÑ ÇàÀ» »ý¼ºÇÏ°í PIPE ROW ¸í·ÉÀ¸·Î ÀÌ ÇàÀ» Å×ÀÌºí¿¡ »ðÀÔÇÑ´Ù. ·çÇÁ¸¦ ´Ù µ· ÈÄ ¿Ï¼ºÇÑ Å×À̺íÀ» ¸®ÅÏÇÑ´Ù.

makeDan ÇÔ¼ö·Î ¿øÇÏ´Â ´Ü¼ö¸¸ Àü´ÞÇϸé ÇØ´ç ´ÜÀ» Å×À̺í·Î »ý¼ºÇÏ¿© ¸®ÅÏÇÑ´Ù. ¸®ÅÏ°ªÀÌ Å×À̺íÀ̹ǷΠ´ç¿¬È÷ FROM Àý¿¡ »ç¿ëÇÒ ¼ö ÀÖ´Ù. ´ÙÀ½ ¸í·ÉÀº 5´Ü°ú 7´ÜÀ» Å×À̺í·Î ¸¸µé¾î ¸®ÅÏÇÑ´Ù.

 

SELECT * FROM TABLE(makeDan(5));

SELECT * FROM TABLE(makeDan(7));

 

Å×À̺íÀ» »ý¼ºÇϱâ À§ÇÑ Àμö¸¸ Àü´ÞÇÏ¸é µÈ´Ù. °è»ê¿¡ ÀÇÇØ ¸¸µéµç, ´Ù¸¥ Å×ÀÌºí¿¡¼­ Á¶È¸Çؼ­ Á¶ÇÕÇϵç, Àμö ³»ºÎÀÇ °ªÀ» ºÐÇØÇÏ¿© »ý¼ºÇÏµç ´Ù¾çÇÑ ¹æ¹ýÀ¸·Î Å×À̺íÀ» »ý¼ºÇÒ ¼ö ÀÖ´Ù.