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 ÀÚµ¿È ¿ÀºêÁ§Æ®ÀÇ °ø¿ë ¸Þ¼Òµå·Î ±¸ÇöµË´Ï´Ù. 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 ÂüÁ¶¿¡ ´ëÇÏ¿© º°µµÀÇ ÀνºÅϽºµéÀÌ ÀÛ¼ºµË´Ï´Ù.
½ºÅ©·¡Ä¡ ÆÐµå¸¦ »ç¿ëÇÔÀ¸·Î½á ¸Þ¼Òµå°¡ ¿©·¯ ÇÔ¼ö È£Ãâ¿¡ °ÉÃÄ ¿ÀºêÁ§Æ®ÀÇ ÀνºÅϽº º¯¼ö¿¡ »óÅ Á¤º¸¸¦ À¯Áöº¸¼öÇÒ ¼ö ÀÖ½À´Ï´Ù. ¶ÇÇÑ ¿ÀºêÁ§Æ® ÀνºÅϽº°¡ ´Ü ÇÑ ¹ø ÀÛ¼ºµÇ°í ÈÄ¼Ó È£Ãâ¿¡ Àç»ç¿ëµÇ¹Ç·Î ¼º´ÉÀ» Çâ»ó½Ãŵ´Ï´Ù.
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] | |||
|
DB2¿Í OLE ÀÚµ¿È UDF °£¿¡ Àü´ÞµÈ µ¥ÀÌÅÍ´Â ÂüÁ¶¿¡ ÀÇÇÑ È£Ãâ·Î Àü´ÞµË´Ï´Ù. Å×ÀÌºí¿¡ ³ª¿µÇÁö ¾ÊÀº BIGINT, DECIMALÀ̳ª LOCATORS¿Í °°Àº SQL À¯Çü ¶Ç´Â ºÎ¿ïÀ̳ª CURRENCY¿Í °°Àº OLE ÀÚµ¿È À¯ÇüÀº Áö¿øµÇÁö ¾Ê½À´Ï´Ù. BSTR¿¡ ¸ÊÇÎµÈ ¹®ÀÚ ¶Ç´Â ±×·¡ÇÈ µ¥ÀÌÅÍ´Â µ¥ÀÌÅͺ£À̽º ÄÚµå ÆäÀÌÁö¿¡¼ UCS-2(À¯´ÏÄÚµå¶ó°íµµ ÇÏ´Â IBM ÄÚµå ÆäÀÌÁö 13488) ½ºÅ´À¸·Î ¸ÊÇε˴ϴÙ. ¸®ÅϽà µ¥ÀÌÅÍ´Â ´Ù½Ã µ¥ÀÌÅͺ£À̽º ÄÚµå ÆäÀÌÁö·Î º¯È¯µË´Ï´Ù. ÀÌ·¯ÇÑ º¯È¯Àº µ¥ÀÌÅͺ£À̽º ÄÚµå ÆäÀÌÁö¿¡ »ó°ü¾øÀÌ ¹ß»ýÇÕ´Ï´Ù. µ¥ÀÌÅͺ£À̽º ÄÚµå ÆäÀÌÁö¿¡¼ UCS-2·Î ¶Ç´Â UCS-2¿¡¼ µ¥ÀÌÅͺ£À̽º ÄÚµå ÆäÀÌÁö·Î º¯È¯ÇÒ ÄÚµå ÆäÀÌÁö º¯È¯ Å×À̺íÀÌ ¼³Ä¡µÇ¾î ÀÖÁö ¾ÊÀº °æ¿ì, SQLCODE -332(SQLSTATE 57017)¸¦ ¹Þ°Ô µË´Ï´Ù.
¸ðµç ¾ð¾î·Î 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 | ||
|
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 ÀÚµ¿ Å×À̺í ÇÔ¼ö¿¡¼ ¼³¸íµË´Ï´Ù.
Ç¥ 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 ÀÚµ¿ ¼¹ö Áß ¹«¾ùÀ» ¼±ÅÃÇÒ °ÍÀΰ¡´Â ÀÚµ¿ ¼¹ö¸¦ ±¸ÇöÇÒ ¶§ »ç¿ëÀÚ°¡ ¼±ÅÃÇÏ°Ô µË´Ï´Ù. ¼º´É »óÀÇ °üÁ¡¿¡¼´Â ´ÜÀÏ »ç¿ë ¼¹ö°¡ ±ÇÀåµË´Ï´Ù.