시작하기무료로 시작하기

여러 예외 블록

ROLLBACK TOSAVEPOINT는 예외 처리기가 있는 함수에서는 사용할 수 없기 때문에, 중첩 블록을 사용해 동일한 동작을 모방할 수 있어요. 이런 중첩 블록은 서로 의존하는 순서대로 문을 묶고 정렬하는 데 사용됩니다. 여기서는 SAVEPOINT를 모방하는 예외 처리기가 포함된 레코드 블록을 먼저 INSERT한 다음, 별도의 예외 처리기와 함께 레코드를 UPDATE할 거예요. 해당 UPDATE 문은 오류가 발생하며, 예외 처리기가 해당 블록만 자동으로 롤백합니다.

이 연습은 강의의 일부입니다

PostgreSQL에서의 트랜잭션과 오류 처리

강의 보기

연습 안내

  • 첫 번째 블록에서 patients에 다음 레코드를 INSERT하세요. (a1c=5.6, glucose=93, fasting=TRUE), (6.3, 111, TRUE), (4.7, 65, TRUE). 그리고 예외가 발생하면 errors 테이블에 msg'failed to insert'를 INSERT하는 EXCEPTION 처리기를 추가하세요.
  • 두 번째 중첩 블록을 열고, ID가 1인 환자의 fasting 값을 'true'로 UPDATE하세요. 이때 예외 처리기를 사용해 errors 테이블에 msg'Inserted string into boolean.'을 기록하세요.
  • 두 블록 모두 END로 닫으세요.

실습형 인터랙티브 연습

이 예제를 이 샘플 코드를 완성하여 풀어보세요.

-- Make a DO function
DO $$
-- Open a transaction block
BEGIN
    -- Open a nested block
    BEGIN
    	INSERT INTO ___ (___, ___, ___) 
        VALUES (5.6, 93, TRUE), ___, ___;
    -- Catch all exception types
    EXCEPTION WHEN others THEN
    	INSERT INTO ___ (msg) VALUES ('failed to insert');
    -- End nested block
    END;
    -- Begin the second nested block
	BEGIN
    	UPDATE patients SET ___ = '___' WHERE id=1;
    -- Catch all exception types
    EXCEPTION WHEN others THEN
        INSERT INTO errors (msg) VALUES ('Inserted ___ into ___.');
    -- End the second nested block
    END;
-- END the outer block
END;
$$ language 'plpgsql';
SELECT * FROM errors;
코드 편집 및 실행