for in 문 select 쿼리에서 에러발생시 exception 은 어디에 선언하나요? 0 5 1,749

by 엘시아 [PL/SQL] EXCEPTION FOR IN문 SELECT에러 [2018.05.24 12:10:05]


안녕하세요

 

PL/SQL 짜다가 FOR IN문 안에 쿼리에서 EXCEPTION 발생시에 어디서 EXCEPTION을 선언하는게 궁금해서 질문남깁니다.

예시코드)
FOR v_loop IN (

    SELECT 1 AS NO
               , (SELECT A
                      FROM T1) AS A /* 여기에서 두건이상이 조회되는 에러 */
       FROM DUAL

) LOOP



END LOOP;

이런구조일떄 FOR IN 문 에 SELECT 쿼리에서 에러가 나는 경우

EXCEPTION은 어디에 선언해야 하나요?

LOOP 안에 BEGIN  EXCEPTION END; 문을 추가하면 될까요?

 

by 우리집아찌 [2018.05.24 12:24:50]

END 위에 정의 하시면 되는데

왜 SELECT를 FOR문을 돌리시죠?

그냥 SQL로 처리하면 될것같은데요.


by 엘시아 [2018.05.24 12:36:48]

for문 안에서 조건문을 가지고 체킹해야할 부분이있어서요

loop안에 insert문이나 update문이있는데, 제가 질문드린건,, select자체에서 에러가 날때는 어디서 exceiption을 두는지가..궁금해서 질문한거에요
말씀하신것처럼 END 위라면 END LOOP; 위를 말씀하신건가요?


by 마농 [2018.05.24 13:08:34]

PL/SQL 은 블럭 단위로 묶을 수 있고, 블럭은 다른 블럭을 포함할 수 있습니다.
PL/SQL 블럭은 (DECLARE, BEGIN, EXCEPTION, END) 이렇게 한 묶음으로 구성됩니다.
DECLARE, EXCEPTION 은 생략 가능, BEGIN, END 는 필수.
LOOP 문 안에 작은 단위의 PL/SQL 블럭을 사용할 수는 있습니다.
그런데 질문의 구조를 보아하니 LOOP 문 안에서 나는 에러가 아니네요?
LOOP 문 쿼리 자체에서 나는 에러네요.
LOOP 문을 감싸는 BEGIN ~ END 를 사용해야 하고, 이 때 건단위로 에러를 잡지는 못합니다.


by 마농 [2018.05.24 13:24:12]

복잡한 문제네요.
다시 생각해 보니 FOR LOOP 밖에서 EXCEPTION 을 잡아도 되겠네요.
에러 발생 부위가 스칼라서브쿼리입니다.
스칼라서브쿼리는 메인쿼리가 실행되면서 건 단위로 수행됩니다.
즉, 쿼리가 1건씩 패치되는 시점에 에러가 발생되므로 건단위 에러 체크가 가능하겠네요.
단, 에러 발생 이후 행에대한 계속 루프 처리는 불가능합니다. 에러 발생하면서 루프 종료.


by 엘시아 [2018.05.24 13:29:53]

매번 질문할때마다 친절히 알려주셔서 감사합니다.

이해가잘 됐습니다. ^^

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입