2025 년 7 월 17 일 : | 무지개 토토 18 베타 2 릴리스!
이 문서는 지원되지 않는 버전의 무지개 토토을위한 것입니다.
당신은에 대해 같은 페이지를 보려고 할 수 있습니다토토 사이트 PostgreSQL : 문서 : 17 : 41.6. 무지개 토토 구조버전 또는 위에 나열된 다른 지원 버전 중 하나입니다.

19.6. 제어 구조

무지개 토토 구조는 아마도 가장 유용 할 것입니다 (및 중요)의 일부pl/pgsql. 와 함께pl/pgsql의 무지개 토토 구조, 당신은 조작 할 수 있습니다무지개 토토매우 유연한 데이터 강력한 방법.

19.6.1. a에서 돌아온다 기능

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구성 변수. 더 크게 보관하기에 충분한 메모리를 가진 관리자 메모리의 결과 세트는 이것을 증가시키는 것을 고려해야합니다 매개 변수.

19.6.2. 조건부

if진술을 통해 실행할 수 있습니다 특정 조건에 따라 명령.pl/pgsql4 가지 형태의if:

  • if ... then

  • if ... 그런 다음 ... else

  • if ... 그런 다음 ... else ifand

  • if ... 그런 다음 ... Elsif ... 그런데 ... 또 다른

19.6.2.1. if-then

if부울-표현the진술END IF;

if-then 문은 IF의 가장 간단한 형태입니다. 그만큼 그때와 종료 사이의 진술은 조건은 사실입니다. 그렇지 않으면 건너 뜁니다.

V_USER_ID < 0이면
    사용자 업데이트는 이메일 = v_email user_id = v_user_id를 설정합니다.
끝 If;

19.6.2.2. if-then-else

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;

19.6.2.3. if-then-else if

다음과 같이 진술을 중첩 할 수있는 경우 예:

demo_row.sex = ''m ''이면
  pretty_sex : = ''man '';
또 다른
  demo_row.sex = ''f ''라는 경우
    pretty_sex : = ''여자 '';
  끝 IF;
끝 If;

이 양식을 사용하면 실제로 IF 중첩을 사용합니다. 외부 IF 문의 다른 부분 내부의 진술. 따라서 각 중첩 된 if에 대해 한쪽 끝이 필요합니다. 부모의 경우 부모. 이것은 실행 가능하지만 언제 지루합니다 확인해야 할 대안이 많이 있습니다.

19.6.2.4. if-then-elsif-else

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;

최종 다른 섹션은 선택 사항입니다.

19.6.3. 단순한 루프

루프, 종료, 동안, 그리고 진술을 위해 당신의 준비pl/pgsql일련의 명령을 반복하는 기능.

19.6.3.1. 고리

[<< 레이블 ]
고리진술엔드 루프;

루프는 반복되는 무조건 루프를 정의합니다 출구 또는 반환 명세서에 의해 종료 될 때까지 무기한. 옵션 레이블은 중첩의 종료 명세서에서 사용할 수 있습니다. 어떤 레벨의 중첩이어야하는지 지정하는 루프 종료.

19.6.3.2. 출구

출구 [ 레이블 ] [언제표현 ];

그렇지 않은 경우레이블가 제공됩니다 가장 안쪽 루프가 종료되고 끝난 후에는 진술이 종료됩니다 루프는 다음에 실행됩니다. 만약에레이블가 주어지면 라벨이어야합니다 중첩 루프 또는 블록의 전류 또는 일부 외부 레벨. 그 다음에 명명 된 루프 또는 블록이 종료되고 제어가 계속됩니다. 루프/블록의 해당 후 명세서와 함께 끝.

현재 존재하는 경우 루프 종료가 지정된 경우에만 발생합니다. 조건은 사실입니다. 그렇지 않으면 제어가 진술로 전달됩니다 출구 후.

예 :

루프
    - 일부 계산
    count 0이면
        출구;  - 종료 루프
    끝 IF;
엔드 루프;

고리
    - 일부 계산
    count 0 일 때 종료;
엔드 루프;

시작하다
    - 일부 계산
    주식이 100000이면
        출구;  -- 불법적인. 루프 외부에서 종료를 사용할 수 없습니다
    끝 IF;
끝;

19.6.3.3. 하는 동안

[<< 레이블 ]
하는 동안표현루프진술엔드 루프;

while 진술은 일련의 진술을 반복합니다 조건 표현이 True로 평가되는 한. 그만큼 루프에 입력하기 직전에 조건이 확인됩니다. 몸.

예 :

- 여기에 일부 계산
엔드 루프;

Boolean_expression 루프는 아닙니다
    - 여기에 일부 계산
엔드 루프;

19.6.3.4. for (Integer for-loop)

[<< 레이블 ]
을 위한이름in [Reverse]표현 .. 표현loop진술엔드 루프;

이 형태의 For는 범위에 반복되는 루프를 만듭니다. 정수 값의. 변수이름는 자동으로 유형으로 정의됩니다 정수와 루프 내부에만 존재합니다. 두 표현 범위의 하단 및 상한을 제공하는 것이 평가됩니다. 루프에 들어가면 한 번. 반복 단계는 일반적으로입니다 1, 반전이 지정 될 때 -1입니다.

루프에 대한 정수의 일부 예 :

1.10 루프의 i
  - 여기에 일부 표현

    통지``나는 %'', i;
엔드 루프;

반전 10..1 루프
    - 여기에 일부 표현
엔드 루프;

19.6.4. 쿼리를 통한 반복 결과

다른 유형의 루프를 사용하면 반복 할 수 있습니다. 쿼리의 결과와 그에 따라 해당 데이터를 조작합니다. 구문은 다음과 같습니다.

[<< 레이블 ]
을 위한레코드 | 열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현재 파서 두 종류의 루프 (정수 또는 대상 변수 여부를 확인하여 레코드 반복) 직후에 언급 된 기록/행으로 선언되었습니다. 변하기 쉬운. 그렇지 않다면, 그것은 루프의 정수로 추정됩니다. 이로 인해 직관적이지 않은 오류 메시지가 발생할 수 있습니다 진정한 문제는 변수 이름.