Kimi zaman bir işi yapan birden fazla yol bulunabilir. Sonuca ulaşmanız, yönteminizin en doğru yol olduğunu göstermez. Bunun bir örnek uygulamasını aşağıdaki sorguda görebilirsiniz.
Aynı sonucu üreten iki sorgudan biri regexp_like ile diğeri ise like ile yapılmış. Aralarındaki fark yaklaşık 7 kat...
Connected to Oracle Database 10g Enterprise Edition Release 10.1.0.2.0
Connected as SYSADM
SQL> set timing on
SQL>
SQL> SELECT *
2 FROM user_source
3 WHERE regexp_like(text, '(INSERT INTO |UPDATE )PARAMETER_VALUE ')
4 /
NAME TYPE LINE TEXT
------------------------------ ------------ ---------- ----------------
......
19 rows selected
Executed in 29,812 seconds
SQL>
SQL> SELECT *
2 FROM user_source
3 WHERE text LIKE '%UPDATE PARAMETER_VALUE %'
4 OR text LIKE '%INSERT INTO PARAMETER_VALUE %'
5 /
NAME TYPE LINE TEXT
------------------------------ ------------ ---------- ----------------
............
19 rows selected
Executed in 4,219 seconds
SQL>
12 September 2006
11 September 2006
Calling External Functions Inside PL/SQL

forums.oracle ve otn den edindiğim bilgiler doğrultusunda bu işlemin nasıl yapılabileceğini kısaca belirtmeye çalışacağım.
- Bir java class ı yazıp bunun içinden shell komutları çalıştırmak. Bu java source unu da bir PL/SQL ile sarmallayıp işlemi gerçekleştirmek. Aşağıda java tarafında bu işi gerçekleyen komut bulunmaktadır. Tam bir örnek için tıklayınız...
Process p = rt.exec( commandText );
- dbms_scheduler paketi ile. Bu sayede sh uzantılı bir dosya oluşturup yapacağınız işlemi bu jobu çalıştırarak yapabilirsiniz. Job ı create ederken job_type => 'executable' parametresini vermek gerekiyor.
- DBMS_PIPE paketi ile. Bu paket içine ilgili C fonksiyonunu yazıp çağırabilirsiniz. C içinden system() bıilt-in fonksiyonunu çağırarak işleminizi yapabilirsiniz. Daha sonra oracle içinden bir LIBRARY oluşturup bu library yi kullanabilirsiniz.
Ama şunu unutmamak gerekir ki, işletim sistemine ait komutların çağırılması güvenlik açısından sizde sıkıntı oluşturabilir. Çünkü işletim sisteminde komut çağırabilme hakkı, kimi art niyetli kişiler tarafından kullanılabilir.
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>
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>
Subscribe to:
Posts (Atom)