Published 2022. 11. 25. 17:34

< PL / SQL >

    PROCEDURE LANGUAGE EXTENSION TO SQL
    
    오라클에 내장되어있는 절차적 언어로 
    SQL문 내에서 변수 활용, 조건처리(IF), 반복처리(LOOP,FOR,WHILE)등을 지원하여 SQL의 단점을 보완
    다수의 SQL문을 한번에 실행 가능 (BLOCK 구조)
    
    * PL/SQL 구조
    - [선언부 (DECLARE SECTION)] : DECLARE로 시작, 변수나 상수를 선언 및 초기화하는 부분
    - 실행부 (EXECUTABLE SECTION) : BEGIN으로 시작, SQL문 또는 제어문 (조건문, 반복문)등의 로직을 기술하는 부분
    - [예외처리부 (EXCEPTION SECTION)] : EXCEPTION으로 시작, 예외발생시 해결하기 위한 구문을 미리 기술해  둘 수       있는 부분
    

* 출력을위해 한번은 실행해야됨 (OFF-> ON)

SET SERVEROUTPUT ON;

 

 1. DECLARE 선언부


      변수 및 상수 선언하는 공간 (선언과 동시에 초기화도 가능) 
      일반타입변수, 레퍼런스타입변수, ROW타입 변수 
      
    1_1) 일반타입변수 선언 및 초기화 
           변수명 [CONSTANT(상수)] 자료형 [:= 값];

DECLARE 
    EID NUMBER;
    ENAME VARCHAR2(20);
    ACADEMY CONSTANT VARCHAR2(30) := '구디아카데미';
BEGIN 
    EID := &번호;
    ENAME := '&이름';
    
    DBMS_OUTPUT.PUT_LINE('EID : ' || EID);
    DBMS_OUTPUT.PUT_LINE('ENAME : ' || ENAME);
    DBMS_OUTPUT.PUT_LINE('ACADEMY : ' || ACADEMY);
END;
/

 

1_2) 레퍼런스타입변수 선언 및 초기화
          변수명 테이블명.컬럼명%TYPE; --> 특정 컬럼의 데이터 타입을 참조해서 그타입으로 지정

DECLARE
    EID EMPLOYEE.EMP_ID%TYPE;
    ENAME EMPLOYEE.EMP_NAME%TYPE;
    SAL EMPLOYEE.SALARY%TYPE;
BEGIN
    --EID := '300';
    --ENAME := '강람보';
    --SAL := 2000000;
    
    --200번 사원의 사번, 사원명, 급여 조회해서 각 변수에 대입
    SELECT EMP_ID, EMP_NAME,SALARY
     INTO EID,ENAME,SAL
     FROM  EMPLOYEE
    WHERE EMP_ID = &사번; --사용자가 입력한 사번과 일치하는 사원 조회 
    
    DBMS_OUTPUT.PUT_LINE('EID : ' || EID);
    DBMS_OUTPUT.PUT_LINE('ENAME : ' || ENAME);
    DBMS_OUTPUT.PUT_LINE('SAL : ' || SAL);
END;
/


  1_3) ROW타입 변수 선언 
       테이블의 한 행에 대한 모든 컬럼값을 한꺼번에 담을 수 있는 변수 
       변수명 테이블명%ROWTYPE;     

DECLARE
     E EMPLOYEE%ROWTYPE;
BEGIN 
    SELECT *
    INTO E
    FROM EMPLOYEE
    WHERE EMP_ID = &사번;
    
   -- DBMS_OUTPUT.PUT_LINE(E); -> 오류
   DBMS_OUTPUT.PUT_LINE('사원명 : ' || E.EMP_NAME);
   DBMS_OUTPUT.PUT_LINE('급여 : ' || E.SALARY);
   DBMS_OUTPUT.PUT_LINE('보너스 : ' || NVL(E.BONUS,0));
END;
/

    

2. BEGIN 실행부 
   

   < 조건문 >

   
 1) IF 조건식 THEN 실행내용 END IF; (단일 IF문)


예시) 특정 사원의 사번, 이름, 급여, 보너스율(%) 출력
단, 보너스를 받지 않는 사원은 보너스율 출력 전 '보너스를 지급받지 않는 사원입니다' 출력

DECLARE
    EID EMPLOYEE.EMP_ID%TYPE;
    ENAME EMPLOYEE.EMP_NAME%TYPE;
    SALARY EMPLOYEE.SALARY%TYPE;
    BONUS EMPLOYEE.BONUS%TYPE;
BEGIN 
    SELECT EMP_ID,EMP_NAME,SALARY,NVL(BONUS,0)
    INTO EID,ENAME,SALARY,BONUS
    FROM EMPLOYEE
    WHERE EMP_ID = &사번;
    
    DBMS_OUTPUT.PUT_LINE('사번 : '||EID);
    DBMS_OUTPUT.PUT_LINE('이름 : '||ENAME);
    DBMS_OUTPUT.PUT_LINE('급여 : '||SALARY);
    
    IF BONUS = 0 
        THEN DBMS_OUTPUT.PUT_LINE('보너스를 지급받지 않는 사원입니다.'); 
    END IF;
    
    DBMS_OUTPUT.PUT_LINE('보너스율 : ' ||BONUS*100 ||'%');

END;
/

 

2) IF 조건식 THEN 실행내용 ELSE 실행내용 END IF; (IF-ELSE문)

DECLARE
    EID EMPLOYEE.EMP_ID%TYPE;
    ENAME EMPLOYEE.EMP_NAME%TYPE;
    SALARY EMPLOYEE.SALARY%TYPE;
    BONUS EMPLOYEE.BONUS%TYPE;
BEGIN 
    SELECT EMP_ID,EMP_NAME,SALARY,NVL(BONUS,0)
    INTO EID,ENAME,SALARY,BONUS
    FROM EMPLOYEE
    WHERE EMP_ID = &사번;
    
    DBMS_OUTPUT.PUT_LINE('사번 : '||EID);
    DBMS_OUTPUT.PUT_LINE('이름 : '||ENAME);
    DBMS_OUTPUT.PUT_LINE('급여 : '||SALARY);
    
    IF BONUS = 0 
        THEN DBMS_OUTPUT.PUT_LINE('보너스를 지급받지 않는 사원입니다.'); 
    ELSE 
        DBMS_OUTPUT.PUT_LINE('보너스율 : ' ||BONUS*100 ||'%');
    END IF;
    
END;
/

 

3) IF조건식1 THEN 실행내용1 ELSIF 조건식2 THEN 실행내용2 ...[ELSC 실행내용N] END IF (IF-ELSE IF)

DECLARE
    SCORE NUMBER; 
    GRADE VARCHAR2(10);
BEGIN
    SCORE := &점수;
    
    IF SCORE>=90 THEN GRADE := 'A';
    ELSIF SCORE >=80 THEN GRADE := 'B';
    ELSIF SCORE >=70 THEN GRADE := 'C';
    ELSIF SCORE >=60 THEN GRADE := 'D';
    ELSE GRADE := 'F';
    END IF;
    
    DBMS_OUTPUT.PUT_LINE('당신의 점수는 ' || SCORE ||'점이고, 학점은 '||GRADE||'학점 입니다.');
END;
/

 

4) CASE WHEN THEN구문

  CASE 비교대상자 WHEN 비교값1 THEN 결과값1 WHEN 비교값2 THEN 결과값2 ... [ELSE 결과값N] END;

DECLARE
    EMP EMPLOYEE%ROWTYPE;
    DNAME VARCHAR2(30);
    
BEGIN
    SELECT *
    INTO EMP
    FROM EMPLOYEE
    WHERE EMP_ID = &사번;
    
    DNAME := CASE EMP.DEPT_CODE
                WHEN 'D1' THEN '인사팀'
                WHEN 'D2' THEN '회계팀'
                WHEN 'D3' THEN '마케팅팀'
                ELSE '기타팀'
                END;
    DBMS_OUTPUT.PUT_LINE( EMP.EMP_NAME||'님은 '|| DNAME || '입니다. ');               
            
END;
/

 

'ORACLE' 카테고리의 다른 글

ORACLE 13. PLSQL _예외처리  (0) 2022.11.25
ORACLE 13. PLSQL _반복문  (0) 2022.11.25
ORACLE 12. OBJECT (SEQUENCE)  (0) 2022.11.25
ORACLE 11. OBJECT (VIEW) _ VIEW 옵션  (0) 2022.11.24
ORACLE 11. OBJECT (VIEW) _ DML  (0) 2022.11.24
복사했습니다!