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

39.7. 사설 토토 사이트

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

39.7.1. 사설 토토 사이트 선언 변수

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

이름 [ [아니요] 스크롤] 사설 토토 사이트 [ ( 인수 ) ] FOR질의;

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

일부 예:

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

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

39.7.2. 사설 토토 사이트 열기

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

참고:바운드 사설 토토 사이트 변수도 사용할 수 있습니다 명시적으로 사설 토토 사이트를 열지 않고,for설명된 문섹션 39.7.4.

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

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

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

예:

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

39.7.2.2. 실행 가능

열기unbound_cursorvar [ [아니요] 스크롤] 실행용query_string
                                     [사용 중표현 [, ... ] ];

사설 토토 사이트 변수가 열리고 지정된 값이 제공됩니다. 실행할 쿼리입니다. 사설 토토 사이트는 이미 열 수 없으며 바인딩되지 않은 사설 토토 사이트 변수로 선언되어야 합니다(즉, 간단하게 말하면반환자변수). 쿼리는 문자열 표현식으로 지정됩니다. 에서와 같은 방식으로실행명령. 다음과 같이 일반적으로 이는 유연성을 제공하므로 쿼리 계획은 다음과 같이 달라질 수 있습니다. 하나는 다음으로 실행됩니다(참조섹션 39.10.2), 이는 또한 변수 대체가 명령 문자열에서는 수행되지 않았습니다. 마찬가지로실행, 매개변수 값을 삽입할 수 있습니다. 동적 명령을 통해사용 중.스크롤그리고아니요 스크롤옵션은 경계와 동일한 의미를 갖습니다. 사설 토토 사이트.

예:

'SELECT * FROM' 실행을 위해 curs1 열기 || quote_ident(탭 이름) 
                                        || ' WHERE col1 = $1' 키값을 사용함;

이 예에서는 테이블 이름이 쿼리에 삽입됩니다 텍스트적으로는 다음을 사용합니다.quote_ident()경비에 권장됩니다 SQL 주입에 반대합니다. 에 대한 비교 값col1a를 통해 삽입됨사용 중매개변수이므로 인용할 필요가 없습니다.

39.7.2.3. 바운드 사설 토토 사이트 열기

열기bound_cursorvar [ ( argument_values ) ];

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

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

예:

OPEN curs2;
OPEN curs3(42);

39.7.3. 사설 토토 사이트 사용

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

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

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

39.7.3.1. 가져오기

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

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

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

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

예:

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

39.7.3.2. 이동

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

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

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

예:

MOVE 사설 토토 사이트1;
curs3에서 마지막으로 이동;
curs4에서 상대 -2를 이동합니다.
curs4에서 앞으로 2로 이동;

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

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

사설 토토 사이트가 테이블 행에 위치하면 해당 행은 다음을 수행할 수 있습니다. 사설 토토 사이트를 사용하여 행을 식별하여 업데이트하거나 삭제할 수 있습니다. 사설 토토 사이트의 쿼리가 무엇인지에 대한 제한이 있습니다( 특히, 그룹화 없음)을 사용하는 것이 가장 좋습니다업데이트용사설 토토 사이트에. 자세한 내용은 참조하세요PostgreSQL : 문서 : 9.0 : 토토 꽁 머니참조 페이지.

예:

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

39.7.3.4. 닫기

닫기사설 토토 사이트;

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

예:

CLOSE curs1;

39.7.3.5. 사설 토토 사이트 반환

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

사설 토토 사이트에 사용되는 포털 이름은 다음으로 지정할 수 있습니다. 프로그래머 또는 자동으로 생성됩니다. 포털을 지정하려면 이름을 지정하려면 간단히에 문자열을 할당하면 됩니다.반환자27606_27667반환자변수는 에서 사용됨열기이름으로 기본 포털. 그러나 만약에반환자변수가 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에서 모두 가져오기;
커밋;

39.7.4. 사설 토토 사이트를 통한 반복 결과

다음의 변형이 있습니다.for에 의해 반환된 행을 반복할 수 있는 문 사설 토토 사이트. 구문은 다음과 같습니다.

[ <<라벨 ]
에 대한recordvarINbound_cursorvar [ ( argument_values ) ] 루프문장END 루프 [ 라벨 ];

사설 토토 사이트 변수는 다음과 같은 쿼리에 바인딩되어 있어야 합니다. 선언되었고, 그것은할 수 없습니다이미 열려있습니다.for문이 자동으로 열립니다. 사설 토토 사이트를 반환하고 루프가 종료되면 사설 토토 사이트를 다시 닫습니다. 에이 실제 인수 값 표현식 목록은 다음과 같은 경우에 나타나야 합니다. 사설 토토 사이트가 인수를 취하도록 선언된 경우에만 가능합니다. 이러한 값 다음과 같은 방식으로 쿼리에서 대체됩니다. 동안열기. 변수recordvar자동으로 유형으로 정의됨기록그리고 존재합니다 루프 내부(변수 이름의 기존 정의 루프 내에서는 무시됩니다). 사설 토토 사이트가 반환한 각 행은 다음과 같습니다. 이 레코드 변수와 루프 본문에 연속적으로 할당됩니다. 실행됩니다.