11. Large Ojbect
ÃÑ ÆäÀÌÁö ¼ö : 3224

Àüü ÇÔ¼ö/¿ë¾î»çÀü
Facebook Joinc ±×·ì   Joinc QA »çÀÌÆ®



joinc´Â Firefox¿Í chrome¿¡¼­ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼­´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù.

Large Objects

ÀÌÁ¦ºÎÅÍ´Â LOB¿¡ ´ëÇØ¼­ ¾Ë¾Æº¼ °ÍÀÌ´Ù. LOB¶õ À§¿¡¼­ º¸´Â Á¦¸ñ ±×´ë·Î Large ObjectÀÌ´Ù. À̸§¿¡ °É¸Â°Ô ÀúÀåÇÒ ¼ö ÀÖ´Â µ¥ÀÌÅÍÀÇ ¾ç ¶ÇÇÑ ´ë´ÜÇÏ´Ù. ¹«·Á 4±â°¡³ª µÈ´Ù. ½ÇÁ¦·Î ÇϳªÀÇ Ä®·³¿¡ À̸¸Å­°¡ ¾²ÀÏ ÀÏÀº °ÅÀÇ ¾øÁö¸¸ ¿©ÇÏÆ° ´ë´ÜÇÑ ¿ë·®À̶ó ÇÒ ¼ö ÀÖ´Ù. À§¿¡¼­ º¸´Â Á¦¸ñ´ë·Î LOBÀÇ ±âº»ÀûÀÎ ³»¿ëµé¿¡ ´ëÇØ¼­ »ìÆìº¸ÀÚ.

LOB¶õ ¹«¾ùÀΰ¡?

°á·ÐºÎÅÍ ¸»ÇÏÀÚ¸é LOBµµ ÇϳªÀÇ µ¥ÀÌÅÍ Å¸ÀÔÀÌ´Ù. ÇÁ·Î±×·¥À» ÀÛ¼ºÇÏ´Ùº¸¸é ¶Ç´Â µ¥ÀÌÅͺ£À̽º¸¦ Á¤¸®ÇÏ´Ùº¸¸é Å×À̺í Ä®·³¾È¿¡¼­ ´ë¿ë·®ÀÇ µ¥ÀÌÅ͸¦ ÀúÀåÇÒ Çʿ伺ÀÌ ÀÖÀ» °æ¿ì°¡ ÀÖ´Ù. ÀÌ·Ä °æ¿ì LOB¸¦ »ç¿ë ÇÒ ¼ö ÀÖ´Ù. µ¥ÀÌÅÍ´Â ÀÏ¹Ý ÅØ½ºÆ®°¡ µÉ¼öµµ ÀÖ°í ¹ÙÀ̳ʸ® µ¥ÀÌÅͰ¡ µÉ ¼öµµ ÀÖ´Ù. µ¥ÀÌÅÍÀÇ Æ¯¼º»ó »ç¿ëÇÏ´Â ºóµµ°¡ ³·°í ÀϹÝÀûÀÎ ¼ýÀÚ³ª ¹®ÀÚŸÀÔº¸´Ù ´Ù·ç±â°¡ Á»´õ ¾î·Á¿ï »ÓÀÌ´Ù. Á» ´õ µÚ¿¡¼­ º¸°ÚÁö¸¸ »ç½Ç ±×¸® ¾î·ÆÁö´Â ¾Ê´Ù.

LOB¿¡´Â ¾î¶² °ÍµéÀÌ Àִ°¡?

Å©°Ô ³ª´©ÀÚ¸é Internal°ú External µÎ°¡Áö·Î ³ª´©´Âµ¥ ÀÌ µÎ°¡Áö´Â »ç½Ç DBÀÇ ÀÔÀå¿¡¼­ º¼ ¶§ ¾îµð¿¡ ÀúÀåÀÌ µÇ´Â°¡¸¦ ±âÁØÀ¸·Î ±¸ºÐÇÑ °ÍÀÌ´Ù. °³¹ßÀÚÀÇ ÀÔÀå¿¡¼­ º¸ÀÚ¸é ÀúÀåµÇ´Â Àå¼Òº¸´Ù´Â µ¥ÀÌÅÍÀÇ Å¸ÀÔÀÌ ´õ Áß¿äÇÏ´Ù. °³¹ßÀÚÀÇ ÀÔÀå¿¡¼­ ±¸ºÐÇÑ´Ù¸é BLOB(Binary LOBs), CLOB(Character LOBs), BFILE(Binary Files) Á¤µµ·Î ³ª´­ ¼ö°¡ ÀÖ°Ú´Ù. »ç½Ç CLOB¿Ü¿¡ NCLOB(National Character LOBs)µµ ÀÖÁö¸¸ À̰͵µ ¿ª½Ã ¹®ÀÚÇü ŸÀÔÀ̹ǷΠ¾ïÁö·Î ±¸ºÐÇÏÁö´Â ¾Ê°Ú´Ù.
CLOB : DB³»ºÎ¿¡ Á¸ÀçÇÏ´Â ´ë¿ë·®ÀÇ ÅØ½ºÆ®
BLOB : Image, Sound, Video µîÀÇ ´ë¿ë·®ÀÇ DB³»ºÎ¿¡ Á¸ÀçÇÏ´Â µ¥ÀÌÅÍ
BFILE : MPEG, JPEG, DIVX µîÀÇ ´ë¿ë·®ÀÇ DB¿ÜºÎ¿¡ Á¸ÀçÇÏ´Â ÆÄÀÏ

LOB¸¦ »ç¿ëÇÏ´Â ÀÌÀ¯´Â ¹«¾ùÀΰ¡?

°á·ÐºÎÅÍ ¸»ÇÏÀÚ¸é µ¥ÀÌÅÍÀÇ ¾ÈÀüÇÑ º¸È£¿Í µ¥ÀÌÅÍ ÀúÀåÀÇ Àϰü¼º ¶§¹®À̶ó ÇÒ ¼ö ÀÖ´Ù. ¸ÕÀú µ¥ÀÌÅÍÀÇ ¾ÈÀüÇÑ º¸È£¶ó´Â ¹®Á¦¸¦ »ìÆìº¸ÀÚ¸é ¿¹Àü¿¡ ÀÛ¼ºµÈ ¸¹Àº ¾îÇø®ÄÉÀ̼ǿ¡¼­´Â »çÀÌÁî°¡ Å« ÆÄÀÏÀÇ °æ¿ì OSÂ÷¿ø¿¡¼­ ¾îÇø®ÄÉÀ̼ÇÀÌ Á¢±ÙÇÒ ¼ö ÀÖ´Â µð·ºÅ丮¸¦ ¸¸µé¾î ³õ°í ÇÊ¿äÇÑ °æ¿ì Á¢±ÙÇϵµ·Ï ÇÑ °æ¿ì°¡ ¸¹´Ù. ÀÌ·¯ÇÑ °æ¿ì OS¿¡¼­ ´©±º°¡ÀÇ ½Ç¼ö·Î µ¥ÀÌÅ͸¦ »èÁ¦ÇØ ¹ö¸°´Ù¸é µ¥ÀÌÅ͸¦ ¿ÏÀüÈ÷ ÀÒ¾î¹ö¸®´Â °ÍÀÌ´Ù. ±×·¡¼­ DB¿¡ ÀúÀåÇÏ´Â °ÍÀÌ´Ù. ´ÙÀ½À¸·Î Àϰü¼º ¹®Á¦¸¦ º¸ÀÚ¸é ¾î¶² µ¥ÀÌÅÍ´Â DB¿¡ ÀúÀåÇÏ°í ¾î¶² µ¥ÀÌÅÍ´Â OS¿¡ ÀúÀåÇÏ°í ¾ðµí º¸±â¿¡µµ ¾à°£ ¹®Á¦°¡ ÀÖ¾î º¸ÀδÙ. ½ÇÁ¦·Î ½É°¢ÇÏ´Ù°í´Â ÇÒ ¼ö ¾øÁö¸¸ Áß¿äÇÑ ¹®Á¦¸¦ ³»Æ÷Çϰí ÀÖ´Ù. OS¿¡ µ¥ÀÌÅ͸¦ ÀúÀåÇÑ´Ù´Â °ÍÀº OS¿¡¼­ ¾îÇø®ÄÉÀ̼ÇÀÌÀ» ½ÇÇàÇÏ´Â »ç¿ëÀÚÀÇ ±ÇÇÑÀ¸·Î µ¥ÀÌÅÍ¿¡ Á÷Á¢ !!! Á¢±ÙÀÌ °¡´ÉÇÏ´Ù´Â °ÍÀ̰í ÀÌ´Â ÃæºÐÇÑ »ç°í¸¦ À¯¹ßÇÒ ¼ö ÀÖ´Â °¡´É¼ºÀ» °¡Áö´Â °ÍÀÌ´Ù. µ¥ÀÌÅͺ£À̽º¸¦ »ç¿ëÇÑ´Ù¸é ¸ðµç µ¥ÀÌÅÍ(¹°·Ð °æ¿ì¿¡ µû¶ó ¾Æ´Ò ¼öµµ ÀÖÁö¸¸)´Â µ¥ÀÌÅͺ£À̽º¸¦ ÅëÇÏ¿© ÀÐ°í ¾²´Â °ÍÀÌ ¾î¶² ½Ã½ºÅÛÀ̵çÁö ´õ ÁÁ¾Æº¸ÀÌÁö ¾Ê°Ú´Â°¡? ¹°·Ð ÇÁ·Î±×·¥ °³¹ß¿¡¼­ ¾à°£ÀÇ ¼ö°í°¡ ´õ ÇÊ¿äÇÏÁö¸¸ °³¹ß ´ç½Ã Á»´õ °í»ýÇϸé Á»´õ °ß°íÇÑ ½Ã½ºÅÛÀ¸·Î ¿Ï¼ºµÉ ¼ö ÀÖÀ¸¹Ç·Î LOB¸¦ »ç¿ëÇÏ°Ô µÇ´Â °ÍÀÌ´Ù. À§ÀÇ ¸ðµç ¼³¸íÀº OS Â÷¿øÀÇ º¸È£°¡ ÀÖÀ» °æ¿ì¿¡ ÇÑÁ¤ÇÏ´Â °ÍÀÌ´Ù. ±×·² ÀÏÀº ¾øÁö¸¸ OSÀÇ ¼öÆÛÀ¯Àú°¡ µé¾î¿Í¼­ µ¥ÀÌÅͺ£À̽º¿Í ¾îÇø®ÄÉÀ̼ÇÀ» Áö¿ö¹ö¸°´Ù¸é º»Àεµ ÇÒ¸» ¾ø´Ù.

LOB¿Í Long ŸÀÔ°ú´Â ¹«¾ùÀÌ ´Ù¸¥°¡?

¿ì¼± ¾Õ¿¡¼­ º» ¹Ù¿Í °°ÀÌ Long ŸÀÔÀ» »ç¿ëÇÏÁö ¸»°í LOB¸¦ »ç¿ëÇϵµ·Ï ±ÇÇϰí ÀÖ´Ù. ÀÌ¿¡´Â ºÐ¸íÇÑ ÀÌÀ¯°¡ ÀÖÀ¸¸ç Çϳª¾¿ »ìÆìº¸ÀÚ.

  • Ç¥9 LONG ŸÀÔ°ú LOBÀÇ ºñ±³
LONG, LONG RAW LOB
Å×À̺í Çϳª´ç ÇÑ Ä®·³¸¸ Çã¿ë Å×À̺í Çϳª´ç ¿©·¯ Ä®·³
ÃÖ´ë 2±â°¡ ÃÖ´ë 4±â°¡
Data¿¡ Á÷Á¢ Á¢±Ù Locator·Î µ¥ÀÌÅÍ¿¡ Á¢±Ù
Å×À̺í¾È¿¡ ÀúÀå Å×À̺í°ú º°µµ·Î ÀúÀå
Object ŸÀÔ Áö¿ø ºÒ°¡´É Object ŸÀÔ Áö¿ø °¡´É
¼øÂ÷Àû Á¢±Ù ·£´ý Á¢±Ù °¡´É

´ëºÎºÐ ±×³É º¸¸é ¾Ë°ÚÁö¸¸ ¸î°¡Áö º¸Ãæ ¼³¸íÀ» ÇÏ°í ³Ñ¾î°¡°Ú´Ù. ¸ÕÀú Data¸¦ ÀúÀåÇϰí Á¢±Ù ÇÏ´Â ¹æ½Ä¿¡ ´ëÇØ¼­ Á» ´õ »ìÆìº¸ÀÚ¸é LOBÀÇ °æ¿ì ½Çü Å×À̺íÀÌ ÀúÀåµÇ´Â ¼¼±×¸ÕÆ®(¿À¶óŬÀÇ ³í¸®Àû µ¥ÀÌÅÍ ´ÜÀ§)¿¡ ÀúÀåµÇ´Â °ÍÀÌ ¾Æ´Ï°í LOB ¼¼±×¸ÕÆ®°¡ µû·Î Á¸ÀçÇÑ´Ù. ½ÇÁ¦ Å×ÀÌºí¿¡´Â LOB ¼¼±×¸ÕÆ®ÀÇ À§Ä¡Á¤º¸¸¸ °¡Áö°í ÀÖÀ» »ÓÀÌ´Ù. ±×·¡¼­ Å×À̺í°ú º°µµ·Î ÀúÀåµÇ°í µ¥ÀÌÅÍ´Â LocatorÀ» ÀÌ¿ëÇÏ¿© Á¢±ÙÇÑ´Ù°í ÇÏ´Â °ÍÀÌ´Ù. ´ÙÀ½À¸·Î Object ŸÀÔÀ» ¸»ÇÏÀÚ¸é À̰ÍÀº ¿À¶óŬ 8¹öÀüºÎÅÍ Áö¿øÇÏ´Â °ÍÀ¸·Î µ¥ÀÌÅͺ£À̽º °´Ã¼ÀÇ °³³äÀ» Á¢¸ñÇÑ °ÍÀÌ´Ù. ±×¸® ¸¹ÀÌ ¾²Áö´Â ¾Ê´Â °Í °°´Ù. LOBÀÇ °æ¿ì Object ŸÀÔÀ» Áö¿øÇÑ´Ù.

¾î¶² ¹æ¹ýÀ¸·Î LOB¸¦ ´Ù·ê ¼ö Àִ°¡?

LOB¸¦ ´Ù·ç´Â ¹æ¹ý¿¡´Â ¼¼°¡Áö°¡ ÀÖ´Ù. ¾Ö¼®ÇϰԵµ SQL·Î´Â »ç¿ëÇÒ ¼ö ¾øÀ¸¸ç ÇÁ·Î±×·¡¹Ö ¾ð¾î·Î¸¸ °¡´ÉÇÏ´Ù.

  • Ç¥10 ÇÁ·Î±×·¡¹Ö ¾ð¾î¿Í LOB
ÇÁ·Î±×·¡¹Ö ¾ð¾î ¼³¸í
Pro*C/C++ Áö±Ý±îÁö ¿ì¸®°¡ ¹è¿ö¿Â °ÍÀÌ´Ù. C/C++ ÇÁ·Î±×·¥¾È¿¡ SQL¹®ÀåÀ» »ðÀÔÇÔÀ¸·Î½á »ç¿ëÇÒ ¼ö ÀÖ´Ù. ¹è¿ì±â °£ÆíÇÏ°í »ç¿ëÀÌ ½¬¿î ÀåÁ¡ÀÌ ÀÖ´Ù. ´ÜÁ¡À¸·Î´Â proc¸¦ ÅëÇÑ ÇÁ¸® ÄÄÆÄÀÏ °úÁ¤À» °ÅÃÄ¾ß ÇÑ´Ù.
PL/SQL µ¥ÀÌÅͺ£À̽º ¾È¿¡¼­ »ç¿ëÇÒ ¼ö ÀÖ´Â ÇÁ·Î±×·¡¹Ö °¡´ÉÇÑ SQLÀÌ´Ù. DBMS_LOB ÆÐŰÁö¸¦ »ç¿ëÇÏ¿© LOB¸¦ ´Ù·ê ¼ö ÀÖ´Ù. ÀåÁ¡Àº SQLÀ» Á÷Á¢ Áö¿øÇÑ´Ù´Â °ÍÀÌ°í ¿À¶óŬ°ú ÅëÇյǾî À־ ¿À¶óŬÀÇ µ¥ÀÌÅÍ Å¸ÀÔÀ» ±×´ë·Î Áö¿øÇϹǷΠµ¥ÀÌÅÍŸÀÔ¿¡ ´ëÇØ¼­ Ưº°È÷ ½Å°æ¾µ °ÍÀÌ ¾ø´Ù. ´ÜÁ¡À¸·Î´Â ¿ª½Ã µ¥ÀÌÅͺ£À̽º ¾È¿¡¼­¸¸ °¡´ÉÇÏ´Ù´Â °ÍÀÌ´Ù. ÀåÁ¡ÀÌÀÚ ´ÜÁ¡À¸·Î ÀÛ¿ëÇÑ´Ù.
OCI ¿À¶óŬ°ú C/C++À» À§ÇÑ ¶óÀ̺귯¸®¸¦ Á÷Á¢ Á¦°øÇÑ´Ù. Pro*C/C++°°ÀÌ ÇÁ¸®ÄÄÆÄÀÏ °úÁ¤ÀÌ ÇÊ¿ä ¾øÀ¸¸ç SQLÀ» ÇÁ·Î±×·¥¾È¿¡ »ðÀÔÇÏ´Â ¹æ½ÄÀÌ ¾Æ´Ñ ¸ðµç °úÁ¤ÀÌ ÇÔ¼ö·Î¼­ Á¦°øµÈ´Ù. ¶Ù¾î³­ ¼º´ÉÀ» ÀÚ¶ûÇÏÁö¸¸ »ç¿ëÀÌ Pro*C/C++º¸´Ù ¾î·Æ´Ù.

LOB Locator

¸ÕÀú C/C++ ÇÁ·Î±×·¥ ³»¿¡¼­ LOB¸¦ »ç¿ëÇÏ·Á¸é LOB Locator¿¡ ´ëÇØ¼­ ¾Ë¾Æ¾ß ÇÑ´Ù. ¾Õ¿¡¼­ ¼³¸íÇÏ¿´µíÀÌ LOB´Â Å×ÀÌºí¼¼±×¸ÕÆ® ³»¿¡ Á¸µ¥ÇÏ´Â µ¥ÀÌÅͰ¡ ¾Æ´Ï¶ó LOB ¼¼±×¸ÕÆ®¿¡ µû·Î Á¸ÀçÇÑ´Ù°í ÇÏ¿´´Ù. LOB¿¡ Á¢±ÙÇϱâ À§Çؼ­´Â ÀÌ LOBÀÇ Locator¸¦ ¾ò¾î¿Í¼­ ÀÌ Locator¸¦ ÅëÇØ¼­ ¸ðµç Á¶ÀÛÀ» ¼öÇàÇÑ´Ù. LOB LocatorÀÇ Á¾·ù¿Í »ç¿ë¹æ¹ýÀ» ¸ÕÀú »ìÆìº¸ÀÚ.

/* 
 * LOBs¸¦ »ç¿ëÇϱâ À§Çؼ± ¹Ýµå½Ã Æ÷ÇÔÇØ ÁÖ¾î¾ß ÇÑ´Ù. 
 */ 
#include <oci.h> 
 
¡¦ 
 
/* 
 * °¢ LOBÀÇ pointer ŸÀÔÀÌ´Ù. 
 */ 
OCIBlobLocator *blob; 
OCIClobLocator *clob; 
OCIBFileLocator *bfile; 
 
¡¦ 
 
int main (int argc, char *argv[]) 
{ 
¡¦ 
 
    /* 
     * À§¿¡¼­ ¼±¾ðÇÑ LOB ŸÀÔÀÇ Æ÷ÀÎÅ͸¦ ÃʱâÈ­ÇÏ¿© ºó LOB¸¦ ¸¸µé¾î ÁØ´Ù. 
     */ 
    exec sql allocate :blob; 
    exec sql allocate :clob; 
    exec sql allocate :bfile; 
 
¡¦ 
 
exec sql free :blob; 
exec sql free :clob; 
exec sql free :bfile; 
 
exit (EXIT_SUCCESS); 
} 
 

À§¿¡¼­ ÃʱâÈ­µÈ LOB Locator¸¦ »ç¿ëÇÏ¿© µ¥ÀÌÅ͸¦ Ãß°¡ÇÏ°í º¯°æÇÏ°í »èÁ¦ÇÑ´Ù. ¸¸¾à ÃʱâÈ­µÈ »óÅ ±×´ë·Î Å×ÀÌºí¿¡ InsertÇÑ´Ù¸é SQL¹®Àå¿¡¼­ EMPTY_BLOB (), EMPTY_CLOB ()¸¦ »ç¿ëÇÑ °Í°ú µ¿ÀÏÇÑ °á°úÀÌ´Ù.

LOB Statements

  • Ç¥11 LOB Statements
±¸¹® ¼³¸í
Append LOBÀÇ ³¡ºÎºÐ¿¡ µ¥ÀÌÅ͸¦ Ãß°¡ÇÑ´Ù.
Assign ÇÑ LOB LocatorÀÇ °ªÀ» ´Ù¸¥ LOB Locator·Î º¹»çÇÑ´Ù.
Close ¿­·ÁÀÖ´Â LOB¸¦ ´Ý´Â´Ù.
Copy ÇÑ LOBÀÇ ³»¿ëÀ» ´Ù¸¥ LOB·Î º¹»çÇÑ´Ù.
Create Temporary Àӽà LOB¸¦ »ý¼ºÇÑ´Ù. Àӽà LOB´Â ÃʱâÈ­ ÇÒ Çʿ䰡 ¾ø´Ù.
Disable Buffering LBS(LOB Buffering System)À» »ç¿ëÇÏÁö ¾Êµµ·Ï ÇÑ´Ù.
Enable Buffering LBS(LOB Buffering System)À» »ç¿ëÇÑ´Ù.
Erase LOBÀÇ ³»¿ëÀ» Áö¿î´Ù.
File Close All ¿­·ÁÀÖ´Â ¸ðµç BFILEs¸¦ ´Ý´Â´Ù.
File Set BFILEs¿¡ µð·ºÅ丮¿Í ÆÄÀÏÀ» ÁöÁ¤ÇÑ´Ù.
Flush Buffer LOB BubberÀÇ ³»¿ëÀ» µ¥ÀÌÅͺ£À̽º·Î ±â·ÏÇÑ´Ù.
Free Temporary Àӽà LOB¸¦ ÇØÁ¦ÇÑ´Ù.
Load From File BFILEsÀÇ ³»¿ëÀ» BLOB³ª CLOB·Î ÀоîµéÀδÙ.
Open LOBs¸¦ ¿¬´Ù.
Read LOB¿¡¼­ ¹öÆÛ·Î Àд´Ù.
Trim LOBÀÇ ³»¿ëÀ» »èÁ¦ÇÏ¿© ÁöÁ¤ÇÑ Å©±â¸¸Å­À¸·Î ÁÙÀδÙ.
Write ¹öÆÛÀÇ ³»¿ëÀ» LOB·Î ±â·ÏÇÑ´Ù.
Describe LOB¿¡¼­ ÁöÁ¤ÇÑ Æ¯Â¡À» ¾Ë¾Æ³½´Ù.

ÀÌÁ¦ºÎÅÍ º»°ÝÀûÀÎ ¿¹Á¦¸¦ º¸±â·Î ÇÏÀÚ.

¿¹Á¦´Â Binary FileÀÇ ³»¿ëÀ» BLOBÄ®·³À¸·Î ÀÐ¾î µéÀÌ´Â °ÍÀÌ´Ù. µÎ¹øÂ° ¿¹Á¦´Â ¾Õ¿¡¼­ ÀúÀåÇÑ BLOBÄ®·³¿¡¼­ µ¥ÀÌÅ͸¦ Àо Binary File·Î ±â·ÏÇÏ´Â °ÍÀÌ´Ù. µÎ°¡Áö °úÁ¤À» ¼öÇàÇÑ ÈÄ µÎ°³ÀÇ ÆÄÀÏÀ» ºñ±³ÇÏ¸é ¿Ïº®È÷ °°´Ù´Â °ÍÀ» ¾Ë ¼ö ÀÖ´Ù. Binary FileÀÇ ³»¿ëÀ» µ¥ÀÌÅͺ£À̽º¿¡ ¾²°í ÀÐÀ» ¼ö ÀÖ´Ù¸é ¾î¶² ÇÁ·Î±×·¥ÀÌ¶óµµ Å©°Ô ¹®Á¦ ¾øÀ» °ÍÀÌ´Ù. pic.jpg ¶ó´Â Å×½ºÆ® ÆÄÀÏÀº °¢ÀÚ ÁغñÇϵµ·Ï ÇÑ´Ù.

/* ----------------------------------------------------------------- 
 * MakefileÀÇ ³»¿ë 
 * --------------------------------------------------------------- */ 
 
CC        = gcc 
PROC        = proc 
INCLUDE1    = $(ORACLE_HOME)/precomp/public 
INCLUDE2    = $(ORACLE_HOME)/rdbms/demo 
INCLUDE3    = $(ORACLE_HOME)/rdbms/public 
LIB        = $(ORACLE_HOME)/lib 
 
TARGET1    = blob_file_to_db 
TARGET2    = blob_db_to_file 
TARGETS    = $(TARGET1) $(TARGET2) 
OBJ1        = blob_file_to_db.o 
OBJ2        = blob_db_to_file.o 
OBJS        = $(OBJ1) $(OBJ2) 
CFILE1        = blob_file_to_db.c 
CFILE2        = blob_db_to_file.c 
CFILES        = $(CFILE1) $(CFILE2)  
PCFILE1        = blob_file_to_db.pc 
PCFILE2        = blob_db_to_file.pc 
PCFILES    = $(PCFILE1) $(PCFILE2) 
 
all    : $(TARGETS) 
 
$(TARGET1)    : $(OBJS) 
    $(CC) -o $(TARGET1) $(OBJ1) -L$(LIB) -lclntsh 
$(TARGET2)    : $(OBJS) 
    $(CC) -o $(TARGET2) $(OBJ2) -L$(LIB) -lclntsh 
 
.c.o : $(CFILES) 
    $(CC) -c $< -I$(INCLUDE1) -I$(INCLUDE2) -I$(INCLUDE3) 
 
$(CFILE1) : $(PCFILE1) 
    $(PROC) mode=ansi parse=none sqlcheck=full userid=scott/tiger $(PCFILE1) 
$(CFILE2) : $(PCFILE2) 
    $(PROC) mode=ansi parse=none sqlcheck=full userid=scott/tiger $(PCFILE2) 
 
clean :  
    -rm -f *.o core *.lis tp* $(TARGET1) $(TARGET2) $(TARGET3) $(OBJS) $(CFILES) 
binclean :  
    -rm -f *.o core *.lis tp* $(OBJS) $(CFILES) 
 


 
/* ----------------------------------------------------------------- 
 * Binary FileÀ» Àо µ¥ÀÌÅÍ º£À̽ºÀÇ BLOBÄ®·³¿¡ ÀúÀåÇÏ´Â ÇÁ·Î±×·¥ 
 * --------------------------------------------------------------- */ 
 
#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
#include <oci.h> 
 
#define FAILURE        0 
#define SUCCESS        !FAILURE 
 
exec sql include sqlca; 
 
/* -------------------------------------------------------------------------- 
                   Àü   ¿ª    º¯   ¼ö       ¼±   ¾ð   ºÎ 
-------------------------------------------------------------------------- */ 
 
exec sql begin declare section; 
#define MAXBUFLEN    100000 
    char *userpass; 
    unsigned int amt; 
    unsigned int offset = 1; 
    unsigned int length; 
    unsigned char buffer[MAXBUFLEN]; 
    OCIClobLocator *clob; 
    OCIBlobLocator *blob; 
exec sql end   declare section; 
 
 
/* -------------------------------------------------------------------------- 
                        ÇÔ   ¼ö       ±¸   Çö   ºÎ 
-------------------------------------------------------------------------- */ 
 
/* 
 * µ¥ÀÌŸ º£À̽º¿ÍÀÇ ¿¬µ¿¿¡ ¹®Á¦°¡ »ý°åÀ» °æ¿ì 
 * ½ÇÇàµÇ´Â ÇÔ¼ö·Î¼­ SQL ¿¡·¯¹øÈ£¿Í ¸Þ¼¼Áö¸¦ 
 * Ãâ·ÂÇÏ°í µðºñ¿ÍÀÇ Á¢¼ÓÀ» ²÷°í ÇÁ·Î±×·¥À» Á¾·áÇÑ´Ù. 
 */ 
void sql_error  (void) 
{ 
    printf  ("Error : %d - %s\n", sqlca.sqlcode, sqlca.sqlerrm.sqlerrmc); 
 
    exec sql whenever sqlerror continue; 
    exec sql rollback work release; 
 
    exit (1); 
} 
 
 
/* 
 * µ¥ÀÌŸº£À̽º¿Í Á¢¼ÓÇÏ´Â ÇÔ¼ö. 
 */ 
void ora_connect () 
{ 
    userpass = strdup ("scott/tiger"); 
    exec sql whenever sqlerror do sql_error (); 
    exec sql connect :userpass; 
} 
 
 
/* 
 * µ¥ÀÌŸº£À̽º¿Í Á¢¼ÓÀ» Á¾·áÇÏ´Â ÇÔ¼ö. 
 */ 
void ora_disconnect  (void) 
{ 
    exec sql whenever sqlerror do sql_error (); 
    exec sql rollback work release; 
} 
 
 
/* 
 * DBÀÇ º¯°æ»çÇ×À» COMMIT ÇÏ´Â ÇÔ¼ö 
 */ 
void ora_commit (void) 
{ 
    exec sql whenever sqlerror do sql_error (); 
    exec sql commit work; 
} 
 
 
/* 
 * DBÀÇ º¯°æ»çÇ×À» ROLLBACK ÇÏ´Â ÇÔ¼ö 
 */ 
void ora_rollback (void) 
{ 
    exec sql whenever sqlerror do sql_error (); 
    exec sql rollback work; 
} 
 
 
/* ---------------------------------------------------------------------- 
                     M A I N       F U N C T I O N 
---------------------------------------------------------------------- */ 
 
int main (void) 
{ 
FILE *f; 
int filelen = 0, nbytes = 0; 
 
    ora_connect (); 
 
    exec sql whenever sqlerror do sql_error (); 
    exec sql var buffer is raw(MAXBUFLEN); 
 
    /* 
     * LOB Å×À̺íÀ» µå¶øÇÏ°í »õ·Î »ý¼ºÇÑ´Ù. 
     */ 
    exec sql drop table lobs; 
    exec sql create table lobs (b_lob blob); 
 
    /* 
     * BLOB ŸÀÔÀÇ Æ÷ÀÎÅ͸¦ ÃʱâÈ­ÇÏ¿© ºó LOB¸¦ ¸¸µé¾î ÁØ´Ù. 
     */ 
    exec sql allocate :blob; 
 
    /* 
     * DBÀÇ Å×ÀÌºí¿¡ BLOB ·¹Äڵ带 »ý¼ºÇϰí LOB Æ÷ÀÎÅÍ¿Í ¿¬°áÇÑ´Ù. 
     */ 
    exec sql insert into lobs (b_lob) values (:blob); 
    exec sql select b_lob into :blob from lobs where rownum = 1 for update; 
 
    /* 
     * ÆÄÀÏÀ» ¿­°í ÆÄÀÏ »çÀÌÁ ±¸ÇÑ´Ù. 
     */ 
    f = fopen ((const char *)"pic.jpg", (const char *)"r"); 
    if (f == NULL) 
    { 
        printf ("File Open Error!!!\n"); 
        exit(1); 
    } 
    fseek (f, 0, SEEK_END); 
    filelen = ftell (f); 
    fseek (f, 0, SEEK_SET); 
    printf ("File Length : %d\n", filelen); 
 
    /* 
     * ÆÄÀÏÀ» ¹öÆÛ·Î ÀоîµéÀδÙ. 
     */ 
    amt = filelen; 
    nbytes = fread (buffer, 1, MAXBUFLEN, f); 
    length = nbytes; 
    printf ("%d Bytes Read\n", nbytes); 
 
    /* 
     * ¹öÆÛÀÇ ³»¿ëÀ» DB¿¡ ³Ö´Â´Ù. 
     */ 
    exec sql lob write one :amt from :buffer with length :length into :blob at :offset; 
    printf ("%d Bytes wrote\n", amt); 
 
    ora_commit (); 
    ora_disconnect (); 
    fclose (f); 
 
    exit (0); 
} 
 


/* ----------------------------------------------------------------- 
 * µ¥ÀÌÅÍ º£À̽ºÀÇ BLOBÄ®·³¿¡¼­ Binary Data¸¦ Àо ÆÄÀÏ·Î ÀúÀåÇÏ´Â ÇÁ·Î±×·¥ 
 * --------------------------------------------------------------- */ 
 
#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
#include <oci.h> 
 
#define FAILURE        0 
#define SUCCESS        !FAILURE 
 
exec sql include sqlca; 
 
/* -------------------------------------------------------------------------- 
                   Àü   ¿ª    º¯   ¼ö       ¼±   ¾ð   ºÎ 
-------------------------------------------------------------------------- */ 
 
exec sql begin declare section; 
#define MAXBUFLEN    100000 
    char *userpass; 
    unsigned int amt; 
    unsigned int offset = 1; 
    unsigned int length; 
    unsigned char buffer[MAXBUFLEN]; 
    OCIClobLocator *clob; 
    OCIBlobLocator *blob; 
exec sql end   declare section; 
 
 
/* -------------------------------------------------------------------------- 
                        ÇÔ   ¼ö       ±¸   Çö   ºÎ 
-------------------------------------------------------------------------- */ 
 
/* 
 * µ¥ÀÌŸ º£À̽º¿ÍÀÇ ¿¬µ¿¿¡ ¹®Á¦°¡ »ý°åÀ» °æ¿ì 
 * ½ÇÇàµÇ´Â ÇÔ¼ö·Î¼­ SQL ¿¡·¯¹øÈ£¿Í ¸Þ¼¼Áö¸¦ 
 * Ãâ·ÂÇÏ°í µðºñ¿ÍÀÇ Á¢¼ÓÀ» ²÷°í ÇÁ·Î±×·¥À» Á¾·áÇÑ´Ù. 
 */ 
void sql_error  (void) 
{ 
    printf  ("Error : %d - %s\n", sqlca.sqlcode, sqlca.sqlerrm.sqlerrmc); 
 
    exec sql whenever sqlerror continue; 
    exec sql rollback work release; 
 
    exit (1); 
} 
 
 
/* 
 * µ¥ÀÌŸº£À̽º¿Í Á¢¼ÓÇÏ´Â ÇÔ¼ö. 
 */ 
void ora_connect () 
{ 
    userpass = strdup ("scott/tiger"); 
    exec sql whenever sqlerror do sql_error (); 
    exec sql connect :userpass; 
} 
 
 
/* 
 * µ¥ÀÌŸº£À̽º¿Í Á¢¼ÓÀ» Á¾·áÇÏ´Â ÇÔ¼ö. 
 */ 
void ora_disconnect (void) 
{ 
    exec sql whenever sqlerror do sql_error (); 
    exec sql rollback work release; 
} 
 
 
/* 
 * DBÀÇ º¯°æ»çÇ×À» COMMIT ÇÏ´Â ÇÔ¼ö 
 */ 
void ora_commit (void) 
{ 
    exec sql whenever sqlerror do sql_error (); 
    exec sql commit work; 
} 
 
 
/* 
 * DBÀÇ º¯°æ»çÇ×À» ROLLBACK ÇÏ´Â ÇÔ¼ö 
 */ 
void ora_rollback (void) 
{ 
    exec sql whenever sqlerror do sql_error (); 
    exec sql rollback work; 
} 
 
 
/* ---------------------------------------------------------------------- 
                     M A I N       F U N C T I O N 
---------------------------------------------------------------------- */ 
 
int main (void) 
{ 
FILE *f; 
int nbytes = 0; 
 
    ora_connect (); 
 
    exec sql whenever sqlerror do sql_error (); 
    exec sql var buffer is raw(MAXBUFLEN); 
 
    /* 
     * BLOB ŸÀÔÀÇ Æ÷ÀÎÅ͸¦ ÃʱâÈ­ÇÏ¿© ºó LOB¸¦ ¸¸µé¾î ÁØ´Ù. 
     */ 
    exec sql allocate :blob; 
 
    /* 
     * DBÀÇ Å×ÀÌºí¿¡¼­  BLOB ·¹ÄÚµå¿Í LOB Æ÷ÀÎÅÍ¿Í ¿¬°áÇÑ´Ù. 
     */ 
    exec sql select b_lob into :blob from lobs where rownum = 1 for update; 
 
    /* 
     * BLOB Ä®·³ÀÇ µ¥ÀÌŸ ±æÀ̸¦ ¾ò¾î¿Â´Ù. 
     */ 
    exec sql lob describe :blob get length into :length; 
 
    /* 
     * ºó LOBÄ®·³À̸é Á¾·á 
     */ 
    if (length == 0) sql_error (); 
 
    /* 
     * BLOB Ä®·³ÀÇ µ¥ÀÌŸ¸¦ ÀúÀåÇÒ ÆÄÀÏÀ» »ý¼ºÇÑ´Ù. 
     */ 
    f = fopen ((const char *)"test.jpg", (const char *)"w"); 
    if (f == NULL) 
    { 
        printf ("File Open Error!!!\n"); 
        exit(1); 
    } 
 
    /* 
     * BLOB Ä®·³¿¡¼­ µ¥ÀÌŸÀÇ ±æÀ̸¸Å­ Àоî¿Í ÆÄÀÏ¿¡ ÀúÀåÇÑ´Ù. 
     */ 
    exec sql lob read :amt from :blob into :buffer with length :length; 
    printf ("%d bytes read from DB\n", amt); 
    nbytes = fwrite ((void *)buffer, 1, amt, f); 
    printf ("%d bytes write to file\n", nbytes); 
 
    fclose (f); 
    ora_disconnect (); 
 
    exit (0); 
} 
 
EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù.