PL/SQL - 컬렉션: 효율적인 데이터 처리의 관문

안녕하세요, PL/SQL 개발자 지망생 여러분! PL/SQL 컬렉션의 fascinatig한 세계를 안내해드리게 되어 기쁩니다. 오랜 경험을 가진 귀하의 친절한 이웃 컴퓨터 교사로서, 이 여정을 밝고 즐겁게 만들어드리겠습니다. 그러니 가상의 메모 pad를 집어들고, 함께 들어가 보겠습니다!

PL/SQL - Collections

PL/SQL 컬렉션은 무엇인가요?

본격적인 내용으로 들어가기 전에, 컬렉션에 대해 이해해보겠습니다. 생일 파티를 준비하고, 모든 손님을 관리해야 한다고 상상해보세요. 각 이름을 별도의 종이에 적는 대신, 단일 목록에 모두 적지 않을까요? PL/SQL에서 컬렉션이 하는 일이 바로 그거입니다 - 관련 데이터를 함께 그룹화할 수 있게 해줍니다.

이제 PL/SQL이 제공하는 컬렉션 유형을 탐구해보겠습니다.

인덱스별 테이블 (연관 배열)

인덱스별 테이블, 또는 연관 배열은 마법의 주소帳과 같습니다. 이름만 저장하는 것이 아니라, 각 이름에 추가 정보를 연결할 수 있습니다.

인덱스별 테이블 선언하기

우리의 첫 번째 인덱스별 테이블을 만들어보겠습니다:

DECLARE
TYPE guest_list_type IS TABLE OF VARCHAR2(50) INDEX BY VARCHAR2(20);
guest_list guest_list_type;
BEGIN
guest_list('Alice') := '케이크 가져오는 중';
guest_list('Bob') := '風船 가져오는 중';
guest_list('Charlie') := '음악 가져오는 중';

DBMS_OUTPUT.PUT_LINE('Alice는 ' || guest_list('Alice'));
END;

이 예제에서 우리는 각 손님(인덱스)이 파티에 가져오는 것과 연결된 손님 목록을 만들었습니다. 이 코드를 실행하면 "Alice는 케이크 가져오는 중"이 출력됩니다.

인덱스별 테이블을 순회하기

이제 우리의 손님 목록을 어떻게 순회할 수 있는지 보겠습니다:

DECLARE
TYPE guest_list_type IS TABLE OF VARCHAR2(50) INDEX BY VARCHAR2(20);
guest_list guest_list_type;
guest VARCHAR2(20);
BEGIN
guest_list('Alice') := '케이크 가져오는 중';
guest_list('Bob') := '風船 가져오는 중';
guest_list('Charlie') := '음악 가져오는 중';

guest := guest_list.FIRST;
WHILE guest IS NOT NULL LOOP
DBMS_OUTPUT.PUT_LINE(guest || '는 ' || guest_list(guest));
guest := guest_list.NEXT(guest);
END LOOP;
END;

이 코드는 우리의 모든 손님과 그들이 가져오는 것을 목록에 보여줍니다. 파티 체크리스트를 돌아보는 것과 같습니다!

네스티드 테이블

네스티드 테이블은 확장 가능한 목록과 같습니다. 여러 파티를 계획하고, 각 파티에 손님 목록이 있으며, 그 목록이 커지거나 줄어들 수 있습니다.

네스티드 테이블 선언하고 초기화하기

우리의 파티 계획을 위한 네스티드 테이블을 만들어보겠습니다:

DECLARE
TYPE guest_list_type IS TABLE OF VARCHAR2(50);
birthday_party guest_list_type := guest_list_type('Alice', 'Bob', 'Charlie');
BEGIN
DBMS_OUTPUT.PUT_LINE('첫 손님: ' || birthday_party(1));
birthday_party.EXTEND;
birthday_party(4) := 'David';
DBMS_OUTPUT.PUT_LINE('새로운 손님: ' || birthday_party(4));
END;

여기서 우리는 세 명의 손님으로 시작하고 그 다음에 네 번째 손님을 추가합니다. 출력은 "첫 손님: Alice"과 "새로운 손님: David"을 보여줍니다.

컬렉션 메서드

컬렉션은 우리의 삶을 더 쉽게 만들어주는 내장 메서드를 제공합니다. 이 메서드들을 특별한 힘으로 생각해보세요.

일반 컬렉션 메서드

다음은 일반적인 컬렉션 메서드 목록입니다:

메서드 설명
COUNT 요소의 수를 반환합니다
FIRST 첫 번째 요소의 인덱스를 반환합니다
LAST 마지막 요소의 인덱스를 반환합니다
NEXT 다음 요소의 인덱스를 반환합니다
PRIOR 이전 요소의 인덱스를 반환합니다
EXISTS 특정 인덱스에 요소가 있는지 확인합니다
EXTEND 컬렉션의 끝에 하나 이상의 요소를 추가합니다
TRIM 컬렉션의 끝에서 하나 이상의 요소를 제거합니다
DELETE 컬렉션에서 요소를 제거합니다

이제 몇 가지 메서드를 실제로 사용해보겠습니다:

DECLARE
TYPE number_list_type IS TABLE OF NUMBER;
numbers number_list_type := number_list_type(10, 20, 30, 40, 50);
BEGIN
DBMS_OUTPUT.PUT_LINE('요소의 수: ' || numbers.COUNT);
DBMS_OUTPUT.PUT_LINE('첫 번째 요소: ' || numbers(numbers.FIRST));
DBMS_OUTPUT.PUT_LINE('마지막 요소: ' || numbers(numbers.LAST));

numbers.DELETE(3);  -- 세 번째 요소를 삭제합니다

IF NOT numbers.EXISTS(3) THEN
DBMS_OUTPUT.PUT_LINE('요소 3은 더 이상 존재하지 않습니다!');
END IF;
END;

이 코드는 요소의 수를 계산하고, 첫 번째와 마지막 요소에 접근하며, 요소를 삭제하고 해당 요소가 존재하는지 확인합니다.

컬렉션 예외

최선의 계획이 실패할 수 있듯이, 컬렉션에 대한 작업도 예외가 발생할 수 있습니다. PL/SQL은 컬렉션 관련 오류를 우아하게 처리할 수 있도록 특정 예외를 제공합니다.

일반 컬렉션 예외

다음은 일반적인 컬렉션 예외 목록입니다:

예외 설명
COLLECTION_IS_NULL null 컬렉션을 작업할 때 발생합니다
NO_DATA_FOUND 존재하지 않는 요소에 접근할 때 발생합니다
SUBSCRIPT_BEYOND_COUNT 현재 크기 이상의 인덱스에 접근할 때 발생합니다
SUBSCRIPT_OUTSIDE_LIMIT 허용 범위 밖의 인덱스를 사용할 때 발생합니다

이제 몇 가지 예외를 처리해보겠습니다:

DECLARE
TYPE number_list_type IS TABLE OF NUMBER;
numbers number_list_type;
BEGIN
-- 이는 COLLECTION_IS_NULL 예외를 발생시킵니다
numbers(1) := 10;
EXCEPTION
WHEN COLLECTION_IS_NULL THEN
DBMS_OUTPUT.PUT_LINE('Oops! 컬렉션은 null입니다. 초기화해보겠습니다.');
numbers := number_list_type(10, 20, 30);
DBMS_OUTPUT.PUT_LINE('이제 ' || numbers.COUNT || ' 개의 요소가 있습니다.');
END;

이 코드는 null 컬렉션에 요소를 추가하려고 시도하고, 예외를 잡아 컬렉션을 초기화합니다.

결론적으로, PL/SQL 컬렉션은 효율적인 데이터 처리를 위한 강력한 도구입니다. 파티를 계획하든 복잡한 데이터베이스 작업을 처리하든, 컬렉션을 마스터하면 PL/SQL 여정이 훨씬 더 원활해질 것입니다.

기억해 두세요, 연습이 완벽을 만듭니다! 자신만의 컬렉션을 만들어보고, 다양한 메서드를 실험하고, 예외를 두려워하지 마세요 - 그것들은 당신이 더 나은 코드를 작성하는 데 도움이 됩니다.

미래의 PL/SQL 마법사 여러분, 즐겁게 코딩하세요!

Credits: Image by storyset