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
'source' 카테고리의 다른 글
Git에서 두 분기를 함께 병합 (0) | 2023.06.24 |
---|---|
_로 시작하는 변수 이름은 무엇을 의미합니까? (0) | 2023.06.24 |
Mongodb - 잘못된 쿼리: 잘못된 값 알 수 없는 최상위 연산자: $gte (0) | 2023.06.24 |
두 Python 사전에 포함된 키의 차이 계산 (0) | 2023.06.24 |
CX_Oracle - Oracle에서 Pandas 데이터 프레임으로 데이터 가져오기 (0) | 2023.06.24 |