»ç¿ëÀÚÀÇ UDF¿¡¼ ½ºÅ©·¡Ä¡ ÆÐµå¸¦ »ç¿ëÇÒ °ÍÀÎÁö ¿©ºÎ¿¡ ¿µÇâÀ» ¹ÌÄ¡´Â Àμö´Â ÀÌ·¯ÇÑ Æ¯º°ÇÑ Àý¿¡¼ ¼³¸íÇØ¾ß ÇÒ¸¸Å Áß¿äÇÕ´Ï´Ù. ±âŸ ÄÚµù½Ã °í·Á»çÇ×Àº ±âŸ ÄÚµù½Ã °í·Á»çÇ׿¡¼ ³íÀǵ˴ϴÙ.
UDF¸¦ ÀçÀԷµǵµ·Ï ÄÚµùÇÏ´Â °ÍÀÌ Áß¿äÇÕ´Ï´Ù. À̰ÍÀº ÁÖ·Î UDF¿¡ ´ëÇÑ ¸¹Àº ÂüÁ¶µéÀÌ ÇÔ¼ö ³»¿ëÀÇ µ¿ÀÏÇÑ »çº»À» »ç¿ëÇÑ´Ù´Â »ç½Ç ¶§¹®ÀÔ´Ï´Ù. »ç½Ç»ó ÀÌ·¯ÇÑ ¸¹Àº ÂüÁ¶µéÀº ´Ù¸¥ ¸í·É¹®À̳ª ÀÀ¿ëÇÁ·Î±×·¥¿¡ ÀÖÀ» ¼öµµ ÀÖ½À´Ï´Ù. ±×·¯³ª ÇÔ¼öµéÀÌ ÇÑ È£Ãâ¿¡¼ ´ÙÀ½ È£Ãâ·Î »óŸ¦ ÀúÀåÇÒ Çʿ䰡 Àְųª ÀúÀåÇϰíÀÚ ÇÑ´Ù´Â Á¡¿¡ ÁÖÀÇÇϽʽÿÀ. ÀÌ·¯ÇÑ ÇÔ¼öµéÀÇ µÎ °¡Áö ¹üÁÖ´Â ´ÙÀ½°ú °°½À´Ï´Ù.
ÀÌ·¯ÇÑ ÇÔ¼öÀÇ ¿¹´Â ¸Ç óÀ½ È£ÃâµÇ¾úÀ» ¶§ '1'À» ¸®ÅÏÇϰí, ±× ÀÌÈÄ ¿¬¼ÓµÇ´Â È£Ãâ¿¡¼ 1¾¿ Áõ°¡½ÃŰ´Â ´Ü¼øÇÑ °è¼ö±â(counter) ÇÔ¼öÀÔ´Ï´Ù. ÀÌ·¯ÇÑ ÇÔ¼ö´Â SELECT °á°ú Çà¿¡ ¹øÈ£¸¦ ºÙÀÌ´Â µ¥ »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù.
SELECT counter(), a, b+c, ... FROM tablex WHERE ...
ÀÌ·¯ÇÑ ÇÔ¼öÀÇ À¯ÇüÀº NOT DETERMINISTIC ¶Ç´Â VARIANTÀÔ´Ï´Ù. ÀÌ ÇÔ¼öÀÇ Ãâ·ÂÀº ÀüÀûÀ¸·Î SQL Àμö °ª¿¡¸¸ ÀÇÁ¸ÇÏÁö ¾Ê½À´Ï´Ù. ÀÌ °è¼ö±â(counter) ÇÔ¼ö´Â ¿¹: °è¼ö±â(Counter)¿¡ ³ª¿Í ÀÖ½À´Ï´Ù.
ÀÌ·¯ÇÑ ÇÔ¼öÀÇ ¿¹·Î, ¹®¼ ÀÀ¿ëÇÁ·Î±×·¥ÀÇ ÀϺΰ¡ µÉ ¼öµµ ÀÖ´Â ÀÏÄ¡(match) ÇÔ¼ö°¡ Àִµ¥, À̰ÍÀº ÁÖ¾îÁø ¹®¼¿¡ ÁÖ¾îÁø ¹®ÀÚ¿ÀÌ µé¾î ÀÖÀ¸¸é 'Y'¸¦ ¸®ÅÏÇϰí, ±×·¸Áö ¾ÊÀ¸¸é 'N'À» ¸®ÅÏÇÕ´Ï´Ù.
SELECT docid, doctitle, docauthor FROM docs WHERE match('myocardial infarction', docid) = 'Y'
ÀÌ ¸í·É¹®Àº ù¹øÂ° Àμö·Î Àü´ÞµÈ ƯÁ¤ ÅØ½ºÆ® ¹®ÀÚ¿ °ªÀÌ µé¾î ÀÖ´Â ¸ðµç ¹®¼¸¦ ¸®ÅÏÇÕ´Ï´Ù. ¼öÇàµÇ´Â ÀÏÄ¡(match)ÀÇ Á¾·ù´Â ´ÙÀ½°ú °°½À´Ï´Ù.
DB2 ¿ÜºÎ¿¡¼ À¯Áöº¸¼öµÇ´Â ¹®¼ ÀÀ¿ëÇÁ·Î±×·¥À¸·ÎºÎÅÍ ¹®ÀÚ¿ myocardial infarctionÀÌ µé¾î ÀÖ´Â ¸ðµç ¹®¼ IDÀÇ ¸ñ·ÏÀ» °Ë»öÇÕ´Ï´Ù. °Ë»öÀº ºñ¿ëÀÌ ¸¹ÀÌ ¼Ò¸ðµÇ´Â ÇÁ·Î¼¼½ºÀ̹ǷÎ, ÇÔ¼ö´Â ÇÑ ¹ø¸¸ ¼öÇàÇϰíÀÚ Çϸç, ÀÌ ¸ñ·ÏÀ» ÈÄ¼Ó È£Ãâ¿¡¼ »ç¿ëÇÏ±â ÆíÇÑ ¾îµò°¡¿¡ ÀúÀåÇÏ·Á ÇÕ´Ï´Ù.
ù¹øÂ° È£Ãâ Áß¿¡ ÀúÀåµÈ ¹®¼ ID ¸ñ·ÏÀ» »ç¿ëÇÏ¿© µÎ ¹øÂ° Àμö¿¡ Àü´ÞµÈ ¹®¼ ID°¡ ¸ñ·Ï¿¡ µé¾î ÀÖ´ÂÁö º¸½Ê½Ã¿À.
ÀÌ Æ¯Á¤ ÀÏÄ¡(match) ÇÔ¼ö´Â DETERMINISTIC ¶Ç´Â NOT VARIANTÀÔ´Ï´Ù. À̰ÍÀÇ ÀÀ´äÀº ÀÔ·Â Àμö °ª¿¡¸¸ ÀÇÁ¸ÇÕ´Ï´Ù. ¿©±â¿¡ ³ª¿Í ÀÖ´Â °ÍÀº ¿Ã¹Ù¸§ÀÌ ¾Æ´Ñ ¼º´ÉÀÌ ÇϳªÀÇ È£Ãâ¿¡¼ ´ÙÀ½ È£Ãâ·Î Á¤º¸¸¦ ÀúÀåÇÏ´Â ´É·Â¿¡ ÀÇÁ¸ÇÏ´Â ÇÔ¼öÀÔ´Ï´Ù.
ÀÌµé ¸ðµÎÀÇ ÇÊ¿ä´Â CREATE FUNCTION¹®¿¡ SCRATCHPAD¸¦ ÁöÁ¤ÇÏ´Â ±â´ÉÀ¸·Î ÃæÁ·µË´Ï´Ù.
CREATE FUNCTION counter() RETURNS int ... SCRATCHPAD; CREATE FUNCTION match(varchar(200), char(15)) RETURNS char(1) ... SCRATCHPAD;
ÀÌ SCRATCHPAD Ű¿öµå´Â DB2¿¡°Ô ÇÔ¼ö¿¡ ´ëÇÑ ½ºÅ©·¡Ä¡ ÆÐµå¸¦ ÇÒ´çÇϰí À¯Áöº¸¼öÇϵµ·Ï ¾Ë·ÁÁÝ´Ï´Ù. DB2´Â 2Áø 0À¸·Î ½ºÅ©·¡Ä¡ ÆÐµå¸¦ ÃʱâÈÇÕ´Ï´Ù. Å×À̺í ÇÔ¼ö°¡ ±âº»°ªÀÎ NO FINAL CALL°ú ÇÔ²² ÁöÁ¤µÇ´Â °æ¿ì, DB2´Â °¢ OPEN È£Ãâ Àü¿¡ ½ºÅ©·¡Ä¡ ÆÐµå¸¦ »õ·Î °íĨ´Ï´Ù. Å×À̺í ÇÔ¼ö ¿É¼Ç FINAL CALLÀ» ÁöÁ¤ÇÏ´Â °æ¿ì, DB2´Â ±× ÀÌÈÄ ½ºÅ©·¡Ä¡ ÆÐµåÀÇ ³»¿ëÀ» °Ë»çÇϰųª º¯°æÇÏÁö ¾Ê½À´Ï´Ù. ½ºÅ©·¡Ä¡ ÆÐµå´Â ¸Å¹ø È£ÃâµÉ ¶§¸¶´Ù ÇÔ¼ö¿¡ Àü´ÞµË´Ï´Ù. ÇÔ¼ö´Â ´Ù½Ã ÀÔ·ÂµÉ ¼ö ÀÖÀ¸¸ç, DB2´Â »óÅ Á¤º¸¸¦ ½ºÅ©·¡Ä¡ ÆÐµå¿¡ º¸°üÇÕ´Ï´Ù.
±×·¯¹Ç·Î °è¼ö±â(counter) ¿¹ÀÇ °æ¿ì ¸®ÅÏµÈ ¸¶Áö¸· °ªÀº ½ºÅ©·¡Ä¡ ÆÐµå¿¡ º¸°üµÉ ¼ö ÀÖ½À´Ï´Ù. ±×¸®°í ÀÏÄ¡(match) ¿¹ÀÇ °æ¿ì, ½ºÅ©·¡Ä¡ ÆÐµå°¡ ÃæºÐÈ÷ Å©¸é ¹®¼ ¸ñ·ÏÀ» ½ºÅ©·¡Ä¡ ÆÐµå¿¡ º¸°üÇÒ ¼ö ÀÖ°í, ±×·¸Áö ¾ÊÀ¸¸é ÀÌ ¸ñ·ÏÀ» À§ÇÑ ¸Þ¸ð¸®¸¦ ÇÒ´çÇÏ°í ½ºÅ©·¡Ä¡ ÆÐµå¿¡ È®º¸ÇÑ ¸Þ¸ð¸® ÁÖ¼Ò¸¦ º¸°üÇÒ ¼ö ÀÖ½À´Ï´Ù.
UDF°¡ ½Ã½ºÅÛ ÀÚ¿øÀ» È®º¸ÇϰíÀÚ ÇÒ ¼öµµ ÀÖÀ¸¹Ç·Î UDF´Â FINAL CALL Ű¿öµå¸¦ »ç¿ëÇÏ¿© Á¤ÀÇµÉ ¼ö ÀÖ½À´Ï´Ù. ÀÌ Å°¿öµå´Â DB2¿¡°Ô ¾Ë·Á ¸í·É¹®ÀÇ ³¡ 󸮿¡¼ UDF¸¦ È£ÃâÇÏ¿© UDF°¡ ½Ã½ºÅÛ ÀÚ¿øÀ» ¸±¸®½ºÇÒ ¼ö ÀÖµµ·Ï ÇÕ´Ï´Ù. ƯÈ÷, ½ºÅ©·¡Ä¡ ÆÐµå°¡ °íÁ¤µÈ Å©±âÀ̹ǷÎ, UDF´Â ÀÚ±â ÀÚ½ÅÀ» À§ÇÑ ¸Þ¸ð¸®¸¦ ÇÒ´çÇÏ·Á ÇÒ ¼ö ÀÖÀ¸¸ç, ÀÌ·¸°Ô ÇÏ¿© ÃÖÁ¾ È£ÃâÀ» »ç¿ëÇÏ¿© ¸Þ¸ð¸®¸¦ ÇØÁ¦ÇÕ´Ï´Ù. ¿¹¸¦ µé¾î À§ÀÇ ÀÏÄ¡(match) ÇÔ¼ö´Â ¾ó¸¶³ª ¸¹Àº ¹®¼µéÀÌ ÁÖ¾îÁø ÅØ½ºÆ® ¹®ÀÚ¿°ú ÀÏÄ¡ÇÒ °ÍÀÎÁö¸¦ ¿¹ÃøÇÏÁö ¸øÇÕ´Ï´Ù. ±×·¯¹Ç·Î ÀÏÄ¡(match)¿¡ ´ëÇÑ ´õ ³ªÀº Á¤ÀÇ´Â ´ÙÀ½°ú °°½À´Ï´Ù.
CREATE FUNCTION match(varchar(200), char(15)) RETURNS char(1) ... SCRATCHPAD FINAL CALL;
½ºÅ©·¡Ä¡ ÆÐµå¸¦ »ç¿ëÇÏ°í ºÎ¼Ó Á¶È¸¿¡¼ ÂüÁ¶µÇ´Â UDFÀÇ °æ¿ì, DB2´Â ÃÖÁ¾ È£ÃâÀ» ¼öÇàÇϰí(UDF¿¡ ±×·¸°Ô ÁöÁ¤µÇ¾î ÀÖ´Â °æ¿ì) ºÎ¼Ó Á¶È¸ È£Ãâ°ú È£Ãâ »çÀÌ¿¡ ½ºÅ©·¡Ä¡ ÆÐµå¸¦ °»½ÅÇϱâ·Î °áÁ¤ÇÒ ¼ö ÀÖ½À´Ï´Ù. »ç¿ëÀÚÀÇ UDF°¡ ºÎ¼Ó Á¶È¸¿¡¼ »ç¿ëµÇ´Â °æ¿ì, FINAL CALLÀ» »ç¿ëÇÏ¿© UDF¸¦ Á¤ÀÇÇϰí È£Ãâ À¯Çü Àμö¸¦ »ç¿ëÇϰųª Ç×»ó 2Áø 0 Á¶°ÇÀ» Á¡°ËÇÔÀ¸·Î½á ÀÌ·¯ÇÑ °¡´É¼ºÀ» ¹æÁöÇÒ ¼ö ÀÖ½À´Ï´Ù.
FINAL CALLÀ» ÁöÁ¤ÇÑ °æ¿ì, »ç¿ëÀÚÀÇ UDF°¡ FIRST À¯ÇüÀÇ È£ÃâÀ» ¼ö½Å ¿©ºÎ¿¡ ÁÖÀÇÇϽʽÿÀ. À̰ÍÀº ÀϺΠÁö¼ÓÀûÀÎ ÀÚ¿øÀ» È®º¸Çϰí ÃʱâÈÇÏ´Â µ¥ »ç¿ëµÉ ¼ö ÀÖ½À´Ï´Ù.