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

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



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

PL/SQL

À̹ø¿¡ ´Ù·ê ³»¿ëÀº Pro*C/C++ ¿¡¼­ PL/SQLÀ» ÇÒ ¼ö Àִ°¡? ¸¸¾à ÇÒ ¼ö ÀÖ´Ù¸é ¾î¶»°Ô Çϴ°¡? ¶ó´Â ¹®Á¦´Ù. ÀÏ´Ü °á·ÐºÎÅÍ ¸»ÇÏÀÚ¸é Pro*C/C++¿¡¼­µµ PL/SQLÀ» ÇÒ ¼ö ÀÖ´Ù. Ưº°È÷ ¾î·Á¿î °Í ¾øÀÌ °£´ÜÈ÷ Anonymous PL/SQL Block, Procedure, Function, Package¸¦ ¼öÇàÇÒ ¼ö ÀÖ´Ù. ¸¸¾à PL/SQL¿¡ ´ëÇØ¼­ ¾ËÁö ¸øÇÏ´Â µ¶ÀÚ°¡ ÀÖ´Ù¸é ¿À¶óŬ ¸Å´º¾óÀ̳ª PL/SQL°ü·Ã ¼­ÀûÀ» Âü°íÇÏ¿© ¸ÕÀú ½ÀµæÇϱ⠹ٶõ´Ù. ¿äÁò ¼­Á¡¿¡ °¡º¸¸é PL/SQL ¼­ÀûÀÇ °æ¿ì ¸î±Ç ³ª¿ÍÀִ°ÍÀ¸·Î ¾È´Ù. °í±Þ¼­´Â ¾øÁö¸¸ ±âÃʼ­·Î´Â ÈǸ¢ÇÑ Ã¥µéÀÌ´Ù.

¿ì¸®°¡ Áö±Ý±îÁö ¹è¿ö¿Â ³»¿ëµé·Î º¸°Çµ¥ Áö±Ý±îÁö ¹è¿î ³»¿ëµéÀÌ¸é ¸ðµç ÇÁ·Î±×·¡¹Ö¿¡¼­ ¸·Èû¾øÀÌ Ã³¸®ÇÒ¼ö ÀÖÀ» Á¤µµÀÇ ¼öÁØÀÌ´Ù. »ç½Ç C/C++°ú Oracle°úÀÇ ¿¬µ¿À̶ó ±×·¡ºÁ¾ß º°°Å ¾øÁö ¾Ê´Â°¡? ¸ðµç ·ÎÁ÷Àº C/C++¿¡¼­ ó¸®ÇÏ°í µ¥ÀÌÅ͸¦ ´ÜÁö Oracle¿¡¼­ ¾ò¾î¿À°í ´Ù½Ã Oracle¿¡ ÀúÀåÇÏ´Â °ÍÀÌ´Ù. ±×·³ PL/SQLÀ̶õ °ÍÀ» ¿Ö ÇØ¾ß Çϴ°¡? ¶ó´Â Àǹ®ÀÌ »ý±ä´Ù. ¸î°¡Áö ÀÌÀ¯°¡ ÀÖ±ä ÇÏÁö¸¸ ¹Ýµå½Ã ÇÊ¿äÇÑ °ÍÀº ¾Æ´Ï´Ï µ¶ÀÚµéÀÌ ¾Ë¾Æ¼­ ¼±ÅÃÇÏ¸é µÇ´Â °ÍÀÌ´Ù. ¾Æ·¡ÀÇ ¸î°¡Áö ÀÌÀ¯¸¦ º¸ÀÚ.

Performance

ÀϹÝÀûÀÎ ¼º´ÉÀÇ Çâ»óÀ¸·Î ¹Þ¾ÆµéÀÏ ¼ö´Â ¾ø´Â ¹®Á¦ÀÌ´Ù. PL/SQLÀ» ¾´´Ù°í ÇØ¼­ ¹Ýµå½Ã ¼º´ÉÀÇ Çâ»óÀÌ ÀϾ´Â °ÍÀÌ ¾Æ´Ï¶ó ¾î¶² °æ¿ì¿¡´Â PL/SQLÀ» »ç¿ëÇÔÀ¸·Î½á ¼º´ÉÀÇ Çâ»óÀ» º¼ ¼öµµ ÀÖ´Ù´Â ÀǹÌÀÌ´Ù. ¿¹¸¦ µé¾îº¸ÀÚ. C/C++¿¡µµ for¹®ÀÌ ÀÖ°í PL/SQL¿¡µµ for¹®ÀÌ ÀÖ´Ù. µÎ°æ¿ì¿¡¼­ for¹®¸¸À» ³õ°í º»´Ù¸é Àý´ë PL/SQLÀÌ ºü¸£´Ù°í ÇÒ ¼ö ¾ø´Ù. ÀÌ °æ¿ìÀÇ ¼º´ÉÀÇ Çâ»óÀ̶õ ¿À¶óŬ·ÎºÎÅÍ ´ë·®ÀÇ µ¥ÀÌÅ͸¦ ÆÐÄ¡ÇØ¿À°í C/C++¿¡¼­ for¹®À» ÅëÇØ¼­ µ¥ÀÌÅ͸¦ Á¶ÀÛÇÏ´Â °Í º¸´Ù´Â PL/SQL·Î ÀÌ¹Ì Á¶ÀÛµÈ ¼Ò·®ÀÇ µ¥ÀÌÅ͸¦ °¡Á®¿À´Â °ÍÀÌ ´õ ºü¸£´Ù´Â °ÍÀÌ´Ù. ³×Æ®¿÷ÀÇ ºÎÇ϶ó´Â ¹®Á¦´Â ±×¸® °£´ÜÈ÷ »ý°¢ÇÒ ¹®Á¦°¡ ¾Æ´Ï±â ¶§¹®ÀÌ´Ù. ºÐ¸í PL/SQLÀÌ ÀÏ¹Ý ¾ð¾î¿Í ¶Ç´Ù¸¥ Àç¹Ì¸¦ ÁÖ±â´Â ÇÏÁö¸¸ ´Ü¼øÈ÷ ¼º´ÉÀÇ Çâ»óÀ̶õ ¸»À» ±×´ë·Î ¹Þ¾Æµé¿© PL/SQL ½ÅºÀÀÚ°¡ µÇ±â º¸´Ù´Â Çѹø ´õ »ý°¢ÇÏ¿© ¾î¶² °ÍÀÌ ½Ã½ºÅÛÀÇ ¼º´É¿¡ ³ªÀ»Áö °í¹ÎÇØ º¸´Â °ÍÀÌ ÁÁ°Ú´Ù.

Integration with Oracle

ÀÌ ºÎºÐÀº »ó´çÈ÷ À¯¿ëÇÑ Á¡À̶ó ÇÒ ¼ö ÀÖ´Ù. ÇÁ·Î±×·¡¹ÖÀ» Çϸ鼭 ¼ö¸¹Àº Å×À̺íÀÇ °¢°¢ÀÇ Ä®·³ µ¥ÀÌÅÍ Å¸ÀÔÀ» ±â¾ïÇÏÁö ¸øÇÏ¿© ÇÒ¶§¸¶´Ù Å×À̺í Á¤ÀǸ¦ º¸°í ÇÏ´Â °æ¿ì°¡ ÀÖ´Ù. ÇÏÁö¸¸ PL/SQL¿¡¼­´Â %TYPEÀ» »ç¿ëÇÏ¿© º¯¼öÀÇ µ¥ÀÌÅÍ Å¸ÀÔÀ» Á¤ÀÇÇÒ ¼ö °¡ ÀÖ´Â °ÍÀÌ´Ù. ÀÌ·¸°Ô ÇÏ¸é º¯¼öÀÇ µ¥ÀÌÅÍ Å¸ÀÔÀ» Á÷Á¢ ÁöÁ¤ÇÏ´Â °ÍÀÌ ¾Æ´Ï¶ó ¡®¾î´À Å×À̺íÀÇ ¾î´À Ä®·³°ú °°Àº µ¥ÀÌÅÍ Å¸ÀÔÀ¸·Î Çϰڴ١¯ ¶ó°í ÁöÁ¤ÇØ ÁÖ´Â °ÍÀÌ´Ù. À̺κÐÀº »ó´çÈ÷ Æí¸®ÇÑ ±â´ÉÀÎ °ÍÀÌ´Ù.

Cursor FOR Loops

±× Æí¸®ÇÏ´Ù´Â ¡®Cursor For Loop¡¯ÀÌ´Ù. Pro*C/C++»Ó¸¸ ¾Æ´Ï¶ó PL/SQL¿¡¼­µµ Ä¿¼­¸¦ ¼±¾ðÇϰí Loop¸¦ ¼öÇàÇÏ´Â °ÍÀº ¿©°£ ±ÍÂúÀº ÀÏÀÌ ¾Æ´Ï´Ù. ÇÏÁö¸¸ PL/SQL¿¡¼­´Â ƯÈ÷ ÆíÇÑ ¹æ¹ýÀÌ Á¸ÀçÇϴµ¥ ±×°ÍÀÌ ¹Ù·Î Cursor For LoopÀÌ´Ù. Ä¿¼­¸¦ ¼±¾ðÇÏ°í ¿­°í ÆÐÄ¡ÇÏ°í ´Ý´Â ¸ðµç °úÁ¤À» ÀÚµ¿À¸·Î ÇØÁÖ°í Ä¿¼­¿¡¼­ µ¥ÀÌÅ͸¦ ÆÐÄ¡ÇÒ ·¹ÄÚµåÇüÀÇ º¯¼ö¸¶Àú ¼±¾ðÇÒ ÇÊ¿ä¾øÀÌ ÀÚµ¿À¸·Î ¸¸µé¾î ÁØ´Ù. ÇѹøÀÌ¶óµµ »ç¿ëÇØº¸¸é ¾Ë°ÚÁö¸¸ ¸Å¿ì Æí¸®ÇÑ ±â´ÉÀÓ¿¡´Â Ʋ¸²¾ø´Ù.

Procedures and Functions and Packages

ÇÁ·Î½ÃÀú, ÇÔ¼ö, ÆÐŰÁö´Â PL/SQLÀÇ »ç¿ë¿¡ À־ ¾ø¾î¼­´Â ¾ÈµÉ Áß¿äÇÑ ¿ä¼ÒÀÌ´Ù. °£´ÜÇÑ ¹®Á¦ÀÎ °æ¿ì À͸íºí·°(Anonymous Block)À» »ç¿ëÇÏ¸é µÇÁö¸¸ ÀÚÁÖ»ç¿ëÇϰí Áß¿äÇÑ ±â´É¿¡ ´ëÇÏ¿©´Â ÇÁ·Î½ÃÀú³ª ÇÔ¼ö·Î ¸¸µé¾î ³õ°í »ç¿ëÇÏ´Â °ÍÀÌ º¸ÅëÀ̰í PL/SQL¿¡¼­µµ ¿ª½Ã ÀÌ·¯ÇÑ ±â´ÉÀ» Á¦°øÇϰí ÀÖ´Ù. ƯÈ÷ C++ÀÇ Å¬·¡½º¿Í ºñ½ÁÇÑ ÆÐŰÁöµµ Á¦°øÇÑ´Ù.

PL/SQL Tables and User-Defined Records

±× ¹Û¿¡ ¸¹ÀÌ »ç¿ëÇÏÁö´Â ¾ÊÁö¸¸ °æ¿ì¿¡ µû¶ó¼­ À¯¿ëÇÑ ±â´ÉÀÌ ÀÖ´Ù. CÀÇ ¹è¿­°ú ºñ½ÁÇÑ Å×À̺í ŸÀÔ°ú ±¸Á¶Ã¼¿Í ºñ½ÁÇÑ ·¹ÄÚµå ŸÀÔÀÌ ÀÖ´Ù.

±×·³ ¿¹Á¦¸¦ µé¾îº¸°Ú´Ù. Àß »ìÆìº¸°í Pro*C/C++¿¡¼­ PL/SQLÀ» »ç¿ëÇÏ´Â ¹ýÀ» ÀÍÈ÷µµ·Ï Ç϶ó. ÀÌ ¿¹Á¦´Â Pro*C/C++¿¡¼­ ÇϳªÀÇ ÇÁ·Î½ÃÀú¸¦ »ý¼ºÇÏ°í ±× ÇÁ·Î½ÃÀú¸¦ È£ÃâÇÏ´Â °ÍÀÌ´Ù. »ý¼ºÇÏ´Â ÇÁ·Î½ÃÀúÀÇ ³»¿ëÀº ºÎ¼­ÀÇ ¹øÈ£¸¦ ÀԷ¹޾Ƽ­ ±× ºÎ¼­ÀÇ Æò±Õ±Þ¿©, ÃÖ°í±Þ¿©, ÃÖÀú±Þ¿©¸¦ ±¸ÇØÁØ´Ù. ¸¸¾à ÇØ´ç ºÎ¼­°¡ ¾ø´Â °æ¿ì³ª ÇÁ·Î½ÃÀú ¼öÇàÁß ¿À·ù°¡ ¹ß»ýÇßÀ» °æ¿ì¿¡´Â °¢°¢ÀÇ °ªµéÀº 0À¸·Î ¼ÂÆÃµÈ´Ù.

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

$ proc mode=ansi parse=none sqlcheck=full userid=scott/tiger plsql.pc  
 

ÁÖÀÇÇÒ °ÍÀº sqlcheck=full¿Í userid=scott/tiger¸¦ ¹Ýµå½Ã ÁöÁ¤ÇØ ÁÖ¾î¾ß ÇÑ´Ù.

/* -------------------------------------------------------------------------------- 
ÆÄÀÏ À̸§ : plsql.pc 
°³¹ß ÀÏÀÚ : 2002-10-28 
ÀÛ¼ºÀÚ : ·ù¸íȯ 
-------------------------------------------------------------------------------- */ 
 
#include <stdio.h> 
#include <stdlib.h> 
#include <stdlib.h> 
 
/* 
 * $ORACLE_HOME/precomp/public/sqlca.h ¸¦ Æ÷ÇÔÇØ ÁÖ±â À§Çؼ­ 
 */ 
exec sql include sqlca; 
 
/* 
 * È£½ºÆ® º¯¼ö ¼±¾ð 
 */ 
exec sql begin declare section; 
    /* 
     * »ç¿ëÀÚ ID¿Í ÆÐ½º¿öµå 
     */ 
    char *username; 
    char *password; 
 
/* 
 * DB¿Í ¿¬µ¿ÇÒ È£½ºÆ® º¯¼ö 
 */ 
char deptno [128]; 
int avg_sal; 
int max_sal; 
int min_sal; 
 
/* 
 * Indicator º¯¼ö 
 */ 
short ind_deptno; 
short ind_avg_sal; 
short ind_max_sal; 
short ind_min_sal;     
exec sql end declare section; 
 
 
/* 
 * SQL ¿¡·¯ ¹ß»ý½Ã ½ÇÇàÇÒ ÇÔ¼ö 
 * ¿¡·¯Äڵ带 ÇÁ¸°Æ® ÇÏ°í ·Ñ¹é ÈÄ¿¡ Á¢¼ÓÀ» Á¾·áÇÑ´Ù. 
 */ 
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 continue; 
    exec sql rollback work release; 
 
    exit (EXIT_FAILURE); 
} 
 
 
/* 
 * ¸ÞÀÎ ÇÔ¼ö 
 */ 
int main (int argc, char **argv) 
{ 
    username = (char *)strdup ("scott"); 
    password = (char *)strdup ("tiger"); 
 
    /* 
     * scott »ç¿ëÀÚ °èÁ¤À¸·Î Á¢¼Ó ½Ãµµ 
     * Á¢¼Ó ½Ãµµ ÈÄ¿¡ ¼º°ø ¿©ºÎ¸¦ À§ÇØ ¿¡·¯¸¦ °Ë»çÇÑ´Ù. 
     */ 
    exec sql 
        connect :username identified by :password; 
    if (sqlca.sqlcode != 0) 
    { 
        sql_error (); 
    } 
    printf ("Connected to Oracle Database\n"); 
 
/* 
 * DB¿¡ Procedure¸¦ »ý¼ºÇÑ´Ù. 
 * ProcedureÀÇ ³»¿ëÀº ºÎ¼­¹øÈ£¸¦ ÀԷ¹޾Ƽ­ 
 * ±× ºÎ¼­ÀÇ Æò±Õ±Þ¿©, ÃÖ°í±Þ¿©, ÃÖÀú±Þ¿©¸¦ ¾ò¾î¿Â´Ù. 
 */ 
exec sql 
    create or replace 
        procedure dept_salary_info 
        ( 
        p_deptno in dept.deptno%type,   /* ºÎ¼­¹øÈ£ */ 
        p_salary_avg out number,        /* Æò±Õ±Þ¿© */ 
        p_salary_max out number,        /* ÃÖ°í±Þ¿© */ 
        p_salary_min out number         /* ÃÖÀú±Þ¿© */ 
        ) 
    is 
    begin 
        /* 
         * ÇØ´ç ºÎ¼­ÀÇ Æò±Õ±Þ¿©, ÃÖ°í±Þ¿©, ÃÖÀú±Þ¿©¸¦ 
         * ±¸ÇÏ¿© Out Parameter º¯¼ö¿¡ ³Ö¾îÁØ´Ù. 
         */ 
        select    round (avg (sal + nvl (comm, 0)), 0) average, 
            round (max (sal + nvl (comm, 0)), 0) maximum, 
            round (min (sal + nvl (comm, 0)), 0) minimum 
        into    p_salary_avg, 
            p_salary_max, 
            p_salary_min 
        from    emp 
        where   deptno = p_deptno; 
 
        exception 
        /* 
         * ÇØ´ç ºÎ¼­°¡ ¾ø´Â °æ¿ì 
         */ 
        when no_data_found then 
        p_salary_avg := 0; 
        p_salary_max := 0; 
        p_salary_min := 0; 
 
        /* 
         * ¾Ë ¼ö ¾ø´Â ¿¡·¯°¡ ¹ß»ýÇÑ °æ¿ì 
         */ 
        when others then 
        p_salary_avg := 0; 
        p_salary_max := 0; 
        p_salary_min := 0; 
 
end dept_salary_info; 
end-exec; 
 
if (sqlca.sqlcode != 0) 
{ 
    sql_error (); 
} 
 
printf ("Procedure created\n\n"); 
 
/* 
 * ºÎ¼­¹øÈ£¸¦ ¾ò¾î¿Â´Ù. 
 */ 
printf ("Deptno : "); 
fgets (deptno, sizeof (deptno) - 1, stdin); 
deptno [strlen (deptno) - 1] = '\0'; 
ind_deptno = 0; 
 
/* 
 * À§¿¡¼­ »ý¼ºÇÑ ÇÁ·Î½ÃÀú¸¦ È£ÃâÇÏ¿© ÀԷ¹ÞÀº 
 * ºÎ¼­ÀÇ Æò±Õ±Þ¿©, ÃÖ°í±Þ¿©, ÃÖÀú±Þ¿©¸¦ ¾ò¾î¿Â´Ù. 
 */ 
exec sql 
    execute 
        begin 
        dept_salary_info 
        ( 
            :deptno:ind_deptno, 
            :avg_sal:ind_avg_sal, 
            :max_sal:ind_max_sal, 
            :min_sal:ind_min_sal 
        ); 
        end; 
    end-exec; 
 
if (sqlca.sqlcode != 0) 
{ 
    sql_error (); 
} 
     
/* 
 * °¢ °ªµéÀÌ NULL À̶ó¸é 0À¸·Î ¼ÂÆÃÇÑ´Ù. 
 */ 
if (ind_avg_sal == -1) avg_sal = 0; 
if (ind_max_sal == -1) max_sal = 0; 
if (ind_min_sal == -1) min_sal = 0; 
 
printf ("Average Salary : %d\n", avg_sal); 
printf ("Maximum Salary : %d\n", max_sal); 
printf ("Minimum Salary : %d\n", min_sal); 
 
    /* 
     * µ¥ÀÌÅͺ£À̽º¿Í Á¢¼ÓÀ» Á¾·áÇÑ´Ù. 
     */ 
    exec sql 
        rollback work release; 
    if (sqlca.sqlcode != 0) 
    { 
        sql_error (); 
    } 
 
    exit (EXIT_SUCCESS); 
} 
 
EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù.