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

39.7. 스포츠 토토 결과

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

39.7.1. 스포츠 토토 결과 선언 변수

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

이름 [ [아니요] 스크롤] 스포츠 토토 결과 [ ( 인수 ) ] FOR질의;

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

일부 예:

선언하다
    curs1 재귀사자;
    curs2 선택을 위한 스포츠 토토 결과 * tenk1에서;
    curs3 CURSOR(키 정수) FOR 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_value [, ...] ) ];

이 형태는열기여는 데 사용됩니다. 쿼리가 바인딩된 스포츠 토토 결과 변수 선언했다. 스포츠 토토 결과는 이미 열려 있을 수 없습니다. 실제 목록 인수 값 표현식은 다음과 같은 경우에만 나타나야 합니다. 스포츠 토토 결과가 인수를 취하도록 선언되었습니다. 이러한 값은 쿼리로 대체되었습니다.

바인딩된 스포츠 토토 결과에 대한 쿼리 계획은 항상 고려됩니다. 캐시 가능; 해당하는 것은 없습니다실행이 경우에는. 참고하세요스크롤그리고스크롤 없음다음에 지정할 수 없습니다.열기, 스포츠 토토 결과의 스크롤 동작이 이미 결정되었습니다.

인수 값은 다음 중 하나를 사용하여 전달될 수 있습니다.위치또는이름이표기법. 위치 표기법에서는 모든 인수가 지정됩니다. 순서대로. 명명된 표기법에서 각 인수의 이름은 다음과 같습니다. 다음을 사용하여 지정됨:=분리하다 인수 표현식에서. 함수 호출과 유사합니다. 설명됨PostgreSQL :, 위치와 이름을 함께 사용할 수도 있습니다. 표기법.

예(이것은 스포츠 토토 결과 선언 예를 사용함) 위):

OPEN curs2;
OPEN curs3(42);
OPEN curs3(key := 42);

바인딩된 스포츠 토토 결과에서 변수 대체가 수행되었기 때문입니다. 쿼리에 값을 전달하는 방법에는 실제로 두 가지가 있습니다. 스포츠 토토 결과: 명시적인 인수를 사용하거나열기또는 암시적으로 a를 참조하여PL/pgSQL변수 쿼리. 단, 바인딩 이전에 선언된 변수만 스포츠 토토 결과가 선언되어 스포츠 토토 결과로 대체됩니다. 어느 쪽이든 전달될 값이 다음 시점에 결정되는 경우열기. 예를 들어, 또 다른 방법은 와 같은 효과를 얻습니다.curs3위의 예는

선언하다
    키 정수;
    curs4 선택을 위한 스포츠 토토 결과 * tenk1에서 고유1 = 키;
시작
    키 := 42;
    OPEN curs4;

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

업데이트테이블설정 ... 현재 위치스포츠 토토 결과;
다음에서 삭제:테이블현재 위치스포츠 토토 결과;

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

예:

UPDATE foo SET dataval = myval 현재 현재 curs1;

39.7.3.4. 닫기

닫기스포츠 토토 결과;

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

예:

CLOSE curs1;

39.7.3.5. 스포츠 토토 결과 반환

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

스포츠 토토 결과에 사용되는 포털 이름은 다음으로 지정할 수 있습니다. 프로그래머 또는 자동으로 생성됩니다. 포털을 지정하려면 이름을 지정하려면 간단히에 문자열을 할당하면 됩니다.반환자28710_28771반환자변수는 다음과 같습니다 에서 사용됨열기이름으로 기본 포털. 그러나 만약에반환자변수가 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_name := ] argument_value [, ...] ) ] 루프문장END 루프 [ 라벨 ];

스포츠 토토 결과 변수는 다음과 같은 쿼리에 바인딩되어 있어야 합니다. 선언되었고, 그것은할 수 없습니다이미 열려있습니다.for문이 자동으로 열립니다. 스포츠 토토 결과를 반환하고 루프가 종료되면 스포츠 토토 결과를 다시 닫습니다. 에이 실제 인수 값 표현식 목록은 다음과 같은 경우에 나타나야 합니다. 스포츠 토토 결과가 인수를 취하도록 선언된 경우에만 가능합니다. 이러한 값 다음과 같은 방식으로 쿼리에서 대체됩니다. 동안열기(참조섹션 39.7.2.3).

변수recordvar이다 자동으로 유형으로 정의됨기록그리고 루프 내부에만 존재합니다(기존 정의 루프 내에서는 변수 이름이 무시됩니다. 반환된 각 행 스포츠 토토 결과는 이 레코드 변수에 연속적으로 할당되고 루프 본문이 실행됩니다.