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

38.7. 와이즈 토토

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

38.7.1. 와이즈 토토 선언 변수

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

이름[[아니오] 스크롤] 와이즈 토토 [(인수)] for쿼리;

(for로 대체 할 수 있습니다isforOracle호환성.) if스크롤is 지정된 Cursor는 뒤로 스크롤 할 수 있습니다. 만약에스크롤 없음뒤로 지정되어 있습니다 페치는 거부됩니다. 사양이 나타나지 않으면 뒤로 페치가 허용되는지 여부 쿼리 의존적입니다.인수지정된 경우 a 쉼표로 구분 된 쌍 목록이름 DataType이름을 정의합니다 주어진 쿼리의 매개 변수 값으로 대체되었습니다. 실제 이 이름을 대체 할 값은 나중에 지정됩니다. 와이즈 토토가 열리면.

일부 예 :

선언
    CURS1 Refcursor;
    select * from tenk1에 대한 curs2 cursor;
    CURS3 CURSOR (키 정수)는 SELECT * FROM TENK1 여기서 고유 1 = 키;

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

38.7.2. 와이즈 토토 열기

와이즈 토토를 사용하기 전에 행을 검색하기 전에오픈. (이것은 동등한 행동입니다 SQL 명령에와이즈 토토 선언.)pl/pgsql세 가지 형태가 있습니다 그만큼Open진술, 그 중 2 개는 사용됩니다 3 번째는 바운드 와이즈 토토를 사용하는 반면 와이즈 토토 변수는 바운드 와이즈 토토를 사용합니다. 변하기 쉬운.

38.7.2.1. Open for 쿼리

OpenUnbound_cursor[[아니오] 스크롤] for쿼리;

와이즈 토토 변수가 열리고 지정된 것이 주어집니다 실행할 쿼리. 와이즈 토토는 이미 열 수 없으며 그것을 열 수 없습니다 결합되지 않은 와이즈 토토로 선언되었을 것입니다 (즉, 즉 단순한Refcursor변수). 쿼리select또는 다른 것 그것은 행을 반환합니다 (예 :설명). 쿼리는 다른 SQL 명령과 같은 방식으로 처리됩니다.pl/pgsql: pl/pgsql가변 이름이 대체됩니다. 그리고 쿼리 계획은 재사용 가능한 재사용을 위해 캐시됩니다. Apl/pgsql변수입니다 와이즈 토토 쿼리, 즉 값으로 대체되었습니다 대체 된 것은 당시의 것입니다.Open; 변수에 대한 후속 변경은 의지합니다 와이즈 토토의 행동에 영향을 미치지 않습니다. 그만큼스크롤and스크롤 없음옵션은 바운드 와이즈 토토와 동일한 의미를 갖습니다.

예 :

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

38.7.2.2. execute를 위해 열기

OpenUnbound_cursor[[아니오] 스크롤] executequery_string;

와이즈 토토 변수가 열리고 지정된 것이 주어졌습니다 실행할 쿼리. 와이즈 토토는 이미 열 수 없으며 그것을 열 수 없습니다 결합되지 않은 와이즈 토토로 선언되었을 것입니다 (즉, 즉 단순한Refcursor변수). 쿼리 in과 같은 방식으로 문자열 표현식으로 지정됩니다. 그만큼execute명령. 평소와 같이, 이것은 유연성을 제공하여 쿼리 계획은 한 번마다 다를 수 있습니다. 다음 (참조섹션 38.10.2), 그리고 그것은 또한 가변 대체임을 의미합니다 명령 문자열에서 수행되지 않습니다. 그만큼스크롤and스크롤 없음옵션은 바운드 와이즈 토토와 동일한 의미를 갖습니다.

예 :

execute 'select * from'|| quote_ident ($ 1);

38.7.2.3. 바운드 와이즈 토토 열기

Openbound_cursor[(argument_values)];

이 형태의Open열기에 사용됩니다 쿼리가 그 일에 묶인 와이즈 토토 변수 선언. 와이즈 토토는 이미 열 수 없습니다. 실제 목록 인수 값 표현은 와이즈 토토는 논쟁을 선언했다. 이 값이 될 것입니다 쿼리에서 대체되었습니다. 바운드 와이즈 토토에 대한 쿼리 계획 항상 캐시 가능한 것으로 간주됩니다. 에 해당하지 않습니다.execute이 경우. 주석스크롤and아니오 스크롤와이즈 토토의 스크롤로 지정할 수 없습니다 행동이 이미 결정되었습니다.

변수 대체는 바운드 와이즈 토토의 쿼리, 값을 전달하는 두 가지 방법이 있습니다. 와이즈 토토 : 명백한 주장이있는Openpl/pgsql변수 질문. 그러나 바운드 앞에 선언 된 변수만이 선언되었습니다 와이즈 토토는 그것으로 대체 될 것이라고 선언했다. 어느 쪽이든 사례 전달 될 값은 당시 결정됩니다.Open.

예 :

Open CURS2;
열린 curs3 (42);

38.7.3. 와이즈 토토 사용

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

이러한 조작은 같은 기능으로 발생할 필요가 없습니다. 와이즈 토토를 열었습니다. 당신은 a를 반환 할 수 있습니다.Refcursor함수에서 값을 벗어나고 발신자는 와이즈 토토에서 작동합니다. (내부적으로 ARefcursor값은 단순히 a의 문자열 이름입니다 와이즈 토토의 활성 쿼리가 포함 된 소위 포털. 이 이름은 주변을 지나갈 수 있으며 다른 사람에게 할당Refcursor방해없이 변수 등 포털.)

모든 포털은 트랜잭션 종료시 암시 적으로 닫힙니다. 따라서 aRefcursor값은 사용할 수 있습니다 끝까지 열린 와이즈 토토를 참조하십시오. 거래.

38.7.3.1. Fetch

Fetch [ 방향From | 안에]와이즈 토토into대상;

Fetch다음 행을 검색합니다 행 변수 일 수있는 대상으로의 와이즈 토토 레코드 변수 또는 쉼표로 구분 된 간단한 목록 변수, 좋아요선택. 만약에 다음 행이 없으며 대상이 NULL로 설정됩니다. 와 마찬가지로선택, 특별 변수발견를 확인하여 확인할 수 있습니다 행이 얻어 졌는지 여부.

the방향절의 캔 SQL에서 허용되는 변형이어야합니다fetch가능한 명령을 제외한 명령 둘 이상의 행을 가져 오십시오. 즉,다음, Prior, 첫 번째, 마지막, 절대 count, 상대 count, Forward또는뒤로. 생략방향입니다 지정과 동일다음. 방향이동이 필요한 값 와이즈 토토가 선언되거나 와 함께 열음스크롤옵션.

와이즈 토토이름이어야합니다 에이Refcursoran 와이즈 토토 포털 열기.

예 :

CURS1을 Rowvar로 가져옵니다.
curs2를 foo, bar, baz로 가져옵니다.
Curs3에서 x, y로 마지막으로 가져 오십시오.
CURS4에서 X 로의 상대적 -2를 가져옵니다.

38.7.3.2. 움직임

이동 [ 방향from | 안에]와이즈 토토;

움직임없이 와이즈 토토를 재배치합니다 데이터 검색.움직임작품 똑같은fetch명령, 와이즈 토토 만 재배치하고 행으로 이동했습니다. 와 마찬가지로선택, 특별 변수발견할 수 있습니다 다음 행이 있는지 확인하기 위해 확인했습니다.

옵션방향절과 동일합니다Fetch, 즉다음, 이전, 첫 번째, 마지막, 절대 count, 상대 count, Forward또는뒤로. 생략방향is 지정과 동일다음. 방향이동이 필요한 값 와이즈 토토가 선언되거나 와 함께 열음스크롤옵션.

예 :

CURS1 움직임;
CURS3에서 마지막으로 이동;
CURS4에서 상대적 -2 이동;

38.7.3.3. 현재 위치를 업데이트/삭제합니다 의

업데이트테이블SET ... 현재의 전류와이즈 토토;테이블현재의 전류와이즈 토토;

와이즈 토토가 테이블 행에 배치되면 해당 행 와이즈 토토를 사용하여 업데이트 또는 삭제하여 행을 식별하십시오. 이것은 단순한 (비 조진, 비 그룹화)에만 적용됩니다. 와이즈 토토 쿼리. 자세한 내용은를 참조하십시오.PostgreSQL : 문서 : 8.3 : 스포츠 토토 결과참조 페이지.

예 :

업데이트 foo set dataval = myval where curs1;

38.7.3.4. 닫기

닫기와이즈 토토;

닫기포털을 닫습니다 열린 와이즈 토토의 기본. 이것은 출시에 사용될 수 있습니다 거래 종료보다 일찍 자원을 해제하거나 와이즈 토토 변수가 다시 열릴 것입니다.

예 :

Close Curs1;

38.7.3.5. 반환 와이즈 토토

pl/pgsql함수는 할 수 있습니다 와이즈 토토를 발신자에게 반환합니다. 이것은 돌아 오는 데 유용합니다 여러 행이나 열, 특히 매우 큰 결과가 있습니다 세트. 이를 위해 기능은 와이즈 토토를 열고 반환합니다. 발신자의 와이즈 토토 이름 (또는 단순히 와이즈 토토를 엽니 다. 에 의해 지정된 포털 이름을 사용하거나 방문객). 그런 다음 발신자는 와이즈 토토에서 행을 가져올 수 있습니다. 그만큼 발신자가 와이즈 토토를 닫을 수 있거나 닫힙니다. 트랜잭션이 닫히면 자동으로.

와이즈 토토에 사용되는 포털 이름은 프로그래머 또는 자동 생성. 포털을 지정합니다 이름, 단순히에 문자열을 할당하십시오.Refcursor열기 전에 변수. 문자열 의 가치Refcursor변수가 될 것입니다 사용Open의 이름으로 기본 포털. 그러나이면Refcursor변수는 null,Open자동으로 이름을 생성합니다 기존 포털과 충돌하지 않고에 할당합니다.Refcursor변수.

참고 :바운드 와이즈 토토 변수가 초기화됩니다 문자열 값은 그 이름을 나타내므로 포털 이름은 와이즈 토토 변수 이름과 동일합니다. 프로그래머가 이전에 과제를 통해이를 무시하지 않는 한 와이즈 토토 열기. 그러나 결합되지 않은 와이즈 토토 변수 초기에 널 값에 대한 기본값이 있으므로 수신합니다. 그렇지 않으면 자동으로 생성 된 고유 이름 재정의.

다음 예제는 와이즈 토토 이름이 될 수있는 한 가지 방법을 보여줍니다. 발신자가 제공 :

테이블 테스트 생성 (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"에서 모두 가져 오십시오.
저지르다;

다음 예제는 여러 가지를 반환하는 한 가지 방법을 보여줍니다 단일 함수의 와이즈 토토 :

함수 생성 myfunc (refcursor, refcursor) setof refcursor를 $$로 반환합니다
시작하다
    table_1에서 선택 *에 대해 $ 1을 엽니 다;
    다음 $ 1;
    table_2에서 select *에 대해 $ 2를 엽니 다;
    다음 $ 2를 반환합니다.
끝;
$$ 언어 plpgsql;

- 와이즈 토토를 사용하려면 거래에 있어야합니다.
시작하다;

myfunc ( 'a', 'b')에서 *를 선택하십시오.

a에서 모두 가져 오십시오.
b에서 모두 가져 오십시오.
저지르다;