************** ºÎ¼/Á÷¿ø ¸®Æ÷Æ® ******************
ºÎ¼ : ºÎ¼¹øÈ£ ºÎ¼¸í
À§Ä¡
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 ¹®Àå¿¡ ´ëÇÑ Á¤º¸¸¦ ¾ò±â À§ÇÑ Ä¿¼ ¼Ó¼ºÀ» »ç¿ëÇÒ ¼ö´Â
ÀÖ½À´Ï´Ù.
¸í½ÃÀû Ä¿¼ ¸í½ÃÀû Ä¿¼ ÇÔ¼ö
|
ÁÖ: ¾Ï½ÃÀû Ä¿¼¿¡ ´ëÇÑ ÀÎÃâ(fetch)Àº ¹è¿
ÀÎÃâ(fetch)À̸ç, µÎ ¹ø° ÇàÀÇ Á¸Àç´Â
¿©ÀüÈ÷ TOO_MANY_ROWS ¿¹¿Ü°¡ ¹ß»ýÇÕ´Ï´Ù. ±×·¯¹Ç·Î, ´ÙÁß
ÀÎÃâ(fetch)À»
¼öÇàÇÏ°í ÀÛ¾÷ ¿µ¿ª¿¡¼ ±¸¹® ºÐ¼®µÈ ÁúÀǸ¦ Àç½ÇÇà Çϱâ À§ÇØ ¸í½ÃÀû Ä¿¼¸¦ »ç¿ëÇÒ
¼ö
ÀÖ½À´Ï´Ù.
¸í½ÃÀû Ä¿¼
¼±¾ð ±¸¹®¿¡¼
|
Ä¿¼ ¼±¾ð (°è¼Ó)
|
ÁÖ: ÁúÀÇ¿¡¼ º¯¼ö¸¦ ÂüÁ¶ÇÒ ¼ö ÀÖÁö¸¸ 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 |
CLOSE ¹®Àå
CLOSE
¹®ÀåÀº Ä¿¼¸¦ »ç¿ë ÇÒ ¼ö ¾ø°Ô
ÇÏ°í °á°ú ¼Â(set)Àº Á¤ÀÇ°¡ ÇØÁ¦µË´Ï´Ù.
SELECT ¹®ÀåÀÌ ´Ù ó¸®µÈ ¿Ï¼º ÈÄ¿¡ Ä¿¼¸¦ ´Ý½À´Ï´Ù. ÇÊ¿äÇÏ´Ù¸é Ä¿¼¸¦ ´Ù½Ã ¿ ¼ö ÀÖ½À´Ï´Ù.
±×·¯¹Ç·Î È°¼º ¼Â(set)À» ¿©·¯ ¹ø ¼³Á¤ ÇÒ ¼ö ÀÖ½À´Ï´Ù.
cursor_name ÀÌÀü¿¡
¼±¾ðµÈ Ä¿¼ÀÇ
À̸§ÀÔ´Ï´Ù.
ÀÏ´Ü ´Ý¾ÆÁø Ä¿¼¿¡¼ µ¥ÀÌÅ͸¦ ÀÎÃâ ( fetch ) ÇÏ·Á´Â ½Ãµµ´Â ÇÏÁö ¸¶½Ê½Ã¿À. ±×·¸Áö ¾ÈÀ¸¸é
INVALID_CURSOR ¿¹¿Ü°¡ ÀϾ°Ô µË´Ï´Ù.
ÁÖ: CLOSE ¹®ÀåÀº context area¸¦ ÇØÁ¦ ÇÕ´Ï´Ù. Ä¿¼¸¦ ´ÝÁö ¾Ê°í PL/SQL ºí·ÏÀ»
Á¾·áÇÏ´Â °ÍÀÌ °¡´ÉÇÏ´Ù ÇÒ Áö¶óµµ ¸®¼Ò½º¸¦ ´Ù½Ã »ç¿ë °¡´ÉÇÏ°Ô Çϱâ À§ÇØ ¸í½ÃÀûÀ¸·Î ¼±¾ðµÈ ÀÓÀÇÀÇ Ä¿¼¸¦ ´Ý´Â ½À°üÀ» µé¿©¾ß ÇÕ´Ï´Ù.
µ¥ÀÌÅͺ£À̽º ¸Å°³º¯¼ö Çʵ忡¼ OPEN_CURSORS ¸Å°³º¯¼ö¿¡ ÀÇÇØ °áÁ¤µÇ´Â »ç¿ëÀÚ¸¶´Ù ÇØ´çÇÏ´Â Ä¿¼ÀÇ ¼ö¿¡´Â ÃÖ´ë ÇÑ°è°¡ ÀÖ½À´Ï´Ù.
µðÆúÆ®·Î OPEN_CURSORS = 50 ÀÔ´Ï´Ù.
... |
¸í½ÃÀû Ä¿¼ ¼Ó¼º ¸í½ÃÀû Ä¿¼·Î, Ä¿¼¿¡ ´ëÇØ »óÅ Á¤º¸¸¦ ¾ò±â À§ÇÑ
4°¡Áö ¼Ó¼ºÀÌ ÀÖ½À´Ï´Ù.
|
DECLARE |
¸Å°³º¯¼ö µ¥ÀÌÅÍÇüÀº ½ºÄ®¶ó º¯¼öÀÇ µ¥ÀÌÅÍÇü°ú µ¿ÀÏÇÏÁö¸¸, Å©±â´Â Á¦°øÇÏÁö
¾Ê½À´Ï´Ù.¸Å°³º¯¼ö ¸íÀº Ä¿¼
ÁúÀÇ¿¡¼ ÂüÁ¶Çϱâ À§ÇÑ °ÍÀÔ´Ï´Ù. ´ÙÀ½ ¿¹¿¡¼ , µÎ º¯¼ö¿Í Ä¿¼°¡ ¼±¾ðµË´Ï´Ù. Ä¿¼´Â µÎ ¸Å°³º¯¼ö·Î Á¤Àǵ˴ϴÙ.
|
´ÙÀ½ ¹®ÀåÀº µÑ ´Ù Ä¿¼¸¦ ¿±´Ï´Ù.
OPEN c1(10, job_emp); |
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 Àý·Î ¼±¾ðµÇ¾îÁ³¾î¾ß ÇÕ´Ï´Ù. |