2009-10-13 5 views
0

우리의 저장 프로 시저에는 다음과 같은 코드가 있습니다.<<SQL_ERROR>> block

<<SQL_ERROR>> 
    V_SYS_ERROR_MSG := SUBSTR(SQLERRM, 1, 252); 

    DBMS_OUTPUT.PUT_LINE('ERROR IN EXECUTION IN PROCEDURE'); 

    DBMS_OUTPUT.PUT_LINE('THE ERROR CODE IS ' || V_SYS_ERROR || '- ' || 
         V_SYS_ERROR_MSG); 

다음과 같은 오류 블록을 호출하는 구문이 있습니다.

IF V_SYS_ERROR <> 0 THEN 
    GOTO SQL_ERROR; 

오류가없는 경우에도 DBMS 출력 문이 나타납니다. 어떻게 이것을 피할 수 있습니까?

답변

2

나는이 GOTO 접근 방식을 추천 하지입니다 : 다른 사람들이 이미 말했듯이, 예외는 PL/SQL에서 오류를 처리하는 올바른 방법입니다. 그러나 특정 문제를 해결하기 위해, 당신이 할 수 있습니다 :

물론
BEGIN 
    IF V_SYS_ERROR <> 0 THEN 
    GOTO SQL_ERROR; 
    END IF; 

    GOTO PROC_END; 

    <<SQL_ERROR>> 
    V_SYS_ERROR_MSG := SUBSTR(SQLERRM, 1, 252); 

    DBMS_OUTPUT.PUT_LINE('ERROR IN EXECUTION IN PROCEDURE'); 

    DBMS_OUTPUT.PUT_LINE('THE ERROR CODE IS ' || V_SYS_ERROR || '- ' || 
         V_SYS_ERROR_MSG); 

    <<PROC_END>> 
    NULL; 
END; 

, 이것은 아직도 당신이 왜 제대로 어쨌든 그것을 할 것을하고있다, 그래서 만약 코드를 변경 포함? 즉 그런데

DECLARE 
    SQL_ERROR EXCEPTION; 
BEGIN 
    IF V_SYS_ERROR <> 0 THEN 
    RAISE SQL_ERROR; 
    END IF; 

EXCEPTION 

    WHEN SQL_ERROR THEN 
    V_SYS_ERROR_MSG := SUBSTR(SQLERRM, 1, 252); 

    DBMS_OUTPUT.PUT_LINE('ERROR IN EXECUTION IN PROCEDURE'); 

    DBMS_OUTPUT.PUT_LINE('THE ERROR CODE IS ' || V_SYS_ERROR || '- ' || 
         V_SYS_ERROR_MSG); 
    RAISE; 

END; 

, DBMS_OUTPUT.PUT_LINE 프로덕션 어플리케이션 시스템에서 에러 메시지를 출력하기에 적합하지 않다. 개발 중에는 디버깅 용으로 만 사용하십시오.

2

당신은 GOTO 문을 피해야합니다. PL/SQL은 오류 처리와 함께 제공, 당신은 오류를 처리하는 예외 synthax을 사용해야합니다

BEGIN 
    <code goes here> 
EXCEPTION 
    WHEN <exception> THEN 
     <deal_with_it> 
    WHEN OTHERS THEN 
     <log_error> 
     RAISE; 
END; 
+0

언급 한대로 우리는 예외가 발생했을 때 예외를 처리해야합니까? 그러나 그것은 우리에게 좋은 선택이 아닙니다. 우리는 많은 SQL 서버 저장 프로 시저를 Oracle로 변환하고 우리가 사용했던 도구 (SQL 개발자)는 goto 문을 작성했습니다. 우리는 각각의 SP에 들어가서 논리가 엉망이되기 시작할 것입니다. – Omnipresent

+0

@Omnipresent : "SQL 개발자"라고 할 때 Oracle SQL Developer 또는 다른 이름의 동일한 도구를 의미합니까? –

+0

Oracle sql Developer – Omnipresent

1

난 당신이 예외 처리기를 사용하지 않고 원하는 결과를 얻을 수 있다고 생각하지 않습니다. PL/SQL User 's Guide에서

인수가없는 SQLERRM은 예외 처리기에서만 유용합니다 ( ). 외부에서는 인수가없는 SQLERRM은 항상 정상적인 성공 완료 메시지를 리턴합니다.

우선, 오류가 발생했지만 "정상적이고 성공적인 완료"라는 메시지가 표시되는 것은 SQLERRM이 항상이 컨텍스트에서 리턴 할 것이기 때문입니다.

사실이 아니라고 가정하면, "정상"코드에서 "오류 처리기"로 제어가 흐르게하는 것만 같아 보입니다. 오류 처리기가 프로 시저 끝 부분에있는 경우 간단한 수정은 <> 레이블 바로 앞에 RETURN 문을 추가하는 것입니다.

오류 처리기 코드를 별도의 프로 시저로 옮기고 GOTO 대신 해당 프로 시저를 호출하는 것이 좋습니다.

관련 문제