Home » Server Options » Streams & AQ » ORA-21000: error number argument to raise_application_error of -1722 is out of range (Oracle 10.2.0)
ORA-21000: error number argument to raise_application_error of -1722 is out of range [message #309551] |
Thu, 27 March 2008 17:59 |
basirana
Messages: 25 Registered: July 2006
|
Junior Member |
|
|
I am trying to write conflict resolution procedure. When I try to raise a conflict it is not handle properly. I went o dba_apply_error and see below message.
ORA-21000: error number argument to raise_application_error of -1722 is out of range
ORA-06512: at "TBL_COUNTRIES_PKG", line 106
ORA-06512: at line 1
ORA-01403: no data found
CREATE OR REPLACE PACKAGE tbl_countries_pkg
AS
TYPE emsg_array IS TABLE OF VARCHAR2(2000) INDEX BY BINARY_INTEGER;
PROCEDURE update_countries(
message IN ANYDATA, error_stack_depth IN NUMBER,
error_numbers IN DBMS_UTILITY.NUMBER_ARRAY, error_messages IN EMSG_ARRAY);
END tbl_countries_pkg ;
/
CREATE OR REPLACE PACKAGE BODY tbl_countries_pkg AS
PROCEDURE update_countries(
message IN ANYDATA, error_stack_depth IN NUMBER,
error_numbers IN DBMS_UTILITY.NUMBER_ARRAY, error_messages IN EMSG_ARRAY )
IS
ad ANYDATA;
lcr SYS.LCR$_ROW_RECORD;
ret PLS_INTEGER;
key COUNTRIES.COUNTRY%TYPE;
new_time_stamp TIMESTAMP;
db_row COUNTRIES%ROWTYPE;
v_update varchar2(2) := 'Y';
key_column_missing EXCEPTION;
PRAGMA EXCEPTION_INIT(key_column_missing, -20101);
begin
----print old and new values of tbl_prder---
--- util_pkg.print_anydata(message);
----print old and new values of tbl_prder---
-- access the LCR.
ret := message.getobject(lcr);
/*
ad := lcr.get_value('new','last_updated','n');
if( ad is not null) then -- error if null
new_time_stamp := ad.accesstimestamp();
else
RAISE_APPLICATION_ERROR(-20101, 'missing last_updated value');
end if;
*/
ad := lcr.get_value('old','modified_by');
if( ad is not null) then
key := ad.accessVarchar2();
begin
SELECT * into db_row from COUNTRIES where COUNTRY = key;
-- error if row not found
EXCEPTION
WHEN NO_DATA_FOUND THEN -- catches all 'no data found' errors
RAISE_APPLICATION_ERROR(SQLCODE, SQLERRM);
end;
if( v_update = 'Y' ) then
--COUNTRY
ad := lcr.get_value('old','country');
if (ad is not null) then
lcr.set_value('old','country',ANYDATA.ConvertVarChar2(db_row.country));
end if;
--DT_CREATED
ad := lcr.get_value('old','dt_created');
if (ad is not null) then
lcr.set_value('old','dt_created',ANYDATA.ConvertDate(db_row.dt_created));
end if;
--DT_MODIFIED
ad := lcr.get_value('old','dt_modified');
if (ad is not null) then
lcr.set_value('old','dt_modified',ANYDATA.ConvertDate(db_row.dt_modified));
end if;
--MODIFIED_BY
ad := lcr.get_value('old','modified_by');
if (ad is not null) then
lcr.set_value('old','modified_by',ANYDATA.ConvertVarchar2(db_row.modified_by));
end if;
--DIAL_COUNTRY_CODE
ad := lcr.get_value('old','dial_country_code');
if (ad is not null) then
lcr.set_value('old','dial_country_code',ANYDATA.ConvertVarchar2(db_row.dial_country_code));
end if;
--SHOW_DISQUALIFIED_INV_YN
ad := lcr.get_value('old','show_disqualified_inv_yn');
if (ad is not null) then
lcr.set_value('old','show_disqualified_inv_yn',ANYDATA.ConvertVarchar2(db_row.show_disqualified_inv_yn));
end if;
--CP_COUNTRY_CODE
ad := lcr.get_value('old','cp_country_code');
if (ad is not null) then
lcr.set_value('old','cp_country_code',ANYDATA.ConvertVarchar2(db_row.cp_country_code));
end if;
--NLS_SORT
ad := lcr.get_value('old','nls_sort');
if (ad is not null) then
lcr.set_value('old','nls_sort',ANYDATA.ConvertVarchar2(db_row.nls_sort));
end if;
--ISO_COUNTRY_CODE
ad := lcr.get_value('old','iso_country_code');
if (ad is not null) then
lcr.set_value('old','iso_country_code',ANYDATA.ConvertVarchar2(db_row.iso_country_code));
end if;
lcr.execute(true);
end if;
end if;
EXCEPTION
WHEN OTHERS THEN -- catches all error
RAISE_APPLICATION_ERROR(SQLCODE, SQLERRM);
end update_countries;
end tbl_countries_pkg;
/
|
|
|
Re: ORA-21000: error number argument to raise_application_error of -1722 is out of range [message #309561 is a reply to message #309551] |
Thu, 27 March 2008 21:51 |
rajatratewal
Messages: 507 Registered: March 2008 Location: INDIA
|
Senior Member |
|
|
EXCEPTION
WHEN OTHERS THEN
RAISE_APPLICATION_ERROR(SQLCODE, SQLERRM);
First thing handling Exception with OTHERS is not a good practice.
Second Thing is that RAISE_APPLICATION_ERROR Syntax is not correct.
RAISE_APPLICATION_ERROR allows the application to raise application errors rather than just Oracle errors.Error numbers are defined between -20,000 and -20,999.
But You Are Using SQLCODE in It.
And Getting
ORA-21000: error number argument to raise_application_error of -1722 is out of range
Third Thing is that whenever you write RAISE_APPLICATION_ERROR
it gives control back to calling environment and you will see that your procedure is not successfully executed.
|
|
|
|
Re: ORA-21000: error number argument to raise_application_error of -1722 is out of range [message #309573 is a reply to message #309567] |
Thu, 27 March 2008 23:27 |
rajatratewal
Messages: 507 Registered: March 2008 Location: INDIA
|
Senior Member |
|
|
It's A Run Time Error.It has nothing to do with compilation.
It has nothing to do wih DBA_APPLY_ERROR.
DBA_APPLY_ERROR displays information about error transactions generated by all apply processes in the database.
When u use RAISE_APPLICATION_ERROR and error occurs procedure immediately terminates and return control to calling environment.
Instead of:-
RAISE_APPLICATION_ERROR(SQLCODE, SQLERRM);
Try This:-
RAISE_APPLICATION_ERROR(<-20,000 To -20,999>, SQLERRM);
Select any number in Between this range Like
RAISE_APPLICATION_ERROR(-20,000,SQLERRM);
But you will see the error in DBA_APPLY_ERROR becuase if again some runtime error occurs program terminates.
Quote: |
If you don't wan't to Raise Error To calling environment and don't wan't to see it in DBA_APPLY_ERROR then remove RAISE_APPLICATION_ERROR and Make some error routine to handle
the error that store error information in database.
|
|
|
|
Re: ORA-21000: error number argument to raise_application_error of -1722 is out of range [message #309577 is a reply to message #309551] |
Fri, 28 March 2008 00:16 |
flyboy
Messages: 1903 Registered: November 2006
|
Senior Member |
|
|
I agree that this is run-time error. However I would not take this approach. This will lead just to hiding the actual error code to the application, so harder analyzing what really is wrong.
EXCEPTION
WHEN OTHERS THEN -- catches all error
RAISE_APPLICATION_ERROR(SQLCODE, SQLERRM);
If you do not want to do anything useful in this EXCEPTION block, just get rid of it.
If you want to do some processing (eg. error logging), do it there; re-raising the error can be done by RAISE Statement without parameters. However you will lose the line number where the error occured, so, you will again need extra effort to analyze the error (eg. some kind of logging in the procedure).
In your case: would not it be better removing the EXCEPTION block and get ORA-01722 with the line where it happened?
|
|
|
Goto Forum:
Current Time: Wed Dec 11 16:38:47 CST 2024
|