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