토토 사이트 구조는 아마도 가장 유용 할 것입니다 (및 중요)의 일부pl/pgsql. 와 함께pl/pgsql의 토토 사이트 구조, 당신은 조작 할 수 있습니다PostgreSQL매우 유연한 데이터 강력한 방법.
반환 할 수있는 두 가지 명령이 있습니다. 함수의 데이터 :returnand다음 반환.
return표현;
return표현식 함수를 종료하고 값을 반환합니다표현발신자에게. 이 양식은입니다 사용하려면pl/pgsql세트를 반환하지 않는 함수.
스칼라 유형을 반환 할 때 모든 표현식을 사용할 수 있습니다. 표현식의 결과는 자동으로 캐스트됩니다 과제에 대해 설명대로 함수의 리턴 유형. 에게 복합재 (행) 값을 반환하려면 레코드를 작성하거나 행 변수로표현.
함수의 반환 값은 정의되지 않은 상태로 남겨질 수 없습니다. 토토 사이트가 최상위 수준 블록의 끝에 도달하는 경우 a를 치지 않고 기능return문, 런타임 오류가 발생합니다.
반환 할 기능이 선언 된 경우void, areturn진술 여전히 지정되어야합니다. 그러나이 경우 표현 수행원return선택 사항이며 존재하면 무시됩니다.
반환 다음표현;
언제pl/pgsql함수 반환으로 선언setofSomegetype, 따라야 할 절차 약간 다릅니다. 이 경우 개별 항목은 반품은에 지정되어 있습니다.다음 반환명령, 그리고 최종return인수가없는 명령은 기능이 실행되었습니다.반환 다음스칼라 및 복합 데이터와 함께 사용할 수 있습니다 유형; 후자의 경우 전체"테이블"결과가 반환됩니다.
사용하는 기능다음 반환다음 방식으로 호출해야합니다.
select * from some_func ();
즉, 함수는 a의 테이블 소스로 사용됩니다.From절.
반환 다음실제로는 그렇지 않습니다 함수에서 돌아 오십시오. 그것은 단순히 가치를 절약합니다 표현식 (또는 레코드 또는 행 변수 데이터 유형이 반환됩니다). 그런 다음 실행은 계속됩니다 의 다음 진술pl/pgsql함수. 연속다음 반환명령이 실행됩니다. 결과 세트가 구축되었습니다. 최종return, 논쟁이 없어야하는 원인 기능을 종료하려는 토토 사이트.
참고 :현재의 구현반환 다음forpl/pgsql전체 결과를 저장합니다 논의 된대로 함수에서 돌아 오기 전에 설정합니다 위에. 그것은 a이라는 것을 의미합니다.pl/pgsql함수는 매우 생성됩니다 큰 결과 세트, 성능이 좋지 않을 수 있습니다 : 데이터는 메모리 소진을 피하기 위해 디스크에 작성되었지만 함수 자체는 전체 결과까지 반환되지 않습니다 세트가 생성되었습니다. 미래 버전의pl/pgsql사용자가 정의 할 수 있습니다 이 제한이없는 세트 리턴 기능. 현재 데이터가 작성되기 시작하는 시점 디스크는에 의해 토토 사이트됩니다.Sort_mem구성 변수. 더 크게 보관하기에 충분한 메모리를 가진 관리자 메모리의 결과 세트는 이것을 증가시키는 것을 고려해야합니다 매개 변수.
if진술을 실행할 수 있습니다 특정 조건에 따라 명령.pl/pgsql4 가지 형태의if:
if ... then
if ... 그런 다음 ... else
if ... 그런 다음 ... else if
if ... 그런 다음 ... Elsif ... 그런 다음 ... 또 다른
if부울-발현the진술END IF;
if-then진술은 다음과 같습니다 가장 간단한 형태의if. 진술 사이the및END IF조건이 있으면 실행됩니다 진실. 그렇지 않으면 건너 뜁니다.
예 :
if v_user_id < 0이면 사용자 업데이트는 이메일 = v_email user_id = v_user_id를 설정합니다. 끝 If;
if부울-표현the진술else진술종료 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;
if진술은 중첩 될 수 있습니다 다음 예에서 :
if demo_row.sex = ''m ''라는 경우 pretty_sex : = ''man ''; 또 다른 demo_row.sex = ''f ''라는 경우 pretty_sex : = ''여자 ''; 끝 IF; 끝 If;
이 양식을 사용하면 실제로 중첩if내부의 진술else외부의 일부if진술. 따라서 하나가 필요합니다종료 if각 중첩에 대한 명령문if그리고 부모를위한 하나if-else. 이것은 실행 가능하지만 지루한 성장합니다 확인해야 할 대안이 많이있을 때. 따라서 다음 양식.
if부울-표현the진술[elsif부울-표현the진술[elsif부울-표현the진술 ...]] [else진술 ] 끝 If;
if-then-elsif-else제공 a 많은 대안을 하나로 확인하는보다 편리한 방법 성명. 공식적으로 중첩과 동일합니다if-then-else-if-then명령이지만 하나만종료 if필요합니다.
예는 다음과 같습니다.
if number = 0이면 결과 : = ''Zero ''; Elsif 번호 0 결과 : = ''긍정적 인 ''; Elsif 번호 <0 결과 : = ''부정적인 ''; 또 다른 - 흠, 유일한 다른 가능성은 숫자가 null이라는 것입니다. 결과 : = ''null ''; 끝 If;
withloop, 출구, while및for진술, 당신은 준비 할 수 있습니다 당신의pl/pgsql함수로 일련의 명령을 반복하십시오.
[<<레이블]
고리진술엔드 토토 사이트;
loop무조건 정의 an에 의해 종료 될 때까지 무기한 반복되는 토토 사이트출구또는return진술. 선택적 레이블이 될 수 있습니다 사용출구중첩 진술 어떤 레벨의 중첩이어야하는지 지정하는 토토 사이트 종료.
종료 [ 레이블 ] [언제표현 ];
if no레이블가 제공됩니다 가장 안쪽 토토 사이트가 종료되고 다음은 다음에엔드 토토 사이트다음에 실행됩니다. 만약에레이블가 주어져 있어야합니다 중첩 토토 사이트의 전류 또는 일부 외부 레벨의 레이블 또는 블록. 그런 다음 이름이 지정된 토토 사이트 또는 블록이 종료됩니다 토토 사이트/블록 이후의 명령문과 함께 제어가 계속됩니다 동END.
if언제가 있으며, 토토 사이트 종료 지정된 조건이 참인 경우에만 발생합니다 컨트롤은 이후에 진술로 전달됩니다.출구.
예 :
토토 사이트 - 일부 계산 count 0이면 출구; - 종료 토토 사이트 끝 IF; 엔드 토토 사이트; 고리 - 일부 계산 count 0 일 때 종료; - 이전 예와 동일한 결과입니다 엔드 토토 사이트; 시작하다 - 일부 계산 주식이 100000이면 출구; -- 유효하지 않은; 토토 사이트 외부에서 종료를 사용할 수 없습니다 끝 IF; 끝;
[<<레이블]
하는 동안표현토토 사이트진술엔드 토토 사이트;
thewhile진술 반복 a 조건 표현식만큼 진술 순서 True로 평가합니다. 조건은 각각 직전에 확인됩니다 토토 사이트 바디 입력.
예 :
while Voll_owed 0 및 Gift_certificate_balance 0 토토 사이트 - 여기에 일부 계산 엔드 토토 사이트; Boolean_expression 토토 사이트는 아닙니다 - 여기에 일부 계산 엔드 토토 사이트;
[<<레이블] 을 위한이름in [Reverse]표현 .. 표현loop진술엔드 토토 사이트;
이 형태의for토토 사이트를 만듭니다 그것은 다양한 정수 값을 반복합니다. 변수이름자동으로 정의됩니다 as typeInteger내부에만 존재합니다 토토 사이트. 두 표현은 하단과 상단을 제공합니다 범위의 경계는 토토 사이트에 들어갈 때 한 번 평가됩니다. 반복 단계는 일반적으로 1이지만 -1은입니다.Reverse지정되어 있습니다.
정수의 일부 예for토토 사이트 :
I의 경우 1..10 토토 사이트 - 여기에 일부 계산 통지``나는 %'', i; 엔드 토토 사이트; 반전 10..1 토토 사이트 - 여기에 일부 계산 엔드 토토 사이트;
하한이 상한보다 큰 경우 (또는 에서ReverseCASE), The 토토 사이트 바디는 전혀 실행되지 않습니다. 오류가 발생하지 않습니다.
다른 유형의 사용for토토 사이트, 쿼리 결과를 반복하고 조작 할 수 있습니다. 그 데이터는 그 데이터입니다. 구문은 다음과 같습니다.
[<<레이블]
을 위한Record_or_rowinQuery토토 사이트진술엔드 토토 사이트;
레코드 또는 행 변수는 각 행에 연속적으로 할당됩니다. 쿼리에서 결과 (aselect명령) 및 토토 사이트 본체는 각 행에 실행됩니다. 여기에 있습니다 예:
함수 생성 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;
토토 사이트가 an에 의해 종료 된 경우출구문서, 마지막으로 할당 된 행 값은입니다 토토 사이트 후에도 여전히 액세스 할 수 있습니다.
thefor-in-execute성명서입니다 기록을 반복하는 또 다른 방법 :
[<<레이블]
을 위한Record_or_row실행text_expressionloop진술엔드 토토 사이트;
이것은 소스를 제외하고는 이전 형식과 같습니다select명령문은 a로 지정됩니다 문자열 표현식 입력for토토 사이트. 이것은 허용합니다 미리 계획된 쿼리의 속도 또는 평범한 것과 마찬가지로 동적 쿼리의 유연성execute진술.
참고 :thepl/pgsql현재 파서 두 종류의를 구별합니다.for토토 사이트 (정수 또는 쿼리 결과)를 확인하여 바로 다음에 언급 된 대상 변수for기록 또는 행으로 선언되었습니다 변하기 쉬운. 그렇지 않다면 정수로 추정됩니다for토토 사이트. 이것은 오히려 비 직관적 인 것을 유발할 수 있습니다 예를 들어, 진정한 문제가 이후 변수 이름을 철자했습니다for. 일반적으로 불만은입니다 와 같은 것누락 ".."끝에서 SQL 발현.