PL/SQL - 개요

안녕하세요, 열망하는 프로그래머 여러분! PL/SQL의 세계로 안내해드리는 여정에 오신 것을 환영합니다. 여러분의 친절한 이웃 컴퓨터 과학 교사로서, 저는 이 강력한 데이터베이스 프로그래밍 언어를 안내해드리는 것을 기대하고 있습니다. 프로그래밍에 처음이라면 걱정하지 마세요 - 기본부터 시작하여 차례대로 배워나갈 것입니다. 그러니 커피 한 잔(또는 여러분의 좋아하는 음료)을 들고, 함께 들어보겠습니다!

PL/SQL - Overview

PL/SQL이란?

PL/SQL은 "Procedural Language extension to Structured Query Language"의 약자입니다. 이 이름은 꽤 복잡하지 않나요? 그럼 이를 간단히 풀어보겠습니다:

  • SQL은 데이터베이스와 상호작용하는 데 사용하는 언어입니다.
  • PL/SQL은 SQL의 확장으로 프로그래밍 기능을 추가합니다.

SQL을 데이터베이스에 질문하는 도구라고 생각하면, PL/SQL은 데이터베이스와 대화를 나누는 것처럼 생각할 수 있습니다. 이를 통해 더 복잡한 연산을 작성하고 작업을 자동화할 수 있습니다.

간단한 PL/SQL 예제

PL/SQL에서 "Hello, World!" 프로그램을 작성해 보겠습니다:

BEGIN
DBMS_OUTPUT.PUT_LINE('Hello, World!');
END;
/

여기서 무엇이 일어나고 있나요?

  1. BEGINEND;는 PL/SQL 블록의 시작과 끝을 나타냅니다.
  2. DBMS_OUTPUT.PUT_LINE()은 텍스트를 출력하는 내장 절차입니다.
  3. 끝에 있는 전진 슬래시 /는 Oracle에게 블록을 실행하도록 알립니다.

이를 실행하면 화면에 "Hello, World!"가 출력됩니다. 축하합니다! 여러분이 첫 PL/SQL 프로그램을 작성했습니다.

PL/SQL의 특징

이제 발자국을蘸고 보았으니, PL/SQL의 중요한 특징을 탐구해 보겠습니다.

1. 블록 구조

PL/SQL 코드는 블록으로 조직됩니다. 각 블록은 선언부, 실행 문, 예외 처리 코드를 포함할 수 있습니다. 더 상세한 블록 구조는 다음과 같습니다:

DECLARE
-- 변수 선언
v_name VARCHAR2(50) := 'John Doe';
v_age NUMBER := 30;
BEGIN
-- 실행 문
DBMS_OUTPUT.PUT_LINE('Name: ' || v_name);
DBMS_OUTPUT.PUT_LINE('Age: ' || v_age);
EXCEPTION
-- 예외 처리
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('An error occurred');
END;
/

이 예제에서:

  • DECLARE 섹션에서 변수를 선언합니다.
  • BEGIN 섹션에서 변수를 사용합니다.
  • EXCEPTION 섹션에서 잠재적인 오류를 처리합니다.

2. 변수와 데이터 타입

PL/SQL은 다양한 데이터 타입을 지원합니다. 다음은 일반적인 몇 가지입니다:

데이터 타입 설명 예제
VARCHAR2 가변 길이 문자열 v_name VARCHAR2(50) := 'Alice';
NUMBER 숫자 값 v_age NUMBER := 25;
DATE 날짜 및 시간 값 v_today DATE := SYSDATE;
BOOLEAN 참, 거짓, 또는 NULL v_is_student BOOLEAN := TRUE;

3. 제어 구조

PL/SQL은 IF-THEN-ELSE와 루프와 같은 친숙한 제어 구조를 제공합니다. 예제를 보겠습니다:

DECLARE
v_grade NUMBER := 85;
BEGIN
IF v_grade >= 90 THEN
DBMS_OUTPUT.PUT_LINE('Excellent!');
ELSIF v_grade >= 80 THEN
DBMS_OUTPUT.PUT_LINE('Good job!');
ELSE
DBMS_OUTPUT.PUT_LINE('Keep working hard!');
END IF;
END;
/

이 프로그램은 성적을 확인하고 적절한 메시지를 출력합니다. IF-THEN-ELSIF-ELSE 구조를 보여줍니다.

4. 커서와 루프 구조

PL/SQL은 커서와 루프를 사용하여 여러 행의 데이터를 처리할 수 있습니다. 간단한 예제를 보겠습니다:

DECLARE
CURSOR c_employees IS
SELECT first_name, last_name FROM employees;
v_first_name employees.first_name%TYPE;
v_last_name employees.last_name%TYPE;
BEGIN
OPEN c_employees;
LOOP
FETCH c_employees INTO v_first_name, v_last_name;
EXIT WHEN c_employees%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(v_first_name || ' ' || v_last_name);
END LOOP;
CLOSE c_employees;
END;
/

이 코드는:

  1. 직원 이름을 선택하는 커서를 선언합니다.
  2. 커서를 엽니다.
  3. 루프를 통해 결과를 순회하며 각 이름을 출력합니다.
  4. 커서를 닫습니다.

PL/SQL의 장점

이제 몇 가지 특징을 살펴보았으니, PL/SQL이 왜 유용한지 이야기해 보겠습니다.

1. SQL과의 통합

PL/SQL은 SQL과 원활하게 통합되어 데이터베이스 연산을 더욱 원활하게 만듭니다. PL/SQL 블록 내에서 SQL 문을 직접 사용할 수 있습니다:

DECLARE
v_emp_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_emp_count FROM employees;
DBMS_OUTPUT.PUT_LINE('Number of employees: ' || v_emp_count);
END;
/

이 프로그램은 직원 수를 계산하고 결과를 PL/SQL 변수에 저장합니다.

2. 향상된 성능

PL/SQL은 여러 SQL 문을 처리할 때 성능을 크게 향상시킬 수 있습니다. 네트워크 트래픽을 줄이기 위해 전체 블록을 서버로 보내는 반면, 개별 문장을 보내는 것보다 더 효율적입니다.

3. 오류 처리

PL/SQL은 예외 메커니즘을 통해 강력한 오류 처리를 제공합니다:

DECLARE
v_result NUMBER;
BEGIN
v_result := 10 / 0;  -- 이는 오류를 발생시킵니다
DBMS_OUTPUT.PUT_LINE('Result: ' || v_result);
EXCEPTION
WHEN ZERO_DIVIDE THEN
DBMS_OUTPUT.PUT_LINE('Error: Division by zero!');
END;
/

이 프로그램은 0으로 나누는 시도를 하고, 오류를 잡아 친절한 메시지를 출력합니다.

4. 모듈성

PL/SQL은 절차와 함수를 지원하여 모듈적이고 재사용 가능한 코드를 작성할 수 있습니다:

CREATE OR REPLACE FUNCTION calculate_bonus(p_salary NUMBER) RETURN NUMBER IS
BEGIN
RETURN p_salary * 0.1;  -- 10% 보너스
END;
/

DECLARE
v_salary NUMBER := 50000;
v_bonus NUMBER;
BEGIN
v_bonus := calculate_bonus(v_salary);
DBMS_OUTPUT.PUT_LINE('Bonus: $' || v_bonus);
END;
/

여기서 우리는 보너스 계산 함수를 정의하고, 그 함수를 주 프로그램에서 사용합니다.

결론적으로, PL/SQL은 SQL의 기능을 확장하여 더 복잡한 데이터베이스 연산과 프로그래밍 논리를 가능하게 합니다. 데이터베이스 프로그래밍의 여정을 계속하면서, PL/SQL은 귀중한 기술이 될 것입니다. 실습이 왕이니, 계속 코딩하고 실험해 보세요!

Credits: Image by storyset