이 문서는 지원되지 않는 버전의 PostgreSQL을위한 것입니다.
당신은에 대해 같은 페이지를 보려고 할 수 있습니다PostgreSQL : 문서 : 17 : 41.7. 스포츠 토토 꽁 머니버전 또는 위에 나열된 다른 지원 버전 중 하나입니다.

19.7. 토토 꽁 머니

한 번에 전체 쿼리를 실행하는 대신 가능합니다. a 설정토토 꽁 머니쿼리를 한 다음 한 번에 몇 행을 쿼리 결과를 읽으십시오. 하나 이를 수행하는 이유는 결과가 발생할 때 메모리 오버런을 피하기 때문입니다. 많은 행이 포함되어 있습니다. (하지만,pl/pgsql사용자는 일반적으로 걱정할 필요가 없습니다 그것에 대해, 루프의 경우 내부적으로 토토 꽁 머니를 자동으로 사용하므로 메모리 문제를 피하기 위해.) 더 흥미로운 사용법은 반환하는 것입니다. 발신자가 생성 한 토토 꽁 머니에 대한 참조 행을 읽습니다. 이것은 크게 반환하는 효율적인 방법을 제공합니다 함수에서 행 세트.

19.7.1. Declaring Cursor 변수

토토 꽁 머니에 대한 모든 액세스pl/pgsql토토 꽁 머니 변수를 통과합니다. 항상 특별한 데이터 유형Refcursor. 토토 꽁 머니 변수를 생성하는 한 가지 방법은 다음과 같습니다 유형 변수로 선언하려면Refcursor. 또 다른 방법은 토토 꽁 머니를 사용하는 것입니다 일반적으로 : 선언문 구문

이름토토 꽁 머니 [(인수)] forselect_query;

(for로 대체 될 수 있습니다isOracle 호환성의 경우)인수가있는 경우 쉼표로 분리되어 있습니다 목록이름 Datatype이름을 정의하는 쌍 주어진 쿼리의 매개 변수 값으로 대체되었습니다. 실제 이 이름을 대체 할 값은 나중에 지정됩니다. 토토 꽁 머니가 열리면.

일부 예 :

선언
    CURS1 Refcursor;
    select * from tenk1에 대한 curs2 cursor;
    CURS3 CURSOR (키 INT)는 선택 *에서 tenk1에서 exign1 = key;

이 세 가지 변수 모두 데이터 유형이 있습니다Refcursor이지만 첫 번째는 어떤 것도 사용될 수 있습니다 쿼리, 두 번째에는 완전히 지정된 쿼리가 있습니다bound그것에, 그리고 마지막에는 a 매개 변수화 된 쿼리. (토토 꽁 머니 일 때 정수 매개 변수 값으로 대체됩니다. 열려 있습니다.) 변수CURS1장차 ~ 가 되는Unbound묶이지 않기 때문에 특정 쿼리.

19.7.2. 토토 꽁 머니 열기

토토 꽁 머니를 사용하기 전에 행을 검색하기 전에오픈. (이것은 동등한 행동입니다 SQL 명령에토토 꽁 머니 선언.)PL/PGSQL4 가지 형태가 있습니다 오픈 명령문, 그 중 두 개는 부정한 토토 꽁 머니 변수를 사용하고 다른 두 사람은 바운드 토토 꽁 머니 변수를 사용합니다.

19.7.2.1. select를 위해 엽니

OpenUnbound-Cursor선택 ...;

토토 꽁 머니 변수가 열리고 지정된 것이 주어집니다 실행할 쿼리. 토토 꽁 머니는 이미 열 수 없으며 그것을 열 수 없습니다 결합되지 않은 토토 꽁 머니로 선언되었을 것입니다 (즉, 즉 단순한Refcursor변수). 선택 쿼리는 다른 선택 진술과 같은 방식으로 처리됩니다. 안에pl/pgsql: pl/pgsql가변 이름이 대체되었습니다. 그리고 쿼리 계획은 가능한 재사용을 위해 캐시됩니다.

select * from foo where key = mykey;의 curs1을 엽니 다.

19.7.2.2. execute를 위해 열기

OpenUnbound-CursorexecuteQuery-String;

토토 꽁 머니 변수가 열리고 지정된 것이 주어집니다 실행할 쿼리. 토토 꽁 머니는 이미 열 수 없으며 그것을 열 수 없습니다 결합되지 않은 토토 꽁 머니로 선언되었을 것입니다 (즉, 즉 단순한Refcursor변수). 쿼리 와 같은 방식으로 문자열 표현식으로 지정됩니다. 명령을 실행하십시오. 평소와 같이 이것은 유연성을 제공합니다 쿼리는 한 번에서 다음 실행마다 다를 수 있습니다.

실행을위한 CURS1을 엽니 다 quote_ident ($ 1);

19.7.2.3. 바운드 토토 꽁 머니 열기

Openbound-cursor[(argument_values)];

이 형태의 열린 형태는 토토 꽁 머니 변수를 열는 데 사용됩니다. 쿼리가 선언되었을 때 쿼리에 구속되었습니다. 토토 꽁 머니는 할 수 없습니다 이미 열려 있습니다. 실제 인수 값 표현 목록 토토 꽁 머니가 취하도록 선언 된 경우에만 나타나야합니다. 논쟁. 이 값은 쿼리에서 대체됩니다. 그만큼 바운드 토토 꽁 머니에 대한 쿼리 계획은 항상 캐시 가능한 것으로 간주됩니다. ---이 경우 실행과 동등한 것은 없습니다.

Open Curs2;
열린 curs3 (42);

19.7.3. 토토 꽁 머니 사용

토토 꽁 머니가 열리면 조작 할 수 있습니다. 여기에 설명 된 진술.

이러한 조작은 같은 함수에서 발생할 필요가 없습니다. 토토 꽁 머니를 열었습니다. 당신은 a를 반환 할 수 있습니다.Refcursor함수에서 값을 벗어나고 발신자는 토토 꽁 머니에서 작동합니다. (내부적으로 ARefcursor값은 단순히 a의 문자열 이름입니다 토토 꽁 머니의 활성 쿼리가 포함 된 포털. 이 이름 다른 곳에 배정 될 수 있습니다Refcursor변수 등을 방해하지 않습니다 포털.)

모든 포털은 트랜잭션 종료시 암시 적으로 닫힙니다. 따라서 aRefcursor값은 유용합니다 끝까지 열린 토토 꽁 머니를 참조하십시오. 거래.

19.7.3.1. 술책

Fetch토토 꽁 머니in대상;

페치는 토토 꽁 머니에서 다음 행을 행 변수, 레코드 변수 일 수있는 대상, 또는 선택과 마찬가지로 간단한 변수 목록 안으로. Select Into와 마찬가지로 Special Variable발견행이 있는지 확인할 수 있습니다 획득 여부.

CURS1을 Rowvar로 가져옵니다.
curs2를 foo, bar, baz로 가져옵니다.

19.7.3.2. 닫다

닫기토토 꽁 머니;

Close는 열린 토토 꽁 머니의 기본 포털을 닫습니다. 이것 끝보다 일찍 자원을 해제하는 데 사용할 수 있습니다. 트랜잭션 또는 토토 꽁 머니 변수를 열어야합니다. 다시.

Close Curs1;

19.7.3.3. 반환 토토 꽁 머니

pl/pgsql함수는 할 수 있습니다 토토 꽁 머니를 발신자에게 반환합니다. 이것은 다중 반환에 사용됩니다 함수의 행 또는 열. 함수가 열립니다 토토 꽁 머니와 토토 꽁 머니 이름을 발신자에게 반환합니다. 발신자 그런 다음 토토 꽁 머니에서 행을 가져올 수 있습니다. 토토 꽁 머니를 닫을 수 있습니다 발신자에 의해 또는 거래가 끝납니다.

함수에 의해 반환 된 토토 꽁 머니 이름을 지정할 수 있습니다. 발신자 또는 자동으로 생성. 다음 예제는 토토 꽁 머니 이름을 방문객:

테이블 테스트 생성 (col 텍스트);
테스트 값에 삽입 ( '123');

기능 reffunc (refcursor) 생성 refcursor를 다시 반환합니다.
시작하다
        Test에서 COL SELECT COL에 대해 $ 1을 엽니 다;
        $ 1의 반환;
끝;
'언어'plpgsql ';

시작하다;
Reffunc ( 'funccursor')을 선택하십시오.
funccursor에서 모두 가져 오십시오.
저지르다;

다음 예제는 자동 토토 꽁 머니 이름을 사용합니다 세대:

함수 만들기 reffunc2 () refcursor를 반환합니다.
선언하다
        refcursor;
시작하다
        테스트에서 COL SELECT COL에 대한 공개 심판;
        반환 심판;
끝;
'언어'plpgsql ';

시작하다;
선택 reffunc2 ();

        Reffunc2      
  -------------------
   <이름이없는 토토 꽁 머니 1
  (1 줄)

"<이름없는 토토 꽁 머니 1"에서 모두 가져 오십시오.
저지르다;