오라클 프로시저 CURSOR의 조회쿼리 그룹바이 오류 시 0 6 5,498

by 크레이지황 [PL/SQL] ORACLE CURSOR GROUP BY [2024.12.09 16:06:48]


안녕하세요 ~

오라클 PL/SQL 에서 CURSOR의 SELECT 문장 및 BEGIN END 구문에 내용등을 작성하고

컴파일 했을 때, 오류가 안나고 정상 컴파일이 되는데, 실제 프로시저를 수행했을 때,

CURSOR 구문의 SELECT 절에 GROUP BY 표현식이 아니라서 에러가 뜹니다.

 

이 경우, 사용자가 CURSOR 절의 SELECT문이 에러가 뜬다는거를 인지를 못하고 PL/SQL만 컴파일이 정상적으로 되는 것을 확인한 경우, 문제가 발생될 수 있기 때문에, CURSOR 부문의 SELECT 를 수행할 때, 에러가 나면 예외처리를 하고 싶은데 방법이 있을까요?

CURSOR의 SELECT 절이 모두 정상적으로 수행된다는 가정 하에, BEGIN END 절에서 모두 커서의 데이터가 없거나, 오류 등에 대한 예외처리만 나와있고, 실제 CURSOR절을 수행할 때 SELECT가 에러나는 것에 대한 예외처리는 찾지 못하였네요.

애초에 PL/SQL 자체가 컴파일이 안되는게 맞는건지.. 모르겠네요

고수님들의 의견을 듣고 싶습니다.

 

PL/SQL 의 CURSOR의 문장이 실행될 때, 만약 SELECT 오류가 발생되면, 바로 예외처리를 하고 싶음 !!

 

by 마농 [2024.12.09 17:45:14]

컴파일이 정상이라는 것은
커서 선언에 대한 구문 오류는 아니고
커서 실행 시에 나는 오류인 듯 한데요.
커서 실행하는 부분을 begin ~ end 로 감싸서 예외처리 하시면 됩니다.
메인 블럭(begin ~ end) 안에 서브 블럭(begin ~ end) 가능

 

그런데.
질문을 다시 보면
GROUP BY 표현식이 아니라서 에러가 난다고 했는데.
이는 구문오류입니다. 실행시 오류가 아닙니다.
구문 오류는 컴파일 시에 에러가 납니다.


by 크레이지황 [2024.12.10 08:06:59]

답변 감사드립니다.

 

제가 구문 오류인지, 실행 오류인지 구분을 정확하게 하지 않은 것 같네요(질문당시 개념을 잘 몰랐음)

말씀대로, 프로시저 컴파일이 정상적으로 된 것으로 보아, 커서의 구문오류는 아닙니다.

다만 프로시저를 실행했을 때, 커서쪽의 SELECT 절에서 "인수의 갯수나 유형이 잘못되었습니다" 나온 부분을

제가 커서의 SELECT문을 별도로 SQL로 수행했을 때 나온 오류인 "GROUP BY 표현식이 아니다" 내용을 문제처럼 얘기했네요

어찌되었건, 결과적으로 구문 오류는 아니고, 실행 오류가 맞습니다!!

 

제가 A 질문을 하고 B의 오류 얘기를 해서.. 약간 질문을 제대로 하지 못하였는데..

BEGIN END 밖에 있는 커서 선언 부분을.. BEGIN END 안에 커서 선언을 할 수 있나요? (선언은 SELECT 절이 있는 CURSOR이고, 실행은 CUSROR를 오픈해서 사용하는 의미로 이해하고 있습니다.)

BEGIN END 안에서 커서를 오픈해서 사용할 때의 예외처리는 알고 있습니다.


by 마농 [2024.12.10 08:11:52]

선언부에서는 선언만 한 것이고
begin ~ end 안에서 실행(?) 을 하는 것이니
실행 부분에서 서브 블럭(begin ~ end) 을 추가하시면 됩니다.
질문만으로는 어떤 오류인지 감이 잘 안오는데
open 부분을 서브 블럭화 할 수 있고
그 안의 loop 안에서 서브 블럭을 사용할 수 도 있습니다.


by 마농 [2024.12.10 08:18:21]

오류 메시지는 '인수의 갯수나 유형이 잘못되었습니다' 인데,
이는 프로시저 호출 시 파라미터를 잘못 전달해서 그런 것 같습니다.
아예 프로시저 안으로 들어가지 못한 것이죠.


by 크레이지황 [2024.12.10 13:39:28]

예외처리를 하려면, 어찌되었건 begin ~ end 구절 안에는 있어야 예외처리가 가능한거겠네요.

소중한 답변 감사드립니다 !


by 마농 [2024.12.10 13:49:27]

그게 아닌데요.
프로시져 안에서 에러난 줄 알고 답변 드린 건데
프로시져 실행 자체가 안된 에러로 보입니다.
프로시저 호출시 인수의 개수나 유형 불일치 여부 확인하세요.

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