PL / SQL Cursor

요약 :이 튜토리얼에서는 PL / SQL 커서와 그 사용법에 대해 배웁니다.

커서는 쿼리 결과를 가리키는 포인터. PL / SQL에는 암시 적 커서와 명시 적 커서라는 두 가지 유형의 커서가 있습니다.

암시 적 커서

Oracle이 SELECT INTO, INSERT, UPDATEDELETE는 암시 적 커서를 자동으로 생성합니다.

Oracle은 암시 적 커서의 전체 실행주기를 내부적으로 관리하고 SQL%ROWCOUNT, SQL%ISOPEN, SQL%FOUNDSQL%NOTFOUND.

쿼리가 0 개 또는 여러 개의 행을 반환하면 암시 적 커서가 우아하지 않습니다. 이는 각각 NO_DATA_FOUND 또는 TOO_MANY_ROWS 예외를 유발합니다.

명시 적 커서

명시 적 커서는 현재 블록 또는 패키지 사양의 선언 섹션에서 명시 적으로 선언 된 SELECT 문.

명시 적 커서의 경우 cont이 있습니다. OPEN, FETCHCLOSE에서 실행주기를 제어합니다.

Oracle은 SQL 문을 실행하고 커서를 연결하는 실행주기를 정의합니다.

다음 그림은 명시 적 커서의 실행주기를 보여줍니다.

각 단계를 자세히 살펴 보겠습니다.

커서 선언

명시 적 커서를 사용하기 전에 다음과 같이 블록 또는 패키지의 선언 섹션에서 선언해야합니다.

이 구문에서 :

  • 먼저 CURSOR 키워드 뒤에 커서 이름을 지정합니다.
  • 둘째, 데이터를 가져올 쿼리를 정의합니다. IS 키워드 뒤.

커서 열기

커서에서 행 가져 오기를 시작하기 전에 커서를 열어야합니다. 커서를 열려면 다음 구문을 사용합니다.

이 구문에서 cursor_name는 이름입니다. 선언 섹션에 선언 된 커서의.

커서를 열면 Oracle은 쿼리를 구문 분석하고 변수를 바인딩하고 관련 SQL 문을 실행합니다.

Oracle은 실행 계획도 결정합니다. , 호스트 변수 및 커서 매개 변수를 SQL 문의 자리 표시 자와 연결하고, 결과 집합을 결정하고, 커서를 결과 집합의 첫 번째 행에 설정합니다.

다음 자습서에서 매개 변수화 된 커서에 대해 자세히 알아보세요.

커서에서 가져 오기

FETCH 문은 현재 행의 내용을 변수에 배치합니다. FETCH 문의 구문은 다음과 같습니다.

결과 집합의 모든 행을 검색하려면 다음이 필요합니다. 마지막 행까지 각 행을 가져옵니다.

커서 닫기

모든 행을 가져온 후 CLOSE 문 :

커서를 닫으면 Oracle이 적절한 시간에 할당 된 메모리를 해제하도록 지시합니다.

익명 블록, 프로 시저 또는 함수의 경우 이러한 개체의 실행이 종료되면 커서가 자동으로 닫힙니다.

그러나 패키지 기반 커서는 명시 적으로 닫아야합니다. 아직 열리지 않은 커서를 닫으면 Oracle은 INVALID_CURSOR 예외를 발생시킵니다.

명시 적 커서 속성

커서 다음 형식으로 참조 할 수있는 4 개의 속성이 있습니다.

여기서 cursor_name는 명시 적 커서.

1) % ISOPEN

커서가 열려있는 경우이 속성은 TRUE이거나 FALSE 그렇지 않은 경우

2) % FOUND

이 속성에는 다음 네 가지 값이 있습니다.

  • NULL 첫 번째 가져 오기 전
  • TRUE 레코드를 성공적으로 가져온 경우
  • FALSE 반환 된 행이없는 경우
  • INVALID_CURSOR 커서가 열리지 않은 경우

3) % NOTFOUND

이 속성에는 다음 네 가지 값이 있습니다.

  • NULL 첫 번째 가져 오기 전
  • FALSE 레코드를 가져온 경우 succ 본질적으로
  • TRUE 반환 된 행이없는 경우
  • INVALID_CURSOR 커서가 열리지 않은 경우

3) % ROWCOUNT

%ROWCOUNT 속성은 커서에서 가져온 행 수를 반환합니다. 커서가 열리지 않으면이 속성은 INVALID_CURSOR를 반환합니다.

PL / SQL 커서 예

우리는 ordersorder_items 테이블을 사용합니다. 데모 용 샘플 데이터베이스입니다.

다음 문은 고객의 판매 수익을 반환하는보기를 만듭니다.

크레딧 열의 값은 총 판매 수익의 5 %입니다.

익명을 개발해야한다고 가정합니다. 차단 :

  1. 모든 고객의 신용 한도를 0으로 재설정
  2. 판매를 기준으로 내림차순으로 정렬 된 고객을 가져와 1 백만 예산에서 새로운 신용 한도를 제공합니다.

다음 익명 블록은 논리를 보여줍니다.

선언 섹션에서 세 개의 변수를 선언합니다.

첫 번째는

의 초기 값은 1,000,000입니다.

두 번째 변수는 c_sales 문은 sales보기에서 데이터를 검색합니다.

세 번째 변수는 c_sales라는 커서 기반 레코드.

실행 섹션에서 다음을 수행합니다.

  • 먼저 신용 한도를 재설정합니다. UPDATE 문을 사용하여 모든 고객을 0으로 만듭니다.
  • 둘째, c_sales 커서를 엽니 다.
  • 셋째, 커서에서 각 행을 가져옵니다. 각 루프 반복에서 신용 한도를 업데이트하고 예산을 줄였습니다. 가져올 행이 없거나 예산이 소진되면 루프가 종료됩니다.
  • 마지막으로 커서를 닫습니다.

다음 쿼리는

테이블 :

결과 :

결과에서 명확하게 알 수 있듯이 처음 몇 명의 고객 만 신용 한도를 가지고 있습니다. 모든 신용 한도를 합산하면 다음과 같이 합계가 1 백만이되어야합니다.

이제 , 암시 적 및 명시 적 커서를 포함한 PL / SQL 커서를 이해하고이를 효과적으로 사용하여 테이블에서 행 단위로 데이터를 처리하는 방법을 이해해야합니다.

  • 이 자습서가 도움이 되었습니까?
  • 예 아니요

Leave a Reply

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다