Dynamic SQL
ÃÑ ÆäÀÌÁö ¼ö : 3224

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



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

Contents

1 Dynamic SQL
1.1 Dynamic SQLÀ̶õ ¹«¾ùÀΰ¡?
1.2 Dynamic SQLÀÇ ÀåÁ¡°ú ´ÜÁ¡Àº ¹«¾ùÀΰ¡?
1.3 Dynamic SQLÀº ¾ðÁ¦ ¾²ÀÏ ¼ö Àִ°¡?

1 Dynamic SQL

À̹ø¿¡ ÇÒ °ÍÀº µ¿Àû SQL¹®ÀåÀ» ó¸®ÇÒ ¼ö ÀÖ´Â Dynamic SQLÀÌ´Ù. Å©°Ô ±¸ºÐÇÏÀÚ¸é Oracle Dynamic SQL°ú ANSI Dynamic SQL·Î ±¸ºÐµÈ´Ù. À̹ø °úÁ¤¿¡¼­ ´Ù·ê °ÍÀº ÀÌ µÑÁß¿¡¼­ ANSI Dynamic SQLÀÌ µÇ°Ú´Ù. ºñ·Ï ³Ñ¾î°¥ °ÍÀÌÁö¸¸ Oracle Dynamic SQL¿¡ ´ëÇØ¼­µµ °£´ÜÇÏ°Ô Çѹø ¾Ë¾Æº¼ °ÍÀÌ´Ù.

1.1 Dynamic SQLÀ̶õ ¹«¾ùÀΰ¡?

ÇÁ·Î±×·¥À» °³¹ßÇÒ ¶§ ´ëºÎºÐÀÇ °æ¿ì SQL¹®ÀåÀ» »ç¿ëÇÏ´Â ¸ñÀû°ú ´ë»óÀ» ¾Ë°í ÀÖ´Ù. ÀÌ·²°æ¿ì ¹®ÀåÀÇ ÇüÅÂ(select, DML, DDLµî)¶ó´ø°¡ SelectÀÏ °æ¿ì Select ListÀÇ °³¼ö, Select ListÀÇ µ¥ÀÌÅÍ Å¸ÀÔ, µ¥ÀÌÅÍÀÇ ±æÀ̸¦ Á¤È®È÷ Çϰí Where±¸¹®¿¡ µé¾î°¡´Â Á¶°ÇÀ̳ª InsertÀÇ Values±¸¹®¿¡ µé¾î°¡´Â °ªµéÀ» Á¤È®È÷ ¾Ë°í Àִ°ÍÀÌ´Ù. ´ç¿¬È÷ ÀÌ·± ÇÁ·Î±×·¥Àº ¾ÆÁÖ °£´ÜÇϰí ÇÁ·Î±×·¥ÀÇ ÀÛ¼º°ú ½ÇÇà¿¡ À־ ¸Å¿ì °£°áÇÏ´Ù. ¸Å¿ì °£´ÜÇÑ ¹Ý¸é ½ÇÁ¦ Çö¾÷¿¡¼­ ¾²ÀÌ´Â ´ëºÎºÐÀÇ ÇÁ·Î±×·¥µéµµ ÀÌÁ¤µµÀÇ ¼öÁØÀ̼­ ¸Ó¹°°í ÀÖ´Â °Íµµ »ç½ÇÀÌ´Ù. ÇÏÁö¸¸ ÀÏÀ» ÇÏ´Ùº¸¸é ÇÁ·Î±×·¥À» ÀÛ¼ºÇÒ ´ç½Ã Áï ÇÁ·Î±×·¥À» ÄÄÆÄÀÏÇÏ´Â ¶§¿¡ Á¤È®ÇÑ SQL¹®ÀåÀÌ Á¤ÇØÁöÁö ¾Ê°í ÇÁ·Î±×·¥ÀÌ ½ÇÇàÀÌ µÇ¾î¼­¾ß SQL¹®ÀåÀ» Á¤È®È÷ ÆÄ¾Ç ÇÒ ¼ö ÀÖ´Â »óȲ¿¡ ³õÀÌ´Â °æ¿ì°¡ ÀÖ´Ù. ÀÌ·¯ÇÑ SQLÀ» Dynamic SQLÀ̶ó ÇÑ´Ù. ÀÌ¹Ì ´«Ä¡ºü¸¥ µ¶ÀÚµé ¸î¸îÀº À̸§¸¸À» º¸°íµµ ¾Ë ¼ö ÀÖÀ» °ÍÀÌ´Ù. ´ëü·Î Dynamic¶ó´Â ´Ü¾î´Â ·±Å¸ÀÓÀÌ µ¿ÀÛÇÏ´Â °Íµé ¾Õ¿¡ ¸¹ÀÌ ºÙ´Â ¼ö½Ä¾î À̱⠶§¹®ÀÌ´Ù.

1.2 Dynamic SQLÀÇ ÀåÁ¡°ú ´ÜÁ¡Àº ¹«¾ùÀΰ¡?

Dynamic SQLÀÇ °æ¿ì ½ÇÇà½Ã SQL¹®Àå¿¡ ´ëÇÑ Á¤È®ÇÑ Á¤º¸°¡ ¾ø´õ¶óµµ ÇÁ·Î±×·¥ÀÇ ¼öÇà¿¡ À־ ¾Æ¹« ¹®Á¦°¡ ¾ø´Ù. ±×¸®°í ÇÁ·Î±×·¥À» ½ÇÇàÇϸ鼭 SQL¹®ÀåÀ» µ¿ÀûÀ¸·Î ¹Þ¾ÆµéÀÏ ¼ö Àֱ⠶§¹®¿¡ ´ëÈ­ÇüÀÇ ÇÁ·Î±×·¥ÀÌ ÀÛ¼º°¡´ÉÇÏ´Ù. ´ç¿¬È÷ ÀÌ·¯ÇÑ ÀÌÁ¡ÀÌ ÀÖ´Ù¸é ÇÁ·Î±×·¥À» ÄÚµùÇϱⰡ ½±Áö°¡ ¾Ê´Ù´Â °ÍÀÌ ¹®Á¦´Ù. ÇÏÁö¸¸ ¸î¹ø ÇØº»´Ù¸é Àͼ÷ÇØ Áú °ÍÀÌ°í °³³äÀ» ÀÌÇØÇØµÎ¸é ±×¸® ¾î·ÆÁö´Â ¾ÊÀ» °ÍÀÌ´Ù. ¾ÕÀÇ °£´ÜÇÑ ÇÁ·Î±×·¥µé¿¡ ºñÇÏ¸é ¾î·Æ´Ù´Â Àǹ̷Π¹Þ¾ÆµéÀÌ¸é µÇ°Ú´Ù.

1.3 Dynamic SQLÀº ¾ðÁ¦ ¾²ÀÏ ¼ö Àִ°¡?

´ëºÎºÐÀÇ ÇÁ·Î±×·¥µéÀº Statis SQLÀÌ´Ù. ÀÌ·¯ÇÑ °ÍµéÀº ÇѰ¡Áö Á¤ÇØÁø ¸ñÀûÀ» °¡Áø °ÍµéÀÌ°í ±× À̿ܿ¡´Â ¾²ÀÏ ¼ö°¡ ¾ø´Â °ÍÀÌ´Ù. ¸¸¾à Dynamic SQLÀ» »ç¿ëÇÑ´Ù¸é Static SQLº¸´Ù Á»´õ À¯¿¬ÇÑ ÇÁ·Î±×·¥À» ÀÛ¼ºÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ¿¹¸¦ µéÀÚ¸é SQL*Plus°°Àº ÇÁ·Î±×·¥À» ÀÛ¼º ÇÒ¼öµµ ÀÖÀ»°ÍÀ̰í DB Administrator Toolµµ ¸¸µé¼ö°¡ ÀÖ´Â °ÍÀÌ´Ù. ¾Æ¹«·¡µµ Dynamic SQLÀÇ Æ¯¼º»ó Á»´õ ¹ü¿ëÀûÀÎ °÷¿¡ ¾²ÀÏ ¼ö°¡ ÀÖ´Ù.

ÀÌÁ¦´Â ¿À¶óŬ Dynamic SQL¿¡ ´ëÇØ¼­ ¾Ë¾Æº¸ÀÚ. À̰ÍÀº À̹ø °úÁ¤¿¡¼­ ¾²ÀÌÁö´Â ¾Ê´Â´Ù. ±×³É ±×·±°Ô ÀÖ´Ù Á¤µµ·Î Áö³ª°¡¸é µÇ°Ú´Ù.

Oracle Dynamic SQL
  • Method 1
    Host º¯¼ö ¾øÀÌ »ç¿ëµÇ´Â DML¹®ÀåÀ» ½ÇÇàÇÏ´Â ¹æ¹ýÀÌ´Ù.
  • Method 2
    Host º¯¼ö°¡ »ç¿ëµÇ°í »ç¿ëµÇ´Â Host º¯¼öÀÇ °³¼ö´Â ¸ð¸£´Â »óÅ¿¡¼­ DML¹®ÀåÀ» ½ÇÇàÇÏ´Â ¹æ¹ýÀÌ´Ù.
  • Method 3
    Input Host º¯¼öÀÇ °³¼ö¿Í Select ListÀÇ Ä®·³ °³¼ö¸¦ ¾Ë°í ÀÖ´Â »óÅ¿¡¼­ Select ¹®ÀåÀ» ½ÇÇàÇÏ´Â ¹æ¹ýÀÌ´Ù.
  • Method 4
    Input Host º¯¼öÀÇ °³¼ö¿Í Select ListÀÇ Ä®·³ °³¼ö¸¦ ¸ð¸£´Â »óÅ¿¡¼­ Select ¹®ÀåÀ» ½ÇÇàÇÏ´Â ¹æ¹ýÀÌ´Ù.

ÀÌ·¸°Ô 4°¡Áö ¹æ¹ýÀÌ ÀÖÀ¸¸ç ¼³¸í¿¡¼­ º¸¸é ¾Ë°ÚÁö¸¸ Method 1ÀÌ °¡Àå ½¬¿ì¸ç Method°¡ °¡Àå ¾î·Æ´Ù. Method 4ÀÇ °æ¿ì ÀϹÝÀûÀÎ SQL¹®ÀåÀº °¡´ÉÇϰÚÁö¸¸ Object Type, Cursor, DML returning ±¸¹®, LOB µî ¸î°¡Áö Áö¿øÇÏÁö ¾Ê´Â°Ô ÀÖÀ¸¸ç ÀÌ·± °æ¿ì ANSI Dynamic SQLÀ» »ç¿ëÇ϶ó°í ³ª¿ÍÀÖ´Ù. Áï À̰ÍÀº ¿¾³¯¿¡ ¸¸µé¾îÁø ÇÁ·Î±×·¥À» °è¼ÓÀûÀ¸·Î Áö¿øÇϱâ À§Çؼ­ Á¸ÀçÇÏ´Â °ÍÀ̹ǷΠÀÌÁ¦ºÎÅÍ ¹è¿ï µ¶Àڵ鿡°Ô´Â ANSI Dynamic SQLÀ» ±ÇÇÏ´Â °ÍÀÌ ¿Ç´Ù ÇϰڴÙ.

ÀÚ ÀÌÁ¦ºÎÅÍ ANSI Dynamic SQL¿¡ ´ëÇØ¼­ °øºÎÇØ º¸°Ú´Ù. ANSI Dynamic SQLÀÇ ÄÚµù ¼ø¼­¿Í °¢ ¼ø¼­¿¡ À־ »ç¿ëÇÏ´Â ANSI SQL ±¸¹®À» »ìÆìº¸µµ·Ï ÇÏÀÚ.

¸ÕÀú »ç¿ëÇÒ SQL¹®ÀåÀ» ¾Æ·¡¿Í °°´Ù°í °¡Á¤ÇÏÀÚ.
select * from emp where empno = :p_empno; 
 

¸î°¡Áö ¾Ë¼ö ¾ø´Â ºÎºÐÀÌ º¸ÀδÙ. ¾î¶»°Ô ÇØ¾ß ÇÒ±î ¸·¸·Çϱ⸸ ÇÏ´Ù. Çϳª¾¿ »ìÆìº¸ÀÚ.

  1. ¸ÕÀú ÀÔÃâ·Â¿¡ »ç¿ëÇÒ º¯¼ö¸¦ °áÁ¤ÇØ ÁÖ¾î¾ß ÇÑ´Ù. ´Ü¼øÈ÷ exec sql declare begin section, exec sql declare end secion ±¸ºÐ »çÀÌ¿¡ º¯¼ö¸¦ ¼±¾ðÇÏ¸é µÈ´Ù.

    exec sql 
    declare begin section; 
        int empno; 
        char ename [20]; 
        int deptno; 
    exec sql 
    declare end section; 
     

  2. ÀÔÃâ·Â¿¡ »ç¿ëÇÒ º¯¼ö¸¦ »ç¿ëÇϱâ À§Çؼ­ descriptor (±»ÀÌ Çѱ۷Π¹ø¿ªÇÏÀÚ¸é ±â¼úÀÚÁ¤µµ µÇ°Ú´Ù. ÀÔÃâ·Â º¯¼öÀÇ Á¤º¸¸¦ ¿À¶óŬ¿¡°Ô ¼³¸íÇØÁÖ±â À§Çؼ­ ¹Ýµå½Ã ÇÊ¿äÇÏ´Ù.)¸¦ ¼±¾ðÇÑ´Ù.

    exec sql 
    allocate descriptor [global | local] {:descriptor_name | string_literal} 
    [with max {:occurrences | number_literal}; 
     
    ¸ÕÀú GLOBALÀº ÇÁ·Î±×·¥ Àüü ¸ðµâ¿¡¼­ »ç¿ëÇÒ ¼ö ÀÖ°í LOCALÀº ÇØ´ç ¸ðµâ¿¡¼­¸¸ »ç¿ëÇÒ ¼ö ÀÖ´Ù. DescriptorÀÇ À̸§Àº ¹Ýµå½Ã È£½ºÆ® º¯¼ö¸¦ »ç¿ëÇØ¾ß ÇÏ´Â °ÍÀº ¾Æ´Ï´Ù. ÇÊ¿äÇÏ´Ù¸é »ç¿ëÇØµµ µÇÁö¸¸ ´Ü¼øÈ÷ ¡®in¡¯, ¡®out¡¯Á¤µµÀÇ ÇÁ·Î±×·¥ ³»¿¡¼­ À¯ÀÏÇÑ ¹®ÀÚ¿­ÀÌ¸é »ç¿ë°¡´ÉÇÏ´Ù. Occurrences´Â ÀÔÃâ·Â Bind º¯¼öÀÇ ÃÖ´ëÄ¡ÀÌ´Ù. Ưº°È÷ ÁöÁ¤ÇØ ÁÖÁö ¾Ê´Â´Ù¸é ±âº»°ªÀ¸·Î 100ÀÌ´Ù.

  3. SQL¹®ÀåÀ» Prepare ÇÑ´Ù. ÀÌ °úÁ¤Àº ¹®ÀåÀ» ½ÇÇàÇϱâ À§Çؼ­ SQLÀ» ÆÄ½ÌÇÏ´Â °úÁ¤À¸·Î »ý°¢ÇÏ¸é µÇ°Ú´Ù.

    exec sql 
        prepare stmt_id from :stmt; 
     
    stmt_id´Â ÀÔÃâ·Â¿¡¼­ º¯¼ö·Î ¼±¾ðµÇÁö ¾ÊÀº °ÍÀ¸·Î ³Ö¾îÁØ´Ù. stmt´Â ÀÔÃâ·Â º¯¼ö¿¡ ¼±¾ðÇÑ º¯¼ö·Î SQL¹®ÀåÀ» ÀúÀåÇϰí ÀÖ´Â °ÍÀÌ´Ù. SQL¹®ÀåÀ» ¹Ýµå½Ã º¯¼ö¿¡ ³Ö¾îÁÖ´Â °ÍÀº ¾Æ´Ï°í ÇÊ¿äÇÏ´Ù¸é ÀοëºÎÈ£·Î µÑ·¯½ÎÀÎ SQL¹®ÀåÀ» ±×´ë·Î ³Ö¾îÁ־ µÈ´Ù.

  4. ¾Õ¿¡¼­ ¼±¾ðÇÑ Input descriptor¸¦ »ç¿ëÇÏ¿© Input Bindº¯¼öµéÀ» ¼³¸íÇØ ÁÖ¾î¾ß ÇÑ´Ù.

    exec sql 
    describe input stmt_id using [sql] descriptor [global | local] 
    {:desc_nam | string_literal} ; 
     
    ÀÌ ¹®ÀåÀº Input Bind º¯¼öµéÀ» ¼³¸íÇϱâ À§Çؼ­ ÀÌÀü¿¡ »ý¼ºÇÑ Input descriptor¸¦ »ç¿ëÇÏ°Ú´Ù°í ¼±¾ðÇÏ´Â °ÍÀÌ´Ù. stmt_id´Â SQL¹®ÀåÀ» prepareÇϸ鼭 ¾ò¾î¿Â ID¸¦ »ç¿ëÇÏ¸é µÈ´Ù.
    {{#!plain
exec sql
[for [:]array_size] get descriptor global | lcoal
{:descriptor_name | string_literal}
{:hv0 = count | value item_number :hv1 = item_name1 [{, :hvn = item_namen}]};
}}}
ÀÌ ¹®ÀåÀº descriptor·ÎºÎÅÍ ¹ÙÀÎµå º¯¼öÀÇ Á¤º¸¸¦ ¾ò¾î¿À´Â °ÍÀÌ´Ù. ¾Õ¿¡¼­ ¹è¿î array processingÀÏ °æ¿ì¿¡´Â array size¸¦ ÁöÁ¤ÇØ ÁÖ¾î¾ß ÇÑ´Ù. descriptor À̸§À» °¡Áø È£½ºÆ® º¯¼ö ¶Ç´Â ¹®ÀÚ¿­À» ÁöÁ¤ÇØ ÁÖ°í value µÚ¿¡ ÁöÁ¤ÇØ ÁÖ°í½ÍÀº Bind º¯¼öÀÇ À§Ä¡¸¦ ÁöÁ¤ÇØ ÁÖ¸é µÈ´Ù. hv0¿¡ µé¾î°¡´Â count´Â Bind º¯¼öÀÇ Àüü °³¼öÀ̸ç hv1ºÎÅÍ´Â ¿À¶óŬ·Î Bind º¯¼öÀÇ Á¤º¸¸¦ Àü´ÞÇÑ È£½ºÆ® º¯¼öµéÀÇ ¸®½ºÆ®ÀÌ´Ù. ±×·³ item_namenÀ¸·ÎºÎÅÍ ¾òÀ» ¼ö ÀÖ´Â °ÍµéÀº ¹«¾ùÀÌ ÀÖ´ÂÁö ¾Ë¾Æº¸ÀÚ.

  • Ç¥7 Get Descriptor Item
Item À̸§ ¼³¸í
Type º¯¼öÀÇ µ¥ÀÌÅÍ Å¸ÀÔ
Length º¯¼öÀÇ ±æÀÌ
Precision ¼ýÀÚÀÇ ÀÚ¸®¼ö
Scale ¼Ò¼ö ¾Æ·¡ÂÊÀÇ ÀÚ¸®¼ö
Nullable NULL °ªÀÇ Çã¿ë
Indicator ¿¬°áµÈ Indicator º¯¼ö
Data ½ÇÁ¦ °ª
Name Ä®·³ÀÇ À̸§
Character_set_name Ä®·³ÀÇ ¹®ÀÚ¼Â

exec sql 
   [for array_size] set descriptor [global | local] 
   {:descriptor_name | string_literal} 
   {count = :hv0 | value item_number [ref] item_name1 = :hv1 
   [{, [ref] item_namen = :hvn}]}; 
 
ÀÌ ¹®ÀåÀº descriptor¸¦ ÀÌ¿ëÇÏ¿© Bind º¯¼öÀÇ Á¤º¸¸¦ ¼³Á¤ÇÏ´Â °ÍÀÌ´Ù. À§¿Í º°·Î ´Ù¸¥ °ÍµéÀº ¾ø´Ù. Item_number´Â Bind º¯¼öÀÇ À§Ä¡¶ó°í ¸»Çß´Ù. ±×·³ item_namen¿¡ µé¾î°¡´Â °ÍµéÀº ¹«¾ùÀÌ ÀÖ´ÂÁö ¾Ë¾Æº¸ÀÚ.

  • Ç¥8 Set Descriptor Item
Item À̸§ ¼³¸í
Type º¯¼öÀÇ µ¥ÀÌÅÍ Å¸ÀÔ
Length º¯¼öÀÇ ±æÀÌ
Indicator ¿¬°áµÈ Indicator º¯¼ö
Data ½ÇÁ¦ °ª
Character_set_name Ä®·³ÀÇ ¹®ÀÚ¼Â

  1. Input Bind º¯¼öµéÀ» descriptor¸¦ ÀÌ¿ëÇÏ¿© ¼³¸íÇØ ÁÖ¾ú´Ù¸é ½ÇÁ¦ °ªÀ» ³Ê¾îÁÖ¾î¾ß ÇÑ´Ù.
À̰ÍÀº À§¿¡¼­ ¹è¿î ±¸¹®À» »ç¿ëÇÏ¿© µ¥ÀÌÅ͸¦ ³Ö¾îÁÖ¸é µÈ´Ù.

exec sql 
set descriptor local 'in' 
value :value type = :type, length = :length, data = :data; 
 
ÀÌÁ¤µµ·Î ÇÏ¸é µÇ°Ú´Ù. valueµÚ¿¡ :value¿¡ Bind º¯¼öÀÇ À§Ä¡°¡ µé¾î°¡°í ÇØ´ç º¯¼öÀÇ µ¥ÀÌÅÍ¿Í µ¥ÀÌÅÍ Å¸ÀÔ, ±æÀ̸¦ ÁöÁ¤ÇØ ÁÖ´Â ¹®ÀåÀÇ ¿¹ÀÌ´Ù.
  • Input Bind º¯¼öÀÇ °ªÀ» ´Ù ³Ö¾î ÁÖ¾úÀ¸¹Ç·Î ¿À¶óŬ·ÎºÎÅÍ ½ÇÁ¦ µ¥ÀÌÅ͸¦ ÆÐÄ¡ÇØ ¿À±â À§Çؼ­ Select ÀÏ °æ¿ì¿¡´Â Ä¿¼­¸¦ ¼±¾ðÇÏ°í ¿­¾î¼­ SQL¹®ÀåÀ» ½ÇÇàÇϰí DMLÀ̳ª DDLµîÀÇ °æ¿ì¿¡´Â Ä¿¼­´Â ¾²Áö ¾Ê°í ¹Ù·Î ½ÇÇàÇÑ´Ù.

    exec sql 
            declare cursor_name cursor for stmt_id; 
    exec sql [FOR :array_size] open cursor_name 
    [[using [sql] descriptor [global | local] {:desc_name1 | string_literal}] 
    [into [sql] descriptor [global | local] {:desc_name2 | string_literal}]]; 
     
    À§ ¹®ÀåÀº À§¿¡¼­ prepareÇÑ SQL¹®ÀåÀ» °¡Áö°í Ä¿¼­¸¦ ¼±¾ðÇÏ°í ¿ª½Ã À§¿¡¼­ ¼±¾ðÇÑ Input descriptor¸¦ ÀÌ¿ëÇÏ¿© Ä¿¼­¸¦ ¿©´Â ¹®ÀåÀÌ´Ù. ¾Õ¿¡¼­ ´ëºÎºÐÀÇ ¿ë¾î¿¡ ´ëÇÑ ¼³¸íÀÌ ÀÖ¾úÀ¸´Ï Ưº°È÷ ¾î·Á¿î °ÍÀÌ ¾øÀ¸¸®¶ó »ý°¢ÇÑ´Ù.
  • Output descriptor¸¦ »ç¿ëÇÏ¿© ÆÐÄ¡ÇØ¿Ã Select List Áï Ä®·³ÀÇ °³¼ö¿Í µ¥ÀÌÅÍ Å¸ÀÔ µ¥ÀÌÅÍÀÇ ±æÀ̵îÀ» ¾Ë¾Æ³»¾ß ÇÑ´Ù. ÀÌ°Í ¿ª½Ã 4¹ø °úÁ¤°ú ¶È °°´Ù. ´ÜÁö Output descriptor¸¦ ÀÌ¿ëÇÏ¿© Output Bind º¯¼ö¿¡ ÇÊ¿äÇÑ Á¤º¸¸¦ °¡Á®±âÀ§Çؼ­ Output º¯¼öµéÀ» À§ÇÑ descriptor¸¦ ÁöÁ¤ÇØÁÖ¾î¾ß ÇÑ´Ù.

    exec sql 
    describe output stmt_id using [sql] descriptor [global | local] 
    {:desc_nam | string_literal} ; 
     
    ÀÌ ¹®ÀåÀº Output Bind º¯¼öµéÀÌ ÇÊ¿äÇÑ Á¤º¸¸¦ ¾ò±â À§Çؼ­ ÀÌÀü¿¡ »ý¼ºÇÑ Output descriptor¸¦ »ç¿ëÇÏ°Ú´Ù°í ¼±¾ðÇÏ´Â °ÍÀÌ´Ù. stmt_id´Â SQL¹®ÀåÀ» prepareÇϸ鼭 ¾ò¾î¿Â ID¸¦ »ç¿ëÇÏ¸é µÈ´Ù. ±× ¿ÜÀÇ °úÁ¤Àº °úÁ¤ (4)°ú µ¿ÀÏÇÏ´Ù.

    1. Ä¿¼­·ÎºÎÅÍ ÇÑ Ç྿ ÆÐÄ¡Çϸ鼭 °¢°¢ÀÇ Ä®·³ °ªÀ» ¾ò¾î¿Â´Ù.

      exec sql 
      [for :array_size] fetch cursor_name 
      into [sql] descriptor [global | local] {:descriptor_name | string_literal}; 
          exec sql 
          get descriptor local 'out' value :value :data = data, :indi = indicator; 
       
    À§ÀÇ ¹®ÀåµéÀº Ä¿¼­¿¡¼­ ÇϳªÀÇ ÇàÀ» ÆÐÄ¡ÇÏ°í ÆÐÄ¡ÇÑ Çà¿¡¼­ °¢°¢ÀÇ Ä®·³ÀÇ °ªÀ» ¾ò¾î¿À´Â °ÍÀÌ´Ù. valueµÚ¿¡ ÀÖ´Â :value´Â Ä®·³ÀÇ À§Ä¡À̰í :data¿¡ Ä®·³ÀÇ °ªÀÌ µé¾î°¡°í :indi¿¡´Â Ä®·³ÀÇ indicator °ªÀÌ µé¾î°£´Ù. Ä®·³ÀÇ °ªÀ» ¾ò¾î¿À´Â °ÍÀº °úÁ¤(4)¿¡¼­ ³ª¿Â exec sql get descriptor ¡¦ ¹®ÀåÀ» »ç¿ëÇÑ´Ù.

    1. ¸ðµç ÀÛ¾÷ÀÌ ³¡³ª¸é Ä¿¼­¸¦ ´Ý°í ÇÒ´çÇÑ drscriptor¸¦ ¾ø¾Ø´Ù.

      exec sql 
          close cursor_name; 
      exec sql 
          deallocate descriptor [global | local] {:descriptor_name | string_literal}; 
       
    ÀÌ ¹®ÀåµéÀº ¸ðµç °úÁ¤ÀÌ ³¡³ª°í Ä¿¼­¸¦ ´Ý°í »ý¼ºÇÑ descriptorµéÀ» ¾ø¾Ö´Â °ÍÀÌ´Ù.

    ÀÌÁ¦ Dynamic SQLÀÇ ¸ðµç °úÁ¤À» º¸¾Ò´Ù. »ç½Ç ÀÌ·¸°Ô »ìÆìº»´Ù°í ÇØ¼­ °¨ÀÌ Àß ¿ÀÁö´Â ¾ÊÀ» °ÍÀÌ´Ù. ´©°¡ ¹¹·¡µµ ÇÁ·Î±×·¡¸Ó´Â ½ÇÁ¦·Î ÇÁ·Î±×·¥À» Â¥¸é¼­ °¨°¢À» ÀÍÈ÷´Â °ÍÀÌ´Ù. ¾Æ·¡ÀÇ ¿¹Á¦¸¦ Àß »ìÆìº¸¸é ÀÌÇØÇϴµ¥ º° ¾î·Á¿òÀÌ ¾øÀ¸¸®¶ó »ý°¢ÇÑ´Ù.

    ´ÙÀ½ ÇÁ·Î±×·¥À» ÄÄÆÄÀÏ Çϱâ À§Çؼ­´Â Pro*C/C++¸¦ ¼öÇàÇÒ ¶§ ¿É¼ÇÀ» ÁÖ¾î¾ß ÇÑ´Ù.

    $ proc mode=ansi parse=none dblib.pc  
     

    ÁÖÀÇÇÒ °ÍÀº mode = ansi ¶Ç´Â dynamic = ansi ¸¦ ¹Ýµå½Ã ÁöÁ¤ÇØ ÁÖ¾î¾ß ÇÑ´Ù.

    /* -------------------------------------------------------------------------------- 
    ÆÄÀÏ À̸§ : dblib.h 
    °³¹ß ÀÏÀÚ : 2002-10-28 
    ÀÛ¼ºÀÚ : ·ù¸íȯ 
    -------------------------------------------------------------------------------- */ 
     
    /* 
     * dblib.h 
     * dblib.pc¿¡¼­ »ç¿ëÇÏ´Â ¸ÅÅ©·Î µîÀ» ³Ö¾îµÐ ÆÄÀÏ 
     */ 
     
    #define FALSE           0 
    #define TRUE            !FALSE 
     
    #define FAILURE         EXIT_FAILURE 
    #define SUCCESS         EXIT_SUCCESS 
     
    #define COMMIT          0 
    #define ROLLBACK        1 
     
    #define MAX_SQL_LEN     2048 
     
    #define MAX_NAME_LEN    32 
    #define MAX_DATA_LEN    4096 
     
    #define MAX_ROWS        65536 
     
    /* 
     * ANSI SQL Datatypes 
     */ 
    #define    CHAR            1 
    #define VARCHAR2        12 
    #define DATE            9 
    #define DECIMAL            3 
    #define DOUBLE            8 
    #define FLOAT            6 
    #define INTEGER            4 
    #define NUMBER            2 
    #define REAL            7 
    #define SHORT            5 
    #define SMALLINT        5 
     

    /* -------------------------------------------------------------------------------- 
    ÆÄÀÏ À̸§ : dblib.pc 
    °³¹ß ÀÏÀÚ : 2002-10-28 
    ÀÛ¼ºÀÚ : ·ù¸íȯ 
    -------------------------------------------------------------------------------- */ 
     
    /* 
     * dblib.pc 
     * Dynamic SQLÀ» ¼öÇàÇÒ ¼ö ÀÖµµ·Ï ¸¸µé¾îÁø ÀÏÁ¾ÀÇ ¶ó¸®ºê·¯¸® ÆÄÀÏ 
     */ 
     
    #include <stdio.h> 
    #include <string.h> 
    #include <stdlib.h> 
     
    #include "dblib.h" 
     
    exec sql include sqlca; 
     
     
    /* -------------------------------------------------------------------------- 
                             º¯   ¼ö       ¼±   ¾ð   ºÎ 
    -------------------------------------------------------------------------- */ 
     
    exec sql begin declare section; 
        /* 
         * DB¿¡ Á¢¼ÓÇϱâ À§ÇÑ º¯¼öµé 
         */ 
        char    username [32]; 
        char    password [32]; 
        char    database [32]; 
     
        /* 
         * SQL ¹®ÀåÀ» ÀúÀåÇϱâ À§ÇÑ º¯¼ö 
         */ 
        char    stmt [1024]; 
     
        /* 
         * Select ¹®ÀåÀ» ½ÇÇàÇÒ¶§ ¾²ÀÌ´Â º¯¼öµé 
         */ 
        int        input_cnt; 
        int        output_cnt; 
        char    name [32]; 
        int        value; 
        int        type; 
        int        length; 
        char    data [4096]; 
        short    indi; 
     
    exec sql end   declare section; 
     
     
    /* -------------------------------------------------------------------------- 
                            ÇÔ   ¼ö       ±¸   Çö   ºÎ 
    -------------------------------------------------------------------------- */ 
     
    /* 
     * ¿À¶óŬ ÀÛ¾÷µµÁß ¿¡·¯¹ß»ý½Ã ¿¡·¯¸Þ½ÃÁö¸¦ ¸®ÅÏÇÑ´Ù. 
     */ 
    char *ora_sqlerrm (void) 
    { 
        return (sqlca.sqlerrm.sqlerrmc); 
    } 
     
     
    /* 
     * ¿À¶óŬ ÀÛ¾÷µµÁß ¿¡·¯¹ß»ý½Ã ¿¡·¯Äڵ带 ¸®ÅÏÇÑ´Ù. 
     */ 
    int ora_sqlcode (void) 
    { 
        return (sqlca.sqlcode); 
    } 
     
     
    /* 
     * µ¥ÀÌŸº£À̽º¿Í Á¢¼ÓÇÏ´Â ÇÔ¼ö. 
     * user¿¡ Á¢¼ÓÇÒ »ç¿ëÀÚ À̸§ÀÌ, pass¿¡ ÇØ´ç »ç¿ëÀÚÀÇ ¾ÏÈ£°¡ µé¾î°¡°í 
     * db¿¡´Â Á¢¼ÓÇÒ µ¥ÀÌŸº£À̽ºÀÇ Connect StringÀÌ µé¾î°£´Ù. 
     * Local DBÀÎ °æ¿ì Connect String´Â ÇÊ¿ä¾ø´Ù. 
     * ¸¸¾à dbÀÇ °ªÀÌ NULLÀ̶ó¸é ·ÎÄà µ¥ÀÌŸº£À̽º¿¡ Á¢¼ÓÇÑ´Ù. 
     * ¼º°øÇϸé SUCCESS¸¦ ½ÇÆÐÇϸé FAILURE¸¦ ¹ÝȯÇÑ´Ù. 
     */ 
    int ora_connect (const char *user, const char *pass, const char *db) 
    { 
        /* 
         * »ç¿ëÀÚÀ̸§°ú ÆÐ½º¿öµå°¡ µé¾î¾î¿ÀÁö ¾Ê¾Ò´Ù¸é ¿¡·¯·Î ó¸®ÇÑ´Ù. 
         */ 
        if (user == NULL || pass == NULL) return (FAILURE); 
     
        /* 
         * »ç¿ëÀÚÀ̸§°ú ÆÐ½º¿öµå¸¦ º¹»çÇϰí 
         * ¿ø°ÝÁö DBÀÎ °æ¿ì Ä¿³ØÆ®½ºÆ®¸µµµ º¹»çÇÑ´Ù. 
         */ 
        strcpy (username, user); 
        strcpy (password, pass); 
        if (db != NULL) 
        { 
            strcpy (database, db); 
        } 
     
        /* 
         * ¿ø°ÝÁö DBÀÎÁö ·ÎÄà DBÀÎÁö ±¸ºÐÇÏ¿© Á¢¼ÓÇÑ´Ù. 
         */ 
        if (db != NULL) 
        { 
            exec sql 
                connect :username identified by :password using :database; 
        } 
        else 
        { 
            exec sql 
                connect :username identified by :password; 
        } 
     
        /* 
         * sqlcode¸¦ °Ë»çÇÏ¿© ¼º°ø¿©ºÎ¸¦ ¸®ÅÏÇÑ´Ù. 
         */ 
        return ((sqlca.sqlcode == 0) ? SUCCESS : FAILURE); 
    } 
     
     
    /* 
     * µ¥ÀÌŸº£À̽º¿Í Á¢¼ÓÀ» Á¾·áÇÏ´Â ÇÔ¼ö. 
     * mode°¡ COMMITÀ̶ó¸é ÇöÀç±îÁö µ¥ÀÌŸº£À̽ºÀÇ º¯°æ»çÇ×À» Ä¿¹ÔÇϰí 
     * mode°¡ ROLLBACKÀ̶ó¸é ÇöÀç±îÁö µ¥ÀÌŸº£À̽ºÀÇ º¯°æ»çÇ×À» ·Ñ¹éÇÑ´Ù. 
     * ¼º°øÇϸé SUCCESS¸¦ ½ÇÆÐÇϸé FAILURE¸¦ ¹ÝȯÇÑ´Ù. 
     */ 
    int ora_disconnect (int mode) 
    { 
        /* 
         * ¸ðµå¸¦ °Ë»çÇÏ¿© ÇöÀç Æ®·£Á§¼ÇÀ» Ä¿¹Ô ¶Ç´Â ·Ñ¹éÇÏ¿© Á¢¼ÓÀ» Á¾·áÇÑ´Ù. 
         */ 
        if (mode == COMMIT) 
        { 
            exec sql 
                commit work release; 
        } 
        else 
        { 
            exec sql 
                rollback work release; 
        } 
     
        /* 
         * sqlcode¸¦ °Ë»çÇÏ¿© ¼º°ø¿©ºÎ¸¦ Á¢¼ÓÇÑ´Ù. 
         */ 
        return ((sqlca.sqlcode == 0) ? SUCCESS : FAILURE); 
    } 
     
     
    /* 
     * DBÀÇ º¯°æ»çÇ×À» COMMIT ÇÏ´Â ÇÔ¼ö 
     */ 
    int ora_commit (void) 
    { 
        /* 
         * Æ®·£Á§¼ÇÀ» Ä¿¹ÔÈù´Ù. 
         */ 
        exec sql 
            commit work; 
     
        /* 
         * sqlcode¸¦ °Ë»çÇÏ¿© ¼º°ø¿©ºÎ¸¦ Á¢¼ÓÇÑ´Ù. 
         */ 
        return ((sqlca.sqlcode == 0) ? SUCCESS : FAILURE); 
    } 
     
     
    /* 
     * DBÀÇ º¯°æ»çÇ×À» ROLLBACK ÇÏ´Â ÇÔ¼ö 
     */ 
    int ora_rollback (void) 
    { 
        /* 
         * Æ®·£Á§¼ÇÀ» ·Ñ¹éÇÑ´Ù. 
         */ 
        exec sql 
            rollback work; 
     
        /* 
         * sqlcode¸¦ °Ë»çÇÏ¿© ¼º°ø¿©ºÎ¸¦ Á¢¼ÓÇÑ´Ù. 
         */ 
        return ((sqlca.sqlcode == 0) ? SUCCESS : FAILURE); 
    } 
     
     
    /* 
     * SQL¹®ÀåÀ» ¼³Á¤ÇÏ´Â ÇÔ¼ö 
     * ÆÄ¶ó¸ÞŸ·Î ½ÇÇàÇÒ SQL¹®ÀåÀ» ¹Þ´Â´Ù. 
     * ¼º°øÇϸé SUCCESS¸¦ ½ÇÆÐÇϸé FAILURE¸¦ ¹ÝȯÇÑ´Ù. 
     */ 
    int ora_setstmt (char *str) 
    { 
    int    i = 0; 
     
        /* 
         * ºó ¹®ÀåÀÌ µé¾î¿Ã °æ¿ì ½ÇÆÐ·Î ó¸®ÇÑ´Ù. 
         */ 
        if (strlen (str) == 0) 
        { 
            return (FAILURE); 
        } 
     
        /* 
         * ¹®ÀåÀÇ ¾ÕºÎºÐ¿¡ °ø¹é¹®ÀÚ³ª Åǹ®ÀÚ°¡ µé¾î¿Â °æ¿ì À̺κÐÀ» ½ºÅµÇϵµ·Ï ÇÑ´Ù. 
         */ 
        for (i = 0; i < strlen (str); i ++) 
        { 
            if (!isspace (str [i])) 
            { 
                break; 
            } 
        } 
     
        /* 
         * °ø¹é¹®ÀÚ³ª Åǹ®ÀÚ¸¦ Á¦¿ÜÇÑ µÞºÎºÐÀ» º¹»çÇÑ´Ù. 
         */ 
        strcpy (stmt, str + i); 
     
        /* 
         * ¹®ÀåÀÇ µÞºÎºÐ¿¡ °³Ç๮ÀÚ, °ø¹é, ÄݷеîÀÇ ¹®ÀÚµéÀÌ ÀÖÀ¸¸é Á¦°ÅÇÑ´Ù. 
         */ 
        for (i = strlen (str) - 1; i >= 0; i --) 
        { 
            if (stmt [i] == '\n') stmt [i] = '\0'; 
            else if (stmt [i] == '\r') stmt [i] = '\0'; 
            else if (stmt [i] == '\t') stmt [i] = '\0'; 
            else if (stmt [i] == ' ' ) stmt [i] = '\0'; 
            else if (stmt [i] == ';' ) stmt [i] = '\0'; 
            else break; 
        } 
     
        return (SUCCESS); 
    } 
     
     
    /* 
     * ÇöÀç ¼³Á¤µÈ SQL¹®ÀåÀ» ¾ò¾î¿À´Â ÇÔ¼ö 
     */ 
    char *ora_getstmt (char *buf) 
    { 
        strcpy (buf, stmt); 
    } 
     
     
    /* 
     * Select¹®ÀåÀÌ ¾Æ´Ñ ¸ðµç ¹®ÀåÀ» (DML, DDL, DCL) ½ÇÇàÇÏ´Â ÇÔ¼ö 
     * DML  (INSERT, UPDATE, DELETE) ¹®ÀåÀ» ½ÇÇàÇÏ´Â ÇÔ¼ö 
     * DDL  (CREATE, ALTER, DROP, RENAME, TRUNCATE) ¹®ÀåÀ» ½ÇÇàÇÏ´Â ÇÔ¼ö 
     * DCL  (GRANT, REVOKE) ¹®ÀåÀ» ½ÇÇàÇÏ´Â ÇÔ¼ö 
     * ¼º°øÇϸé SUCCESS¸¦, ½ÇÆÐÇϸé FAILURE¸¦ ¹ÝȯÇÑ´Ù. 
     */ 
     
    int ora_execute (void) 
    { 
        /* 
         * ¹®ÀåÀÇ Ã¹ ±¸ºÐÀ» °Ë»çÇÏ¿© DML, DDL, DCLÀΰ¡ °Ë»çÇÑ´Ù. 
         */ 
        if (!strncmp (stmt, "INSERT",   6) || 
            !strncmp (stmt, "Insert",   6) || 
            !strncmp (stmt, "insert",   6) || 
            !strncmp (stmt, "UPDATE",   6) || 
            !strncmp (stmt, "Update",   6) || 
            !strncmp (stmt, "update",   6) || 
            !strncmp (stmt, "DELETE",   6) || 
            !strncmp (stmt, "Delete",   6) || 
            !strncmp (stmt, "delete",   6) || 
            !strncmp (stmt, "CREATE",   6) || 
            !strncmp (stmt, "Create",   6) || 
            !strncmp (stmt, "create",   6) || 
            !strncmp (stmt, "ALTER",    5) || 
            !strncmp (stmt, "Alter",    5) || 
            !strncmp (stmt, "alter",    5) || 
            !strncmp (stmt, "DROP",     4) || 
            !strncmp (stmt, "Drop",     4) || 
            !strncmp (stmt, "drop",     4) || 
            !strncmp (stmt, "RENAME",   6) || 
            !strncmp (stmt, "Rename",   6) || 
            !strncmp (stmt, "rename",   6) || 
            !strncmp (stmt, "TRUNCATE", 8) || 
            !strncmp (stmt, "Truncate", 8) || 
            !strncmp (stmt, "truncate", 8) || 
            !strncmp (stmt, "REVOKE",   6) || 
            !strncmp (stmt, "Revoke",   6) || 
            !strncmp (stmt, "revoke",   6) || 
            !strncmp (stmt, "GRANT",    5) || 
            !strncmp (stmt, "Grant",    5) || 
            !strncmp (stmt, "grant",    5)) 
        { 
            /* 
             * ¹®ÀåÀ» ½ÇÇàÇÑ´Ù. 
             */ 
            exec sql 
                execute immediate :stmt; 
     
            /* 
             * sqlcode¸¦ °Ë»çÇÏ¿© °á°ú¸¦ ¸®ÅÏÇÑ´Ù. 
             */ 
            return ((sqlca.sqlcode == 0) ? SUCCESS : FAILURE); 
        } 
    } 
     
     
    /* 
     * Bind º¯¼ö¸¦ Á¤ÀÇÇϰí Ä¿¼­¸¦ ¼±¾ðÇÏ°í ¿­¾î Ä®·³ÀÇ °³¼ö¸¦ Àü´ÞÇÑ´Ù. 
     * ¼º°øÇϸé SUCCESS¸¦ ½ÇÆÐÇϸé FAILURE¸¦ ¹ÝȯÇÑ´Ù. 
     */ 
    int ora_select_open (int *ncols) 
    { 
        /* 
         * sqlca.sqlcode ¸¦ °Ë»çÇØµµ ÁÁÀ¸³ª exec sql¹®ÀåÀÌ ³Ê¹« ¸¹Àº °æ¿ì 
         * ÀÏÀÏÀÌ sqlcode¸¦ °Ë»çÇÏ´Â °ÍÀº Äڵ带 ÀбⰡ ÁöÀúºÐ ÇϹǷΠ
         * whenever±¸¹®À» »ç¿ëÇØ¼­ SQL ¿¡·¯°¡ ¹ß»ýÇϸé ERROR·Î °¡µµ·Ï ÇÑ´Ù. 
         */ 
        exec sql 
            whenever sqlerror goto ERROR; 
     
        /* 
         * input, outputÀ» À§ÇÑ descriptor¸¦ »ý¼ºÇÑ´Ù. 
         */ 
        exec sql 
            allocate descriptor local 'in' ; 
        exec sql 
            allocate descriptor local 'out'; 
     
        /* 
         * SQL ¹®ÀåÀ» ÆÄ½ÌÇϱâ À§ÇÑ ID¸¦ ¾ò¾î¿Â´Ù. 
         */ 
        exec sql 
            prepare sql from :stmt; 
     
        /* 
         * Input Bind º¯¼öµéÀ» À§ÇÑ descriptor¸¦ ÁöÁ¤ÇÑ´Ù. 
         */ 
        exec sql 
            describe input sql using descriptor local 'in'; 
     
        /* 
         * Input Bind º¯¼öÀÇ °³¼ö¸¦ descriptor¿¡¼­ ¾ò¾î¿Â´Ù 
         */ 
        exec sql 
            get descriptor local 'in' :input_cnt = count; 
     
        /* 
         * ANSI SQL Datatypes 
         * 
         * Character         : 1 
         * Character Varying : 12 
         * Date              : 9 
         * Decimal           : 3 
         * Double Precision  : 8 
         * Float             : 6 
         * Integer           : 4 
         * Numeric           : 2 
         * Real              : 7 
         * SmallInt          : 5 
         */ 
     
        /* 
         * SQL¹®ÀåÀÇ Input Bind º¯¼öÀÇ °³¼ö¸¸Å­ Type, Length, ½ÇÁ¦ Data¸¦ ÁöÁ¤ÇÑ´Ù. 
         * value´Â bind º¯¼öÀÇ À§Ä¡¼ø¼­, TypeÀº µ¥ÀÌŸ ŸÀÔ, Length´Â º¯¼öÀÇ ±æÀÌ´Ù. 
         */ 
        for (value = 1; value <= input_cnt; value ++) 
        { 
            /* 
             * Input Bind º¯¼öÀÇ À̸§°ú ŸÀÔ, ±æÀ̸¦ ¾ò¾î¿Â´Ù. 
             */ 
            exec sql 
                get descriptor local 'in' value :value 
                :name = name, :type = type, :length = length; 
             
            /* 
             * Input Bind º¯¼öÀÇ °ªÀ» ¹Þ¾ÆµéÀδÙ. 
             * ´ëºÎºÐÀÇ Dynamic SQL¿¡¼­´Â Input Bind º¯¼ö¸¦ 
             * °ÅÀÇ ¾²Áö ¾ÊÀ¸¹Ç·Î ½ÇÁ¦·Î´Â Àß ¾È¾²ÀδÙ. 
             */ 
            printf ("Enter Value for Input Variable %s : ", name); 
            fgets (data, sizeof (data), stdin); 
            /* 
             * CR, LF Äڵ带 Á¦°ÅÇÑ´Ù. 
             */ 
            data [ strlen (data) -1 ] = '\0'; 
     
            /* 
             * ¸ðµç bind º¯¼öÀÇ °ªÀº ¹®ÀÚ¿­·Î ¹Þ¾ÆµéÀ̹ǷΠtypeÀ» 12·Î ÇÑ´Ù. 
             * ½ÇÁ¦ Input Bind º¯¼öÀÇ ±æÀÌ, ŸÀÔ, °ªÀ» ÁöÁ¤ÇØ ÁØ´Ù. 
             */ 
            type = 12; 
            length = strlen (data) + 1; 
            exec sql 
                set descriptor local 'in' value :value 
                type = :type, length = :length, data = :data; 
        } 
     
        /* 
         * Ä¿¼­¸¦ ¼±¾ðÇÏ°í ¿¬´Ù 
         */ 
        exec sql 
            declare curs cursor for sql; 
        exec sql 
            open curs using descriptor local 'in'; 
     
        /* 
         * Output Bind º¯¼öµéÀ» describeÇϱâ À§ÇÑ descriptor¸¦ ÁöÁ¤ÇÑ´Ù. 
         */ 
        exec sql 
            describe output sql using descriptor local 'out'; 
     
        /* 
         * Dynamic SQLÀ̹ǷΠSelect ListÀÇ Ä®·³ °³¼ö¸¦ ¾ËÁö ¸øÇÑ´Ù.  
         * ±×·¯¹Ç·Î 'out' descriptor¸¦ ÀÌ¿ëÇÏ¿© Select ListÀÇ Ä®·³ÀÇ 
         * °³¼ö¸¦ ¾ò¾î¿Í¼­ ÇÔ¼öÀÎÀÚ ncols¿¡ Àü´ÞÇÑ´Ù. 
         */ 
        exec sql 
            get descriptor local 'out' :output_cnt = count; 
     
        *ncols = output_cnt; 
     
        /* 
         * SQL ¿¡·¯°¡ ¹ß»ýÇÏ¿´À» °æ¿ì °è¼Ó ÁøÇàÇϵµ·Ï ÇÑ´Ù. 
         */ 
        exec sql 
            whenever sqlerror continue; 
     
        return (SUCCESS); 
     
    /* 
     * ¿¡·¯°¡ ¹ß»ýÇÏ¿´À» °æ¿ì Ä¿¼­¿Í µ¥½ºÅ©¸³Æ®¸¦ ´Ý´Â´Ù. 
     */ 
    ERROR: 
        printf ("Error : %d - %s\n", ora_sqlcode (), ora_sqlerrm ()); 
     
        exec sql 
            whenever sqlerror continue; 
        exec sql 
            close curs; 
        exec sql 
            deallocate descriptor local 'in'; 
        exec sql 
            deallocate descriptor local 'out'; 
     
        return (FAILURE); 
    } 
     
     
    /* 
     * Ä¿¼­¿¡¼­ ÁöÁ¤ÇÑ Ä®·³ÀÇ À̸§À» ¾ò¾î¿Â´Ù. 
     * ¼º°øÇϸé SUCCESS¸¦ ½ÇÆÐÇϸé FAILURE¸¦ ¹ÝȯÇÑ´Ù. 
     */ 
    int ora_select_fetch_name (char *pdata, int pos) 
    { 
        /* 
         * sqlca.sqlcode ¸¦ °Ë»çÇØµµ ÁÁÀ¸³ª exec sql¹®ÀåÀÌ ³Ê¹« ¸¹Àº °æ¿ì 
         * ÀÏÀÏÀÌ sqlcode¸¦ °Ë»çÇÏ´Â °ÍÀº Äڵ带 ÀбⰡ ÁöÀúºÐ ÇϹǷΠ
         * whenever±¸¹®À» »ç¿ëÇØ¼­ SQL ¿¡·¯°¡ ¹ß»ýÇϸé ERROR·Î °¡µµ·Ï ÇÑ´Ù. 
         */ 
        exec sql 
            whenever sqlerror goto ERROR; 
         
        /* 
         * descriptor¿¡¼­ Ä®·³ÀÇ À̸§À» ¾ò¾î¿Â´Ù. 
         * value´Â Ä®·³ÀÇ À§Ä¡ÀÌ´Ù. 
         */ 
     
        /* 
         * descriptor·ÎºÎÅÍ ÁöÁ¤ À§Ä¡ÀÇ Ä®·³ À̸§À» ¾ò¾î¿Â´Ù. 
         */ 
        value = pos; 
        exec sql 
            get descriptor local 'out' value :value :name = name; 
     
        /* 
         * Ä®·³ À̸§À» ÇÔ¼ö ÀÎÀÚ pdata¿¡ ³Ö¾îÁØ´Ù. 
         */ 
        strcpy (pdata, name); 
     
        /* 
         * SQL ¿¡·¯°¡ ¹ß»ýÇÏ¿´À» °æ¿ì °è¼Ó ÁøÇàÇϵµ·Ï ÇÑ´Ù. 
         */ 
        exec sql 
            whenever sqlerror continue; 
     
        return (SUCCESS); 
     
    /* 
     * ¿¡·¯°¡ ¹ß»ýÇÏ¿´À» °æ¿ì Ä¿¼­¿Í µ¥½ºÅ©¸³Æ®¸¦ ´Ý´Â´Ù. 
     */ 
    ERROR: 
        printf ("Error : %d - %s\n", ora_sqlcode (), ora_sqlerrm ()); 
     
        exec sql 
            whenever sqlerror continue; 
        exec sql 
            close curs; 
        exec sql 
            deallocate descriptor local 'in'; 
        exec sql 
            deallocate descriptor local 'out'; 
     
        return (FAILURE); 
    } 
     
     
    /* 
     * Ä¿¼­¿¡¼­ ÇϳªÀÇ row¸¦ ÆÐÄ¡Çϱâ Àü¿¡ ¸ÕÀú °¢ Ä®·³ÀÇ 
     * µ¥ÀÌŸ ŸÀÔÀ» Á¤ÀÇ ÇØÁÖ¾î¾ß¸¸ ÇÑ´Ù. 
     * ¼º°øÇϸé SUCCESS¸¦ ½ÇÆÐÇϸé FAILURE¸¦ ¹ÝȯÇÑ´Ù. 
     */ 
    int ora_select_set_column (int pos, int type, int length) 
    { 
    int value; 
     
        /* 
         * sqlca.sqlcode ¸¦ °Ë»çÇØµµ ÁÁÀ¸³ª exec sql¹®ÀåÀÌ ³Ê¹« ¸¹Àº °æ¿ì 
         * ÀÏÀÏÀÌ sqlcode¸¦ °Ë»çÇÏ´Â °ÍÀº Äڵ带 ÀбⰡ ÁöÀúºÐ ÇϹǷΠ
         * whenever±¸¹®À» »ç¿ëÇØ¼­ SQL ¿¡·¯°¡ ¹ß»ýÇϸé ERROR·Î °¡µµ·Ï ÇÑ´Ù. 
         */ 
        exec sql 
            whenever sqlerror goto ERROR; 
         
        /* 
         * ÁöÁ¤ À§Ä¡ÀÇ Ä®·³ µ¥ÀÌŸ¸¦ ¾ò¾î¿À±â À§Çؼ­ descriptor¿¡ 
         * Output Bind º¯¼öÀÇ datatype, length¸¦ ¼³Á¤ÇÑ´Ù. 
         */ 
        value = pos; 
        exec sql 
            set descriptor local 'out' value :value 
            type = :type, length = :length; 
     
        /* 
         * SQL ¿¡·¯°¡ ¹ß»ýÇÏ¿´À» °æ¿ì °è¼Ó ÁøÇàÇϵµ·Ï ÇÑ´Ù. 
         */ 
        exec sql 
            whenever sqlerror continue; 
     
        return (SUCCESS); 
     
    /* 
     * ¿¡·¯°¡ ¹ß»ýÇÏ¿´À» °æ¿ì Ä¿¼­¿Í µ¥½ºÅ©¸³Æ®¸¦ ´Ý´Â´Ù. 
     */ 
    ERROR: 
        printf ("Error : %d - %s\n", ora_sqlcode (), ora_sqlerrm ()); 
     
        exec sql 
            whenever sqlerror continue; 
        exec sql 
            close curs; 
        exec sql 
            deallocate descriptor local 'in'; 
        exec sql 
            deallocate descriptor local 'out'; 
     
        return (FAILURE); 
    } 
     
     
    /* 
     * Ä¿¼­¿¡¼­ ÇϳªÀÇ row¸¦ descriptor¿¡ ÆÐÄ¡ÇØ ³Ö´Â´Ù. 
     * ³ªÁß¿¡ descriptor¿¡¼­ ÇÑ Ä®·³¾¿ µ¥ÀÌŸ¸¦ ¾ò¾î¿Â´Ù. 
     * ¼º°øÇϸé SUCCESS¸¦ ½ÇÆÐÇϸé FAILURE¸¦ ¹ÝȯÇÑ´Ù. 
     */ 
    int ora_select_fetch_row (void) 
    { 
        /* 
         * sqlca.sqlcode ¸¦ °Ë»çÇØµµ ÁÁÀ¸³ª exec sql¹®ÀåÀÌ ³Ê¹« ¸¹Àº °æ¿ì 
         * ÀÏÀÏÀÌ sqlcode¸¦ °Ë»çÇÏ´Â °ÍÀº Äڵ带 ÀбⰡ ÁöÀúºÐ ÇϹǷΠ
         * whenever±¸¹®À» »ç¿ëÇØ¼­ SQL ¿¡·¯°¡ ¹ß»ýÇϸé ERROR·Î °¡µµ·Ï ÇÑ´Ù. 
         */ 
        exec sql 
            whenever sqlerror goto ERROR; 
         
        /* 
         * Ä¿¼­¿¡¼­ ÇϳªÀÇ row¸¦ ÆÐÄ¡ÇÏ¿© descriptor·Î ³Ö´Â´Ù. 
         */ 
        exec sql 
            fetch curs into descriptor local 'out'; 
     
        /* 
         * SQL ¿¡·¯°¡ ¹ß»ýÇÏ¿´À» °æ¿ì °è¼Ó ÁøÇàÇϵµ·Ï ÇÑ´Ù. 
         */ 
        exec sql 
            whenever sqlerror continue; 
     
        return (SUCCESS); 
     
    /* 
     * ¿¡·¯°¡ ¹ß»ýÇÏ¿´À» °æ¿ì Ä¿¼­¿Í µ¥½ºÅ©¸³Æ®¸¦ ´Ý´Â´Ù. 
     */ 
    ERROR: 
        printf ("Error : %d - %s\n", ora_sqlcode (), ora_sqlerrm ()); 
     
        exec sql 
            whenever sqlerror continue; 
        exec sql 
            close curs; 
        exec sql 
            deallocate descriptor local 'in'; 
        exec sql 
            deallocate descriptor local 'out'; 
     
        return (FAILURE); 
    } 
     
     
    /* 
     * ÇϳªÀÇ row¸¦ °¡Áö°í ÀÖ´Â descriptor¿¡¼­ ÇϳªÀÇ Ä®·³ µ¥ÀÌŸ¸¦ ÆÐÄ¡ÇÑ´Ù. 
     */ 
    int ora_select_fetch_data (char *pdata, int pos) 
    { 
        /* 
         * sqlca.sqlcode ¸¦ °Ë»çÇØµµ ÁÁÀ¸³ª exec sql¹®ÀåÀÌ ³Ê¹« ¸¹Àº °æ¿ì 
         * ÀÏÀÏÀÌ sqlcode¸¦ °Ë»çÇÏ´Â °ÍÀº Äڵ带 ÀбⰡ ÁöÀúºÐ ÇϹǷΠ
         * whenever±¸¹®À» »ç¿ëÇØ¼­ SQL ¿¡·¯°¡ ¹ß»ýÇϸé ERROR·Î °¡µµ·Ï ÇÑ´Ù. 
         */ 
        exec sql 
            whenever sqlerror goto ERROR; 
         
     
        /* 
         * descriptor¿¡¼­ ÁöÁ¤µÈ À§Ä¡ÀÇ Ä®·³ µ¥ÀÌŸ¸¦ ¾ò¾î¿Â´Ù. 
         */ 
        value = pos; 
        exec sql 
            get descriptor local 'out' value :value 
            :data = data, :indi = indicator; 
     
        /* 
         * SQL ¿¡·¯°¡ ¹ß»ýÇÏ¿´À» °æ¿ì °è¼Ó ÁøÇàÇϵµ·Ï ÇÑ´Ù. 
         */ 
        exec sql 
            whenever sqlerror continue; 
     
        /* 
         * indicator º¯¼öÀÇ °ªÀ» Á¶»çÇÏ¿© Ä®·³ µ¥ÀÌŸ°¡ NULLÀÌ ¾Æ´Ï¶ó¸é 
         * µ¥ÀÌŸ¸¦ º¹»çÇϰí NULLÀÌ ¸Â´Ù¸é "[NULL]" ¹®ÀÚ¿­À» °ªÀ¸·Î º¹»çÇÑ´Ù. 
         */ 
        strcpy (pdata,  (indi != -1) ? data : "[NULL]"); 
     
        return (SUCCESS); 
     
    /* 
     * ¿¡·¯°¡ ¹ß»ýÇÏ¿´À» °æ¿ì Ä¿¼­¿Í µ¥½ºÅ©¸³Æ®¸¦ ´Ý´Â´Ù. 
     */ 
    ERROR: 
        printf ("Error : %d - %s\n", ora_sqlcode (), ora_sqlerrm ()); 
     
        exec sql 
            whenever sqlerror continue; 
        exec sql 
            close curs; 
        exec sql 
            deallocate descriptor local 'in'; 
        exec sql 
            deallocate descriptor local 'out'; 
     
        return (FAILURE); 
    } 
     
     
    /* 
     * Ä¿¼­·ÎºÎÅÍ ¸ðµç ³»¿ëÀ» ÆÐÄ¡Çϰí Ä¿¼­¿Í descriptor¸¦ ´Ý´Â´Ù. 
     */ 
    int ora_select_close (void) 
    { 
        /* 
         * sqlca.sqlcode ¸¦ °Ë»çÇØµµ ÁÁÀ¸³ª exec sql¹®ÀåÀÌ ³Ê¹« ¸¹Àº °æ¿ì 
         * ÀÏÀÏÀÌ sqlcode¸¦ °Ë»çÇÏ´Â °ÍÀº Äڵ带 ÀбⰡ ÁöÀúºÐÇϹǷΠ
         * whenever±¸¹®À» »ç¿ëÇØ¼­ SQL ¿¡·¯°¡ ¹ß»ýÇϸé ERROR·Î °¡µµ·Ï ÇÑ´Ù. 
         */ 
        exec sql 
            whenever sqlerror goto ERROR; 
     
        /* 
         * »ç¿ëÇÑ Ä¿¼­¸¦ ´Ý´Â´Ù. 
         */ 
        exec sql 
            close curs; 
     
        /* 
         * »ç¿ëÇÑ input, output descriptor¸¦ Á¦°ÅÇÑ´Ù. 
         */ 
        exec sql 
            deallocate descriptor local 'in'; 
        exec sql 
            deallocate descriptor local 'out'; 
     
        /* 
         * SQL ¿¡·¯°¡ ¹ß»ýÇÏ¿´À» °æ¿ì °è¼Ó ÁøÇàÇϵµ·Ï ÇÑ´Ù. 
         */ 
        exec sql 
            whenever sqlerror continue; 
     
        return (SUCCESS); 
     
    /* 
     * ¿¡·¯°¡ ¹ß»ýÇÏ¿´À» °æ¿ì Ä¿¼­¿Í µ¥½ºÅ©¸³Æ®¸¦ ´Ý´Â´Ù. 
     */ 
    ERROR: 
        printf ("Error : %d - %s\n", ora_sqlcode (), ora_sqlerrm ()); 
     
        exec sql 
            whenever sqlerror continue; 
        exec sql 
            close curs; 
        exec sql 
            deallocate descriptor local 'in'; 
        exec sql 
            deallocate descriptor local 'out'; 
     
        return (FAILURE); 
    } 
     

    /* -------------------------------------------------------------------------------- 
    ÆÄÀÏ À̸§ : test.c 
    °³¹ß ÀÏÀÚ : 2002-10-28 
    ÀÛ¼ºÀÚ : ·ù¸íȯ 
    -------------------------------------------------------------------------------- */ 
     
    /* 
     * test.c 
     * dblib.c ¸¦ »ç¿ëÇÏ¿© SQL ¹®ÀåÀ» µ¿ÀûÀ¸·Î ÇÒ´çÇÑ ¿¹Á¦ 
     * ¸ðµç ÇÔ¼ö ¼öÇà¿¡ ret º¯¼ö¿¡ °á°ú¸¦ ¹Þ´Â´Ù. 
     * ret º¯¼ö¸¦ °Ë»çÇÏ¿© ÇÔ¼öÀÇ ½ÇÇà °á°ú¸¦ ¾Ë ¼ö ÀÖ´Ù.  
     */ 
     
    #include <stdio.h> 
    #include <stdlib.h> 
    #include <string.h> 
     
    #include "dblib.h" 
     
    int main (void) 
    { 
    int i; 
    int ret; 
    int ncols; 
    char stmt [MAX_SQL_LEN]; 
    char data [MAX_DATA_LEN]; 
     
        strcpy (stmt, 
            "select d.dname, e.ename, to_char (e.hiredate, 'yyyy-mm-dd') hiredate, e.sal, e.comm from dept d, emp e where d.deptno = e.deptno "); 
     
        ret = ora_connect ("scott", "tiger", NULL); 
     
        ret = ora_setstmt (stmt); 
     
        ret = ora_select_open (&ncols); 
     
        for (i = 1; i <= ncols; i ++) 
        { 
            ret = ora_select_fetch_name (data, i); 
            printf ("%-10s ", data); 
        } 
        printf ("\n-------------------------------------------------------\n"); 
     
        for (i = 1; i <= ncols; i ++) 
        { 
            ret = ora_select_set_column (i, VARCHAR2, MAX_DATA_LEN); 
        } 
     
        while (ora_select_fetch_row () == SUCCESS) 
        { 
            for (i = 1; i <= ncols; i ++) 
            { 
                ret = ora_select_fetch_data (data, i); 
                printf ("%-10s ", data); 
            } 
            printf ("\n"); 
        } 
     
        ret = ora_disconnect (ROLLBACK); 
     
        exit (EXIT_SUCCESS); 
    } 
     
  • EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù.