본문 바로가기
  • alert("Rocomi의 개발공부 블로그")
DATABASE 공부

PL/SQL

by Rocomi 2024. 7. 31.

PL/SQL(Procedural Language/Structured Query Language)은 오라클 데이터베이스에서 SQL을 확장한 절차적 프로그래밍 언어입니다. PL/SQL은 SQL의 데이터 조작 기능과 절차적 언어의 제어 구조를 결합하여 더 강력하고 복잡한 데이터베이스 응용 프로그램을 개발할 수 있도록 합니다. PL/SQL은 블록 구조를 사용하여 코드를 구성하고, 변수, 조건문, 반복문, 예외 처리 등을 지원합니다.

PL/SQL의 주요 특징

  1. 블록 구조: PL/SQL 코드는 블록 구조로 구성됩니다. 블록은 선언부, 실행부, 예외 처리부로 나뉩니다.
  2. 변수: PL/SQL은 변수를 선언하고 사용할 수 있습니다.
  3. 조건문: IF-THEN-ELSE 문을 사용하여 조건부 논리를 구현할 수 있습니다.
  4. 반복문: LOOP, WHILE LOOP, FOR LOOP를 사용하여 반복 작업을 수행할 수 있습니다.
  5. 예외 처리: EXCEPTION 블록을 사용하여 오류를 처리할 수 있습니다.
  6. 커서: PL/SQL에서는 커서를 사용하여 SQL 쿼리의 결과 집합을 순회할 수 있습니다.
  7. 프로시저와 함수: PL/SQL에서는 프로시저와 함수를 정의하고 호출할 수 있습니다.

PL/SQL 블록 구조

PL/SQL 블록은 다음과 같은 구조를 가집니다:

1
2
3
4
5
6
7
8
9
10
11
12
DECLARE
    -- 선언부: 변수, 상수, 커서 등을 선언합니다.
    v_variable_name NUMBER;
BEGIN
    -- 실행부: 실제 실행할 코드를 작성합니다.
    v_variable_name := 100;
    DBMS_OUTPUT.PUT_LINE('변수 값: ' || v_variable_name);
EXCEPTION
    -- 예외 처리부: 예외가 발생했을 때 실행할 코드를 작성합니다.
    WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE('예외 발생');
END;
cs

예제: 간단한 PL/SQL 블록

다음은 간단한 PL/SQL 블록 예제입니다:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
DECLARE
    v_employee_name VARCHAR2(50);
BEGIN
    SELECT first_name || ' ' || last_name
    INTO v_employee_name
    FROM employees
    WHERE employee_id = 100;
 
    DBMS_OUTPUT.PUT_LINE('Employee Name: ' || v_employee_name);
EXCEPTION
    WHEN NO_DATA_FOUND THEN
        DBMS_OUTPUT.PUT_LINE('No employee found with ID 100');
    WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE('An unexpected error occurred');
END;
cs

PL/SQL에서 사용되는 주요 구성 요소

변수 선언과 사용

변수를 선언하고 사용하는 방법은 다음과 같습니다:

1
2
3
4
5
6
7
DECLARE
    v_number NUMBER := 10;
    v_string VARCHAR2(50) := 'Hello, PL/SQL!';
BEGIN
    DBMS_OUTPUT.PUT_LINE('Number: ' || v_number);
    DBMS_OUTPUT.PUT_LINE('String: ' || v_string);
END;
cs

조건문

IF-THEN-ELSE 문을 사용하여 조건부 논리를 구현할 수 있습니다:

1
2
3
4
5
6
7
8
9
10
DECLARE
    v_salary NUMBER := 5000;
BEGIN
    IF v_salary > 4000 THEN
        DBMS_OUTPUT.PUT_LINE('High salary');
    ELSE
        DBMS_OUTPUT.PUT_LINE('Average or low salary');
    END IF;
END;
 
cs

반복문

LOOP, WHILE LOOP, FOR LOOP를 사용하여 반복 작업을 수행할 수 있습니다:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
DECLARE
    v_counter NUMBER := 1;
BEGIN
    -- 기본 LOOP
    LOOP
        EXIT WHEN v_counter > 5;
        DBMS_OUTPUT.PUT_LINE('Counter: ' || v_counter);
        v_counter := v_counter + 1;
    END LOOP;
 
    -- WHILE LOOP
    v_counter := 1;
    WHILE v_counter <= 5 LOOP
        DBMS_OUTPUT.PUT_LINE('Counter: ' || v_counter);
        v_counter := v_counter + 1;
    END LOOP;
 
    -- FOR LOOP
    FOR i IN 1..5 LOOP
        DBMS_OUTPUT.PUT_LINE('Counter: ' || i);
    END LOOP;
END;
 
cs

예외 처리

PL/SQL에서 예외를 처리하는 방법은 다음과 같습니다:

1
2
3
4
5
6
7
8
9
10
11
12
DECLARE
    v_salary NUMBER;
BEGIN
    SELECT salary INTO v_salary FROM employees WHERE employee_id = 99999;
    DBMS_OUTPUT.PUT_LINE('Salary: ' || v_salary);
EXCEPTION
    WHEN NO_DATA_FOUND THEN
        DBMS_OUTPUT.PUT_LINE('No employee found with the specified ID');
    WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE('An unexpected error occurred');
END;
 
cs

프로시저와 함수

PL/SQL에서는 프로시저와 함수를 정의하고 호출할 수 있습니다. 프로시저와 함수는 재사용 가능한 코드 블록을 만들고 호출할 수 있게 합니다.

프로시저 정의와 호출:

1
2
3
4
5
6
7
8
9
10
11
CREATE OR REPLACE PROCEDURE greet (p_name IN VARCHAR2) IS
BEGIN
    DBMS_OUTPUT.PUT_LINE('Hello, ' || p_name || '!');
END;
/
 
BEGIN
    greet('John');
END;
/
 
cs

함수 정의와 호출:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
CREATE OR REPLACE FUNCTION add_numbers (p_num1 IN NUMBER, p_num2 IN NUMBER) RETURN NUMBER IS
BEGIN
    RETURN p_num1 + p_num2;
END;
/
 
DECLARE
    v_sum NUMBER;
BEGIN
    v_sum := add_numbers(1020);
    DBMS_OUTPUT.PUT_LINE('Sum: ' || v_sum);
END;
/
 
cs

결론

PL/SQL은 오라클 데이터베이스에서 SQL의 기능을 확장하여 복잡한 데이터베이스 응용 프로그램을 개발할 수 있도록 하는 강력한 도구입니다. PL/SQL은 변수 선언, 조건문, 반복문, 예외 처리, 프로시저와 함수 등의 기능을 제공하여 데이터베이스 작업을 보다 효율적이고 유연하게 처리할 수 있게 합니다. 이를 통해 개발자는 데이터베이스 내부에서 복잡한 비즈니스 로직을 구현하고, 데이터 무결성과 성능을 유지하면서 애플리케이션을 개발할 수 있습니다.

'DATABASE 공부' 카테고리의 다른 글

Trigger  (0) 2024.08.02
SQL의 DATA LANGUAGE  (0) 2024.08.02
JDBC의 Properties사용  (0) 2024.08.02
Template  (0) 2024.08.01
관계형 데이터베이스  (0) 2024.07.31