PL/SQL์ด๋?
ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ํน์ฑ์ ๊ฐ์ง๋ SQL์ ํ์ฅ์ด๋ฉฐ, ๋ฐ์ดํฐ ์กฐ์๊ณผ ์ง์ ๋ฌธ์ฅ์
PL/SQL์ ์ ์ฐจ์ ์ฝ๋ ์์ ํฌํจ๋๋ค.
์ฃผ๋ก ์๋ฃ ๋ด๋ถ์์ SQL๋ช ๋ น๋ฌธ๋ง์ผ๋ก ์ฒ๋ฆฌํ๊ธฐ์๋ ๋ณต์กํ ์๋ฃ์ ์ ์ฅ์ด๋
ํ๋ก์์ ์ ํธ๋ฆฌ๊ฑฐ ๋ฑ์ ์์ฑํ๋๋ฐ ์ฌ์ฉ๋๋ค.
PL/SQL์ ํ๋ก๊ทธ๋จ์ ๋ ผ๋ฆฌ์ ์ธ ๋ธ๋ก์ผ๋ก ๋๋๋ ๊ตฌ์กฐํ ๋ ๋ธ๋ก์ธ์ด์ด๋ค
PL/SQL ๋ธ๋ก์ ์ ์ธ๋ถ(์ ํ์ ),์คํ๋ถ(ํ์์ ),์์ธ ์ฒ๋ฆฌ๋ถ(์ ํ์ )๋ก ๊ตฌ์ฑ๋์ด ์๊ณ ,
BEGIN๊ณผ END ํค์๋๋ ๋ฐ๋์ ๊ธฐ์ ํด ์ฃผ์ด์ผ ํ๋ค.
PL/SQL ํ๋ก๊ทธ๋๋ฐ ๋จ์ |
PL/SQL ์ต๋ช ๋ธ๋ก |
ํจ์ |
ํ๋ก์์ |
ํจ๊ธฐ์ง : ํจํค์ง ๋ช ์ธ, ํจํค์ง ๋ฐ๋ |
ํธ๋ฆฌ๊ฑฐ |
๊ธฐ๋ณธ๋ฌธ๋ฒ
--PL/SQL SELECT
SELECT ์ปฌ๋ผ, ์ปฌ๋ผ INTO ๋ณ์, ๋ณ์, FROM ํ
์ด๋ธ WHERE ์กฐ๊ฑด;
%TYPE ์์ฑ : ํ
์ด๋ธ์ ์ปฌ๋ผ์ ์ฐธ์กฐํ๋ ์์ฑ
DECLARE
--๋ณ์ ์ ์ธ
vname emp.name%TYPE;
vpay NUMBER;
BEGIN
SELECT name,sal+bonus INTO vname,vpay
FROM emp
WHERE empNO = '1001';
DBMS_OUTPUT.PUT_LINE('์ด๋ฆ :' || vname);
DBMS_OUTPUT.PUT_LINE('๊ธ์ฌ :' || vpay);
END;
DECLARE : ์คํ๋ถ์์ ์ฐธ์กฐํ ๋ชจ๋ ๋ณ์,์์,์ปค์,exception์ ์ ์ธํ๋ค.
BEGIN ~ END : ์ฒ๋ฆฌํ SQL์ด๋ PL/SQL ๋ธ๋ก์ ๊ธฐ์ ํ๋ค.
EXCEPTION : ์คํ๋ถ์์ ์๋ฌ๊ฐ ๋ฐ์ํ์๋ ์ํ๋ ๋ฌธ์ฅ์ ๊ธฐ์ ํ๋ค.
--%ROWTYPE : ํ
์ด๋ธ ๋๋ ๋ทฐ์ ํ์ ์ฐธ์กฐํ๋ ๋ ์ฝ๋ ์ ์ธ
DECLARE
vrec emp%ROWTYPE;
BEGIN
SELECT name,sal INTO vrec.name,vrec.sal
FROM emp
WHERE empNO = '1001';
DBMS_OUTPUT.PUT_LINE('์ด๋ฆ :' || vrec.name);
DBMS_OUTPUT.PUT_LINE('๊ธ์ฌ :' || vrec.sal);
END;
- %TYPE : ์์,๋ณ์,ํ๋ ๋๋ ๋งค๊ฐ ๋ณ์๋ฅผ ์ด์ ์ ์ ์ธ๋ ๋ณ์,ํ๋,๋ ์ฝ๋,์ค์ฒฉ ํ ์ด๋ธ ๋๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ปฌ๋ผ๊ณผ ๋์ผํ ๋ฐ์ดํฐ ํ์์ผ๋ก ์ ์ธํ๋ค.
- %ROWTYPE
- ํ ์ด๋ธ ๋๋ ๋ทฐ์ ํ์ ์ฐธ์กฐํ๋ ๋ ์ฝ๋๋ฅผ ์ ์ธํ๋ค.
- ๋ ์ฝ๋์๋ ์ฐธ์กฐ๋ ํ ์ด๋ธ ๋๋ ๋ทฐ์ ๊ฐ ์ปฌ๋ผ์ ๋ํด ๋ฐ์ดํฐ ์ ํ ๋ฐ ์ด๋ฆ์ด ๊ฐ์ ํ๋๋ฅผ ๊ฐ๋๋ค.
- ๋ ์ฝ๋์์ ํ๋๋ฅผ ์ฐธ์กฐํ๋ ค๋ฉด record_name.field_name์ ์ฌ์ฉํ๋ค.
DECLARE
--๋ ์ฝ๋ ์ ํ ์ ์ธ
TYPE MYTYPE IS RECORD
(
name emp.name%TYPE,
pay emp.sal%TYPE
);
vrec MYTYPE;
BEGIN
SELECT name,sal INTO vrec.name,vrec.pay
FROM emp
WHERE empNO = '1001';
DBMS_OUTPUT.PUT_LINE('์ด๋ฆ :' || vrec.name);
DBMS_OUTPUT.PUT_LINE('๊ธ์ฌ :' || vrec.pay);
END;
์ ์ด๊ตฌ์กฐ
IF๋ฌธ
DECLARE
a NUMBER := 10;
BEGIN
IF MOD(a,6) = 0 THEN
DBMS_OUTPUT.PUT_LINE(a||':2๋๋ 3์๋ฐฐ์');
ELSIF MOD(a,2) = 0 THEN
DBMS_OUTPUT.PUT_LINE(a||':2์๋ฐฐ์');
ELSIF MOD(a,3) = 0 THEN
DBMS_OUTPUT.PUT_LINE(a||':3์๋ฐฐ์');
ELSE
DBMS_OUTPUT.PUT_LINE(a||':2๋๋ 3์๋ฐฐ์๊ฐ ์๋๋ค');
END IF;
END;
/
CASE๋ฌธ
DECLARE
vname VARCHAR2(30);
vpay NUMBER;
vtax NUMBER;
BEGIN
SELECT name,sal+bonus INTO vname,vpay
FROM emp
WHERE empNO = '1001';
CASE
WHEN vpay >= 3000000 THEN
vtax := TRUNC(vpay * 0.03);
WHEN vpay >= 2000000 THEN
vtax := TRUNC(vpay * 0.02);
ELSE
vtax := 0;
END CASE;
DBMS_OUTPUT.PUT_LINE('์ด๋ฆ:'||vname);
DBMS_OUTPUT.PUT_LINE('๊ธ์ฌ:'||vpay);
DBMS_OUTPUT.PUT_LINE('์ธ๊ธ:'||vtax);
END;
/
LOOP๋ฌธ
- ๋ฌดํ ๋ฐ๋ณต๋๋ LOOP๋ฌธ์ฅ์ด๋ค.
- EXIT๋ฌธ์ ๋ง๋๋ฉด ๋น ์ ธ๋๊ฐ๋ค.
- EXIT WHEN <condition>;์ ์ฌ์ฉํ์ฌ LOOP๋ฌธ์ ๋น ์ ธ ๋๊ฐ๋ ์กฐ๊ฑด์ ์ ์ด ํ ์ ์๋ค.
- ๋ค๋ฅธ LOOP๋ฅผ ํฌํจํ์ฌ ์ค์ฒฉ ๊ฐ๋ฅํ๋ค.
EXIT๋ฌธ
- LOOP๋ฌธ์์ EXIT๋ฌธ์ ๋ง๋๋ฉด loop๊ฐ ์๋ฃ๋๊ณ ์ ์ด๊ฐ END LOOP ๋ฐ๋ก ๋ค์ ๋ฌธ์ฅ์ ์คํํ๋ค.
- EXIT WHEN <condition>๋ฌธ์ WHEN ์ ์ ์กฐ๊ฑด์ด TRUE์ธ ๊ฒฝ์ฐ loop๊ฐ ์๋ฃ๋๊ณ ์ ์ด๊ฐ END LOOP ๋ฐ๋ก ๋ค์ ๋ฌธ์ฅ์ ์คํํ๋ค.
--1~100๊น์ง ํฉ ์ถ๋ ฅ
DECLARE
n NUMBER :=0;
s NUMBER :=0;
BEGIN
LOOP
n:= n+1;
s:= s+n;
EXIT WHEN n = 100;
END LOOP;
DBMS_OUTPUT.PUT_LINE('๊ฒฐ๊ณผ:'||s);
END;
/
CONTINUE๋ฌธ
- LOOP๋ฌธ์์ CONTINUE๋ฌธ์ ๋ง๋๋ฉด loop์ ํ์ฌ ๋ฐ๋ณต์ด ์๋ฃ๋๊ณ ์ ์ด๊ฐ loop์ ๋ค์ ๋ฐ๋ณต์ผ๋ก ์ ๋ฌ ๋๋ค.
- CONTUINUE WHEN<condition>๋ฌธ์ WHEN ์ ์ ์กฐ๊ฑด์ด TRUE์ธ loop์ ํ์ฌ ๋ฐ๋ณต์ด ์๋ฃ๋๊ณ ์ ์ด๊ฐ loop์ ๋ค์ ๋ฐ๋ณต์ผ๋ก ์ ๋ฌ ๋๋ค.
WHILE-LOOP๋ฌธ
- ์กฐ๊ฑด์ด TRUE์ธ ๊ฒฝ์ฐ ๋ฐ๋ณต๋๋ LOOP ๋ฌธ์ฅ์ด๋ค.
- ๋ค๋ฅธ LOOP๋ฅผ ํฌํจํ์ฌ ์ค์ฒฉ ๊ฐ๋ฅํ๋ค.
-- 1~100๊น์ง ์์ค 2๋๋ 3์ ๋ฐฐ์๋ฅผ ์ ์ธํ๊ณ ์ถ๋ ฅ
DECLARE
n NUMBER := 0;
BEGIN
WHILE n < 100 LOOP
n := n + 1;
EXIT WHEN n > 100; -- ์ถ๊ฐ: ๋ฃจํ ์ข
๋ฃ ์กฐ๊ฑด
CONTINUE WHEN MOD(n, 2) = 0 OR MOD(n, 3) = 0;
DBMS_OUTPUT.PUT(n || ' ');
END LOOP;
DBMS_OUTPUT.NEW_LINE();
END;
FOR-LOOP๋ฌธ
- ๋จ์ FOR-LOOP๋ฌธ์ ์ง์ ๋ ์ ์ ๋ฒ์์์ ๋ฐ๋ณต๋๋ค.
- FOR๋ฃจํ๊ฐ ์ฒ์ ์ ๋ ฅ ๋ ๋ ๋ฒ์๊ฐ ํ๊ฐ๋๊ณ ๋ค์ ํ๊ฐ๋์ง ์์ผ๋ฉฐ, lower_bound๊ฐ upper_bound์ ๊ฐ์ผ๋ฉด ๋ฃจํ ๋ณธ๋ฌธ์ด ํ ๋ฒ ์คํ๋๋ค
- FOR๋ฌธ์ ๋ฐ๋ณต์ ์ฌ์ฉ๋ ๋ณ์๋ ์ด๊ธฐ๊ฐ์์ ์์ํด ์ต์ข ๊ฐ๊น์ง ๋ฃจํ๋ฅผ ๋๋ฉฐ 1์ฉ ์ฆ๊ฐ๋๋๋ฐ, ๋ณ์๋ ์ฐธ์กฐ๋ ๊ฐ๋ฅํ์ง๋ง ๋ณ๊ฒฝํ ์๋ ์๊ณ ์ฐธ์กฐ๋ ์ค์ง ๋ฃจํ ์์์๋ง ๊ฐ๋ฅํ๋ค.
- FOR๋ฌธ์ ๋ฐ๋ณต์ ์ฌ์ฉ๋ ๋ณ์๋ ์ ์ธ๋ถ์์ ์ ์ธํ์ง ์๋๋ค.
- ์ผ๋ฐ์ ์ผ๋ก ๋ฐ๋ณต์ ์ ์ ๊ฐ์์ ํฐ ๊ฐ์ผ๋ก ์งํํ์ง๋ง REVERSE๋ ํฐ ๊ฐ์์ ์ ์ ๊ฐ์ผ๋ก ๋ฐ๋ณต๋๋ค.
--1๋ถํฐ 100๊น์ง ํฉ
DECLARE
s NUMBER := 0;
BEGIN
--FOR์์ ๋ฐ๋ณต์ ๋ํ๋ด๋ ๋ณ์๋ ์ ์ธํ์ง ์๋๋ค
FOR n IN 1..100 LOOP
s := s + n;
END LOOP;
DBMS_OUTPUT.PUT_LINE('๊ฒฐ๊ณผ:' || s);
END;
/
--REVERSE์ญ์ผ๋ก ์ถ๋ ฅ
--10 9 8 7 6 5 4 3 2 1
DECLARE
BEGIN
FOR n IN REVERSE 1..10 LOOP
DBMS_OUTPUT.PUT(n||' ');
END LOOP;
DBMS_OUTPUT.NEW_LINE();
END;
/
SQL Cursor FOR LOOP
- FOR LOOP์ ์ฟผ๋ฆฌ ํ ์คํธ๋ฅผ ํฌํจ์์ผ ๊ฐ ํ์ loop๋ก ์ฒ๋ฆฌํ๋ค.
- ์ฟผ๋ฆฌ ๊ฐ ํ์ ์คํ ๊ฒฐ๊ณผ๋ ๋ ์ฝ๋ ๋ณ์์ ์ ์ฅ๋์ด loop๋ด์์ ๋ ์ฝ๋ ๋ณ์์ ๊ฐ ํ๋๋ฅผ ์ฐธ์กฐํ์ฌ ์ฐ์ฐํ๊ฑฐ๋ ๊ฒฐ๊ณผ๋ฅผ ํ์ ํ ์ ์๋ค.
- FOR๋ฌธ์ record ๋ณ์๋ ์ ์ธ๋ถ์์ ์ ์ธํ์ง ์๋๋ค.
DECLARE
BEGIN
FOR rec IN (SELECT name,sal+bonus pay FROM emp) LOOP
DBMS_OUTPUT.PUT_LINE(rec.name||':'||rec.pay);
END LOOP;
END;
/
'๐ป > ORACLE' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
(29)[ORACLE] 12์ผ์ฐจ : PL/SQL - 3 (์ปค์์ ๋์ ์ฟผ๋ฆฌ) (0) | 2024.03.26 |
---|---|
(28)[ORACLE] 11์ผ์ฐจ : PL/SQL - 2 (0) | 2024.03.25 |
[ORACLE] 10์ผ์ฐจ : ํธ๋์ญ์ , ORACLE 12C (1) | 2024.03.22 |
[ORACLE] 9์ผ์ฐจ : ๊ณ ๊ธ์ฟผ๋ฆฌ (1) | 2024.03.22 |
[ORACLE] 9์ผ์ฐจ : ๋ทฐ ๋ฐ ์ํ์ค, ์๋ ธ๋ (0) | 2024.03.21 |