๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“ ๋ฐฐ์šฐ๊ณ  ์ตํžˆ๊ธฐ +/ORACLE

(52)[oracle]17์ผ์ฐจ: ((PL/SQL)) PACKAGE

by ์ข…์ด๋นจ๋Œ€ 2023. 11. 8.
TOP

๋ชฉ์ฐจ

    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	์—ฌ์ž
    */

    ์˜ค๋ผํด ๊ณต์‹ ์ˆ˜์—… ์ข…๋ฃŒ~!!!!