>데이터 베이스 >Oracle >PL/SQL에서 커서를 사용하여 여러 행의 데이터를 처리하려면 어떻게합니까?

PL/SQL에서 커서를 사용하여 여러 행의 데이터를 처리하려면 어떻게합니까?

百草
百草원래의
2025-03-13 13:16:171023검색

PL/SQL에서 커서를 사용하여 여러 행의 데이터를 처리하는 방법

PL/SQL의 커서는 SQL Query의 결과 세트에서 데이터 행을 행으로 처리하는 메커니즘을 제공합니다. 결과 세트에 대한 포인터 역할을하여 개별 행을 가져오고 조작 할 수 있습니다. 커서를 사용하려면 먼저 선언 한 다음 쿼리를 실행하여 한 번에 하나씩 행을 가져와 마침내 닫습니다. 다음은 고장입니다.

  1. 선언 : CURSOR 키워드를 사용하여 커서를 선언 한 다음 이름과 SQL 쿼리가 이어집니다. 쿼리는 처리하는 데 필요한 열을 선택해야합니다.

     <code class="sql">DECLARE CURSOR emp_cursor IS SELECT employee_id, last_name, salary FROM employees WHERE department_id = 10; BEGIN -- Cursor operations will go here END; /</code>
  2. 개방 : OPEN 문은 커서와 관련된 쿼리를 실행하고 첫 번째 행 앞에 커서를 배치합니다.

     <code class="sql">OPEN emp_cursor;</code>
  3. Fetching : FETCH 문은 결과 세트에서 행을 검색하고 값을 변수로 배치합니다. 커서 쿼리에서 선택한 열의 데이터 유형과 일치하는 변수를 선언해야합니다.

     <code class="sql">DECLARE employee_id employees.employee_id%TYPE; last_name employees.last_name%TYPE; salary employees.salary%TYPE; CURSOR emp_cursor IS ...; -- as declared above BEGIN OPEN emp_cursor; LOOP FETCH emp_cursor INTO employee_id, last_name, salary; EXIT WHEN emp_cursor%NOTFOUND; -- Process the fetched row here DBMS_OUTPUT.PUT_LINE('Employee ID: ' || employee_id || ', Name: ' || last_name || ', Salary: ' || salary); END LOOP; CLOSE emp_cursor; END; /</code>
  4. 마감 : CLOSE 명세서는 커서가 보유한 리소스를 출시합니다. 자원 누출을 방지하기 위해 커서를 닫는 것이 중요합니다.

     <code class="sql">CLOSE emp_cursor;</code>

emp_cursor%NOTFOUND 속성은 각 FETCH 후에 확인됩니다. 더 이상 행을 사용할 수 없으면 TRUE 되어 루프가 끝납니다. 이것은 커서에 의해 반환 된 행을 통해 반복하는 표준 방법입니다.

PL/SQL에서 사용할 수있는 다른 유형의 커서는 무엇이며 각각은 언제 사용해야합니까?

PL/SQL은 각각 강점과 약점을 가진 여러 유형의 커서를 제공합니다.

  • 암시 적 커서 : 이들은 단일 SELECT INTO 문을 실행할 때 PL/SQL에 의해 자동으로 생성됩니다. 그들은 프로그래머로부터 숨겨져 있으며 PL/SQL 엔진에 의해 자동으로 관리됩니다. 단일 행을 검색하는 간단한 쿼리에 사용하십시오. 쿼리가 둘 이상의 행을 반환하면 TOO_MANY_ROWS 예외가 발생합니다.
  • 명시 적 커서 : 이들은 프로그래머가 명시 적으로 선언하고 관리합니다 (이전 섹션에서와 같이). 다양한 행의 검색 및 처리를보다 효과적으로 처리하여 다양한 시나리오를 효과적으로 처리합니다. 복잡한 쿼리 또는 여러 행을 처리 할 때 사용하십시오.
  • Ref Cursors : 이들은 절차 또는 기능에 매개 변수로 전달 될 수있는 커서입니다. 응용 프로그램의 여러 부분에서 데이터를 처리하는 데 동적 SQL과 유연성이 더 많이 허용됩니다. 미리 데이터의 정확한 구조를 알지 못하고 결과 세트를 반환 해야하는 저장된 절차에 사용하십시오.

선택은 귀하의 요구에 따라 달라집니다. 간단한 단일 줄 검색에 암시 적 커서 사용, 명확한 제어 기능을 갖춘보다 복잡한 멀티 랑 처리를위한 명백한 커서, 동적 SQL 및 프로 시저/기능 매개 변수 통과를위한 Cursors.

성능 문제를 피하기 위해 PL/SQL의 커서를 사용하여 대형 데이터 세트를 효율적으로 처리하려면 어떻게해야합니까?

커서로 대형 데이터 세트를 처리하는 것은주의 깊게 처리하지 않으면 비효율적 일 수 있습니다. 성능 향상을위한 몇 가지 전략은 다음과 같습니다.

  • 대량 처리 : 가능할 때마다 행으로 처리하지 마십시오. FORALL 문과 같은 기술을 사용하여 한 번에 여러 행에서 작업을 수행합니다. 이는 PL/SQL 엔진과 데이터베이스 서버 간의 컨텍스트 전환을 크게 줄입니다.
  • 커서 작업을 최소화 : 커서를 열고 닫는 횟수를 제한하십시오. 커서를 열고 닫는 것은 오버 헤드가 있습니다. 단일 커서 내에서 가능한 많은 데이터를 처리하십시오.
  • 적절한 인덱싱 : 데이터 검색 속도를 높이기 위해 쿼리와 관련된 테이블에 적절한 인덱스가 존재하는지 확인하십시오. 커서 정의에 사용 된 쿼리는 일반 SQL 쿼리이므로 인덱싱 원칙이 정상적으로 적용됩니다.
  • 쿼리 최적화 : 커서에 효율적인 SQL 쿼리를 쓰십시오. SELECT * 피하고 대신 필요한 열만 지정하십시오. 클로스가 데이터를 효과적으로 필터링하기 위해 적절한 WHERE 사용하십시오.
  • 배치를 가져 오십시오 : 한 번에 한 줄을 가져 오는 대신 루프와 배열을 사용하여 배치로 여러 행을 가져옵니다. 이로 인해 데이터베이스로의 라운드 트립 수가 줄어 듭니다.
  • 다른 방법을 고려하십시오. 매우 큰 데이터 세트의 경우 파이프 라인 테이블 기능 또는 구체화 된 뷰와 같은 다른 기술을 사용하여 커서로 가능한 성능을 향상시킵니다.

PL/SQL의 커서가있는 루프에 사용하여 여러 행을 처리 할 때 코드를 단순화하고 가독성을 향상시킬 수 있습니까?

예, 코드를 단순화하고 가독성을 향상시키기 위해 커서가있는 FOR 에 사용할 수 있습니다. FOR 루프는 암시 적으로 커서의 개구부, 가져 오기 및 폐쇄를 처리하여 코드를보다 간결하고 이해하기 쉽게 만듭니다. 이것은 명백한 커서를 다룰 때 특히 유익합니다.

이전에 표시된대로 수동 LOOPFETCH 대신 다음을 사용할 수 있습니다.

 <code class="sql">DECLARE CURSOR emp_cursor IS SELECT employee_id, last_name, salary FROM employees WHERE department_id = 10; BEGIN FOR emp_rec IN emp_cursor LOOP DBMS_OUTPUT.PUT_LINE('Employee ID: ' || emp_rec.employee_id || ', Name: ' || emp_rec.last_name || ', Salary: ' || emp_rec.salary); END LOOP; END; /</code>

루프 FOR 경우 자동으로 커서 반복을 처리합니다. emp_rec 레코드 변수는 커서에서 가져온 각 행의 값을 자동으로 수신합니다. 이 접근법은 커서를 수동으로 관리하는 것과 비교할 때 더 깨끗하고 읽기 쉬우 며 오류가 덜 발생합니다. PL/SQL에서 대부분의 커서 기반 행 처리에 선호되는 방법입니다.

위 내용은 PL/SQL에서 커서를 사용하여 여러 행의 데이터를 처리하려면 어떻게합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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