DBMS/활용 사례

PL/SQL과 PL/pgSQL의 비교

(주)비트나인 2023. 9. 2. 12:11

 

Oracle PL/SQL to PostgreSQL PL/pgSQL 변환

 

PL/SQL과 PL/pgSQL은 각각 오라클과 PostgreSQL 데이터베이스에서 사용되는 절차적 프로그래밍 언어입니다. 이 언어들은 데이터베이스 내에서 비즈니스 로직을 구현하고 데이터를 조작하는데 사용됩니다.

 

기능으로는 변수, 제어문 (IF, CASE, LOOP 등), 예외 처리 등의 기능을 사용할 수 있습니다.

프로시저, 함수 등의 데이터베이스 객체를 생성할 때 CREATE PROCEDURE, CREATE FUNCTION 등의 문법을 이용하여 사용 합니다.

 

아래 내용은 Oracle PL/SQL을 PostgreSQL PL/pgSQL로 변환시 체크해야할 사항들 기록 하였습니다.

 

 1. 기본 구조

 

블록 구조로 되어 있으며, DECLARE, BEGIN, EXCEPTION 섹션으로 구분

 

항목 PL/SQL PL/pgSQL
생성 CREATE PROCEDURE procedure_name (parameters)
IS
CREATE PROCEDURE procedure_name (parameters)
AS
$$
선언 DECLARE

DECLARE
실행 BEGIN

-- 실행코드

EXCEPTION
-- 예외처리

END procedure_name;
BEGIN

-- 실행코드

EXCEPTION
-- 예외처리

END;
종료 / $$ LANGUAGE plpgsql;

 

 2. 선언

 

프로시저, 함수, 블록 내에서 사용할 변수나 상수를 선언하는 부분

 

항목 PL/SQL PL/pgSQL
CLOB variable_name   CLOB; variable_name   TEXT;
BLOB variable_name   BLOB; variable_name   BYTEA
VARCHAR2 variable_name   VARCHAR2(); variable_name   VARCHAR();
NUMBER variable_name   NUMBER(); variable_name   NUMERIC();
값 할당 variable_name = 값; variable_name := 값;
CURSOR CURSOR cursor_name IS 
-- 커서 실행 코드
cursor_name CURSOR FOR
-- 커서 실행 코드
CURSOR (parameter) CURSOR cursor_name(parameter) IS
-- 커서 실행 코드
cursor_name CURSOR (parameter) FOR 
-- 커서 실행 코드

 

 3. 실행

 

일반적으로 BEGIN과 END 키워드 사이에 실행할 코드가 위치하며, 해당 코드는 하나의 논리적 블록으로 실행됩니다. 블록은 문장들의 시퀀스로 이루어지며, 이들 문장들은 순차적으로 실행됩니다.

 

항목 PL/SQL PL/pgSQL
FROM dual;
임시 테이블
SELECT 'test' 
FROM dual;
SELECT 'test';
-- 임시 테이블 명시 없이 가능
systimestamp
시간출력
SELECT systimestamp 
FROM dual;
SELECT current_timestamp;
ROWNUM
일부 ROW출력
SELECT * 
FROM table_name
WHERE rownum < 10;
SELECT *
FROM table_name 
LIMIT 9;
(+)
OUTER JOIN
SELECT * 
FROM table1 a, table2 b
WHERE a.col1 = b.col1 (+)
SELECT *
FROM table1 a 
            LEFT OUTER JOIN
            table2 b ON a.col1 = b.col1;
DECODE SELECT
DECODE (col1,
              100, 'A',
                90, 'B',
               'C')
FROM test;
SELECT
CASE col1 
WHEN 100 THEN 'A'
WHEN   90 THEN 'B'
ELSE    'C'
END
FROM test;
Unique column에 중복값 예외처리 EXCEPTION
WHEN DUP_VAL_ON_INDEX
THEN --예외 처리
RETURN;
EXCEPTION
WHEN UNIQUE_VIOLATION
THEN --예외 처리
RETURN;
0 나누기 연산 예외처리 EXCEPTION
WHEN ZERO_DIVIDE
THEN --예외 처리
RETURN;
EXCEPTION
WHEN DIVISION_BY_ZERO
THEN --예외처리
RETURN;
OUTPUT
text 출력
DBMS_OUTPUT.PUT_LINE('text'); RAISE NOTICE '%' , 'text';

 


글 : 허원무 수석보 ( 비트나인 DB Tech팀 )