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