무지개 토토 구조는 아마도 가장 유용 할 것입니다 (및 중요)의 일부pl/pgsql. 와 함께pl/pgsql의 무지개 토토 구조, 당신은 조작 할 수 있습니다무지개 토토매우 유연한 데이터 강력한 방법.
return표현;
표현식이있는 반환은 a에서 돌아 오는 데 사용됩니다.pl/pgsql그 기능 세트를 반환하지 마십시오. 함수가 종료되고표현로 반환됩니다 방문객.
복합재 (행) 값을 반환하려면 레코드를 작성해야합니다. 또는 행 변수로표현. 스칼라 유형을 반환 할 때 모든 표현식을 사용할 수 있습니다. 표현의 결과는 될 것입니다 설명대로 기능의 반환 유형에 자동으로 캐스팅됩니다 과제. (반환 할 기능을 선언 한 경우void, 그런 다음 표현을 생략 할 수 있습니다. 어쨌든 무시할 것입니다.)
함수의 리턴 값은 정의되지 않은 상태로 남겨질 수 없습니다. 만약에 무지개 토토는 함수의 최상위 블록의 끝에 도달합니다. 리턴 명령문에 도달하지 않고 런타임 오류가 발생합니다 발생하다.
언제pl/pgsql함수는입니다 반환으로 선언setof 약간의 Theype, 다음 절차는 IS입니다 약간 다릅니다. 이 경우 개별 항목은 반환은 다음 명령에 반환 된 다음 최종입니다. 인수가없는 반환 명령은 기능이 실행되었습니다. 다음에 반품을 사용할 수 있습니다 스칼라 및 복합 데이터 유형 모두; 이후의 경우, an 결과의 전체 "테이블"이 반환됩니다. 사용하는 기능 다음 반품은 다음 방식으로 호출되어야합니다.
select * from some_func ();
즉, 함수는 A의 테이블 소스로 사용됩니다. 절.
다음 반환표현;
return next는 실제로 함수에서 돌아 오지 않습니다. 그것 표현의 가치 (또는 레코드 또는 행 변수, 반환되는 데이터 유형에 적합). 그런 다음 실행은의 다음 진술로 계속됩니다.pl/pgsql함수. 처럼 연속 반환 다음 명령이 실행되며 결과 세트는 다음과 같습니다. 구축. 논쟁이 필요하지 않은 최종 반환은 원인입니다 기능을 종료하려는 제어.
참고 :현재 반환의 현재 구현 을 위한pl/pgsql함수에서 돌아 오기 전에 전체 결과 세트 위에서 논의했습니다. 그것은 a이라는 것을 의미합니다.pl/pgsql함수는 매우 생성됩니다 큰 결과 세트, 성능이 좋지 않을 수 있습니다 : 데이터는 메모리 소진을 피하기 위해 디스크에 작성되었지만 함수 자체는 전체 결과 세트까지 돌아 오지 않습니다. 생성되었습니다. 미래 버전의pl/pgsql사용자가 허용 할 수 있습니다 사용자는 가지고 있지 않은 설정 설정 기능을 정의합니다 이 제한. 현재 데이터가 시작되는 시점 디스크에 작성되는 것은에 의해 무지개 토토됩니다.
Sort_mem
구성 변수. 더 크게 보관하기에 충분한 메모리를 가진 관리자 메모리의 결과 세트는 이것을 증가시키는 것을 고려해야합니다 매개 변수.
if진술을 통해 실행할 수 있습니다 특정 조건에 따라 명령.pl/pgsql4 가지 형태의if:
if ... then
if ... 그런 다음 ... else
if ... 그런 다음 ... else ifand
if ... 그런 다음 ... Elsif ... 그런데 ... 또 다른
if부울-표현the진술END IF;
if-then 문은 IF의 가장 간단한 형태입니다. 그만큼 그때와 종료 사이의 진술은 조건은 사실입니다. 그렇지 않으면 건너 뜁니다.
V_USER_ID < 0이면 사용자 업데이트는 이메일 = v_email user_id = v_user_id를 설정합니다. 끝 If;
if부울-표현the진술else진술END IF;
if-then-else 문은 당신을 허용하여 if-then에 추가합니다 대체 진술 세트를 지정하십시오 조건이 거짓으로 평가되면 실행됩니다.
Parentid가 null 또는 parentid = '' ''인 경우 그 다음에 풀 이름을 반환하십시오. 또 다른 hp_true_filename (parentid) ||를 반환합니다 ''/''|| 풀 이름; 끝 IF; v_count 0이면 user_count (count) 값 (v_count)에 삽입; `` 't' '를 반환합니다. 또 다른 `` 'f' '; 끝 If;
다음과 같이 진술을 중첩 할 수있는 경우 예:
demo_row.sex = ''m ''이면 pretty_sex : = ''man ''; 또 다른 demo_row.sex = ''f ''라는 경우 pretty_sex : = ''여자 ''; 끝 IF; 끝 If;
이 양식을 사용하면 실제로 IF 중첩을 사용합니다. 외부 IF 문의 다른 부분 내부의 진술. 따라서 각 중첩 된 if에 대해 한쪽 끝이 필요합니다. 부모의 경우 부모. 이것은 실행 가능하지만 언제 지루합니다 확인해야 할 대안이 많이 있습니다.
if부울-표현the진술[elsif부울-표현the진술[elsif부울-발현the진술 ...]] [else진술 ] 끝 If;
if-then-elsif-else제공 a 많은 대안을 하나로 확인하는보다 편리한 방법 성명. 공식적으로 중첩과 동일합니다if-then-else-if-then명령이지만 하나만종료 if필요합니다.
여기 예입니다.
숫자 = 0이면 결과 : = ''Zero ''; Elsif 번호 0 결과 : = ''긍정적 인 ''; Elsif 번호 <0 결과 : = ''부정적인 ''; 또 다른 - 흠, 유일한 다른 가능성은 숫자가 null이라는 것입니다. 결과 : = ''null ''; 끝 If;
최종 다른 섹션은 선택 사항입니다.
루프, 종료, 동안, 그리고 진술을 위해 당신의 준비pl/pgsql일련의 명령을 반복하는 기능.
[<< 레이블 ]
고리진술엔드 루프;
루프는 반복되는 무조건 루프를 정의합니다 출구 또는 반환 명세서에 의해 종료 될 때까지 무기한. 옵션 레이블은 중첩의 종료 명세서에서 사용할 수 있습니다. 어떤 레벨의 중첩이어야하는지 지정하는 루프 종료.
출구 [ 레이블 ] [언제표현 ];
그렇지 않은 경우레이블가 제공됩니다 가장 안쪽 루프가 종료되고 끝난 후에는 진술이 종료됩니다 루프는 다음에 실행됩니다. 만약에레이블가 주어지면 라벨이어야합니다 중첩 루프 또는 블록의 전류 또는 일부 외부 레벨. 그 다음에 명명 된 루프 또는 블록이 종료되고 제어가 계속됩니다. 루프/블록의 해당 후 명세서와 함께 끝.
현재 존재하는 경우 루프 종료가 지정된 경우에만 발생합니다. 조건은 사실입니다. 그렇지 않으면 제어가 진술로 전달됩니다 출구 후.
예 :
루프 - 일부 계산 count 0이면 출구; - 종료 루프 끝 IF; 엔드 루프; 고리 - 일부 계산 count 0 일 때 종료; 엔드 루프; 시작하다 - 일부 계산 주식이 100000이면 출구; -- 불법적인. 루프 외부에서 종료를 사용할 수 없습니다 끝 IF; 끝;
[<< 레이블 ]
하는 동안표현루프진술엔드 루프;
while 진술은 일련의 진술을 반복합니다 조건 표현이 True로 평가되는 한. 그만큼 루프에 입력하기 직전에 조건이 확인됩니다. 몸.
예 :
- 여기에 일부 계산 엔드 루프; Boolean_expression 루프는 아닙니다 - 여기에 일부 계산 엔드 루프;
[<< 레이블 ] 을 위한이름in [Reverse]표현 .. 표현loop진술엔드 루프;
이 형태의 For는 범위에 반복되는 루프를 만듭니다. 정수 값의. 변수이름는 자동으로 유형으로 정의됩니다 정수와 루프 내부에만 존재합니다. 두 표현 범위의 하단 및 상한을 제공하는 것이 평가됩니다. 루프에 들어가면 한 번. 반복 단계는 일반적으로입니다 1, 반전이 지정 될 때 -1입니다.
루프에 대한 정수의 일부 예 :
1.10 루프의 i - 여기에 일부 표현 통지``나는 %'', i; 엔드 루프; 반전 10..1 루프 - 여기에 일부 표현 엔드 루프;
다른 유형의 루프를 사용하면 반복 할 수 있습니다. 쿼리의 결과와 그에 따라 해당 데이터를 조작합니다. 구문은 다음과 같습니다.
[<< 레이블 ]
을 위한레코드 | 열inselect_queryloop진술엔드 루프;
레코드 또는 행 변수는 모든 선택 쿼리와 루프 바디로 인한 행은 각 행에 대해 실행되었습니다. 예는 다음과 같습니다.
함수 생성 cs_refresh_mviews () 정수를 반환합니다. 선언하다 mviews 레코드; 시작하다 cs_log ( ''상쾌한 구체화 된 뷰 ... '')를 수행합니다. SELECT *의 MVIEWS의 경우 CS_MATERIALIZED_VIEWS ORDER의 SORT_KEY LOOP 주문 - 이제 "mviews"는 cs_materialized_views의 한 레코드를 가지고 있습니다 CS_LOG ( ''RESHREATHING INSEARTIED VIEW ''|| QUOTE_INDEN (MVIEWS.MV_NAME) || ''... '')을 수행합니다. ``Truncate Table ''||를 실행하십시오 quote_ident (mviews.mv_name); ''삽입 ''||를 실행하십시오 quote_ident (mviews.mv_name) || '' '' '|| mviews.mv_query; 엔드 루프; CS_LOG ( ''DONE RESHREATHING INSEVERIFED VIOGS. ''); 반환 1; 끝; '언어'plpgsql ';
루프가 종료 문으로 종료되면 마지막 지정된 행 값은 루프 후에도 여전히 액세스 할 수 있습니다.
execute for-execute 진술은 반복하는 또 다른 방법입니다 기록 :
[<< 레이블 ]
을 위한레코드 | 열실행text_expressionloop진술엔드 루프;
이것은 소스를 제외하고는 이전 형식과 같습니다. select 문은 문자열 표현식으로 지정됩니다. for 루프에 대한 각 항목에 대해 평가 및 재구성. 이것 프로그래머가 사전 계획된 속도를 선택할 수 있습니다. 쿼리 또는 동적 쿼리의 유연성과 마찬가지로 평범한 실행 진술.
참고 :thepl/pgsql현재 파서 두 종류의 루프 (정수 또는 대상 변수 여부를 확인하여 레코드 반복) 직후에 언급 된 기록/행으로 선언되었습니다. 변하기 쉬운. 그렇지 않다면, 그것은 루프의 정수로 추정됩니다. 이로 인해 직관적이지 않은 오류 메시지가 발생할 수 있습니다 진정한 문제는 변수 이름.