무지개 토토 구조는 아마도 가장 유용할 것입니다(그리고 중요) 일부PL/pgSQL. 와 함께PL/pgSQL의 통제 무지개 토토를 조작할 수 있습니다.PostgreSQL매우 유연하고 강력한 방법입니다.
반환표현;
표현식을 포함한 RETURN은 a에서 반환하는 데 사용됩니다.PL/pgSQL하는 함수 세트를 반환하지 않습니다. 함수가 종료되고 값은표현다음으로 반환됩니다. 발신자.
복합(행) 값을 반환하려면 레코드를 작성해야 합니다 또는 행 변수를표현. 스칼라 유형을 반환할 때, 어떤 표현이든 사용할 수 있습니다. 표현식의 결과는 다음과 같습니다. 설명된 대로 함수의 반환 유형으로 자동으로 캐스팅됩니다. 과제를 위해. (반환할 함수를 선언한 경우무효이면 표현식을 생략할 수 있습니다. 어떠한 경우에도 무시됩니다.)
함수의 반환 값은 정의되지 않은 상태로 둘 수 없습니다. 만약에 제어가 함수의 최상위 블록 끝에 도달함 RETURN 문을 누르지 않으면 런타임 오류가 발생합니다. 발생합니다.
때PL/pgSQL함수는 복귀 선언SETOF 어떤 유형, 따라야 할 절차는 다음과 같습니다. 약간 다릅니다. 이 경우 개별 항목은 return은 RETURN NEXT 명령에 지정된 다음 최종 인수가 없는 RETURN 명령은 다음을 나타내는 데 사용됩니다. 함수 실행이 완료되었습니다. RETURN NEXT는 다음과 함께 사용할 수 있습니다. 스칼라 및 복합 데이터 유형 모두; 후자의 경우에는 결과의 전체 "테이블"이 반환됩니다. 사용하는 기능 RETURN NEXT는 다음과 같은 방식으로 호출되어야 합니다.
SELECT * some_func()에서;
즉, 함수는 FROM에서 테이블 소스로 사용됩니다. 조항.
다음으로 돌아가기표현;
RETURN NEXT는 실제로 함수에서 반환하지 않습니다. 그것 단순히 표현식(또는 레코드나 행)의 값을 저장합니다. 반환되는 데이터 유형에 따라 적절한 변수). 그런 다음 실행은의 다음 문으로 계속됩니다.PL/pgSQL함수. 다음과 같이 연속적인 RETURN NEXT 명령이 실행되면 결과 세트는 다음과 같습니다. 구축. 인수가 필요 없는 최종 RETURN은 다음을 유발합니다. 기능을 종료하려면 제어하세요.
참고:RETURN NEXT의 현재 구현 에 대한PL/pgSQL저장합니다 함수에서 반환되기 전의 전체 결과 집합은 다음과 같습니다. 위에서 논의했습니다. 즉, 만약 aPL/pgSQL함수는 매우 결과 집합이 크면 성능이 저하될 수 있습니다. 데이터가 메모리 고갈을 피하기 위해 디스크에 기록되지만 함수 자체는 전체 결과 집합이 나올 때까지 반환되지 않습니다. 생성되었습니다. 다음 버전의PL/pgSQL사용자가 다음을 허용할 수 있습니다. 사용자는 이 제한. 현재 데이터가 시작되는 시점 디스크에 기록되는 것은 다음에 의해 제어됩니다.
SORT_MEM구성 변수. 더 큰 용량을 저장할 수 있는 충분한 메모리가 있는 관리자 메모리의 결과 집합은 이 값을 늘리는 것을 고려해야 합니다. 매개변수입니다.
IF문을 사용하면 실행할 수 있습니다. 특정 조건에 따른 명령입니다.PL/pgSQL네 가지 형태가 있습니다IF:
만약 ... 그렇다면
만약 ... 그렇다면 ... ELSE
IF ... 그렇다면 ... ELSE IF그리고
만약 ... 그렇다면 ... ELSIF ... 그렇다면 ... 그 외
IF부울 표현식그때문장END IF;
IF-THEN 문은 IF의 가장 간단한 형태입니다. 는 THEN과 END IF 사이의 명령문은 다음과 같은 경우에 실행됩니다. 조건이 참입니다. 그렇지 않으면 건너뜁니다.
IF v_user_id < 0 THEN
사용자 업데이트 SET email = v_email WHERE user_id = v_user_id;
종료하면;
IF부울 표현식그때문장ELSE문장END IF;
IF-THEN-ELSE 문은 다음을 수행하여 IF-THEN에 추가됩니다. 대체 문 세트를 지정해야 합니다. 조건이 FALSE로 평가되면 실행됩니다.
부모 ID가 NULL이거나 부모 ID = ''''인 경우
그런 다음
전체 이름을 반환합니다.
그 외
return hp_true_filename(parentid) || ''/'' || 성명;
종료하면;
IF v_count 0 그러면
INSERT INTO users_count(count) VALUES(v_count);
''t''를 반환합니다;
그 외
''f''를 반환합니다;
종료하면;
IF 문은 다음과 같이 중첩될 수 있습니다. 예:
IF deco_row.sex = ''m'' THEN
Pretty_sex := ''남자'';
그 외
IF deco_row.sex = ''f'' 그러면
Pretty_sex := ''여자'';
종료하면;
종료하면;
이 양식을 사용하면 실제로 IF가 중첩됩니다. 외부 IF 문의 ELSE 부분 내부에 있는 문입니다. 따라서 각 중첩 IF에 대해 하나의 END IF 문이 필요하고 부모 IF-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'';
종료하면;
마지막 ELSE 섹션은 선택사항입니다.
LOOP, EXIT, WHILE 및 FOR 문을 사용하면 다음을 수행할 수 있습니다. 당신을 위해 준비하십시오PL/pgSQL일련의 명령을 반복하는 함수입니다.
[<<라벨]
무지개 토토문장END LOOP;
LOOP는 반복되는 무조건 무지개 토토를 정의합니다. EXIT 또는 RETURN 문에 의해 종료될 때까지 무기한입니다. 선택적 레이블은 중첩된 EXIT 문에서 사용할 수 있습니다. 중첩 수준을 지정하는 무지개 토토 종료되었습니다.
종료 [ 라벨 ] [언제표현 ];
아니면라벨주어지면, 가장 안쪽 무지개 토토가 종료되고 END 다음의 명령문이 실행됩니다. 다음에 LOOP가 실행됩니다. 만일라벨이 주어지면 다음의 라벨이어야 합니다. 중첩된 무지개 토토나 블록의 현재 또는 일부 외부 수준. 그런 다음 명명된 무지개 토토 또는 블록이 종료되고 제어가 계속됩니다. 무지개 토토/블록 다음에 해당하는 명령문이 있는 경우 끝.
WHEN이 존재하는 경우 지정된 경우에만 루프 종료가 발생합니다. 조건이 true이면 무지개 토토가 명령문으로 전달됩니다. 종료 후.
예:
무지개 토토
-- 일부 계산
IF 개수 0 그러면
종료; -- 무지개 토토 종료
종료하면;
엔드 무지개 토토;
무지개 토토
-- 일부 계산
개수 0일 때 종료합니다.
엔드 무지개 토토;
시작
-- 일부 계산
IF 주식 100000 THEN
종료; -- 불법적인. LOOP 외부에서는 EXIT를 사용할 수 없습니다.
종료하면;
끝;
[<<라벨]
동안표현무지개 토토문장END LOOP;
WHILE 문은 일련의 문을 반복하므로 조건 표현식이 true로 평가되는 한. 는 조건은 무지개 토토의 각 항목 직전에 확인됩니다. 몸.
예:
채무 금액 0 AND 선물_증명서 잔액 0 LOOP인 동안
-- 여기에 몇 가지 계산이 있습니다.
엔드 무지개 토토;
boolean_expression LOOP가 아닌 동안
-- 여기에 몇 가지 계산이 있습니다.
끝 무지개 토토;
[<<라벨] 에 대한이름IN [반전] 표현 .. 표현무지개 토토문장END LOOP;
이 FOR 형식은 범위를 반복하는 무지개 토토를 생성합니다. 정수 값. 변수이름자동으로 유형으로 정의됩니다. 정수이며 무지개 토토 내부에만 존재합니다. 두 가지 표현 범위의 하한과 상한을 제공하면 평가됩니다. 무지개 토토에 들어갈 때 한 번. 반복 단계는 일반적으로 1이지만 REVERSE가 지정된 경우에는 -1입니다.
정수 FOR 무지개 토토의 몇 가지 예:
i IN 1..10 무지개 토토용
-- 여기에 몇 가지 표현이 있습니다.
인상 알림 ''i는 %'',i;
엔드 무지개 토토;
역방향 10..1 무지개 토토의 i용
-- 여기에 몇 가지 표현이 있습니다.
끝 무지개 토토;
다른 유형의 FOR 무지개 토토를 사용하여 다음을 반복할 수 있습니다. 쿼리 결과를 확인하고 이에 따라 해당 데이터를 조작합니다. 구문은 다음과 같습니다.
[<<라벨]
에 대한기록 | 행INselect_query무지개 토토문장END LOOP;
레코드 또는 행 변수는 모든 항목에 연속적으로 할당됩니다. SELECT 쿼리의 결과 행과 무지개 토토 본문은 다음과 같습니다. 각 행에 대해 실행됩니다. 예는 다음과 같습니다.
함수 생성 cs_refresh_mviews ()는 정수를 '로 반환합니다.
선언
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';
무지개 토토가 EXIT 문에 의해 종료되면 마지막 무지개 토토 후에도 할당된 행 값에 계속 액세스할 수 있습니다.
FOR-IN-EXECUTE 문은 반복하는 또 다른 방법입니다. 기록:
[<<라벨]
에 대한기록 | 행실행 중텍스트 표현무지개 토토문장END LOOP;
이것은 소스를 제외하고 이전 양식과 같습니다. SELECT 문은 문자열 표현식으로 지정됩니다. FOR 무지개 토토의 각 항목을 평가하고 다시 계획합니다. 이 프로그래머가 미리 계획된 속도를 선택할 수 있습니다. 쿼리 또는 동적 쿼리의 유연성 일반 EXECUTE 문입니다.
참고:그PL/pgSQL파서 현재 두 종류의 FOR 무지개 토토(정수 또는 레코드 반환) 대상 변수인지 확인하여 FOR가 레코드/행으로 선언된 직후에 언급됨 변수. 그렇지 않은 경우 정수 FOR 무지개 토토로 추정됩니다. 이로 인해 다소 비직관적인 오류 메시지가 발생할 수 있습니다. 진짜 문제는 예를 들어 FOR의 철자를 잘못 썼다는 것입니다. 변수 이름.