11 September 2006

Using DBMS_ERRORLOG Package

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: