๋ชฉ์ฐจ
1. 23.11.08(์)
1. 20231108_01_scott(qlsql).sql
SELECT USER
FROM DUAL;
--==>> SCOTT
/* 1-๊ณผ์ &๋ฌธ์ & ํจ๊ป ํผ ๋ด์ฉ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
--โ TBL_์ถ๊ณ ํ
์ด๋ธ์ ๋ฐ์ดํฐ ์
๋ ฅ, ์์ , ์ญ์ ์
-- TBL_์ํ ํ
์ด๋ธ์ ํด๋น ์ํ์ ๋ํ ์ฌ๊ณ ์๋ ๋ณ๋ ํธ๋ฆฌ๊ฑฐ ์์ฑ
-- ํธ๋ฆฌ๊ฑฐ๋ช
: TRG_CHULGO
-- ์ ์ถ ํ์ผ๋ช
: ์ค๋ผํด_ํธ๋ฆฌ๊ฑฐ_์ค์๊ฒฝ.sql
-- ์ฌ๊ณ ๋ถ์กฑ ๊ด๋ จ ์์ธ ์ฒ๋ฆฌ
CREATE OR REPLACE TRIGGER TRG_CHULGO
AFTER
INSERT OR UPDATE OR DELETE ON TBL_์ถ๊ณ
FOR EACH ROW
DECLARE
-- ์ ์ธ๊ตฌ๋ฌธ
V_์ฌ๊ณ ์๋ TBL_์ํ.์ฌ๊ณ ์๋%TYPE;
USER_DEFINE_ERROR EXCEPTION;
BEGIN
-- ์คํ๊ตฌ๋ฌธ
IF (INSERTING)
THEN
-- ๊ธฐ์กด ์ฌ๊ณ ์๋
SELECT ์ฌ๊ณ ์๋ INTO V_์ฌ๊ณ ์๋
FROM TBL_์ํ
WHERE ์ํ์ฝ๋ = :NEW.์ํ์ฝ๋;
-- ์์ธ์ฒ๋ฆฌ ์กฐ๊ฑด
IF(V_์ฌ๊ณ ์๋ - :NEW.์ถ๊ณ ์๋ < 0)
THEN RAISE USER_DEFINE_ERROR;
END IF;
-- ์
๋ฐ์ดํธ ์ฟผ๋ฆฌ
UPDATE TBL_์ํ
SET ์ฌ๊ณ ์๋ = ์ฌ๊ณ ์๋ - :NEW.์ถ๊ณ ์๋
WHERE ์ํ์ฝ๋ = :NEW.์ํ์ฝ๋;
ELSIF (UPDATING)
THEN
-- ๊ธฐ์กด ์ฌ๊ณ ์๋
SELECT ์ฌ๊ณ ์๋ INTO V_์ฌ๊ณ ์๋
FROM TBL_์ํ
WHERE ์ํ์ฝ๋ = :OLD.์ํ์ฝ๋;
-- ์์ธ์ฒ๋ฆฌ ์กฐ๊ฑด
IF(V_์ฌ๊ณ ์๋ + :OLD.์ถ๊ณ ์๋ - :NEW.์ถ๊ณ ์๋ < 0)
THEN RAISE USER_DEFINE_ERROR;
END IF;
-- ์
๋ฐ์ดํธ ์ฟผ๋ฆฌ
UPDATE TBL_์ํ
SET ์ฌ๊ณ ์๋ = ์ฌ๊ณ ์๋ + :OLD.์ถ๊ณ ์๋ - :NEW.์ถ๊ณ ์๋
WHERE ์ํ์ฝ๋ = :NEW.์ํ์ฝ๋;
ELSIF (DELETING)
THEN
-- ์
๋ฐ์ดํธ ์ฟผ๋ฆฌ
UPDATE TBL_์ํ
SET ์ฌ๊ณ ์๋ = ์ฌ๊ณ ์๋ + :OLD.์ถ๊ณ ์๋
WHERE ์ํ์ฝ๋ = :OLD.์ํ์ฝ๋;
END IF;
-- ์์ธ์ฒ๋ฆฌ
EXCEPTION
WHEN USER_DEFINE_ERROR
THEN RAISE_APPLICATION_ERROR(-20002, '์ฌ๊ณ ๋ถ์กฑ~!!!');
END;
--โ โ โ PACKAGE(ํจํค์ง) โ โ โ --
/*
1. PL/SQL ์ ํจํค์ง๋ ๊ด๊ณ๋๋ ํ์
, ํ๋ก๊ทธ๋จ ๊ฐ์ฒด, ์๋ธ ํ๋ก๊ทธ๋จ(PROCEDURE, FUNCTION ๋ฑ)์ ๋
ผ๋ฆฌ์ ์ผ๋ก ๋ฌถ์ด๋์ ๊ฒ์ด๋ค.
์ค๋ผํด์์ ์ ๊ณตํ๋ ํจํค์ง ์ค ํ๋๊ฐ ๋ฐ๋ก <DBMS_OUTPUT>์ด๋ค.
2. ํจํค์ง๋ ์๋ก ์ ์ฌํ ์
๋ฌด์ ์ฌ์ฉ๋๋ ์ฌ๋ฌ ๊ฐ์ ํ๋ก์์ ์ ํจ์๋ฅผ ํ๋์ ํจํค์ง๋ก ๋ง๋ค์ด ๊ด๋ฆฌํจ์ผ๋ก์จ
ํฅํ ์ ์ง๋ณด์๊ฐ ํธ๋ฆฌํ๊ณ ์ ์ฒด ํ๋ก๊ทธ๋จ์ ๋ชจ๋ํ ํ ์ ์๋ค๋ ์ฅ์ ์ด ์๋ค.
3. ํจํค์ง๋ ๋ช
์ธ๋ถ(PACKAGE SPECIFICATION)์ ๋ชธ์ฒด๋ถ(PACKAGE BODY)๋ก ๊ตฌ์ฑ๋์ด ์์ผ๋ฉฐ
๋ช
์ธ ๋ถ๋ถ์๋ TYPE, CONSTRAINT, VARIABLE, EXCEPTION, XURSOR, SUBPROGRAM ์ด ์ ์ธ๋๊ณ
๋ชธ์ฒด ๋ถ๋ถ์๋ ์ด๋ค์ ์ค์ ๋ด์ฉ์ด ์กด์ฌํ๋ค.
๊ทธ๋ฆฌ๊ณ , ํธ์ถํ ๋์๋ <ํจํค์ง๋ช
. ํ๋ก์์ ๋ช
>๊ณผ ๊ฐ์ ํ์์ ์ฐธ์กฐ๋ฅผ ์ด์ฉํด์ผ ํ๋ค.
4. ํ์ ๋ฐ ๊ตฌ์กฐ(๋ช
์ธ๋ถ)
*/
/*
-- *์์์์ ์ด๋ค ๋ด์ฉ์ด ์๋์ง ๋ผ๋ฒจ์ ๋ถ์ด๋ ๊ฒ*
-- *๋ฐ๋ผ์ ๋ช
์ธ๋ถ-๋ชธ์ฒด๋ถ์ ํจํค์ง๋ช
์ ๊ฐ์์ผ ํจ*
CRAEATE [OR REPLACE] PACKAGE ํจํค์ง๋ช
IS
์ ์ญ๋ณ์ ์ ์ธ;
์ปค์ ์ ์ธ;
์์ธ ์ ์ธ;
ํจ์ ์ ์ธ;
ํ๋ก์์ ์ ์ธ;
:
END ํจํค์ง๋ช
;
*/
/*
5. ํ์ ๋ฐ ๊ตฌ์กฐ(๋ชธ์ฒด๋ถ)
*/
/*
CREATE [OR REPLACE] PACKAGE BODY ํจํค์ง๋ช
IS
FUNCTION ํจ์๋ช
[(์ธ์,...)]
RETURN ์๋ฃํ
IS
๋ณ์ ์ ์ธ;
BEGIN
ํจ์ ๋ชธ์ฒด ๊ตฌ์ฑ ์ฝ๋;
RETURN ๊ฐ;
END;
PROCEDURE ํ๋ก์์ ๋ช
[(์ธ์, ...)]
IS
๋ณ์ ์ ์ธ;
BEGIN
ํ๋ก์์ ๋ชธ์ฒด ๊ตฌ์ฑ ์ฝ๋;
END;
END ํจํค์ง๋ช
;
*/
-- ํจํค์ง ๋ฑ๋ก ์ค์ต
-- (1) ๋ช
์ธ๋ถ ์์ฑ
CREATE OR REPLACE PACKAGE INSA_PACK -- *๋ช
์ธ๋ถ๋ผ๋ ํน์ ๋จ์ดX*
IS
FUNCTION FN_GENDER(V_SSN VARCHAR2)
RETURN VARCHAR2;
END INSA_PACK;
--==>> Package INSA_PACK์ด(๊ฐ) ์ปดํ์ผ๋์์ต๋๋ค.
-- (2) ๋ชธ์ฒด๋ถ ์์ฑ
-- *๋ผ๋...๋๋จธ์ง๋ ํจ์ ์ ์์ ๊ฐ์~*
CREATE OR REPLACE PACKAGE BODY INSA_PACK -- *BODY: ๋ชธ์ฒด๋ถ๋ผ๋ ํน์ ๋จ์ดO*
IS
FUNCTION FN_GENDER(V_SSN VARCHAR2)
RETURN VARCHAR2
IS
BEGIN
END;
END INSA_PACK; -- *END BODY ์๋!*
CREATE OR REPLACE PACKAGE BODY INSA_PACK
IS
FUNCTION FN_GENDER(V_SSN VARCHAR2)
RETURN VARCHAR2
IS
V_RESULT VARCHAR2(20);
BEGIN
IF (SUBSTR(V_SSN,8,1) IN ('1','3'))
THEN V_RESULT := '๋จ์';
ELSIF (SUBSTR(V_SSN,8,1) IN ('2','4'))
THEN V_RESULT := '์ฌ์';
ELSE
V_RESULT := 'ํ์ธ๋ถ๊ฐ';
END IF;
RETURN V_RESULT;
END;
END INSA_PACK;
--==>> Package Body INSA_PACK์ด(๊ฐ) ์ปดํ์ผ๋์์ต๋๋ค.
2. 20231108_02_scott.sql
SELECT USER
FROM DUAL;
--==>> SCOTT
-- โ โ โ AFTER ROW TRIGGER ์ํฉ ์ค์ต โ โ โ --
SELECT *
FROM TBL_์
๊ณ ;
SELECT *
FROM TBL_์ถ๊ณ ;
SELECT *
FROM TBL_์ํ;
/*
H001 ๋ฐ๋ฐค๋ฐ 600 60
H002 ์ฃ ์ค๋ฐ 500 0
H003 ๋ณด์๋ฐ 500 0
H004 ๋๊ฐ๋ฐ 600 0
H005 ์์๋ฐ 700 0
H006 ์๋ฐ๋ฐ 500 0
H007 ์๊ป๋ฐ 500 0
C001 ๋นต๋น ๋ 1600 0
C002 ์๋์ฝ 1500 0
C003 ๋ฉํ์ฝ 1500 0
C004 ๊ตฌ๊ตฌ์ฝ 1600 0
C005 ์ํผ์ฝ 1700 0
E001 ๋นต๋์ 2600 0
E002 ํฌ๊ฒ๋ 2500 0
E003 ํฅ๋น์ 2500 0
E004 ์
๋ ์
2600 0
E005 ์ค๋ ์ 2700 0
*/
INSERT INTO TBL_์ถ๊ณ (์ถ๊ณ ๋ฒํธ, ์ํ์ฝ๋, ์ถ๊ณ ์ผ์, ์ถ๊ณ ์๋, ์ถ๊ณ ๋จ๊ฐ)
VALUES(1, 'H001',SYSDATE, 60, 1000);
SELECT *
FROM TBL_์ถ๊ณ ;
/*
1 H001 2023-11-08 60 1000
*/
SELECT *
FROM TBL_์ํ;
/*
H001 ๋ฐ๋ฐค๋ฐ 600 0
*/
INSERT INTO TBL_์ถ๊ณ (์ถ๊ณ ๋ฒํธ, ์ํ์ฝ๋, ์ถ๊ณ ์ผ์, ์ถ๊ณ ์๋, ์ถ๊ณ ๋จ๊ฐ)
VALUES(2, 'H001',SYSDATE, 50, 1000);
--==>> ์๋ฌ ๋ฐ์ (ORA-20002: ์ฌ๊ณ ๋ถ์กฑ~!!!)
UPDATE TBL_์ถ๊ณ
SET ์ถ๊ณ ์๋ = 30
WHERE ์ถ๊ณ ๋ฒํธ = 1;
--==>> 1 ํ ์ด(๊ฐ) ์
๋ฐ์ดํธ๋์์ต๋๋ค.
SELECT *
FROM TBL_์ถ๊ณ ;
/*
1 H001 2023-11-08 30 1000
*/
SELECT *
FROM TBL_์ํ;
/*
H001 ๋ฐ๋ฐค๋ฐ 600 30
*/
DELETE
FROM TBL_์ถ๊ณ
WHERE ์ถ๊ณ ๋ฒํธ = 1;
--==>> 1 ํ ์ด(๊ฐ) ์ญ์ ๋์์ต๋๋ค.
SELECT *
FROM TBL_์ํ;
/*
H001 ๋ฐ๋ฐค๋ฐ 600 60
*/
INSERT INTO TBL_์ถ๊ณ (์ถ๊ณ ๋ฒํธ, ์ํ์ฝ๋, ์ถ๊ณ ์ผ์, ์ถ๊ณ ์๋, ์ถ๊ณ ๋จ๊ฐ)
VALUES(1, 'H001',SYSDATE, 20, 1000);
--โ โ โ PACKAGE(ํจํค์ง) โ โ โ --
--โ ํจํค์ง ํ์ฉ ์ค์ต
SELECT INSA_PACK.FN_GENDER('801007-1544236') "ํจ์ํธ์ถ๊ฒฐ๊ณผ"
FROM DUAL;
--==>> ๋จ์
SELECT NAME, SSN, INSA_PACK.FN_GENDER(SSN) "ํจ์ํธ์ถ๊ฒฐ๊ณผ"
FROM TBL_INSA;
--==>>
/*
ํ๊ธธ๋ 771212-1022432 ๋จ์
์ด์์ 801007-1544236 ๋จ์
์ด์์ 770922-2312547 ์ฌ์
:
๊น์ ์ 810809-2111111 ์ฌ์
์ตํ์ธ 970812-2234567 ์ฌ์
*/
์ค๋ผํด ๊ณต์ ์์ ์ข ๋ฃ~!!!!