************** ºÎ¼­/Á÷¿ø ¸®Æ÷Æ® ******************

ºÎ¼­ : ºÎ¼­¹øÈ£       ºÎ¼­¸í             À§Ä¡

        10         ACCOUNTING        NEW YORK

»ç¿ø : »ç¹ø     À̸§         ±Þ¿©          ±Þ¿© µî±Þ

       7871    Anderson    2000         ***   
      7890    Andrew       700         * 
      7870    Scott       2400         **** 
      7866    David        900         * 
      7891    Sylvia      3200         *****

2¸íÀÇ ±Þ¿©°¡ ÀλóµÇ¾ú½À´Ï´Ù.


À§¿Í °°Àº ¸®Æ÷Æ®¸¦ »Ì¾Æ³»°í $1000º¸´Ù ÀûÀº ±Þ¿©¸¦ ¹Þ´Â Á÷¿øÀÇ ±Þ¿©¸¦ 10%ÀλóÇÏ´Â ÇÁ·Î±×·¥À» ÀÛ¼ºÇÏ¿© º¾´Ï´Ù.

ACCEPT p_deptno PROMPT 'Please enter the department number : '

DECLARE

   v_deptno    NUMBER(2);

   v_dname     CHAR(14);

   v_loc       CHAR(13);

   v_empno     emp.empno%TYPE;

   v_ename     emp.ename%TYPE;

   v_sal       emp.sal%TYPE;

   v_grade     salgrade.grade%TYPE;

   v_dno       emp.deptno%TYPE := &p_deptno;

   CURSOR emp_cursor IS

          SELECLT empno, ename, sal

          FROM emp

          WHERE deptno = &p_deptno;

   e_no_emp    EXCEPTION;

BEGIN

   -- print out the report title

   DBMS_OUTPUT.PUT_LINE('*********ºÎ¼­/Á÷¿ø ¸®Æ÷Æ®*********');

   SELECT  deptno, dname, loc

      INTO v_deptno, v_dname, v_loc

      FROM dept

      WHERE   deptno = v_dno;

   DBMS_OUTPUT.PUT_LINE('ºÎ¼­ :  ºÎ¼­¹øÈ£   ºÎ¼­¸í        À§Ä¡');

   DBMS_OUTPUT.PUT_LINE('     '¡«v_deptno¡«'    '¡«v_dname¡«
                        '   '¡«v_loc¡«'   ');

   DBMS_OUTPUT.PUT_LINE('»ç¿ø : »ç¹ø   À̸§   ±Þ¿©    ±Þ¿©µî±Þ');

   OPEN emp_cursor;

   FETCH emp_cursor INTO v_empno, v_ename, v_sal;

   /* according to the salary amount,

      print out the stars */

   WHILE emp_cursor%FOUND LOOP

      SELECT grade

         INTO v_grade

         FROM salgrade

         WHERE v_sal > losal AND v_sal <hisal;

      DBMS_OUTPUT.PUT('      '¡«v_empno¡«'   '¡«v_ename¡«
                      '      '¡«v_sal¡«'     ');

      FOR I in 1..v_grade LOOP

         DBMS_OUTPUT.PUT('*');

      END LOOP;

      DBMS_OUTPUT.PUT_LINE('');

      FETCH emp_cursor INTO v_empno, v_ename, v_sal;

   END LOOP;

   CLOSE emp_cursor;

   UPDATE emp

      SET     sal = sal * 1.1

      WHERE   sal < 1000;

   IF SQL%ROWCOUNT = 0 THEN

      RAISE e_no_emp;

   ELSE

      DBMS_OUTPUT.PUT_LINE(SQL%ROWCOUNT ¡«'¸íÀÇ ±Þ¿©°¡ ' ||
                           'ÀλóµÇ¾ú½À´Ï´Ù.');

   END IF;

   COMMIT;

EXCEPTION

   WHEN no_data_found THEN

      DBMS_OUTPUT.PUT_LINE('There is no matching data.');

   WHEN too_many_rows THEN

      DBMS_OUTPUT.PUT_LINE('More than one matching data. ');

   WHEN e_no_emp THEN

      DBMS_OUTPUT.PUT_LINE('No employee with a smaller ' ||
                           'than  $1000.');

   --in case of any other exception

   WHEN others THEN

      DBMS_OUTPUT.PUT_LINE('Some other error occurred.');

END;  

¾Ï½ÃÀû, ¸í½ÃÀû Ä¿¼­

   ¿À¶óŬ  ¼­¹ö´Â  SQL  ¹®ÀåÀ»  ½ÇÇàÇÏ°í  Ã³¸®ÇÑ  Á¤º¸¸¦ ÀúÀåÇϱâ À§ÇØ  Private  SQL    ¿µ¿ªÀ̶ó ºÒ¸®´Â ÀÛ¾÷ ¿µ¿ªÀ» »ç¿ëÇÕ´Ï´Ù.  private SQL  ¿µ¿ª¿¡ À̸§ ºÙÀÌ°í ±×°ÍÀÇ    ÀúÀåµÈ Á¤º¸¸¦ ¾×¼¼½ºÇϱâ À§ÇØ PL/SQL Ä¿¼­¸¦ »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù.
 

Ä¿¼­ À¯Çü

¼³¸í

¾Ï½ÃÀû

¾Ï½ÃÀû Ä¿¼­´Â ÇϳªÀÇ Çุ ¸®ÅÏÇÏ´Â ÁúÀǸ¦ Æ÷ÇÔÇÏ¿© ¸ðµç DML°ú PL/SQL SELECT ¹®Àå¿¡ ´ëÇØ PL/SQL¿¡ ÀÇÇØ ¾Ï½ÃÀûÀ¸·Î ¼±¾ðµË´Ï´Ù.

¸í½ÃÀû

Çϳª ÀÌ»óÀ» ¹ÝȯÇÏ´Â ¸ðµç ÁúÀÇ¿¡ ´ëÇØ ¸í½ÃÀû Ä¿¼­´Â ÇÁ·Î±×·¡¸Ó¿¡ ÀÇÇØ ¼±¾ðµÇ°í À̸§ ºÙ¿©Áö¸ç ºí·ÏÀÇ ½ÇÇà ¼½¼Ç ¾ÈÀÇ Æ¯Á¤ ¸í·É¹®À» ÅëÇØ Á¶À۵˴ϴÙ.

  
¾Ï½ÃÀû Ä¿¼­

   ¿À¶óŬ ¼­¹ö´Â ¸í½ÃÀûÀ¸·Î ¼±¾ðµÈ Ä¿¼­¿Í °ü·Ã ¾ø´Â °¢ SQL ¹®ÀåÀ» ÇÁ·Î¼¼½º ÇÏ±â    À§ÇØ Ä¿¼­¸¦ ¾Ï½ÃÀûÀ¸·Î °³¹æÇÕ´Ï´Ù. PL/SQLÀº SQL Ä¿¼­·Î¼­ °¡Àå ÃÖ±ÙÀÇ ¾Ï½ÃÀû    Ä¿¼­¸¦ ÂüÁ¶ÇÒ ¼ö ÀÖµµ·Ï ÇØ ÁÝ´Ï´Ù.  SQL Ä¿¼­¸¦ Á¦¾îÇϱâ À§ÇØ  OPEN,  FETCH    ±×¸®°í CLOSE ¹®ÀåÀ» »ç¿ëÇÒ ¼ö ¾øÁö¸¸ °¡Àå ÃÖ±Ù¿¡ ½ÇÇàµÈ SQL ¹®Àå¿¡ ´ëÇÑ Á¤º¸¸¦    ¾ò±â À§ÇÑ Ä¿¼­ ¼Ó¼ºÀ» »ç¿ëÇÒ ¼ö´Â ÀÖ½À´Ï´Ù.

¸í½ÃÀû Ä¿¼­

   ´ÙÁß Çà SELECT ¹®Àå¿¡ ÀÇÇØ ¸®ÅϵǴ °¢ ÇàÀ» °³º°ÀûÀ¸·Î ó¸®Çϱâ À§ÇØ ¸í½ÃÀû    Ä¿¼­¸¦ »ç¿ëÇÕ´Ï´Ù. ´ÙÁß Çà ÁúÀÇ¿¡ ÀÇÇØ ¸®ÅÏµÈ ÇàÀÇ ÁýÇÕÀº result set À̶ó ºÒ¸³´Ï´Ù.    ±×°ÍÀÇ Å©±â´Â °Ë»öÁ¶°Ç¿¡ ÀÏÄ¡ÇÏ´Â ÇàÀÇ ¼öÀÔ´Ï´Ù.
   
   ½½¶óÀ̵忡¼­ ´ÙÀ̾î±×·¥Àº  result set ¿¡¼­  current row ¸¦ ¸í½ÃÀû Ä¿¼­°¡ ¾î¶»°Ô    °¡¸®Å°´Â°¡¸¦ º¸¿© ÁÝ´Ï´Ù.       ÀÌ°ÍÀº  ÇÁ·Î±×·¥ÀÌ  Çѹø¿¡  ÇÑ ÇàÀ» ó¸®ÇÏ´Â °ÍÀ»    Çã¿ëÇÕ´Ï´Ù.
   
   PL/SQL ÇÁ·Î±×·¥Àº ÁúÀÇ¿¡ ÀÇÇØ ¸®ÅÏµÈ  ÇàÀ» ó¸®ÇÏ°í ±×·± ´ÙÀ½ Ä¿¼­¸¦ ´Ý½À´Ï´Ù.
   
   Ä¿¼­´Â result set¿¡¼­ ÇöÀç À§Ä¡¸¦ Ç¥½ÃÇÕ´Ï´Ù.

¸í½ÃÀû Ä¿¼­ ÇÔ¼ö

  • ÁúÀÇ¿¡ ÀÇÇØ ¸®ÅÏµÈ Ã¹¹ø° ÇàºÎÅÍ, Çà Çϳª Çϳª¾¿ ó¸® ÇÒ ¼ö ÀÖ½À´Ï´Ù.
  • ÇöÀç 󸮵Ǵ  ÇàÀÇ Æ®·¢À» À¯ÁöÇÕ´Ï´Ù.
  • ÇÁ·Î±×·¡¸Ó°¡ PL/SQL ºí·Ï¿¡¼­  ¼öµ¿À¸·Î Á¦¾îÇÒ ¼ö ÀÖ½À´Ï´Ù.

  
ÁÖ: ¾Ï½ÃÀû Ä¿¼­¿¡ ´ëÇÑ ÀÎÃâ(fetch)Àº ¹è¿­ ÀÎÃâ(fetch)À̸ç, µÎ ¹ø° ÇàÀÇ Á¸Àç´Â
    ¿©ÀüÈ÷ TOO_MANY_ROWS  ¿¹¿Ü°¡ ¹ß»ýÇÕ´Ï´Ù. ±×·¯¹Ç·Î, ´ÙÁß ÀÎÃâ(fetch)À»
    ¼öÇàÇÏ°í ÀÛ¾÷ ¿µ¿ª¿¡¼­ ±¸¹® ºÐ¼®µÈ ÁúÀǸ¦ Àç½ÇÇà Çϱâ À§ÇØ ¸í½ÃÀû Ä¿¼­¸¦ »ç¿ëÇÒ
    ¼ö ÀÖ½À´Ï´Ù.   


¸í½ÃÀû Ä¿¼­ (°è¼Ó)

   Ä¿¼­¿¡ ´ëÇØ °³³äÀûÀÎ ÀÌÇØ´Â ÇÏ¿´À¸¹Ç·Î, ±×°ÍµéÀ» »ç¿ëÇϱâ À§ÇÑ ´Ü°è¸¦ »ìÆ캾´Ï´Ù.    °¢ ´Ü°è¿¡ ´ëÇÑ ±¸¹®Àº ´ÙÀ½¿¡ ÀÖ½À´Ï´Ù.

4°¡Áö ¸í·ÉÀ» »ç¿ëÇÏ´Â ¸í½ÃÀû Ä¿¼­ Á¦¾î

   1.   ¼öÇàµÇ±â À§ÇÑ ÁúÀÇÀÇ ±¸Á¶¸¦ Á¤ÀÇÇÏ°í  À̸§À» ÁöÁ¤ÇÔÀ¸·Î½á Ä¿¼­¸¦ ¼±¾ðÇÕ´Ï´Ù.
   
   2.   Ä¿¼­¸¦ ¿±´Ï´Ù. OPEN ¹®ÀåÀº ÁúÀǸ¦ ½ÇÇàÇÏ°í, ÂüÁ¶µÇ´Â ÀÓÀÇÀÇ º¯¼ö¸¦ ¹ÙÀÎµå          ÇÕ´Ï´Ù. ÁúÀÇ¿¡ ÀÇÇØ ½Äº°µÈ ÇàÀº active set À̶ó ºÒ¸®°í ÀÎÃâ(fetch)°¡´ÉÇÕ´Ï´Ù.

   3.   Ä¿¼­¿¡¼­ µ¥ÀÌÅ͸¦ ÀÎÃâ(fetch)ÇÕ´Ï´Ù. FETCH ¹®ÀåÀº Ä¿¼­¿¡¼­ º¯¼ö·Î ÇöÀç ÇàÀ»          ·Îµå ÇÕ´Ï´Ù. °¢ ÀÎÃâ(fetch)Àº È°¼º ¼Â( set )¿¡¼­ ´ÙÀ½ ÇàÀ¸·Î ±× Æ÷ÀÎÅ͸¦   À̵¿          Çϵµ·Ï ÇÕ´Ï´Ù. ±×·¯¹Ç·Î °¢ ÀÎÃâ(fetch)Àº ÁúÀÇ¿¡ ÀÇÇØ ¸®ÅϵǴ °¢±â ´Ù¸¥ ÇàÀ»          ¾×¼¼½º ÇÕ´Ï´Ù. ½½¶óÀ̵忡¼­ º¸¿© ÁØ È帧 ´ÙÀ̾î±×·¥¿¡¼­, °¢ ÀÎÃâ(fetch)½Ã¿¡          ÇàÀÌ Á¸ÀçÇÏ´Â Áö¸¦ °Ë»çÇÕ´Ï´Ù. ÇàÀÌ ¹ß°ßµÇ¸é ±×°ÍÀº ÇöÀç ÇàÀ» º¯¼ö·Î ·ÎµåÇÕ´Ï          ´Ù. ±×·¸Áö ¾ÊÀ¸¸é Ä¿¼­¸¦ ´Ý½À´Ï´Ù.
   
   4.   Ä¿¼­¸¦ ´Ý½À´Ï´Ù. CLOSE ¹®ÀåÀº ÇàÀÇ È°¼º ¼Â(set)À» ÇØÁ¦ÇÕ´Ï´Ù. ÀÌÁ¦ »õ·Î¿î          È°¼º ¼Â(set)À» »ý¼ºÇϱâ À§ÇØ Ä¿¼­¸¦ ´Ù½Ã ¿­ ¼ö ÀÖ½À´Ï´Ù.

¸í½ÃÀû Ä¿¼­ ¼±¾ð

   ¸í½ÃÀûÀ¸·Î Ä¿¼­¸¦ ¼±¾ðÇϱâ À§ÇØ CURSOR ¹®ÀåÀ» »ç¿ëÇÕ´Ï´Ù.
   ÁúÀÇ ³»¿¡¼­ º¯¼ö¸¦ ÂüÁ¶ÇÒ ¼ö ÀÖÁö¸¸, CURSOR ¹®Àå Àü¿¡ ¼±¾ðµÇ¾î¾ß ÇÕ´Ï´Ù

±¸¹®¿¡¼­

        cursor_name                     PL/SQL ½Äº°ÀÚÀÔ´Ï´Ù.
        select_statement                INTO Àý ¾ø´Â SELECT ¹®ÀåÀÔ´Ï´Ù.

ÁÖ: INTO ÀýÀº FETCH ¹®Àå¿¡ Àֱ⠶§¹®¿¡ Ä¿¼­ ¼±¾ð¿¡¼­ INTO ÀýÀ» Æ÷ÇÔÇÏÁö ¸¶½Ê½Ã¿À.

Ä¿¼­ ¼±¾ð (°è¼Ó)

   Çϳª¾¿ Á¾¾÷¿øÀ» ÀÐ¾î µéÀÔ´Ï´Ù.
 

DECLARE
  v_empno               emp.empno%TYPE;
  v_ename               emp.ename%TYPE;
  CURSOR c1 IS
    SELECT empno, ename
    FROM   emp;
BEGIN
...

     
   ÁÖ: ÁúÀÇ¿¡¼­ º¯¼ö¸¦ ÂüÁ¶ÇÒ ¼ö ÀÖÁö¸¸ CURSOR ¹®Àå Àü¿¡ ¼±¾ðÇÕ´Ï´Ù.

OPEN ¹®Àå

   ÁúÀǸ¦ ¼öÇàÇÏ°í ÁúÀÇ °Ë»öÁ¶°ÇÀ» ÃæÁ·ÇÏ´Â ¸ðµç ÇàÀ¸·Î ±¸¼ºµÈ  °á°ú ¼Â ( set ) À»    »ý¼ºÇϱâ À§ÇØ Ä¿¼­¸¦ ¿±´Ï´Ù.  Ä¿¼­´Â ÀÌÁ¦ °á°ú ¼Â(set)¿¡¼­ ù¹ø° ÇàÀ» °¡¸®Åµ´Ï´Ù.

   ±¸¹®¿¡¼­
   
        cursor_name             ÀÌÀü¿¡ ¼±¾ðµÈ Ä¿¼­ À̸§ÀÔ´Ï´Ù.

OPEN Àº ´ÙÀ½ÀÛ¾÷À» ¼öÇàÇÕ´Ï´Ù.

   1.   ¹®¸Æ ¿µ¿ª(context area)¿¡ ´ëÇØ µ¿ÀûÀ¸·Î ¸Þ¸ð¸®¸¦ ÇÒ´çÇÏ¿© Áß¿äÇÑ ÇÁ·Î¼¼½Ì          Á¤º¸¸¦ Æ÷ÇÔÇÕ´Ï´Ù.

   2.   SELECT ¹®ÀåÀ» ±¸¹®ºÐ¼® ÇÕ´Ï´Ù.

   3.   ÀԷº¯¼ö¸¦ ¹ÙÀεå ÇÕ´Ï´Ù. - Áï, ±×µéÀÇ ¸Þ¸ð¸® ÁÖ¼Ò¸¦ ȹµæÇÏ¿© ÀÔ·Â º¯¼ö¿¡          ´ëÇÑ °ªÀ» ¼³Á¤ÇÕ´Ï´Ù.

   4.   °á°ú ¼Â(set)À» ½Äº°ÇÕ´Ï´Ù. - Áï,  °Ë»ö Á¶°ÇÀ» ÃæÁ·½ÃÅ°´Â ÇàÀÇ ÁýÇÕÀÔ´Ï´Ù.          OPEN ¹®ÀåÀÌ ½ÇÇàµÉ ¶§ °á°ú ¼Â(set)¿¡ ÀÖ´Â ÇàÀ» º¯¼ö·Î ÀÐ¾î µéÀÌÁö ¾Ê½À´Ï´Ù.          ±×´ë½Å FETCH ¹®ÀåÀÌ ÇàÀ» ÀнÀ´Ï´Ù.

   5.   Æ÷ÀÎÅÍ´Â È°¼º ¼Â(set)¿¡¼­ ù¹ø° Çà ¾Õ¿¡  À§Ä¡ÇÕ´Ï´Ù.

   ÁÖ: Ä¿¼­°¡ °³¹æµÉ ¶§ ÁúÀÇ°¡ ¾Æ¹« Ç൵ ¸®ÅÏÇÏÁö ¾ÊÀ¸¸é, PL/SQL Àº ¿¹¿Ü¸¦ ÀÏÀ¸Å°Áö         ¾Ê½À´Ï´Ù. ±×·¯³ª ÀÎÃâ(fetch)ÈÄ¿¡ Ä¿¼­ÀÇ »óŸ¦ Å×½ºÆ® ÇÒ ¼ö ÀÖ½À´Ï´Ù.

FOR UPDATE ÀýÀ» »ç¿ëÇÏ´Â Ä¿¼­¸¦ ¼±¾ðÇÒ °æ¿ì¿¡´Â, OPEN ¹®ÀåÀº ±× ÇàµéÀ» Àá±Þ´Ï´Ù (lock).

 

 

FETCH ¹®Àå

   FETCH ¹®ÀåÀº °á°ú ¼Â(set)¿¡¼­ Çѹø¿¡ ÇϳªÀÇ ÇàÀ» ÀÐ¾î µéÀÔ´Ï´Ù. °¢ ÀÎÃâ(fetch)    ÈÄ¿¡ Ä¿¼­´Â °á°ú ¼Â(set)¿¡¼­ ´ÙÀ½ ÇàÀ¸·Î ¿òÁ÷ÀÔ´Ï´Ù.
   
   ±¸¹®¿¡¼­,

        cursor_name         ÀÌÀü¿¡ ¼±¾ðµÈ Ä¿¼­ÀÇ À̸§ÀÔ´Ï´Ù.

        variable                 °á°ú¸¦ ÀúÀåÇϱâ À§ÇÑ Ãâ·Â º¯¼öÀÔ´Ï´Ù.

        record_name         ÀÐ¾î µéÀÎ µ¥ÀÌÅÍ°¡ ÀúÀåµÇ´Â ·¹ÄÚµåÀÇ À̸§ÀÔ´Ï´Ù. ·¹ÄÚµå                                     º¯¼ö´Â %ROWTYPE ¼Ó¼ºÀ» ÀÌ¿ëÇÏ¿© ¼±¾ð µÉ ¼ö ÀÖ½À´Ï´Ù.
Áöħ

ÁÖ: FETCH ¹®ÀåÀº ´ÙÀ½ ÀÛ¾÷À» ÀÌÇàÇÕ´Ï´Ù.

   1. È°¼º ¼Â(set)¿¡¼­ ´ÙÀ½ ÇàÀ¸·Î Æ÷ÀÎÅ͸¦ ¿òÁ÷ÀÔ´Ï´Ù.
   2. ÇöÀç Çà¿¡ ´ëÇÑ Á¤º¸¸¦ Ãâ·Â PL/SQL º¯¼ö·Î ÀÐ¾î µéÀÔ´Ï´Ù.
   3. Æ÷ÀÎÅÍ°¡ È°¼º ¼Â(set)ÀÇ ³¡¿¡ À§Ä¡ÇÏ°Ô µÇ¸é Ä¿¼­´Â FOR LOOP¸¦ ºüÁ® ³ª°©´Ï´Ù.

FETCH ¹®Àå (°è¼Ó)

   ÇöÀç ÇàÀÇ °ªÀ» Ãâ·Â º¯¼ö·Î ÀÐ¾î µéÀ̱â À§ÇØ FETCH ¹®ÀåÀ» »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù.
   ÀÎÃâ(fetch) ÈÄ¿¡ ´Ù¸¥ ¹®ÀåµéÀ» ½á¼­ º¯¼ö¸¦ Á¶ÀÛÇÒ ¼ö ÀÖ½À´Ï´Ù.   Ä¿¼­¿Í °ü·ÃµÈ    Áú¿¡ ÀÇÇØ ¸®ÅϵǴ °¢ ¿­ °ª¿¡ ´ëÀÀÇÏ´Â Çش纯¼ö°¡ INTO Àý¿¡ ÀÖ¾î¾ß¸¸ ÇÕ´Ï´Ù. ¶ÇÇÑ    ±×µéÀÇ µ¥ÀÌÅÍ ÇüÀº °°¾Æ¾ß ÇÕ´Ï´Ù.
   
   Ã¹¹ø° 10¸íÀÇ Á¾¾÷¿øÀ» Çϳª¾¿ ÀÐ¾î µéÀÔ´Ï´Ù.
 

DECLARE
  v_empno               emp.empno%TYPE;
  v_ename               emp.ename%TYPE;
  CURSOR c1 IS
    SELECT empno, ename
    FROM   emp;
BEGIN
  OPEN c1;
  FOR i IN 1..10 LOOP
    FETCH c1 INTO v_empno, v_ename;
    ...
  END LOOP;
END ;

CLOSE ¹®Àå

   CLOSE ¹®ÀåÀº Ä¿¼­¸¦ »ç¿ë ÇÒ ¼ö ¾ø°Ô ÇÏ°í °á°ú ¼Â(set)Àº Á¤ÀÇ°¡ ÇØÁ¦µË´Ï´Ù.
   SELECT ¹®ÀåÀÌ ´Ù ó¸®µÈ ¿Ï¼º ÈÄ¿¡ Ä¿¼­¸¦ ´Ý½À´Ï´Ù.  ÇÊ¿äÇÏ´Ù¸é Ä¿¼­¸¦ ´Ù½Ã ¿­ ¼ö    ÀÖ½À´Ï´Ù. ±×·¯¹Ç·Î È°¼º ¼Â(set)À» ¿©·¯ ¹ø ¼³Á¤ ÇÒ ¼ö ÀÖ½À´Ï´Ù.
   
        cursor_name             ÀÌÀü¿¡ ¼±¾ðµÈ Ä¿¼­ÀÇ À̸§ÀÔ´Ï´Ù.

   ÀÏ´Ü ´Ý¾ÆÁø Ä¿¼­¿¡¼­ µ¥ÀÌÅ͸¦ ÀÎÃâ ( fetch ) ÇÏ·Á´Â ½Ãµµ´Â ÇÏÁö ¸¶½Ê½Ã¿À.   ±×·¸Áö    ¾ÈÀ¸¸é INVALID_CURSOR ¿¹¿Ü°¡ ÀϾ°Ô µË´Ï´Ù.

ÁÖ: CLOSE ¹®ÀåÀº context area¸¦ ÇØÁ¦ ÇÕ´Ï´Ù. Ä¿¼­¸¦ ´ÝÁö ¾Ê°í PL/SQL ºí·ÏÀ» Á¾·áÇÏ´Â °ÍÀÌ °¡´ÉÇÏ´Ù ÇÒ Áö¶óµµ ¸®¼Ò½º¸¦ ´Ù½Ã »ç¿ë °¡´ÉÇÏ°Ô Çϱâ À§ÇØ ¸í½ÃÀûÀ¸·Î ¼±¾ðµÈ ÀÓÀÇÀÇ Ä¿¼­¸¦ ´Ý´Â ½À°üÀ» µé¿©¾ß ÇÕ´Ï´Ù. µ¥ÀÌÅͺ£À̽º ¸Å°³º¯¼ö Çʵ忡¼­ OPEN_CURSORS ¸Å°³º¯¼ö¿¡ ÀÇÇØ °áÁ¤µÇ´Â »ç¿ëÀÚ¸¶´Ù ÇØ´çÇÏ´Â Ä¿¼­ÀÇ ¼ö¿¡´Â ÃÖ´ë ÇÑ°è°¡ ÀÖ½À´Ï´Ù. µðÆúÆ®·Î OPEN_CURSORS = 50 ÀÔ´Ï´Ù.
 

...
  FOR i IN 1..10 LOOP
    FETCH c1 INTO v_empno, v_ename;
    ...
  END LOOP;
END;

¸í½ÃÀû Ä¿¼­ ¼Ó¼º

¸í½ÃÀû Ä¿¼­·Î, Ä¿¼­¿¡ ´ëÇØ »óÅ Á¤º¸¸¦ ¾ò±â À§ÇÑ 4°¡Áö ¼Ó¼ºÀÌ ÀÖ½À´Ï´Ù.
Ä¿¼­ ¶Ç´Â Ä¿¼­ º¯¼ö¿¡ ºÙÀ» ¶§, ÀÌ ¼Ó¼ºÀº µ¥ÀÌÅÍ Á¶ÀÛ ¹®ÀåÀÇ ½ÇÇà¿¡ ´ëÇØ À¯¿ëÇÑ Á¤º¸¸¦ ¸®ÅÏÇÕ´Ï´Ù.

ÁÖ: SQL ¹®Àå¿¡¼­ Á÷Á¢ÀûÀ¸·Î Ä¿¼­ ¼Ó¼ºÀ» ÂüÁ¶ÇÒ ¼ö ¾ø½À´Ï´Ù.
 

IF NOT c1%ISOPEN THEN
     OPEN c1;
END IF;
LOOP
    FETCH c1...

  

 DECLARE
     v_empno                      emp.empno%TYPE;
     v_ename                      emp.ename%TYPE;
     CURSOR c1 IS
          SELECT empno, ename
          FROM    emp;
 BEGIN
     OPEN c1;
     LOOP
          FETCH c1 INTO v_empno, v_ename;
          EXIT WHEN c1%ROWCOUNT > 10 OR c1%NOTFOUND;
          ...             
     END LOOP;
     CLOSE c1;
 END;

¸Å°³º¯¼ö µ¥ÀÌÅÍÇüÀº ½ºÄ®¶ó º¯¼öÀÇ µ¥ÀÌÅÍÇü°ú µ¿ÀÏÇÏÁö¸¸, Å©±â´Â Á¦°øÇÏÁö ¾Ê½À´Ï´Ù.¸Å°³º¯¼ö ¸íÀº Ä¿¼­ ÁúÀÇ¿¡¼­ ÂüÁ¶Çϱâ À§ÇÑ °ÍÀÔ´Ï´Ù.  ´ÙÀ½ ¿¹¿¡¼­ , µÎ º¯¼ö¿Í Ä¿¼­°¡ ¼±¾ðµË´Ï´Ù. Ä¿¼­´Â µÎ ¸Å°³º¯¼ö·Î Á¤Àǵ˴ϴÙ.
 

DECLARE
   job_emp      emp.job%TYPE := 'CLERK';
   v_ename      emp.ename%TYPE;
   CURSOR c1 (v_deptno NUMBER, v_job VARCHAR2) is
      SELECT ...     

´ÙÀ½ ¹®ÀåÀº µÑ ´Ù Ä¿¼­¸¦ ¿±´Ï´Ù.
 

OPEN c1(10, job_emp);
OPEN c1(20, 'ANALYST');    

FOR UPDATE Àý

ÁÖ: ¿À¶óŬ ¼­¹ö´Â SELECT FOR UPDATE¿¡¼­  ÇÊ¿ä·Î ÇÏ´Â ÇàÀÇ Àá±ÝÀ» ¾òÀ» ¼ö ¾ø´Ù¸é, ¸·¿¬ÇÏ°Ô ±â´Ù¸³´Ï´Ù. SELECT FOR UPDATE ¹®Àå¿¡¼­  NOWAIT ÀýÀ» »ç¿ëÇÒ ¼ö ÀÖ°í ·çÇÁ¿¡¼­  Àá±ÝÀ» ¾ò´Âµ¥ ½ÇÆÐÇÏ¿© »ý±â´Â ¿À·ù Äڵ带 Å×½ºÆ®ÇÒ ¼ö ÀÖ½À´Ï´Ù.  ±×·¯¹Ç·Î PL/SQL ºí·ÏÀ» Á¾·áÇϱâ Àü¿¡ Ä¿¼­  OPENÀ» n¹ø ´Ù½Ã ½ÃµµÇÒ ¼ö ÀÖ½À´Ï´Ù. ´ëÇü Å×À̺íÀ̶ó ¸é, Å×À̺íÀÇ ¸ðµç ÇàÀ» Àá±×±â À§ÇØ LOCK TABLE ¹®ÀåÀ» »ç¿ëÇÔÀ¸·Î½á  ´õ ³ªÀº ¼º´ÉÀ» ¾òÀ» ¼öµµ ÀÖ½À´Ï´Ù. ±×·¯³ª LOCK TABLEÀ» »ç¿ëÇÒ ¶§, WHERE CURRENT OF ÀýÀ» »ç¿ëÇÒ ¼ö ¾ø°í WHERE column = identifier¸¦ »ç¿ëÇØ¾ß ÇÕ´Ï´Ù.

FOR UPDATE OF ÀýÀÌ ¿­À» ÂüÁ¶ ÇÏ´Â °ÍÀÌ ÇʼöÀûÀÌÁö´Â ¾ÊÁö¸¸ ÀÌ°ÍÀº ´õ ½±°Ô Àаí À¯ÁöÇÒ ¼ö ÀÖ°Ô Çϱâ À§ÇØ  ÃßõµÇ¾îÁý´Ï´Ù.

WHERE CURRENT OF Àý

¸í½ÃÀû Ä¿¼­¿¡¼­ ÇöÀç ÇàÀ» ÂüÁ¶ÇÒ ¶§ WHERE CURRENT OF ÀýÀ» »ç¿ëÇÕ´Ï´Ù. À̸¦ ÅëÇؼ­ ¸í½ÃÀûÀ¸·Î ROWID¸¦ ÂüÁ¶ÇÏÁö ¾Ê°í ÇöÀç ó¸® ÁßÀÎ ÇàÀ» °»½ÅÇÏ°í, »èÁ¦ÇÒ ¼ö ÀÖ°Ô ÇØ ÁÝ´Ï´Ù. ÇàÀ» OPEN ½Ã¿¡ Àá±â°Ô Çϱâ À§Çؼ­ Ä¿¼­ ÁúÀÇ¿¡ FOR UPDATE ÀýÀ» Æ÷ÇÔÇØ¾ß ÇÕ´Ï´Ù.

±¸¹®¿¡¼­,

cursor

¼±¾ðµÈ Ä¿¼­ÀÇ À̸§ÀÔ´Ï´Ù. Ä¿¼­´Â FOR UPDATE Àý·Î ¼±¾ðµÇ¾îÁ³¾î¾ß ÇÕ´Ï´Ù.

X Á¤´ä:A


X Á¤´ä:D


X Á¤´ä:C


X Á¤´ä:A