| PostgreSQL 9.1.24 문서 | ||||
|---|---|---|---|---|
| PostgreSQL : 문서 : 9.1 : 토토 사이트 추천 문장 | 위로 | 39장.PL/pgSQL - SQL절차적 언어 | 다음 | |
토토 사이트 추천 구조는 아마도 가장 유용할 것입니다(그리고 중요) 일부PL/pgSQL. 와 함께PL/pgSQL의 통제 구조를 조작할 수 있습니다.포스트그레SQL매우 유연하고 강력한 방법입니다.
귀하가 복귀할 수 있는 두 가지 명령이 있습니다 함수의 데이터:반환그리고다음으로 돌아가기.
반환표현;
반환표현식 포함 함수를 종료하고 값을 반환합니다.표현발신자에게. 이 양식은 에 사용됨PL/pgSQL함수 세트를 반환하지 않습니다.
스칼라 유형을 반환할 때 모든 표현식을 사용할 수 있습니다. 표현식의 결과는 자동으로 할당에 대해 설명한 함수의 반환 유형입니다. 받는 사람 복합(행) 값을 반환하려면 레코드를 작성해야 합니다. 행 변수를표현.
출력 매개변수를 사용하여 함수를 선언한 경우 다음을 작성하십시오. 그냥반환표현이 없습니다. 는 출력 매개변수 변수의 현재 값은 다음과 같습니다. 돌아왔습니다.
반환할 함수를 선언한 경우공허, 아반환문장 기능을 일찍 종료하는 데 사용할 수 있습니다. 하지만 쓰지 마세요 다음 표현반환.
함수의 반환 값은 정의되지 않은 상태로 둘 수 없습니다. 제어권이 최상위 블록의 끝에 도달한 경우 a를 누르지 않고 함수를 작동합니다.반환문을 작성하면 런타임 오류가 발생합니다. 이 제한은 출력 매개변수가 있는 함수 및 함수에는 적용되지 않음 돌아오는 중공허13328_13364반환문은 자동으로 최상위 블록이 완료되면 실행됩니다.
다음으로 돌아가기표현;
반환 쿼리질의;
쿼리 실행 반환명령어-문자열 [사용 중표현 [, ... ] ];
때PL/pgSQL함수 복귀가 선언되었습니다SETOF어떤 유형, 따라야 할 절차 약간 다릅니다. 이 경우 개별 항목은 반환은의 시퀀스로 지정됩니다.다음으로 돌아가기또는반환 쿼리명령, 그리고 마지막반환인수가 없는 명령은 다음과 같이 사용됩니다. 함수 실행이 완료되었음을 나타냅니다.다음으로 돌아가기스칼라 및 복합 데이터 유형; 복합 결과 유형, 전체"테이블"결과 중 돌아왔습니다.반환 쿼리다음을 추가합니다 함수의 결과 세트에 대한 쿼리를 실행한 결과입니다.다음으로 돌아가기그리고반환 쿼리자유롭게 혼합될 수 있습니다. 단일 집합 반환 함수(이 경우 결과) 연결됩니다.
다음으로 돌아가기그리고반환 쿼리실제로는 에서 돌아오지 않습니다. 함수 - 단순히 0개 이상의 행을 추가합니다. 함수의 결과 세트. 그런 다음 실행은 다음으로 계속됩니다. 의 진술PL/pgSQL함수. 연속적으로다음으로 돌아가기또는반환 쿼리명령은 다음과 같습니다 실행되면 결과 세트가 구축됩니다. 결승전반환15671_15814
반환 쿼리변형 있음반환 쿼리 실행, 동적으로 실행될 쿼리를 지정합니다. 매개변수 계산된 쿼리 문자열에 표현식을 삽입할 수 있습니다. 를 통해사용 중, 마찬가지로 에서실행명령.
출력 매개변수를 사용하여 함수를 선언한 경우 다음을 작성하십시오. 그냥다음으로 돌아가기표현이 없습니다. 각 실행에서 출력 매개변수의 현재 값 변수는 최종 반환을 위해 다음 행으로 저장됩니다. 결과. 함수를 반환하도록 선언해야 합니다.SETOF 레코드여러 개가 있는 경우 출력 매개변수 또는SETOF어떤 유형단 하나뿐인 경우 유형의 출력 매개변수어떤 종류, 출력 매개변수가 있는 설정 반환 함수입니다.
다음은 다음을 사용하는 함수의 예입니다.다음으로 돌아가기:
CREATE TABLE foo(foid INT, foosubid INT, fooname TEXT);
INSERT INTO foo VALUES (1, 2, '3');
foo 값에 삽입(4, 5, '6');
함수 생성 또는 교체 getAllFoo()는 SETOF foo를 AS로 반환합니다.
$BODY$
선언
r foo%행유형;
시작
FOR r IN SELECT * FROM foo
fooid 0인 곳
토토 사이트 추천
-- 여기에서 일부 처리를 수행할 수 있습니다.
다음으로 돌아가기 r; -- SELECT의 현재 행을 반환합니다.
엔드 토토 사이트 추천;
반환;
종료
$BODY$
언어 'plpgsql' ;
SELECT * FROM getallfoo();
참고:현재 구현다음으로 돌아가기그리고반환 쿼리반환하기 전에 전체 결과 세트를 저장합니다. 위에서 논의한 것처럼 함수에서. 즉, 만약 에PL/pgSQL함수 매우 큰 결과 세트를 생성하므로 성능이 저하될 수 있습니다. 나쁨: 메모리를 피하기 위해 데이터가 디스크에 기록됩니다. 소모되지만 함수 자체는 다음까지 반환되지 않습니다. 전체 결과 세트가 생성되었습니다. 미래 버전PL/pgSQL사용자는 다음과 같은 집합 반환 함수를 정의할 수 있습니다. 이 제한이 없습니다. 현재 시점은 디스크에 쓰기 시작하는 데이터는 다음에 의해 제어됩니다.work_mem구성 변수. 다음을 보유한 관리자 더 큰 결과 세트를 메모리에 저장하기에 충분한 메모리 이 매개변수를 늘리는 것을 고려해야 합니다.
IF그리고사례문을 사용하면 대안을 실행할 수 있습니다. 특정 조건에 따른 명령입니다.PL/pgSQL세 가지 형태의가 있습니다.IF:
만약 ... 그렇다면
IF ... 그렇다면 ... ELSE
만약 ... 그렇다면 ... ELSIF ... 그렇다면 ... 그 외
그리고 두 가지 형태의사례:
사례 ... 언제 ... 그때 ... ELSE ... 종료 사례
케이스 WHEN ... THEN ... ELSE ... 끝 사례
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지정할 수 있게 하여 다음과 같은 경우 실행되어야 하는 대체 명령문 세트 조건이 사실이 아닙니다. (여기에는 다음과 같은 경우도 포함됩니다. 조건은 NULL로 평가됩니다.)
예:
IF parentid가 NULL이거나 parentid = ''
그런 다음
RETURN 전체 이름;
그 외
RETURN hp_true_filename(부모 ID) || '/' || 성명;
종료하면;
IF v_count 0 THEN
INSERT INTO users_count(개수) VALUES(v_count);
't'를 반환합니다.
그 외
'f'를 반환합니다.
종료하면;
IF부울 표현식그때문장 [ELSIF부울 표현식그때문장 [ELSIF부울 표현식그때문장 ...]] [ELSE문장 ] 종료하면;
때때로 두 가지 이상의 대안이 있는 경우도 있습니다.IF-THEN-ELSIF편리한 여러 대안을 차례로 확인하는 방법.IF조건이 테스트되었습니다. 첫 번째 참이 발견될 때까지 연속적으로. 그런 다음 연관된 명령문이 실행된 후 제어가 수행됩니다. 다음 명령문으로 전달됩니다.END 만약에. (모든 후속IF조건은아님테스트했습니다.) 다음 중 어느 것도 해당되지 않는 경우IF조건이 참이면ELSE블록(있는 경우)이 실행됩니다.
다음은 예입니다:
IF 숫자 = 0 THEN
결과 := '0';
ELSIF 번호 0 THEN
결과 := '긍정적';
ELSIF 숫자 < 0 THEN
결과 := '부정';
그 외
-- 흠, 유일한 다른 가능성은 숫자가 null이라는 것입니다.
결과 := 'NULL';
종료하면;
핵심 단어ELSIF또한 가능합니다 철자ELSEIF.
동일한 작업을 수행하는 또 다른 방법은 다음과 같습니다. 둥지IF-THEN-ELSE문, 다음과 같습니다. 다음 예:
IF deco_row.sex = 'm' THEN
Pretty_sex := '남자';
그 외
IF deco_row.sex = 'f' 그러면
Pretty_sex := '여자';
종료하면;
종료하면;
그러나 이 방법은 일치하는 항목을 작성해야 합니다.END IF각각IF이므로 를 사용하는 것보다 훨씬 번거롭습니다.ELSIF많을 때 대안.
사례검색 표현언제표현 [, 표현 [ ... ]] 그러면문장 [언제표현 [, 표현 [ ... ]] 그럼문장 ... ] [ELSE문장 ] 종료 사례;
간단한 형식사례제공 피연산자의 동일성을 기반으로 한 조건부 실행.검색 표현이다 평가(한 번)하고 각각에 대해 연속적으로 비교함표현에서언제절. 일치하는 항목이 발견되면 해당문장있습니다 실행된 후 제어는 다음 명령문으로 전달됩니다.END CASE. (다음에)언제표현식은 평가되지 않습니다.) 그렇지 않은 경우 일치하는 항목이 발견되었습니다.ELSE 문장실행됩니다. 하지만 만약에ELSE존재하지 않는 경우 aCASE_NOT_FOUND예외는 다음과 같습니다. 제기되었습니다.
다음은 간단한 예입니다:
사례 x
1, 2일 때
msg := '하나 또는 둘';
그 외
msg := '1 또는 2 이외의 값';
종료 사례;
사례
언제부울 표현식그때문장
[언제부울 표현식그때문장
... ]
[ELSE문장 ]
종료 사례;
검색된 형태사례부울의 진리를 기반으로 조건부 실행을 제공합니다. 표현. 각각언제절의부울 표현식이다 결과가 나올 때까지 차례로 평가됩니다.참. 그러면 해당문장실행된 다음 제어는 다음 명령문으로 전달됩니다.END CASE. (다음에)언제표현식은 평가되지 않습니다.) 그렇지 않은 경우 true 결과가 발견되면,ELSE 문장실행됩니다. 하지만 만일ELSE존재하지 않는 경우 aCASE_NOT_FOUND예외는 다음과 같습니다. 제기되었습니다.
다음은 예입니다:
사례
WHEN x 0과 10 사이 THEN
msg := '값은 0과 10 사이입니다.';
언제 x 11시와 20시 사이
msg := '값은 11에서 20 사이입니다';
종료 사례;
이 형태는사례완전히 에 해당함IF-THEN-ELSIF, 제외 생략된 규칙에 도달하는 경우ELSE절이 아닌 오류를 발생시킵니다. 아무것도 안 하고.
와 함께토토 사이트 추천, 종료, 계속, 동안, for, 그리고FOREACH문장, 당신은 할 수 있습니다 당신을 위해 준비하십시오PL/pgSQL일련의 명령을 반복하는 함수입니다.
[ <<라벨 ] 토토 사이트 추천문장END 토토 사이트 추천 [ 라벨 ];
토토 사이트 추천무조건을 정의합니다. 에 의해 종료될 때까지 무한 반복되는 토토 사이트 추천종료또는반환문. 선택사항라벨사용할 수 있는 대상종료그리고계속중첩 토토 사이트 추천 내의 명령문을 사용하여 어떤 토토 사이트 추천를 지정하는지 진술을 참조하십시오.
종료 [ 라벨 ] [언제부울 표현식 ];
아니면라벨이 주어지면 가장 안쪽 토토 사이트 추천가 종료되고 다음 명령문이 나옵니다.END LOOP다음에 실행됩니다. 만일라벨주어진 것이어야 합니다. 현재 또는 중첩 토토 사이트 추천의 외부 수준의 레이블 또는 차단. 그런 다음 명명된 토토 사이트 추천나 블록이 종료되고 토토 사이트 추천/블록 다음의 명령문으로 제어가 계속됩니다. 해당END.
만약언제이 지정되면 토토 사이트 추천가 종료는 다음 경우에만 발생합니다.부울 표현식사실입니다. 그렇지 않으면, 제어는 다음 명령문으로 전달됩니다.종료.
종료모든 유형에 사용할 수 있습니다. 토토 사이트 추천; 무조건적으로 사용하도록 제한되지는 않습니다. 토토 사이트 추천.
a와 함께 사용하는 경우시작차단,종료제어권을 다음으로 넘김 블록 끝 이후의 명령문. 라벨은 다음과 같아야 합니다. 이 목적으로 사용됩니다. 라벨이 없는종료a와 일치하는 것으로 간주되지 않습니다.시작차단. (이것은 8.4 이전의 변경 사항입니다. 릴리스포스트그레SQL, 라벨이 지정되지 않은종료a와 일치시키다시작차단합니다.)
예:
토토 사이트 추천
-- 일부 계산
IF 개수 0 그러면
종료; -- 토토 사이트 추천 종료
종료하면;
엔드 토토 사이트 추천;
토토 사이트 추천
-- 일부 계산
개수 0일 때 종료합니다. -- 이전 예제와 동일한 결과
엔드 토토 사이트 추천;
<<차단
시작
-- 일부 계산
IF 주식 100000 THEN
EXIT 블록; -- BEGIN 블록을 종료합니다.
종료하면;
-- 주식 100000인 경우 여기 계산은 건너뜁니다.
끝;
계속 [ 라벨 ] [언제부울 표현식 ];
아니면라벨주어지면, 가장 안쪽 토토 사이트 추천의 다음 반복이 시작됩니다. 즉, 모두 토토 사이트 추천 본문에 남아 있는 명령문은 건너뜁니다. 제어는 토토 사이트 추천 제어 표현식(있는 경우)으로 돌아가서 또 다른 토토 사이트 추천 반복이 필요한지 여부를 결정합니다. 만일라벨존재합니다. 실행될 토토 사이트 추천의 레이블을 지정합니다. 계속됩니다.
만약언제이 지정되면 다음 토토 사이트 추천 반복은 다음과 같은 경우에만 시작됩니다.부울 표현식사실입니다. 그렇지 않으면, 제어는 다음 명령문으로 전달됩니다.계속.
계속모두와 함께 사용할 수 있습니다. 토토 사이트 추천 유형; 무조건적으로 사용하도록 제한되지는 않습니다. 토토 사이트 추천.
예:
토토 사이트 추천
-- 일부 계산
개수가 100보다 크면 종료합니다.
개수가 50 미만일 때 계속하세요.
-- 개수 IN [50 .. 100]에 대한 일부 계산
끝 토토 사이트 추천;
[ <<라벨 ] 동안부울 표현식토토 사이트 추천문장END 토토 사이트 추천 [ 라벨 ];
그동안문은 다음을 반복합니다.부울 표현식참으로 평가됩니다. 토토 사이트 추천의 각 항목 직전에 표현식이 검사됩니다. 몸.
예:
채무 금액 0 AND 선물_증명서 잔고 0 LOOP인 동안
-- 여기에 몇 가지 계산이 있습니다.
엔드 토토 사이트 추천;
토토 사이트 추천가 완료되지 않은 동안
-- 여기에 몇 가지 계산이 있습니다.
끝 토토 사이트 추천;
[ <<라벨 ] 에 대한이름IN [반전] 표현 .. 표현 [BY표현 ] 토토 사이트 추천문장END 토토 사이트 추천 [ 라벨 ];
이 형태는for토토 사이트 추천를 생성합니다 이는 정수 값의 범위를 반복합니다. 변수이름자동으로 정의됩니다. 유형으로정수그리고 내부에만 존재합니다 토토 사이트 추천(변수 이름의 기존 정의는 토토 사이트 추천 내에서는 무시됩니다). 다음을 제공하는 두 가지 표현 범위의 하한과 상한은 다음과 같은 경우에 한 번 평가됩니다. 토토 사이트 추천에 들어갑니다. 만약BY절 지정되지 않으면 반복 단계는 1입니다. 그렇지 않으면 에 지정된 값BY절, 이는 토토 사이트 추천 항목에서 한 번 다시 평가됩니다. 만일반전이 지정되면 단계 값은 다음과 같습니다. 각 반복 후에 추가하는 대신 뺍니다.
정수의 몇 가지 예for토토 사이트 추천:
i IN 1..10 토토 사이트 추천용
-- 토토 사이트 추천 내에서 1,2,3,4,5,6,7,8,9,10 값을 사용하겠습니다.
엔드 토토 사이트 추천;
역방향 10..1 토토 사이트 추천의 i용
-- 토토 사이트 추천 내에서 10,9,8,7,6,5,4,3,2,1 값을 사용하겠습니다.
엔드 토토 사이트 추천;
i에 대한 역방향 10..1 BY 2 토토 사이트 추천
-- 토토 사이트 추천 내에서 10,8,6,4,2 값을 사용하겠습니다.
끝 토토 사이트 추천;
하한이 상한보다 큰 경우(또는 미만, 에서반전케이스), 토토 사이트 추천 본문이 전혀 실행되지 않습니다. 오류가 발생하지 않습니다.
만약에라벨다음에 첨부됨for토토 사이트 추천 다음 정수 토토 사이트 추천 변수는 다음을 사용하여 정규화된 이름으로 참조될 수 있습니다.라벨.
다른 유형의 사용for토토 사이트 추천, 쿼리 결과를 반복하고 조작할 수 있습니다. 그에 따라 해당 데이터. 구문은 다음과 같습니다.
[ <<라벨 ] 에 대한대상IN질의토토 사이트 추천문장END 토토 사이트 추천 [ 라벨 ];
그대상기록입니다 변수, 행 변수 또는 쉼표로 구분된 스칼라 목록 변수.대상이다 의 결과로 각 행이 연속적으로 할당됩니다.질의그리고 토토 사이트 추천 본문은 다음에 대해 실행됩니다. 각 행. 예는 다음과 같습니다.
CREATE FUNCTION cs_refresh_mviews() 정수를 $$로 반환합니다.
선언
mviews 기록;
시작
RAISE NOTICE '구체화된 뷰를 새로 고치는 중...';
FOR mviews IN SELECT * FROM cs_materialized_views ORDER BY sort_key LOOP
-- 이제 "mviews"에는 cs_materialized_views의 레코드가 하나 있습니다.
RAISE NOTICE '구체화된 뷰 %s 새로 고침 중...', quote_ident(mviews.mv_name);
'TRUNCATE TABLE' 실행 || quote_ident(mviews.mv_name);
'INSERT INTO' 실행
|| quote_ident(mviews.mv_name) || ' '
|| mviews.mv_query;
엔드 토토 사이트 추천;
RAISE NOTICE '구체화된 뷰 새로 고침이 완료되었습니다.';
1을 반환합니다.
끝;
$$ 언어 plpgsql;
토토 사이트 추천가 다음에 의해 종료되는 경우종료문, 마지막으로 할당된 행 값은 다음과 같습니다. 토토 사이트 추천 후에도 여전히 액세스 가능합니다.
그질의이 유형에 사용됨 의for문은 모든 SQL이 될 수 있습니다. 호출자에게 행을 반환하는 명령:선택이 가장 일반적인 경우이지만 다음과 같은 경우도 있습니다. 사용삽입, 업데이트또는삭제와 함께 에돌아오는 중절. 일부 유틸리티 다음과 같은 명령은설명작동합니다 너무.
PL/pgSQL변수는 쿼리 텍스트로 대체되고 쿼리 계획이 캐시됩니다. 가능한 재사용을 위해 자세한 내용은섹션 39.10.1그리고섹션 39.10.2.
그실행 중문은 다음과 같습니다 행을 반복하는 또 다른 방법:
[ <<라벨 ] 에 대한대상실행 중텍스트 표현 [사용 중표현 [, ... ] ] 토토 사이트 추천문장END 토토 사이트 추천 [ 라벨 ];
이것은 소스 쿼리를 제외하고 이전 양식과 같습니다. 문자열 표현식으로 지정됩니다. 이는 평가되고 각 항목에 대해 다시 계획되었습니다.for토토 사이트 추천. 이를 통해 프로그래머는 속도를 선택할 수 있습니다. 미리 계획된 쿼리 또는 동적 쿼리의 유연성 일반으로실행문장. 다음과 같이 와 함께실행, 매개변수 값은 다음과 같습니다. 다음을 통해 동적 명령에 삽입됨사용 중.
결과가 다음과 같아야 하는 쿼리를 지정하는 또 다른 방법 반복을 통해 커서로 선언하는 것입니다. 이것은 설명됨섹션 39.7.4.
그FOREACH토토 사이트 추천는 다음과 같습니다.for토토 사이트 추천이지만 반복하는 대신 SQL 쿼리에서 반환된 행을 통해 반복됩니다. 배열 값의 요소입니다. (일반적으로,FOREACH구성요소를 통한 토토 사이트 추천를 의미합니다. 복합 값 표현; 반복을 위한 변형 배열 외에 합성물은 향후 추가될 수 있습니다.) TheFOREACH반복하는 문 배열은 다음과 같습니다:
[ <<라벨 ] FOREACH대상 [슬라이스번호 ] 배열표현토토 사이트 추천문장END 토토 사이트 추천 [ 라벨 ];
없이슬라이스또는 만약슬라이스 0가 지정되면 토토 사이트 추천는 다음을 반복합니다. 를 평가하여 생성된 배열의 개별 요소표현.대상변수는 각 요소에 할당됩니다 값을 순서대로 실행하고 토토 사이트 추천 본문은 각 항목에 대해 실행됩니다. 요소. 다음은 요소를 반복하는 예입니다. 정수 배열:
CREATE FUNCTION sum(int[])는 int8을 $$로 반환합니다.
선언
s int8 := 0;
x 정수;
시작
FOREACH x IN 배열 $1
토토 사이트 추천
s := s + x;
엔드 토토 사이트 추천;
반환;
끝;
$$ 언어 plpgsql;
요소는 저장 순서에 관계없이 저장 순서대로 방문됩니다. 배열 차원의 수. 비록대상은 일반적으로 단일 변수입니다. 배열을 반복할 때 변수 목록이 될 수 있습니다. 복합 값(레코드). 이 경우 각 배열에 대해 요소의 연속적인 열에서 변수가 할당됩니다. 복합 값입니다.
긍정적으로슬라이스값,FOREACH조각을 반복합니다. 단일 요소가 아닌 배열.슬라이스값은 정수 상수여야 합니다. 배열의 차원 수보다 큽니다.대상변수는 다음이어야 합니다. 배열이며, 배열 값의 연속적인 조각을 받습니다. 여기서 각 조각은 다음과 같이 지정된 차원 수로 구성됩니다.슬라이스. 다음은 반복의 예입니다. 1차원 조각을 통해:
함수 생성 scan_rows(int[]) $$로 void 반환
선언
x 정수[];
시작
배열 $1의 FOREACH x 슬라이스 1
토토 사이트 추천
알림 발생 '행 = %', x;
엔드 토토 사이트 추천;
끝;
$$ 언어 plpgsql;
SELECT scan_rows(ARRAY[[1,2,3],[4,5,6],[7,8,9],[10,11,12]]);
주의사항: 행 = 1,2,3
기본적으로 a에서 발생하는 모든 오류는PL/pgSQL함수가 실행을 중단합니다. 기능, 실제로 주변 거래도 마찬가지입니다. 다음을 사용하여 오류를 포착하고 복구할 수 있습니다.시작다음으로 차단예외절. 구문은 다음의 확장입니다. a의 일반 구문시작차단:
[ <<라벨 ] [선언선언 ] 시작문장예외 언제조건 [또는조건 ... ] 그런 다음handler_statements [언제조건 [또는조건 ... ] 그럼handler_statements ... ] 끝;
오류가 발생하지 않으면 이 블록 형식은 단순히 모든 항목을 실행합니다.문장그리고 나서 제어는 다음 명령문으로 전달됩니다.END. 그러나 내에서 오류가 발생하면문장, 추가 처리 의문장버려졌고, 토토 사이트 추천는예외목록. 목록이 처음으로 검색됩니다.조건다음 오류와 일치합니다. 발생했습니다. 일치하는 항목이 발견되면 해당handler_statements실행된 다음 제어는 다음 명령문으로 전달됩니다.END. 일치하는 항목이 없으면 오류가 전파됩니다. 마치예외절 전혀 없었습니다. 오류는 둘러싸서 잡을 수 있습니다. 다음으로 차단예외또는 있는 경우 없음 함수 처리를 중단합니다.
그조건이름은 다음과 같을 수 있습니다 다음 중 하나에 표시됨와이즈 토토 : 문서 : 9.1 : 와이즈 토토 오류 와이즈 토토. 카테고리 이름은 해당 카테고리 내의 모든 오류와 일치합니다. 특수 조건 이름기타다음을 제외한 모든 오류 유형과 일치합니다.QUERY_CANCELED. (가능하지만 종종 현명하지 못한, 함정에 빠뜨리다QUERY_CANCELED작성자 name.) 조건 이름은 대소문자를 구분하지 않습니다. 또한, 오류 조건은 다음과 같이 지정할 수 있습니다.SQLSTATE코드; 예를 들어 다음은 동일합니다.
divide_by_zero 다음에는 ... SQLSTATE '22012' 다음 ...
선택한 항목 내에서 새로운 오류가 발생하는 경우handler_statements, 잡을 수 없습니다 이것으로예외절이지만 전파되었습니다. 주변예외절이 이를 잡을 수 있습니다.
에 의해 오류가 발견된 경우예외절, 지역 변수PL/pgSQL함수는 다음과 같이 유지됩니다. 오류가 발생한 시점이었지만 모든 변경 사항은 블록 내의 영구 데이터베이스 상태가 롤백됩니다. 다음과 같이 예를 들어 다음 조각을 고려해보세요.
INSERT INTO mytab(이름, 성) VALUES('톰', '존스');
시작
업데이트 mytab SET 이름 = 'Joe' WHERE 성 = 'Jones';
x := x + 1;
y := x / 0;
예외
WHEN Division_by_zero THEN
RAISE NOTICE 'divation_by_zero를 포착함';
반환 x;
끝;
통제가 다음에 대한 할당에 도달할 때y, 다음과 함께 실패합니다.division_by_zero오류. 이건 잡히겠지예외절. 가치 에서 반환됨반환문은 의 증가된 값이 됩니다.x, 하지만 의 효과업데이트명령은 롤백되었습니다.삽입48536_48652톰 존스아님조 존스.
팁:다음을 포함하는 블록예외절이 훨씬 더 많습니다. 블록이 없는 블록보다 들어가고 나가는 데 비용이 많이 듭니다. 그러므로 사용하지 마십시오.예외필요 없이.
예외 핸들러 내에서,SQLSTATE변수에는 다음과 같은 오류 코드가 포함되어 있습니다. 발생한 예외에 해당합니다(참조표 A-1에 대한 가능한 오류 코드 목록).SQLERRM변수에 오류 메시지가 포함되어 있습니다. 예외와 관련이 있습니다. 이 변수는 정의되지 않았습니다. 외부 예외 처리기.
예 39-2. 의 예외업데이트/삽입
이 예에서는 다음 중 하나를 수행하기 위해 예외 처리를 사용합니다.업데이트또는삽입, 적절하게:
CREATE TABLE db(INT 기본 키, b TEXT);
CREATE FUNCTION merge_db(key INT, data TEXT) VOID AS를 반환합니다.
$$
시작
토토 사이트 추천
-- 먼저 키를 업데이트해 보세요.
업데이트 db SET b = 데이터 WHERE a = 키;
그렇다면 발견되면
반환;
종료하면;
-- 거기가 없으니 열쇠를 삽입해 보세요
-- 다른 사람이 동시에 동일한 키를 삽입하는 경우
-- 고유 키 오류가 발생할 수 있습니다.
시작
INSERT INTO db(a,b) VALUES(키, 데이터);
반품;
고유한 위반이 발생한 경우 예외
-- 아무것도 하지 않고 토토 사이트 추천를 반복하여 업데이트를 다시 시도합니다.
끝;
엔드 토토 사이트 추천;
끝;
$$
언어 plpgsql;
SELECT merge_db(1, '데이비드');
SELECT merge_db(1, '데니스');
이 예에서는 다음을 가정합니다.unique_violation오류는 다음에 의해 발생합니다.삽입, 그리고는삽입테이블의 함수를 트리거합니다.