4.EmbeddedSQL_PL_SQL here
ÃÑ ÆäÀÌÁö ¼ö : 3224

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



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

Contents

1 Embedded SQL & PL/SQL
1.1 SQLÀÇ »ç¿ë
1.2 µ¥ÀÌÅͺ£À̽º¿¡ Á¢¼Ó
1.3 SELECT ±¸¹®
1.4 DML ±¸¹®
1.5 Cursor »ç¿ë
1.6 Transaction Control
1.7 ¿¡·¯Ã³¸®

1 Embedded SQL & PL/SQL

1.1 SQLÀÇ »ç¿ë

¾Õ¿¡¼­µµ ¸»ÇÑ¹Ù¿Í °°ÀÌ Pro*C/C++ À» »ç¿ëÇÏ´Â ÀÌÀ¯´Â C/C++ ÇÁ·Î±×·¥¿¡¼­ SQL ¹®ÀåÀ» »ç¿ëÇϱâ À§Çؼ­ÀÌ´Ù. ½ÇÇà °¡´ÉÇÑ SQL ¹®ÀåÀ» »ðÀÔÇÏ¿© DB¿¡ Á¢±ÙÇϰí, Á¶ÀÛÇϰí, °ü¸® ÇÒ ¼ö ÀÖ´Ù. »ç¿ë°¡´ÉÇÑ ¹®Àåµé¿¡´Â ¾î¶²°ÍµéÀÌ ÀÖ´ÂÁö »ìÆìº¸ÀÚ.

  • »ç¿ëÇÒ ¼ö ÀÖ´Â SQL ¹®Àå
SQL Description
DML Delete, Insert, Select, Update, Explain Plan, Lock Table
DDL Alter, Analyze, Audit, Comment, Create, Drop, Grant, NoAudit, Rename, Revoke, Truncate
Session Control Alter Session, Set Role
Transaction Control Commit, Rollback, Savepoint, Set Transaction
System Control Alter System
PL/SQL Block PL/SQL ¹®Àåµé

1.2 µ¥ÀÌÅͺ£À̽º¿¡ Á¢¼Ó

¸ÕÀú µ¥ÀÌÅͺ£À̽º¿¡ ¾î¶² Á¶ÀÛÀ» ÇÏ·Á¸é Á¢¼ÓÀ» ÇØ¾ß¸¸ ÇÑ´Ù. Á¢¼ÓÀ» Çϱâ À§Çؼ± µ¥ÀÌÅͺ£À̽º¿¡ °èÁ¤À» °¡Áö°í ÀÖ¾î¾ß ÇÑ´Ù. ¿ì¸®´Â ¿À¶óŬ¿¡¼­ Å×½ºÆ®¿ëÀ¸·Î Á¦°øÇÏ´Â SCOTTÀ̶ó´Â °èÁ¤À» »ç¿ëÇÑ´Ù. ¸ÕÀú À¯ÀÇ ÇØ¾ßÇÒ »çÇ×Àº »ç¿ëÀÚ °èÁ¤°ú ÆÐ½º¿öµå¿ª½Ã SQL ¹®Àå¿¡¼­ »ç¿ëµÉ °ÍÀ̹ǷΠÀ̰ÍÀ» ÀúÀåÇÒ º¯¼ö ¿ª½Ã È£½ºÆ® º¯¼ö·Î ¼±¾ðÇØ¾ß ÇÑ´Ù´Â °ÍÀÌ´Ù. À§¿¡¼­ º¸¾ÒµíÀÌ È£½ºÆ® ÇÁ·Î±×·¥¿¡ SQL ¹®ÀåÀ» »ðÀÔÇϱâ À§Çؼ­´Â ¹Ýµå½Ã EXEC SQLÀ» ºÙ¿©ÁÖ¾î¾ß¸¸ ÇÑ´Ù.

¾Æ·¡¿¡ ¿¹Á¦¸¦ º¸ÀÚ.
EXEC SQL BEGIN DECLARE SECTION; 
    varchar username [20]; 
    varchar password [20]; 
    varchar dbname [20]; 
EXEC SQL END DECLARE SECTION; 
¡¦ ¡¦ ¡¦ 
 
    strcpy (username.arr, ¡°SCOTT¡±); 
    strcpy (password.arr, ¡°TIGER¡±); 
    strcpy (dbname.arr,   ¡°ORCL¡± ); 
    username.len = strlen (¡°SCOTT¡±); 
    password.len = strlen (¡°TIGER¡±); 
    dbname.len   = strlen (¡°ORCL¡± ); 
 
¡¦ ¡¦ ¡¦ 
     
    EXEC SQL CONNECT :username IDENTIFIED BY :password USING :dbname; 
 

»ç¿ëÀÚÀÇ À̸§Àº SCOTTÀÌ°í ÆÐ½º¿öµå´Â TIGERÀÌ´Ù. ±×¸®°í varcharÇü½ÄÀÇ º¯¼ö¸¦ ¼±¾ðÇßÀ¸¹Ç·Î arr¿¡ ¹®ÀÚ¿­À» ³Ö¾îÁÖ°í len¿¡ ±× ±æÀ̸¦ ³Ö¾îÁØ´Ù. ÁÖÀÇÇÏ¿© º¼ ¸¸ÇÑ »çÇ×À¸·Î USING :dbname ºÎºÐÀÌ ÀÖ´Ù. À̰ÍÀº ¿ø°Ý µ¥ÀÌÅͺ£À̽º¿¡ Á¢¼ÓÇÒ ¶§ »ç¿ëÇÏ´Â °ÍÀ¸·Î ¹Ýµå½Ã ÇÊ¿äÇÑ ±¸¹®Àº ¾Æ´Ï´Ù. dbname º¯¼ö¿¡ µé¾î°¡´Â °ÍÀº ¿ø°Ý µ¥ÀÌÅͺ£À̽º¸¦ ÁöÁ¤ÇÏ´Â Ä¿³ØÆ® ½ºÆ®¸µÀ» ÀúÀåÇÑ´Ù. Ä¿³ØÆ® ½ºÆ®¸µÀº tnsnames.ora ÆÄÀÏ¿¡ µé¾îÀÖÀ¸¸ç ¿©±â¿¡ ¸ÕÀú ¼±¾ðÀÌ µÇ¾î ÀÖ¾î¾ß¸¸ »ç¿ë ÇÒ ¼ö ÀÖ´Ù. ¸¸¾à¿¡ ·ÎÄà µ¥ÀÌÅͺ£À̽º¿¡ Á¢¼ÓÇÑ´Ù¸é Using :dbname ±¸¹®Àº ÇÊ¿ä ¾ø´Ù.

1.3 SELECT ±¸¹®

µ¥ÀÌÅͺ£À̽º¿¡¼­ µ¥ÀÌÅ͸¦ ¾ò¾î ¿Ã ¶§ ¾²ÀÌ´Â ¹®ÀåÀÌ´Ù. ¾Æ·¡ ¿¹Á¦¸¦ º¸ÀÚ.

/* È£½ºÆ® º¯¼öÀÇ ¼±¾ð ½ÃÀÛ */ 
EXEC SQL BEGIN DECLARE SECTION; 
    int empno;              /* emp Å×À̺íÀÇ empno¸¦ ¹ÞÀ» º¯¼ö */ 
    char ename[10];         /* emp Å×À̺íÀÇ enameÀ» ¹ÞÀ» º¯¼ö */ 
    char jog[10];        /* emp Å×À̺íÀÇ job  À» ¹ÞÀ» º¯¼ö */ 
    float sal;              /* emp Å×À̺íÀÇ sal  À» ¹ÞÀ» º¯¼ö */ 
    float comm;             /* emp Å×À̺íÀÇ comm À» ¹ÞÀ» º¯¼ö */ 
EXEC SQL EBD DECLARE SECTION; 
/* È£½ºÆ® º¯¼öÀÇ ¼±¾ð Á¾·á */ 
 
¡¦ ¡¦ ¡¦ 
 
/* 
 * empno¸¦ ¾ò¾î¿Í¼­ ÇØ´çÇÏ´Â »ç¶÷ÀÇ À̸§°ú ±Þ¿©, »ó¿©¸¦ ¹Þ¾Æ¿Â´Ù. 
 */ 
empno = atoi (gets ()); 
EXEC SQL 
SELECT ename, job, sal, comm 
INTO :ename, :job, :sal, :comm 
    FROM emp 
    WHERW empno = :empno; 
 
/* 
 * ¾ò¾î¿Â ±Þ¿©¿Í »ó¿©¸¦ ¼öÁ¤ÇÏ¿© ´Ù½Ã ¾÷µ¥ÀÌÆ® ÇÑ´Ù. 
 */ 
sal  = sal  + 3000; 
comm = comm + 1000; 
EXEC SQL 
    UPDATE emp 
    SET sal = :sal, comm = :comm. 
    WHERE empno = :empno; 
 
¡¦ ¡¦ ¡¦
À§ÀÇ ¹®ÀåÀº »ç¿øÁ¤º¸Å×ÀÌºí¿¡¼­ »ç¿ø¹øÈ£°¡ 7788ÀÎ »ç¶÷ÀÇ À̸§, Á÷Ã¥, ±Þ¿©, »ó¿©¸¦ ¾ò¾î¿À´Â ¹®ÀåÀÌ´Ù. ¾Õ¿¡¼­ º» ¹Ù¿Í °°ÀÌ SQL¹®ÀåÀ» »ç¿ëÇϱâ À§Çؼ­ EXEC SQL ÀýÀ» ºÙ¿©ÁÖ¾î¾ß ÇÑ´Ù. µ¥ÀÌÅͺ£À̽º¿¡¼­ ÆÐÄ¡µÈ Ä®·³ÀÇ ³»¿ëÀÌ ename, job, sal, commÀ̶ó´Â È£½ºÆ® º¯¼ö ¾È¿¡ µé¾î°¡µµ·Ï µÇ¾îÀÖ´Ù. À̶§ WHERE Àý¿¡¼­ »ç¿ëµÈ »ç¿ø¹øÈ£ °ªµµ È£½ºÆ® º¯¼ö¸¦ ÀÌ¿ëÇÏ¿© Á¶°ÇÀýÀ» ³Ñ±ä °ÍÀÌ´Ù.

ÇÏÁö¸¸ Àß µ¿ÀÛÇÒ °Í ó·³ º¸ÀÌ´Â À§ÀÇ ÇÁ·Î±×·¥µµ °¡¸¸È÷ »ìÆìº¸¸é ÇѰ¡Áö ¹®Á¦Á¡ÀÌ ÀÖ´Ù. ¹«¾ùÀϱî? ±×°ÍÀº SELECT ÇÒ¶§ commÀ» ¹Þ¾Æ¿À´Â ºÎºÐÀÌ´Ù. ½ÇÁ¦·Î µ¥ÀÌÅͺ£À̽º¿¡ Å×À̺íÀ» º¸¸é comm Ä®·³¿¡´Â NULL °ªÀÌ µé¾îÀÖ´Ù.(C ¾ð¾î¿Í ´Þ¸® µ¥ÀÌÅͺ£À̽º¿¡¼­ÀÇ NULLÀº Ä®·³¾È¿¡ °ªÀÌ ¾Æ¿¹ ¾ø´Ù´Â °ÍÀÌ´Ù.) NULLÀÌ µé¾îÀÖ´Â Ä®·³ÀÇ °ªÀ» °¡Á®¿Í¼­ ¼öÄ¡¿¬»êÀ» ÇÑ´Ù´Â °ÍÀº ¹®Á¦´Ù. È£½ºÆ® º¯¼ö¸¦ »ç¿ëÇÏ¿© µ¥ÀÌÅͺ£À̽º¿Í Åë½ÅÇÒ ¶§ ¹®¹ý»óÀ¸·Î´Â ÀüÇô ÀÌ»óÀÌ ¾øÁö¸¸ È£½ºÆ® º¯¼ö ¾È¿¡ µµ´ëü ¾î¶² °ªÀÌ µé¾î°¥Áö ¾Ë ¼ö ¾ø´Â °ÍÀÌ´Ù. À̶§ »ç¿ëÇØ¾ß ÇÏ´Â °ÍÀÌ INDICATOR º¯¼öÀÌ´Ù. À̰ÍÀ» ÅëÇÏ¿© µ¥ÀÌÅͺ£À̽º¿Í Åë½ÅÇÒ ¶§ È£½ºÆ® º¯¼ö¿Í µ¥ÀÌÅͺ£À̽º°£¿¡ °ªÀÇ Àü´Þ »óȲÀ» Á»´õ Á¤È®È÷ ¾Ë ¼ö ÀÖ´Â °ÍÀÌ´Ù.

¾Æ·¡ INDICATOR º¯¼öÀÇ »ç¿ë ¿¹Á¦°¡ ÀÖ´Ù.

EXEC SQL BEGIN DECLARE SECTION; /* È£½ºÆ® º¯¼öÀÇ ¼±¾ð ½ÃÀÛ */ 
    int empno;              /* emp Å×À̺íÀÇ empno¸¦ ¹ÞÀ» º¯¼ö */ 
    char ename[10];         /* emp Å×À̺íÀÇ enameÀ» ¹ÞÀ» º¯¼ö */ 
    char job[10];        /* emp Å×À̺íÀÇ job  À» ¹ÞÀ» º¯¼ö */ 
    float sal;              /* emp Å×À̺íÀÇ sal  À» ¹ÞÀ» º¯¼ö */ 
    float comm;             /* emp Å×À̺íÀÇ comm À» ¹ÞÀ» º¯¼ö */ 
    short ind_empno;    /* empnoº¯¼öÀÇ INDICATOR */ 
    short ind_ename;    /* enameº¯¼öÀÇ INDICATOR */ 
    short ind_job;        /* job  º¯¼öÀÇ INDICATOR */ 
    short ind_sal;        /* sal  º¯¼öÀÇ INDICATOR */ 
    short ind_comm;        /* comm º¯¼öÀÇ INDICATOR */ 
EXEC SQL END DECLARE SECTION;   /* È£½ºÆ® º¯¼öÀÇ ¼±¾ð Á¾·á */ 
 
¡¦ ¡¦ ¡¦ 
 
/* 
 * empno¸¦ ¾ò¾î¿Í¼­ ÇØ´çÇÏ´Â »ç¶÷ÀÇ À̸§°ú ±Þ¿©, »ó¿©¸¦ ¹Þ¾Æ¿Â´Ù. 
 */ 
empno = atoi (gets ()); 
EXEC SQL 
SELECT ename, job, sal, comm 
INTO :ename:ind_ename, :job:ind_job, :sal:ind_sal, :comm:ind_comm 
FROM emp 
WHERE empno = :empno; 
 
/* 
 * ¾ò¾î¿Â ±Þ¿©¿Í »ó¿©¸¦ ¼öÁ¤ÇÏ¿© ´Ù½Ã ¾÷µ¥ÀÌÆ® ÇÑ´Ù. 
 */ 
(ind_sal  == -1) ? sal  = 3000 : sal  = sal  + 3000; 
(ind_comm == -1) ? comm = 1000 : comm = comm + 1000; 
EXEC SQL 
    UPDATE emp 
    SET sal = :sal, comm = :comm. 
    WHERE empno = :empno; 
 

¡¦ ¡¦ ¡¦

»õ·Î ÀÛ¼ºÇÑ ÇÁ·Î±×·¥ÀÌ Á»´õ Á¤È®ÇÑ ÇÁ·Î±×·¥À̶ó ÇϰڴÙ. ±×·³ INDICATOR º¯¼öÀÇ ¼±¾ðÀ» º¸ÀÚ. ÀÌ°Í ¿ª½Ã DECLARE SECTION ¾È¿¡ µé¾î°¡¾ß¸¸ ÇÑ´Ù. ±×¸®°í À̰ÍÀº ¹Ýµå½Ã 2 byte Á¤¼öÇüÀ¸·Î ¼±¾ðµÇ¾î¾ß¸¸ ÇÑ´Ù. INDICATOR º¯¼ö´Â È£½ºÆ® º¯¼öÀÇ µÚ¿¡ ¹Ù·Î µû¶ó¼­ ºÙµµ·Ï µÇ¾îÀÖ´Ù. À̰͵µ ¿ª½Ã ÄÝ·ÐÀ» ºÙÀ̵µ·Ï ÇÑ´Ù. °¡µ¶¼ºÀ» ³ôÀ̱â À§Çؼ­
:comm:ind_comm; ´ë½Å :comm INDICATOR :ind_comm; À» »ç¿ëÇÏ¿©µµ µÇÁö¸¸ °ÅÀÇ »ç¿ëÇÏÁö ¾Ê´Â´Ù.

¾Æ·¡ÀÇ Ç¥´Â INDICATOR º¯¼öÀÇ °ªÀÌ °¡Áö´Â Àǹ̸¦ º¸¿©ÁØ´Ù.

  • Ç¥6 INDICATOR °ªÀÇ ÀǹÌ
°ª ÀǹÌ
0 Á¤»óÀûÀ¸·Î ó¸®
-1 SELECT½Ã NULLÀÌ ¸®Åϵǰųª INSERT, UPDATE½Ã NULLÀÌ µé¾î°¨
-2 Ä®·³ÀÇ °ªÀÌ Àß·Á¼­ Àü´Þ. Ä®·³ °ªÀÇ ±æÀ̸¦ ¾Ë ¼ö ¾øÀ½.
>0 Ä®·³ÀÇ °ªÀÌ Àß·Á¼­ Àü´Þ. Ä®·³ °ªÀÇ ±æÀ̸¦ ³ªÅ¸³¿.


À§ÀÇ ¿¹Á¦Ã³·³ SQL¹®ÀåÀ» ¼öÇàÇÑ ÈÄ¿¡ ÀǽɵǴ Į·³¿¡ ´ëÇØ¼­ INDICATOR °ªÀ» °Ë»çÇØ º¸µµ·Ï Ç϶ó.

SELECT ±¸¹®°ú °°ÀÌ ÀϹÝÀûÀ¸·Î ¾Ë°íÀÖ´Â FROM, WHERE, INTO Àý À̿ܿ¡µµ Àß ¾²ÀÌÁö ¾ÊÁö¸¸ °èÃþÀûÀÎ °á°ú¸¦ ¾ò±âÀ§ÇÑ START WITH, CONNECT BY¿Í ±×·ìÇÎ, ¿À´õ¸µµµ °¡´ÉÇϸç FOR UPDATE OFÀý ±îÁöµµ °¡´ÉÇÏ´Ù.

1.4 DML ±¸¹®

À̹ø¿¡´Â DML¹®Àå¿¡ ´ëÇÏ¿© Â÷·Ê´ë·Î »ìÆìº¸ÀÚ.

EXEC SQL BEGIN DECLARE SECTION; 
    int deptno; 
    char dname[10]; 
    char loc[10]; 
EXEC SQL END DECLARE SECTION; 
 
 
/* 
 * ºÎ¼­¹øÈ£°¡ 50¹øÀÎ »õ·Î¿î ºÎ¼­¸¦ Insert ÇÑ´Ù. 
 */ 
deptno = 50; 
strcpy (dname, ¡°MANAGER¡±); 
strcpy (loc, ¡°SEOUL¡±); 
EXEC SQL 
INSERT INTO DEPT  
    VALUES (:deptno, :dname, :loc); 
 

À§¿¡¼­ º¸´Â ¹Ù¿Í °°ÀÌ INSERT ¹®À̶ó ÇÏ¿© Ưº°ÇÑ °ÍÀº ¾ø´Ù. ´Ü¼øÈ÷ VALUES Àý¿¡ µé¾î°¡´Â ½ÇÁ¦ µ¥ÀÌÅ͵鸸 È£½ºÆ® º¯¼ö ¶Ç´Â ½ÇÁ¦ »ó¼ö°ªÀ¸·Î ´ëü½ÃÄÑ ÁÖ¸é µÇ´Â °ÍÀÌ´Ù.
EXEC SQL BEGIN DECLARE SECTION; 
    Int deptno; 
EXEC SQL END DECLARE SECTION; 
 
/* 
 * ºÎ¼­¹øÈ£°¡ 50ÀÎ ºÎ¼­ÀÇ ºÎ¼­¹øÈ£¸¦ 60¹øÀ¸·Î º¯°æÇÑ´Ù. 
 */ 
EXECL SQL  
UPDATE DEPT 
    SET deptno = 60 
    WHERE deptno = 50; 
 
¡¦ ¡¦ ¡¦ 
 
/* 
 * ºÎ¼­¹øÈ£°¡ 60ÀÎ ºÎ¼­¸¦ »èÁ¦ÇÑ´Ù. 
 */ 
EXEC SQL 
    DELETE DEPT 
    WHERE deptno = 60; 
 

UPDATE, DELETEµµ ¿ª½Ã º°¹Ý ´Ù¸¦¹Ù´Â ¾ø´Ù.

1.5 Cursor »ç¿ë

Ä¿¼­¸¦ »ç¿ëÇÏ´Â °Í ¶ÇÇÑ °¡´ÉÇÏ´Ù. ¸ÕÀú Ä¿¼­¸¦ ¼±¾ðÇϰí ÇÊ¿äÇÑ ½ÃÁ¡¿¡¼­ ¿ÀÇÂÇϰí ÇÊ¿äÇÑ ¸¸Å­ ÆÐÄ¡ÇÑÈÄ »ç¿ëÀÌ ³¡³ª¸é ´ÝÀ¸¸é µÈ´Ù.

EXEC SQL BEGIN DECLARE SECTION; 
int empno; 
char ename[10]; 
char job[10]; 
float sal; 
float comm.; 
EXEC SQL END DECLARE SECTION; 
¡¦ ¡¦ ¡¦ 
 
/* 
 * ºÎ¼­¹øÈ£°¡ 10¹øÀÎ »ç¿øÀÇ »ç¿ø¹øÈ£, À̸§, Á÷Ã¥, ±Þ¿©, »ó¿©¸¦ 
 * °¡Á®¿À´Â Ä¿¼­¸¦ ¼±¾ðÇÑ´Ù. 
 */ 
EXEC SQL 
DECLARE emp_cursor CURSOR FOR 
    SELECT empno, ename, job, sal, comm 
    FROM emp 
    WHERE deptno = 10; 
 
¡¦ ¡¦ ¡¦ 
 
/* 
 * Ä¿¼­¸¦ ¿¬´Ù. 
 */ 
EXEC SQL 
OPEN emp_cursor; 
 
¡¦ ¡¦ ¡¦ 
 
/* 
 * Ä¿¼­¿¡¼­ ·¹Äڵ带 ´õ ÀÌ»ó ÆÐÄ¡ÇÒ °ÍÀÌ ¾øÀ» ¶§ Loop¸¦ break Çϵµ·Ï ÇÑ´Ù. 
 */ 
EXEC SQL 
WHENEVER NOT FOUND DO break; 
 
While (1) 
{ 
    /* 
     * Ä¿¼­¿¡¼­ ·¹Äڵ带 Çϳª¾¿ ÆÐÄ¡ÇÑ´Ù. 
     */ 
    EXEC SQL 
FETCH emp_cursor 
INTO :empno, :ename, :job, :sal, :comm.; 
 
    printf (¡°Fetch Data : %d, %s, %s, %7.2f, %7.2f\n¡±, 
empno, ename, job, sal, comm ); 
 
    /* 
     * ÆÐÄ¡ÇÑ ·¹ÄÚµåÀÇ »ç¿ø Á¤º¸¿¡¼­ ±Þ¿©¸¦ 20% ÀλóÇÑ´Ù. 
     */ 
    EXEC SQL  
        UPDATE emp 
        SET sal = sal * 1.2; 
        WHERE empno = :empno; 
}  
 
/* 
 * »ç¿ëÀÌ ³¡³­ Ä¿¼­¸¦ ´Ý´Â´Ù. 
 */ 
EXEC SQL 
    CLOSE emp_cursor; 
 


À§¿¡¼­ º¸¿©ÁÖ´Â ¿¹Á¦´Â ºÎ¼­¹øÈ£°¡ 10¹øÀÎ »ç¶÷µéÀ» ã¾Æ¼­ ÇÑ »ç¶÷¾¿ ¾ò¾î¿Â Á¤º¸¸¦ ÇÁ¸°Æ® ÇÏ°í °¢°¢ ±Þ¿©¸¦ 20% ÀλóÇÏ´Â ÇÁ·Î±×·¥ÀÎ °ÍÀÌ´Ù.

Ưº°ÇÑ °Í ¾øÀÌ ¾Õ¿¡¼­ ºÁ¿Ô´ø ÄÚµåµé°ú ºñ½ÁÇÏ´Ù. ´Ù¸¸ ÇѰ¡Áö WHENEVERÀýÀÌ »õ·ÎÀÌ ¼±º¸¿´´Ù. À̰ÍÀº Pro*C/C++¿¡¼­ SQLÀ» ¼öÇàÇϸ鼭 ¿¡·¯¸¦ °ËÁõÇØ³»´Â µÎ°¡Áö ¹æ¹ýÁß¿¡ ÇϳªÀÌ´Ù. Á»´õ µÚ¿¡¼­ ÀÚ¼¼È÷ »ìÆìº¸±â·Î ÇÑ´Ù.

1.6 Transaction Control

À§¿¡¼­ »ìÆìº» °Íµé·Î µ¥ÀÌÅ͸¦ ¾ò¾î¿À°í ¼öÁ¤ÇÏ´Â µîÀÇ ÀÛ¾÷À» Çß´Ù°í °¡Á¤ÇÏÀÚ. ±×·³ ÀÌ º¯°æ »çÇ×µéÀ» Àû¿ë½ÃŰ´øÁö Ãë¼ÒÇÏ´øÁö °áÁ¤À» ÇÏ¿©¾ß ÇÑ´Ù. ±× °ÍµéÀÌ Æ®·£Àè¼Ç Á¦¾î ¹®ÀåµéÀÌ´Ù. ¿ì¸®°¡ ÀϹÝÀûÀ¸·Î ¾Ë°í ÀÖ´Â Commit, RollbackÀÌ´Ù.

EXEC SQL 
    COMMIT WORK; 
 
EXECL SQL 
    ROLLBACK WORK; 
 
À§ÀÇ µÎ ¹®ÀåÁß À§ÀÇ °ÍÀº Áö±Ý±îÁöÀÇ º¯°æ»çÇ×À» µ¥ÀÌÅÍ º£À̽º¿¡ ¿µ±¸ÀûÀ¸·Î Àû¿ëÇÏ´Â ¹®ÀåÀÌ°í ¾Æ·¡°ÍÀº Ãë¼ÒÇϰí ÀÌÀüÀÇ µ¥ÀÌÅÍ·Î µÇµ¹¸®´Â ¹®ÀåÀÌ´Ù. WORK ±¸¹®Àº ´Ü¼øÈ÷ SQLÇ¥ÁØÀ» µû¸£±â À§ÇÑ °ÍÀ¸·Î ¹Ýµå½Ã ºÙÀÏ ÇÊ¿ä´Â ¾ø´Ù.

EXEC SQL 
    COMMIT WORK RELEASE; 
 
EXEC SQL 
    ROLLBACK WORK RELEASE; 
 
À§ÀÇ µÎ ¹®Àå ÁßÀº ¾Æ±î ºÃ´ø ¹®Àå°ú ¾à°£ ´Ù¸¥ Á¡ÀÌ ÀÖ´Ù. ¹Ù·Î RELEASE°¡ ¶æÇÏ´Â ¹ÙÀε¥ RELEASE´Â ÄÄÇ»ÅÍ¿¡¼­ ¡®³õ´Â´Ù¡¯, ¡®Ç¬´Ù¡¯, ¡®ÇØÀçÇÑ´Ù¡¯¶ó´Â Àǹ̷Π¾²ÀδÙ. Pro*C/C++ ¿¡¼­´Â ¹Ù·Î µ¥ÀÌÅͺ£À̽º¿ÍÀÇ Á¢¼ÓÀ» ²÷´Â´Ù´Â ÀǹÌÀÌ´Ù. Áï Áö±Ý±îÁöÀÇ º¯°æ»çÇ×À» Àû¿ëÇϰí Á¢¼ÓÀ» ²÷´øÁö Ãë¼ÒÇϰí Á¢¼ÓÀ» ²÷´Â ÀÛ¾÷ÀÌ´Ù.

1.7 ¿¡·¯Ã³¸®

Áö±Ý±îÁö Pro*C/C++¿¡¼­ SQLÀ» »ç¿ëÇÏ´Â ¹æ¹ýÀ» »ìÆìº¸¾Ò´Ù. ±×·¸´Ù¸é ±×·¯ÇÑ ±¸¹®µéÀÌ 100% È®½ÇÈ÷ ¼öÇàµÈ´Ù°í Àå´ã ÇÒ ¼ö Àִ°¡? ¼¼»ó¿¡ ¿¡·¯ ¾ø´Â ÇÁ·Î±×·¥Àº ¾ø´Ù. ´ç¿¬È÷ ¿ì¸®µµ SQL ¹®ÀåÀ» ¼öÇàÇϸ鼭 ¹ß»ýÇÏ´Â ¿¡·¯µéÀ» ã¾Æ ³¾ ¼ö ÀÖ¾î¾ß ÇÑ´Ù. Pro*C/C++ ¿¡¼­´Â µÎ°¡Áö ¹æ¹ýÀ» Á¦°øÇØ ÁØ´Ù.
1) WHENEVER ±¸¹®À» »ç¿ëÇÏ´Â °ÍÀÌ´Ù. À̰ÍÀº Pro*C/C++ ÇÁ·Î±×·¥¿¡¼­ ·±Å¸ÀÓ ¿¡·¯¸¦ ã¾Æ Çڵ鸵 ÇÒ ¼ö ÀÖ°Ô ÇØÁÖ´Â ±â´ÉÀ» °¡Áö°í ÀÖ´Ù.
2) SQL Communications Area¸¦ ÀÌ¿ëÇÏ´Â °ÍÀÌ´Ù. À̰ÍÀº ¾ÕÀ¸·Îµµ ¸¹ÀÌ ¾²ÀÏ °ÍÀ¸·Î ¸Å¿ì Áß¿äÇÏ´Ù. ÀϹÝÀûÀ¸·Î ÁÙ¿©¼­ SQLCA¶ó°í ÇÑ´Ù. À̰ÍÀº ÇÁ·Î±×·¥¿¡ µé¾î°¡´Â µ¥ÀÌÅͱ¸Á¶·Î sqlca.sqlcode¿Í sqlca.sqlerrm.sqlerrmc ¿¡ º¸¸é ¿¡·¯ ¹øÈ£¿Í ¿¡·¯¿¡ ´ëÇÑ ¼³¸íÀÌ µé¾îÀÖ´Ù. ¿ì¸®´Â À̰͵éÀ» »ç¿ëÇØ¼­ ¹ß»ýÇÑ ¿¡·¯¸¦ ¾Ë¾Æ³»°í ÀûÀýÇÑ Á¶Ä¡¸¦ ÃëÇØ¾ß ÇÏ´Â °ÍÀÌ´Ù.

¾Æ·¡¿¡ °¢°¢ÀÇ ¿¹Á¦°¡ ÀÖ´Ù. ¸ÕÀú WHENEVER ±¸¹®À» »ç¿ëÇÑ Ã¹¹øÂ° ¿¹Á¦¸¦ »ìÆìº¸µµ·Ï ÇÏÀÚ.

int main (void) 
{ 
¡¦ ¡¦ ¡¦ 
 
EXEC SQL 
WHENEVER SQLERROR DO sql_error (); 
EXEC SQL 
    DELETE FROM dept 
    WHERE deptno = 10; 
EXEC SQL 
        WHENEVER SQLERROR DO CONTINUE; 
 
¡¦ ¡¦ ¡¦ 
} 
 
void sql_error (void) 
{ 
    printf (¡°SQL Error Code : %d\n¡±, sqlca.sqlcode); 
    printf (¡°SQL Error Message : %s\n¡±, sqlca.sqlerrm.sqlerrmc); 
 
    EXEC SQL 
        WHENEVER SQLERROR DO CONTINUE; 
    EXEC SQL 
        ROLLBACK WORK RELEASE; 
     
    EXIT (EXIT_FAILURE); 
} 
 
À§ÀÇ ¿¹Á¦´Â DELETE ¹®ÀåÀ» ½ÇÇàÇϱâ Àü¿¡ ¸ÕÀú SQL ½ÇÇà½Ã ¿¡·¯°¡ ¹ß»ýÇϸé sql_error ¶ó´Â ÇÔ¼ö¸¦ ½ÇÇàÇϵµ·Ï ¸¸µé¾î ³õ°í DELETE¸¦ ½ÇÇàÇÑ´Ù. ¸¸¾à DELETE ±¸¹®À» ½ÇÇàÇÏ´Ù°¡ ¿¡·¯¸¦ ¸¸³ª°Ô µÇ¸é ÇÁ·Î±×·¥Àº ÀÚµ¿À¸·Î sql_error ÇÔ¼ö·Î ºÐ±âÇÏ°Ô µÇ°í °Å±â¼­ SQL ¿¡·¯ÄÚµå¿Í ¿¡·¯¸Þ¼¼Áö¸¦ Ãâ·ÂÇϰí ÇÁ·Î±×·¥Àº ¸ðµç º¯°æ»çÇ×À» Ãë¼ÒÇÏ°í µ¥ÀÌÅͺ£À̽º¿Í Á¢¼ÓÀ» ²÷°í Á¾·áÇÑ´Ù. ¸¸¾à DELETE ±¸¹®ÀÌ ¼º°øÇÏ¿´´Ù¸é WHENEVER SQLERROR DO CONTINUEÀ» ¼öÇàÇÏ¿© ¿¡·¯°¡ ¹ß»ýÇÏ¿©µµ °è¼ÓÀûÀ¸·Î ÇÁ·Î±×·¥À» ÁøÇàÇϵµ·Ï ´Ù½Ã º¯°æÇÒ °ÍÀÌ´Ù.

¿©±â¼­ Áß¿äÇÑ °ÍÀÌ ÀÖ´Ù. sql_error ÇÔ¼ö¿¡¼­´Â ROLLBACK ±¸¹®À» »ç¿ëÇϱâ Àü¿¡ WHENEVER SQLERROR DO CONTINUE À» ÇÏ¿´´Ù´Â Á¡ÀÌ´Ù. ¸¸¾à¿¡ ¿©±â¼­µµ SQL ½ÇÇà½Ã ¿¡·¯°¡ ¹ß»ýÇÏ¿´À» ¶§ sql_error ¸¦ ¼öÇàÇϵµ·Ï ÇÏ¿´´Ù¸é Å« ¹®Á¦°¡ ¹ß»ý ÇÒ ¼öµµ ÀÖ´Ù. ¹Ù·Î ¹«ÇÑ ·çÇÁ¿¡ ºüÁö°Ô µÇ´Âµ¥ ROLLBACKÀ» ¼öÇàÇϸ鼭 µ¥ÀÌÅͺ£À̽º¿Í Á¢¼ÓÀ» ²÷´Â °úÁ¤¿¡¼­ ¶Ç´Ù½Ã ¿¡·¯°¡ ¹ß»ýÇÑ´Ù¸é ´Ù½Ã sql_error À» ¼öÇàÇÒ °ÍÀÌ°í ´Ù½Ã ROLLBACKÀ» ¼öÇàÇϸ鼭 DisconnectÀ» ½ÃµµÇÏ°í ¶Ç ´Ù½Ã sql_error À» ¼öÇàÇÏ´Â °úÁ¤ÀÌ ¹Ýº¹ µÇ´Â °ÍÀÌ´Ù. ¹Ýµå½Ã ÁöÄÑÁ®¾ßÇÒ »çÇ×À¸·Î ¿¡·¯Ã³¸®¿¡¼­´Â SQLÀ» ¼öÇàÇÑ´Ù ÇÏ´õ¶óµµ ¹Ýµå½Ã WHENEVER SQLERROR DO CONTINUE ·Î ÁöÁ¤Çϵµ·Ï Ç϶ó.

À̹ø¿¡´Â SQLCA¸¦ »ç¿ëÇÑ µÎ¹øÂ° ¿¹Á¦¸¦ º¸µµ·Ï ÇÏÀÚ.

int main (void) 
{ 
¡¦ ¡¦ ¡¦ 
 
EXEC SQL 
    DELETE FROM dept 
    WHERE deptno = 10; 
If (sqlca.sqlcode != 0) 
{ 
    printf (¡°Error Occurred\n¡±); 
sql_error(); 
} 
 
¡¦ ¡¦ ¡¦ 
 
exit (EXIT_SUCCESS); 
} 
 
void sql_error (void) 
{ 
    printf (¡°SQL Error Code : %d\n¡±, sqlca.sqlcode); 
    printf (¡°SQL Error Message : %s\n¡±, sqlca.sqlerrm.sqlerrmc); 
 
    EXEC SQL 
        WHENEVER SQLERROR DO CONTINUE; 
    EXEC SQL 
        ROLLBACK WORK RELEASE; 
     
    EXIT (EXIT_FAILURE); 
} 
 

¸ÕÀú ù¹øÂ° º¸¾Ò´ø ÇÁ·Î±×·¥°ú ´ëµ¿¼ÒÀÌÇÏ´Ù. SQL½ÇÇà½Ã ¿¡·¯¸¦ ¾î¶»°Ô ã¾Æ³»´À³ÄÀÇ ¹®Á¦Àε¥ ù¹øÂ°ÀÇ ÇÁ·Î±×·¥Àº ¾Ï½ÃÀûÀÎ ¿¡·¯ÀÇ ½Äº°ÀÌ°í µÎ¹øÂ° °ÍÀº ¸í½ÃÀûÀÎ ¿¡·¯ÀÇ ½Äº°À̶ó´Â °ÍÀÌ´Ù. À§ ÇÁ·Î±×·¥Àº SQL ¹®ÀåÀ» ¼öÇàÇÑ ÈÄ SQLCA¿¡ ÀÖ´Â sqlcode¸¦ °Ë»çÇÑ´Ù. À̰ÍÀº Á¤»óÀûÀ¸·Î ó¸® µÇ¾úÀ» ¶§ 0À¸·Î ¼ÂÆÃµÈ´Ù.

µÎ°¡Áö ¹æ¹ýÀ» ÇÊ¿ä¿Í ÆíÀǼº¿¡ µû¶ó¼­ ÀûÀýÈ÷ »ç¿ëÇÏ¸é µÇ°Ú´Ù.

¸ÕÀú WHENNEVER ±¸¹®ÀÇ ¿ÏÀüÇÑ ±¸¹®À» »ìÆìº¸ÀÚ
EXEC SQL ---->  WHENEVER --+---> NOT FOUND -----+---> CONTINUE 
                           l---> SQLERROR       |---> GOTO Label 
                           +---> SQLWARNING     |---> STOP 
                                                |---> DO routine 
                                                |---> DO BREAK 
                                                +---> DO CONTINUE 
 

´ÙÀ½À¸·Î sqlca±¸Á¶Ã¼ÀÇ Á¤ÀǸ¦ »ìÆìº¸ÀÚ.
struct sqlca 
{ 
char sqlcaid[8]; /* "SQLCA" */ 
long sqlabc;     /* SQLCA ÀÇ Å©±â */ 
long sqlcode;    /* ¿À¶óŬ ¿¡·¯ ¸Þ½ÃÁö Äڵ尡 ÀúÀåµÈ´Ù. */ 
struct { 
unsigned short sqlerrml; /* ¿¡·¯ ¸Þ½ÃÁöÀÇ Å©±â */ 
char sqlerrmc[70];       /* ¿¡·¯ ¸Þ½ÃÁö ³»¿ë */ 
} sqlerrm; 
char sqlerrp[8]; /* ¿¹¾à */ 
long sqlerrd[6]; /* »óÅ ÄÚµå */ 
char sqlwarn[8]; /* °æ°í Ç÷¡±× */ 
char sqlext[8]; 
}; 
struct sqlca sqlca; 
 

°¢ ±¸Á¶Ã¼ ÇʵåÀÇ Àǹ̸¦ ¾Ë¾Æº»´Ù¸é

  • sqlcode : °¡Àå ¸¹ÀÌ ¾²ÀÌ´Â ÇʵåÀÌ´Ù. ¿¡·¯ °ËÁõ¿¡ »ç¿ëµÇ¸ç ¡°< 0¡± , ¡°0¡±, ¡°> 0¡± ¼¼°¡Áö Á¾·ùÀÇ °ªÀ» °¡Áø´Ù. 0 ÀÏ °æ¿ì Á¤»óÀûÀ¸·Î µ¿ÀÛÇÑ °æ¿ìÀÌ°í ¡°< 0¡± ÀÎ °æ¿ì ¹®Á¦°¡ ¹ß»ýÇÏ¿© ½ÇÇàµÇÁö ¸øÇÑ °æ¿ìÀÌ°í ¡°> 0¡± ÀÎ °æ¿ì ½ÇÇà µÇ¾úÀ¸³ª ¿¹¿Ü»óȲÀÌ ¹ß»ýÇÑ °æ¿ì¸¦ ³ªÅ¸³½´Ù. ¿¡·¯°¡ ¹ß»ý ÇÑ °æ¿ì sqlca ¾È¿¡ ÀÖ´Â sqlerrm ±¸Á¶Ã¼¸¦ »ìÆìº¸µµ·Ï Ç϶ó.

  • selerrp : »óÀ§ ¹öÀü¿¡¼­ »ç¿ëÇϱâ À§ÇØ ºñ¿öµÐ ¿¹¾àµÈ Çʵå´Ù. »ç¿ëÇÏÁö ¾Ê´Â´Ù.

  • sqlerrd :
    • sqlerrd [0] : »ç¿ëÇÏÁö ¾Ê´Â´Ù.
    • sqlerrd [1] : »ç¿ëÇÏÁö ¾Ê´Â´Ù.
    • sqlerrd [2] : SQL ¹®ÀåÀ» ¼öÇàÇØ¼­ ¿µÇâÀ» ¹ÞÀº ÇàÀÇ °³¼ö¸¦ °¡Áø´Ù.
    • sqlerrd [3] : »ç¿ëÇÏÁö ¾Ê´Â´Ù.
    • sqlerrd [4] : SQL ¹®ÀåÀ» ÆÄ½ÌÇϸ鼭 ¿¡·¯°¡ ¹ß»ýÇÑ À§Ä¡¸¦ °¡Áø´Ù.
    • sqlerrd [5] : »ç¿ëÇÏÁö ¾Ê´Â´Ù.
  • sqlwarm: °æ°í Ç÷¡±×·Î »ç¿ë
    • sqlwarm [0] : Ç÷¢±×°¡ ¼³Á¤µÈ°Ô ÀÖ´ÂÁö¸¦ ¼³Á¤ÇÏ´Â Ç÷¡±×. ´Ù¸¥ Ç÷¡±×°¡ Çϳª¶óµµ ¼³Á¤µÇ¸é ÀÌ Ç÷¡±×°¡ ¼³Á¤µÈ´Ù.
    • sqlwarm [1] : È£½ºÆ® º¯¼ö·Î ³Ñ°ÜÁø ¹®ÀÚ¿­ µ¥ÀÌÅͰ¡ ºÒ¿ÏÀüÇÒ ¶§ ¼³Á¤µÈ´Ù.
    • sqlwarm [2] : SQL ±×·ìÇÔ¼ö¿¡¼­ ³Î°ªÀÌ »ç¿ëµÇÁö ¾Ê¾ÒÀ» ¶§ ¼³Á¤µÈ´Ù.
    • sqlwarm [3] : SQL ¿¡¼­ Äõ¸®ÇÏ´Â ÇàÀÇ °³¼ö¿Í È£½ºÆ® º¯¼öÀÇ °³¼ö°¡ ´Ù¸¦ ¶§ ¼³Á¤µÈ´Ù.
    • sqlwarm [4] : Update³ª Delete¿¡¼­ Where ÀýÀÌ ¾øÀ» °æ¿ì ¼³Á¤ µÈ´Ù.
    • sqlwarm [5] : PL/SQL ¿¡¼­ ÄÄÆÄÀÏ ¿À·ù·Î CREATE PROCEDURE, CREATE FUNCTION, CREATE PACKAGE, CREATE PACKAGE BODY °¡ ½ÇÇàÀÌ ½ÇÆÐÇÏ¸é ¼³Á¤µÈ´Ù.
    • sqlwarm [6] : »ç¿ëÇÏÁö ¾Ê´Â´Ù.
    • sqlwarm [7] : »ç¿ëÇÏÁö ¾Ê´Â´Ù.
  • sqlext : »óÀ§ ¹öÀü¿¡¼­ »ç¿ëÇϱâ À§ÇØ ºñ¿öµÐ ¿¹¾àµÈ Çʵå´Ù. »ç¿ëÇÏÁö ¾Ê´Â´Ù.

ÀÌ»óÀ¸·Î »ìÆìº» °Íµé ¿Ü¿¡ DDL, DCLÀº Dynamic SQL ºÎºÐ¿¡¼­ ´Ù·çµµ·Ï Çϰí PL/SQL Block PL/SQL ºÎºÐÀ» µû·Î ÇÒ¾ÖÇÏ¿© ¾Ë¾Æº¸µµ·Ï ÇϰڴÙ.
EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù.