ÇÔ¼ö´Â Çʵ峪 º¯¼ö¸¦ Áý°è ¹× °¡°øÇÏ´Â ¿ªÇÒÀ» ÇÑ´Ù. Àμö¸¦ ¹Þ¾Æ
°è»êÀ» ÅëÇØ °á°ú°ª Çϳª¸¦ ¸®ÅÏÇÑ´Ù. ¿À¶óŬÀÌ ±âº» Á¦°øÇÏ´Â
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À» °è»êÇÑ´Ù.
ÀϹÝÀûÀÎ ÇÔ¼ö´Â µü ÇϳªÀÇ °ªÀ» ¸®ÅÏÇϴµ¥ ºñÇØ Å×ÀÌºí ¹Ýȯ ÇÔ¼ö´Â Å×À̺íÀ» »ý¼ºÇÏ¿© ¸®ÅÏÇÑ´Ù. ¾î·°Å³ª ¸®ÅÏÇÏ´Â °ÍÀº Å×À̺í ÇϳªÀÌÁö¸¸ ÀÌ ¾È¿¡ ¿°ú ÇàÀ¸·Î ±¸¼ºÇÑ ´ë±Ô¸ðÀÇ Á¤º¸¸¦ ÇѲ¨¹ø¿¡ ¸®ÅÏÇÒ ¼ö ÀÖ´Ù.
¸®ÅÏ ´ë»óÀÇ ±¸Á¶°¡ º¹ÀâÇÏ´Ù º¸´Ï ÇÔ¼ö¸¦ ¸¸µå´Â ÀýÂ÷µµ º¹ÀâÇÏ´Ù. ¸ÕÀú
ÇàÀ» Á¤ÀÇÇÏ°í ±× ÇàÀ» ¸ð¾Æ Å×À̺íÀ» Á¤ÀÇÇÑ´Ù. ±×¸®°í Å×ÀÌºí ¾È¿¡ ³»¿ëÀ» ä¿ö ¸®ÅÏÇÑ´Ù. ±¸±¸´Ü Å×À̺íÀ» Ãâ·ÂÇÏ´Â ÇÔ¼ö¸¦ ¸¸µé¾î º¸ÀÚ. ¸ÕÀú ÇÑ Çà¿¡ ´ëÇÑ
ŸÀÔÀ» Á¤ÀÇÇÑ´Ù.
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));
Å×À̺íÀ» »ý¼ºÇϱâ À§ÇÑ Àμö¸¸ Àü´ÞÇÏ¸é µÈ´Ù. °è»ê¿¡ ÀÇÇØ ¸¸µéµç, ´Ù¸¥ Å×ÀÌºí¿¡¼ Á¶È¸Çؼ Á¶ÇÕÇϵç, Àμö ³»ºÎÀÇ °ªÀ» ºÐÇØÇÏ¿© »ý¼ºÇϵç
´Ù¾çÇÑ ¹æ¹ýÀ¸·Î Å×À̺íÀ» »ý¼ºÇÒ ¼ö ÀÖ´Ù.