source

Oracle: RAISE_APPLICATION_ERROR를 사용하는 상황은 무엇입니까?

manysource 2023. 6. 24. 09:19

Oracle: RAISE_APPLICATION_ERROR를 사용하는 상황은 무엇입니까?

RAISE를 사용하여 예외를 발생시킬 수 있습니다.RAISE_APPLICATION_ERROR를 사용하려면 어떤 특정 상황이 필요합니까?

감사해요.

RAISE_APPLICATION_ERROR에는 두 가지 용도가 있습니다.첫 번째는 일반 Oracle 예외 메시지를 보다 의미 있는 고유 메시지로 바꾸는 것입니다.두 번째는 Oracle이 예외 조건을 던지지 않을 때 우리만의 예외 조건을 만드는 것입니다.

다음 절차에서는 두 가지 용도를 모두 설명합니다.앞으로는 신입사원을 채용할 수 없다는 사업 규칙을 시행합니다.또한 두 개의 Oracle 예외를 재정의합니다.인데, DUP_VAL_ON_INDEX에서 고유 . 이는 고유한 키에 의해 느려집니다.EMP(ENAME)다른 하나는 다음 사이의 외부 키일 때 던져지는 사용자 정의 예외입니다.EMP(MGR)그리고.EMP(EMPNO)관리자가 기존 직원이어야 하므로 위반됩니다.

create or replace procedure new_emp
    ( p_name in emp.ename%type
      , p_sal in emp.sal%type
      , p_job in emp.job%type
      , p_dept in emp.deptno%type
      , p_mgr in emp.mgr%type 
      , p_hired in emp.hiredate%type := sysdate )
is
    invalid_manager exception;
    PRAGMA EXCEPTION_INIT(invalid_manager, -2291);
    dummy varchar2(1);
begin
    -- check hiredate is valid
    if trunc(p_hired) > trunc(sysdate) 
    then
        raise_application_error
            (-20000
             , 'NEW_EMP::hiredate cannot be in the future'); 
    end if;

    insert into emp
        ( ename
          , sal
          , job
          , deptno
          , mgr 
          , hiredate )
    values      
        ( p_name
          , p_sal
          , p_job
          , p_dept
          , p_mgr 
          , trunc(p_hired) );
exception
    when dup_val_on_index then
        raise_application_error
            (-20001
             , 'NEW_EMP::employee called '||p_name||' already exists'
             , true); 
    when invalid_manager then
        raise_application_error
            (-20002
             , 'NEW_EMP::'||p_mgr ||' is not a valid manager'); 

end;
/

모양:

SQL> exec new_emp ('DUGGAN', 2500, 'SALES', 10, 7782, sysdate+1)
BEGIN new_emp ('DUGGAN', 2500, 'SALES', 10, 7782, sysdate+1); END;

*
ERROR at line 1:
ORA-20000: NEW_EMP::hiredate cannot be in the future
ORA-06512: at "APC.NEW_EMP", line 16
ORA-06512: at line 1

SQL>
SQL> exec new_emp ('DUGGAN', 2500, 'SALES', 10, 8888, sysdate)
BEGIN new_emp ('DUGGAN', 2500, 'SALES', 10, 8888, sysdate); END;

*
ERROR at line 1:
ORA-20002: NEW_EMP::8888 is not a valid manager
ORA-06512: at "APC.NEW_EMP", line 42
ORA-06512: at line 1


SQL>
SQL> exec new_emp ('DUGGAN', 2500, 'SALES', 10, 7782, sysdate)

PL/SQL procedure successfully completed.

SQL>
SQL> exec new_emp ('DUGGAN', 2500, 'SALES', 10, 7782, sysdate)
BEGIN new_emp ('DUGGAN', 2500, 'SALES', 10, 7782, sysdate); END;

*
ERROR at line 1:
ORA-20001: NEW_EMP::employee called DUGGAN already exists
ORA-06512: at "APC.NEW_EMP", line 37
ORA-00001: unique constraint (APC.EMP_UK) violated
ORA-06512: at line 1

EXCUSTIONs 블록의 RAISE_APPLICATION_ERROR에 대한 두 호출의 다른 출력을 기록합니다.세 번째 인수(선택 사항)를 TRUE로 설정하면 RAISE_APPLICATION_ERROR가 스택에 트리거 예외가 포함되어 진단에 유용할 수 있습니다.

PL/SQL 사용 설명서에 더 유용한 정보가 있습니다.

당신은 용자를 합니다.RAISE_APPLICATION_ERROR사용자의 코드/요구에 맞는 Oracle 스타일 예외/오류를 생성합니다.이러한 도움말을 잘 사용하면 보다 명확하고 유지 관리가 용이하며 디버깅하기 쉬운 코드를 생성할 수 있습니다.

예를 들어 사용자를 추가하는 저장 프로시저를 호출하는 응용 프로그램이 있고 해당 사용자가 이미 존재하는 경우 일반적으로 다음과 같은 오류가 반환됩니다.

ORA-00001: unique constraint (USERS.PK_USER_KEY) violated

분명히 이 오류 및 관련 메시지는 수행하려는 작업에만 해당되지 않습니다.고유한 Oracle 애플리케이션 오류를 생성하면 작업의 의도와 문제의 원인을 명확하게 파악할 수 있습니다.

raise_application_error(-20101, 'User ' || in_user || ' already exists!');

이제 응용 프로그램 코드는 이 특정 오류 조건을 처리하기 위해 예외 처리기를 작성할 수 있습니다.Oracle이 사용자가 정의한 "언어"(더 나은 용어가 없기 때문에)로 애플리케이션이 예상하는 오류 조건을 전달하고 애플리케이션의 문제 도메인에 더 의미가 있다고 생각할 수 있습니다.

사용자 정의 오류는 -20000과 -20999 사이의 범위에 있어야 합니다.

다음 링크는 이 항목과 일반적으로 Oracle 예외에 대한 많은 좋은 정보를 제공합니다.

Henry의 답변에 대해 좀 더 자세히 설명하자면, raise_application_error에서 특정 오류 코드를 사용하여 클라이언트 측에서 적절하게 처리할 수도 있습니다.예:

위치 레코드가 있는지 확인하기 위해 다음과 같은 PL/SQL 절차를 수행했다고 가정합니다.

   PROCEDURE chk_location_exists
   (
      p_location_id IN location.gie_location_id%TYPE
   )
   AS
      l_cnt INTEGER := 0;
   BEGIN
      SELECT COUNT(*)
        INTO l_cnt
        FROM location
       WHERE gie_location_id = p_location_id;

       IF l_cnt = 0
       THEN
          raise_application_error(
             gc_entity_not_found,
             'The associated location record could not be found.');
       END IF;
   END;

raise_application_error를 사용하면 특정 오류 코드를 발생시킬 수 있습니다.패키지 헤더에서 다음을 정의할 수 있습니다.gc_entity_not_found INTEGER := -20001;

다른 유형의 오류에 대해 다른 오류 코드가 필요한 경우 -20002, -20003 등을 사용하여 다른 오류 코드를 정의할 수 있습니다.

그런 다음 클라이언트 측에서 다음과 같은 작업을 수행할 수 있습니다(이 예제는 C#에 대한 것입니다).

/// <summary>
/// <para>Represents Oracle error number when entity is not found in database.</para>
/// </summary>
private const int OraEntityNotFoundInDB = 20001;

그리고 당신은 당신의 코드를 트라이/캐치에서 실행할 수 있습니다.

try
{
   // call the chk_location_exists SP
}
catch (Exception e)
{
    if ((e is OracleException) && (((OracleException)e).Number == OraEntityNotFoundInDB))
    {
        // create an EntityNotFoundException with message indicating that entity was not found in
        // database; use the message of the OracleException, which will indicate the table corresponding
        // to the entity which wasn't found and also the exact line in the PL/SQL code where the application
        // error was raised
        return new EntityNotFoundException(
            "A required entity was not found in the database: " + e.Message);
    }
}

만약 당신의 애플리케이션이 오라클로부터 error raise를 받아들인다면, 당신은 그것을 사용할 수 있습니다. 우리는 raise_application_error를 호출할 때마다, 그 애플리케이션은 우리가 이 방법을 통해 제공하는 error 메시지를 보여주기 위해 빨간색 상자를 팝업 할 것입니다.

닷넷 코드를 사용할 때, 나는 단지 "raise"를 사용하는데, 닷넷 예외 mechanisim은 오라클 ODP에 의해 전달되고 내 캐치 예외 코드 안에 표시되는 오류를 자동으로 캡처할 것입니다.

언급URL : https://stackoverflow.com/questions/1760596/oracle-what-is-the-situation-to-use-raise-application-error