<예시>
-- 사번 입력받은 후 해당 사원의 사번, 이름, 급여, 보너스율(%) 출력
-- 단, 보너스를 받지 않는 사원은 보너스율 출력 전 '보너스를 지급받지 않는 사원입니다' 출력
DECLARE
    EID EMPLOYEE.EMP_ID&TYPE;
    ENAME EMPLOYEE.EMP_NAME&TYPE;
    SALARY EMPLOYEE.SALARY&TTYPE;
    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;
/
SET SERVEROUTPUT ON;
<예시>
-- 국내팀, 해외팀 구분
DECLARE 
    EID EMPLOYEE.EMP_ID%TYPE;
    ENAME EMPLOYEE.EMP_NAME%TYPE; 
    DTITLE DEPARTMENT.DEPT_TITLE%TYPE;
    NCODE LOCATION.NATIONAL_CODE%TYPE;
    TEAM VARCHAR2(10);
BEGIN
    SELECT EMP_ID, EMP_NAME, DEPT_TITLE, NATIONAL_CODE
    INTO EID, ENAME, DTITLE, NCODE
    FROM EMPLOYEE
    JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID)
    JOIN LOCATION ON (LOCATION_ID = LOCAL_CODE)
    WHERE EMP_ID = '&사번';
    
    IF NCODE = 'KO' THEN TEAM := '국내팀';
    ELSE TEAM := '해외팀';
    END IF;
    
    DBMS_OUTPUT.PUT_LINE('사번: ' || EID);
    DBMS_OUTPUT.PUT_LINE('이름: ' || ENAME);
    DBMS_OUTPUT.PUT_LINE('부서명: ' || DTITLE);
    DBMS_OUTPUT.PUT_LINE('소속: ' || TEAM);
END;
[표현법]
LOOP
반복적으로 실행할 구문
END LOOP;
=> 반복문을 빠져나갈 수 있는 구문 (2가지)
----- 1) IF 조건식 THEN EXIT;
----- 2) EXIT WHEN 조건식;
-- 1~5 까지 순차적으로 1씩 증가하는 값 출력
DECLARE 
    I NUMBER := 1;
BEGIN
    LOOP
        DBMS_OUTPUT.PUT_LINE(I);
        I := I + 1;
        
        -- IF I = 6 THEN EXIT; END IF; ----1)
        EXIT WHEN I = 6;               ----2)
    END LOOP;
END;
/
[표현법]
FOR 변수 IN(REVERSE) 초기값... 최종값
LOOP
반복적으로 실행할 구문
END LOPP;
-- 1~5 순차적   
BEGIN 
    FOR I IN 1..5
    LOOP
        DBMS_OUTPUT.PUT_LINE(I);
    END LOOP;
END;
/
-- 5~1 반대로
BEGIN 
    FOR I IN REVERSE 1..5
    LOOP
        DBMS_OUTPUT.PUT_LINE(I);
    END LOOP;
END;
/
-- 반복문을 이용한 데이터 삽입
CREATE TABLE TEST2(
    TEST_NO NUMBER PRIMARY KEY,
    TEST_DATE DATE
);
CREATE SEQUENCE SEQ_TEST2
START WITH 100;
BEGIN 
    FOR I IN 1..50
    LOOP   
        INSERT INTO TEST2 VALUES (SEQ_TEST2.NEXTVAL, SYSDATE);
    END LOOP;
END;
/
 [표현법]
WHILE 반복이 수행될 조건
LOOP
반복적으로 수행될 구문
END LOOP;
<예시>
-- 6보다 작을 때 까지 반복수행
DECLARE 
    I NUMBER := 1;
BEGIN
    WHILE I < 6
    LOOP
        DBMS_OUTPUT.PUT_LINE(I);
        I := I + 1;
    END LOOP;
END;
/
: 예외(EXCEPTION) - 실행 중 발생하는 오류
= 자바의 TRY CATCH 느낌
[표현법]
EXCEPTION
WHEN 예외명1 THEN 예외처리구문1;
WHEN 예외명2 THEN 예외처리구문2;
...
WHEN OTHERS THEN 예외처리구문N;
< 시스템 예외 (오라클에서 미리 정의되어 있는 예외) >
-- 사용자가 입력한 수로 나눗셈 연산한 결과 출력
DECLARE 
    RESULT NUMBER;
BEGIN
    RESULT := 10 / &숫자;
    DBMS_OUTPUT.PUT_LINE('결과 : ' || RESULT);
EXCEPTION
   -- WHEN ZERO_DIVIDE THEN DBMS_OUTPUT.PUT_LINE('나누기 연산시 0으로 나눌 순 없습니다.');
    WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('나누기 연산시 0으로 나눌 순 없습니다.');
END;
/
-- 202번인 노옹철 사원의 사번을 바꿀때 중복되는 것을 피하고자 한다면?
BEGIN 
	UPDATE EMPLOYEE
    SET EMP_ID = '&변경할 사번'
    WHERE EMP_NAME = '노옹철';
EXCEPTION
    WHEN DUP_VAL_ON_INDEX THEN DBMS_OUTPUT.PUT_LINE('이미 존재하는 사번입니다.');
END;
/
<예시>
DECLARE 
    EID EMPLOYEE.EMP_ID%TYPE;
    ENAME EMPLOYEE.EMP_NAME%TYPE;
BEGIN
    SELECT EMP_ID, EMP_NAME
    INTO EID, ENAME
    FROM EMPLOYEE
    WHERE MANAGER_ID = &사수사번;
    
    DBMS_OUTPUT.PUT_LINE('사번: '|| EID);
    DBMS_OUTPUT.PUT_LINE('이름: '|| ENAME);
EXCEPTION
    --WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE('조회결과가 없습니다');
    --WHEN TOO_MANY_ROWS THEN DBMS_OUTPUT.PUT_LINE('너무 많은 행이 조회되었습니다');
    WHEN OTHERS THEN  DBMS_OUTPUT.PUT_LINE('조회결과가 없거나 너무 많습니다'); --> 한꺼번에 출력
END;
/
: 내가 지정한 테이블에 INSERT, UPDATE, DELETE 와 같은 DML문에 의해 변경되었을 경우
(테이블에 이벤트 발생했을 경우) 자동(묵시적)으로 매번 실행될 내용을 정의해둘 수 있는 객체
활용 예시)
 [표현법]
CREATE (OR REPLACE) TRIGGER 트리거명(TRG_)
( BEFORE | AFTER ) ,  ( INSERT | UPDATE | DELETE ) ON 테이블명
(FOR EACH ROW) --> 딱 한 행만
DECLARE
변수선언;
BEGIN
해당 위에 지정된 이벤트 발생 시 자동(묵시적)으로 실행할 구문;
EXCEPTION
예외처리구문;
END;
/
<예시>
-- EMP 테이블에 새로운 행이 INSERT 될 때마다 자동으로 메시지 출력하는 트리거정의
CREATE OR REPLACE TRIGGER TRG_01
AFTER INSERT ON EMPLOYEE
BEGIN 
   DBMS_OUTPUT.PUT_LINE('신입사원님 환영합니다');
END;
/
-- TB_PRODETAIL 테이블에 INSERT 후 
-- 자동으로 TB_PRODUCT 테이블에 UPDATE 되게끔 트리거 정의
-- NEW: 활용, FOR EACH ROW 활용, 조건문 활용
CREATE OR REPLACE TRIGGER TRG_02
AFTER INSERT ON TB_PRODETAIL
FOR EACH ROW 
BEGIN 
   IF (:NEW.STATUS = '입고')
       THEN 
           UPDATE TB_PRODUCT
           SET STOCK = STOCK + :NEW.AMOUNT
           WHERE PCODE = :NEW.PCODE;
   END IF;
   IF (:NEW.STATUS = '출고')
       THEN 
           UPDATE TB_PRODUCT
           SET STOCK = STOCK - :NEW.AMOUNT
           WHERE PCODE = :NEW.PCODE;
   END IF;
END;
/