مدیرت خطا ها در اوراکل اپکس 5
در این آموزش قصد داریم با یک مثال نحوه مدیریت و ترجمه خطا ها در اوراکل اپکس را آموزش دهیم.
ابتدا یک جدول با نام members و با ساختار زیر ایجاد کنید.
create table members(id number,fname varchar2(20));
حال یک constraint با نام UNIQUE_ID_MEMBERS از نوع primary key برای جدول فوق ایجاد می کنیم.
ALTER TABLE members ADD
CONSTRAINT UNIQUE_ID_MEMBERS
PRIMARY KEY (ID)
ENABLE
VALIDATE
حال در Application خود در اپکس یک فرم برای جدول فوق ایجاد نمایید.
همان طور که خودتان بهتر می دانید در جدول members فیلد id از نوع PRIMARY KEY است و چنانچه کاربر مقدار تکراری برای ID وارد کند با خطای زیر برخورد می کند.
حال می خواهیم به جای نمایش پیغام به صورت لاتین. این پیغام رو به صورت فارسی ترجمه و به کاربر نمایش دهیم. برای این کار مراحل زیر را دنبال کنید.
1- ابتدا یک جدول برای نگهداری متن ترجمه خطا ها ایجاد کنید.
CREATE TABLE CONSTRAINT_MESSAGE
(
CONSTRAINT_NAME VARCHAR2(30 BYTE) NOT NULL,
MESSAGE VARCHAR2(4000 BYTE) NOT NULL
);
و سپس تمامی CONSTRAINT ها و متن ترجمه را در جدول فوق درج کنید.
مثال:
INSERT INTO CONSTRAINT_MESSAGE VALUES('UNIQUE_ID_MEMBERS','سریال تکراری است');
نکته: در جدول CONSTRAINT_MESSAGE نام آبجکت Constraint خود را با حروف بزرگ درج کنید.
2- حال یک function با نام apex_error_handling_example و با ساختار زیر ایجاد کنید.
CREATE OR REPLACE function apex_error_handling_example (
p_error in apex_error.t_error )
return apex_error.t_error_result
is
l_result apex_error.t_error_result;
l_reference_id number;
l_constraint_name varchar2(255);
begin
l_result := apex_error.init_error_result (
p_error => p_error );
if p_error.is_internal_error then
if p_error.apex_error_code <> 'APEX.AUTHORIZATION.ACCESS_DENIED' then
l_result.message := 'An unexpected internal application error has occurred. '||
'Please get in contact with XXX and provide '||
'reference# '||to_char(l_reference_id, '999G999G999G990')||
' for further investigation.';
l_result.additional_info := null;
end if;
else
l_result.display_location := case
when l_result.display_location = apex_error.c_on_error_page then apex_error.c_inline_in_notification
else l_result.display_location
end;
if p_error.ora_sqlcode in (-1, -2091, -2290, -2291, -2292) then
l_constraint_name := apex_error.extract_constraint_name (
p_error => p_error );
begin
select message
into l_result.message
from CONSTRAINT_MESSAGE
where constraint_name = l_constraint_name;
exception when no_data_found then null; -- not every constraint has to be in our lookup table
end;
end if;
if p_error.ora_sqlcode is not null and l_result.message = p_error.message then
l_result.message := apex_error.get_first_ora_error_text (
p_error => p_error );
end if;
if l_result.page_item_name is null and l_result.column_alias is null then
apex_error.auto_set_associated_item (
p_error => p_error,
p_error_result => l_result );
end if;
end if;
return l_result;
end apex_error_handling_example;
3- وارد تنظیمات Application خود شوید برای اینکار در صفحه مربوط به Application بر روی گزینه Edit Application Definition کلیک کنید.
4- حال در قسمت Error Handling Function در تب Error Handling نام تابعی را که در مرحله قبل ایجاد کرده اید وارد نمایید و سپس بر روی گزینه Apply Changes کلیک کنید.
5- حال دوباره Application خود را Run کنید و در صفحه ای که برای جدول members ایجاد کرده اید یک رکورد با id تکراری درج کنید.