ÀÀ¿ëÇÁ·Î±×·¥ °³¹ß ¾È³»¼­

½ºÅ©·¡Ä¡ ÆÐµå °í·Á»çÇ×

»ç¿ëÀÚÀÇ UDF¿¡¼­ ½ºÅ©·¡Ä¡ ÆÐµå¸¦ »ç¿ëÇÒ °ÍÀÎÁö ¿©ºÎ¿¡ ¿µÇâÀ» ¹ÌÄ¡´Â Àμö´Â ÀÌ·¯ÇÑ Æ¯º°ÇÑ Àý¿¡¼­ ¼³¸íÇØ¾ß ÇÒ¸¸Å­ Áß¿äÇÕ´Ï´Ù. ±âŸ ÄÚµù½Ã °í·Á»çÇ×Àº ±âŸ ÄÚµù½Ã °í·Á»çÇ׿¡¼­ ³íÀǵ˴ϴÙ.

UDF¸¦ ÀçÀԷµǵµ·Ï ÄÚµùÇÏ´Â °ÍÀÌ Áß¿äÇÕ´Ï´Ù. À̰ÍÀº ÁÖ·Î UDF¿¡ ´ëÇÑ ¸¹Àº ÂüÁ¶µéÀÌ ÇÔ¼ö ³»¿ëÀÇ µ¿ÀÏÇÑ »çº»À» »ç¿ëÇÑ´Ù´Â »ç½Ç ¶§¹®ÀÔ´Ï´Ù. »ç½Ç»ó ÀÌ·¯ÇÑ ¸¹Àº ÂüÁ¶µéÀº ´Ù¸¥ ¸í·É¹®À̳ª ÀÀ¿ëÇÁ·Î±×·¥¿¡ ÀÖÀ» ¼öµµ ÀÖ½À´Ï´Ù. ±×·¯³ª ÇÔ¼öµéÀÌ ÇÑ È£Ãâ¿¡¼­ ´ÙÀ½ È£Ãâ·Î »óŸ¦ ÀúÀåÇÒ Çʿ䰡 Àְųª ÀúÀåÇϰíÀÚ ÇÑ´Ù´Â Á¡¿¡ ÁÖÀÇÇϽʽÿÀ. ÀÌ·¯ÇÑ ÇÔ¼öµéÀÇ µÎ °¡Áö ¹üÁÖ´Â ´ÙÀ½°ú °°½À´Ï´Ù.

  1. ÀúÀå »óÅ¿¡ ÀÇÁ¸ÇÏ´Â ÇÔ¼öµé

    ÀÌ·¯ÇÑ ÇÔ¼öÀÇ ¿¹´Â ¸Ç óÀ½ È£ÃâµÇ¾úÀ» ¶§ '1'À» ¸®ÅÏÇϰí, ±× ÀÌÈÄ ¿¬¼ÓµÇ´Â È£Ãâ¿¡¼­ 1¾¿ Áõ°¡½ÃŰ´Â ´Ü¼øÇÑ °è¼ö±â(counter) ÇÔ¼öÀÔ´Ï´Ù. ÀÌ·¯ÇÑ ÇÔ¼ö´Â SELECT °á°ú Çà¿¡ ¹øÈ£¸¦ ºÙÀÌ´Â µ¥ »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù.

         SELECT counter(), a, b+c, ...
         FROM tablex
         WHERE ...
    

    ÀÌ·¯ÇÑ ÇÔ¼öÀÇ À¯ÇüÀº NOT DETERMINISTIC ¶Ç´Â VARIANTÀÔ´Ï´Ù. ÀÌ ÇÔ¼öÀÇ Ãâ·ÂÀº ÀüÀûÀ¸·Î SQL Àμö °ª¿¡¸¸ ÀÇÁ¸ÇÏÁö ¾Ê½À´Ï´Ù. ÀÌ °è¼ö±â(counter) ÇÔ¼ö´Â ¿¹: °è¼ö±â(Counter)¿¡ ³ª¿Í ÀÖ½À´Ï´Ù.

  2. ´Ü Çѹø ÃʱâÈ­ Á¶Ä¡¸¦ ¼öÇàÇÏ´Â ±â´ÉÀ¸·Î ¼º´ÉÀÌ Çâ»óµÉ ¼ö ÀÖ´Â ÇÔ¼ö.

    ÀÌ·¯ÇÑ ÇÔ¼öÀÇ ¿¹·Î, ¹®¼­ ÀÀ¿ëÇÁ·Î±×·¥ÀÇ ÀϺΰ¡ µÉ ¼öµµ ÀÖ´Â ÀÏÄ¡(match) ÇÔ¼ö°¡ Àִµ¥, À̰ÍÀº ÁÖ¾îÁø ¹®¼­¿¡ ÁÖ¾îÁø ¹®ÀÚ¿­ÀÌ µé¾î ÀÖÀ¸¸é 'Y'¸¦ ¸®ÅÏÇϰí, ±×·¸Áö ¾ÊÀ¸¸é 'N'À» ¸®ÅÏÇÕ´Ï´Ù.

         SELECT docid, doctitle, docauthor
         FROM docs
         WHERE match('myocardial infarction', docid) = 'Y'
    

    ÀÌ ¸í·É¹®Àº ù¹øÂ° Àμö·Î Àü´ÞµÈ ƯÁ¤ ÅØ½ºÆ® ¹®ÀÚ¿­ °ªÀÌ µé¾î ÀÖ´Â ¸ðµç ¹®¼­¸¦ ¸®ÅÏÇÕ´Ï´Ù. ¼öÇàµÇ´Â ÀÏÄ¡(match)ÀÇ Á¾·ù´Â ´ÙÀ½°ú °°½À´Ï´Ù.

    ÀÌ Æ¯Á¤ ÀÏÄ¡(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 À¯ÇüÀÇ È£ÃâÀ» ¼ö½Å ¿©ºÎ¿¡ ÁÖÀÇÇϽʽÿÀ. À̰ÍÀº ÀϺΠÁö¼ÓÀûÀÎ ÀÚ¿øÀ» È®º¸Çϰí ÃʱâÈ­ÇÏ´Â µ¥ »ç¿ëµÉ ¼ö ÀÖ½À´Ï´Ù.


[ ÆäÀÌÁöÀÇ ¸Ç À§ | ÀÌÀü ÆäÀÌÁö | ´ÙÀ½ ÆäÀÌÁö | ¸ñÂ÷ | »öÀÎ ]