[데이터베이스] PL/SQL을 활용한 프로시저

    PL/SQL

    SQL 만으로는 구현이 어렵거나 구현 불가능한 작업을 수행하기 위해 오라클에서 제공하는 프로그램 언어

    구성 키워드  필수 / 선택 설명
    DECLARE(선언부) 선택 실행에 사용될 변수, 상수, 커서 등을 선언
    BEGIN(실행부) 필수  조건문,반복문,SELECT,DML 함수 등을 정의
    EXCEPTION(예외처리부) 선택 PL/SQL 실행 도중 발생하는 오류(예외사항)을 해결하는 문장 기술

     

    PL/SQL 블록의 기본 방식

    DECLARE
           [실행에 필요한 여러 요소 선언];
    BEGIN
          [작업을 위해실제 실행하는 명령어];
    EXCEPTION 
          [PL/SQL 수행 도중 발생하는 오류 처리];
    END; 
    /

    작성시 주의할 점

    PL/SQL 블록을 구성하는 DECLARE, BEGIN 등에는 세미콜론(;)을 사용하지 않음. 각 부분에서 실행할 문장 끝에는 세미콜론 붙임. 내부에서 한 줄 주석과 여러 줄 주석 사용 가능 ((--),(/* ~*/) 

    PL/SQL 작성을 마치고 실행하기 위해 슬래시(/)를 사용

     

    변수 선언과 사용

    선언부에 작성하고 실행부에서 활용함

    기본형식: 변수이름 변수형 : = 겂 또는 값이 도출되는 여러 표현식; 또는 pEmpno EMP.EMPNO%TYPE 으로 적용 가능  

     

    상수 정의

    변수이름 CONSTANT 자료형 := 값 또는 값을 도출하는 여러 표현식;

    변수 기본값 지정

    변수이름  자료형 DEFAULT 값 또는 값 도출되는 여러 표현식;  

    변수 NULL 값 저장 막기

    변수이름 자료형 NOT NULL := 또느느 DEFAULT 값 또는 값이 도출되는 표현식

     

    변수 이름 (식별자) 규칙

    같은 블록 안에서 식별자는 고유해야 하며 중복될 수 없음

    대소문자를 구분하지 않음

    테이블 이름 붙이는 규칙과 동일

    1. 문자로 시작 2.30BYTE 이하(영어 30글자 한글 13글자 그러나 한글은 되도록쓰지말것. ) 3. 숫자(0-9), 특수문자 ($,#,_) TKDYD RKSMD

    4. SQL 키워드가 아닐 것 (EX. SELECT)  

     

    여기서의 BOOLEAN 은 NULL 값도 포함해 총 3개 (TRUE, FALSE, NULL)

    --PL/SQL
    --출력 함수인 DBMS_OUTPUT.PUT.LINE 사용시 출력용
    SET SERVEROUTPUT ON;
    
    --PL/SQL의 기본 문법
    DECLARE
        DATA EMP%ROWTYPE;
    BEGIN
        DBMS_OUTPUT.PUT_LINE('PL/SQL 시작.......');
        
        SELECT *
          INTO DATA
          FROM EMP
         WHERE EMPNO='2001';
         
         DBMS_OUTPUT.PUT_LINE(DATA.EMPNO||','||DATA.ENAME || ',' || DATA.JOB);
    END;
    /

     

     

    IF 조건문

    IF 조건식 THEN 수행할 명령어 ; 

    END IF;

     

    IF - THEN

    IF - THEN - ELSE

    IF - THEN - ELSEIF

     

    LOOP

    WHILE LOOP

    FOR LOOP

    Cusor FOR LOOP

     

    EXIT

    EXIT-WHEN

    ...

    사진참고

     

    프로시저는 등록을 아예 해두고 쓸 수 있는 것, (배치에서 사용 가능)

    --프로시저
    CREATE OR REPLACE PROCEDURE InsertEMP
    --CREATE와 AS 사이는 매게변수의 역할을 한다. 지금 여기! 
    (
        P_ENAME IN VARCHAR2
    )
    AS
    --BEGIN에서 사용할 실질적인 변수 정의는 여기
        P_EMPNO CHAR(4);    --P_EMPNO EMP.EMPNO%TYPE; //EMPNO와 타입을 맞추라는 뜻
    BEGIN
        DBMS_OUTPUT.PUT_LINE('InsertEMP 시작...');
        INSERT INTO EMP (EMPNO, ENAME, HIREDATE)
        VALUES (EX_EMPNO_SEQ.NEXTVAL, P_ENAME, SYSDATE);
        COMMIT;
        
        DBMS_OUTPUT.PUT_LINE ('이름은 '||P_ENAME);
    END;
    /
    
    --프로시저 실행
    
    EXEC InsertEMP('홍길동');
    
    SELECT MAX(EMPNO) FROM EMP;
    
    SELECT * FROM EMP ORDER BY EMPNO DESC;

    프로시저 검색해서찾기

     

     

    프로시저 안에서 LOOP 사용하기

     

     

    프로시저 - 커서

    커서
    /*
        반환되는 수행결과가 여러 행일 때 이를 처리하기 위해 사용. 
        1. 커서 선언
        CURSOR 커서이름 IS SELECT문장;
        2. 커서 오픈
        OPEN 커서이름;
        3. 커서로부터 데이터 읽어오기(LOOP END 반복문 사용) 
        FETCH 커서이름 INTO 저장할 로컬 변수(프로시저에서 사용할...)
        4. 커서 닫기
        CLOSE 커서이름;
        
    --커서 속성
        %FOUND : 마지막으로 얻은 커서 결과 SET에 레코드가 있으면 TRUE
        %NOTFOUND : 마지막으로 얻은 커서 결과 SET 에 레코드가 없으면 TRUE 
        %ROWCOUNT : 커서에서 얻은 레코드 수 반환. 
        %ISOPEN : 커서가 열렸고 아직 닫히지 않은 상태일 때에 TRUE

     

     

    CREATE OR REPLACE PROCEDURE EX_SAMPLE(E_JOB IN EMP.JOB%TYPE)
    IS
        NAME EMP.ENAME%TYPE;
        CURSOR c_name IS SELECT ENAME FROM EMP WHERE JOB LIKE '%'||E_JOB||'%'; --커서 선언
    BEGIN
        OPEN c_name; --커서 오픈
        DBMS_OUTPUT.PUT_LINE('++++++++++++++++++++++++++++++++++++++++++++++++++');
        LOOP 
            FETCH c_name INTO NAME;     --커서로부터 데이터 읽기
            EXIT WHEN c_name%NOTFOUND;  --커서에 데이터가 없을 때에 반복문 종료. 
            
            DBMS_OUTPUT.PUT_LINE(NAME||'님의 직급은 ' || E_JOB ||'입니다.');
        END LOOP;
        DBMS_OUTPUT.PUT_LINE('커서 처리건수 " '|| c_name%ROWCOUNT);
        
        IF c_name%ISOPEN THEN 
             DBMS_OUTPUT.PUT_LINE('커서가 열려 있습니다.');
            CLOSE c_name; --커서 닫기
        ELSE 
                 DBMS_OUTPUT.PUT_LINE('커서가 닫혀 있습니다.');
        END IF;
    
    END;
    /
    
    EXEC EX_SAMPLE ('팀장');

    댓글