2024-11-25 02:47:25

패키지

관련있는 프로시저나 함수를 묶어 관리, 운영하는 기능

 

명세부

  • Create [Or Replace] Package 패키지 명
    IS
     Procedure 프로시저 명
     Functino 함수 명
    ......
    END;

 

몸체부

  • Create [Or Replace] Package Body 패키지 명
    IS
     Procedure 프로시저 명
    -프로시저 생성

     Functino 함수 명
    - 함수 생성
    ......
    END;

실행

  • EXECUTE [패키지명].[프로시저/함수 명];

 

ex)

<명세부>

CREATE OR REPLACE PACKAGE PACK1 is
procedure test2
(v_stu_no in student.stu_no%type,
v_stu_grade in student.stu_grade%type);
function test6
(v_enr_grade in number)
return char;
end;

 

<몸체부>

CREATE OR REPLACE PACKAGE BODY PACK1 IS
    PROCEDURE test2 (
        v_stu_no IN student.stu_no%TYPE,
        v_stu_grade IN student.stu_grade%TYPE
    ) IS
    BEGIN
        UPDATE student
        SET stu_grade = v_stu_grade
        WHERE stu_no = v_stu_no;
    END test2;

    FUNCTION test6 (
        v_enr_grade IN NUMBER
    ) RETURN char IS
        enr_score char;
    BEGIN
        IF v_enr_grade >= 90 THEN
            enr_score := 'A';
        ELSIF v_enr_grade >= 80 THEN
            enr_score := 'B';
        ELSIF v_enr_grade >= 70 THEN
            enr_score := 'C';
        ELSIF v_enr_grade >= 60 THEN
            enr_score := 'D';
        ELSE
            enr_score := 'F';
        END IF;
        RETURN enr_score;
    END test6;
END pack1;

 

select pack1.test6(85) from dual;

 

ONE-TIME ONLY 프로시저와 오버로딩

  • ONE-TIME ONLY 프로시저
    • 전역변수의 초기화나 기본적으로 처리하여야 할 로직
    • 패키지가 실행될 때 무조건 한번만 실행됨
    • 패키지 몸체부 가장 마지막 부분에 BEGIN절과 함께 정의됨
  • 오버로딩
    • 같은 이름의 여러개 프로시저 사용
    • 매개변수의 수가 다르거나, 순서를 달리하여 사용

 

<명세부>

 

  • CREATE OR REPLACE package C202144098.PACK2 is
    g_stu_dept varchar2(20);
    procedure test12 
    (v_stu_no in student.stu_no%type);
    procedure test12     -오버로딩-
    (v_stu_name student.stu_name%type);
    End;

 

<몸체부>

 

  • CREATE OR REPLACE PACKAGE BODY C202144098.PACK2 IS
        PROCEDURE test12 (v_stu_no IN student.stu_no%TYPE) IS
            v_stu_name student.stu_name%TYPE;
        BEGIN
            SELECT stu_name
            INTO v_stu_name
            FROM student
            WHERE stu_no = v_stu_no AND stu_dept = g_stu_dept;
            DBMS_OUTPUT.PUT_LINE(v_stu_name);
        EXCEPTION
            WHEN no_data_found THEN
                DBMS_OUTPUT.PUT_LINE('컴퓨터정보과에 학생이 없습니다.');
        END test12;

        PROCEDURE test12 (v_stu_name IN student.stu_name%TYPE) IS
            v_stu_no student.stu_no%TYPE;
        BEGIN
            SELECT stu_no
            INTO v_stu_no
            FROM student
            WHERE stu_name = v_stu_name AND stu_dept = g_stu_dept;
            DBMS_OUTPUT.PUT_LINE(v_stu_no);
        EXCEPTION
            WHEN no_data_found THEN
                DBMS_OUTPUT.PUT_LINE('컴퓨터정보과에 학생이 없습니다.');
        END test12;

    BEGIN
        g_stu_dept := '컴퓨터정보';
    END;             -ONE-TIME ONLY 프로시저

 

 

Execute pack2.test12(20191001);

 

Execute pack2.test12('김종헌');

 

 


트리거

어떤 조건에 맞는 이벤트가 일어나면 후속 이벤트를 발생시킴

 

트리거의 5 요소

  • 트리거 유형 : DML 단위의 트리거, 변경된 레코드 단위의 트리거
  • 트리거 동작 시점 : 트리거 동작 시점은 Before, After
  • 트리거 이벤트 : 트리거를 발생시킬 것 인지를 셜정
  • 트리거 조건 : 레코드 단위의 트리거에서만 설정할 수 있는 UPDATE 작업 시 특정 조건을 명시하여 조건에 맞는 레코드의 변셩에서만 트리거 이벤트를 발생
  • 트리거 몸체 : BEGIN ~ END절로 동작 정의

트리거의 형식

CREATE [OR REPLACE] TRIGGER 트리거 명

BEFORE | AFTER 이벤트 ON 테이블 명

[FOR EACH ROW]

[WHEN CONDITION]

BEGIN

...................

END;

 

트리거의 활성화 / 비활성화 / 삭제

ALTER TRIGGER 트리거 명 DISABLE / ENABLE

ALTER TABLE 테이블 명 DISABLE | ENABLE ALL TRIGGER

DROP TRIGGER 트리거 

'SQL' 카테고리의 다른 글

프로시저 / 함수 / 커서 - 페치 / 예외처리  (0) 2024.11.25
PL/SQL  (0) 2024.11.25
데이터 정의어 - DDL  (0) 2024.11.24
join  (0) 2024.10.08