Oracle 프로시저 No rows returned 에러

엑셀 업로드 기능을 구현 할 때 엑셀의 값이 맞는지 체크하여 Case By Case로 에러 코드를 사용자에게 보여주고 에러가 발생하지 않는 경우에만 엑셀 업로드가 가능하게 하는 작업이 있었습니다.


사용자가 엑셀에 공통코드값의 명을 입력하고 업로드를 하면 프로그램에서는 공통코드값이 정확한 코드를 가지고 있는지 체크하여 insert 하는 방식 입니다.

이때 저는 프로시저를 사용했는데 select ~ into ~ 할 경우 데이터가 존재하지 않으면 No rows returned의 경우에는 에러가 나타나는 것이었습니다.





MSSQL에서는 안그러는데 Oracle은 에러를 발생하네요...ㅠ
하여 오늘은 Oracle 프로시저 No rows returned 에러에 대해서 알아보겠습니다.

처음에는 NVL을 사용해보고 별 짓을 다~ 해봤습니다.
하지만 NVL은 데이터가 Null일 경우 해당 Null을 지정한 다른 값으로 바꿔주는 기능인데 Null이라는 데이터 조차 없으니 동일한 에러가 계속해서 나는것이었습니다.

엄청난 시간을 삽질하다 결국 DUAL을 사용하여 해결을 하게 되었네요.

결과는 아래 소스를 확인하시면 되십니다.

SELECT
    Z.S_CD, Z.E_NAME, TO_CHAR(Z.CP) || Z.CP_UNIT INTO V_S_CD, V_E_NAME, V_CP
  FROM (
          SELECT
              S.S_CD,   // 현장 코드 정보
              G.E_NAME,  // 장비명
              C.CP,      // CP
              (SELECT CASE WHEN P_LANGUAGE = 'ko' OR P_LANGUAGE IS NULL THEN CODE_NAME
                   WHEN P_LANGUAGE = 'en' THEN CODE_ENG_NAME
                END CODE_NAME
             FROM S_COMMON_CODE
             WHERE 1 = 1
             AND MASTER_CODE = '공통 코드의 마스터 코드'
             AND CODE = C.CP_UNIT) AS CP_UNIT
          FROM P_E_GENERAL G   // 장비
              LEFT OUTER JOIN P_E_MODEL M ON  G.E_ID = M.E_ID   // 모델 정보 테이블
              LEFT OUTER JOIN P_E_CP C ON  G.E_ID = C.E_ID     // CP 정보 테이블
              INNER JOIN S_S_INFO S ON  G.S_ID = S.S_ID       // 현장 정보 테이블
          WHERE P_SA_NO = G.SA_NO
      ) Z
      RIGHT OUTER JOIN DUAL ON 1=1;




상기와 같은 방법으로 데이터가 없을 때도 No rows returned 에러를 발생하지 않고 NULL 값이 들어갑니다.

저같은 경우에 어려움을 격는 분들에게 유용한 정보가 되었으면 좋겠네요.
오늘은 여기까지 Oracle 프로시저 No rows returned 에러에 대해서 알아보았습니다.
오늘도 행복한 하루되시길 기원합니다.

댓글

이 블로그의 인기 게시물

껌 떼는 법 (완벽 제거)

학점 계산기 (백분위 환산) 완벽 정리

[엑셀] 셀에 수식 적용하는 모든 것 완벽 정리