************** ºÎ¼/Á÷¿ø ¸®Æ÷Æ® ******************
ºÎ¼ : ºÎ¼¹øÈ£ ºÎ¼¸í
À§Ä¡
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;
PL/SQLÀ» »ç¿ëÇÏ¿© µ¥ÀÌÅÍ Àбâ
µ¥ÀÌÅͺ£À̽º¿¡¼ µ¥ÀÌÅ͸¦ ÀÐ¾î µéÀ̱â
À§ÇØ SELECT ¹®ÀåÀ» »ç¿ëÇÕ´Ï´Ù.
±¸¹®¿¡¼,
select_list |
ÃÖ¼ÒÇÑ ÇÑ °³ ÀÌ»óÀÇ ¿ÀÇ ¸ñ·ÏÀ̸ç, SQL Ç¥Çö½Ä, Çà ÇÔ¼ö, ±×·ì ÇÔ¼ö¸¦ Æ÷ÇÔÇÒ ¼ö ÀÖ½À´Ï´Ù. |
variable_name |
ÀÐ¾î µéÀÎ °ªÀ» ÀúÀåÇϱâ À§ÇÑ ½ºÄ®¶ó º¯¼öÀÔ´Ï´Ù. |
record_name |
ÀÐ¾î µéÀÎ °ªÀ» ÀúÀåÇϱâ À§ÇÑ PL/SQL RECORDÀÔ´Ï´Ù. |
table |
µ¥ÀÌÅͺ£À̽º Å×ÀÌºí ¸íÀ» ÁöÁ¤ÇÕ´Ï´Ù. |
condition |
PL/SQL º¯¼ö¿Í »ó¼ö¸¦ Æ÷ÇÔÇÏ¿© ¿¸í, Ç¥Çö½Ä, »ó¼ö, ºñ±³¿¬»êÀÚ·Î ±¸¼ºµË´Ï´Ù. |
SELECT ¹®Àå¿¡ ´ëÇÑ ¸ðµç ±¸¹®Çü½ÄÀ» ÀÌ¿ëÇϽʽÿÀ.
È£½ºÆ® º¯¼ö´Â ÄÝ·ÐÀ¸·Î Á¢µÎ¾î¸¦ ºÙ¿©¾ß
ÇÔÀ» ¸í½ÉÇϽʽÿÀ.
INTO Àý |
Áöħ
PL/SQL¿¡¼ µ¥ÀÌÅ͸¦ ÀÐ¾î µéÀ̱â À§ÇØ ÀÌ ÁöħµéÀ»
ÀÌÇàÇÕ´Ï´Ù.
|
µ¥ÀÌÅÍ »ðÀÔ
ÁÖ: INSERT ¸í·É¿¡¼ ½Äº°ÀÚ¿Í ¿ À̸§¿¡ ¸ðÈ£¼ºÀÌ ÀÖ´Â °ÍÀº ºÒ°¡´ÉÇÕ´Ï´Ù. INSERT Àý¿¡ ÀÖ´Â ½Äº°ÀÚ´Â µ¥ÀÌÅͺ£À̽º ¿ À̸§À̾î¾ß ÇÕ´Ï´Ù. |
µ¥ÀÌÅÍ °»½Å°ú »èÁ¦
ÁöÁ¤ ¿¬»êÀÚÀÇ ÁÂÃø¿¡ ÀÖ´Â ½Äº°ÀÚ´Â Ç×»ó µ¥ÀÌÅÍ º£À̽º ¿ÀÌÁö¸¸,
¿À¸¥ÂÊ¿¡ ÀÖ´Â ½Äº°ÀÚµµ µ¥ÀÌÅͺ£À̽º ¿ ¶Ç´Â PL/SQL º¯¼öµµ µÉ ¼ö Àֱ⠶§¹®¿¡ UPDATE ¹®ÀåÀÇ SET Àý¿¡¼ ¸ðÈ£¼ºÀÌ
Á¸ÀçÇÒ ¼ö ÀÖ½À´Ï´Ù. PL/SQL¿¡¼ÀÇ SELECT ¹®Àå°ú ´Þ¸® ¼öÁ¤µÈ ÇàÀÌ ¾øÀ¸¸é ¿¡·¯°¡ ¹ß»ýÇÏÁö ¾Ê½À´Ï´Ù.
ÁÖ: PL/SQL º¯¼ö ÁöÁ¤Àº Ç×»ó := À», SQL ¿ ÁöÁ¤Àº Ç×»ó = À» »ç¿ëÇÕ´Ï´Ù. ¿¸í°ú ½Äº°ÀÚ¸íÀÌ
WHERE Àý¿¡¼ °°´Ù¸é, ¿À¶óŬ ¼¹ö´Â À̸§¿¡ ´ëÇؼ ¿ì¼± µ¥ÀÌÅͺ£À̽º¸¦ Á¶»çÇÔÀ» »ó±âÇϽʽÿÀ.
DECLARE |
À̸§ ÁöÁ¤ ±Ô¾à
PL/SQL º¯¼ö¸í°ú µ¥ÀÌÅͺ£À̽º ¿¸íÀ» ±¸ºÐÇØ
ÁÖ´Â À̸§ ÁöÁ¤ ±Ô¾àÀ» µû¸§À¸·Î½á WHERE Àý¿¡¼ ¸ðÈ£¼ºÀ» ȸÇÇÇÕ´Ï´Ù.
½½¶óÀ̵忡¼ º¸¿©ÁØ ¿¹´Â ´ÙÀ½°ú °°ÀÌ Á¤Àǵ˴ϴÙ. ÃâÇÏ ÀÏÀÚ°¡ ¿À´ÃÀÎ °æ¿ì, ORD
Å×ÀÌºí ¿¡¼ ÁÖ¹®ÀÏ°ú ÃâÇÏ ÀÏÀÚ¸¦ ÀÐ¾î µéÀÔ´Ï´Ù.
PL/SQLÀº ½Äº°ÀÚ°¡ µ¥ÀÌÅͺ£À̽º³»ÀÇ ¿ÀÎÁö ¾Æ´ÑÁö¸¦ ¸ÕÀú
È®ÀÎÇÏ°í, ¾Æ´Ï¸é PL/SQLÀÇ ½Äº°ÀÚ°¡ µÇ´Â °ÍÀ¸·Î °¡Á¤ÇÕ´Ï´Ù.
ÁÖ: SELECT Àý¿¡¼ ÀÓÀÇÀÇ
½Äº°ÀÚ´Â µ¥ÀÌÅͺ£À̽º ¿ À̸§À̾î¾ß Çϱ⠶§¹®¿¡ SELECTÀý¿¡¼ ¸ðÈ£¼ºÀÇ °¡´É¼ºÀº ¾ø½À´Ï´Ù. INTO Àý¿¡¼ ½Äº°ÀÚ´Â PL/SQL
º¯¼ö¿©¾ß Çϱ⠶§¹®¿¡ INTO Àý¿¡¼ ¸ðÈ£¼ºÀÇ °¡´É¼ºÀº ¾ø½À´Ï´Ù. WHERE Àý¿¡¼¸¸ È¥¶õÀÇ °¡´É¼ºÀÌ ÀÖ½À´Ï´Ù.
NO_DATA_FOUND¿Í ´Ù¸¥ ¿¹¿Ü¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ ³»¿ëÀº ´ÙÀ½ Àå¿¡¼ ¼³¸íµË´Ï´Ù.
COMMIT°ú ROLLBACK SQL ¹®ÀåÀ¸·Î Æ®·£Àè¼Ç ³í¸®¸¦ Á¦¾îÇÔÀ¸·Î½á µ¥ÀÌÅͺ£À̽º¸¦ ¿µ±¸ÀûÀ¸·Î
º¯°æÇÏ°Ô ÇÕ´Ï´Ù. ¿À¶óŬ ¼¹ö¿¡¼¿Í ¸¶Âù°¡Áö·Î, DML Æ®·£Àè¼ÇÀº COMMIT ¶Ç´Â ROLLBACKÀ» ¼öÇàÇÑ ´ÙÀ½¿¡ ½ÃÀÛÇÏ°í ¼º°øÀûÀÎ
COMMIT ¶Ç´Â ROLLBACK ´ÙÀ½¿¡ Á¾·áÇÕ´Ï´Ù. ÀÌ ÀÛ¾÷Àº PL/SQL ºí·Ï¿¡¼ ¹ß»ýÇÒ ¼ö Àְųª È£½ºÆ® ȯ°æ( ¿¹¸¦ µé¸é,
SQL*Plus ¼½¼Ç Á¾·á´Â ÀÚµ¿ÀûÀ¸·Î ¹Ì°á Æ®·£Àè¼ÇÀ» Ä¿¹Ô ) ¿¡¼ À̺¥Æ®ÀÇ °á°ú·Î¼ ¹ß»ýÇÒ ¼ö ÀÖ½À´Ï´Ù.
COMMIT ¹®Àå
COMMITÀº µ¥ÀÌÅͺ£À̽º¿¡ ´ëÇÑ ¸ðµç ¹Ì°á º¯°æÀ» ¿µ±¸ÈÇÔÀ¸·Î½á ÇöÀç Æ®·£Àè¼ÇÀ»
Á¾·áÇÕ´Ï´Ù.
±¸¹®
COMMIT [WORK]; |
ROLLBACK [WORK]; |
¿©±â¼: WORK ANSI Ç¥ÁØÀ» µû¸£±â À§ÇØ
»ç¿ëÇÕ´Ï´Ù.
ÁÖ: È£½ºÆ® ȯ°æ¸¶´Ù ±× »ç¿ë¿¡ ´ëÇØ ¾à°£ÀÇ Á¦ÇÑÀÌ ÀÖÀ» ¼ö ÀÖÁö¸¸ Æ®·£Àè¼Ç Á¦¾î ¸í·ÉÀº PL/SQL¿¡¼ ¸ðµÎ À¯È¿ÇÕ´Ï´Ù. ºí·Ï¿¡¼ ¶ÇÇÑ ¸í½ÃÀûÀ¸·Î Àá±Ý ¸í·É (LOCK TABLE °ú SELECT ... FOR UPDATE °°Àº)À» ÀÌ¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. (ÈÄ¼Ó Àå¿¡¼ FOR-UPDATE¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ ³»¿ëÀº ¼³¸íÇÒ °ÍÀÔ´Ï´Ù.) ±×°ÍµéÀº Æ®·£Àè¼Ç Á¾·á±îÁö ¿µÇâÀ» ¹ÌÄ¡¸ç ÇϳªÀÇ PL/SQL ºí·ÏÀº ÇϳªÀÇ Æ®·£Àè¼ÇÀ» ¹Ýµå½Ã ÀǹÌÇÏÁö´Â ¾Ê½À´Ï´Ù.
SQL Ä¿¼ ¼Ó¼º
SQL Ä¿¼ ¼Ó¼ºÀº ¾Ï½ÃÀû Ä¿¼°¡ ¸¶Áö¸·À¸·Î »ç¿ëµÈ ¶§ ÀÏ¾î³ ÀÏÀ»
Æò°¡ÇÒ ¼ö ÀÖµµ·Ï ÇØ ÁÝ´Ï´Ù. PL/SQL ¹®Àå¿¡¼ ÀÌ ¼Ó¼ºÀ» ÇÔ¼öó·³ »ç¿ëÇÕ´Ï´Ù. À̰͵éÀº SQL ¹®Àå¿¡¼ »ç¿ëÇÒ ¼ö ¾ø½À´Ï´Ù. µ¥ÀÌÅÍ Á¶ÀÛ
¹®ÀåÀÇ ½ÇÇà¿¡ ´ëÇÑ Á¤º¸¸¦ ¾ò±â À§ÇØ ºí·ÏÀÇ ¿¹¿Ü ¼½¼Ç¿¡¼, SQL%ROWCOUNT, SQL%FOUND, SQL%NOTFOUND,
±×¸®°íSQL%ISOPEN ¼Ó¼ºÀ» »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. PL/SQLÀº ¿¹¿Ü¸¦ ¸®ÅÏÇÏ´Â SELECT ¹®Àå°ú ´Þ¸®, ¾Æ¹«·± Çà¿¡ ¿µÇâÀ» ¹ÌÄ¡Áö ¾Ê´Â
DML ¹®ÀåÀ» ½ÇÆÐÇÑ °ÍÀ¸·Î °£ÁÖÇÏÁö ¾Ê½À´Ï´Ù.