hyeonga_code

Database_89_패키지_spec, body, 패키지 서브 프로그램 호출, 데이터 딕셔너리 패키지 정보 보기, SQL 코드 암호화, 패키지 삭제 본문

Oracle Database

Database_89_패키지_spec, body, 패키지 서브 프로그램 호출, 데이터 딕셔너리 패키지 정보 보기, SQL 코드 암호화, 패키지 삭제

hyeonga 2023. 9. 2. 05:59
반응형

-- PACKAGE_패키지 
    -- 논리적으로 관련된 PL/SQL 유형, 변수 및 서브 프로그램을 그룹화하는 스키마 객체입니다.
    -- 오라클 서버가 동시에 여러 객체를 메모리 안으로 읽을 수 있도록 합니다.
    -- 구성
        -- 일반적으로 파일을 따로 작성합니다.
        -- Spec
            -- Specification_패키지 명세
            -- Public_공용 : public_var
            -- 패키지의 인터페이스입니다.
            -- 패키지외부에서 참조할 수 있는 유형, 변수, 상수, 예외, 커서 및 서브 프로그램을 선언합니다.
        -- Body
            -- Body_패키지 몸체
            -- Private_전용 : private_var
            -- 커서에 대한 쿼리와 서브 프로그램에 대한 코드를 정의합니다.
    -- 장점
        -- 모듈화
            -- 관련 생성자를 캡슐화합니다.
        -- 손쉬운 유지 관리 
            -- 논리적으로 관련된 기능을 함께 보관합니다.
        -- 쉬운 응용 프로그램 설계
            -- Spec과 Body를 별도로 코딩 및 컴파일합니다.
        -- 정보 숨기기 프로비저닝_Provisioning
            -- Package Spec에 있는 선언만 응용 프로그램에서 볼 수 있고 엑세스할 수 있습니다.
            -- Package Body의 전용_Private 생성자는 표시되지 않으며 엑세스할 수 없습니다.
            -- 모든 코딩은 Package Body에서 표시되지 않습니다.
        -- 성능 향상
            -- 패키지가 처음으로 참조될 때 전체 패키지가 메모리에 로드됩니다.
            -- 메모리에는 모든 유저에 대해 한 개의 복사본만 있습니다.
    -- PACKAGE SPEC 생성
        /*
        CREATE [OR REPLACE] PACKAGE package_name 
        IS | AS
            public type and variable declarations
            subprogram specifications
        END [package_name];
        */

-- The package spec with a public variable and a public procedure that are accessible from 
-- outside the package. 
CREATE OR REPLACE PACKAGE comm_pkg IS
v_std_comm NUMBER := 0.10; --initialized to 0.10
PROCEDURE reset_comm(p_new_comm NUMBER);
END comm_pkg;
/
    /*
    Package COMM_PKG이(가) 컴파일되었습니다.
    */
    
    -- PACKAGE BODY 생성
        /*
        CREATE [ OR REPLACE ] PACKAGE BOVY package_name
        IS | AS
            private type and variable declarations
            subprogram bodies
        [ BEGIN initialization statements ]
        END [ package_name ];
        */
        
CREATE OR REPLACE PACKAGE BODY comm_pkg IS
    FUNCTION validate(p_comm NUMBER) RETURN BOOLEAN IS
        v_max_comm employees.commission_pct%type;
    BEGIN
        SELECT MAX(commission_pct) INTO v_max_comm
        FROM employees;
        RETURN (p_comm BETWEEN 0.0 AND v_max_comm);
    END validate;
    PROCEDURE reset_comm(p_new_comm NUMBER) IS
    BEGIN
        IF validate(p_new_comm) THEN
            v_std_comm := p_new_comm; -- reset public var
        ELSE RAISE_APPLICATION_ERROR(-20210, 'Bad Commission');
        END IF;
    END reset_comm;
END comm_pkg;
/
    /*
    Package Body COMM_PKG이(가) 컴파일되었습니다.
    */

    -- 패키지 서브 프로그램 호출  
        /*
        EXECUTE package_name.procedure_name;
        */
-- SQL Developer와 같은 호출 환경에서 패키지 프로시저를 호출합니다.
EXECUTE comm_pkg.reset_comm(0.15);
    /*
    PL/SQL 프로시저가 성공적으로 완료되었습니다.
    */

-- 스키마 이름을 포함하여 다른 스키마의 패키지 프로시저를 호출할 수 있습니다.    
EXECUTE hr.comm_pkg.reset_comm(0.15);
    /*
    PL/SQL 프로시저가 성공적으로 완료되었습니다.
    */

    -- 데이터 딕셔너리에서 패키지 정보 보기
        -- USER_OBJECTS
SELECT object_name, object_type
FROM user_objects
WHERE object_name LIKE 'COMM%';



-- 패키지에 포함된 프로시저와 함수는 개별적으로 조회할 수 없습니다.
SELECT object_name, object_type
FROM user_objects
WHERE object_type IN ('PROCEDURE', 'FUNCTION');


    
    -- USER_RESOURCE
--  패키지의 SPEC(명세)와 BODY 부분의 코드내용을 확인하기위해 USER_SOURCE를 조회합니다.
SELECT type, line, text 
FROM user_source
WHERE name='COMM_PKG'
ORDER BY type, line;



    -- SQL 코드 암호화
        -- 파일을 메모장으로 '.sql'확장자로  저장합니다.
            /*
            D:\project\class_3>   wrap iname=comm_pkg_body.sql
            
            PL/SQL Wrapper: Release 11.2.0.2.0- 64bit Production on 일 8월  27 15:44:24 2023
            Copyright (c) 1993, 2009, Oracle.  All rights reserved.   
            Processing comm_pkg_body.sql to comm_pkg_body.plb
            */
               -- 'comm_pkg_body.plb'파일이 생성됩니다.
/*
-----<comm_pkg_body.plb>-----------------------------------------------------
CREATE OR REPLACE PACKAGE BODY comm_pkg wrapped 
a000000
34e
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
b
214 199
tfqhKMTxcPg6iSgpduR47slzpGwwg1zMNSdqfC+KrWS0DPSyebjH2Po1p8bi42K9odz8txZi
iWkljpuqTY5JYQNJzWWCg1g9XyCTssXDMevBKTDSqiSaFIqs5lyQXdwWodo84/GtFIPHPWEU
mGGpofrdMmA5wifdXfBv9sG6MyKps/xggalMlStU/Y7ti7mzgas6AswOb8BdoyGPSqxnwHJa
oVqwyYPvY2UnM8wi/2SZGTPRjzOpGn6N87dDWT6kV+NqCjE4UfAGFtrWDgHu0Y/KSS2d0Ab8
cxn0TYuzVVc+vnhZDqjRHpc1pTKEtiGw80DUQKR1S6VZHmC4b66GOF9l+k57up2RrqBWIrzj
B4Ic/8FqKb9Y3Myi9lHsftyfm+mKhtkeeZAk5B0PZtav
/
-----------------------------------------------------------------------------
*/

    -- 암호화된 코드로 Body를 재컴파일합니다.    
        -- @'경로'\'파일명.plb'
        -- @'파일명.plb'  
        /*
        D:\project\class_3> sqlplus hr/hr
        
        SQL*Plus: Release 11.2.0.2.0 Production on 일 8월 27 15:44:44 202
        Copyright (c) 1982, 2014, Oracle.  All rights reserved.
        Connected to:
        Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production
        
        SQL>  @comm_pkg_body.plb
        
        Package body created.
        */

SELECT type, line, text 
FROM user_source
WHERE name='COMM_PKG'
ORDER BY type, line;   
        -- 코드가 암호화되었습니다. 


    -- 패키지 삭제
        -- 전체 삭세
            /*
            DROP PACKAGE package_name;
            */
        -- 패키지 BODY 삭제
            /*
            DROP PACKAGE BODY package_name;
            */
            
DROP PACKAGE comm_pkg;
    /*
    Package COMM_PKG이(가) 삭제되었습니다.
    */

반응형