이 문서는 지원되지 않는 PostgreSQL 버전에 대한 것입니다.
당신은 다음과 같은 페이지를 보고 싶을 수도 있습니다.토토 사이트 PostgreSQL : 문서 : 17 : 41.6. 제어 구조버전 또는 위에 나열된 다른 지원 버전 중 하나를 사용하세요.

37.7. 토토 사이트 구조

토토 사이트 구조는 아마도 가장 유용할 것입니다(그리고 중요) 일부PL/pgSQL. 와 함께PL/pgSQL의 통제 토토 사이트를 조작할 수 있습니다.포스트그레SQL매우 유연하고 강력한 방법입니다.

37.7.1. 에서 돌아오는 중 기능

귀하가 복귀할 수 있는 두 가지 명령이 있습니다 함수의 데이터:반환그리고다음으로 돌아가기.

37.7.1.1. 반환

반환표현;

반환표현식 포함 함수를 종료하고 값을 반환합니다.표현발신자에게. 이 양식은 에 사용됩니다PL/pgSQL세트를 반환하지 않는 함수.

스칼라 유형을 반환할 때 모든 표현식을 사용할 수 있습니다. 표현식의 결과는 자동으로 할당에 대해 설명한 함수의 반환 유형입니다. 받는 사람 복합(행) 값을 반환하려면 레코드를 작성해야 합니다. 행 변수를표현.

함수의 반환 값은 정의되지 않은 상태로 둘 수 없습니다. 제어권이 최상위 블록의 끝에 도달한 경우 a를 누르지 않고 함수를 작동합니다.반환문을 작성하면 런타임 오류가 발생합니다.

반환할 함수를 선언한 경우공허, 아반환문장 여전히 지정되어야 합니다. 하지만 이 경우 표현식은 다음반환선택사항이며 존재하는 경우 무시됩니다.

37.7.1.2. 다음으로 돌아가기

다음으로 돌아가기표현;

PL/pgSQL함수 복귀가 선언되었습니다SETOF어떤 유형, 따라야 할 절차 약간 다릅니다. 이 경우 개별 항목은 반환은에 지정됩니다.다음으로 돌아가기명령, 그리고 마지막반환13725_13827반환 다음스칼라 데이터와 복합 데이터 모두에 사용할 수 있습니다. 유형; 후자의 경우 전체"테이블"의 결과가 반환됩니다.

사용하는 함수다음으로 돌아가기다음과 같은 방식으로 호출되어야 합니다:

SELECT * some_func()에서;

즉, 함수는 테이블 소스로 사용됩니다.발신절.

다음으로 돌아가기실제로는 그렇지 않습니다 함수에서 복귀합니다. 그것은 단순히 가치를 저장합니다 표현식(또는 다음에 적합한 레코드 또는 행 변수) 반환되는 데이터 유형). 그런 다음 실행이 계속됩니다. 의 다음 문PL/pgSQL함수. 연속적으로다음으로 돌아가기명령이 실행되고, 결과 세트가 구축됩니다. 결승전반환14850_14927

참고:현재 구현다음으로 돌아가기forPL/pgSQL전체 결과를 저장합니다 설명한 대로 함수에서 반환되기 전에 설정합니다. 위. 즉, 만약 aPL/pgSQL함수는 매우 결과 집합이 크면 성능이 저하될 수 있습니다. 데이터가 메모리 고갈을 피하기 위해 디스크에 기록되지만 함수 자체는 전체 결과가 나올 때까지 반환되지 않습니다. 세트가 생성되었습니다. 다음 버전의PL/pgSQL사용자가 다음을 정의하도록 허용할 수 있습니다. 이러한 제한이 없는 집합 반환 함수입니다. 현재 데이터가 기록되기 시작하는 시점 디스크에 대한 제어는sort_mem구성 변수. 더 큰 용량을 저장할 수 있는 충분한 메모리가 있는 관리자 메모리의 결과 집합은 이 값을 늘리는 것을 고려해야 합니다. 매개변수입니다.

37.7.2. 조건부

IF문을 사용하면 실행할 수 있습니다. 특정 조건에 따른 명령입니다.PL/pgSQL네 가지 형태가 있습니다IF:

  • 만약 ... 그렇다면

  • 만약 ... 그렇다면 ... ELSE

  • IF ... THEN ... ELSE IF

  • 만약 ... 그렇다면 ... ELSIF ... 그렇다면 ... 그 외

37.7.2.1. IF-THEN

IF부울 표현식그때문장END IF;

IF-THEN문장은 가장 간단한 형태의IF. 진술 사이그때그리고END IF조건이 다음과 같은 경우 실행됩니다. 사실. 그렇지 않으면 건너뜁니다.

예:

IF v_user_id < 0 THEN
    사용자 업데이트 SET email = v_email WHERE user_id = v_user_id;
종료하면;

37.7.2.2. IF-THEN-ELSE

IF부울 표현식그때문장ELSE문장END IF;

IF-THEN-ELSE문 추가IF-THEN지정할 수 있게 하여 다음과 같은 경우 실행되어야 하는 대체 명령문 세트 조건이 false로 평가됩니다.

예:

부모 ID가 NULL이거나 부모 ID = ''''인 경우
그런 다음
    RETURN 전체 이름;
그 외
    RETURN hp_true_filename(부모 ID) || ''/'' || 성명;
종료하면;
IF v_count  0 THEN 
    INSERT INTO users_count(개수) VALUES(v_count);
    ''t''를 반환합니다.
그 외
    ''f''를 반환합니다.
종료하면;

37.7.2.3. IF-THEN-ELSE IF

IF문은 다음과 같이 중첩될 수 있습니다. 다음 예에서는:

IF deco_row.sex = ''m'' THEN
    Pretty_sex := ''남자'';
그 외
    IF deco_row.sex = ''f'' 그러면
        Pretty_sex := ''여자'';
    종료하면;
종료하면;

이 양식을 사용하면 실제로 중첩됩니다.IF내부 진술ELSE외부의 일부IF성명. 따라서 하나가 필요합니다.END IF중첩된 각 명령문IF그리고 하나는 부모용IF-ELSE. 이것은 실행 가능하지만 지루해집니다. 확인할 대안이 많을 때. 따라서 다음 양식.

37.7.2.4. IF-THEN-ELSIF-ELSE

IF부울 표현식그때진술
[ELSIF부울 표현식그때진술
[ELSIF부울 표현식그때성명
    ...]]
[ELSE성명 ]
종료하면;

IF-THEN-ELSIF-ELSE제공 여러 대안을 한 번에 확인하는 보다 편리한 방법 성명. 공식적으로는 중첩과 동일합니다.IF-THEN-ELSE-IF-THEN명령은 하나뿐임END IF필요합니다.

다음은 예입니다:

IF 숫자 = 0 THEN
    결과 := ''0'';
ELSIF 번호  0 THEN 
    결과 := ''긍정적'';
ELSIF 숫자 < 0 THEN
    결과 := ''부정적'';
그 외
    -- 흠, 유일한 다른 가능성은 숫자가 null이라는 것입니다.
    결과 := ''NULL'';
종료하면;

37.7.3. 단순 토토 사이트

와 함께토토 사이트, 종료, 동안for문을 준비할 수 있습니다. 당신의PL/pgSQL기능 일련의 명령을 반복하십시오.

37.7.3.1. 토토 사이트

[<<라벨]
토토 사이트문장END LOOP;

토토 사이트무조건을 정의합니다. 에 의해 종료될 때까지 무한 반복되는 토토 사이트종료또는반환성명. 선택적 라벨은 다음과 같습니다. 에서 사용됨종료중첩된 문 중첩 수준을 지정하는 토토 사이트 종료되었습니다.

37.7.3.2. 종료

종료 [ 라벨 ] [언제표현 ];

아니면라벨주어지면, 가장 안쪽 토토 사이트가 종료되고 다음 명령문이 나옵니다.END LOOP다음에 실행됩니다. 만일라벨주어진 것이어야 합니다. 현재 또는 중첩 토토 사이트의 외부 수준의 레이블 또는 차단. 그런 다음 명명된 토토 사이트나 블록이 종료되고 토토 사이트/블록 다음의 명령문으로 제어가 계속됩니다. 해당END.

만약언제존재, 토토 사이트 종료 지정된 조건이 true인 경우에만 발생하고, 그렇지 않으면 제어는 다음 명령문으로 전달됩니다.종료.

예:

토토 사이트
    -- 일부 계산
    IF 개수  0 그러면
        종료;  -- 토토 사이트 종료
    종료하면;
엔드 토토 사이트;

토토 사이트
    -- 일부 계산
    개수  0일 때 종료합니다.  -- 이전 예제와 동일한 결과
엔드 토토 사이트;

시작
    -- 일부 계산
    IF 주식  100000 THEN
        종료;  -- 유효하지 않은; LOOP 외부에서는 EXIT를 사용할 수 없습니다.
    종료하면;
끝;

37.7.3.3. 동안

[<<라벨]
동안표현토토 사이트문장END LOOP;

동안문은 다음을 반복합니다. 조건 표현식이 포함된 일련의 명령문 사실로 평가됩니다. 조건은 각 직전에 확인됩니다. 토토 사이트 본문에 진입합니다.

예:

채무 금액  0 AND 선물_증명서 잔고  0 LOOP인 동안
    -- 여기에 몇 가지 계산이 있습니다.
엔드 토토 사이트;

boolean_expression LOOP가 아닌 동안
    -- 여기에 몇 가지 계산이 있습니다.
끝 토토 사이트;

37.7.3.4. for(정수 변형)

[<<라벨]
에 대한이름IN [반전] 표현 .. 표현토토 사이트문장END LOOP;

이 형식은for토토 사이트를 생성합니다 이는 정수 값의 범위를 반복합니다. 변수이름자동으로 정의됩니다. 유형으로정수내부에만 존재합니다. 토토 사이트. 하한과 상한을 나타내는 두 가지 표현 범위의 경계는 토토 사이트에 들어갈 때 한 번 평가됩니다. 반복 단계는 일반적으로 1이지만 다음과 같은 경우에는 -1입니다.반전지정되었습니다.

정수의 몇 가지 예for토토 사이트:

i IN 1..10 토토 사이트용
    -- 여기에 몇 가지 계산이 있습니다.
    인상 알림 ''i는 %'', i;
엔드 토토 사이트;

역방향 10..1 토토 사이트의 i용
    -- 여기에 몇 가지 계산이 있습니다.
끝 토토 사이트;

하한이 상한보다 큰 경우(또는 미만, 에서반전케이스), 토토 사이트 본문이 전혀 실행되지 않습니다. 오류가 발생하지 않습니다.

37.7.4. 쿼리를 통한 루핑 결과

다른 유형의 사용for토토 사이트, 쿼리 결과를 반복하고 조작할 수 있습니다. 그에 따라 해당 데이터. 구문은 다음과 같습니다.

[<<라벨]
에 대한record_or_rowIN질의토토 사이트문장END LOOP;

레코드 또는 행 변수는 각 행마다 연속적으로 할당됩니다. 쿼리 결과(a선택명령) 및 토토 사이트 본문이 각 행에 대해 실행됩니다. 여기는 예:

CREATE FUNCTION cs_refresh_mviews() 정수 AS '를 반환합니다.
선언
    mviews 기록;
시작
    PERFORM cs_log(''구체화된 뷰를 새로 고치는 중...'');

    FOR mviews IN SELECT * FROM cs_materialized_views ORDER BY sort_key LOOP

        -- 이제 "mviews"에는 cs_materialized_views의 레코드가 하나 있습니다.

        PERFORM cs_log(''구체화된 뷰 새로 고침 '' || quote_ident(mviews.mv_name) || ''...'');
        실행 ''TRUNCATE TABLE '' || quote_ident(mviews.mv_name);
        ''INSERT INTO'' 실행 || quote_ident(mviews.mv_name) || '' '' || mviews.mv_query;
    엔드 토토 사이트;

    PERFORM cs_log(''구체화된 뷰 새로 고침이 완료되었습니다.'');
    1을 반환합니다.
끝;
' 언어 plpgsql;

토토 사이트가 다음에 의해 종료되는 경우종료문, 마지막으로 할당된 행 값은 다음과 같습니다. 토토 사이트 후에도 여전히 액세스 가능합니다.

실행 중문은 다음과 같습니다 레코드를 반복하는 또 다른 방법:

[<<라벨]
에 대한record_or_row실행 중텍스트 표현토토 사이트문장END LOOP;

이것은 소스를 제외하고 이전 양식과 같습니다선택문은 다음과 같이 지정됩니다. 각 항목에서 평가되고 다시 계획되는 문자열 표현식 에 입장for토토 사이트. 이를 통해 프로그래머는 미리 계획된 쿼리의 속도를 선택하거나 일반 쿼리와 마찬가지로 동적 쿼리의 유연성실행진술.

참고:PL/pgSQL파서 현재 두 종류를 구별합니다.for토토 사이트(정수 또는 쿼리 결과)를 확인하여 바로 뒤에 언급된 대상 변수for레코드 또는 행으로 선언되었습니다. 변수. 그렇지 않은 경우 정수로 추정됩니다.for토토 사이트. 이는 다소 비직관적인 결과를 초래할 수 있습니다. 실제 문제는 예를 들어 다음과 같은 경우 오류 메시지가 표시됩니다. 뒤에 변수 이름을 잘못 입력했습니다.for. 일반적으로 불만사항은 다음과 같습니다. 같은 것끝에 ".."가 누락되었습니다. SQL 표현식.