oracle 프로시저 파라미터 반환 값 3

by 초보 [PL/SQL] [2022.10.07 10:31:55]


    O_RESULT := 'FAIL';
    


            IF I_NC = 'N' THEN
        

                MERGE INTO GRAD.GNONM_HIS 
                     USING (SELECT * FROM DUAL)
                        ON (GNHIS_HAKBUN = I_HAKBUN
                        AND GNHIS_GUBUN = I_GUBUN
                        AND GNHIS_SEQ = I_SEQ)
                    
                WHEN MATCHED THEN
                 UPDATE SET GNHIS_YY = I_YY
                          , GNHIS_HAKGI = I_HAKGI
                          , GNHIS_YEAR = I_YEAR
                          , GNHIS_TITLE = I_TITLE
                          , GNHIS_JIDO_GUBUN = I_JIDO_GUBUN
                          , GNHIS_SABUN1 = I_SABUN1
                          , GNHIS_JIKWI1 = I_JIKWI1
                          , GNHIS_NAME1 = I_NAME1
                          , GNHIS_SABUN2 = I_SABUN2
                          , GNHIS_JIKWI2 = I_JIKWI2
                          , GNHIS_NAME2 = I_NAME2
                          , GNHIS_MOD_ILJA = TO_CHAR(SYSDATE, 'YYYYMMDD')
                          , GNHIS_DATE = SYSDATE
                          , GNHIS_UID = I_IDNO
                          

                 WHEN NOT MATCHED THEN
                  INSERT (GNHIS_YY
                        , GNHIS_HAKGI
                        , GNHIS_HAKBUN
                        , GNHIS_YEAR
                        , GNHIS_SEQ
                        , GNHIS_GUBUN
                        , GNHIS_TITLE
                        , GNHIS_JIDO_GUBUN
                        , GNHIS_SABUN1
                        , GNHIS_JIKWI1
                        , GNHIS_NAME1
                        , GNHIS_SABUN2
                        , GNHIS_JIKWI2
                        , GNHIS_NAME2
                        , GNHIS_MOD_ILJA
                        , GNHIS_MOD_REASON
                        , GNHIS_GBN
                        , GNHIS_DATE
                        , GNHIS_UID
                        , GNHIS_APP_DATE
                        , GNHIS_APP_ID)
                        
                  VALUES (I_YY
                        , I_HAKGI
                        , I_HAKBUN
                        , I_YEAR
                        , A_SEQ
                        , I_GUBUN
                        , I_TITLE
                        , I_JIDO_GUBUN
                        , I_SABUN1
                        , I_JIKWI1
                        , I_NAME1
                        , I_SABUN2
                        , I_JIKWI2
                        , I_NAME2
                        , TO_CHAR(SYSDATE, 'YYYYMMDD')
                        , I_REASON
                        , 'J'
                        , SYSDATE
                        , I_IDNO
                        , SYSDATE
                        , I_IDNO);
                        
                                        
                        
                    
                    --** 논문관리 히스토리에 데이터가 정상적으로 들어갔을 경우
                    IF SQL%ROWCOUNT = 1 THEN
                            
                        MERGE INTO GRAD.GNONM_CONT
                             USING (SELECT * FROM DUAL)
                                ON (GNCON_HAKBUN = I_HAKBUN
                                AND GNCON_SEQ = I_SEQ)

                         WHEN NOT MATCHED THEN
                          INSERT (GNCON_HAKBUN
                                , GNCON_SEQ)
                                
                          VALUES (I_HAKBUN
                                , A_SEQ);       
                                
                        --** 논문관리 히스토리에는 데이터가 들어갔지만, 논문관리세부에는 데이터가 들어가지 않았을 경우 ROLLBACK         
                        IF SQL%ROWCOUNT = 1 THEN      
                          
                            O_RESULT := 'SUCCESS';
                            
                        ELSE
                        
                            O_RESULT := 'FAIL';
                            
                        END IF;                                              
                                              

                    ELSE
                      
                      O_RESULT := 'FAIL';
                      RETURN;
                                     
                    END IF;
            
            END IF;
   

------------------------------------------------------------------

현재 소스가 이러합니다. 

모든 작업이 성공일땐 SUCCESS 값이 반환되는데

실패할 경우엔 FAIL 값이 아닌 널 값이 반환됩니다.

어떠한 문제인지 답변 해주시면 감사하겠습니다.

by 마농 [2022.10.07 11:12:57]

제일 첫줄에 이미 값을 넣고 시작하고, 값을 비우는 로직은 보이지 않고 있습니다.
제일 첫줄 이전에 이미 에러가 났거나
올려주신 소스 이외의 안올려 주신 부분에서 문제가 발생한 건 아닌지?


by 초보 [2022.10.07 11:20:40]
PROCEDURE P_GNHIS_INSERT_NEW
  (
      I_HAKBUN        IN VARCHAR2          --** 학번
    , I_YY             IN VARCHAR2          --** 연도
    , I_HAKGI         IN VARCHAR2          --** 학기
    , I_TITLE         IN VARCHAR2           --** 논문제목
    , I_YEAR          IN VARCHAR2           --** 기수
    , I_JIDO_GUBUN    IN VARCHAR2           --** 논문지도구분
    , I_SABUN1        IN VARCHAR2           --** 지도교수 사번
    , I_JIKWI1        IN VARCHAR2           --** 지도교수 직위
    , I_NAME1         IN VARCHAR2           --** 지도교수 성명
    , I_SABUN2        IN VARCHAR2            --** 지도교수 사번(합동)
    , I_JIKWI2        IN VARCHAR2           --** 지도교수 직위(합동)
    , I_NAME2         IN VARCHAR2           --** 지도교수 성명(합동)
    , I_REASON        IN VARCHAR2           --** 변동 및 취소 사유
    , I_GUBUN         IN VARCHAR2           --** 논문 구분
    , I_IDNO          IN VARCHAR2           --** 로그인 아이디
    , I_SEQ           IN NUMBER             --** 순번
    , I_NC            IN VARCHAR2           --** 신규작성 OR 변경신청  여부       
    , O_RESULT       OUT VARCHAR2           --** 결과값
  )
IS 
  A_SEQ NUMBER := 0;
  

  
  BEGIN
    O_RESULT := 'FAIL';
    
    --** 순번 구하기
    FOR A1 IN (SELECT NVL(MAX(GNHIS_SEQ), 0) AS MAX_SEQ
                    FROM GNONM_HIS
                   WHERE GNHIS_HAKBUN = I_HAKBUN) 
                   
    LOOP
                
      A_SEQ := A1.MAX_SEQ + 1;
      
    END LOOP;
    
    
    
       --** 지도교수선정
        IF I_GUBUN = '1' THEN
        
            --** 논문지도교수 신청서(신규작성)
            IF I_NC = 'N' THEN
        

                MERGE INTO GRAD.GNONM_HIS 
                     USING (SELECT * FROM DUAL)
                        ON (GNHIS_HAKBUN = I_HAKBUN
                        AND GNHIS_GUBUN = I_GUBUN
                        AND GNHIS_SEQ = I_SEQ)
                    
                WHEN MATCHED THEN
                 UPDATE SET GNHIS_YY = I_YY
                          , GNHIS_HAKGI = I_HAKGI
                          , GNHIS_YEAR = I_YEAR
                          , GNHIS_TITLE = I_TITLE
                          , GNHIS_JIDO_GUBUN = I_JIDO_GUBUN
                          , GNHIS_SABUN1 = I_SABUN1
                          , GNHIS_JIKWI1 = I_JIKWI1
                          , GNHIS_NAME1 = I_NAME1
                          , GNHIS_SABUN2 = I_SABUN2
                          , GNHIS_JIKWI2 = I_JIKWI2
                          , GNHIS_NAME2 = I_NAME2
                          , GNHIS_MOD_ILJA = TO_CHAR(SYSDATE, 'YYYYMMDD')
                          , GNHIS_DATE = SYSDATE
                          , GNHIS_UID = I_IDNO
                          

                 WHEN NOT MATCHED THEN
                  INSERT (GNHIS_YY
                        , GNHIS_HAKGI
                        , GNHIS_HAKBUN
                        , GNHIS_YEAR
                        , GNHIS_SEQ
                        , GNHIS_GUBUN
                        , GNHIS_TITLE
                        , GNHIS_JIDO_GUBUN
                        , GNHIS_SABUN1
                        , GNHIS_JIKWI1
                        , GNHIS_NAME1
                        , GNHIS_SABUN2
                        , GNHIS_JIKWI2
                        , GNHIS_NAME2
                        , GNHIS_MOD_ILJA
                        , GNHIS_MOD_REASON
                        , GNHIS_GBN
                        , GNHIS_DATE
                        , GNHIS_UID
                        , GNHIS_APP_DATE
                        , GNHIS_APP_ID)
                        
                  VALUES (I_YY
                        , I_HAKGI
                        , I_HAKBUN
                        , I_YEAR
                        , A_SEQ
                        , I_GUBUN
                        , I_TITLE
                        , I_JIDO_GUBUN
                        , I_SABUN1
                        , I_JIKWI1
                        , I_NAME1
                        , I_SABUN2
                        , I_JIKWI2
                        , I_NAME2
                        , TO_CHAR(SYSDATE, 'YYYYMMDD')
                        , I_REASON
                        , 'J'
                        , SYSDATE
                        , I_IDNO
                        , SYSDATE
                        , I_IDNO);
                        
                        
                        
                    
                    --** 논문관리 히스토리에 데이터가 정상적으로 들어갔을 경우
                    IF SQL%ROWCOUNT = 1 THEN
                            
                        MERGE INTO GRAD.GNONM_CONT
                             USING (SELECT * FROM DUAL)
                                ON (GNCON_HAKBUN = I_HAKBUN
                                AND GNCON_SEQ = I_SEQ)

                         WHEN NOT MATCHED THEN
                          INSERT (GNCON_HAKBUN
                                , GNCON_SEQ)
                                
                          VALUES (I_HAKBUN
                                , A_SEQ);       
                                
                        --** 논문관리 히스토리에는 데이터가 들어갔지만, 논문관리세부에는 데이터가 들어가지 않았을 경우 ROLLBACK         
                        IF SQL%ROWCOUNT = 1 THEN      
                          
                            O_RESULT := 'SUCCESS';
                            
                        ELSE
                        
                            O_RESULT := 'FAIL';
                            
                        END IF;                                              
                                              

                    ELSE
                      
                      O_RESULT := 'FAIL';
                      RETURN;
                      
                                     
                    END IF;
            
            END IF;
            
        
        END IF;

    END;    

end;
/

현재 모든 소스입니다.

첫 줄에 데이터를 넣었으면 데이터가 들어간 경우 SUCCESS도 반환되면 안되지 않나요?? SUCCESS는 반환되지만, 의도적으로 오류를 유발시켜 FAIL값을 반환 되는지 확인하려고 했는데 'FAIL'이 아닌 ' ' 공백, 널값이 반환됩니다!


by 마농 [2022.10.07 11:29:58]

처음에 변수에 값을 'FAIL' 로 넣었지만
중간에 'SUCCESS' 로 바꾸는 부분이 있으니 값은 바뀔 수 있습니다.
다만 공백으로 값을 바꾸는 부분이 없으니 공백이 반환된 것이 아니라
아예 값을 반환받지 못한 것으로 생각됩니다.
즉, 중간에 에러가 발생한 것이 아닐까요?
에러메시지가 없는지요?

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