이 문서는 지원되지 않는 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세 가지 형태의열기문 중 두 개는 다음을 사용합니다. 바인딩되지 않은 커서 변수는 바인딩된 커서를 사용하는 반면 세 번째 변수는 바인딩된 커서를 사용합니다. 토토 사이트.

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

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

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

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

예:

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

38.7.2.2. 실행 가능

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

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

예:

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

38.7.2.3. 바운드 커서 열기

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

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

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

예:

OPEN curs2;
OPEN curs3(42);

38.7.3. 커서 사용

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

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

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

38.7.3.1. 가져오기

가져오기 [ 방향보낸 사람 | 안으로] 커서INTO대상;

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

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

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

예:

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

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

커서가 테이블 행에 위치하면 해당 행은 다음을 수행할 수 있습니다. 커서를 사용하여 행을 식별하여 업데이트하거나 삭제할 수 있습니다. 커서의 쿼리가 무엇인지에 대한 제한이 있습니다( 특히, 그룹화 없음)을 사용하는 것이 가장 좋습니다업데이트용커서에. 추가로 정보는 참조선언참조 페이지.

예:

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

38.7.3.4. 닫기

닫기커서;

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

예:

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

38.7.4. 커서를 통한 반복 결과

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

[ <<라벨 ]
에 대한recordvarINbound_cursorvar [ ( 인수_값 ) ] 루프문장END 루프 [ 라벨 ];

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