PL/SQL(Procedural Language/Structured Query Language)은 오라클 데이터베이스에서 사용되는 절차적 언어로, SQL과 프로그래밍 기능을 결합하여 복잡한 로직을 쉽게 구현할 수 있도록 도와줍니다. PL/SQL을 활용하면 변수를 선언하고, 조건문과 반복문을 사용하여 자동화된 데이터 처리를 수행할 수 있습니다.
1. PL/SQL의 특징 🔍
✅ SQL을 확장하여 로직을 구현할 수 있음
✅ 블록 구조를 사용하여 모듈화된 프로그램 작성 가능
✅ 예외 처리를 지원하여 오류를 효과적으로 관리
✅ 데이터베이스 내에서 직접 실행 가능하여 성능 최적화
2. PL/SQL 기본 구조 📜
PL/SQL 프로그램은 다음과 같은 블록 구조를 가집니다:
DECLARE -- (선택사항) 변수 선언
BEGIN -- 실행할 코드 작성
-- SQL 및 PL/SQL 로직
EXCEPTION -- (선택사항) 예외 처리
-- 오류 발생 시 실행할 코드
END;
/
예제: 'Hello, PL/SQL!' 출력하기
BEGIN
DBMS_OUTPUT.PUT_LINE('Hello, PL/SQL!');
END;
/
DBMS_OUTPUT.PUT_LINE을 사용하면 결과를 출력할 수 있습니다.
3. 변수 및 데이터 타입 🎭
PL/SQL에서는 변수를 선언하여 데이터를 저장할 수 있습니다.
DECLARE
v_name VARCHAR2(50) := '홍길동';
v_age NUMBER := 25;
BEGIN
DBMS_OUTPUT.PUT_LINE('이름: ' || v_name || ', 나이: ' || v_age);
END;
/
주요 데이터 타입
- VARCHAR2(size): 문자열 저장
- NUMBER(p,s): 숫자 저장 (p=전체 자리수, s=소수점 이하 자리수)
- DATE: 날짜 및 시간 저장
- BOOLEAN: 참/거짓 값을 저장
4. 조건문 (IF 문) 🌟
IF 문을 사용하여 특정 조건에 따라 실행되는 로직을 작성할 수 있습니다.
DECLARE
v_score NUMBER := 85;
BEGIN
IF v_score >= 90 THEN
DBMS_OUTPUT.PUT_LINE('A 학점');
ELSIF v_score >= 80 THEN
DBMS_OUTPUT.PUT_LINE('B 학점');
ELSE
DBMS_OUTPUT.PUT_LINE('C 학점');
END IF;
END;
/
5. 반복문 (LOOP) 🔄
1) 기본 LOOP 문
DECLARE
v_count NUMBER := 1;
BEGIN
LOOP
DBMS_OUTPUT.PUT_LINE('현재 카운트: ' || v_count);
v_count := v_count + 1;
EXIT WHEN v_count > 5;
END LOOP;
END;
/
2) FOR LOOP 문
BEGIN
FOR i IN 1..5 LOOP
DBMS_OUTPUT.PUT_LINE('반복 횟수: ' || i);
END LOOP;
END;
/
6. 프로시저 (Procedure) 🛠️
프로시저는 재사용 가능한 PL/SQL 코드 블록으로, 매개변수를 받아 특정 작업을 수행할 수 있습니다.
CREATE OR REPLACE PROCEDURE greet_user (p_name VARCHAR2) IS
BEGIN
DBMS_OUTPUT.PUT_LINE('안녕하세요, ' || p_name || '님!');
END;
/
-- 프로시저 실행
BEGIN
greet_user('철수');
END;
/
7. 함수 (Function) 🔢
함수는 값을 반환하는 PL/SQL 블록으로, 연산 결과를 반환할 때 유용합니다.
CREATE OR REPLACE FUNCTION add_numbers (a NUMBER, b NUMBER) RETURN NUMBER IS
BEGIN
RETURN a + b;
END;
/
-- 함수 실행
DECLARE
v_result NUMBER;
BEGIN
v_result := add_numbers(10, 20);
DBMS_OUTPUT.PUT_LINE('결과: ' || v_result);
END;
/
8. 트리거 (Trigger) ⚡
트리거는 특정 이벤트(INSERT, UPDATE, DELETE)가 발생할 때 자동으로 실행되는 PL/SQL 블록입니다.
CREATE OR REPLACE TRIGGER trg_before_insert
BEFORE INSERT ON employees
FOR EACH ROW
BEGIN
DBMS_OUTPUT.PUT_LINE('새로운 직원이 추가됩니다: ' || :NEW.name);
END;
/
- :NEW는 새로 삽입되는 값을 참조하는 키워드
- BEFORE INSERT는 INSERT 전에 실행됨
9. 커서 (Cursor) 🔄
커서는 여러 개의 행을 조회하고 순차적으로 처리하는 기능을 제공합니다.
DECLARE
CURSOR emp_cursor IS SELECT name, salary FROM employees;
v_name employees.name%TYPE;
v_salary employees.salary%TYPE;
BEGIN
OPEN emp_cursor;
LOOP
FETCH emp_cursor INTO v_name, v_salary;
EXIT WHEN emp_cursor%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('이름: ' || v_name || ', 급여: ' || v_salary);
END LOOP;
CLOSE emp_cursor;
END;
/
✨ 마무리
PL/SQL은 단순한 SQL 문을 넘어 복잡한 로직을 처리하고 자동화할 수 있도록 도와줍니다. 이를 활용하면 효율적인 데이터베이스 프로그래밍이 가능하며, 성능 최적화 및 유지보수도 용이해집니다.
PL/SQL을 연습하면서 더 많은 예제와 실전 문제를 풀어보는 것이 중요합니다! 😃
'개발 > SQL' 카테고리의 다른 글
실전 프로젝트 & 문제 풀이: SQL 실력을 키우는 최고의 방법! 🧪 (0) | 2025.03.04 |
---|---|
📊 5. 성능 최적화 & 트러블슈팅 (빠른 쿼리 = 좋은 개발자) (0) | 2025.03.03 |
데이터베이스 설계 & 정규화: 좋은 테이블 구조 만들기 🏗️ (0) | 2025.03.01 |
🚀 SQL 효율적인 데이터 접근: VIEW, INDEX, SEQUENCE 완벽 가이드 (Oracle 기준) (4) | 2025.02.26 |
🧩 SQL 고급 SELECT & JOIN 완벽 가이드 (Oracle 기준) (8) | 2025.02.25 |