Oracle 10G ile birlikte gelen yeni paketlerden biridir DBMS_ERRORLOG. Bu sayede yoğun işlemlerininizi, işlemleriniz kesilmeden yapabilirsiniz. Oluşan hataların ayrı bir yere aktarılması ile daha sonra oluşan hataları gözlemleyip, gerekli aksiyonları alabilirsiniz.
Aşağıda yaptığım örnekte 100000 kayıtlık bir insert işleminde olabilecek hatalardan dolayı bu paketin kullanılmasının avantajı belirtilmiştir.
Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0
Connected as HR
SQL>
SQL> drop table error_log_test;
Table dropped
Executed in 0,016 seconds
Tablo Oluşturulur. İçine kayıt eklenir.
SQL> create table error_log_test( i number );
Table created
Executed in 0 seconds
SQL> DECLARE
2 i NUMBER := 0;
3 BEGIN
4 FOR i IN 1 .. 100000 LOOP
5 INSERT INTO error_log_test VALUES (i);
6 IF MOD(i, 1000) = 0 THEN
7 COMMIT;
8 END IF;
9 END LOOP;
10
11 END;
12 /
PL/SQL procedure successfully completed
Executed in 4,031 seconds
SQL> SELECT COUNT(*) FROM error_log_test;
COUNT(*)
----------
100000
Executed in 0,016 seconds
Kayıtların ekleneceği demo tablo oluşturulur.
SQL> drop table error_log_test_demo;
Table dropped
Executed in 0,219 seconds
SQL> drop table err$_error_log_test_demo;
drop table err$_error_log_test_demo
ORA-00942: table or view does not exist
SQL> create table error_log_test_demo( x number );
Table created
Executed in 0,016 seconds
Kısıtlar eklenir. Bu sayede hata oluşmasını sağlıyoruz.
SQL> alter table error_log_test_demo add constraint more_than_99990 check( x < 99990 );
Table altered
Executed in 0,015 seconds
SQL> alter table error_log_test_demo add constraint less_than_10 check( x > 10 );
Table altered
Executed in 0 seconds
dbms_errlog.create_error_log prosedürü ile hata esnasında gidilecek tablo oluşturulur.
SQL> BEGIN
2 dbms_errlog.create_error_log('error_log_test_demo');
3 END;
4 /
PL/SQL procedure successfully completed
Executed in 0,016 seconds
SQL> describe err$_error_log_test_demo;
Name Type Nullable Default Comments
--------------- -------------- -------- ------- --------
ORA_ERR_NUMBER$ NUMBER Y
ORA_ERR_MESG$ VARCHAR2(2000) Y
ORA_ERR_ROWID$ UROWID(4000) Y
ORA_ERR_OPTYP$ VARCHAR2(2) Y
ORA_ERR_TAG$ VARCHAR2(2000) Y
X VARCHAR2(4000) Y
dbms_errlog kullanılmadan ekleme işlemi yapılmaya çalışılır.
SQL> insert into error_log_test_demo select * from error_log_test;
insert into error_log_test_demo select * from error_log_test
ORA-02290: check constraint (HR.LESS_THAN_10) violated
dbms_errlog ile ekleme işlemi yapılır. Hatalı kayıtlar err$_error_log_test_demo tablosuna aktarılır.
SQL> INSERT INTO error_log_test_demo
2 SELECT * FROM error_log_test log errors reject LIMIT unlimited;
99979 rows inserted
Executed in 5,953 seconds
SQL> SELECT COUNT(*) FROM error_log_test_demo;
COUNT(*)
----------
99979
Executed in 0,016 seconds
Eklenemeyen kayıtlar ve neden eklenemdikleri buradan görülebilir.
SQL> select ed.ora_err_mesg$, ed.x from err$_error_log_test_demo ed ;
ORA_ERR_MESG$ X
------------------------------------------------------ ----
ORA-02290: check constraint (HR.LESS_THAN_10) violated 1
ORA-02290: check constraint (HR.LESS_THAN_10) violated 2
ORA-02290: check constraint (HR.LESS_THAN_10) violated 3
ORA-02290: check constraint (HR.LESS_THAN_10) violated 4
ORA-02290: check constraint (HR.LESS_THAN_10) violated 5
ORA-02290: check constraint (HR.LESS_THAN_10) violated 6
ORA-02290: check constraint (HR.LESS_THAN_10) violated 7
ORA-02290: check constraint (HR.LESS_THAN_10) violated 8
ORA-02290: check constraint (HR.LESS_THAN_10) violated 9
ORA-02290: check constraint (HR.LESS_THAN_10) violated 10
ORA-02290: check constraint (HR.MORE_THAN_99990) violated 99990
ORA-02290: check constraint (HR.MORE_THAN_99990) violated 99991
ORA-02290: check constraint (HR.MORE_THAN_99990) violated 99992
ORA-02290: check constraint (HR.MORE_THAN_99990) violated 99993
ORA-02290: check constraint (HR.MORE_THAN_99990) violated 99994
ORA-02290: check constraint (HR.MORE_THAN_99990) violated 99995
ORA-02290: check constraint (HR.MORE_THAN_99990) violated 99996
ORA-02290: check constraint (HR.MORE_THAN_99990) violated 99997
ORA-02290: check constraint (HR.MORE_THAN_99990) violated 99998
ORA-02290: check constraint (HR.MORE_THAN_99990) violated 99999
ORA-02290: check constraint (HR.MORE_THAN_99990) violated 100000
21 rows selected
Executed in 0,047 seconds
SQL>
No comments:
Post a Comment