๐ ๊ธฐ๋ณธ ๋จ์
๋ธ๋ก
๐ฑ๊ธฐ๋ณธ ํ์
DECLARE ํ์ํ ์ฌ๋ฌ ์์ ์ ์ธ
BEGIN ๋ช ๋ น์ด ์คํ ๋ถ๋ถ
EXCEPTION ์์ธ ์ฒ๋ฆฌ(์๋ต ๊ฐ๋ฅ)
END; ๊ตฌ๋ฌธ ๋ง๋ฌด๋ฆฌ
/ PL/SQL๊ตฌ๋ฌธ์ ์คํํ๋ค(RUN์ ์๋ฏธ)
๐ข EX1>
SET SERVEROUTPUT ON; ์คํ๊ฒฐ๊ณผ๋ฅผ ํ๋ฉด์ ์ถ๋ ฅ
BEGIN
DBMS_OUTPUT.PUT_LINE('HELLO');
ย ย ย ->DBMS_OUTPUT : ํจํค์ง
ย ย ย ->PUT_LINE : ํ๋ก์์
END;
๐ฑ๋ณ์์ ์ธ
๋ณ์์ด๋ฆ ์๋ฃํ := ๊ฐ;
๐ฑ์์์ ์ธ
๋ณ์์ด๋ฆ CONSTANT ์๋ฃํ := ๊ฐ;
๐ฑ๋ณ์ ๊ธฐ๋ณธ๊ฐ ์ง์
๋ณ์์ด๋ฆ ์๋ฃํ DEFAULT ๊ฐ;
**์ฐธ๊ณ **
- ๋ณ์ ์ด๋ฆ ์ ํ๊ธฐ
1. ๊ฐ์ ๋ธ๋ก ์์์ ๋ณ์์ด๋ฆ ๊ณ ์ ํด์ผ ํจ
2. ๋/์๋ฌธ์ ๊ตฌ๋ณ โ
3. ๋ฌธ์๋ก ์์, ์์ด(30์) / ํ๊ธ(15์), ํน์๋ฌธ์($ /# / _) ๊ฐ๋ฅ
4. SQL ํค์๋ ์ฌ์ฉ ๊ธ์ง
๐ ๋ณ์ ์๋ฃํ
์ค์นผ๋ผํ - ์ค๋ผํด์์ ๊ธฐ๋ณธ์ผ๋ก ์ ์ํด๋์ ์๋ฃํ
์ฐธ์กฐํ - 1)ํน์ ํ
์ด๋ธ ์๋ฃํ์ด๋ 2)ํ ๊ตฌ์กฐ ์ฐธ์กฐ
1) ํน์ ํ ์ด๋ธ ์๋ฃํ ์ฐธ์กฐ
๋ณ์์ด๋ฆ ํ ์ด๋ธ์ด๋ฆ%ROWTYPE;
2) ํ ๊ตฌ์กฐ ์ฐธ์กฐ
๋ณ์์ด๋ฆ ํ ์ด๋ธ์ด๋ฆ.์ด์ด๋ฆ%TYPE;
LOB - ๋์ฉ๋์ ํ
์คํธ, ์ด๋ฏธ์ง, ๋์์, ์ฌ์ด๋ ๋ฐ์ดํฐ ๋ฑ ๋์ฉ๋ ๋ฐ์ดํฐ ์ ์ฅ์ํ ์๋ฃํ ์ข
๋ฅ : BLOB(BYTE), CLOB(CHARACTER)
๐ฑIF ๊ธฐ๋ณธํ์
IF ์กฐ๊ฑด์ THEN ์ํํ ๋ช ๋ น;
ELSIF ์กฐ๊ฑด์ THEN ์ํํ ๋ช ๋ น;
ELSE THEN ์ํํ ๋ช ๋ น;
END IF; -IF ์กฐ๊ฑด๋ฌธ ์ข ๋ฃ
๐ฑ๋จ์ CASE ๊ธฐ๋ณธํ์
CASE ๋น๊ต๊ธฐ์ค
ย ย ย WEHN ๊ฐ1 THEN ์ํํ ๋ช ๋ น;
ย ย ย ELSE ์ํํ ๋ช ๋ น;
END CASE; -CASE ์กฐ๊ฑด๋ฌธ ์ข ๋ฃ
๐ฑ๊ฒ์ CASE ๊ธฐ๋ณธํ์ *๊ฒ์ CASE๋ฌธ์ ๋น๊ต๊ธฐ์ค ๋ช ์X, ๊ฐ WHEN์ ์ ์กฐ๊ฑด์ ๋ช ์
CASE
ย ย ย WEHN ์กฐ๊ฑด์1 THEN ์ํํ ๋ช ๋ น;
ย ย ย WHEN ์กฐ๊ฑด์2 THEN ์ํํ ๋ช ๋ น;
ย ย ย ELSE ์ํํ ๋ช ๋ น;
END CASE; -CASE ์กฐ๊ฑด๋ฌธ ์ข ๋ฃ
๐ ๋ฐ๋ณต๋ฌธ ์ข
๋ฅ
1. ๊ธฐ๋ณธ LOOP โ do-while๋ฌธ
2. WHILE LOOP - ํน์ ์กฐ๊ฑด ๋ง์กฑ์ ๋ฐ๋ณต๋ฌธ ์ํ
3. FOR LOOP - ๋ฐ๋ณต ํ์ ์ ํ ๋ฐ๋ณต๋ฌธ
4. Cusor FOR LOOP - ์ปค์ ์ด์ฉ ๋ฐ๋ณต๋ฌธ
๐ ๋ฐ๋ณต์ํ ์ค๋จ
1. EXIT - ์ํ ์ค ๋ฐ๋ณต๋ฌธ ์ข
๋ฃ
2. EXIT-WHEN - ์กฐ๊ฑด์ ๋ง์กฑํ๋ฉด ๋ฐ๋ณต๋ฌธ ์ข
๋ฃ
๐ ํน์ ๋ฐ๋ณต ์ฃผ๊ธฐ ๊ฑด๋๋
1. CONTINUE - ์ํ์ค์ธ ํ์ฌ ์ฃผ๊ธฐ ๊ฑด๋๋
2. CONTINUE-WHEN - ์กฐ๊ฑด์ ๋ง์กฑํ๋ฉด ํ์ฌ ์ฃผ๊ธฐ ๊ฑด๋๋
๐ฑ๊ธฐ๋ณธ LOOP ๊ธฐ๋ณธํ์
LOOP ๋ฐ๋ณต ์ํ ์์ ;
END LOOP; -LOOP ์ข ๋ฃ
๐ฑWHILE LOOP ๊ธฐ๋ณธํ์
WHILE ์กฐ๊ฑด์ LOOP ๋ฐ๋ณต ์ํ ์์ ;
END LOOP; -LOOP ์ข ๋ฃ
๐ฑFOR LOOP ๊ธฐ๋ณธํ์
FOR i IN (REVERSE-์ญ์) ์์๊ฐ..์ข ๋ฃ๊ฐ LOOP ๋ฐ๋ณต ์ํ ์์ ;
END LOOP; -LOOP ์ข ๋ฃ
๐ ๋ ์ฝ๋
์๋ฃํ์ด ๊ฐ๊ธฐ ๋ค๋ฅธ ๋ฐ์ดํฐ๋ฅผ ํ๋์ ๋ณ์์ ์ ์ฅํ๋๋ฐ ์ฌ์ฉ
(C์ struct(๊ตฌ์กฐ์ฒด)์ ๋น์ทํ ์๋ฏธ)
๐ฑ๊ธฐ๋ณธํ์
TYPE ๋ ์ฝ๋ ์ด๋ฆ IS RECORD(
ย ย ย ๋ณ์์ด๋ฆ ์๋ฃํ (NOT NULL - ์ค์ ๋ฐ ์๋ต ๊ฐ๋ฅ) := ๊ฐ,
ย ย ย ๋ณ์์ด๋ฆ ์๋ฃํ (NOT NULL - ์ค์ ๋ฐ ์๋ต ๊ฐ๋ฅ) := ๊ฐ
);
- ํน์ง : INSERT, UPDATE ๊ฐ๋ฅ
๐ ์ปฌ๋ ์
์๋ฃํ์ด ๊ฐ์ ์ฌ๋ฌ ๋ฐ์ดํฐ ์ ์ฅํ๋๋ฐ ์ฌ์ฉ
(๋ฐฐ์ด๊ณผ ๊ฐ์ ์๋ฏธ)
๋ง์ด ์ฌ์ฉํ๋ varray๋ง ์์๋ณด๊ฒ ๋ค,,
๐ฑVARRAY ๊ธฐ๋ณธํ์
TYPE ๋ฐฐ์ด ์ด๋ฆ IS VARRAY(๋ฐฐ์ด๊ธธ์ด) OF ์๋ฃํ(๊ธธ์ด);
ย ย ย (type : ์๋ก์ด ์๋ฃํ์ ๋ง๋ค์ด๋)
๋ณ์์ด๋ฆ ๋ฐฐ์ด์ด๋ฆ := ๋ฐฐ์ด์ด๋ฆ(๊ฐ,๊ฐ..);
ย ย ย (DB์์๋ ๋ฐฐ์ด์ index๊ฐ 1๋ถํฐ ์์๋จ)
๐ ์ปค์ ์ ์
๐๋ช
์์ ์ปค์
1๋จ๊ณ : ์ปค์ ์ ์ธ
2๋จ๊ณ : ์ปค์ open
3๋จ๊ณ : ์ปค์์์ ์ฝ์ด์จ ๋ฐ์ดํฐ ์ฌ์ฉ(FETCH)
4๋จ๊ณ : ์ปค์ close
๐ฑ๊ธฐ๋ณธํ์
DECLARE
ย ย ย CURSOR ์ปค์ ์ด๋ฆ IS SQL๋ฌธ; -1๋จ๊ณ
BEGIN
ย ย ย OPEN ์ปค์ ์ด๋ฆ; -2๋จ๊ณ
ย ย ย FETCH ์ปค์์ด๋ฆ INTO ๋ณ์ -3๋จ๊ณ
ย ย ย CLOSE ์ปค์ ์ด๋ฆ; -4๋จ๊ณ
END;
๐ขEX>1
DECLARE
ย ย ย V_DEPT_ROW DEPT%ROWTYPE;
ย ย ย (์ปค์ ๋ฐ์ดํฐ ์ ๋ ฅํ ๋ณ์ ์ ์ธ, V_DEPT_ROW์ DEPTํ ์ด๋ธ์ ๋ชจ๋ ํ ์๋ฃํ๊ณผ ๊ฐ์ด ์ง์ ํด์ฃผ๊ฒ ๋ค)
CURSOR c1 IS
ย ย ย SELECT DEPTNO
ย ย ย FROM DEPT
ย ย ย WHERE DEPTNO=40; -๋ช ์์ ์ปค์ ์ ์ธ
BEGIN
OPEN c1; -์ปค์ open
FETCH c1 INTO V_DEPT_ROW; -์ปค์๋ก๋ถํฐ ์ฝ์ด์จ ๋ฐ์ดํฐ ์ฌ์ฉ
DBMS_OUTPUT.PUT_LINE('DEPTNO : ' || V_DEPT_ROW.DEPTNO);
CLOSE c1; -์ปค์ close
END;
/
๐ ์ปค์์ FOR LOOP ์ฌ์ฉ
๐ ์ปค์์ ํ๋ผ๋ฏธํฐ ์ฌ์ฉ
๐ ๋ฌต์์ ์ปค์
์ปค์๋ ์ฌ์ฉ์๊ฐ sql๋ฌธ์ ์คํ์ํค๋ฉด ๊ฒฐ๊ณผ๊ฐ์ ์ ์ฅ๊ณต๊ฐ์ ๊ฐ์ง๊ณ ์๋ค๊ฐ ์ํ๋ ์๊ธฐ์ ์์ฐจ์ ์ผ๋ก FETCH ์ฒ๋ฆฌํด ๊ฒฐ๊ณผ๋ฅผ ํ๋ก๊ทธ๋๋ฐ์ ์ผ๋ก ์ ๊ทผํ ์ ์๊ฒ ํด์ค
๐ฑ๊ธฐ๋ณธํ์
๐ขEX1>
DECLARE
ย ย ย v_wrong NUMBER;
BEGIN
ย ย ย SELECT DNAME INTO v_wrong
ย ย ย FROM DEPT
ย ย ย WHERE DEPTNO=10;
EXCEPTION
ย ย ย WHEN VALUE_ERROR THEN
ย ย ย (VALUE_ERROR : ์ฌ์ ์ ์๋ ์์ธ ์ด๋ฆ)
ย ย ย ย ย ย ย DBMS_OUTPUT.PUT_LINE('์์ธ ์ฒ๋ฆฌ : ์์น ๋๋ ๊ฐ ์ค๋ฅ ๋ฐ์');
ย ย ย WHEN OTHERS THEN
ย ย ย ย ย ย ย DBMS_OUTPUT.PUT_LINE('์์ธ ์ฒ๋ฆฌ : ์ฌ์ ์ ์ ์ธ ์ค๋ฅ ๋ฐ์');
END;
/
๐ฑ์ด๋ฆ ์๋ ์์ธ ์ฌ์ฉ ํ์
DECLARE
ย ย ย ์์ธ์ด๋ฆ1 EXCEPTION;
ย ย ย (์์ธ ์ด๋ฆ ์ง์ ์ง์ )
ย ย ย PRAGMA EXCEPTION_INIT(์์ธ์ด๋ฆ1, ์์ธ๋ฒํธ);
ย ย ย (์ค๋ผํด ์์ธ ๋ฒํธ์ ํจ๊ป ์ด๋ฆ ๋ถ์ด๊ธฐ)
ย ย ย .
ย ย ย .
EXCEPTION
ย ย ย WHEN ์์ธ์ด๋ฆ1 THEN
ย ย ย ย ย ย ย ์์ธ์ฒ๋ฆฌ์ ์ฌ์ฉํ ๋ช ๋ น์ด
ย ย ย ย ย ย ย .
ย ย ย ย ย ย ย .
END;
๐ฑ์ฌ์ฉ์ ์ ์ ์์ธ ์ฌ์ฉ ํ์
DECLARE
ย ย ย ์ฌ์ฉ์ ์์ธ์ด๋ฆ EXCEPTION;
ย ย ย .
ย ย ย .
BEGIN
ย ย ย IF ์ฌ์ฉ์ ์์ธ๋ฅผ ๋ฐ์์ํฌ ์กฐ๊ฑด THEN
ย ย ย ย ย ย ย RAISE ์ฌ์ฉ์ ์์ธ์ด๋ฆ
ย ย ย ย ย ย ย (RAISE ํค์๋ ์ด์ฉํ์ฌ ์์ธ๋ฅผ ์ง์ ๋ง๋ค ์ ์์)
ย ย ย ย ย ย ย .
ย ย ย ย ย ย ย .
ย ย ย END IF;
EXCEPTION
ย ย ย WHEN ์ฌ์ฉ์ ์์ธ ์ด๋ฆ THEN
ย ย ย ย ย ย ย ์์ธ์ฒ๋ฆฌ์ ์ฌ์ฉํ ๋ช ๋ น์ด
ย ย ย ย ย ย ย .
ย ย ย ย ย ย ย .
END;
๐ฑํ๋ก์์ ์์ฑ
CREATE [OR REPLACE] PROCEDURE ํ๋ก์์ ์ด๋ฆ
IS | AS
ย ย ย ์ ์ธ๋ถ
BEGIN
(EXCEPTION
ย ย ย ์์ธ ์ฒ๋ฆฌ๋ถ) - ์๋ต๊ฐ๋ฅ
END [ํ๋ก์์ ์ด๋ฆ];
/
๐ฑํ๋ก์์ ์คํ
EXECUTE ํ๋ก์์ ์ด๋ฆ;
๐ฑํ๋ก์์ ์ญ์
DROP PROCEDURE ํ๋ก์์ ์ด๋ฆ;
๐ฑํ๋ผ๋ฏธํฐ ์๋ ํ๋ก์์
CREATE [OR REPLACE] PROCEDURE ํ๋ก์์ ์ด๋ฆ
(
ย ย ย a IN NUMBER,
ย ย ย b NUMBER
)
(IN์ ๊ธฐ๋ณธ๊ฐ์ด๋ฏ๋ก ์๋ต ๊ฐ๋ฅํ๋ค)
IS | AS
ย ย ย ์ ์ธ๋ถ(์๋ต ๊ฐ๋ฅ)
BEGIN
ย ย ย ์คํ๋ถ
(EXCEPTION
ย ย ย ์์ธ ์ฒ๋ฆฌ๋ถ) - ์๋ต๊ฐ๋ฅ
END [ํ๋ก์์ ์ด๋ฆ];
/
ํ๋ก์์ ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ํจ์์ ๋ฌ๋ฆฌ ๊ฐ์ ๋ฐํํ์ง ์์ง๋ง, OUT ๋ชจ๋ ํน์ IN OUT ๋ชจ๋๋ก ์ค์ ์ ํ๋ก์์ ์คํ ํ ํธ์ถํ ํ๋ก๊ทธ๋จ์ผ๋ก ๊ฐ์ ๋ฐํํ ์ ์๋ค
ํ๋ก์์ ๋ ๊ธฐ๋ฅ์ ์ํํ๋ ์ ์ฐจ ๊ทธ ์์ฒด๋ฅผ ๋ชฉ์ ์ผ๋ก ํ๋ ๊ฒ์ด๋ค
๐ฑํจ์ ์์ฑ
CREATE [OR REPLACE] FUNCTION ํจ์ ์ด๋ฆ
(
ย ย ย a IN NUMBER
)
RETURN NUMBER -๋ฐํ ํ์ ์ค์
IS | AS
ย ย ย ์ ์ธ๋ถ(์๋ต ๊ฐ๋ฅ)
BEGIN
ย ย ย ์คํ๋ถ
ย ย ย RETURN (๋ฐํ๊ฐ); -๋ฐ๋์ ์ง์ ํด์ค๊ฒ!
(EXCEPTION
ย ย ย ์์ธ ์ฒ๋ฆฌ๋ถ) - ์๋ต๊ฐ๋ฅ
END [ํจ์ ์ด๋ฆ];
/
๐ ํจ์ ์คํ
๐ฑํจ์ ์ญ์
DROP FUNCTION ํจ์ ์ด๋ฆ;
ํจ์๋ ๊ธฐ๋ฅ์ ์ํํ์ฌ ์ด๋ ํ ๊ฒฐ๊ณผ๋ฅผ ๋์ถํด ๋ด๋ ๊ฒ์ด๋ค
๐ ํจํค์ง ๊ตฌ์กฐ
๐ฑํจํค์ง ๋ช ์ธ
CREATE [OR REPLACE] PACKAGE ํจํค์ง ์ด๋ฆ
IS | AS
ย ย ย ์๋ธํ๋ก๊ทธ๋จ์ ํฌํจํ ๋ค์ํ ๊ฐ์ฒด ์ ์ธ
END [ํจํค์ง ์ด๋ฆ];
๐ฑํจํค์ง ๋ณธ๋ฌธ
CREATE [OR REPLACE] PACKAGE BODY ํจํค์ง ์ด๋ฆ
IS | AS
ย ย ย ํจํค์ง ๋ช ์ธ์์ ์ ์ธํ ์๋ธํ๋ก๊ทธ๋จ์ ํฌํจํ ์ฌ๋ฌ ๊ฐ์ฒด๋ฅผ ์ ์
ย ย ย ๊ฒฝ์ฐ์ ๋ฐ๋ผ ํจํค์ง ๋ช ์ธ์ ์กด์ฌํ์ง ์๋ ๊ฐ์ฒด ๋ฐ ์๋ธํ๋ก๊ทธ๋จ๋ ์ ์ ๊ฐ๋ฅ
END [ํจํค์ง ์ด๋ฆ];
๊ทธ ์ธ : ๊ธฐ๋ณธ์ ์ผ๋ก ์๋ธํ๋ก๊ทธ๋จ ์ด๋ฆ์ ์ค๋ณต๋ ์ ์์ง๋ง, ์ค๋ฒ๋ก๋๋ ๊ฐ๋ฅ
์ฐธ๊ณ : ์๋ฐ๊ฐ ํจํค์ง๋ฅผ ์ฌ์ฉํ๋ ์ด์ ์ sql์์ ํจํค์ง๋ฅผ ์ฌ์ฉํ๋ ์ด์ ๋ ๊ฐ์!
๐ ํธ๋ฆฌ๊ฑฐ ์ ์
DB์์์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ ์๋์ผ๋ก ์คํ๋๋ ๊ธฐ๋ฅ์ ์ ์ํ๋ PL/SQL ์๋ธํ๋ก๊ทธ๋จ
ํธ๋ฆฌ๊ฑฐ์ ์ข ๋ฅ๋ ์ฌ๋ฌ๊ฐ์ง์ด์ง๋ง, DML ํธ๋ฆฌ๊ฑฐ๋ฅผ ๋ง์ด ์ฌ์ฉํจ
๐ฑDMLํธ๋ฆฌ๊ฑฐ ํ์
CREATE [OR REPLACE] TRIGGER ํธ๋ฆฌ๊ฑฐ ์ด๋ฆ
BEFORE | AFTER
INSERT | UPDATE | DELETE ON ํ ์ด๋ธ ์ด๋ฆ
(REFERENCEING OLD as old | NEW as new) -์๋ต๊ฐ๋ฅ < ๋ณ๊ฒฝ ์ /ํ ๊ฐ ์ฐธ์กฐ ์ ์ฌ์ฉ
FOR EACH ROW WHEN ์กฐ๊ฑด์
(FOLLOWS ํธ๋ฆฌ๊ฑฐ ์ด๋ฆ2, ํธ๋ฆฌ๊ฑฐ ์ด๋ฆ3 ..) - ์๋ต๊ฐ๋ฅ < ์ฌ๋ฌ ๊ด๋ จ ํธ๋ฆฌ๊ฑฐ์ ์คํ ์์ ์ง์
(ENABLE | DISABLE) - ์๋ต๊ฐ๋ฅ < ํธ๋ฆฌ๊ฑฐ์ ํ์ฑํ ๋นํ์ฑํ ์ง์
DECLARE
ย ย ย ์ ์ธ๋ถ
BEGIN
ย ย ย ์คํ๋ถ
(EXCEPTION
ย ย ย ์์ธ ์ฒ๋ฆฌ๋ถ)
END;
- ๋ณดํต DML ํธ๋ฆฌ๊ฑฐ์ ํธ๋ฆฌ๊ฑฐ ์๋ DML ๋ช
๋ น์ด๊ฐ 1)INSERT์ธ ๊ฒฝ์ฐ ํ์ด๋ฐ์ AFTER, 2)UPDATE/DELETE์ธ ๊ฒฝ์ฐ ํ์ด๋ฐ์ BEFORE๋ก ์ง์ ํ๋ค
1) ์ ๊ฒฝ์ฐ ํ์ด๋ฐ์ด AFTER์ด๋ฏ๋ก ์ฝ์
๋ ๊ทธ ๊ฐ์ ์ฐธ์กฐํ๊ธฐ ์ํด์๋ ':NEW.์ปฌ๋ผ๋ช
' ์ ์ฌ์ฉ
2) ์ ๊ฒฝ์ฐ ํ์ด๋ฐ์ด BEFORE์ด๋ฏ๋ก ์ญ์ /๋ณ๊ฒฝ๋๊ธฐ ์ ๊ทธ ๊ฐ์ ์ฐธ์กฐํ๊ธฐ ์ํด์๋ ':OLD.์ปฌ๋ผ๋ช
' ์ ์ฌ์ฉ