°ø°³ µ¥ÀÌÅͺ£À̽º ¼­¹ö PostgreSQL (6)
-ECPG·Î Embedded SQL ÇÁ·Î±×·¡¹ÖÇϱâ

Çѵ¿ÈÆ /¸®´ª½º ÄÚ¸®¾Æ ´ëÇ¥ ddoch@hitel.kol.co.kr

    

     

PostgreSQL ¹öÀü 6.3 ¾ó¸¶³ª ´Þ¶óÁ³³ª?

    3¿ù 1ÀÏÀÚ·Î PostgreSQLÀÇ 6.3 ¹öÀüÀÌ ¹ßÇ¥µÇ¾ú´Ù. »ç½Ç PostgreSQL °³¹ßÆÀ¿¡¼­´Â À۳⠿¬¸» ÀÌÀü¿¡ ¹ßÇ¥ÇÏ°Ú´Ù°í Çß¾ú´Ù. 6.2.1 ¹öÀü ¹ßÇ¥ ÀÌÈÄ·Î »ó´çÇÑ ½Ã°£ÀÌ Èê·¯ 6.3 ¹öÀüÀÌ ¹ßÇ¥µÈ ¸¸Å­ °ø°³ µ¥ÀÌÅͺ£À̽º ¼­¹ö »ç¿ëÀÚµéÀº »õ·Î¿î ¹öÀü¿¡ ¸¹Àº ±â´ë¸¦ °É°í ÀÖ´Â °Í °°´Ù. ±× ¿À·£ ±â°£µ¿¾È¸¸Å­ ¸¹Àº °ÍµéÀÌ Ãß°¡µÇ¾ú°í ´Þ¶óÁ³´Ù. PostgreSQL 6.0ÀÌ Postgres95ÀÇ À庮À» ¶Ù¾î³ÑÀº Àü ºÐ¾ß¿¡¼­ÀÇ È¹±âÀûÀÎ ¹öÀüÀ̾ú´Ù°í ÇÑ´Ù¸é, PostgreSQL 6.3Àº 6.0 ÀÌÈÄ¿¡ °¡Àå ȹ±âÀûÀÎ º¯È­¸¦ °¡Á®¿Ô´Ù°í º¼ ¼ö ÀÖ´Ù.
    PostgreSQL °³¹ßÆÀ¿¡¼­´Â 6.0 ÀÌÈÄ¿¡ SQL92 Ç¥ÁØÀ» Áö¿øÇÏ°í ¿©·¯ºÐÀº ÀÌÁ¦ ±× ÇýÅÃÀ» ¸¶À½²¯ ´©¸± ¼ö ÀÖ°Ô µÇ¾ú´Ù. ¿©·¯ºÐÀº ÀÌÁ¦ ±× ÇýÅÃÀ» ¸¶À½²¯ ´©¸± ¼ö ÀÖ°Ô µÇ¾ú´Ù. PostgreSQL »ç¿ëÀڵ鿡°Ô´Â ÀÌÁ¦ ¶Ç ÇѹøÀÇ ¾÷±×·¹À̵å ÀüÀïÀ» ÇØ¾ß ÇÒ ¶Ñ·ÇÇÑ ÀÌÀ¯°¡ ÁÖ¾îÁø ¼ÀÀÌ´Ù. ÀÌÁ¦ 6.3¿¡¼­ ´Þ¶óÁø ±â´ÉÀ» »ìÆ캸ÀÚ.

     

SUBSELECTÀÇ Áö¿ø

    ¿À·§µ¿¾È PostgreSQL »ç¿ëÀÚÀÇ ¹Ù·¥ ÁßÀÇ ÇϳªÀÎ SUBSELECT¸¦ ¸¶Ä§³» Áö¿øÇÑ´Ù. º¸Á¶ ÁúÀÇ Áß¿¡ EXISTS, IN, ALL, ANY ¿¹¾à¾î¸¦ ÇÔ²² »ç¿ëÇÒ ¼ö ÀÖ´Ù.

PRIMARY KEY¿Í UNIQUEÀý Áö¿ø

    SQL92ÀÇ PRIMARY KEY¿Í UNIQUEÀýÀ» À妽º¸¦ »ç¿ëÇÏ¿© ±¸ÇöÇÏ¿´´Ù. FOREIGN KEY´Â ¾ÆÁ÷ ±¸ÇöµÇ¾îÀÖÁö ¾Ê´Ù.

SQL 92ÀÇ ¿©·¯ »ó¼ö°ª Áö¿ø

    SQL92¿¡´Â »óȲ¿¡ µû¶ó »ç¿ëÇÒ ¼ö ÀÖ´Â ¿©·¯ »ó¼ö°ªµéÀÌ Á¤ÀǵǾî ÀÖ´Ù. PostgreSQL 6.3 ¹öÀü¿¡¼­µµ ÀÌ·¯ÇÑ °Íµé Áß ¿©·¯ °³¸¦ Áö¿øÇÑ´Ù.
    CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER¸¦ ºñ·ÔÇÑ °¡º¯»ó¼ö¿Í TRUE, FALSE¸¦ ºñ·ÔÇÑ ³í¸®»ó¼ö, IS TRUE, IS FALSE, IS NOT TRUE, IS NOT FALSE¸¦ ºñ·ÔÇÑ Á¶°ÇÀýÀ» Áö¿øÇÑ´Ù.

»ç¿ëÀÚ PROCEDURAL LANGUAGE »ý¼º Áö¿ø

    »ç¿ëÀÚ°¡ Á÷Á¢ ÇÔ¼ö¿¡ »ç¿ëÇÒ ¾ð¾î¸¦ ÀÛ¼ºÇÒ ¼ö ÀÖµµ·Ï ÇØÁÖ´Â À¯¿ëÇÑ ±â´ÉÀÌ´Ù. ÀÏ¹Ý µ¥ÀÌÅͺ£À̽º »ç¿ëÀÚ´Â Á÷Á¢ »ç¿ëÇÒ ±âȸ°¡ ¾ø°ÚÁö¸¸, °³¹ßÀÚ¶ó¸é °ü½ÉÀ» °¡Áú¸¸ ÇÏ´Ù. ±¸¹®Àº ´ÙÀ½°ú °°´Ù.

    create function plsample_call_handler () returns
             opaque as '/usr/local/pgsql/lib/plsample.so'
             language 'C';
    create procedural language 'plsample' handler
             plsample_call_handler lancompiler 'PL/Sample';
    language 'C';

»õ·Î¿î PostgreSQL ÇÁ·Î½ÃÀú ¾ð¾î(PL)Áö¿ø

    ¿À¶óŬ¿¡¼­ ÁÖ·Î »ç¿ëÇÏ´Â PL/SQL°ú À¯»çÇÑ ÇÁ·Î½ÃÀú ¾ð¾îÀÌ´Ù. PLÀº ½ºÅ©¸³Æ® ¾ð¾îÀ̸鼭µµ SQLÀÇ ±â´ÉÀ» °­·ÂÇÏ°Ô ¼öÇàÇÏ´Â ÇÁ·Î½ÃÀú Áß½ÉÀÇ ¾ð¾î¶ó°í º¼ ¼ö ÀÖ´Ù. PostgreSQL¿¡¼­´Â PL/TCLÀ» ±× ù ¹ø°·Î Á¦°øÇÑ´Ù.

ÀÚÁÖ È£ÃâµÇ´Â ÇÔ¼öÀÇ ºü¸¥ ¼Óµµ À¯Áö

    ÀÚÁÖ »ç¿ëµÇ´Â ÇÔ¼ö Áß ¸î ¸î¿¡ ´ëÇØ Áï°¢ÀûÀΠ󸮸¦ ÇÔÀ¸·Î½á ¼Óµµ°¡ Çâ»óµÇ¾ú´Ù.

¶ôÅ·¿¡¼­ÀÇ Çâ»ó

    ¶ôÅ·Àº µ¥ÀÌÅͺ£À̽º ½Ã½ºÅÛ¿¡¼­ ¸Å¿ì Áß¿äÇÑ À§Ä¡¸¦ Â÷ÁöÇÑ´Ù. ±³Âø»óŶó°í ºÎ¸£´Â ½ÇÁ¦ deadlockÀ» °¨ÁöÇÔÀ¸·Î½á ´õ ÀÌ»óÀÇ time outÀ» ¹æÁöÇÑ´Ù. ¾Æ¿ï·¯ À妽º¸¦ »ý¼ºÇÒ ¶§¿¡ °øÀ¯ ¶ô(shard lock)À» »ç¿ëÇÑ´Ù. ±×¸®°í »ç¿ëÀÚ°¡ ƯÁ¤ µ¥ÀÌÅͺ£À̽ºÀÇ Å×À̺íÀ» Æ®·£Àè¼Ç ±¸°£ Áß¿¡¼­ µ¶Á¡ ¶ô(exclusive lock)À» °É ¼ö ÀÖµµ·Ï Çã¿ëÇÏ´Â LOCK ¸í·ÉÀ» »ç¿ëÇÒ ¼ö ÀÖ´Ù.

UNIX µµ¸ÞÀÎ ¼ÒÄÏ Áö¿ø

    º¤¿£µå¿Í ÇÁ·ÐÆ®¿£µå ¶óÀ̺귯¸®¿¡¼­ UNIX µµ¸ÞÀÎ ¼ÒÄÏÀ» Áö¿øÇÑ´Ù.

LIKE ¿Í ~, !~ ±¸¹®¿¡ À妽º »ç¿ë

UNION, GROUP, DISTINCTÀÇ ¼±º°Àû Áö¿ø

    SELECT ½Ã¿¡ UNIONÀ» Áö¿øÇÏ°í, INSERT ½Ã¿¡ UNION, GROUP, DISTINCT¸¦ Áö¿øÇÑ´Ù.

varcharÀÇ µð½ºÅ© ÀúÀåÇüÅ º¯°æ

    µ¥ÀÌÅÍÇüÀÌ varcharÀÎ µ¥ÀÌÅÍ´Â µð½ºÅ©¿¡ ÀúÀåµÉ ¶§, ÇÊ¿äÇÑ ºÎºÐ¸¸ ÀúÀåµÈ´Ù. Áï, varchar(100)À̶ó°í Çصµ ½ÇÁ¦ µ¥ÀÌÅÍ°¡ 8¹ÙÀÌÆ®¶ó¸é ±×¸¸Å­¸¸ ÀúÀåµÈ´Ù.

.psqlrc ±âµ¿ÆÄÀÏ Áö¿ø

    psqlÀ» »ç¿ëÇÒ ½Ã¿¡ »ç¿ëÀÚ°¡ ¿©·¯ °¡Áö¸¦ ¹Ì¸® Æí¸®ÇÏ°Ô ¼³Á¤ÇÒ ¼ö ÀÖµµ·Ï, Ȩµð·ºÅ丮¿¡ .psqlrc ÆÄÀÏÀ» ¸¸µé ¼ö ÀÖµµ·Ï Áö¿øÇÑ´Ù. $HOME/.psqlrc ÆÄÀÏ¿¡´Â psql¿¡¼­ ¼öÇàÇÒ ¼ö ÀÖ´Â ¸ðµç ¸í·ÉÀÌ ¿Ã ¼ö ÀÖ´Ù. PostgreSQL¿¡¼­ psqlÀ» ½ÃÀÛÇÒ ¶§¸¶´Ù ³¯Â¥ÇüÀ» ISO·Î ¸ÂÃß°í, vacuum ¸í·ÉÀ» ¼öÇàÇÑ´Ù¸é, $HOME/.psqlrc ÆÄÀÏ¿¡ ´ÙÀ½°ú °°Àº ³»¿ëÀ» Àû¾îº¸ÀÚ.

    vacuum;
    set DateStyle to 'ISO';

    ´ÙÀ½Àº psqlÀ» °¡µ¿ÇÒ ¶§ÀÇ È­¸éÀÌ´Ù.

½Ã°£ ¿©Çà(time travel) ±â´É Á¦°Å

    ¸» ¸¹´ø ½Ã°£ ¿©Çà ±â´ÉÀÌ µåµð¾î Á¦°ÅµÇ¾ú´Ù. ÀÌ ±â´ÉÀº À¯¿ëÇϱä ÇÏÁö¸¸, µ¥ÀÌÅͺ£À̽º ½Ã½ºÅÛÀÇ ¼Óµµ¸¦ ÀúÇϽÃÅ°´Âµ¥ ÇѸòÀ» ÇØ¿Ô´Ù. ¿À·¡ Àü¿¡ Áö¿öÁø µ¥ÀÌÅͱîÁöµµ ¿ÏÀüÈ÷ º¹±¸ÇÒ ¼ö ÀÖµµ·Ï Áö¿øÇØ ÁÜÀ¸·Î½á »ç¿ëÀÚ¿¡°Ô Æí¸®¼ºÀ» Á¦°øÇØ¿À±â´Â ÇßÁö¸¸, ±× ¶§¹®¿¡ µ¥ÀÌÅÍ Ã³¸® ¼Óµµ°¡ »ó´çÈ÷ ´Ê¾îÁ³±â ¶§¹®ÀÌ´Ù. ÀÌÁ¦ SQL ÁúÀǽÿ¡ µ¥ÀÌÅ͸¦ ȸ¼öÇÏ´Â µ¥±îÁö °É¸®´Â ½Ã°£Àº ´õ¿í ´ÜÃàµÇ¾ú´Ù. ÇÏÁö¸¸ ½Ã°£ ¿©Çà ±â´ÉÀº Æ®¸®°Å ±â´ÉÀ» »ç¿ëÇϸé ÃæºÐÈ÷ Àç»ýÇÒ ¼ö ÀÖÀ¸¸ç, ½ÇÁ¦·Î 6.2¿¡¼­ ½Ã°£ ¿©ÇàÀ» À§ÇÑ ÀϹÝÀûÀÎ Æ®¸®°Å ÇÔ¼ö°¡ ÀÌ¹Ì Ãß°¡µÇ¾ú´Ù.

»õ·Î¿öÁø ¹®¼­µé

    ÇÊÀÚ»Ó¸¸ÀÌ ¾Æ´Ï¶ó PostgreSQL¿¡¼­ ÂüÁ¶ÇÒ ¸¸ÇÑ ¹®¼­°¡ ³Ê¹« Àû´Ù°í »ý°¢ÇØ¿Â ¿©·¯ºÐµé¿¡°Ô´Â Á¤¸» ¹Ý°¡¿î ÀÏÀÌ ¾Æ´Ò ¼ö ¾ø´Ù. PostgreSQL »çÀÌÆ®(www.postgreSQL.org)¿¡ ¸î ´Þ ÀüºÎÅÍ PostgreSQL °ü·Ã ¹®¼­È­ ÇÁ·ÎÁ§Æ®°¡ »õ·Ó°Ô ÃßÁøµÇ°í ÀÖ´Ù. ÀÌ¿Í ÇÔ²² ³ªÅ¸³­ »õ·Î¿î ¹®¼­µéÀº PostgreSQL ¸Å´Ï¾Æµé¿¡°Ô Á¤¸» °¥Áõ³¯ ¶§ÀÇ ¿À¾Æ½Ã½º°¡ ¾Æ´Ò±î ½Í´Ù. 6.3 ¹öÀü¿¡´Â ¸ðµÎ postgres ¸Å´º¾ó°ú °ü¸®ÀÚ ¸Å´º¾ó, ÇÁ·Î±×·¡¸Ó ¸Å´º¾ó, Æ©Å丮¾ó°ú »ç¿ëÀÚ ¸Å´º¾óÀÌ ºÐ¸®µÈ ä·Î ¼Ò½º ¹èÆ÷º»ÀÇ doc µð·ºÅ丮¿¡ µé¾îÀÖ´Ù. ¸ðµÎ »Ì¾Æº»´Ù¸é µÎ²¨¿î Ã¥ ÇÑ ±Ç ºÐ·®À» ¹æºÒÄÉ ÇÒ °ÍÀÌ´Ù. Áߺ¹µÇ´Â ³»¿ëÀÌ ´õ·¯ ÀÖ´Ù.

³»Àå ¾ð¾î ECPG Áö¿ø

    ECPG´Â PostgreSQL 6.3 ÀÌÀü±îÁö¸¸ Çصµ Linus Tolke(linus@epact.se)¾¾°¡ ÀÛ¼ºÇؼ­ PostgreSQL°ú´Â º°µµ·Î Áö¿øÇÏ´ø °ÍÀ̾ú´Âµ¥, 6.3¿¡ µé¾î¿À¸é¼­ ³»ºÎ¿¡ Æ÷ÇÔÇß´Ù. ECPG´Â ÀÏÁ¾ÀÇ C¿¡¼­ »ç¿ëÇÏ´Â ³»Àå SQLÀÌ´Ù. À̹ø È£ÀÇ ÁÖÁ¦°¡ ECPGÀ̹ǷΠÀÌÈÄ¿¡¼­ ÃæºÐÈ÷ ¼³¸íÇϵµ·Ï ÇÏÀÚ.

±× ¿Ü¿¡ ´Þ¶óÁø Á¡

    ÀÌ¿Ü¿¡µµ 6.3 ¹öÀü¿¡¼­ ´Þ¶óÁø °ÍµéÀÌ ¸¹ÀÌ ÀÖ´Ù. PSQL¿¡¼­ Áö¿øÇÏ´Â ±â´Éµµ È®ÀåµÇ¾úÀ¸¸ç, bin µð·ºÅ丮¿¡ Æ÷ÇÔµÈ ¹ÙÀ̳ʸ®µµ »ó´çÈ÷ ¸¹¾ÆÁ³´Ù. ¾Æ¿ï·¯ Áß¿äÇÑ Á¡ ÇÑ°¡Áö¸¦ ¾ð±ÞÇÏÀÚ¸é varchar()³ª text() ´ë½Å¿¡ ±âº»ÀûÀ¸·Î char()¸¦ ¾²±â¸¦ ±ÇÀåÇÑ´Ù. ¿Ö³ÄÇϸé 6.3¿¡ µé¾î¿Í¼­ ÀÌ µÑº¸´Ù char()°¡ »ó´çÈ÷ ¼Óµµ°¡ »¡¶óÁ³±â ¶§¹®ÀÌ´Ù. ±×¸®°í ºä¿¡¼­µµ ºä°¡ ±â¹ÝÇÏ°í ÀÖ´Â Å×À̺í°ú´Â º°µµ·Î ±ÇÇÑÀ» ¼³Á¤ÇÒ ¼ö ÀÖ°Ô µÇ¾ú´Ù. º¸¾ÈÀ» À§ÇØ GRANT, REVOKE ¸í·ÉÀ» »ç¿ëÇÏ¿© Á¶Á¤ÇÏ´Â °ÍÀÌ ÁÁ´Ù. µ¥ÀÌÅͺ£À̽º Á¢±ÙÀ» Á¦ÇÑÇÏ´Â pg_hba.confµµ Á» ´õ °­È­µÇ¾ú´Ù. ÀÚ¼¼ÇÑ À̾߱â´Â man pg_hba.conf·Î »ìÆ캸±â ¹Ù¶õ´Ù. ±×¸®°í pg_passwd ÀÎÁõ µ¥ÀÌÅͺ£À̽º°¡ UNIX ½Ã½ºÅÛÀÇ /etc/passwd¿Í´Â ºÐ¸®°¡ µÇ¾ú´Ù. ÆÄÀÌÅæ ÀÎÅÍÆäÀ̽º°¡ PyGreSQL 2.0À¸·Î »õ·Î¿öÁ³À¸¸ç, PostgreSQL¿¡¼­ »ç¿ëÇÏ´Â Çüº¯È¯ ¿¬»êÀÚÀÎ '::'´Â »ó¼ö°¡ ¾Æ´Ñ °ªµµ Çüº¯È¯ ÇÒ ¼ö ÀÖ°Ô µÇ¾ú´Ù. ÀÌ¿Ü¿¡µµ ½Ã½ºÅÛ Ä«Å»·Î±×(µ¥ÀÌÅÍ»çÀü)µµ ¸î °¡Áö º¯È­µÇ¾úÀ¸¸ç, ¿©·¯ °¡ÁöÀÇ ¹ö±×°¡ ¼öÁ¤µÇ¾ú´Ù. ÀÚ¼¼ÇÑ ³»¿ëÀº ¼Ò½º µð·ºÅ丮ÀÇ HISTORY ÆÄÀÏÀ» Âü°íÇϱ⠹ٶõ´Ù.

     

PostgreSQL¿¡¼­ ¸ÖƼ ¹ÙÀÌÆ® »ç¿ëÇϱâ

    PostgreSQL 6.3ÀÇ ¼³Ä¡¹æ¹ýÀº ÀÌÀüÀÇ 6.x ¹öÀü°ú µ¿ÀÏÇÏ´Ù. PostgreSQL¿¡¼­ ´ÙÁß ¹ÙÀÌÆ®¸¦ ó¸®ÇÒ ¼ö ÀÖµµ·Ï ÇØÁÖ´Â ÆÐÄ¡¸¦ ¸¸µé°í ÀÖ´Â Tatsuo Ishiu¾¾´Â À̹ø¿¡µµ ¾î±è¾øÀÌ 6.3 ¹öÀüÀ» À§ÇÑ ÆÐÄ¡¸¦ Àçºü¸£°Ô °ø±ÞÇÏ°í ÀÖ´Ù. ´ÙÀ½ »çÀÌÆ®¿¡¼­ ÀÌ·¯ÇÑ ÆÐÄ¡¸¦ ¾òÀ» ¼ö ÀÖ´Ù.

    ftp://ftp.sra.co.jp/pub/cmd/postgres/6.3/patches/6.3mbPL1.patch.gz

    PostgreSQL 6.3ÀÇ ¾ÐÃàÀ» Ǭ °÷¿¡¼­ ´ÙÀ½°ú °°ÀÌ ÆÐÄ¡ÇÏ¸é µÈ´Ù.

    #gzip -dc 6.3mbPL1.patch.gz | patch -p0

    À̹ø ÆÐÄ¡ÆÇÀº ¿¹ÀüÀÇ ÀϺ»¾î¸¦ ºñ·ÔÇÑ 2¹ÙÀÌÆ®±Ç »ç¿ëÀÚ¸¸À» À§ÇÑ °ÍÀÌ ¾Æ´Ï¶ó ±×¾ß¸»·Î ¸ÖƼ¹ÙÀÌÆ® »ç¿ëÀÚ¸¦ À§ÇÑ °ÍÀÌ´Ù. Áï, ±âÁ¸ÀÇ 7ºñÆ®¿¡¼­ Á¦´ë·Î Ç¥ÇöÇϱâ Èûµç µ¶ÀÏ¾î µîÀÇ 8ºñÆ® ¹®ÀÚ »ç¿ëÀÚ¿Í 2¹ÙÀÌÆ®ÀÇ µ¿¾ç±Ç ¹®ÀÚ »ç¿ëÀÚ¿Í 2¹ÙÀÌÆ® ÀÌ»óÀÇ UNICODEµµ Áö¿øÇÏ°í ÀÖ´Ù. ÀÌ ÆÐÄ¡¸¦ Àû¿ëÇÏ·Á¸é src/Makefile.custom ÆÄÀÏ¿¡ ¿¹ÀüÀÇ JP=1 ´ë½Å, MB=EUC_KRÀ̶ó´Â ÇÑ ÁÙÀ» Àû¾îÁÖ¸é µÈ´Ù. »ç¿ëÇÒ ¼ö ÀÖ´Â ÄÚµå´Â Ç¥¿Í °°´Ù.
     

    AIX

    Digital Unix (Alpha)

    FreeBSD

    FreeSCO

    HP-UX (PA-RISC)

    IRIX

    Linux (Alpha, m68k, x86)

    NetBSD (x86?)

    OpenStep/NextStep (x86)
                       [xscanimage/xcam Å×½ºÆ® ¾ÈµÊ]

    OS/2

    Solaris (SPARC)

    SunOS (SPARC)


    »ç¿ëÇÏ°íÀÚ ÇÏ´Â ÄÚµåÀÇ À̸§À» src/Makefile.custom¿¡ Àû¾îÁÖ¸é µÈ´Ù. À̵é ÆÐÄ¡¸¦ Àû¿ë½ÃÅ°¸é, Å×À̺í¸í°ú Å×ÀÌºí ³»ÀÇ Ä÷³¸í, Á¤±Ô Ç¥Çö½Ä °Ë»ö¿¡¼­ ÇѱÛÀ» »ç¿ëÇÒ ¼ö ÀÖ´Ù.

     

ECPG - C¿¡¼­ »ç¿ëÇÏ´Â ³»Àå SQL

    ECPG´Â PostgreSQLÀÇ Pro*CÀÌ´Ù. ¾Õ¼­ Àá½Ã ¾ð±ÞÇÑ PLÀº ÁÖ·Î SQL Ãø¸é¿¡¼­ ¹Ù¶óº» È®ÀåÀÌÁö¸¸ ECPG´Â C¾ð¾î¿¡¼­ ¹Ù¶óº» SQL È®ÀåÀÌ´Ù. Áï, ECPG´Â C¾ð¾î·Î µ¥ÀÌÅͺ£À̽º¸¦ ó¸®ÇÏ´Â µ¥ Æí¸®ÇÔÀ» ÁÖ±â À§Çؼ­ °³¹ßµÈ Àü󸮱âÀÌ´Ù. »ç½Ç ECPGÀÇ ÀåÁ¡Àº µ¥ÀÌÅͺ£À̽ºÀÇ °ªÀ» C º¯¼ö·Î ½±°Ô °¡Á®¿Ã ¼ö ÀÖ´Ù´Â °ÍÀÌ´Ù. LIBPQ¸¦ »ç¿ëÇÏ´Â ÀÀ¿ë ÇÁ·Î±×·¥¿¡¼­´Â µ¥ÀÌÅͺ£À̽ºÀÇ Æ¯Á¤ Å×À̺í, Ä®·³ÀÇ °ªÀ» ¾òÀ¸·Á¸é ¿©·¯ ¹ø ÀÛ¾÷À» ÇÏ¿©¾ß ÇÑ´Ù. ÀÌ·¯ÇÑ ¹Ýº¹ÀÛ¾÷°ú Áö·çÇÑ ÀÛ¾÷À» Á¦°ÅÇÏ¿© ´õ¿í ¼Õ½±°Ô µ¥ÀÌÅͺ£À̽º 󸮸¦ ÇÒ ¼ö ÀÖµµ·Ï µµ¿ÍÁÖ´Â µµ±¸°¡ ¹Ù·Î ECPGÀÌ´Ù. ECPG´Â ´Ù¸¥ RDBMSÀÇ ³»Àå SQL·Î ¾²¿©Áø ÇÁ·Î±×·¥À» PostgreSQL·Î Æ÷ÆÃÇÏ´Â µ¥¿¡µµ »ç¿ëÇÒ ¼ö ÀÖ´Ù.

     

ECPG - ³»Àå SQLÀÇ Àü󸮱â

    ECPG´Â Àü󸮱âÀÌ´Ù. ³»Àå SQL·Î ÀÛ¼ºÇÑ ¼Ò½º¸¦ ¼ø¼ö C ¼Ò½º·Î º¯È¯ÇÏ´Â ÀÏÀ» ÇÑ´Ù.
    SQLÀ» Ãæ½ÇÇÏ°Ô °øºÎÇغ» °æÇèÀÌ ÀÖ´Ù¸é, ´ÙÀ½°ú ºñ½ÁÇÑ Äڵ带 º» ±â¾ïÀÌ ÀÖÀ» °ÍÀÌ´Ù.

    EXEC SQL BEGIN DECLARE SECTION;
                 int i;
    EXEC SQL END DECLARE SECTION;

    EXEC SQL CREATE DATABASE testbase;
    EXEC SQL GRANT DBA TO mylove;

    EXEC SQL CREATE TABLE foo (
                 bar int
    );

    ¿©±â¿¡¼­ ¾Õ ºÎºÐÀÇ ¼±¾ð ¿µ¿ª¸¸ Á¦¿ÜÇÑ´Ù¸é ³ª¸ÓÁö EXEC SQL ´ÙÀ½Àº ¿ì¸®°¡ ÀÍÈ÷ º¸¾Æ¿Ô´ø SQL ÁúÀǹ®ÀåÀÌ´Ù. À̵é ÄÚµå´Â ECPG Àü󸮱⿡ ÀÇÇØ ¼ø¼ö C ¼Ò½º·Î º¯È¯µÈ´Ù. ¸¶Áö¸· ±¸¹®ÀÌ ¼ø¼ö C ¼Ò½º·Î ÃÖÁ¾ÀûÀ¸·Î º¯È¯µÈ´Ù¸é, ´ÙÀ½°ú ºñ½ÁÇÒ °ÍÀÌ´Ù.

    PQexec(conn, "CREATE TABLE foo ( bar int );");

    ¹°·Ð, EXEC SQL°ú °°Àº ³»Àå SQL ±¸¹®ÀÌ ECPG¸¦ °ÅÄ¡¸é ECPGdo¶ó´Â Áß°£ ¶óÀ̺귯¸® ÇÔ¼ö¸¦ °ÅÄ¡°Ô µÈ´Ù. PÇÔ¼ö´Â ÀÌ ECPG ¶óÀ̺귯¸® ·çƾ³»ºÎ¿¡¼­ È£ÃâµÈ´Ù. À§¿¡¼­¿Í °°Àº ³»Àå SQLÀº Á÷Á¢ C ÇÔ¼ö¸¦ ÀÛ¼ºÇÏ´Â °Íº¸´Ù ½±´Ù. ±×¸®°í ´õ¿í Á÷°üÀûÀ̾ ¾Ë¾Æº¸±âµµ ¸íÈ®ÇÏ´Ù. ¾Æ¿ï·¯ µ¥ÀÌÅͺ£À̽ºÀÇ °ªÀ» C º¯¼ö·Î ³Ñ±â´Â °ÍÀº ¾ÆÁÖ Æí¸®ÇÏ°Ô µðÀÚÀεǾî ÀÖ´Ù. ECPG´Â ±¸¹® ºÐ¼®±â·Î ³»Àå SQL ±¸¹®À» Àоîµé¿© Á¤ÇØÁø ±ÔÄ¢¿¡ µû¶ó C ¼Ò½º¸¦ ¸¸µé¾î ³»´Â ¿ªÇÒÀ» ÇÏ´Â °ÍÀÌ´Ù. ECPG¿¡¼­ ³»Àå SQL ±¸¹®À» ¾î¶»°Ô C ¼Ò½º·Î º¯È¯ÇÏ´ÂÁö Àá½Ã »ìÆ캸ÀÚ.

    ¸ÕÀú, exec sql begin declare section;°ú exec sql end declare section; »çÀÌ¿¡ ÀÖ´Â ¸ðµç ¼±¾ð ±¸¹®Àº ±×´ë·Î Ãâ·ÂµÈ´Ù. ÀÌ µÑ »çÀÌ¿¡ ÀÖ´Â º¯¼ö´Â ECPG ³»ºÎ¿¡¼­ À妽º ó¸®µÈ º¯¼ö ¸ñ·Ï¿¡ µé¾î°£´Ù. ±×¸®ÇÏ¿© ³»Àå SQL ±¸¹®¿¡¼­ ÀÌµé º¯¼ö°¡ »ç¿ëµÇ¾úÀ» ½Ã¿¡ ÀûÀýÇÑ Ã³¸®¸¦ ÇÏ°Ô µÇ´Â °ÍÀÌ´Ù. °¢°¢ ¹ø¿ªµÇ´Â ¿¹´Â ´ÙÀ½°ú °°´Ù.
     

    VARCHAR var[180];
                --> struct varchar_var { int len; char arr[180];
                      } var;
    exec sql include filename;
                --> #include <filename.h>

    exec sql connect 'database';
                --> ECPGconnect("database");
    exec sql open cursor;
                --> ¹«½Ã
    exec sql commit;
                --> ECPGcommit(_LINE_);
    exec sql rollback;
                --> ECPGrollback(_LINE_);

 

    VARCHAR´Â Ưº°ÇÑ ±¸Á¶Ã¼ ¹®ÀåÀ¸·Î ¹ø¿ªµÇ°í, include ¹®ÀåÀº CÀÇ #include ¹®ÀåÀ¸·Î º¯È¯µÈ´Ù. ±×¸®°í open cursor ¹®ÀåÀº ±×³É ¹«½ÃµÈ´Ù. ±× ¿ÜÀÇ ¸î °¡Áö ³»Àå SQL¹®Àº ÀûÀýÇÑ ECPG ÇÔ¼ö·Î º¯È¯µÈ´Ù. ÇÔ¼ö ³»¿¡¼­ _LINE_ ÀÎÀÚ´Â µð¹ö±ëÀ» À§ÇØ Àü´ÞµÇ´Â °ÍÀÏ »ÓÀÌ´Ù. Ãß°¡ÀûÀ¸·Î, exec sql include sqlca; ±¸¹®À» »ç¿ëÇÏ¿© sqlca.h Çì´õÆÄÀÏÀ» Æ÷ÇÔÇϸé, ´ÙÀ½°ú °°Àº ±¸Á¶Ã¼°¡ Æ÷ÇԵȴÙ.

    struct sqlca {
        int sqlcode;
        struct {
            int sqlerrml;
            char sqlerrmc[1000];
        } sqlerrm;
    } sqlca;

    ÀÌ ±¸Á¶Ã¼¿¡¼­ sqlca.sqlcode´Â ¿¡·¯ »óȲÀ» ¹Ý¿µÇÑ´Ù. ÁÖ¾îÁø ÁúÀÇ¿Í µ¥ÀÌÅͺ£À̽º Á¤ÀÇ°¡ ÀÏÄ¡ÇÏÁö ¾Ê´Â °Í°ú °°Àº Ä¡¸íÀûÀÎ ¿¡·¯°¡ ¹ß»ýÇÏ¿´À» °æ¿ì¿¡ sqlca.sqlcodeÀÇ °ªÀº À½¼öÀÌ´Ù. ±×·¸Áö ¾Ê°í, ´õ ÀÌ»ó ȸ¼öÇÒ µ¥ÀÌÅÍ°¡ ¾ø´Â °Í°ú °°Àº º¸ÅëÀÇ ¿¡·¯°¡ ¹ß»ýÇÏ¿´À» °æ¿ì¿¡ sqlca.sqlcodeÀÇ °ªÀº ¾ç¼öÀÌ´Ù. ÇÁ·Î±×·¡¸Ó°¡ ÀÀ¿ë ÇÁ·Î±×·¥À» © ¶§ ´ÙÀ½°ú °°Àº Äڵ带 »ç¿ëÇÏ°Ô µÉ °ÍÀÌ´Ù.

    exec sql whenever not found do set_not_found();
    exec sql whenever sqlerror sqlprint;

    ù ¹ø° ·çƾÀº ¸» ±×´ë·Î 'µ¥ÀÌÅ͸¦ ¹ß°ßÇÏÁö ¸øÇßÀ» °æ¿ì¿¡´Â set_not_found() ÇÔ¼ö¸¦ ½ÇÇàÇ϶ó'´Â °ÍÀÌ´Ù. 'µ¥ÀÌÅ͸¦ ¹ß°ßÇÏÁö ¸øÇßÀ» °æ¿ì'¶ó´Â °ÍÀº Æò¹üÇÑ ¿¡·¯¿¡ ¼ÓÇϹǷΠsqlca.sqlcode°¡ 0º¸´Ù Å« °æ¿ì(¾ç¼ö)ÀÏ ¶§ÀÌ´Ù. µÎ ¹ø° ·çƾÀº 'SQL¿¡¼­ ¿¡·¯°¡ ¹ß»ýÇÏ¿´À» °æ¿ì¿¡´Â ¿¡·¯ ¹®ÀåÀ» Ãâ·ÂÇ϶ó'´Â °ÍÀÌ´Ù. ¿©±â¼­ SQL ¿¡·¯´Â º¸Åë Ä¡¸íÀûÀÎ ¿¡·¯¸¦ ÀÏÄ´´Ù. µû¶ó¼­ sqlca.sqlcode°¡ 0º¸´Ù ÀÛÀº °æ¿ì(À½¼ö)ÀÏ ¶§ÀÌ´Ù. sqlca.sqlcode¸¦ °Ë»çÇÏ´Â ½ÃÁ¡Àº ¸Å¹øÀÇ »ç°ÇÀÌ ¹ß»ýÇÑ Á÷ÈÄÀÌ´Ù. µû¶ó¼­ À§ÀÇ µÎ ³»Àå SQL¹®Àº Ãâ·ÂµÇ´Â C ÄÚµå ³»¿¡¼­ ´ÙÀ½°ú °°Àº ¹®ÀåÀ¸·Î À̺¥Æ®°¡ ¹ß»ýÇÑ ÀÌÈĸ¶´Ù Ãß°¡µÈ´Ù. ¿©±â¿¡¼­ SQLCODE´Â ecpglib.h ÆÄÀÏ¿¡ sqlca.sqlcode·Î Á¤ÀǵǾî ÀÖ´Ù.

    if (SQLCODE > 0) set_not_found();
    if (SQLCODE < 0) sqlprint();

    ³»Àå SQLÀ» C ¼Ò½º·Î º¯È¯ÇÏ¿´´Ù¸é, ÀÌÁ¦ C ¼Ò½º¸¦ ½ÇÇà °¡´ÉÇÑ ¹ÙÀ̳ʸ®·Î ÄÄÆÄÀÏÇØ¾ß ÇÒ Â÷·ÊÀÌ´Ù. C ¼Ò½º¸¦ ÄÄÆÄÀÏÇÏ´Â µ¥¿¡´Â ECPG ¶óÀ̺귯¸®°¡ ÇÊ¿äÇÏ´Ù. libecpg.a, libecpg.so°¡ ±×°ÍÀÌ´Ù. ±×¸®°í ECPG ¶óÀ̺귯¸®´Â libpq¸¦ »ç¿ëÇÑ´Ù. µû¶ó¼­ ¼ø¼ö C ¼Ò½º¸¦ ÄÄÆÄÀÏÇÒ ¶§¿¡´Â ECPG ¶óÀ̺귯¸®¿Í libpq¸¦ ¼ø¼­´ë·Î -lecg -lpq¿Í °°ÀÌ ¸µÅ©½ÃÄÑ¾ß ÇÑ´Ù. ECPG ¶óÀ̺귯¸®´Â Á¤»óÀûÀ¸·Î ¼³Ä¡ÇÏ¿´´Ù¸é /usr/local/pgsql/lib¿¡ ÀÖÀ» °ÍÀÌ´Ù. ÀÌ ¶óÀ̺귯¸® ·çƾ¿¡´Â µÎ °³ÀÇ ¼û°ÜÁø ÇÔ¼ö°¡ ÀÖ´Ù.

    ECPGdebug (int, FILE *stream)

    int°¡ 0ÀÌ ¾Æ´Ï¸é µð¹ö±ëÀÌ ¼öÇàµÈ´Ù. ½ÇÁ¦·Î µð¹ö±ë Á¤º¸¸¦ ¼ö·ÏÇÏ´Â ÇÔ¼ö´Â ECPGdoÀÌ´Ù. ÀÌ ÇÔ¼ö´Â EXEC SQL COMMIT, EXEC SQL ROLLBACK, EXEC SQL CONNECT ÀÌ¿ÜÀÇ ¸ðµç SQL ±¸¹®¿¡¼­ È£ÃâµÈ´Ù. È£ÃâµÈ ECPGdo ÇÔ¼ö´Â È®ÀåµÈ SQL ¹®ÀÚ¿­°ú ÀÔ·Â º¯¼ö°ªÀÌ »ðÀÔµÈ ¹®ÀÚ¿­À» ±â·ÏÇϱ⠶§¹®¿¡, SQL ±¸¹®¿¡¼­ ¿¡·¯¸¦ °Ë»çÇϴµ¥ ¸Å¿ì À¯¿ëÇÏ´Ù. LIBPQ°¡ Á¦°øÇÏ´Â PQtrace ·çƾº¸´Ù´Â ÈξÀ ¸íÈ®ÇÏ°í ½ÇÁ¦ »ç¿ëÇÒ ¶§¿¡ ¸¹Àº µµ¿òÀÌ µÉ °ÍÀÌ´Ù.

    ECPGstatus()

    ÇöÀç µ¥ÀÌÅͺ£À̽º¿¡ Á¢¼ÓµÇ¾î ÀÖÀ¸¸é TRUE¸¦ µ¹·ÁÁÖ°í, ¾Æ´Ï¸é FALSE¸¦ µ¹·ÁÁØ´Ù.

    testecpg.pgc
     

    /* testecpg.pgc - Embedded SQL ECPGÀÇ Å×½ºÆ®
    ÀÛ¼º: PostgreSQL ¹èÆ÷º»¿¡ µé¾îÀÖ´Â testlibpq.c¸¦ ECPG¸¦           »ç¿ëÇÏ¿© Àç ÀÛ¼ºÇÔ.
    ³»¿ë: template 1 µ¥ÀÌÅͺ£À̽º¿¡ Á¢¼ÓÇÏ¿© pg_database           ½Ã½ºÅÛ Ä«Å»·Î±×ÀÇ ³»¿ëÀ» Ãâ·ÂÇÔ.
    ³¯Â¥: 1998³â 3¿ù 10ÀÏ
    ÀÛ¼ºÀÚ: Çѵ¿ÈÆ
          ddoch@hitel.kol.co.kr
    */
    #include <stdio.h>
    exec sql include sqlca;
    extern void ECPGdebug (int n, FILE *debug);
    exec sql whenever not found do set_not_found();
    exec sql whenever sqlerror sqlprint;
    static int not_found = 0;

    static void set_not_found() {
     not_found = 1;
    }

    int main() {
     exec sql begin declare section;
       struct ca_pg_database_struct {
         char datname[32];
         int datdba;
         char datpath[32];
       } ca_pg_database;
     exec sql end declare section;

     FILE *debug;

     if ((debug = fopen("/tmp/trace.out", "w")) != NULL)       ECPGdebug(1, debug);

     exec sql connect 'template1';

     exec sql declare myportal cursor for
             select *from pg_database;

     exec sql open myportal;

     printf("%-20s%-20s%-20s¡¬n¡¬n",
        "µ¥ÀÌÅͺ£À̽º À̸§", "µ¥ÀÌÅͺ£À̽º °ü¸®ÀÚ",
            "µ¥ÀÌÅͺ£À̽º °æ·Î");

     while (!not_found) {
       exec sql fetch myportal into : ca_pg_database;
       if (!not_found) {
        printf ("%-20s%-20d%-20s¡¬n",
          ca_pg_database.datname, ca_pg_database.datdba,
           ca_pg_database.datpath);
     }

    exec sql close myportal;
    exec sql commit;

    if (debug != NULL)
      fclose(debug);
    return 0;
    }

 

ECPGÀÇ ¼³Ä¡¿Í ±âº» »ç¿ë¹ý

    ECPG¸¦ ¼³Ä¡ÇÏ´Â ¹æ¹ýÀº ¾ÆÁÖ °£´ÜÇÏ´Ù. PostgreSQL 6.3 ¾È¿¡ ÀÖ´Â ECPG¸¦ ¼³Ä¡Çغ¸ÀÚ. ¸¸ÀÏ PostgreSQLÀÌ 6.3 ¹öÀü ¹Ì¸¸À̶ó¸é ECPGÀÇ ¿¹ÀüÀÇ 0.2 ¹öÀüÀ» ±¸Çؼ­ Å×½ºÆ® Çغ¼ ¼ö ÀÖ±ä ÇÏÁö¸¸ ±ÇÇÏ´Â ¹Ù´Â ¾Æ´Ï´Ù. PostgreSQL 6.3 ¹öÀü¿¡ Æ÷ÇÔµÈ ECPG´Â 1.0Àε¥, ÀÌ ¹öÀüÀº ¿¹ÀüÀÇ 0.x ¹öÀüº¸´Ù´Â »ó´çÈ÷ ´Ùµë¾îÁ®¼­ ºñ·Î¼Ò ¾µ ¸¸ÇÏ°Ô µÇ¾ú´Ù°í º¸±â ¶§¹®ÀÌ´Ù. ECPG´Â LIBPQ¸¦ »ç¿ëÇÔÀ¸·Î ÀÎÇØ PostgreSQLÀÇ ¹öÀü°ú ¼­·Î ¸Â¾Æ¾ß ÇÑ´Ù. µû¶ó¼­ ¿©±â¼­´Â PostgreSQL 6.3°ú ÇÔ²² ECPG¸¦ ¼³Ä¡ÇÏ´Â °ÍÀ¸·Î °£ÁÖÇÑ´Ù. PostgreSQL 6.3Àº ÀÌ¹Ì ¼³Ä¡ÇÏ¿´´Ù°í °¡Á¤ÇÑ´Ù. postgres °èÁ¤À¸·Î µé¾î°¡¼­ ecpg µð·ºÅ丮·Î À̵¿Çؼ­ make installÀ» ÇÑ´Ù.

    $ cd postgresql-6.3/src/interfaces/ecpg
    $ make install

    ecpg ÇÁ·Î±×·¥µéÀº /usr/local/pgsql/À» ±âÁØÀ¸·Î, ¹ÙÀ̳ʸ®´Â bin/¿¡, ¶óÀ̺귯¸®´Â lib/¿¡, Çì´õ ÆÄÀÏÀº include/¿¡ ¼³Ä¡µÉ °ÍÀÌ´Ù. ecpg¿¡ °øÀ¯ ¶óÀ̺귯¸®°¡ Æ÷ÇԵǾî ÀÖÀ¸¹Ç·Î, ¸¶Áö¸·À¸·Î root·Î µé¾î°¡¼­ ldconfig¸¦ ¼öÇàÇÏ´Â °ÍÀ» ÀØÁö ¸»ÀÚ.

    # ldconfig

    ÀÌÁ¦ ecpg¸¦ ½ÇÇà½ÃÄÑ º¸¸é ´ÙÀ½°ú °°Àº ¸Þ½ÃÁö°¡ ¶ã °ÍÀÌ´Ù.

    $ ecpg
    ecpg - the postgresql preprocessor, version: 1.0.0
    Usage: ecpg: [-v] [-d] [-o outout file name]
               file1 [file2]

    -v ¿É¼ÇÀº ¹öÀü Á¤º¸¸¦ º¸¿©ÁÖ´Â °ÍÀÌ°í, -d ¿É¼ÇÀº Àü󸮽ÿ¡ µð¹ö±ë Á¤º¸¸¦ º¸¿©ÁØ´Ù. -o ¿É¼ÇÀº Àü󸮵Ǿ Ãâ·ÂµÉ ÆÄÀÏÀÇ À̸§À» ÁöÁ¤ÇØÁÖ´Â °ÍÀÌ°í, µÚÀÇ file1...Àº Àüó¸®ÇÒ ³»Àå SQL ¼Ò½º¸¦ ÁöÁ¤ÇÏ´Â °ÍÀÌ´Ù.

     

ECPG·Î ÀÛ¼ºÇÏ´Â ¿¹Á¦ ÇÁ·Î±×·¥

    ÀÌÁ¦, ECPG·Î °£´ÜÇÑ ¿¹Á¦ ÇÁ·Î±×·¥À» ÀÛ¼ºÇغ¸ÀÚ. Áö³­ 2¿ùÈ£¿¡¼­ LIBPQ¸¦ ¼³¸íÇÒ ¶§ Àá½Ã »ìÆ캻 ÀûÀÌ ÀÖ´Â testlibpq.c¸¦ ECPG¸¦ »ç¿ëÇؼ­ µ¿ÀÏÇÏ°Ô º¯È¯ÇØ º¸µµ·Ï ÇÏÀÚ. testlibpq.c´Â stc/test/examples/¿¡ ÀÖ´Ù. »õ·Ó°Ô ÀçÀÛ¼ºÇÏ´Â ÇÁ·Î±×·¥Àº testecpg.pgc¶ó°í ÇÏ°Ú´Ù.
    ÀÌ ÇÁ·Î±×·¥ÀÇ ÄÄÆÄÀÏÀº ´ÙÀ½°ú °°ÀÌ ÇÑ´Ù.

     

Àüó¸® ´Ü°è

    $ ecpg -o testecpg.c testecpg.pgc

ÄÄÆÄÀÏ ´Ü°è

    $ gcc -o testecpg testecpg.c -I/usr/local/pgsql/include -L/usr/local/pgsql/lib -lecpg -lpq

    ÀÏÀÏÀÌ ÀÌ·¸°Ô ±ä ¸í·ÉÀ» ÀÔ·ÂÇÏ´Â °ÍÀº ¹ø°Å·Î¿ï °ÍÀÌ´Ù. °£´ÜÇÏ°Ô ´ÙÀ½°ú °°Àº ½ºÅ©¸³Æ®¸¦ »ç¿ëÇÏ¿© Æí¸®ÇÏ°Ô ÄÄÆÄÀÏÇϵµ·Ï ÇÏÀÚ.
     

    #!/bin/sh
    # name : ec
    CC=gcc
    CFLAGS="-lecpg -lpq -L/usr/local/pgsql/lib -I/usr/local/pgsql/include"
    ECPG_OPTIONS=
    if [ $# -le 0 ]; then
      echo "usage: $0 <ecpg source>"
      exit
    fi
    PREFIX=${1%.*}
    ecpg $ECPG_OPTIONS -o ${PREFIX}.c $1
    $cc -o $PREFIX ${PREFIX}.c $CFLAGS

 

    À§ÀÇ ÆÄÀÏÀ» ec·Î ¸¸µé°í, chmod ¸í·ÉÀ¸·Î ½ÇÇà°¡´ÉÇÏ°Ô ¸¸µé¾î ³õÀÚ.

    $ chmod +x ec

    ecpg ¼Ò½º¸¦ Àüó¸®ÇÏ°í ÄÄÆÄÀÏÇϱâ À§Çؼ­´Â ±×³É ec filenameÀ¸·Î »ç¿ëÇÏ¸é µÈ´Ù.

    $ ./ec testecpg.pgc

    Á¤»óÀûÀ¸·Î 󸮵Ǹé, Àüó¸®µÈ ¼Ò½º´Â testecpg.c·Î ¸¸µé¾îÁú °ÍÀÌ°í, ½ÇÇà°¡´ÉÇÑ ¹ÙÀ̳ʸ®´Â testecpg·Î ¸¸µé¾îÁú °ÍÀÌ´Ù. ÄÄÆÄÀÏµÈ testecpg¸¦ ½ÇÇàÇÑ °á°ú´Â ´ÙÀ½°ú °°´Ù.

    µð¹ö±ë Á¤º¸¸¦ ´ãÀº ÆÄÀÏÀÇ ³»¿ëÀº ´ÙÀ½°ú °°´Ù.

     

ECPG´Â ¾îµð±îÁö ¿ÍÀִ°¡?

    ECPGÀÇ ÇÑ°è¿Í ´ÜÁ¡Àº ¹«¾ùÀΰ¡? Á¶±Ý µ¢Ä¡°¡ Å« ÀÀ¿ë ÇÁ·Î±×·¥À» ECPG·Î ÀÛ¼ºÇÏ´Ùº¸¸é ´À³¢°ÚÁö¸¸ ¸î °¡Áö ´ÜÁ¡ÀÌ Á¸ÀçÇÑ´Ù. ECPG Àü󸮱â´Â SQL ±¸¹®ÀÇ ¹®¹ýÀ» °Ë»çÇÏÁö ¸øÇÑ´Ù. ±×¸®°í ¿¡·¯Äڵ尡 ´Ü¼øÇؼ­ Á» ´õ ÀÚ¼¼ÇÑ ¿¡·¯°Ë»ç¸¦ ÇϱⰡ Èûµé¸ç, ³Î(null)°ú ºó ¹®ÀÚ¿­(empty)¸¦ ±¸ºÐÇÏÁö ¸øÇÑ´Ù. º¯¼ö¸¦ ÁÖ°í ¹Þ´Â °úÁ¤¿¡¼­ Æí¸®ÇÏ´Ù°í´Â ÇÏÁö¸¸ »ý°¢¸¸Å­ µÇÁö ¾ÊÀ» ¶§°¡ ÀÖ´Ù. query¶ó´Â C º¯¼ö¿¡ "select *from pg_database"¶ó´Â ¹®ÀÚ¿­ÀÌ Æ÷ÇԵǾî ÀÖ´Ù°í °¡Á¤ÇÏÀÚ.

    exec sql :query;

    ÀÌ ³»Àå SQLÀÌ ´ÙÀ½°ú °°ÀÌ È®ÀåµÇ±â¸¦ ±â´ëÇÑ´Ù¸é ¿¡·¯°¡ ¹ß»ýÇÑ´Ù.

    exec sql select *from pg_database;

    ÀÌ°Ô ECPG ¹®Á¦ÀÎÁö, ¾Æ´Ï¸é Ç¥ÁØ Embedded SQLÀÇ ¹®Á¦ÀÎÁö, ¶Ç´Â ÇÊÀÚÀÇ Èñ¸Á»çÇ×ÀÎÁö´Â ¾ËÁö ¸øÇÑ´Ù. ±×¸®°í ƯÁ¤ Å×À̺íÀÇ Ä÷³¼ö¸¦ ¾ò±â¿¡µµ Æí¸®ÇÏÁö ¾Ê´Ù. ÇØ´ç Å×ÀÌºí¿¡ ´ëÇØ ¹Ì¸® ¾Ë°í º¯¼ö¸¦ ÁغñÇÏ°í ÀÖ¾î¾ß ÀÛ¾÷À» ÇÒ ¼ö ÀÖ´Ù.
    PostgreSQL 6.3¿¡¼­ Áö¿øÇÏ´Â Embedded SQLÀÌ ÇÊÀÚ°¡ º¸±â¿¡´Â ¾î´À Á¤µµ ¾µ¸ð°¡ ÀÖ´Ù°í º»´Ù. ±× ÀÌÀ¯´Â ¿¹ÀüÀÇ ECPG 0.x ¹öÀüº¸´Ù´Â »ó´çÈ÷ Çâ»óµÇ¾ú°í, ÇÁ·Î±×·¡¸Ó¿¡°Ô Æí¸®ÇÔÀ» ÁÖ°í Àֱ⠶§¹®ÀÌ´Ù. µ¥ÀÌÅͺ£À̽º ÇÁ·Î±×·¡¹ÖÀ» À߸¸ ±âȹÇÑ´Ù¸é ECPG·Î libpq¸¦ »ç¿ëÇÑ ¼Ò½ºº¸´Ù Àý¹Ý Á¤µµÀÇ ºÐ·®À¸·Î ÇѲ¯ Æí¸®ÇÏ°Ô ÀÛ¾÷À» ÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.
    PostgreSQLµµ 6.3 ¹öÀüÀ» ¸Â¾Æ °è¼Ó ¹ßÀüÇÏ°í ÀÖ´Â °Í °°´Ù. ¾ðÁ¦ Çѹø ȯ°æÀÌ °®Ãß¾îÁö¸é PostgreSQL°ú Àü¼¼°èÀûÀ¸·Î À¯¸íÇÑ »ó¿ë RDBMS¿ÍÀÇ º¥Ä¡¸¶Å©¸¦ Çغ¸´Â °Íµµ À¯ÀÍÇÒ °Í °°´Ù. PostgreSQL 6.3°ú ÇÔ²² Àç¹ÌÀÖ´Â ¸®´ª½º ¿©ÇàÀÌ µÇ±æ ¹Ù¶õ´Ù.




¡ã top

homeÀ¸·Î...