절차형 SQL 이란?

표준 SQL의 확장으로, 프로그래밍에서 볼 수 있는 제어 구조를 사용하여 더욱 복잡하고 상세한 데이터 처리를 할 수 있게 해주는 SQL의 형태이다. 절차형 SQL은 데이터베이스에서 로직을 구현할 때 사용되며, 일반적인 SQL 명령어로는 처리하기 어려운 조건부 로직, 반복, 변수 사용 등을 가능하게 한다.

일반 SQL이 선언적(declarative) 언어라면, 절차형 SQL은 명령형(imperative) 특성을 가지고 있다. 즉, 데이터를 어떻게 가져올지만을 명시하는 대신, 어떤 절차를 따라 데이터를 처리할지를 상세하게 기술할 수 있다.

 

다음은 다양한 데이터베이스에서 절차형SQL을 지원하는 제품 목록이다.

  • Oracle의 PL/SQL (Procedural Language/SQL)
  • Microsoft SQL Server의 Transact-SQL (T-SQL)
  • PostgreSQL의 PL/pgSQL
  • IBM DB2의 SQL PL
  • MySQL의 SQL/PSM (Persistent Stored Modules)

 

절차적 언어, 선언적 언어랑 구체적으로 어떻게 다른건데?

선언적 언어는 "무엇을(What)" 할지에 초점을 맞추고, 절차적 언어는 "어떻게(How)" 할지에 초점을 맞춘다. 선언적 언어는 개발자로 하여금 내부 메커니즘에서 벗어나 결과에만 집중할 수 있게 해주는 반면, 절차적 언어는 개발자가 알고리즘의 각 단계를 직접 제어할 수 있게 해준다.

 

얼핏보면 다음 일반적인 SQL 문장도 구체적으로 뭘 할지 지정해준 것처럼 보인다.

SELECT 이름, 이메일 FROM 고객;

 

그러나 그렇지 않다.

 

위 SQL 문에는 데이터베이스에 '무엇을' 해야 하는지를 요청하고 있다. 즉, '이름'과 '이메일'을 '고객' 테이블에서 선택하라고 요청하고 있지만, 이 과정에서 데이터 접근 방식이나, 쿼리를 최적화하는 방법, 실제 데이터를 어떻게 디스크에서 메모리로 로딩하는지, 또는 병렬 처리가 가능한 경우 어떻게 처리될지 등은 명시되어 있지않다. 사용자가 신경 쓸 필요 없이 데이터베이스 관리 시스템이 알아서 처리하고 있다.


반면, 절차적 언어에서는 특정 작업을 수행하기 위해 필요한 모든 단계를 명시적으로 기술해야 한다. 예를 들어, 대표적인 절차적 프로그래밍 언어인 C를 사용해 배열에서 최대값을 찾는 경우, 개발자는 초기 최대값 설정하고 배열의 각 요소를 순회하며, 현재 요소가 기존의 최대값보다 큰지 비교하거나 조건에 따라 최대값 업데이트하는 일들을 직접 명시해주어야 한다.

 

 

 

PL/SQL 란?

Procedural Language extensions to SQL 의 약자로, 오라클 데이터베이스에서 사용하는 절차적 프로그래밍 언어이다.

 

주요 특징은 다음과 같다.

 

블록 구조

PL/SQL 코드는 선언부, 실행부, 예외 처리부로 구성되는 블록 구조를 가진다. 각 블록은 특정 작업을 수행하고, 블록 내에서 변수를 선언하고, 조건문과 루프를 사용하여 로직을 구현하는 등 기능별로 모듈화가 가능하다.


SQL 통합

PL/SQL은 SQL 명령어를 자연스럽게 통합하여 사용한다. 이를 통해 데이터베이스에 저장된 데이터를 처리하는 SQL 문장을 프로그램 로직 내에서 직접 호출하고, 결과를 변수에 저장하며, 데이터를 수정할 수 있다. 즉, 변수, 상수 등을 선언하여 SQL 문장 간 값을 교환할 수도 있는 것이다.


절차적 기능

조건문(IF), 반복문(LOOP), 함수, 프로시저 등 절차적 언어를 사용하여 절차적인 프로그래밍의 기능을 제공한다. 이를 통해 복잡한 비즈니스 로직을 구현할 수 있다.


트리거

데이터베이스 이벤트(예: 데이터 삽입, 수정, 삭제)에 반응하여 자동으로 실행되는 PL/SQL 코드를 작성할 수 있다. 이는 데이터 무결성을 유지하고, 필요한 작업을 자동화하는 데 유용하다.


예외 처리

DBMS 정의 에러나 사용자 정의 에러를 정의하여 사용할 수 있다.

 

 

PL/SQL 사용방법 (기본 문법)

DECLARE
  -- 선언부
  v_number NUMBER := 10;
BEGIN
  -- 실행부
  v_number := v_number + 20;
  DBMS_OUTPUT.PUT_LINE('Updated Number: ' || v_number);
EXCEPTION
  -- 예외 처리부
  WHEN OTHERS THEN
    DBMS_OUTPUT.PUT_LINE('Error: ' || SQLERRM);
END;
  • 선언부(Declaration Section)
    DECLARE 블록이다.
    변수, 상수, 타입, 커서 등을 선언한다.
    선택적으로 작성할 수도 있고 안할 수도 있다.

  • 실행부(Execution Section)
    BEGIN ~ END 블록이다.
    실제 실행할 SQL 문과 PL/SQL 명령어가 포함된다.
    필수로 작성해야 하는 부분이다.

  • 예외 처리부(Exception Handling Section)
    EXCEPTION 블록이다.
    예외 처리 로직이 포함된다.
    선택적으로 작성할 수도 있고 안할 수도 있다.

 

'DataBase > SQLD' 카테고리의 다른 글

테이블 조인(Join) 기법 및 수행 원리  (1) 2024.04.28
옵티마이저(Optimizer)  (1) 2024.04.28
윈도우 함수(WINDOW 함수)  (2) 2024.04.26
그룹함수(Group Function)  (0) 2024.04.26
서브쿼리(Subquery)  (2) 2024.04.26

+ Recent posts