ÃÑ ÆäÀÌÁö ¼ö : 3224
![]()
|
Facebook Joinc ±×·ì
Joinc QA »çÀÌÆ®
![]()
Tweet
joinc´Â Firefox¿Í chrome¿¡¼ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù. 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
ÀÚ ÀÌÁ¦ºÎÅÍ ANSI Dynamic SQL¿¡ ´ëÇØ¼ °øºÎÇØ º¸°Ú´Ù. ANSI Dynamic SQLÀÇ ÄÚµù ¼ø¼¿Í °¢ ¼ø¼¿¡ ÀÖ¾î¼ »ç¿ëÇÏ´Â ANSI SQL ±¸¹®À» »ìÆìº¸µµ·Ï ÇÏÀÚ.
¸ÕÀú »ç¿ëÇÒ SQL¹®ÀåÀ» ¾Æ·¡¿Í °°´Ù°í °¡Á¤ÇÏÀÚ. select * from emp where empno = :p_empno;
¸î°¡Áö ¾Ë¼ö ¾ø´Â ºÎºÐÀÌ º¸ÀδÙ. ¾î¶»°Ô ÇØ¾ß ÇÒ±î ¸·¸·Çϱ⸸ ÇÏ´Ù. Çϳª¾¿ »ìÆìº¸ÀÚ.
[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À¸·ÎºÎÅÍ ¾òÀ» ¼ö ÀÖ´Â °ÍµéÀº ¹«¾ùÀÌ ÀÖ´ÂÁö ¾Ë¾Æº¸ÀÚ.
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¿¡ µé¾î°¡´Â °ÍµéÀº ¹«¾ùÀÌ ÀÖ´ÂÁö ¾Ë¾Æº¸ÀÚ.
exec sql set descriptor local 'in' value :value type = :type, length = :length, data = :data;ÀÌÁ¤µµ·Î ÇÏ¸é µÇ°Ú´Ù. valueµÚ¿¡ :value¿¡ Bind º¯¼öÀÇ À§Ä¡°¡ µé¾î°¡°í ÇØ´ç º¯¼öÀÇ µ¥ÀÌÅÍ¿Í µ¥ÀÌÅÍ Å¸ÀÔ, ±æÀ̸¦ ÁöÁ¤ÇØ ÁÖ´Â ¹®ÀåÀÇ ¿¹ÀÌ´Ù. 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¸¦ ÀÌ¿ëÇÏ¿© Ä¿¼¸¦ ¿©´Â ¹®ÀåÀÌ´Ù. ¾Õ¿¡¼ ´ëºÎºÐÀÇ ¿ë¾î¿¡ ´ëÇÑ ¼³¸íÀÌ ÀÖ¾úÀ¸´Ï Ưº°È÷ ¾î·Á¿î °ÍÀÌ ¾øÀ¸¸®¶ó »ý°¢ÇÑ´Ù.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)°ú µ¿ÀÏÇÏ´Ù.
ÀÌÁ¦ 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À» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù. |
|