1. PL/SQL 기본 구조
DECLARE
    -- 변수를 선언하는 부분
BEGIN
    -- 실제로 실행할 코드를 작성하는 부분
EXCEPTION
    -- 오류가 발생했을 때 처리하는 부분
END;
/

이것이 PL/SQL의 기본 뼈대입니다. 마치 우리가 요리 레시피를 쓰는 것처럼, 준비물(DECLARE), 조리과정(BEGIN), 실수했을 때 대처방법(EXCEPTION)으로 구성됩니다.

  1. 변수 사용하기
DECLARE
    -- 변수_이름 변수_타입;
    이름 VARCHAR2(50);          -- 문자를 저장하는 변수
    나이 NUMBER := 25;          -- 숫자를 저장하는 변수
    급여 NUMBER DEFAULT 1000;   -- 기본값이 1000인 숫자 변수
BEGIN
    이름 := '홍길동';           -- 변수에 값 저장하기
    -- 화면에 출력하기
    DBMS_OUTPUT.PUT_LINE('이름: ' || 이름);
END;
/

변수는 우리가 데이터를 임시로 보관하는 상자라고 생각하면 됩니다.

  1. 조건문 (IF문)
-- 만약 급여가 3000 이상이면 '고액연봉', 아니면 '일반연봉' 출력
IF 급여 >= 3000 THEN
    DBMS_OUTPUT.PUT_LINE('고액연봉');
ELSE
    DBMS_OUTPUT.PUT_LINE('일반연봉');
END IF;

IF문은 특정 조건에 따라 다른 작업을 수행할 때 사용합니다.

  1. 반복문
-- 1부터 5까지 숫자 출력하기
FOR i IN 1..5 LOOP
    DBMS_OUTPUT.PUT_LINE('숫자: ' || i);
END LOOP;

같은 작업을 여러 번 반복할 때 사용합니다.

  1. 커서 (데이터 가져오기)
DECLARE
    -- 직원정보를 가져오는 커서 선언
    CURSOR 직원커서 IS
        SELECT 이름, 급여 FROM 직원테이블;
    직원정보 직원커서%ROWTYPE;  -- 커서의 데이터를 담을 변수
BEGIN
    -- 커서 열기
    OPEN 직원커서;

    -- 데이터 하나씩 가져오기
    LOOP
        FETCH 직원커서 INTO 직원정보;
        EXIT WHEN 직원커서%NOTFOUND;  -- 더 이상 데이터가 없으면 종료

        -- 각 직원의 정보 출력
        DBMS_OUTPUT.PUT_LINE('이름: ' || 직원정보.이름 ||
                            ', 급여: ' || 직원정보.급여);
    END LOOP;

    -- 커서 닫기
    CLOSE 직원커서;
END;
/

커서는 데이터베이스에서 여러 데이터를 하나씩 가져와서 처리할 때 사용합니다.

  1. 예외 처리
DECLARE
    결과 NUMBER;
BEGIN
    결과 := 100/0;  -- 0으로 나누기(오류 발생)
EXCEPTION
    WHEN ZERO_DIVIDE THEN
        -- 0으로 나눌 때 오류 처리
        DBMS_OUTPUT.PUT_LINE('0으로 나눌 수 없습니다!');
    WHEN OTHERS THEN
        -- 그 외 모든 오류 처리
        DBMS_OUTPUT.PUT_LINE('오류가 발생했습니다!');
END;
/

프로그램 실행 중 발생할 수 있는 오류를 처리하는 방법입니다.

    1. 간단한 실제 예제
-- 직원의 연봉을 계산하는 프로그램
DECLARE
    v_월급 NUMBER := 3000000;
    v_연봉 NUMBER;
    v_보너스 NUMBER := 500000;
BEGIN
    -- 연봉 계산 (월급 * 12 + 보너스)
    v_연봉 := (v_월급 * 12) + v_보너스;

    -- 결과 출력
    DBMS_OUTPUT.PUT_LINE('연봉 계산 결과');
    DBMS_OUTPUT.PUT_LINE('----------------');
    DBMS_OUTPUT.PUT_LINE('월급: ' || v_월급 || '원');
    DBMS_OUTPUT.PUT_LINE('보너스: ' || v_보너스 || '원');
    DBMS_OUTPUT.PUT_LINE('연봉: ' || v_연봉 || '원');
END;
/