전체 쿼리를 한 번에 실행하는 대신 다음을 설정할 수 있습니다.토토 핫쿼리를 캡슐화한 다음 쿼리 결과를 한 번에 몇 행씩 읽습니다. 이렇게 하는 한 가지 이유는 결과에 많은 수의 행이 포함되어 있을 때 메모리 오버런을 방지하기 위해서입니다. (단,PL/pgSQL사용자는 일반적으로 그것에 대해 걱정할 필요가 없습니다. 왜냐하면for루프는 메모리 문제를 피하기 위해 자동으로 내부적으로 토토 핫를 사용합니다.) 더 흥미로운 사용법은 함수가 생성한 토토 핫에 대한 참조를 반환하여 호출자가 행을 읽을 수 있도록 하는 것입니다. 이는 함수에서 큰 행 집합을 반환하는 효율적인 방법을 제공합니다.
다음 토토 핫에 대한 모든 접근PL/pgSQL항상 특수 데이터 유형인 토토 핫 변수를 통과합니다.반환자. 토토 핫 변수를 생성하는 한 가지 방법은 해당 변수를 유형의 변수로 선언하는 것입니다.반환자. 또 다른 방법은 토토 핫 선언 구문을 사용하는 것입니다. 일반적으로 다음과 같습니다.
이름[ [아니요] 스크롤] 토토 핫 [ (인수) ] FOR질의;
(for다음으로 대체 가능ISfor오라클호환성.) 만약스크롤이 지정되면 토토 핫는 뒤로 스크롤할 수 있습니다. 만일스크롤 없음이 지정되면 역방향 가져오기가 거부됩니다. 두 사양이 모두 나타나지 않으면 역방향 가져오기가 허용되는지 여부는 쿼리에 따라 다릅니다.인수(지정된 경우)은 쉼표로 구분된 쌍 목록입니다.주어진 쿼리에서 매개변수 값으로 대체될 이름을 정의합니다. 이러한 이름을 대체할 실제 값은 나중에 토토 핫가 열릴 때 지정됩니다.이름 데이터 유형
일부 예:
선언하다
curs1 재귀사자;
curs2 선택을 위한 토토 핫 * tenk1에서;
curs3 CURSOR(키 정수) FOR SELECT * FROM tenk1 WHERE Unique1 = 키;
이 세 변수는 모두 데이터 유형을 갖습니다.반환자, 그러나 첫 번째는 모든 쿼리에 사용할 수 있지만 두 번째는 이미 완전히 지정된 쿼리를 가지고 있습니다.바운드그리고 마지막에는 매개변수화된 쿼리가 바인딩되어 있습니다. (키토토 핫가 열리면 정수 매개변수 값으로 대체됩니다.) 변수curs1그렇다고 합니다언바운드특정 쿼리에 바인딩되지 않기 때문입니다.
토토 핫를 사용하여 행을 검색하려면 먼저 토토 핫를 사용해야 합니다.열림. (이것은 SQL 명령과 동일한 작업입니다.토토 핫 선언.) PL/pgSQL세 가지 형태의가 있습니다.열기문 중 두 개는 바인딩되지 않은 토토 핫 변수를 사용하고 세 번째는 바인딩된 토토 핫 변수를 사용합니다.
바운드 토토 핫 변수는 명시적으로 토토 핫를 열지 않고도 다음을 통해 사용할 수 있습니다.for설명된 문섹션 42.7.4.
다음을 위해 열려 있음 질의열기unbound_cursorvar[ [아니요] 스크롤] FOR질의;
토토 핫 변수가 열리고 실행할 지정된 쿼리가 제공됩니다. 토토 핫는 이미 열려 있을 수 없으며 바인딩되지 않은 토토 핫 변수(즉, 간단한반환자변수). 쿼리는 다음과 같아야 합니다.선택또는 행을 반환하는 다른 것(예:설명). 쿼리는 다른 SQL 명령과 동일한 방식으로 처리됩니다.PL/pgSQL: PL/pgSQL변수 이름이 대체되고 재사용이 가능하도록 쿼리 계획이 캐시됩니다. 때PL/pgSQL변수가 토토 핫 쿼리로 대체되고 대체된 값은 해당 시점의 값입니다.열기; 이후에 변수를 변경해도 토토 핫의 동작에는 영향을 주지 않습니다.스크롤그리고스크롤 없음옵션은 바인딩된 토토 핫와 동일한 의미를 갖습니다.
예:
선택을 위해 curs1 열기 * FROM foo WHERE 키 = mykey;
실행 가능열기unbound_cursorvar[ [아니요] 스크롤] 실행용query_string[사용 중표현[, ... ] ];
토토 핫 변수가 열리고 실행할 지정된 쿼리가 제공됩니다. 토토 핫는 이미 열려 있을 수 없으며 바인딩되지 않은 토토 핫 변수(즉, 간단한반환자변수). 쿼리는와 같은 방식으로 문자열 표현식으로 지정됩니다.실행명령. 평소와 같이 이는 유연성을 제공하므로 실행마다 쿼리 계획이 달라질 수 있습니다(참조섹션 42.10.2), 이는 또한 명령 문자열에서 변수 대체가 수행되지 않음을 의미합니다. 마찬가지로실행, 매개변수 값은 다음을 통해 동적 명령에 삽입될 수 있습니다.형식()그리고사용 중.스크롤그리고스크롤 없음옵션은 바인딩된 토토 핫와 동일한 의미를 갖습니다.
예:
실행을 위해 curs1 열기 형식('SELECT * FROM %I WHERE col1 = $1',tabname) 키값을 사용함;
이 예에서는 테이블 이름이 다음을 통해 쿼리에 삽입됩니다.형식(). 에 대한 비교 값col1a를 통해 삽입됨사용 중매개변수이므로 인용할 필요가 없습니다.
열기bound_cursorvar[ ( [argument_name:= ]인수_값[, ...] ) ];
이 형태는열기은 선언 시 쿼리가 바인딩된 토토 핫 변수를 여는 데 사용됩니다. 토토 핫는 이미 열려 있을 수 없습니다. 실제 인수 값 표현식 목록은 토토 핫가 인수를 사용하도록 선언된 경우에만 나타나야 합니다. 이 값은 쿼리에서 대체됩니다.
바운드 토토 핫에 대한 쿼리 계획은 항상 캐시 가능한 것으로 간주됩니다. 해당하는 것은 없습니다실행이 경우에는. 참고하세요스크롤그리고스크롤 없음다음에 지정할 수 없습니다.열기, 토토 핫의 스크롤 동작이 이미 결정되었기 때문입니다.
인수 값은 다음 중 하나를 사용하여 전달될 수 있습니다.위치또는이름이표기법. 위치 표기법에서는 모든 인수가 순서대로 지정됩니다. 명명된 표기법에서 각 인수의 이름은 다음을 사용하여 지정됩니다.:=인수 표현식과 분리합니다. 다음에 설명된 함수 호출과 유사합니다.PostgreSQL : 문서 : 10 : 4.3. 롤 토토 호출, 위치 표기법과 명명 표기법을 혼합하는 것도 허용됩니다.
예(위의 토토 핫 선언 예를 사용함):
OPEN curs2; OPEN curs3(42); OPEN curs3(key := 42);
바인딩된 토토 핫의 쿼리에서 변수 대체가 이루어지기 때문에 토토 핫에 값을 전달하는 방법에는 실제로 두 가지 방법이 있습니다. 하나는 명시적 인수를 사용하는 것입니다.열기또는 암시적으로 a를 참조하여PL/pgSQL쿼리의 변수입니다. 그러나 바인딩된 토토 핫가 선언되기 전에 선언된 변수만 해당 토토 핫로 대체됩니다. 두 경우 모두 전달될 값은열기. 예를 들어, 다음과 같은 효과를 얻는 또 다른 방법은curs3위의 예는
선언하다
키 정수;
curs4 선택을 위한 토토 핫 * tenk1에서 고유1 = 키;
시작
키 := 42;
OPEN curs4;토토 핫가 열리면 여기에 설명된 명령문으로 토토 핫를 조작할 수 있습니다.
이러한 조작은 시작하기 위해 토토 핫를 연 동일한 함수에서 발생할 필요가 없습니다. 다음을 반환할 수 있습니다.반환자함수에서 값을 꺼내고 호출자가 토토 핫에서 작업하도록 합니다. (내부적으로, a반환자값은 단순히 토토 핫에 대한 활성 쿼리가 포함된 소위 포털의 문자열 이름입니다. 이 이름은 다른 사람에게 전달되거나 할당될 수 있습니다.반환자포털을 방해하지 않고 변수 등을 처리합니다.)
모든 포털은 트랜잭션 종료 시 암시적으로 닫힙니다. 그러므로 a반환자값은 트랜잭션이 끝날 때까지만 열린 토토 핫를 참조하는 데 사용할 수 있습니다.
가져오기가져오기 [방향보낸 사람 | 안으로]토토 핫INTO대상;
가져오기다음 행을 토토 핫에서 대상으로 검색합니다. 이는 행 변수, 레코드 변수 또는 쉼표로 구분된 단순 변수 목록일 수 있습니다.선택. 다음 행이 없으면 대상은 NULL로 설정됩니다. 마찬가지로선택, 특수 변수발견행을 얻었는지 여부를 확인할 수 있습니다.
그방향절은 SQL에서 허용되는 모든 변형이 될 수 있습니다.가져오기두 개 이상의 행을 가져올 수 있는 명령을 제외한 명령; 즉, 그럴 수 있습니다다음, 이전, 첫 번째, 마지막, 절대 개수, 상대적 개수, 앞으로또는뒤로. 생략방향지정과 동일다음. a를 사용하는 양식에서개수, 그개수모든 정수 값 표현식이 될 수 있습니다(SQL과 달리가져오기정수 상수만 허용하는 명령).방향뒤로 이동해야 하는 값은 토토 핫가 선언되거나 열리지 않으면 실패할 가능성이 높습니다.스크롤옵션.
토토 핫다음의 이름이어야 합니다반환자열린 토토 핫 포털을 참조하는 변수입니다.
예:
FETCH curs1 INTO rowvar; curs2를 foo, bar, baz로 가져옵니다. curs3에서 마지막으로 x, y로 가져옵니다. curs4에서 x로 상대 -2를 가져옵니다.
이동이동 [방향보낸 사람 | 안으로]토토 핫;
이동데이터를 검색하지 않고 토토 핫의 위치를 변경합니다.이동정확히 다음과 같이 작동합니다가져오기명령. 단, 토토 핫 위치만 변경하고 이동된 행은 반환하지 않습니다. 마찬가지로선택, 특수변수발견이동할 다음 행이 있는지 확인할 수 있습니다.
예:
MOVE 토토 핫1; curs3에서 마지막으로 이동; curs4에서 상대 -2를 이동합니다. curs4에서 앞으로 2로 이동;
현재 위치 업데이트/삭제업데이트테이블설정 ... 현재 위치토토 핫; 다음에서 삭제:테이블현재 위치토토 핫;
토토 핫가 테이블 행에 위치하면 토토 핫를 사용하여 행을 식별하여 해당 행을 업데이트하거나 삭제할 수 있습니다. 토토 핫의 쿼리가 무엇인지에 대한 제한이 있으며(특히 그룹화 없음) 사용하는 것이 가장 좋습니다.업데이트용토토 핫에. 자세한 내용은 다음을 참조하세요.선언참조 페이지.
예:
Foo SET dataval 업데이트 = myval 현재 curs1의 위치;
닫기닫기토토 핫;
닫기열린 토토 핫 아래에 있는 포털을 닫습니다. 이는 트랜잭션이 끝나기 전에 리소스를 해제하거나 토토 핫 변수를 해제하여 다시 열 때 사용할 수 있습니다.
예:
CLOSE curs1;
PL/pgSQL함수는 호출자에게 토토 핫를 반환할 수 있습니다. 이는 특히 매우 큰 결과 집합의 경우 여러 행이나 열을 반환하는 데 유용합니다. 이를 수행하기 위해 함수는 토토 핫를 열고 토토 핫 이름을 호출자에게 반환합니다(또는 단순히 호출자가 지정하거나 호출자에게 알려진 포털 이름을 사용하여 토토 핫를 엽니다). 그러면 호출자는 토토 핫에서 행을 가져올 수 있습니다. 토토 핫는 호출자가 닫을 수 있으며, 트랜잭션이 닫힐 때 자동으로 닫힙니다.
토토 핫에 사용되는 포털 이름은 프로그래머가 지정하거나 자동으로 생성될 수 있습니다. 포털 이름을 지정하려면 간단히반환자28313_28368반환자변수는 다음에 의해 사용됩니다열기기본 포털의 이름입니다. 그러나 만약에반환자변수가 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에서 모두 가져오기;
커밋;다음의 변형이 있습니다.for토토 핫가 반환한 행을 반복할 수 있는 문입니다. 구문은 다음과 같습니다.
[ <<라벨] 에 대한recordvarINbound_cursorvar[ ( [argument_name:= ]인수_값[, ...] ) ] 루프문장END 루프 [라벨];
토토 핫 변수는 선언될 때 일부 쿼리에 바인딩되어 있어야 합니다.할 수 없습니다이미 열려있습니다.for문은 자동으로 토토 핫를 열고 루프가 종료되면 토토 핫를 다시 닫습니다. 실제 인수 값 표현식 목록은 토토 핫가 인수를 사용하도록 선언된 경우에만 나타나야 합니다. 이 값은 쿼리에서와 동일한 방식으로 대체됩니다.열기(참조섹션 42.7.2.3).
변수recordvar자동으로 유형으로 정의됩니다.기록그리고 루프 내부에만 존재합니다(변수 이름의 기존 정의는 루프 내에서 무시됩니다). 토토 핫에 의해 반환된 각 행은 이 레코드 변수에 연속적으로 할당되고 루프 본문이 실행됩니다.