본문 바로가기
Database

Oracle PL/SQL이란?

by Lcoding 2024. 11. 23.
반응형

안뇽하세요 오늘은 Oracle의 PL/SQL에 대하여 정리해보겠습니다.

 

Oracle PL/SQL(Procedural Language/SQL)은 Oracle Database에서 SQL과 함께 사용할 수 있는 프로시저 언어로,

SQL의 한계를 보완하고 프로그래밍 로직을 작성할 수 있도록 합니다.

 

PL/SQL의 기본 문법과 주요 구성 요소를 알아보겠습니다.

 

1. PL/SQL 블록 구조

PL/SQL은 크게 익명 블록저장 프로시저/함수로 나뉩니다. 모든 PL/SQL 코드는 아래와 같은 블록 구조를 가집니다.

DECLARE
    -- 변수 선언
    변수명 데이터타입 [DEFAULT 초기값];
BEGIN
    -- 실행부
    NULL; -- 기본 실행문 (아무 작업도 하지 않음)
EXCEPTION
    -- 예외 처리부 (옵션)
    WHEN 예외명 THEN
        NULL; -- 예외 처리
END;
 
  • DECLARE: 변수, 상수, 커서 등을 선언하는 부분 (선택 사항)
  • BEGIN: 실행 구문 시작
  • EXCEPTION: 오류나 예외를 처리하는 구문 (선택 사항)
  • END: PL/SQL 블록 종료

 

2. 변수 선언 및 데이터 타입

DECLARE
    v_name VARCHAR2(100); -- 문자열 변수
    v_age NUMBER(3) := 30; -- 숫자 변수 (초기값 지정)
    v_salary NUMBER := 50000; -- 숫자 변수 (크기 제한 없이 지정)
    v_date DATE := SYSDATE; -- 날짜 변수
    v_constant CONSTANT NUMBER := 100; -- 상수
BEGIN
    DBMS_OUTPUT.PUT_LINE('Name: ' || v_name);
END;

 

 

  • 데이터 타입: VARCHAR2, NUMBER, DATE, BOOLEAN, BLOB 등.
  • 상수(CONSTANT): 값을 변경할 수 없는 변수.

 

3. 제어문

3_1. 조건문 (IF / CASE)

-- IF 구문
IF 조건 THEN
    실행문;
ELSIF 조건 THEN
    실행문;
ELSE
    실행문;
END IF;

-- CASE 구문
CASE 
    WHEN 조건 THEN 실행문;
    WHEN 조건 THEN 실행문;
    ELSE 실행문;
END CASE;

 

3_2. 반복문 (LOOP)

-- 기본 LOOP
LOOP
    EXIT WHEN 조건;
    실행문;
END LOOP;

-- WHILE LOOP
WHILE 조건 LOOP
    실행문;
END LOOP;

-- FOR LOOP
FOR i IN 1..10 LOOP
    DBMS_OUTPUT.PUT_LINE('i: ' || i);
END LOOP;

4. 커서(Cursor)

4_1. 명시적 커서

DECLARE
    CURSOR cur IS SELECT name, age FROM employees;
    v_name employees.name%TYPE;
    v_age employees.age%TYPE;
BEGIN
    OPEN cur;
    LOOP
        FETCH cur INTO v_name, v_age;
        EXIT WHEN cur%NOTFOUND;
        DBMS_OUTPUT.PUT_LINE('Name: ' || v_name || ', Age: ' || v_age);
    END LOOP;
    CLOSE cur;
END;

4_2. 묵시적 커서

BEGIN
    FOR rec IN (SELECT name, age FROM employees) LOOP
        DBMS_OUTPUT.PUT_LINE('Name: ' || rec.name || ', Age: ' || rec.age);
    END LOOP;
END;

 

5. 예외 처리

BEGIN
    -- 실행문
    NULL;
EXCEPTION
    WHEN ZERO_DIVIDE THEN
        DBMS_OUTPUT.PUT_LINE('0으로 나눌 수 없습니다.');
    WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE('알 수 없는 오류 발생');
END;

 

6. 프로시저 / 함수

6_1. 저장 프로시저

CREATE OR REPLACE PROCEDURE procedure_name (param1 IN NUMBER, param2 OUT NUMBER) AS
BEGIN
    param2 := param1 * 2;
END;

6_2. 함수

CREATE OR REPLACE FUNCTION function_name (param1 NUMBER) RETURN NUMBER AS
    result NUMBER;
BEGIN
    result := param1 * 2;
    RETURN result;
END;

6_3. 호출 방법

-- 프로시저 호출
DECLARE
    v_result NUMBER;
BEGIN
    procedure_name(10, v_result);
    DBMS_OUTPUT.PUT_LINE('Result: ' || v_result);
END;

-- 함수 호출
DECLARE
    v_result NUMBER;
BEGIN
    v_result := function_name(10);
    DBMS_OUTPUT.PUT_LINE('Result: ' || v_result);
END;

7. 패키지

7.1 패키지 선언부

CREATE OR REPLACE PACKAGE package_name AS
    PROCEDURE proc_name(param IN NUMBER);
    FUNCTION func_name(param IN NUMBER) RETURN NUMBER;
END package_name;

 

7.2 패키지 본문

CREATE OR REPLACE PACKAGE BODY package_name AS
    PROCEDURE proc_name(param IN NUMBER) IS
    BEGIN
        DBMS_OUTPUT.PUT_LINE('Param: ' || param);
    END;

    FUNCTION func_name(param IN NUMBER) RETURN NUMBER IS
    BEGIN
        RETURN param * 2;
    END;
END package_name;

8. 트리거

CREATE OR REPLACE TRIGGER trigger_name
AFTER INSERT OR UPDATE OR DELETE ON table_name
FOR EACH ROW
BEGIN
    IF INSERTING THEN
        DBMS_OUTPUT.PUT_LINE('Inserted');
    ELSIF UPDATING THEN
        DBMS_OUTPUT.PUT_LINE('Updated');
    ELSIF DELETING THEN
        DBMS_OUTPUT.PUT_LINE('Deleted');
    END IF;
END;

9. DBMS_OUTPUT 패키지

  • DBMS_OUTPUT.PUT_LINE: 디버깅 및 출력에 사용
BEGIN
    DBMS_OUTPUT.PUT_LINE('Hello, PL/SQL!');
END;

 

이러한 기본 문법들을 바탕으로 응용하여 업무에서 PL/SQL을 활용하여

 

데이터 처리, 로직 작성, 성능 최적화를 구현할 수 있습니다.

 

감사합니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형

# 로딩 화면 동작 코드(Code) 설정하기
loading