DataBase/Oracle
[Oracle] 프로시저(procedure), function에서 예외(exception)처리
희랍인 조르바
2018. 9. 4. 11:24
exception 처리에 대해 글을 쓸 거지만 오늘 있었던 일에 비추어 한 가지만 포스팅 하려고 한다.
oracle에서 function을 만들던 도중, 원하는 값이 나오지 않고 계속해서 Null 값이 떨어졌다.
function 안에 transaction이 실행 되는 지점 마다 print를 하나하나씩 찍어보다보니
원인 지점을 찾았다.
오늘 배운 것이지만, 프로시저 실행 중에
SELECT INTO를 사용하는 로직에서 Null값을 받아오고 INTO에 아무 값도 들어가지 않으면 exception이 발생한다.
function이 exception을 던진다는 것도 오늘 알았다. (갈 길이 멀다 나란 초보 ㅠ_ㅠ)
그런 결과로 function이 끝까지 타지 않고 중간에 exception을 날려버려 멈춰버리는 것이다.
그래서 찾은 방법이 exception처리다!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | BEGIN some logic.. IF IS_NEW_COMMENT = '1' THEN DECLARE IN_COMMENT_COUNT NUMBER(10,0); BEGIN SELECT COUNT INTO IN_COMMENT_COUNT FROM COMMENT_COUNT WHERE USER_ID = 'ZORBA'; -- 여기서 null값이 리턴되면 exception을 던진다 EXCEPTION WHEN NO_DATA_FOUND -- 데이터가 없을 경우 exception THEN IN_COMMENT_COUNT := 0; -- exception이 생기면 어떤 일을 할지 작성. 나는 변수가 null값이 되는 걸 방지하기 위해 0을 대입했다. IF IN_COMMENT_COUNT > 0 THEN -- 데이터가 없어서 IN_COMMENT_COUNT가 0이 됐을 경우, 해당 로직을 타진 않지만, 계속 프로시저를 수행 BEGIN RETURN_COMMENT_COUNT := CONCAT('[', CONCAT(IN_COMMENT_COUNT, ']')); END; END; END IF; END; | cs |
SELECT INTO가 Null값을 받아오면, exception을 던지는데, 그때
EXCEPTION WHEN NO_DATA_FOUND THEN 'exception을 처리할 로직' 을 사용해 예외의 경우를 처리한다.