2009-12-18 3 views
1

안녕하세요 거기에 어떤 방법으로 오라클에서 예외가 던진 테이블과 열 (등) 개체를 캡처하는 방법?오라클 캡처 예외 개체

사용자가 예외가 발생한 테이블 및 필드의 이름을 표시하는 오류 메시지를 사용자 정의하려면 개체 이름을 결정해야합니다.

가변 SQLCODE 및 SQLERRM 알고 있지만 추가 변수 또는 오류 개체의 이름을 반환하는 함수가 있는지 궁금하다.

난 * 토니 예를 실제로

CREATE TABLE t (v varchar2(3)); 
COMMENT ON TABLE t IS 'my table description'; 
COMMENT ON COLUMN t.v IS 'my column description'; 
insert into t values ('xxxx'); 

를 사용하여이

exception 
    when others then 
    begin 
    if SQLCODE = -20010 
     then dbms_output.put_line('The Value Too Large in the field ' || GetObjectNameError); 
    end if; 
    end; 

UPDATE

같은이 오류가 발생합니다

ERROR at line 1: 
ORA-12899: value too large for column "MYSCHEMA"."T"."V" (actual: 4, maximum: 3) 
,

나는 사전에이

ORA-12899: value too large for column "my column description" in table "my table description" (actual: 4, maximum: 3) 

덕분에 뭔가를 보여주고 싶다.

+1

당신은 실제로 이런 식으로 다른 것을 포기하고 싶지 않습니다. 코드를 호출하는 프로그램은 성공했는지 실패했는지 전혀 알 수 없습니다. –

+0

달성하고자하는 것에 대해 자세히 설명해주십시오. 특히 토니의 해결책이 법안에 맞지 않는 이유를 설명 할 수 있습니까? – APC

답변

2

아니요, 없습니다. 그러나 오라클의 최신 버전 (10G 적어도) 자신의 예외를 제외하고 당신을 위해 작업을 수행합니다

SQL> create table t (v varchar2(3)); 

Table created. 

SQL> insert into t values ('xxxx'); 
insert into t values ('xxxx') 
         * 
ERROR at line 1: 
ORA-12899: value too large for column "MYSCHEMA"."T"."V" (actual: 4, maximum: 3) 

는 (T 및 V를 테이블 및 열 이름을 얻기 위해이 오류를 분석 할 수있는 당신이 찾고있는 것을 얻으려면 이 예에서) 다음 USER_TAB_COMMENTS 및 USER_COL_COMMENTS에서 주석을 찾아보고이를 사용하여 메시지를 다시 구성하십시오.

+0

Tony, 저는 이미 이것을 알고 있습니다.하지만 필요한 것은 실제 이름이 아닌 메타 데이터에 저장된 열과 테이블에 대한 설명을 사용자에게 보여주는 것입니다. – RRUZ

+0

마침내 열과 테이블의 이름을 구문 분석해야했습니다. – RRUZ

2

번호

음, raise_application_exception()는 당신에게 두 항목, 오류 코드와 하나의 문자 메시지를 수 있습니다. 자신의 예외를 던지면이 정보를 포함하도록 메시지를 형식화하고 구문 분석 할 수 있습니다.

대신이 정보를 전역 "ERROR TABLE"에 넣고 예외를 발생시키는 것이 좋습니다.

아래 코멘트에 후속하기 위해 오라클 10G 포함 : 이것은 여러 오류가 발생 통해 구문 분석 할 수 있습니다

DBMS_UTILITY.FORMAT_ERROR_BACKTRACE 

. This blog post은이 정보를 구문 분석하여 호출 스택에서 더 많은 정보를 추출하는 방법을 보여줍니다. 하지만 여전히 자신의 오류 메시지를 포함하는 것이 아니라 오류 메시지를 구문 분석해야합니다.

+1

RAISE_APPLICATION_ERROR에는 선택 사항 인 세 번째 (부울) 인수가 있습니다.이 인수가 true로 설정되면 호출 스택에 포함 된 호출이 포함됩니다. 기본값은 false이므로이 정보가 손실되는 경향이 있습니다. – Hobo

1

네, 그렇게 할 수는 있지만 소스 코드 위치에 대해서만 가능합니다. Dbms_Utility.Format_Error_Stack()Dbms_Utility.Format_Call_Stack()을 확인하십시오.

오류가 발생한 PL/SQL 조각의 행 번호와 객체 이름이 포함 된 문자열이 표시됩니다.