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


OLE ÀÚµ¿ UDF ÀÛ¼º

OLE(¿ÀºêÁ§Æ® ¸µÅ© ¹× »ðÀÔ) ÀÚµ¿È­´Â Microsoft CorporationÀÇ OLE 2.0 ±¸Á¶ÀÇ ÀϺÎÀÔ´Ï´Ù. OLE ÀÚµ¿È­¸¦ »ç¿ëÇÏ¿©, »ç¿ëÀÚÀÇ ÀÀ¿ëÇÁ·Î±×·¥Àº ÀÛ¼ºµÈ ¾ð¾î¿¡ »ó°ü¾øÀÌ OLE ÀÚµ¿È­ ¿ÀºêÁ§Æ®¿¡¼­ Ư¼º°ú ¸Þ¼Òµå¸¦ °ø°³ÇÒ ¼ö ÀÖ½À´Ï´Ù. Lotus Notes ¶Ç´Â Microsoft Exchange(R)¿Í °°Àº ±âŸ ÀÀ¿ëÇÁ·Î±×·¥Àº ÀÌ·± Ư¼º°ú ¸Þ¼Òµå¸¦ OLE ÀÚµ¿È­¸¦ ÅëÇØ »ç¿ëÇÏ¿© ÀÌ·± ¿ÀºêÁ§Æ®¸¦ ÅëÇÕÇÒ ¼ö ÀÖ½À´Ï´Ù.

Ư¼º°ú ¸Þ¼Òµå¸¦ °ø°³ÇÏ´Â ÀÀ¿ëÇÁ·Î±×·¥µéÀº OLE ÀÚµ¿È­ ¼­¹ö ¶Ç´Â ¿ÀºêÁ§Æ®¶ó°í Çϸç, ÀÌ Æ¯¼º°ú ¸Þ¼Òµå¿¡ ¾×¼¼½ºÇÏ´Â ÀÀ¿ëÇÁ·Î±×·¥µéÀ» OLE ÀÚµ¿È­ Á¦¾î±â¶ó°í ÇÕ´Ï´Ù. OLE ÀÚµ¿È­ ¼­¹ö´Â OLE IDispatch ÀÎÅÍÆäÀ̽º¸¦ ±¸ÇöÇÏ´Â COM ±¸¼º¿ä¼Ò(¿ÀºêÁ§Æ®)ÀÔ´Ï´Ù. OLE ÀÚµ¿È­ Á¦¾î±â´Â IDispatch ÀÎÅÍÆäÀ̽º¸¦ ÅëÇØ ÀÚµ¿È­ ¼­¹ö¿Í Åë½ÅÇÏ´Â COM Ŭ¶óÀ̾ðÆ®ÀÔ´Ï´Ù. COM(±¸¼º¿ä¼Ò ¿ÀºêÁ§Æ® ¸ðµ¨)Àº OLEÀÇ ±âÃÊÀÔ´Ï´Ù. OLE ÀÚµ¿È­ UDFÀÇ °æ¿ì, DB2´Â OLE ÀÚµ¿È­ Á¦¾î±â·Î ÀÛµ¿ÇÕ´Ï´Ù. ÀÌ·¯ÇÑ ¸ÞÄ«´ÏÁòÀ» ÅëÇØ DB2´Â OLE ÀÚµ¿È­ ¿ÀºêÁ§Æ® ¸Þ¼Òµå¸¦ ¿ÜºÎ UDF·Î¼­ È£ÃâÇÒ ¼ö ÀÖ½À´Ï´Ù.

ÀÌ Àý¿¡¼­´Â »ç¿ëÀÚ°¡ OLE ÀÚµ¿È­ ¿ë¾î ¹× °³³ä¿¡ Àͼ÷ÇÏ´Ù°í °¡Á¤ÇÕ´Ï´Ù. ÀÌ Ã¥¿¡¼­´Â OLE¿¡ ´ëÇÑ ¼Ò°³¸¦ Á¦°øÇÏÁö ¾Ê½À´Ï´Ù. OLE ÀÚµ¿È­ °³¿ä´Â Microsoft Corporation: The Component Object Model Specification, October 1995¸¦ ÂüÁ¶ÇϽʽÿÀ. OLE ÀÚµ¿È­¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ ³»¿ëÀº OLE Automation Programmer's Reference, Microsoft Press, 1996, ISBN 1-55615-851-3À» ÂüÁ¶ÇϽʽÿÀ.

OLE ÀÚµ¿È­ UDF¸¦ º¸¿©ÁÖ´Â DB2 ÀÀ¿ëÇÁ·Î±×·¥ °³¹ß Ŭ¶óÀÌ¾ðÆ®¿Í ÇÔ²² Æ÷ÇÔµÈ »ùÇà ÀÀ¿ëÇÁ·Î±×·¥ ¸ñ·ÏÀº Ç¥ 49ÀÇ ³»¿ëÀ» ÂüÁ¶ÇϽʽÿÀ.

OLE ÀÚµ¿È­ UDF ÀÛ¼º ¹× µî·Ï

OLE ÀÚµ¿È­ UDF´Â OLE ÀÚµ¿È­ ¿ÀºêÁ§Æ®ÀÇ °ø¿ë ¸Þ¼Òµå·Î ±¸ÇöµË´Ï´Ù. OLE ÀÚµ¿È­ ¿ÀºêÁ§Æ®´Â OLE ÀÚµ¿È­ Á¦¾î±â, Áï ÀÌ °æ¿ì DB2¿¡ ÀÇÇØ ¿ÜºÎ¿¡¼­ ÀÛ¼ºµÇ¾î¾ß Çϰí, ÃßÈÄ ¹ÙÀεù(IDispatch ±âÃÊ ¹ÙÀεù)À» Áö¿øÇÕ´Ï´Ù. OLE ÀÚµ¿È­ ¿ÀºêÁ§Æ®´Â Ŭ·¡½º ½Äº°ÀÚ(CLSID) ¶Ç´Â ¼±ÅÃÀûÀ¸·Î ÀÚµ¿È­ ¿ÀºêÁ§Æ®¸¦ ½Äº°Çϱâ À§ÇØ OLE ÇÁ·Î±×·¥ ID(progID)¿Í ÇÔ²² Windows µî·Ï µ¥ÀÌÅͺ£À̽º(·¹Áö½ºÆ®¸®)¿¡ µî·ÏµÇ¾î¾ß ÇÕ´Ï´Ù. progID´Â DCOM(ºÐ»ê COM)À» ÅëÇØ ³»ºÎ ÇÁ·Î¼¼½º(.DLL)³ª Áö¿ª(.EXE) OLE ÀÚµ¿È­ ¼­¹ö ¶Ç´Â ¿ø°Ý ¼­¹ö¸¦ ½Äº°ÇÒ ¼ö ÀÖ½À´Ï´Ù. OLE ÀÚµ¿È­ UDF´Â ½ºÄ®¶ó ÇÔ¼ö ¶Ç´Â Å×À̺í ÇÔ¼ö°¡ µÉ ¼ö ÀÖ½À´Ï´Ù.

OLE ÀÚµ¿È­ ¿ÀºêÁ§Æ®¸¦ ÄÚµùÇÑ ÈÄ, SQL CREATE FUNCTION¹®À» »ç¿ëÇÏ¿© ¿ÀºêÁ§Æ®ÀÇ ¸Þ¼Òµå¸¦ UDF·Î µî·ÏÇØ¾ß ÇÕ´Ï´Ù. OLE ÀÚµ¿È­ UDF¸¦ µî·ÏÇÏ´Â °ÍÀº ¿ÜºÎ C³ª C++ UDF¸¦ µî·ÏÇÏ´Â °Í°ú ¸Å¿ì ºñ½ÁÇÏÁö¸¸, ´ÙÀ½ÀÇ ¿É¼ÇÀ» »ç¿ëÇØ¾ß ÇÕ´Ï´Ù.

¿ÜºÎ À̸§Àº OLE ÀÚµ¿È­ ¿ÀºêÁ§Æ®¸¦ ½Äº°ÇÏ´Â OLE progID¿Í !(´À³¦Ç¥)·Î ±¸ºÐµÇ´Â ¸Þ¼Òµå À̸§À¸·Î ±¸¼ºµË´Ï´Ù.

     CREATE FUNCTION bcounter () RETURNS INTEGER
        EXTERNAL NAME 'bert.bcounter!increment'
         LANGUAGE OLE
         FENCED
         SCRATCHPAD
         FINAL CALL
         NOT DETERMINISTIC
         NULL CALL
         PARAMETER STYLE DB2SQL
         NO SQL
   NO EXTERNAL ACTION
         DISALLOW PARALLEL;

OLE ¸Þ¼Òµå ±¸Çö¿¡ ´ëÇÑ È£Ãâ ±Ô¾àÀº C³ª C++·Î ÀÛ¼ºµÈ ÇÔ¼ö¿¡ ´ëÇÑ ±Ô¾à°ú µ¿ÀÏÇÕ´Ï´Ù. BASIC ¾ð¾î·Î µÈ À§ ¸Þ¼ÒµåÀÇ ±¸ÇöÀº ¾Æ·¡¿Í °°½À´Ï´Ù(BASIC¿¡¼­ ¸Å°³º¯¼ö´Â ±âº»ÀûÀ¸·Î ÂüÁ¶¿¡ ÀÇÇÑ È£Ãâ·Î Á¤Àǵʿ¡ ÁÖÀÇ).

      Public Sub increment(output As Long, _
                          indicator As Integer, _
                           sqlstate As String, _
                           fname As String, _
                           fspecname As String, _
                          sqlmsg As String, _
                           scratchpad() As Byte, _
                           calltype As Long)

¿ÀºêÁ§Æ® ÀνºÅϽº ¹× ½ºÅ©·¡Ä¡ ÆÐµå °í·Á»çÇ×

OLE ÀÚµ¿È­ UDF(OLE ÀÚµ¿È­ ¿ÀºêÁ§Æ® ¸Þ¼Òµå)´Â OLE ÀÚµ¿È­ ¿ÀºêÁ§Æ®ÀÇ ÀνºÅϽº¿¡ Àû¿ëµË´Ï´Ù. DB2´Â SQL¹®¿¡¼­ °¢ UDF ÂüÁ¶¿¡ ´ëÇÑ ¿ÀºêÁ§Æ® ÀνºÅϽº¸¦ ÀÛ¼ºÇÕ´Ï´Ù. ¿ÀºêÁ§Æ® ÀνºÅϽº´Â SQL¹®¿¡¼­ UDF ÂüÁ¶ÀÇ ÈÄ¼Ó ¸Þ¼Òµå È£Ãâ¿¡ Àç»ç¿ëµÇ°Å³ª, ÀÌ ÀνºÅϽº´Â ¸Þ¼Òµå È£Ãâ ÈÄ ¸±¸®½ºµÇ°í »õ·Î¿î ÀνºÅϽº°¡ °¢ ÈÄ¼Ó ¸Þ¼Òµå È£Ãâ¿¡ ÀÛ¼ºµË´Ï´Ù. ÀûÀýÇÑ ¹æ¹ýÀº SQL CREATE FUNCTION¹®¿¡ SCRATCHPAD ¿É¼Ç°ú ÇÔ²² ÁöÁ¤µÉ ¼ö ÀÖ½À´Ï´Ù. LANGUAGE OLEÀýÀÇ °æ¿ì, SCRATCHPAD ¿É¼ÇÀº ÇϳªÀÇ ¿ÀºêÁ§Æ® ÀνºÅϽº°¡ Àüü Á¶È¸¿¡ ´ëÇÏ¿© ÀÛ¼ºµÇ°í Àç»ç¿ëµÇ´Â C³ª C++¿¡ ºñÇØ Ãß°¡ÀûÀÎ ±¸¹®µéÀÌ Àִµ¥ ¹ÝÇØ, NO SCRATCHPAD°¡ ÁöÁ¤µÇ¸é, »õ·Î¿î ¿ÀºêÁ§Æ® ÀνºÅϽº´Â ¸Þ¼Òµå°¡ È£ÃâµÉ ¶§¸¶´Ù ÀÛ¼ºµË´Ï´Ù. SQL¹®¿¡¼­ °¢ UDF ÂüÁ¶¿¡ ´ëÇÏ¿© º°µµÀÇ ÀνºÅϽºµéÀÌ ÀÛ¼ºµË´Ï´Ù.

½ºÅ©·¡Ä¡ ÆÐµå¸¦ »ç¿ëÇÔÀ¸·Î½á ¸Þ¼Òµå°¡ ¿©·¯ ÇÔ¼ö È£Ãâ¿¡ °ÉÃÄ ¿ÀºêÁ§Æ®ÀÇ ÀνºÅϽº º¯¼ö¿¡ »óÅ Á¤º¸¸¦ À¯Áöº¸¼öÇÒ ¼ö ÀÖ½À´Ï´Ù. ¶ÇÇÑ ¿ÀºêÁ§Æ® ÀνºÅϽº°¡ ´Ü ÇÑ ¹ø ÀÛ¼ºµÇ°í ÈÄ¼Ó È£Ãâ¿¡ Àç»ç¿ëµÇ¹Ç·Î ¼º´ÉÀ» Çâ»ó½Ãŵ´Ï´Ù.

SQL µ¥ÀÌÅÍ À¯ÇüÀÌ OLE ÀÚµ¿È­ UDF·Î Àü´ÞµÇ´Â ¹æ½Ä

DB2´Â SQL À¯Çü°ú OLE ÀÚµ¿È­ À¯Çü°£ÀÇ À¯Çüº¯È¯À» ó¸®ÇÕ´Ï´Ù. ´ÙÀ½ÀÇ Å×ÀÌºí¿¡¼­´Â Áö¿øµÇ´Â µ¥ÀÌÅÍ À¯Çü ¹× À̵éÀÌ ¸ÊÇεǴ ¹æ½ÄÀ» ¿ä¾àÇß½À´Ï´Ù. OLE ÀÚµ¿È­ À¯ÇüÀ» BASICÀ̳ª C/C++¿Í °°Àº ±¸ÇöÇÏ´Â ÇÁ·Î±×·¡¹Ö ¾ð¾îÀÇ µ¥ÀÌÅÍ À¯ÇüÀ¸·Î ¸ÊÇÎÇÏ´Â °Í¿¡ ´ëÇÑ ³»¿ëÀº Ç¥ 17¿¡ ¼³¸íµÇ¾î ÀÖ½À´Ï´Ù.

Ç¥ 16. SQL ¹× OLE ÀÚµ¿È­ µ¥ÀÌÅÍ À¯ÇüÀÇ ¸ÊÇÎ
SQL À¯Çü OLE ÀÚµ¿ À¯Çü OLE ÀÚµ¿ À¯Çü ¼³¸í
SMALLINT short 16 ºñÆ® ºÎÈ£ÀÖ´Â Á¤¼ö
INTEGER long 32 ºñÆ® ºÎÈ£ÀÖ´Â Á¤¼ö
REAL float 32 ºñÆ® IEEE À¯µ¿¼Ò¼öÁ¡ ¼ýÀÚ
FLOAT ¶Ç´Â DOUBLE double 64 ºñÆ® IEEE À¯µ¿¼Ò¼öÁ¡ ¼ýÀÚ
DATE DATE 1899³â 12¿ù 30ÀÏ ÀÌÈÄ ³¯¼öÀÇ 64 ºñÆ® À¯µ¿¼Ò¼öÁ¡ ³ª¸ÓÁö ¼ö
TIME DATE
TIMESTAMP DATE
CHAR(n) BSTR OLE ÀÚµ¿È­ ÇÁ·Î±×·¡¸Ó ÂüÁ¶¼­¿¡¼­ ¼³¸íµÈ ±æÀ̰¡ Á¢µÎ¾î·Î ºÙ´Â ¹®ÀÚ¿­.
VARCHAR(n) BSTR
LONG VARCHAR BSTR
CLOB(n) BSTR
GRAPHIC(n) BSTR OLE ÀÚµ¿È­ ÇÁ·Î±×·¡¸Ó ÂüÁ¶¼­¿¡¼­ ¼³¸íµÈ ±æÀ̰¡ Á¢µÎ¾î·Î ºÙ´Â ¹®ÀÚ¿­.
VARGRAPHIC(n) BSTR
LONG GRAPHIC BSTR
DBCLOB(n) BSTR
CHAR(n)1 SAFEARRAY[ºÎÈ£¾ø´Â char] 8 ºñÆ® ºÎÈ£¾ø´Â µ¥ÀÌÅÍ Ç׸ñÀÇ 1Â÷¿ø Byte() ¹è¿­. SAFEARRAY´Â OLE ÀÚµ¿È­ ÇÁ·Î±×·¡¸Ó ÂüÁ¶¼­¿¡ ¼³¸íµÇ¾î ÀÖ½À´Ï´Ù.
VARCHAR(n)1 SAFEARRAY[ºÎÈ£¾ø´Â char]
LONG VARCHAR1 SAFEARRAY[ºÎÈ£¾ø´Â char]
BLOB(n) SAFEARRAY[ºÎÈ£¾ø´Â char]
ÁÖ:
  1. FOR BIT DATA°¡ ÁöÁ¤µÊ

DB2¿Í OLE ÀÚµ¿È­ UDF °£¿¡ Àü´ÞµÈ µ¥ÀÌÅÍ´Â ÂüÁ¶¿¡ ÀÇÇÑ È£Ãâ·Î Àü´ÞµË´Ï´Ù. Å×ÀÌºí¿¡ ³ª¿­µÇÁö ¾ÊÀº BIGINT, DECIMALÀ̳ª LOCATORS¿Í °°Àº SQL À¯Çü ¶Ç´Â ºÎ¿ïÀ̳ª CURRENCY¿Í °°Àº OLE ÀÚµ¿È­ À¯ÇüÀº Áö¿øµÇÁö ¾Ê½À´Ï´Ù. BSTR¿¡ ¸ÊÇÎµÈ ¹®ÀÚ ¶Ç´Â ±×·¡ÇÈ µ¥ÀÌÅÍ´Â µ¥ÀÌÅͺ£À̽º ÄÚµå ÆäÀÌÁö¿¡¼­ UCS-2(À¯´ÏÄÚµå¶ó°íµµ ÇÏ´Â IBM ÄÚµå ÆäÀÌÁö 13488) ½ºÅ´À¸·Î ¸ÊÇε˴ϴÙ. ¸®ÅϽà µ¥ÀÌÅÍ´Â ´Ù½Ã µ¥ÀÌÅͺ£À̽º ÄÚµå ÆäÀÌÁö·Î º¯È¯µË´Ï´Ù. ÀÌ·¯ÇÑ º¯È¯Àº µ¥ÀÌÅͺ£À̽º ÄÚµå ÆäÀÌÁö¿¡ »ó°ü¾øÀÌ ¹ß»ýÇÕ´Ï´Ù. µ¥ÀÌÅͺ£À̽º ÄÚµå ÆäÀÌÁö¿¡¼­ UCS-2·Î ¶Ç´Â UCS-2¿¡¼­ µ¥ÀÌÅͺ£À̽º ÄÚµå ÆäÀÌÁö·Î º¯È¯ÇÒ ÄÚµå ÆäÀÌÁö º¯È¯ Å×À̺íÀÌ ¼³Ä¡µÇ¾î ÀÖÁö ¾ÊÀº °æ¿ì, SQLCODE -332(SQLSTATE 57017)¸¦ ¹Þ°Ô µË´Ï´Ù.

BASIC ¹× C++¿¡¼­ OLE ÀÚµ¿È­ ±¸Çö

¸ðµç ¾ð¾î·Î OLE ÀÚµ¿È­ UDF¸¦ ±¸ÇöÇÒ ¼ö ÀÖ½À´Ï´Ù. ÀÌ Àý¿¡¼­´Â µÎ °¡Áö »ùÇà ¾ð¾î·Î BASIC°ú C++¸¦ »ç¿ëÇÏ¿© OLE ÀÚµ¿È­ UDF¸¦ ±¸ÇöÇÏ´Â ¹æ¹ýÀ» º¸¿©ÁÝ´Ï´Ù.

Ç¥ 17¿¡¼­´Â ´Ù¾çÇÑ SQL µ¥ÀÌÅÍ À¯ÇüÀÌ Áß°£ »ý¼ºµÇ´Â OLE ÀÚµ¿È­ µ¥ÀÌÅÍ À¯Çü ¹× ÇØ´ç ¾ð¾î(BASIC ¶Ç´Â C++)ÀÇ µ¥ÀÌÅÍ À¯ÇüÀ¸·Î ¸ÊÇεǴ °ÍÀ» º¸¿©ÁÝ´Ï´Ù. OLE µ¥ÀÌÅÍ À¯ÇüÀº ¾ð¾î¿¡ µ¶¸³ÀûÀÔ´Ï´Ù. Áï, Ç¥ 16Àº ¸ðµç ¾ð¾î¿¡ Àû¿ëµË´Ï´Ù.

Ç¥ 17. SQL ¹× OLE µ¥ÀÌÅÍ À¯ÇüÀ» BASIC°ú C++ µ¥ÀÌÅÍ À¯ÇüÀ¸·Î ¸ÊÇÎ
SQL À¯Çü OLE ÀÚµ¿ À¯Çü UDF ¾ð¾î
BASIC À¯Çü C++ À¯Çü
SMALLINT short Integer short
INTEGER long Long long
REAL float Single float
FLOAT ¶Ç´Â DOUBLE double Double double
DATE, TIME, TIMESTAMP DATE Date DATE
CHAR(n), VARCHAR(n), LONG VARCHAR, CLOB(n) BSTR String BSTR
GRAPHIC(n), VARGRAPHIC(n), LONG GRAPHIC, DBCLOB(n) BSTR String BSTR
CHAR(n)1, VARCHAR(n)1, LONG VARCHAR1, BLOB(n) SAFEARRAY[ºÎÈ£¾ø´Â char] Byte() SAFEARRAY
ÁÖ:
  1. FOR BIT DATA°¡ ÁöÁ¤µÊ

BASICÀÇ OLE ÀÚµ¿ UDF

BASICÀ¸·Î OLE ÀÚµ¿È­ UDF¸¦ ±¸ÇöÇϱâ À§Çؼ­´Â, OLE ÀÚµ¿È­ À¯Çü¿¡ ¸ÊÇεǴ SQL µ¥ÀÌÅÍ À¯Çü¿¡ ´ëÀÀÇÏ´Â BASIC µ¥ÀÌÅÍ À¯ÇüÀ» »ç¿ëÇØ¾ß ÇÕ´Ï´Ù.

OLE ÀÚµ¿È­ UDF ÀÛ¼º ¹× µî·ÏÀÇ bcounter OLE ÀÚµ¿È­ UDFÀÇ BASIC ¼±¾ðÀº ´ÙÀ½°ú °°½À´Ï´Ù.

      Public Sub increment(output As Long, _
                          indicator As Integer, _
                           sqlstate As String, _
                           fname As String, _
                           fspecname As String, _
                          sqlmsg As String, _
                           scratchpad() As Byte, _
                           calltype As Long)

OLE Å×À̺í ÀÚµ¿È­ÀÇ ¿¹´Â ¿¹: BASICÀ¸·Î ÀÛ¼ºÇÑ ¸ÞÀÏ OLE ÀÚµ¿ Å×À̺í ÇÔ¼ö¿¡¼­ ¼³¸íµË´Ï´Ù.

C++ÀÇ OLE ÀÚµ¿ UDF

Ç¥ 17¿¡¼­´Â SQL µ¥ÀÌÅÍ À¯Çü¿¡ ´ëÀÀÇÏ´Â C++ µ¥ÀÌÅÍ À¯Çü ¹× À̵éÀÌ OLE ÀÚµ¿È­ À¯Çü¿¡ ¸ÊÇεǴ ¹æ½ÄÀ» º¸¿©ÁÝ´Ï´Ù.

increment OLE ÀÚµ¿È­ UDFÀÇ C++ ¼±¾ðÀº ´ÙÀ½°ú °°½À´Ï´Ù.

     STDMETHODIMP Ccounter::increment (long   *output,
                                       short  *indicator,
                                      BSTR    *sqlstate,
                                      BSTR    *fname,
                                      BSTR    *fspecname,
                                       BSTR   *sqlmsg,
                                       SAFEARRAY **scratchpad,
                                              long *calltype );

OLE´Â OLE ÀÚµ¿È­ ¿ÀºêÁ§Æ®ÀÇ Æ¯¼º°ú ¸Þ¼Òµå¸¦ ¼³¸íÇÏ´Â À¯Çü ¶óÀ̺귯¸®¸¦ Áö¿øÇÕ´Ï´Ù. °ø°³µÈ ¿ÀºêÁ§Æ®, Ư¼º ¹× ¸Þ¼Òµå´Â ¿ÀºêÁ§Æ® ¼³¸í ¾ð¾î(ODL)¿¡¼­ ¼³¸íµË´Ï´Ù. À§ÀÇ C++ ¸Þ¼Òµå¿¡ ´ëÇÑ ODL ¼³¸íÀº ´ÙÀ½°ú °°½À´Ï´Ù.

     HRESULT increment ([out]    long  *output,
                        [out]    short *indicator,
                           [out] BSTR    *sqlstate,
                           [in]  BSTR    *fname,
                           [in]  BSTR    *fspecname,
                        [out]    BSTR  *sqlmsg,
                        [in,out] SAFEARRAY (unsigned char) *scratchpad,
                           [in]  long    *calltype);

ODL ¼³¸íÀ¸·Î ¸Å°³º¯¼ö°¡ ÀÔ·Â(in) ¸Å°³º¯¼öÀÎÁö, Ãâ·Â(out) ¸Å°³º¯¼öÀÎÁö ¶Ç´Â ÀÔÃâ·Â(in,out) ¸Å°³º¯¼öÀÎÁö ¿©ºÎ¸¦ ÁöÁ¤ÇÒ ¼ö ÀÖ½À´Ï´Ù. OLE ÀÚµ¿È­ UDFÀÇ °æ¿ì, UDF ÀÔ·Â ¸Å°³º¯¼ö¿Í ÀԷ ǥ½Ã±â´Â [in] ¸Å°³º¯¼ö·Î ÁöÁ¤µÇ°í, UDF Ãâ·Â ¸Å°³º¯¼ö¿Í Ãâ·Â Ç¥½Ã±â´Â [out] ¸Å°³º¯¼ö·Î ÁöÁ¤µË´Ï´Ù. UDF ÈĹÌ(trailing) ÀμöÀÇ °æ¿ì, sqlstate´Â [out] ¸Å°³º¯¼öÀ̰í, ÇÔ¼ö À̸§ ¹× ÇÔ¼ö °íÀ¯ À̸§Àº [in] ¸Å°³º¯¼öÀ̸ç, ½ºÅ©·¡Ä¡ ÆÐµå´Â [in,out] ¸Å°³º¯¼öÀ̰í, È£Ãâ À¯ÇüÀº [in] ¸Å°³º¯¼öÀÔ´Ï´Ù.

Å×À̺í ÇÔ¼ö¿¡´Â CREATE FUNCTION¹®ÀÇ RETURN Ä÷³¿¡ ÇØ´çµÇ´Â ¿©·¯°³ÀÇ Ãâ·Â ¸Å°³º¯¼ö¿Í Ãâ·Â Ç¥½Ã±â°¡ Àִµ¥ ºñÇØ, ½ºÄ®¶ó ÇÔ¼öÀÇ °æ¿ì ÇϳªÀÇ Ãâ·Â ¸Å°³º¯¼ö¿Í Ãâ·Â Ç¥½Ã±â°¡ ÀÖ½À´Ï´Ù.

OLE ÀÚµ¿È­´Â ¹®ÀÚ¿­À» ó¸®Çϱâ À§ÇØ BSTR µ¥ÀÌÅÍ À¯ÇüÀ» Á¤ÀÇÇÕ´Ï´Ù. BSTRÀº OLECHAR¿¡ ´ëÇÑ Æ÷ÀÎÅÍ(typedef OLECHAR *BSTR)·Î Á¤Àǵ˴ϴÙ. BSTR ÇÒ´ç ¹× ÇØÁ¦¸¦ À§ÇØ, OLE´Â ¸Å°³º¯¼ö¿¡ »õ·Î¿î °ªÀ» ÁöÁ¤Çϱâ Àü¿¡ ÂüÁ¶¿¡ ÀÇÇÑ ¸Å°³º¯¼ö¿¡ Àü´ÞµÈ BSTRÀ» È£ÃâÀÚ°¡ ÇØÁ¦Çϵµ·Ï ±ÔÄ¢À» Á¤Çß½À´Ï´Ù. ÀÌ ±ÔÄ¢Àº DB2¿Í OLE ÀÚµ¿È­ UDF¿¡ ´ëÇÏ¿© ´ÙÀ½À» ÀǹÌÇÕ´Ï´Ù. µ¿ÀÏÇÑ ±ÔÄ¢ÀÌ ´ÙÀ½ SAFEARRAY**·Î È£ÃâÀÚ¿¡ ÀÇÇØ ¼ö½ÅµÈ 1Â÷¿ø ¹ÙÀÌÆ® ¹è¿­¿¡ Àû¿ëµË´Ï´Ù.

´Ù¸¥ ¸Å°³º¯¼öµéÀº Æ÷ÀÎÅÍ·Î Àü´ÞµË´Ï´Ù. DB2´Â ÂüÁ¶µÈ ¸Þ¸ð¸®¸¦ ÇÒ´çÇÏ°í °ü¸®ÇÕ´Ï´Ù.

OLE ÀÚµ¿È­¿¡¼­´Â BSTR°ú SAFEARRAY¸¦ ó¸®Çϱâ À§ÇÑ µ¥ÀÌÅÍ Á¶ÀÛ ÇÔ¼ö ¼¼Æ®¸¦ Á¦°øÇÕ´Ï´Ù. µ¥ÀÌÅÍ Á¶ÀÛ ÇÔ¼ö´Â OLE ÀÚµ¿È­ ÇÁ·Î±×·¡¸Ó ÂüÁ¶¼­¿¡ ¼³¸íµÇ¾î ÀÖ½À´Ï´Ù.

´ÙÀ½ÀÇ C++ UDF´Â CLOB ÀÔ·Â ¸Å°³º¯¼öÀÇ Ã³À½ 5ÀÚ¸¦ ¸®ÅÏÇÕ´Ï´Ù.

     // UDF DDL: CREATE FUNCTION crunch (clob(5k)) RETURNS char(5)
 
     STDMETHODIMP Cobj::crunch (BSTR *in,          // CLOB(5K)
                                BSTR *out,         // CHAR(5)
                                short *indicator1,  // input indicator
                                short *indicator2,  // output indicator
                                BSTR *sqlstate,    // pointer to NULL
                                BSTR *fname,       // pointer to function name
                                BSTR *fspecname,   // pointer to specific name
                                BSTR *msgtext)     // pointer to NULL
       {
          // Allocate BSTR of 5 characters
          // and copy 5 characters of input parameter
 
          // out is an [out] parameter of type BSTR, that is,
          // it is a pointer to NULL and the memory does not have to be freed.
          // DB2 will free the allocated BSTR.
 
          *out = SysAllocStringLen (*in, 5);
       return NOERROR;
       };

OLE ÀÚµ¿ ¼­¹ö´Â ÀÛ¼º°¡´ÉÇÑ ´ÜÀÏ »ç¿ë ¶Ç´Â ÀÛ¼º°¡´ÉÇÑ º¹¼ö »ç¿ëÀ¸·Î ±¸ÇöµÉ ¼ö ÀÖ½À´Ï´Ù. ÀÛ¼º°¡´ÉÇÑ ´ÜÀÏ »ç¿ëÀ» ÅëÇØ CoGetClassObject¸¦ »ç¿ëÇÏ¿© OLE ÀÚµ¿ ¿ÀºêÁ§Æ®¿¡ ¿¬°áµÈ °¢ Ŭ¶óÀ̾ðÆ®(Áï, DB2 FENCED ÇÁ·Î¼¼½º)´Â Ŭ·¡½º ÆÑÅ丮(factory)ÀÇ ÀÚ½ÅÀÇ ÀνºÅϽº¸¦ »ç¿ëÇϰí Çʿ信 µû¶ó OLE ÀÚµ¿ ¼­¹öÀÇ »õ·Î¿î »çº»À» ¼öÇà½Ãų ¼ö ÀÖ½À´Ï´Ù. ÀÛ¼º°¡´ÉÇÑ º¹¼ö »ç¿ëÀ» ÅëÇØ ¸¹Àº Ŭ¶óÀÌ¾ðÆ®µéÀÌ °°Àº Ŭ·¡½º ÆÑÅ丮(factory)·Î ¿¬°áµË´Ï´Ù. Áï, Ŭ·¡½º ÆÑÅ丮(factory)ÀÇ °¢ ÀνºÅϽºÈ­´Â ÀÌ¹Ì ¼öÇàµÇ°í ÀÖ´Â OLE ¼­¹ö »çº»ÀÌ ÀÖ´Â °æ¿ì À̰Ϳ¡ ÀÇÇØ Á¦°øµË´Ï´Ù. ¼öÇà ÁßÀÎ OLE ¼­¹ö »çº»ÀÌ ¾ø´Â °æ¿ì, Ŭ·¡½º ¿ÀºêÁ§Æ®¸¦ Á¦°øÇϱâ À§ÇØ »çº»ÀÌ ÀÚµ¿À¸·Î ½ÃÀ۵˴ϴÙ. ´ÜÀÏ »ç¿ë OLE ÀÚµ¿ ¼­¹ö¿Í º¹¼ö »ç¿ë OLE ÀÚµ¿ ¼­¹ö Áß ¹«¾ùÀ» ¼±ÅÃÇÒ °ÍÀΰ¡´Â ÀÚµ¿ ¼­¹ö¸¦ ±¸ÇöÇÒ ¶§ »ç¿ëÀÚ°¡ ¼±ÅÃÇÏ°Ô µË´Ï´Ù. ¼º´É »óÀÇ °üÁ¡¿¡¼­´Â ´ÜÀÏ »ç¿ë ¼­¹ö°¡ ±ÇÀåµË´Ï´Ù.


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