PostgreSQL 9.2.24 문서 | ||||
---|---|---|---|---|
PostgreSQL : 문서 : 9.2 : 스포츠 토토 결과 문장 | up | 제 39 장pl/pgsql - SQL절차 언어 | 다음 |
토토 사이트 추천 구조는 아마도 가장 유용 할 것입니다 (및 중요)의 일부pl/pgsql. 와 함께pl/pgsql의 토토 사이트 추천 구조, 당신은 조작 할 수 있습니다PostgreSQL매우 유연한 데이터 강력한 방법.
반환 할 수있는 두 가지 명령이 있습니다. 함수의 데이터 :returnand다음 반환.
return표현;
return표현식 함수를 종료하고 값을 반환합니다표현발신자에게. 이 양식은입니다 사용pl/pgsql함수 세트를 반환하지 않습니다.
스칼라 유형을 반환 할 때 모든 표현식을 사용할 수 있습니다. 표현식의 결과는 자동으로 캐스트됩니다 과제에 대해 설명대로 함수의 리턴 유형. 에게 복합재 (행) 값을 반환하려면 레코드를 작성하거나 행 변수로표현.
출력 매개 변수로 기능을 선언 한 경우 쓰기 단지return표현이없는. 그만큼 출력 매개 변수 변수의 현재 값은 다음과 같습니다 반품.
기능이 반환하도록 선언 한 경우void, areturn진술 기능을 조기에 종료하는 데 사용될 수 있습니다. 그러나 쓰지 마십시오 다음 표현return.
함수의 리턴 값은 정의되지 않은 상태로 남겨질 수 없습니다. 토토 사이트 추천가 최상위 수준 블록의 끝에 도달하는 경우 a를 치지 않고 기능return문, 런타임 오류가 발생합니다. 이 제한이 있습니다 출력 매개 변수 및 함수가있는 함수에는 적용되지 않습니다 반환void. 그 경우 에이return명령문이 자동으로됩니다 최상위 블록이 완료되면 실행되었습니다.
다음 반환표현;
반환 쿼리쿼리;
반환 쿼리 executeCommand-string[사용표현[, ... ]];
apl/pgsql함수 반환으로 선언setofSomegleype, 따라야 할 절차 약간 다릅니다. 이 경우 개별 항목은 반환은의 시퀀스로 지정됩니다.다음 반환또는반환 질문명령, 그리고 최종return인수가없는 명령이 사용됩니다 함수가 실행이 완료되었음을 나타냅니다.다음 반환스칼라와 함께 사용할 수 있습니다 복합 데이터 유형; 복합 결과 유형을 사용하여 전체"테이블"결과가 될 것입니다 반품.return query함수의 결과 세트에 쿼리를 실행 한 결과다음 반환andreturn querya 단일 세트 리턴 기능,이 경우 결과 연결됩니다.
다음 반환andreturn query실제로 돌아 오지 마십시오 기능 - 단순히 단순히 0 이상의 행을 추가합니다. 함수의 결과 세트. 그런 다음 실행은 다음과 함께 계속됩니다 의 진술pl/pgsql함수. 연속다음 반환또는return query명령은입니다 실행 된 결과 세트가 쌓여 있습니다. 최종return15637_15780
return query변형이 있습니다return query execute동적으로 실행될 쿼리를 지정합니다. 매개 변수 표현식은 계산 된 쿼리 문자열에 삽입 될 수 있습니다 을 통해사용와 같은 방식으로 에서execute명령.
출력 매개 변수로 함수를 선언 한 경우 쓰기 단지반환 다음표현이없는. 각 실행에서 출력 매개 변수의 현재 값 변수는 최종 반환을 위해 저장됩니다. 결과. 기능을 반환으로 선언해야합니다Setof Record다수가있을 때 출력 매개 변수 또는setofSomegetype단지 하나가있을 때 유형의 출력 매개 변수SOMENTYPE, 생성하기 위해 출력 매개 변수가있는 설정 설정 기능.
다음을 사용하는 함수의 예는입니다.다음 반환:
테이블 foo (FOOD INT, FOOSUBID int, fooname 텍스트) 만들기; foo 값 (1, 2, 'Three')에 삽입; foo 값 (4, 5, 'Six')에 삽입; function getAllFoo ()가 foo setof foo를 반환합니다 $ body $ 선언하다 r foo%rowtype; 시작하다 r의 r for select * from foo 여기서 fooid 0 고리 - 여기에서 약간의 처리를 할 수 있습니다 다음 r 반환; - 현재 선택의 현재 행을 반환합니다 엔드 토토 사이트 추천; 반품; 끝 $ body $ 언어 plpgsql; getallfoo ();에서 * 선택
참고 :현재의 구현반환 다음and반환 질문반환하기 전에 전체 결과 세트를 저장합니다 위에서 논의한 기능에서. 그것은 IF를 의미합니다 에이pl/pgsql함수 매우 큰 결과 세트를 생성하면 성능이있을 수 있습니다 불쌍한 : 메모리를 피하기 위해 데이터가 디스크에 기록됩니다. 피로이지만 함수 자체가 돌아올 때까지 돌아 오지 않습니다 전체 결과 세트가 생성되었습니다. 미래 의 버전pl/pgsql사용자가 설정 반복 함수를 정의 할 수 있습니다 이 제한이 없습니다. 현재 요점 디스크에 기록되기 시작하는 데이터는 다음으로 제어됩니다. 그만큼work_mem구성 변수. 가지고있는 관리자 더 큰 결과 세트를 메모리에 저장하기에 충분한 메모리 이 매개 변수 증가를 고려해야합니다.
ifandCASE진술을 통해 대안을 실행할 수 있습니다 특정 조건에 따라 명령.pl/pgsql세 가지 형태의if:
if ... then
if ... 그런 다음 ... else
if ... 그런 다음 ... Elsif ... 그런데 ... 또 다른
그리고 두 가지 형태의CASE:
CASE ... 언제 ... 그런데 ... else ... 최종 사례
케이스가 ... 그런 다음 ... Else ... End 사례
if부울-표현the진술종료 if;
if-then진술은입니다 가장 간단한 형태의if. 진술 사이theandEND IF조건이 있으면 실행됩니다 진실. 그렇지 않으면 건너 뜁니다.
예 :
if v_user_id < 0이면 사용자 업데이트는 이메일 = v_email user_id = v_user_id를 설정합니다. 끝 If;
if부울-표현the진술else진술종료 if;
if-then-else진술이 추가if-then다음과 같은 경우 실행 해야하는 대체 진술 세트 조건은 사실이 아닙니다. (여기에는 경우가 포함됩니다 상태는 null로 평가합니다.)
예 :
Parentid가 null 또는 parentid = ''인 경우 = '' 그 다음에 풀 이름을 반환하십시오. 또 다른 hp_true_filename (parentid) ||를 반환합니다 '/'|| 풀 이름; 끝 If;
V_count 0이면 user_count (count) 값 (v_count)에 삽입; 반환 't'; 또 다른 반환 'f'; 끝 If;
if부울-표현the진술[elsif부울-표현the진술[elsif부울-표현the진술 ...]] [else진술 ] 끝 If;
때로는 두 가지 이상의 대안이 있습니다.if-then-elsif편리한 것을 제공합니다 차례로 몇 가지 대안을 확인하는 방법. 그만큼if조건이 테스트됩니다 연속적으로 진실한 첫 번째가 발견 될 때까지. 그 다음에 관련 진술은 실행되며, 그 후 제어됩니다 다음 진술로 전달끝 만약에. (모든 후속if조건은아님테스트.)if조건은 사실입니다.else블록 (있는 경우)이 실행됩니다.
여기 예입니다.
숫자 = 0이면 결과 : = 'Zero'; Elsif 번호 0 결과 : = '긍정적'; Elsif 번호 <0 결과 : = '부정'; 또 다른 - 흠, 유일한 다른 가능성은 숫자가 null이라는 것입니다. 결과 : = 'null'; 끝 If;
키워드elsif철자elseif.
동일한 작업을 수행하는 대체 방법은 둥지if-then-else다음 예 :
demo_row.sex = 'm'이면 pretty_sex : = 'man'; 또 다른 demo_row.sex = 'f'라는 경우 pretty_sex : = '여자'; 끝 IF; 끝 If;
그러나이 방법은 일치하는 것을 작성해야합니다종료 if각각if, 사용하는 것보다 훨씬 번거 롭습니다elsif많은 경우 대안.
CASESearch-Expressionwhen표현[, 표현[ ... ]] 그런 다음진술[언제표현[, 표현[ ... ]] 그런 다음진술 ... ] [else진술 ] 최종 사례;
간단한 형태의CASE제공 피연산자의 평등을 기반으로 한 조건부 실행. 그만큼Search-ExpressionIS 평가 (한 번) 및 각에 비해 연속적으로표현inwhen조항. 일치가 발견되면 동진술are 실행 된 다음 컨트롤이 다음 진술로 전달됩니다.최종 사례. (후속when표현은 평가되지 않습니다.) 아니오 일치가 발견되었습니다.else 진술실행됩니다. 하지만 ifelse존재하지 않으면 Acase_not_found예외입니다 높은.
다음은 간단한 예입니다.
케이스 x 그때 1, 2 msg : = '하나 또는 둘'; 또 다른 MSG : = '하나 또는 두 이외의 기타 값'; 최종 사례;
케이스 언제부울-표현the진술[언제부울-표현the진술 ... ] [else진술 ] 최종 사례;
검색 된 형태의CASE부울의 진실을 기반으로 조건부 실행을 제공합니다 표현. 각언제절부울-표현is 차례로 평가, 수율이 발견 될 때까지true. 그러면 해당진술실행됩니다 컨트롤이 다음 진술로 전달됩니다최종 사례. (후속언제표현이 평가되지 않습니다.) NO 진정한 결과가 발견됩니다.else 진술실행됩니다. 하지만 만약에else존재하지 않으면 Acase_not_found예외입니다 높은.
예는 다음과 같습니다.
케이스 x가 0에서 10 사이에있을 때 msg : = '값은 0과 10 사이입니다. 11에서 20 사이의 x MSG : = '값은 11 ~ 20 사이입니다. 최종 사례;
이 형태의CASE전적으로입니다 동등한if-then-Elsif생략 된 규칙의 경우else조항은 오류가 아닌 오류가 발생합니다 아무것도하지 않는다.
withloop, 출구, 계속, while, for, 그리고foreach진술 당신의 준비pl/pgsql일련의 명령을 반복하는 기능.
[ <<레이블 ] 고리진술엔드 토토 사이트 추천 [ 레이블 ];
loop무조건 정의 an에 의해 종료 될 때까지 무기한 반복되는 토토 사이트 추천출구또는return진술. 선택 사항레이블출구and계속중첩 토토 사이트 추천 내의 명령문은 토토 사이트 추천를 지정합니다 진술을 참조하십시오.
출구 [ 레이블 ] [언제부울-표현 ];
NO레이블가 제공됩니다 가장 안쪽 토토 사이트 추천가 종료되고 다음은 다음에엔드 토토 사이트 추천다음에 실행됩니다. 만약에레이블가 주어져 있어야합니다 중첩 토토 사이트 추천의 전류 또는 일부 외부 레벨의 레이블 또는 블록. 그런 다음 이름이 지정된 토토 사이트 추천 또는 블록이 종료됩니다 토토 사이트 추천/블록 이후의 명령문과 함께 제어가 계속됩니다 동END.
ifwhen토토 사이트 추천가 지정되어 있습니다 종료는에만 발생합니다.부울-발현사실입니다. 그렇지 않으면, 컨트롤은 이후에 진술로 전달됩니다.출구.
출구모든 유형과 함께 사용할 수 있습니다 토토 사이트 추천; 무조건적인 사용에만 국한되지 않습니다 토토 사이트 추천.
a시작블록,출구다음을 통제합니다 블록 끝 이후 진술. 라벨은해야합니다 이 목적으로 사용됩니다. unlabelled출구A와 일치하는 것으로 간주되지 않습니다시작블록. (이것은 8.4 이전의 변화입니다 릴리스PostgreSQL, unlabelled를 허용 할 것입니다출구일치하려면시작블록.)
예 :
토토 사이트 추천 - 일부 계산 count 0이면 출구; - 종료 토토 사이트 추천 끝 IF; 엔드 토토 사이트 추천; 고리 - 일부 계산 count 0 일 때 종료; - 이전 예와 동일한 결과입니다 엔드 토토 사이트 추천; << ablock 시작하다 - 일부 계산 주식이 100000이면 자제 종료; - 시작 블록에서 종료됩니다 끝 IF; - 여기에 계산은 주식 100000시를 건너 뛸 것입니다. 끝;
계속 [ 레이블 ] [언제부울-표현 ];
그렇지 않은 경우레이블가 제공됩니다 가장 안쪽 토토 사이트 추천의 다음 반복이 시작됩니다. 즉, 모두입니다 토토 사이트 추천 본체에 남아있는 진술은 건너 뜁니다 컨트롤은 토토 사이트 추천 제어 표현식 (있는 경우)으로 돌아갑니다. 다른 토토 사이트 추천 반복이 필요한지 확인하십시오. 만약에레이블존재합니다 실행이 될 토토 사이트 추천의 레이블을 지정합니다. 계속되는.
if언제다음은 지정되어 있습니다 토토 사이트 추천 반복은에만 시작됩니다부울-표현사실입니다. 그렇지 않으면, 컨트롤은 이후에 진술로 전달됩니다.계속.
계속모두와 함께 사용할 수 있습니다 토토 사이트 추천의 유형; 무조건적인 사용에만 국한되지 않습니다 토토 사이트 추천.
예 :
토토 사이트 추천 - 일부 계산 카운트 100의 경우 종료; 카운트 <50을 계속하면 계속하십시오. - [50 .. 100]의 카운트 계산에 대한 일부 계산 엔드 토토 사이트 추천;
[ <<레이블 ] 하는 동안부울-표현토토 사이트 추천진술엔드 토토 사이트 추천 [ 레이블 ];
thewhile진술 반복 a 만큼 진술 순서부울-표현true로 평가합니다. 표현식은 토토 사이트 추천에 각 입력 직전에 확인됩니다. 몸.
예 :
while Voll_owed 0 및 Gift_certificate_balance 0 토토 사이트 추천 - 여기에 일부 계산 엔드 토토 사이트 추천; 토토 사이트 추천가 완료되지 않은 동안 - 여기에 일부 계산 엔드 토토 사이트 추천;
[ <<레이블 ] 을 위한이름in [Reverse]표현 .. 표현[by표현 ] loop진술엔드 토토 사이트 추천 [ 레이블 ];
이 형태의for토토 사이트 추천를 만듭니다 그것은 다양한 정수 값을 반복합니다. 변수이름자동으로 정의됩니다 as type정수내부에만 존재합니다 토토 사이트 추천 (변수 이름의 기존 정의는 토토 사이트 추천 내에서 무시). 두 가지 표현이 제공됩니다 범위의 하부 및 상한은 토토 사이트 추천에 들어갑니다. 인 경우by절 반복 단계는 1입니다. 그렇지 않으면 에 지정된 값by절, 토토 사이트 추천 항목에서 다시 한 번 평가됩니다. 만약에Reverse지정된 다음 단계 값입니다 각 반복 후 추가되지 않고 빼기.
정수의 일부 예for토토 사이트 추천 :
I의 경우 1..10 토토 사이트 추천 - 토토 사이트 추천 내에서 1,2,3,4,5,6,7,8,9,10 값을 취할 것입니다. 엔드 토토 사이트 추천; 반전 10..1 토토 사이트 추천 - 토토 사이트 추천 내에서 10,9,8,7,6,5,4,3,2,1 값을 취할 것입니다. 엔드 토토 사이트 추천; 반전 10..1 x 2 토토 사이트 추천 - 토토 사이트 추천 내에서 10,8,6,4,2 값을 맡을 것입니다. 엔드 토토 사이트 추천;
하한이 상한보다 큰 경우 (또는 에서Reversecase), the 토토 사이트 추천 바디는 전혀 실행되지 않습니다. 오류가 발생하지 않습니다.
if a레이블그만큼for토토 사이트 추천 다음 정수 토토 사이트 추천 변수는 자격을 갖춘 이름으로 참조 할 수 있습니다.레이블.
다른 유형의 사용for토토 사이트 추천, 쿼리 결과를 반복하고 조작 할 수 있습니다. 그 데이터는 그 데이터입니다. 구문은 다음과 같습니다.
[ <<레이블 ] 을 위한대상in쿼리loop진술엔드 토토 사이트 추천 [ 레이블 ];
the대상는 기록입니다 변수, 행 변수 또는 쉼표로 구분 된 스칼라 목록 변수. 그만큼대상IS 에서 발생하는 각 행을 연속적으로 할당했습니다.쿼리그리고 토토 사이트 추천 본체가 실행됩니다 각 행. 예는 다음과 같습니다.
함수 생성 cs_refresh_mviews ()는 정수를 $$로 반환합니다 선언하다 mviews 레코드; 시작하다 '상쾌한 구체화 된 견해 ...'; SELECT *의 MVIEWS의 경우 CS_MATERIALIZED_VIEWS ORDER의 SORT_KEY LOOP 주문 - 이제 "mviews"는 cs_materialized_views의 한 레코드를 가지고 있습니다 '상쾌한 구체화 된보기 %s ...', quote_ident (mviews.mv_name); '잘린 테이블'||를 실행하십시오 quote_ident (mviews.mv_name); '삽입'실행 || quote_ident (mviews.mv_name) || '' '' || mviews.mv_query; 엔드 토토 사이트 추천; '상쾌한 구체화 된 견해를 수행했습니다.'; 반환 1; 끝; $$ 언어 plpgsql;
토토 사이트 추천가 an에 의해 종료 된 경우출구문서, 마지막 지정된 행 값은입니다 토토 사이트 추천 후에도 여전히 액세스 할 수 있습니다.
the쿼리이 유형에서 사용됩니다 의for명령문은 모든 SQL 일 수 있습니다 발신자에게 행을 반환하는 명령 :select가 가장 일반적인 경우이지만 당신도 할 수도 있습니다 사용삽입, 업데이트또는삭제에이반환절. 일부 유틸리티 와 같은 명령설명작동합니다 도.
PL/PGSQL변수는입니다 쿼리 텍스트로 대체되고 쿼리 계획이 캐시됩니다. 가능한 재사용을 위해섹션 39.10.1및섹션 39.10.2.
thefor-in-execute성명서입니다 오버 행을 반복하는 또 다른 방법 :
[ <<레이블 ] 을 위한대상executetext_expression[사용표현[, ... ]] loop진술엔드 토토 사이트 추천 [ 레이블 ];
이것은 소스 쿼리를 제외하고는 이전 형식과 같습니다. 문자열 표현식으로 지정되며, 이는 평가되고 각 항목에 대한 대체for토토 사이트 추천. 이것은 프로그래머가 속도를 선택할 수있게합니다. 사전 계획된 쿼리 또는 동적 쿼리의 유연성 평범한execute진술. 처럼 와 함께execute, 매개 변수 값이 될 수 있습니다 동적 명령에 삽입사용.
결과가 필요한 쿼리를 지정하는 또 다른 방법 반복은 커서로 선언하는 것입니다. 이것은 설명섹션 39.7.4.
theforeach토토 사이트 추천는 A와 매우 흡사합니다for반복 대신 토토 사이트 추천 SQL 쿼리로 반환 된 행을 통해 배열 값의 요소. (일반적으로foreach는 구성 요소를 통한 반복을위한 것입니다 복합 값 표현의; 루핑을위한 변형 배열 이외의 복합재는 향후에 추가 될 수 있습니다.)foreach배열은 :
[ <<레이블 ] foreach대상[슬라이스번호 ] 배열표현loop진술엔드 토토 사이트 추천 [ 레이블 ];
없음슬라이스또는 if슬라이스 0지정되어 토토 사이트 추천가 반복됩니다 평가하여 생성 된 배열의 개별 요소표현. 그만큼대상변수는 각 요소가 할당됩니다 순서대로 값과 토토 사이트 추천 본체가 각각에 대해 실행됩니다. 요소. 다음은 정수 배열 :
함수 SUM 작성 (int [])는 int8을 $$로 반환합니다 선언하다 s int8 : = 0; x int; 시작하다 배열 $ 1의 Foreach X 고리 S : = S + X; 엔드 토토 사이트 추천; 반환 s; 끝; $$ 언어 plpgsql;
요소는 배열 치수 수. 비록대상보통 단일 변수 일뿐입니다. 배열을 통해 반복 할 때 변수 목록이 될 수 있습니다. 복합 값 (레코드). 이 경우 각 배열에 대해 요소, 변수는 연속적인 열에서 할당됩니다 복합 가치.
긍정적 인슬라이스value,foreach슬라이스를 통해 반복합니다 단일 요소가 아닌 배열. 그만큼슬라이스값은 정수 상수 여야합니다 배열의 치수 수보다 큽니다. 그만큼대상변수는 an이어야합니다 배열 및 배열 값의 연속 조각을 받고, 각 슬라이스는에 의해 지정된 치수 수입니다.슬라이스. 반복의 예는 다음과 같습니다 1 차원 슬라이스를 통해 :
함수 생성 Scan_rows (int [])는 void를 $$로 반환합니다 선언하다 x int []; 시작하다 배열 $ 1의 Foreach X Slice 1 고리 통지 '행 = %', x; 엔드 토토 사이트 추천; 끝; $$ 언어 plpgsql; Select Scan_rows (배열 [[1,2,3], [4,5,6], [7,8,9], [10,11,12]]); 통지 : Row = 1,2,3
기본적으로 A에서 발생하는 오류pl/pgsql함수는 실행을 중단합니다 기능 및 실제로 주변 거래의 기능. a를 사용하여 오류를 가두고 복구 할 수 있습니다.시작예외절. 구문은 연장입니다 a에 대한 일반 구문시작블록 :
[ <<레이블 ] [선언선언 ] 시작하다진술예외 언제조건[또는조건 ... ] 그런 다음handler_statements[언제조건[또는조건 ... ] 그런 다음handler_statements ... ] 끝;
오류가 발생하지 않으면이 형태의 블록은 단순히 모든 것을 실행합니다. 그만큼진술컨트롤이 다음 진술로 전달됩니다END. 그러나 내에서 오류가 발생하면진술, 추가 처리 의진술버려졌습니다. 그리고 토토 사이트 추천는로 전달됩니다.예외목록. 목록은 첫 번째를 검색합니다조건오류와 일치합니다 발생했습니다. 일치가 발견되면 해당handler_statements실행 된 다음 컨트롤이 다음 진술로 전달됩니다END. 일치하지 않으면 오류가 전파됩니다 마치 마치 마치예외절 전혀 없었다 : 오류는 둘러싸여 블록예외없음 기능의 처리를 중단합니다.
the조건이름이 될 수 있습니다 에 표시된 사람 중 하나토토 핫 : 문서 : 9.2 : 토토 핫 오류 토토 핫. 카테고리 이름은 해당 범주 내에서 오류와 일치합니다. 특별 조건 이름기타을 제외한 모든 오류 유형과 일치합니다.query_canceled. (가능하지만 종종 현명히, 함정query_canceledby 이름.) 조건 이름은 대소 문자에 민감하지 않습니다. 또한 오류 조건은에 의해 지정할 수 있습니다.sqlstate코드; 예를 들어, 이것들은 동일합니다 :
say division_by_zero 당시 ... sqlstate '22012'때 ...
선택한 내에서 새 오류가 발생하는 경우handler_statements, 잡을 수 없습니다 이것으로예외조항 전파. 주변예외조항을 잡을 수 있습니다.
오류가 AN에 의해 잡히면예외조항,의 로컬 변수pl/pgsql함수는 그대로 유지됩니다 오류가 발생했을 때였지만 모든 변경 블록 내의 영구 데이터베이스 상태가 롤백됩니다. 처럼 예를 들어이 조각을 고려하십시오 :
mytab에 삽입 (FirstName, lastName) 값 ( 'Tom', 'Jones'); 시작하다 mytab set firstName = 'joe'여기서 lastName = 'Jones'; x : = x + 1; Y : = x / 0; 예외 Division_by_zero가있을 때 'Caught Division_by_Zero'를 통지하십시오. 반환 x; 끝;
토토 사이트 추천가 할당에 도달하는 경우y, A로 실패합니다.division_by_zero오류. 이것은 잡힐 것입니다 그만큼예외절. 가치 에 반환return성명서 의 증분 값이 되십시오x의 효과업데이트명령 롤백되었습니다. 그만큼삽입블록 앞의 명령은 롤백되지 않으므로 최종 결과 데이터베이스에 포함된다는 것입니다.Tom JonesnotJoe 존스.
팁 :an을 포함하는 블록예외절은 훨씬 더 많습니다 블록이없는 블록보다 들어가서 나가는 데 비용이 많이 듭니다. 따라서 사용하지 마십시오예외필요없이.
예 39-2. 예외업데이트/삽입
이 예제는 예외 처리를 사용하여 하나를 수행합니다업데이트또는삽입, 적절하게 :
테이블 DB 생성 (int 기본 키, b 텍스트); 함수 생성 merge_db (key int, data text)는 void를 반환합니다 $$ 시작하다 고리 - 먼저 키를 업데이트하십시오 DB SET B = 데이터를 업데이트합니다. 여기서 a = 키; 그럼 발견된다면 반품; 끝 IF; - 거기에 있지 않으므로 키를 삽입하십시오 - 다른 사람이 동시에 같은 키를 동시에 삽입하면 -우리는 독특한 키 실패를 얻을 수 있습니다 시작하다 db (a, b) 값 (키, 데이터)에 삽입; 반품; 그때 고유 한 예외 - 아무것도하지 않고 업데이트를 다시 시도하려면 토토 사이트 추천하십시오. 끝; 엔드 토토 사이트 추천; 끝; $$ 언어 plpgsql; merge_db (1, 'david')를 선택하십시오. merge_db (1, 'dennis')를 선택하십시오.
이 코딩은를 가정합니다.고유 _violation오류는에 의해 발생합니다.삽입삽입테이블. 둘 이상이 있으면 잘못 행동 할 수도 있습니다. 테이블의 고유 인덱스는 작업을 재 시도하기 때문입니다. 어떤 인덱스가 오류를 일으켰는지에 관계없이. 더 많은 안전이있을 수 있습니다 다음에 논의 된 기능을 사용하여 갇힌 오류가 예상되었습니다.
예외 처리기는 자주 식별해야합니다 발생한 특정 오류. 얻는 방법에는 두 가지가 있습니다 현재 예외에 대한 정보pl/pgsql: 특수 변수 및스택 진단 받기명령.
예외 핸들러 내에서 특수 변수SQLSTATE오류 코드를 포함합니다 이는 제기 된 예외에 해당합니다 (참조표 A-1가능한 오류 코드 목록의 경우). 특별 변수sqlerrm오류 메시지를 포함합니다 예외와 관련이 있습니다. 이러한 변수는 정의되지 않았습니다 외부 예외 처리기.
예외 핸들러 내에서 검색 할 수도 있습니다 를 사용하여 현재 예외에 대한 정보스택 진단 받기명령, 양식이 있습니다 :
스택 진단 받기가변=항목[ , ... ];
각항목는 핵심 단어입니다 지정된 상태에 할당 할 상태 값 식별 변수 (수신하기에 적합한 데이터 유형이어야합니다. 그것). 현재 사용 가능한 상태 항목은에 표시됩니다.표 39-1.
표 39-1. 오류 진단 값
이름 | 타입 | 설명 |
---|---|---|
returned_sqlstate | 텍스트 | 예외의 SQLSTATE 오류 코드 |
Message_Text | 텍스트 | 예외의 기본 메시지 텍스트 |
pg_exception_detail | 텍스트 | 예외 세부 메시지의 텍스트 if 어느 |
pg_exception_hint | 텍스트 | 예외 힌트 메시지의 텍스트입니다 어느 |
pg_exception_context | 텍스트 | 통화 스택을 설명하는 텍스트의 줄 |
예외가 항목에 대한 값을 설정하지 않은 경우, 빈 문자열이 반환됩니다.
여기 예입니다.
선언 text_var1 텍스트; text_var2 텍스트; text_var3 텍스트; 시작하다 - 예외가 발생할 수있는 일부 처리 ... 다른 사람들이 예외 스택 진단 받기 텍스트 _var1 = message_text, text_var2 = pg_exception_detail, text_var3 = pg_exception_hint; 끝;