>데이터 베이스 >Oracle >PL/SQL (배열, 레코드, 테이블)에서 컬렉션을 어떻게 사용합니까?

PL/SQL (배열, 레코드, 테이블)에서 컬렉션을 어떻게 사용합니까?

Johnathan Smith
Johnathan Smith원래의
2025-03-13 13:15:17304검색

PL/SQL에서 컬렉션을 사용하는 방법 (배열, 레코드, 테이블)

PL/SQL은 관련 데이터 그룹을 관리하여 코드 효율성 및 가독성을 향상시키기 위해 몇 가지 수집 유형을 제공합니다. 여기에는 중첩 테이블, 연관 배열 (인덱스 바이 테이블) 및 레코드가 포함됩니다. 각각을 살펴 보겠습니다.

기록 : 레코드는 다른 언어의 구조와 유사합니다. 단일 이름으로 다른 데이터 유형의 요소를 그룹화합니다. TYPE 문으로 선언 한 다음 변수를 선언하는 데 사용됩니다.

 <code class="sql">DECLARE TYPE employee_record IS RECORD ( employee_id NUMBER, employee_name VARCHAR2(50), salary NUMBER ); emp employee_record; BEGIN emp.employee_id := 123; emp.employee_name := 'John Doe'; emp.salary := 60000; DBMS_OUTPUT.PUT_LINE('Employee ID: ' || emp.employee_id); END; /</code>

중첩 테이블 : 중첩 테이블은 균질 한 데이터 유형의 정렬 된 모음입니다. 가변 길이 목록을 허용합니다.

 <code class="sql">DECLARE TYPE num_list IS TABLE OF NUMBER; numbers num_list := num_list(1, 2, 3, 4, 5); BEGIN FOR i IN numbers.FIRST .. numbers.LAST LOOP DBMS_OUTPUT.PUT_LINE(numbers(i)); END LOOP; END; /</code>

연관 배열 (인덱스 바이 테이블) : 다른 언어의 해시 맵 또는 사전과 유사합니다. 키 값 쌍을 저장하는데, 여기서 키는 PLS_INTEGER 의 하위 유형이어야하고 값은 모든 데이터 유형 일 수 있습니다.

 <code class="sql">DECLARE TYPE emp_salary IS TABLE OF NUMBER INDEX BY VARCHAR2(50); salaries emp_salary; BEGIN salaries('John Doe') := 60000; salaries('Jane Smith') := 75000; DBMS_OUTPUT.PUT_LINE('John Doe salary: ' || salaries('John Doe')); END; /</code>

적절한 수집 유형을 선택하는 것은 특정 요구에 따라 다릅니다. 레코드는 관련 데이터 요소를 그룹화하는 데 이상적입니다. 관련 데이터 요소, 주문 목록의 중첩 테이블 및 키 값 조회를위한 연관 배열에 이상적입니다.

PL/SQL에서 다른 수집 유형을 사용하는 성능은 무엇입니까?

다른 수집 유형을 사용하는 성능은 사용 방법과 데이터 크기에 따라 다릅니다. 일반적으로:

  • 레코드 : 레코드는 본질적으로 구조물이므로 성능 오버 헤드가 최소화됩니다. 개별 요소에 액세스하는 것이 빠릅니다.
  • 중첩 테이블 : 성능은 중첩 테이블의 크기에 의해 영향을받을 수 있습니다. 대형 중첩 테이블에 요소를 추가하는 것과 같은 작업은 작은 테이블의 동등한 작업보다 느리게 발생할 수 있습니다. 또한 인덱스별로 특정 요소를 검색하는 것이 값별로 요소를 검색하는 것보다 빠를 수 있습니다.
  • 연관 배열 : 키에 의해 요소에 액세스하는 것은 일반적으로 매우 빠르므로 자주 조회에 이상적입니다. 그러나 해시 충돌 가능성으로 인해 성능은 매우 큰 배열로 저하 될 수 있습니다. 연관 배열을 통한 반복은 중첩 테이블을 통한 반복보다 느립니다.

컬렉션의 크기와 작동 빈도 (삽입, 삭제, 조회)는 전체 성능에 크게 영향을 미칩니다. 매우 큰 데이터 세트의 경우 액세스 패턴을 최적화하고 구체화 된 뷰 또는 파이프 라인 기능과 같은 대체 접근 방식을 사용하여 잠재적으로 고려하십시오.

PL/SQL 절차 및 기능에 대한 매개 변수로 컬렉션을 효율적으로 전달하려면 어떻게해야합니까?

컬렉션을 매개 변수로 효율적으로 전달하려면 다양한 통과 모드 (In, Out, Out)를 이해하고 필요에 따라 적절한 방법을 선택하는 것이 포함됩니다. 적절한 경우 %ROWTYPE 속성을 사용하면 성능이 향상됩니다.

매개 변수에서 : 이것은 컬렉션을 통과하는 가장 일반적인 방법입니다. 컬렉션은 읽기 전용 값으로 전달됩니다. 절차 또는 기능은 컬렉션의 사본을 수신하며, 이는 소규모 컬렉션의 경우 효율적일 수 있지만 매우 큰 컬렉션의 경우 덜 효율적 일 수 있습니다.

OUT 매개 변수 : 프로 시저 또는 함수는 수집을 수정하고 수정 된 버전을 반환합니다.

아웃 매개 변수 : 컬렉션은 프로 시저 또는 기능 내에서 전달되고 수정되며 수정 된 버전이 반환됩니다.

매개 변수에서 사용하는 예 :

 <code class="sql">CREATE OR REPLACE PROCEDURE process_numbers (numbers IN num_list) IS BEGIN -- Process the numbers collection END; /</code>

매우 큰 컬렉션의 경우 컬렉션을 직접 통과하는 대신 객체 유형을 사용하여 참조로 전달하십시오. 이것은 큰 데이터 세트를 복사하는 메모리 오버 헤드를 줄일 수 있습니다.

컬렉션을 사용하여 PL/SQL 코드의 효율성을 향상시킬 수 있습니까? 그렇다면 어떻게해야합니까?

예, 컬렉션은 여러 가지 방법으로 PL/SQL 코드의 효율성을 크게 향상시킬 수 있습니다.

  • 컨텍스트 전환 감소 : 개별 행을 검색하기 위해 여러 데이터베이스 호출을하는 대신 단일 호출로 전체 컬렉션을 검색하여 PL/SQL과 데이터베이스 간의 컨텍스트 전환 오버 헤드를 줄일 수 있습니다.
  • 배치 처리 : 컬렉션을 사용하면 단일 문에 여러 행을 삽입하거나 업데이트하는 등의 배치 작업을 수행 할 수 있으며 개별 행 바이크 처리에 비해 성능을 크게 향상시킬 수 있습니다.
  • 개선 된 가독성 및 유지 관리 : 컬렉션을 사용하여 그룹 관련 데이터를 사용하면 코드 가독성이 향상되고 유지 관리가 더 쉬워집니다.
  • 최적화 된 데이터 검색 : 관련 데이터를 컬렉션으로 가져 오면 동일한 데이터에 대한 반복 데이터베이스 조회를 피할 수 있습니다. 이것은 마스터----------탈선 관계를 다룰 때 특히 유용합니다.

효율성 향상의 예 :

이 비효율적 인 접근 대신 :

 <code class="sql">FOR i IN 1..1000 LOOP SELECT column1 INTO variable1 FROM table1 WHERE id = i; -- Process variable1 END LOOP;</code>

중첩 테이블을 사용 하여이보다 효율적인 접근 방식을 사용하십시오.

 <code class="sql">DECLARE TYPE num_list IS TABLE OF NUMBER; data num_list; BEGIN SELECT id BULK COLLECT INTO data FROM table1 WHERE id BETWEEN 1 AND 1000; FOR i IN data.FIRST .. data.LAST LOOP -- Process data(i) END LOOP; END; /</code>

BULK COLLECT INTO 사용하면 단일 데이터베이스 왕복에서 1000 ID를 모두 검색하여 성능을 크게 향상시킵니다. 이 원칙은 다른 데이터베이스 작업에도 적용됩니다. 데이터 구조 및 액세스 패턴을 기반으로 최적의 성능을 위해 적절한 수집 유형을 선택하십시오.

위 내용은 PL/SQL (배열, 레코드, 테이블)에서 컬렉션을 어떻게 사용합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.