Postgresql 9.3.25 문서 | ||||
---|---|---|---|---|
스포츠 토토 : 문서 : 9.3 : 스포츠 토토 구조 | Postgre메이저 토토 사이트 : 문서 : 9.3 : PL/PG메이저 | 40 장pl/pgsql - SQL절차 적 언어 | 다음 |
한 번에 전체 쿼리를 실행하는 대신 가능합니다. a 설정토토 베이쿼리를 한 다음 한 번에 몇 행을 쿼리 결과를 읽으십시오. 하나 이를 수행하는 이유는 결과가 발생할 때 메모리 오버런을 피하기 때문입니다. 많은 행이 포함되어 있습니다. (하지만,pl/pgsql사용자는 일반적으로 걱정할 필요가 없습니다 그것에 대해for자동으로 루프 내부적으로 토토 베이를 사용하여 메모리 문제를 피하십시오.) 흥미로운 사용법은 토토 베이에 대한 참조를 반환하는 것입니다. 함수가 생성되어 발신자가 행을 읽을 수 있습니다. 이것 대형 행 세트를 반환하는 효율적인 방법을 제공합니다. 기능.
모든 토토 베이에 대한 모든 액세스pl/pgsql토토 베이 변수를 통과합니다 항상 특수 데이터 유형입니다Refcursor. 토토 베이 변수를 생성하는 한 가지 방법은 단지입니다 유형 변수로 선언하려면Refcursor. 또 다른 방법은 토토 베이 선언을 사용하는 것입니다 구문, 일반적으로 :
이름[[아니요] 스크롤] 토토 베이 [(인수)] for쿼리;
(for로 대체 할 수 있습니다isforOracle호환성.) if스크롤지정되어 있습니다. 토토 베이는 뒤로 스크롤 할 수 있습니다. 만약에스크롤 없음지정되어 있으면 뒤로 페치가 있습니다 거부; 사양이 나타나지 않으면 쿼리 의존적입니다 후진 가져 오기가 허용되는지.인수는 지정된 경우 쉼표로 구분됩니다 쌍 목록이름 DataType이름을 정의합니다 주어진 쿼리의 매개 변수 값으로 대체되었습니다. 실제 값 이 이름을 대체하는 것은 나중에 지정됩니다. 토토 베이가 열렸습니다.
일부 예 :
선언 CURS1 Refcursor; select * from tenk1에 대한 curs2 cursor; select * from tenk1에 대한 curs3 cursor (키 정수).
이 세 가지 변수 모두 데이터 유형이 있습니다Refcursor그러나 첫 번째는 쿼리와 함께 사용할 수 있습니다. 두 번째에는 완전히 지정된 쿼리가 있지만bound그것에, 그리고 마지막에는 매개 변수화 된 쿼리가 있습니다 그것에 묶여 있습니다. (키토토 베이가 열렸을 때의 정수 매개 변수 값.) 변수CURS1Unbound특정에 묶이지 않기 때문에 질문.
토토 베이를 사용하기 전에 행을 검색하기 전에오픈. (이것은 동등한 조치입니다 SQL 명령토토 베이 선언.)pl/pgsql세 가지 형태의Open명령문, 그 중 2 개는 언 바운드를 사용합니다 토토 베이 변수는 바운드 토토 베이 변수를 사용하는 반면
참고 :바운드 토토 베이 변수는 없이도 사용할 수 있습니다 를 통해 토토 베이를 명시 적으로 열어for진술서에 설명 된섹션 40.7.4.
OpenUnbound_cursorvar[[아니오] 스크롤] for쿼리;
토토 베이 변수가 열리고 지정된 쿼리가 제공됩니다. 실행하다. 토토 베이는 이미 열 수 없으며 Unbound Cursor 변수로 선언 됨 (즉, 간단하게Refcursor변수). 쿼리는 여야합니다.select또는 다른 반환 줄 (예 :설명). 쿼리입니다 다른 SQL 명령과 같은 방식으로 처리pl/pgsql: pl/pgsql가변 이름이 대체되었습니다 쿼리 계획은 가능한 재사용을 위해 캐시됩니다. Apl/pgsql변수는 다음으로 대체됩니다 토토 베이 쿼리, 대체 된 값은 의 시간Open; 후속 변경 변수는 토토 베이의 동작에 영향을 미치지 않습니다. 그만큼스크롤및아니오 스크롤옵션은 경계와 동일한 의미를 갖습니다 토토 베이.
예 :
select * from foo where key = mykey;의 curs1을 엽니 다.
Openunbound_cursorvar[[아니오] 스크롤] executequery_string[사용표현[, ... ]];
토토 베이 변수가 열리고 지정된 쿼리가 제공됩니다. 실행하다. 토토 베이는 이미 열 수 없으며 Unbound Cursor 변수로 선언 됨 (즉, 간단하게Refcursor변수). 쿼리가 지정되어 있습니다 문자열 표현으로,와 같은 방식으로execute명령. 평소와 같이 이것은 유연성을 제공합니다 쿼리 계획은 한 번에서 다음 실행마다 다를 수 있습니다 (참조섹션 40.10.2), 그리고 그것은 또한 가변 대체가 아닙니다. 명령 문자열에서 완료되었습니다. 와 마찬가지로execute, 매개 변수 값을 삽입 할 수 있습니다 동적 명령을 통해사용. 그만큼스크롤and스크롤 없음옵션은 바운드 토토 베이와 동일한 의미를 갖습니다.
예 :
execute 'select * from'|| quote_ident (tabname) || '여기서 col1 = $ 1'KeyValue를 사용하여;
이 예에서 테이블 이름은 쿼리에 삽입됩니다.
텍스트로, 사용quote_ident ()
is
SQL 주입을 지키기 위해 권장됩니다. 비교 값
을 위한col1A를 통해 삽입됩니다사용매개 변수이므로 인용 할 필요가 없습니다.
Openbound_cursorvar[([ argument_name: =]argument_value[, ...])];
이 형태의Opena 쿼리가 선언되었을 때 쿼리가 묶인 토토 베이 변수. 토토 베이는 이미 열 수 없습니다. 실제 인수 값 목록 토토 베이가 선언 된 경우에만 표현이 나타나야합니다. 논쟁을 취하십시오. 이 값은 쿼리에서 대체됩니다.
바운드 토토 베이에 대한 쿼리 계획은 항상 고려됩니다. 캐시 가능; 에 해당하지 않습니다.execute이 경우. 주석스크롤and스크롤 없음할 수 없습니다 에 지정Open, 토토 베이로 스크롤 행동은 이미 결정되었습니다.
인수 값은 하나를 사용하여 전달 될 수 있습니다위치또는이름표기법. 위치 표기법에서는 모든 인수가 지정됩니다 주문하다. 명명 된 표기법에서 각 인수의 이름은를 사용하여 지정됩니다.: =인수와 분리하려면 표현. 에 설명 된 함수 호출과 유사합니다섹션 4.3, 또한 허용됩니다 위치와 명명 된 표기법을 혼합하려면
예제 (위의 토토 베이 선언 예제를 사용) :
Open Curs2; 열린 curs3 (42); CURS3 열기 (키 : = 42);
가변 대체는 바운드 토토 베이의 쿼리에서 수행되므로 토토 베이에 값을 전달하는 두 가지 방법이 있습니다. 명백한 주장으로Open, 또는 암시 적으로 apl/pgsql쿼리의 변수. 그러나만 바운드 토토 베이가 선언되기 전에 선언 된 변수는 그것으로 대체되었습니다. 두 경우 모두 통과 할 값은 다음과 같습니다 당시 결정Open. 을 위한 예를 들어, 또 다른 방법은와 같은 효과를 얻는 방법CURS3위의 예는
선언 키 정수; select * from tenk1에 대한 curs4 cursor where ightorian1 = key; 시작하다 키 : = 42; 오픈 커스 4;
토토 베이가 열리면 여기에 설명 된 진술.
이러한 조작은 같은 기능으로 발생할 필요가 없습니다. 토토 베이를 열었습니다. 당신은 a를 반환 할 수 있습니다.Refcursor함수에서 값을 벗어나 발신자를 보자 토토 베이에서 작동합니다. (내부적으로 ARefcursor값은 단순히 a의 문자열 이름입니다 토토 베이의 활성 쿼리가 포함 된 소위 포털. 이것 이름을 전달하고 다른 사람에게 할당 할 수 있습니다Refcursor변수 등을 방해하지 않고 문.)
모든 포털은 트랜잭션 종료시 암시 적으로 닫힙니다. 그러므로 에이Refcursor값은 참조 할 수 있습니다 거래가 끝날 때까지 Cursor를 엽니 다.
페치 [ 방향from | 안에]토토 베이in대상;
fetch다음 행을 검색합니다 행 변수 일 수있는 대상으로의 토토 베이, 레코드 변수 또는 쉼표로 구분 된 간단한 변수 목록선택. 다음 행이 없으면 대상은 NULL로 설정됩니다. 와 마찬가지로선택 안으로, 특별 변수발견can 행이 획득되었는지 여부를 확인하십시오.
the방향절은 그럴 수 있습니다 SQL에서 허용되는 변형 중fetch가져올 수있는 것을 제외한 명령 둘 이상의 행; 즉,다음, Prior, 첫 번째, Last, 절대 count, 상대 count, Forward또는뒤로. 생략방향지정과 동일합니다다음. a를 사용하여 형식으로count, Thecount는 정수 값 표현 일 수 있습니다 (SQL과 달리fetch명령 만 정수가 일정하게 허용).방향뒤로 이동 해야하는 값 토토 베이가 선언되거나 열리지 않으면 실패 할 가능성이 있습니다. 그만큼스크롤옵션.
토토 베이A의 이름이어야합니다Refcursor개방형을 참조하는 변수 토토 베이 포털.
예 :
curs1을 Rowvar로 가져옵니다. curs2를 foo, bar, baz로 가져옵니다. Curs3에서 x, y로 마지막으로 가져 오십시오. CURS4에서 X 로의 상대적 -2를 가져옵니다.
이동 [ 방향From | 안에]토토 베이;
움직임없이 토토 베이를 재배치합니다 데이터 검색.움직임정확히 작동합니다 처럼fetch명령 만 제외하고 토토 베이를 재배치하고 행을 이동하지 않습니다. 처럼 와 함께선택, 특별 변수발견거기에 있는지 확인할 수 있습니다 다음으로 이동하는 행이었습니다.
예 :
Move Curs1; CURS3에서 마지막으로 이동; CURS4에서 상대적 -2를 이동; Curs4에서 2를 앞으로 이동;
업데이트테이블SET ... 현재의 전류토토 베이;테이블전류의 위치토토 베이;
토토 베이가 테이블 행에 위치하면 해당 행이 될 수 있습니다. 토토 베이를 사용하여 업데이트 또는 삭제하여 행을 식별합니다. 거기 있습니다 토토 베이의 쿼리가 무엇인지에 대한 제한 (특히, 그룹화) 그리고 사용하는 것이 가장 좋습니다업데이트토토 베이에서. 자세한 내용은를 참조하십시오.선언참조 페이지.
예 :
업데이트 foo set dataval = myval where curs1;
닫기토토 베이;
닫기기본 포털을 닫습니다 토토 베이를 엽니 다. 이것은 끝보다 일찍 자원을 해제하는 데 사용될 수 있습니다. 트랜잭션의 또는 토토 베이 변수를 열어야합니다. 다시.
예 :
Close Curs1;
pl/pgsql함수는 반환 할 수 있습니다 발신자에게 토토 베이. 이것은 여러 행을 반환하는 데 유용합니다 열, 특히 매우 큰 결과 세트가있는 열. 이를 위해 함수는 토토 베이를 열고 토토 베이 이름을 발신자에게 반환합니다. (또는 단순히 OR이 지정한 포털 이름을 사용하여 토토 베이를 엽니 다. 그렇지 않으면 발신자에게 알려져 있습니다). 그런 다음 발신자는 행을 가져올 수 있습니다 토토 베이. 토토 베이는 발신자가 닫을 수 있습니다. 트랜잭션이 닫히면 자동으로 닫혔습니다.
토토 베이에 사용되는 포털 이름은 프로그래머 또는 자동 생성. 포털 이름을 지정하려면 에 문자열을 할당하기 만하면Refcursor열기 전에 변수. 의 문자열 값Refcursor변수는 사용합니다.Open기본 포털의 이름으로. 하지만, 인 경우Refcursor변수는 null,Open그렇지 않은 이름을 자동으로 생성합니다 기존 포털과 충돌하여에 할당합니다.Refcursor변수.
참고 :바운드 토토 베이 변수가 초기화됩니다 문자열 값은 이름을 나타내므로 포털 이름이 프로그래머가 무시하지 않는 한 토토 베이 변수 이름과 동일합니다. 토토 베이를 열기 전에 과제에 의해. 그러나 결합되지 않은 토토 베이 처음에는 null 값에 대한 변수 기본값이므로 재정의하지 않는 한 자동으로 생성 된 고유 한 이름.
다음 예제는 토토 베이 이름이 될 수있는 한 가지 방법을 보여줍니다. 발신자가 제공 :
테이블 테스트 생성 (col 텍스트); 테스트 값에 삽입 ( '123'); 기능 reffunc (refcursor) 생성 refcursor를 다시 반환합니다. 시작하다 Test에서 COL SELECT COL에 대해 $ 1을 엽니 다; $ 1의 반환; 끝; '언어 plpgsql; 시작하다; Reffunc ( 'funccursor')을 선택하십시오. funccursor에서 모두 가져 오십시오. 저지르다;
다음 예제는 자동 토토 베이 이름 생성을 사용합니다 :
함수 만들기 reffunc2 () refcursor를 반환합니다. 선언하다 refcursor; 시작하다 테스트에서 COL SELECT COL에 대한 공개 심판; 반환 심판; 끝; '언어 plpgsql; - 토토 베이를 사용하려면 거래에 있어야합니다. 시작하다; 선택 reffunc2 (); Reffunc2 ------------------- <이름이없는 토토 베이 1 (1 줄) "<이름없는 토토 베이 1"에서 모두 가져 오십시오. 저지르다;
다음 예제는 여러 토토 베이를 반환하는 한 가지 방법을 보여줍니다. 단일 기능에서 :
함수 생성 myfunc (refcursor, refcursor)는 refcursor를 $$로 반환합니다 시작하다 table_1에서 선택 *에 대해 $ 1을 엽니 다; 다음 $ 1; table_2에서 select *에 대해 $ 2를 엽니 다; 다음 $ 2를 반환합니다. 끝; $$ 언어 plpgsql; - 토토 베이를 사용하려면 거래에 있어야합니다. 시작하다; myfunc ( 'a', 'b')에서 *를 선택하십시오. a에서 모두 가져 오십시오. b에서 모두 가져 오십시오. 저지르다;
의 변형이 있습니다for진술 토토 베이에 의해 반환 된 행을 통해 반복 할 수 있습니다. 그만큼 구문은 :
[ <<레이블 ] 을 위한RecordVarinbound_cursorvar[([ argument_name: =]argument_value[, ...])] loop진술엔드 루프 [ 레이블 ];
토토 베이 변수가 일부 쿼리에 바인딩되었을 것입니다. 선언되었고할 수 없음이미 열려 있습니다. 그만큼for명령문이 자동으로 엽니 다 토토 베이, 루프가 종료 될 때 토토 베이를 다시 닫습니다. 목록 실제 인수 값 표현의 표현은 토토 베이는 논쟁을 선언했다. 이 값이 될 것입니다 쿼리에서 대체 된 것과 같은 방식으로Open(참조섹션 40.7.2.3).
변수RecordVarIS 자동으로 유형으로 정의레코드및 루프 내부에만 존재합니다 (기존의 기존 정의 변수 이름은 루프 내에서 무시됩니다). 각 행은 토토 베이는이 레코드 변수와 루프 바디가 실행됩니다.