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