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

37.7. 토토 사이트 구조

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

37.7.1. 에서 돌아오는 중 기능

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

37.7.1.1. 반환

반환표현;

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

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

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

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

37.7.1.2. 다음으로 돌아가기

다음으로 돌아가기표현;

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

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

SELECT * some_func()에서;

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

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

참고:현재 구현다음으로 돌아가기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 표현식.