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

35.8. 토토 사이트

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

35.8.1. 토토 사이트 선언 변수

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

이름토토 사이트 [ ( 인수 ) ] FOR질의 ;

(for다음으로 대체될 수 있음ISfor오라클호환성.)인수, 만약 지정됨, 쉼표로 구분된 쌍 목록입니다.이름 데이터 유형이름을 정의하는 것은 해당 쿼리의 매개변수 값으로 대체됩니다. 실제 이 이름을 대체할 값은 나중에 지정됩니다. 토토 사이트가 열릴 때.

일부 예:

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

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

35.8.2. 토토 사이트 열기

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

35.8.2.1. 선택할 수 있음

열기unbound_cursor선택을 위해 ...;

토토 사이트 변수가 열리고 지정된 값이 제공됩니다. 실행할 쿼리입니다. 토토 사이트는 이미 열 수 없으며 바인딩되지 않은 토토 사이트로 선언되어야 합니다(즉, 간단하다리토토 사이트변수).선택쿼리는 동일하게 처리됩니다. 다른 방식으로선택PL/pgSQL: PL/pgSQL변수 이름이 대체되었습니다. 재사용이 가능하도록 쿼리 계획이 캐시됩니다.

예:

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

35.8.2.2. 실행 가능

열기unbound_cursor실행용query_string;

토토 사이트 변수가 열리고 지정된 값이 제공됩니다. 실행할 쿼리입니다. 토토 사이트는 이미 열 수 없으며 바인딩되지 않은 토토 사이트로 선언되어야 합니다(즉, 간단하다리토토 사이트변수). 쿼리 와 같은 방식으로 문자열 표현식으로 지정됩니다.실행명령. 평소에도 이 쿼리가 한 번 실행될 때마다 달라질 수 있도록 유연성을 제공합니다. 다음.

예:

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

35.8.2.3. 바운드 토토 사이트 열기

열기bound_cursor [ ( 인수_값 ) ];

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

예:

OPEN curs2;
OPEN curs3(42);

35.8.3. 토토 사이트 사용

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

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

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

35.8.3.1. 가져오기

가져오기토토 사이트INTO대상;

가져오기에서 다음 행을 검색합니다. 행 변수일 수 있는 대상으로 토토 사이트를 이동합니다. 레코드 변수 또는 쉼표로 구분된 단순 목록 변수, 마찬가지로선택. 다음과 같이 와 함께선택, 특집 변수발견확인하여 확인할 수 있습니다. 행을 얻었는지 여부.

예:

curs1 INTO rowvar 가져오기;
curs2를 foo, bar, baz로 가져옵니다.

35.8.3.2. 닫기

닫기토토 사이트;

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

예:

CLOSE curs1;

35.8.3.3. 토토 사이트 반환

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에서 모두 가져오기;
커밋;