이 문서는 지원되지 않는 PostgreSQL 버전에 대한 것입니다.
당신은 다음과 같은 페이지를 보고 싶을 수도 있습니다.PostgreSQL : 문서 : 17 : 41.7. 스포츠 토토버전 또는 위에 나열된 다른 지원 버전 중 하나를 사용하세요.

38.7. 와이즈 토토

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

38.7.1. 와이즈 토토 선언 변수

다음 와이즈 토토에 대한 모든 접근PL/pgSQL와이즈 토토 변수를 통과합니다. 항상 특수 데이터 유형입니다.반환자. 와이즈 토토 변수를 생성하는 한 가지 방법은 다음과 같습니다. 유형의 변수로 선언하기만 하면 됩니다.반환자. 또 다른 방법은 와이즈 토토를 사용하는 것입니다. 일반적으로 선언 구문은 다음과 같습니다.

이름 [ [아니요] 스크롤] 와이즈 토토 [ ( 인수 ) ] FOR질의;

(for다음으로 대체 가능ISfor오라클호환성.) 만약스크롤이다 지정하면 와이즈 토토는 뒤로 스크롤할 수 있습니다. 만일스크롤 없음지정됨, 뒤로 가져오기가 거부됩니다. 두 사양 모두 나타나지 않으면 역방향 가져오기가 허용되는지 여부는 쿼리에 따라 다릅니다.인수이 지정된 경우 쉼표로 구분된 쌍 목록이름 데이터 유형이름을 정의하는 것은 해당 쿼리의 매개변수 값으로 대체됩니다. 실제 이 이름을 대체할 값은 나중에 지정됩니다. 와이즈 토토가 열릴 때.

일부 예:

선언하다
    curs1 재귀사자;
    curs2 선택을 위한 와이즈 토토 * tenk1에서;
    curs3 CURSOR(키 정수) IS SELECT * FROM tenk1 WHERE Unique1 = 키;

이 세 변수는 모두 데이터 유형을 갖습니다.반환자, 그러나 첫 번째는 어떤 항목에도 사용할 수 있습니다. 쿼리, 두 번째 쿼리에는 이미 완전히 지정된 쿼리가 있습니다.바운드그리고 마지막에는 매개변수화된 쿼리가 바인딩되어 있습니다. (와이즈 토토가 있을 때 정수 매개변수 값으로 대체됩니다. 열립니다.) 변수curs1말씀하셨습니다 될 것이다언바운드다음에 바인딩되어 있지 않기 때문에 특정 쿼리.

38.7.2. 와이즈 토토 열기

와이즈 토토를 사용하여 행을 검색하려면 먼저 와이즈 토토를 사용해야 합니다.열림. (이것은 동등한 조치입니다. SQL 명령에와이즈 토토 선언.) PL/pgSQL세 가지 형태의열기문 중 두 개는 다음을 사용합니다. 바인딩되지 않은 와이즈 토토 변수는 바인딩된 와이즈 토토를 사용하는 반면 세 번째 변수는 바인딩된 와이즈 토토를 사용합니다. 변수.

38.7.2.1. 다음을 위해 열려 있음 질의

열기unbound_cursor [ [아니요] 스크롤] FOR질의;

와이즈 토토 변수가 열리고 지정된 값이 제공됩니다. 실행할 쿼리입니다. 와이즈 토토는 이미 열 수 없으며 바인딩되지 않은 와이즈 토토로 선언되어야 합니다(즉, 간단하다반환자변수). 쿼리 이어야 합니다.선택또는 다른 것 행을 반환합니다(예:설명). 쿼리는 다른 SQL 명령과 동일한 방식으로 처리됩니다.PL/pgSQL: PL/pgSQL변수 이름이 대체됩니다. 재사용이 가능하도록 쿼리 계획이 캐시됩니다. 때PL/pgSQL변수는 와이즈 토토 쿼리로 대체된 값은 대체된 것은 당시에 있었던 것입니다.열기; 이후에 변수를 변경하면 와이즈 토토의 동작에 영향을 주지 않습니다.스크롤그리고스크롤 없음옵션은 바인딩된 와이즈 토토와 동일한 의미를 갖습니다.

예:

선택을 위해 curs1 열기 * FROM foo WHERE 키 = mykey;

38.7.2.2. 실행 가능

열기unbound_cursor [ [아니요] 스크롤] 실행용query_string;

와이즈 토토 변수가 열리고 지정된 값이 제공됩니다. 실행할 쿼리입니다. 와이즈 토토는 이미 열 수 없으며 바인딩되지 않은 와이즈 토토로 선언되어야 합니다(즉, 간단하다반환자변수). 쿼리 에서와 같은 방식으로 문자열 표현식으로 지정됩니다.실행명령. 평소에도 이 유연성을 제공하므로 쿼리 계획은 실행마다 달라질 수 있습니다. 다음(참조섹션 38.10.2), 이는 또한 변수 대체가 명령 문자열에서는 수행되지 않았습니다.스크롤그리고스크롤 없음옵션은 바인딩된 와이즈 토토와 동일한 의미를 갖습니다.

예:

'SELECT * FROM' 실행을 위해 curs1 열기 || quote_ident($1);

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

열기bound_cursor [ ( argument_values ) ];

이 형식은열기여는 데 사용됩니다. 쿼리가 바인딩된 와이즈 토토 변수 선언했다. 와이즈 토토는 이미 열려 있을 수 없습니다. 실제 목록 인수 값 표현식은 다음과 같은 경우에만 나타나야 합니다. 와이즈 토토가 인수를 취하도록 선언되었습니다. 이러한 값은 쿼리로 대체되었습니다. 바인딩된 와이즈 토토에 대한 쿼리 계획 항상 캐시 가능한 것으로 간주됩니다. 해당하는 것은 없습니다실행이 경우. 참고하세요스크롤그리고아니요 스크롤와이즈 토토가 스크롤되므로 지정할 수 없습니다. 행동은 이미 결정되었습니다.

변수 대체는 다음에서 수행되므로 주의하세요. 바인딩된 와이즈 토토의 쿼리에는 값을 전달하는 두 가지 방법이 있습니다. 와이즈 토토: 명시적인 인수를 사용하거나열기또는 암시적으로 a를 참조하여PL/pgSQL변수 쿼리. 단, 바인딩 이전에 선언된 변수만 와이즈 토토가 선언되어 와이즈 토토로 대체됩니다. 어느 쪽이든 전달될 값이 다음 시점에 결정되는 경우열기.

예:

OPEN curs2;
OPEN curs3(42);

38.7.3. 와이즈 토토 사용

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

이러한 조작은 동일한 기능에서 발생할 필요는 없습니다. 처음부터 와이즈 토토를 열었습니다. 다음을 반환할 수 있습니다.반환자함수에서 값을 꺼내서 호출자는 와이즈 토토에 대해 작업합니다. (내부적으로, a반환자값은 단순히 문자열 이름입니다. 와이즈 토토에 대한 활성 쿼리를 포함하는 소위 포털입니다. 이 이름은 다른 사람에게 전달되거나 할당될 수 있습니다.반환자변수 등을 방해하지 않고 포털.)

모든 포털은 트랜잭션 종료 시 암시적으로 닫힙니다. 그러므로 a반환자값은 다음에 사용할 수 있습니다. 열린 와이즈 토토를 끝까지 참조하십시오. 거래.

38.7.3.1. 가져오기

가져오기 [ 방향보낸 사람 | 안으로] 와이즈 토토INTO대상;

가져오기에서 다음 행을 검색합니다. 행 변수일 수 있는 대상으로 와이즈 토토를 이동합니다. 레코드 변수 또는 쉼표로 구분된 단순 목록 변수, 마찬가지로선택. 만약에 다음 행이 없으면 대상이 NULL로 설정됩니다. 마찬가지로선택, 특수변수발견다음 여부를 확인할 수 있습니다. 행을 얻었는지 여부.

방향절은 가능 SQL에서 허용되는 변형 중 하나여야 합니다.가져오기가능한 명령을 제외한 명령 둘 이상의 행을 가져옵니다. 즉, 그럴 수 있습니다다음, 이전, 첫 번째, 마지막, 절대 개수, 상대적 개수, 앞으로또는뒤로. 생략방향이것은 지정과 동일다음. 방향이동이 필요한 값 와이즈 토토가 선언되지 않는 한 뒤로는 실패할 가능성이 높습니다. 다음으로 열렸습니다.스크롤옵션.

와이즈 토토다음 이름이어야 합니다. 에반환자다음을 참조하는 변수 와이즈 토토 포털을 엽니다.

예:

FETCH curs1 INTO rowvar;
curs2를 foo, bar, baz로 가져옵니다.
curs3에서 마지막으로 x, y로 가져옵니다.
curs4에서 x로 상대 -2를 가져옵니다.

38.7.3.2. 이동

이동 [ 방향보낸 사람 | 안으로] 와이즈 토토;

이동없이 와이즈 토토 위치를 변경합니다. 데이터를 검색 중입니다.이동작동 정확히는가져오기명령, 단, 와이즈 토토 위치만 변경하고 와이즈 토토를 반환하지 않습니다. 행이 다음으로 이동되었습니다. 마찬가지로선택, 특수 변수발견될 수 있습니다 이동할 다음 행이 있는지 확인했습니다.

에 대한 옵션방향절은 와 동일가져오기즉,다음, 이전, 첫 번째, 마지막, 절대 개수, 상대적 개수, 앞으로또는뒤로. 생략방향이것은 지정과 동일다음. 방향이동이 필요한 값 와이즈 토토가 선언되지 않는 한 뒤로는 실패할 가능성이 높습니다. 다음으로 열렸습니다.스크롤옵션.

예:

MOVE 와이즈 토토1;
curs3에서 마지막으로 이동;
curs4에서 상대 -2 이동;

38.7.3.3. 현재 위치 업데이트/삭제 OF

업데이트테이블설정 ... 현재 위치와이즈 토토;
다음에서 삭제:테이블현재 위치와이즈 토토;

와이즈 토토가 테이블 행에 위치하면 해당 행은 다음을 수행할 수 있습니다. 와이즈 토토를 사용하여 행을 식별하여 업데이트하거나 삭제할 수 있습니다. 이는 단순(비조인, 비그룹화)에서만 작동합니다. 와이즈 토토 쿼리. 추가 정보는 다음을 참조하세요.PostgreSQL : 문서 : 8.3 : 스포츠 토토 결과참조 페이지.

예:

Foo SET dataval 업데이트 = myval 현재 curs1의 위치;

38.7.3.4. 닫기

닫기와이즈 토토;

닫기포탈을 닫습니다 열린 와이즈 토토의 기본. 이는 해제하는 데 사용할 수 있습니다. 트랜잭션이 끝나기 전에 리소스를 확보하거나 와이즈 토토 변수가 다시 열립니다.

예:

CLOSE curs1;

38.7.3.5. 와이즈 토토 반환

PL/pgSQL함수는 호출자에게 와이즈 토토를 반환합니다. 돌려보내는데 유용해요 여러 행이나 열, 특히 결과가 매우 큰 경우 세트. 이를 위해 함수는 와이즈 토토를 열고 다음을 반환합니다. 호출자에게 와이즈 토토 이름을 알려줍니다(또는 단순히 와이즈 토토를 엽니다). 에 의해 지정되거나 달리 알려진 포털 이름을 사용하여 발신자). 그러면 호출자는 와이즈 토토에서 행을 가져올 수 있습니다. 는 호출자가 와이즈 토토를 닫을 수 있습니다. 그렇지 않으면 와이즈 토토가 닫힙니다. 거래가 종료되면 자동으로 종료됩니다.

와이즈 토토에 사용되는 포털 이름은 다음으로 지정할 수 있습니다. 프로그래머 또는 자동으로 생성됩니다. 포털을 지정하려면 이름을 지정하려면 간단히에 문자열을 할당하면 됩니다.반환자변수를 열기 전에. 문자열 의 값반환자변수는 다음과 같습니다 에서 사용됨열기이름으로 기본 포털. 그러나 만약에반환자변수가 null입니다.열기자동으로 다음과 같은 이름을 생성합니다. 기존 포털과 충돌하지 않으며 이를 다음 포털에 할당합니다.반환자변수.

참고:바운드 와이즈 토토 변수는 다음으로 초기화되었습니다. 이름을 나타내는 문자열 값입니다. 포털 이름은 와이즈 토토 변수 이름과 동일합니다. 프로그래머가 이전에 할당으로 이를 재정의하지 않는 한 와이즈 토토를 엽니다. 그러나 바인딩되지 않은 와이즈 토토 변수 기본값은 초기에 null 값이므로 수신됩니다. 자동으로 생성된 고유 이름. 재정의되었습니다.

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

CREATE TABLE 테스트(열 텍스트);
테스트 값에 삽입('123');

CREATE FUNCTION reffunc(refcursor)는 refcursor AS '를 반환합니다.
시작
    테스트에서 열 선택을 위해 $1을 엽니다.
    $1를 반환합니다.
끝;
' 언어 plpgsql;

시작하다;
SELECT reffunc('펑와이즈 토토');
funccursor에서 모두 가져오기;
커밋;

다음 예에서는 자동 와이즈 토토 이름을 사용합니다. 세대:

CREATE FUNCTION reffunc2()는 refcursor AS '를 반환합니다.
선언
    참조 참조자;
시작
    SELECT col FROM 테스트에 대한 OPEN 참조;
    반환 참조;
끝;
' 언어 plpgsql;

시작하다;
SELECT reffunc2();

      reffunc2      
-------
 <이름 없는 와이즈 토토 1
(1줄)

"<이름 없는 와이즈 토토 1"에서 모두 가져오기;
커밋;

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

함수 생성 myfunc(refcursor, refcursor)는 SETOF refcursor를 $$로 반환합니다.
시작
    SELECT * FROM table_1에 대해 $1 열기;
    다음 $1를 반환합니다.
    SELECT * FROM table_2를 위해 $2 열기;
    다음 $2를 반환합니다.
끝;
$$ 언어 plpgsql;

-- 와이즈 토토를 사용하려면 트랜잭션에 있어야 합니다.
시작하다;

SELECT * FROM myfunc('a', 'b');

a에서 모두 가져오기;
b에서 모두 가져오기;
커밋;