“ORA-01722: invalid number” ilə “ORA-06502: numeric or value error” xətalarının fərqi
Aşağıdakı kodlara baxıb baş verəcək Oracle xətasını müəyyənləşdirməyə çalışın.
-- Nümunə kod 1
select to_number('123a') from dual
-- Nümunə kod 2
declare
l_number number;
begin
select to_number('123a') into l_number from dual;
dbms_output.put_line(l_number);
end;
-- Nümunə kod 3
declare
l_number number;
begin
l_number := to_number('123a');
dbms_output.put_line(l_number);
end;
Nümunə kod 1-də ORA-01722: invalid number xətası çıxacaq.
Nümunə kod 2-də ORA-01722: invalid number xətası çıxacaq.
Nümunə kod 3-də ORA-06502: PL/SQL: numeric or value error: character to number conversion error xətası çıxacaq.
Yuxarıdakı nümunə kodlardan göründüyü kimi “ORA-01722: invalid number” xətası SQL sorğusunda baş verir, bu SQL sorğusu PL/SQL proqramında da ola bilər(nümunə 2-də olduğu kimi).
“ORA-06502: numeric or value error” xətası isə ancaq PL/SQL proqramında baş verir.
Məntiqi olaraq bunların hər ikisi eyni xəta olsa da xətanın baş vermə yerinə görə(SQL və ya PL/SQL context) Oracle onlara ayrı xəta kodları və mesajı vermişdir. Buna görə də diqqətli olub PL/SQL proqramının exception handler kodlarında bu nüansı nəzərə almaq lazımdır.
Yuxarıdakı nümunə 2 və 3-də verilmiş PL/SQL kodlarını düzgün exception handler ilə aşağıdakı kimi olmalıdır:
-- Nümunə kod 2
declare
l_number number;
begin
select to_number('123a') into l_number from dual;
dbms_output.put_line(l_number);
exception
when INVALID_NUMBER then
dbms_output.put_line('SQL invalid number error ' || dbms_utility.format_error_backtrace);
dbms_output.put_line('SQL invalid number error ' || dbms_utility.format_error_stack);
end;
-- Nümunə kod 3
declare
l_number number;
begin
l_number := to_number('123a');
dbms_output.put_line(l_number);
exception
when VALUE_ERROR then
dbms_output.put_line('PL/SQL value error ' || dbms_utility.format_error_backtrace);
dbms_output.put_line('PL/SQL value error ' || dbms_utility.format_error_stack);
end;
Ümid edirəm ki, aydın oldu. Happy PL/SQL development



Əla. Təşəkkür.
Fariz
2 May 2011
Dəyməz.
Ramin Orucov
2 May 2011