CodeGym /행동 /SQL SELF /PL/pgSQL과 다른 프로시저 프로그래밍 언어(PL/SQL, T-SQL) 비교

PL/pgSQL과 다른 프로시저 프로그래밍 언어(PL/SQL, T-SQL) 비교

SQL SELF
레벨 49 , 레슨 2
사용 가능

데이터베이스 세계에는 일반 SQL의 기능을 확장해서 DBMS 안에서 비즈니스 로직을 직접 짤 수 있게 해주는 여러 언어가 있어. 각각 자기 플랫폼에 맞게 최적화되어 있지만, 결국 목표는 비슷해 — 데이터 작업을 자동화하고, 단순화하고, 빠르게 만드는 거지. 대표적으로 PL/pgSQL(PostgreSQL), PL/SQL(Oracle), T-SQL(SQL Server)이 있어. 각 언어마다 특징, 장점, 단점이 있으니까 지금부터 얘기해볼게.

PL/pgSQL (Procedural Language/PostgreSQL Structured Query Language)은 PostgreSQL에 내장된 프로시저 언어야. 주 목적은 SQL의 기능을 확장해서 변수, 반복문, 제어문, 에러 처리 블록 같은 걸 쓸 수 있게 해주는 거지. 이 덕분에 복잡한 비즈니스 로직을 DB 쪽에서 바로 구현할 수 있어서 진짜 강력한 도구야.

PL/SQL (Procedural Language/SQL)은 Oracle DBMS에 내장된 프로시저 언어야. 데이터 처리, 프로시저, 함수, 패키지 생성 등 비슷한 기능을 제공하지. PL/SQL은 수십 년 동안 다듬어진 만큼 성숙한 언어로, 다양한 툴 생태계도 잘 갖춰져 있어.

T-SQL (Transact-SQL)은 Microsoft가 SQL Server용으로 만든 언어야. 표준 SQL을 확장해서 변수, 제어문, 기타 프로시저 프로그래밍 요소를 지원하지. T-SQL은 트랜잭션, 커서, JSON 처리 등에서 자기만의 특징이 있어.

PL/pgSQL, PL/SQL, T-SQL의 공통점

처음 보면 이 세 언어가 꽤 비슷해 보여. 그럴 수밖에 없는 게, 목적이 똑같거든 — DB 안에서 비즈니스 로직을 구현하는 거지. 주요 공통점을 살펴보자:

  1. 블록 문법

    세 언어 모두 구조화된 프로시저 코드를 쓸 수 있어. 주요 요소는:

    • 변수 선언
    • 실행 블록 (BEGIN ... END)
    • 예외 처리 지원
  2. 변수

    이 언어들에서는 변수 선언과 사용이 가능해. PL/pgSQL에서 변수 선언 예시:

    DECLARE
        student_id INT;
    BEGIN
        student_id := 10;
    END;
    

    PL/SQL이나 T-SQL에서도 비슷하게 할 수 있어.

  3. 제어문

    모두 IF...THEN, CASE, LOOP, FOR, WHILE 같은 제어문을 지원해서 복잡한 알고리즘도 짤 수 있어.

  4. 함수와 프로시저

    사용자 정의 함수와 프로시저를 만들고 호출할 수 있고, 단일 값이나 테이블을 반환할 수도 있어.

PL/pgSQL, PL/SQL, T-SQL의 차이점

개발하다 보면 DB를 바꿔야 할 때가 종종 있어. 이럴 때 언어별 차이를 아는 게 중요하지. 주요 차이점을 정리해볼게.

변수 선언

PL/pgSQL: 변수는 DECLARE 블록에서 선언하고, 값 할당은 :=로 해.

DECLARE
    total_students INT;
BEGIN
    total_students := 5;
END;

PL/SQL: 선언 방식은 PL/pgSQL과 비슷한데, %TYPE으로 테이블 컬럼 타입을 상속받을 수 있어.

DECLARE
    student_name students.name%TYPE;
BEGIN
    student_name := 'John';
END;

T-SQL: DECLARE로 변수 선언하고, SET이나 SELECT로 값 할당해.

DECLARE @total_students INT;
SET @total_students = 5;  -- 또는
SELECT @total_students = COUNT(*) FROM students;

에러 처리

PL/pgSQL: EXCEPTION 블록으로 에러를 처리해. 예시:

BEGIN
    SELECT * INTO my_var FROM nonexistent_table;
EXCEPTION
    WHEN others THEN
        RAISE NOTICE '에러 발생!';
END;

PL/SQL: 역시 EXCEPTION을 쓰지만, 에러 분류가 더 세분화되어 있어.

BEGIN
    SELECT * INTO my_var FROM nonexistent_table;
EXCEPTION
    WHEN NO_DATA_FOUND THEN
        DBMS_OUTPUT.PUT_LINE('데이터 없음!');
END;

T-SQL: TRY...CATCH 구문을 써.

BEGIN TRY
    SELECT 1/0; -- 0으로 나누기 에러
END TRY
BEGIN CATCH
    PRINT '에러 발생!';
END CATCH;

커서 사용

PL/pgSQL: 커서는 암시적으로 쓸 수 있고, 반복문에서 바로 사용 가능해.

FOR row IN SELECT * FROM students LOOP
    RAISE NOTICE '학생: %', row.name;
END LOOP;

PL/SQL: 커서를 명시적으로 선언해서 써야 해. 예시:

DECLARE
    CURSOR student_cursor IS SELECT * FROM students;
    student_row students%ROWTYPE;
BEGIN
    OPEN student_cursor;
    FETCH student_cursor INTO student_row;
    CLOSE student_cursor;
END;

T-SQL: CURSOR 키워드로 커서를 선언해.

DECLARE student_cursor CURSOR FOR SELECT name FROM students;
OPEN student_cursor;
FETCH NEXT FROM student_cursor;
CLOSE student_cursor;
DEALLOCATE student_cursor;

트랜잭션 처리

PL/pgSQL: BEGIN, COMMIT, ROLLBACK 명령어로 트랜잭션을 관리해.

PL/SQL: COMMIT, ROLLBACK으로 트랜잭션을 관리하고, SAVEPOINT도 지원해.

T-SQL: BEGIN TRANSACTION으로 트랜잭션 시작을 명확히 표시할 수 있어.

JSON 지원

PL/pgSQL: JSON, JSONB 타입으로 JSON을 강력하게 다룰 수 있어. 예시:

SELECT data->>'key' FROM json_table;

PL/SQL: JSON 지원이 좀 늦게 들어왔고, 유연성은 약간 떨어져.

T-SQL: JSON_QUERY, JSON_VALUE 함수로 JSON을 편하게 다룰 수 있어.

언제 PL/pgSQL, PL/SQL, T-SQL을 써야 할까?

PL/pgSQL:

  • DB가 PostgreSQL이면 당연히 이걸 써야지.
  • JSONB, 배열 등 강력한 데이터 타입 덕분에 대용량 데이터 처리에 딱 좋아.
  • 오픈 생태계, 유연함.

PL/SQL:

  • Oracle 제품군을 쓸 때 선택.
  • 패키지, 내장 프로시저 등 데이터 작업을 위한 생태계가 풍부해.

T-SQL:

  • Microsoft SQL Server에서 사용.
  • Microsoft 앱이나 Azure 스택과 연동할 때 최적이야.

PL/pgSQL, PL/SQL, T-SQL로 동일한 작업 예시

문제: 학생 수를 세고 결과 반환하기

PL/pgSQL:

CREATE FUNCTION count_students() RETURNS INT AS $$
DECLARE
    total INT;
BEGIN
    SELECT COUNT(*) INTO total FROM students;
    RETURN total;
END;
$$ LANGUAGE plpgsql;

PL/SQL:

CREATE OR REPLACE FUNCTION count_students RETURN NUMBER IS
    total NUMBER;
BEGIN
    SELECT COUNT(*) INTO total FROM students;
    RETURN total;
END;

T-SQL:

CREATE FUNCTION count_students()
RETURNS INT
AS
BEGIN
    DECLARE @total INT;
    SELECT @total = COUNT(*) FROM students;
    RETURN @total;
END;

이제 PL/pgSQL, PL/SQL, T-SQL의 대략적인 차이를 알았지? 각 언어마다 특징과 사용 시나리오가 있어서 고유해. 언어나 DB 선택은 항상 네 프로젝트와 필요에 따라 달라진다는 거 잊지 마!

코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION