PL/SQL์ด๋ ์ค๋ผํด์์ ์ ๊ณตํ๋ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ก Procedural Language/SQL์ ์ฝ์์ด๋ค. ์ผ๋ฐ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ์ธ ์์๋ฅผ ๊ฑฐ์ ๋ค ๊ฐ์ง๊ณ ์์ด์ ์ค๋ฌด์์ ์๊ตฌ๋๋ ์ ์ฐจ์ ์ธ ๋ฐ์ดํฐ ์ฒ๋ฆฌ๋ฅผ ๋ค ํ ์ ์๋ค. ๋ฐ์ดํฐ ํธ๋์ญ์ ์ฒ๋ฆฌ๋ฅ๋ ฅ์ด๋ ์ ๋ณด๋ณดํธ, ๋ฐ์ดํฐ์ ๋ํ ๋ณด์, ์์ธ์ฒ๋ฆฌ ๊ธฐ๋ฅ, ๊ฐ์ฒด์งํฅ ๋ฑ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ด๋ จ๋ ์ค์ํ ๋ชจ๋ ๊ธฐ๋ฅ์ ์ง์ํ๊ธฐ ๋๋ฌธ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ๋ฌด๋ฅผ ์ฒ๋ฆฌํ๊ธฐ์ ์ต์ ํ๋ ์ธ์ด์ด๋ค.
PL/SQL ๊ธฐ๋ณธ ๊ตฌ์กฐ
* Declare(์ ์ธ๋ถ) : ๋ชจ๋ ๋ณ์๋ ์์๋ฅผ ์ ์ธํ๋ ๋ถ๋ถ
* Executable(์คํ๋ถ) : ์ ์ด๋ฌธ, ๋ฐ๋ณต๋ฌธ, ํจ์์ ์ ๋ฑ์ ๋ก์ง์ ๊ธฐ์
* Exception(์์ธ ์ฒ๋ฆฌ๋ถ) : ์คํ ๋์ค ์๋ฌ ๋ฐ์ ์ ํด๊ฒฐํ๋ ๋ฌธ์ฅ๋ค์ ๊ธฐ์
+) ๋ธ๋ก ๋ด์ ๊ฐ ๋ถ๋ถ์ ํฌํจ๋๋ ๋ช ๋ น๋ค ์ค DECLARE, BEGIN, EXCEPTION๊ณผ ๊ฐ์ ์์ฝ์ด๋ค์ ์ธ๋ฏธ์ฝ๋ก (;)์ผ๋ก ๋๋์ง ์์ง๋ง ๋๋จธ์ง ๋ช ๋ น์ด๋ค์ SQL ๋ฌธ์ฅ์ฒ๋ผ ์ธ๋ฏธ์ฝ๋ก ์ผ๋ก ๋๋๋ค.
โผ PL/SQL์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฒ๋ฆฌ๋ PL/SQL ๋ฌธ์ฅ์ ๊ฒฐ๊ณผ๋ฅผ ํ๋ฉด์ ์ถ๋ ฅํ์ง ์๋๋ค. ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๊ธฐ ์ํด์ SET SERCEROUTPUT ON;
๊ณผ ๊ฐ์ ์ฌ์ ์์
์ด ํ์ํ๋ค.
โผ PL/SQL ๋ด์์์ SELECT ๋ฌธ์ฅ ์ฌ์ฉ
SELECT select_list
INTO variable_name1, variable_name2 ...
FROM table
[WHERE condition];
-> INTO ์์ด ๊ทธ๋ฅ ์ฌ์ฉํ ์๋ ์๋ค. ๋ฌธ๋ฒ์ ์ ๊ธฐ์ตํด๋์.
โผ Reference ๋ณ์ (์ฐธ์กฐ๋ณ์)
๋ณ์๋ช
ํ
์ด๋ธ.์ปฌ๋ผ%TYPE
>>> ํ
์ด๋ธ์ ์ปฌ๋ผ๊ณผ ๋์ผํ ๋ฐ์ดํฐํ์ผ๋ก ์ ์ธ
๋ณ์๋ช
ํ
์ด๋ธ%ROWTYPE
>>> ํ
์ด๋ธ์ ์ฌ๋ฌ ์ปฌ๋ผ์ ํ๊บผ๋ฒ์ ์ ์ฅํ ๋ณ์๋ก ์ ์ธ
โผ ์ ์ด๋ฌธ
IF ๋ฌธ
IF (์กฐ๊ฑด) THEN ์คํ๋ฌธ์ฅ;
ELSIF (์กฐ๊ฑด) THEN ์คํ๋ฌธ์ฅ;
END IF;
>>> ๋ค๋ฅธ ์กฐ๊ฑด์ ๋ฃ์ ๋ ELSIF
์์ฝ์ด๋ฅผ ์ฌ์ฉํด์ผํ๊ณ , IF ๋ฌธ ์ข
๋ฃ ์์๋ ๋ฐ๋์ END IF
๋ฅผ ๋ฃ์ด์ฃผ์ด์ผ ํ๋ค.
๋ฐ๋ณต๋ฌธ
LOOP
PL/SQL ๋ฌธ์ฅ;
PL/SQL ๋ฌธ์ฅ;
EXIT ์กฐ๊ฑด;
END LOOP;
>>> BASIC LOOP ๋ฐ๋ณต๋ฌธ์ ๋ฐ๋ณต ํ์๋ฅผ ์ ์ ์๋ ๊ฒฝ์ฐ์ ์ฌ์ฉํ๊ณ ๋ฌธ์ฅ์ ๋จผ์ ์ํํ ํ์ ์กฐ๊ฑด์ ํ์ธํ๋ค.
WHILE ๋ฐ๋ณต๋ฌธ
While ์กฐ๊ฑด LOOP
PL/SQL ๋ฌธ์ฅ
PL/SQL ๋ฌธ์ฅ
END LOOP;
>>> BASIC LOOP๋ฌธ์ ๋์ค์ ์กฐ๊ฑด์ ๊ฒ์ํ์ง๋ง WHILE๋ฌธ์ ์์๋ถํฐ ์กฐ๊ฑด์ ๋จผ์ ๊ฒ์ฌํ ํ PL/SQL ๋ฌธ์ฅ์ ์ํํ๋ค. ์ฆ BASIC LOOP ๋ฌธ์ ์กฐ๊ฑด์ด ํ๋ ค๋ PL/SQL ๋ฌธ์ฅ์ด 1ํ๋ ์คํ๋์ง๋ง WHILE๋ฌธ์ ์์ ์คํ์ด ๋์ง ์๋๋ค.
FOR ๋ฐ๋ณต๋ฌธ
FOR ๋ฐ๋ณตํ ๋ณ์ IN start...end LOOP
statement1;
statement2;
...
END LOOP;
>>> FOR ๋ฐ๋ณต๋ฌธ์ ์๋ฐ์ ํฅ์๋ FOR๋ฌธ๊ณผ ๋น์ทํ๋ค. ๋ฐ๋ณต ํ์๋ฅผ ์ง์ ๊ฐ๋ฅํ๊ณ ๋ฐ๋ณตํ ๋ณ์๋ฅผ ๋ฏธ๋ฆฌ ์ ์ธํ์ง ์์๋ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค. (PL/SQL์์๋ ์ฌ์ฉํ ๋ณ์๋ฅผ ์ฌ์ฉํ๊ธฐ ์ ์ ๋ฏธ๋ฆฌ DECLARE ๋ถ๋ถ์์ ์ ์ธํด์ผ ํจ.)
>>> ์ญ์์ผ๋ก ๋ฐ๋ณตํ๋ ค๋ฉฐ๋
IN ๋ค์์ REVERSE ํค์๋๋ฅผ ๋ฃ์ผ๋ฉด ๋๋๋ฐ, ์ด ๋ ์ฃผ์ํ ์ ์ REVERSE๋ฅผ ์ฐ๊ณ ์์๋ฒํธ์ ๋ ๋ฒํธ๋ ์์ ์ซ์๋ถํฐ ์จ์ผ ํ๋ค๋ ๊ฒ์ด๋ค.
โผPL/SQL Cursor
์ค๋ผํด ์๋ฒ์์๋ SQL๋ฌธ์ ์คํํ ๋๋ง๋ค ์ฒ๋ฆฌ๋ฅผ ์ํ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ฌ์ฉํ๋ค. ์ฆ ์ฌ์ฉ์๊ฐ ์์ฒญํ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฒํผ ์บ์ฌ์์ ์ปค์๋ก ๋ณต์ฌํด ์จ ํ ์ปค์์์ ์ํ๋ ๋ฐ์ดํฐ๋ฅผ ์ถ์ถํ์ฌ ํ์ ์์ ์ ํ๊ฒ ๋๋ค๋ ๋ป์ด๋ค. SQL ์ปค์๋ ํฌ๊ฒ ๋ฌต์์ ์ปค์์ ๋ช ์์ ์ปค์๋ก ๋๋ ์ ์๋ค. ๋ฌต์์ ์ปค์๋ ์ค๋ผํด์์ ์๋์ ์ผ๋ก ์ ์ธํด์ฃผ๋ SQL ์ปค์๋ก์, ์ฌ์ฉ์๋ ์์ฑ ์ ๋ฌด๋ฅผ ์ ์ ์๋ค. ๋ช ์์ ์ปค์๋ ์ฌ์ฉ์๊ฐ ์ ์ธํ์ฌ ์์ฑ ํ ์ฌ์ฉํ๋ SQL ์ปค์๋ก, ์ฃผ๋ก ์ฌ๋ฌ๊ฐ์ ํ์ ์ฒ๋ฆฌํ๊ณ ์ ํ ๊ฒฝ์ฐ ์ฌ์ฉํ๋ค. ๋ช ์์ ์ปค์ ์ ์ธ์ ๋ค์๊ณผ ๊ฐ๋ค.
๋ช ์์ ์ปค์ ์ ์ธ(Declaration)
CURSOR ์ปค์๋ช
IS
์ปค์์ ๋ด๊ณ ์ถ์ ๋ด์ฉ์ ๊ฐ์ ธ์ค๋ ์๋ธ์ฟผ๋ฆฌ
Cursor FOR Loop๋ฌธ ํ์ฉ
FOR ๋ณ์๋ช
IN ์ปค์๋ช
LOOP
statement1;
statement2;
...
END LOOP;