PL/SQL은 Oracle 데이터베이스 내에서 비즈니스 로직을 구현하기 위한 강력한 언어입니다. SQL의 기능을 확장하여 오류 처리, 트랜잭션 관리 및 조건부 논리를 추가할 수 있도록 설계되었습니다.
PL/SQL의 주요 특징:
PL/pgSQL은 PostgreSQL에서 절차적 로직을 구현할 수 있게 해주는 언어입니다. PL/SQL과 비슷한 목표를 공유하지만 PostgreSQL의 오픈 소스 아키텍처와 긴밀하게 연계되어 있으며 간결한 구문이 특징입니다.
PL/pgSQL의 주요 기능:
변수 선언 구조는 유사하지만, PL/SQL과 PL/pgSQL의 구문은 다릅니다.
PL/SQL 예제:
DECLARE
v_emp_id NUMBER := 1001;
v_emp_name VARCHAR2(50);
BEGIN
SELECT emp_name INTO v_emp_name FROM employees WHERE emp_id = v_emp_id;
DBMS_OUTPUT.PUT_LINE(v_emp_name);
END;
PL/pgSQL 예제:
DO $$
DECLARE
v_emp_id INT := 1001;
v_emp_name TEXT;
BEGIN
SELECT emp_name INTO v_emp_name FROM employees WHERE emp_id = v_emp_id;
RAISE NOTICE '%', v_emp_name;
END $$ LANGUAGE plpgsql;
차이점
문자열 처리에서 NVL과 DECODE 함수는 PostgreSQL에서는 각각 COALESCE와 CASE로 대체됩니다.
NVL vs COALESCE 사용
Oracle에서 null을 지정한 값으로 대체하는 데 NVL을 사용합니다.
PostgreSQL에서는 COALESCE를 사용하여 여러 인수 중 첫 번째 null이 아닌 값을 반환합니다.
--PL/SQL :
SELECT NVL(employee_name, 'Unknown') AS emp_name FROM employees;
-- PL/pgSQL:
SELECT COALESCE(employee_name, 'Unknown') AS emp_name FROM employees;
DECODE vs CASE 사용
DECODE는 Oracle의 조건 함수로, 간단한 IF-THEN-ELSE 논리를 사용합니다.
PostgreSQL에서는 보다 강력한 CASE를 사용합니다.
-- PL/SQL 예제:
SELECT DECODE(department_id, 10, 'Sales', 20, 'HR', 30, 'IT', 'Other') AS department_name FROM departments;
-- PL/pgSQL 예제:
SELECT CASE department_id WHEN 10 THEN 'Sales' WHEN 20 THEN 'HR' WHEN 30 THEN 'IT' ELSE 'Other' END AS department_name FROM departments;
PostgreSQL의 PL/pgSQL 함수 내에서는 독립 트랜잭션 관리가 불가능하지만, 트랜잭션 블록 외부에서 COMMIT 및 ROLLBACK을 사용할 수 있습니다. PostgreSQL의 트랜잭션 처리는 주로 함수 호출 외부에서 수행되며, 필요 시 함수 내 트랜잭션 관리는 EXCEPTION 절을 사용해 예외 처리와 함께 구현할 수 있습니다.
-- PL/SQL 예시:
BEGIN
INSERT INTO employees (emp_id, emp_name) VALUES (1002, 'Jane');
COMMIT;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
END;
-- PL/pgSQL 예시:
DO $$
BEGIN
INSERT INTO employees (emp_id, emp_name) VALUES (1002, 'Jane');
-- 트랜잭션은 DO 블록 내에서 자동으로 커밋됨
EXCEPTION
WHEN OTHERS THEN
RAISE EXCEPTION 'Transaction error occurred';
END $$ LANGUAGE plpgsql;
PL/SQL에서는 EXCEPTION 블록을 통해 내장된 예외 및 사용자 정의 예외를 처리할 수 있습니다. PL/pgSQL에서는 다양한 메시지 수준으로 오류를 제어할 수 있습니다.
-- PL/SQL 예시:
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('No record found.');
-- PL/pgSQL 예시:
EXCEPTION
WHEN NO_DATA_FOUND THEN
RAISE NOTICE 'No record found';
WHEN OTHERS THEN
RAISE EXCEPTION 'An error occurred';
코드 리팩토링
데이터 유형 매핑
PostgreSQL의 강점 활용
Oracle의 PL/SQL에서 PostgreSQL의 PL/pgSQL로 마이그레이션하는 과정에서 두 언어의 주요 차이점과 PostgreSQL의 고유 기능을 이해하면 마이그레이션이 원활하게 이루어질 수 있습니다.