여러 예외 블록
ROLLBACK TO와 SAVEPOINT는 예외 처리기가 있는 함수에서는 사용할 수 없기 때문에, 중첩 블록을 사용해 동일한 동작을 모방할 수 있어요. 이런 중첩 블록은 서로 의존하는 순서대로 문을 묶고 정렬하는 데 사용됩니다. 여기서는 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;