반응형
안뇽하세요 오늘은 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을 활용하여
데이터 처리, 로직 작성, 성능 최적화를 구현할 수 있습니다.
감사합니다.
반응형
'Database' 카테고리의 다른 글
[Oracle] Merge문 (1) | 2024.11.27 |
---|---|
Oracle) 데이터 형식 VARCHAR2 -> CLOB로 변경하기 (0) | 2024.11.26 |
규칙기반 옵티마이저와 비용기반 옵티마이저의 차이 (0) | 2024.03.03 |
Oracle SQL 힌트 리스트 (0) | 2024.02.18 |
IntelliJ와 Oracle 연동 (0) | 2023.11.30 |