Anasayfa > ORA-Errors, SQL-PL/SQL > ORA-06508 | ORA-04065 | ORA-04068 Hatalarını Nasıl Çözeriz?

ORA-06508 | ORA-04065 | ORA-04068 Hatalarını Nasıl Çözeriz?

Merhaba Arkadaşlar,

Bu yazımda, ORA-06508, ORA-04065, ORA-04068 hataları ile karşılaştığımızda ne yapmamız gerektiğini yazacağım. Bir paket veya prosedür içinden çağırılan bağımlı bir nesne, DDL cümlesi ile değiştirildiğinde, çağıran paket veya prosedür ORA-04068 hatası ile karşılaşır. Bunun sebebi paketler derlendiklerinde shared_pool alanındaki kopyaları invalid olarak işaretlenir. Bu esnada çağıran paket çağrılan paketin yeni bir kopyasının olduğunu anlar. Ve ORA-04068 hatası alınır. Çağıran paket veya procedure bu hatayı ilk çağırdığı esnada alır. İkinci kez çağırdığında işlem başarılı olarak gerçekleştirilir. Ama bazı durumlarda bu hatalardan kurtulmak için kodumuzda küçük bir değişiklik yapmamız gerekebilir.

Şimdi bu konu ile ilgili bir test yapalım. Aşağıdaki gibi talip_test adında bir paket oluşturuyorum. Paketin SPEC kısmında global bir değişken tanımlayalım.

CREATE OR REPLACE PACKAGE talip_test
IS
global_var NUMBER := 10;

PROCEDURE inner_test_proc;
END;
/

CREATE OR REPLACE PACKAGE BODY talip_test
IS
PROCEDURE inner_test_proc
IS
BEGIN
global_var := global_var + 1;
DBMS_OUTPUT.put_line (‘Değişken =’ || global_var);
END;
END;
/

Şimdide bu paketi çağıracak olan bir procedure oluşturalım.

CREATE OR REPLACE PROCEDURE outer_test_proc
AS
err VARCHAR2 (1024);
BEGIN
talip_test.inner_test_proc;
END;
/

SQL*Plus üzerinde prosedürü çalıştırdığımızda başarılı çalıştığını görürüz.

SQL> set serveroutput on

SQL> begin outer_test_proc; end; /

Değişken =12

PL/SQL procedure successfully completed.

Şimdi talip_test paketinin SPEC kısmında biraz değişiklik yapalım. İkinci bir global değişken ekleyelim. Ve SPEC+BODY yeniden derleyelim.

CREATE OR REPLACE PACKAGE talip_test
IS
global_var NUMBER := 10;
global_var2 NUMBER := 10;

PROCEDURE inner_test_proc;
END;
/

CREATE OR REPLACE PACKAGE BODY talip_test
IS
PROCEDURE inner_test_proc
IS
BEGIN
global_var := global_var + 1;
DBMS_OUTPUT.put_line (‘Değişken =’ || global_var);
END;
END;
/

outer_test_proc prosedürü invalid olacaktır. Prosedürümüzü aşağıdaki gibi derleyelim.

SQL> select status from dba_objects where object_name=’OUTER_TEST_PROC’;

STATUS

——-

INVALID

SQL> alter procedure outer_test_proc compile ;

SQL> select status from dba_objects where object_name=’OUTER_TEST_PROC’;

STATUS

——-

VALID

Bu durumda veritabanına bağlı olan oturumlar (session) prosedürü çağırdıklarında aşağıdaki gibi ORA-04068 hatası alırlar. Paketi çağıran oturum bu hatayı sadece bir kere alır.

SQL>begin outer_test_proc; end; /

begin outer_test_proc; end;

* ERROR at line 1: ORA-04068: existing state of packages has been discarded

ORA-04061: existing state of package body “TALIP.TALIP_TEST” has been invalidated

ORA-04065: not executed, altered or dropped package body “TALIP.TALIP_TEST”

ORA-06508: PL/SQL: could not find program unit being called: “TALIP.TALIP_TEST”

ORA-06512: at “TALIP.OUTER_TEST_PROC”, line 5 ORA-06512: at line 1

Aynı oturum ikinci kez çalıştırdığında paket başarılı çalıştırılır.

SQL> set serveroutput on

SQL> /

Değişken =12

PL/SQL procedure successfully completed.

Çağıran paket veya procedure de “when others then” ile exception handling yapılıyorsa, veritabanına bağlı oturumlar paketi her çağırdıklarında hata alırlar. Şimdi outer_test_proc prosedürümüzü aşağıdaki gibi değiştirelim.

CREATE OR REPLACE PROCEDURE outer_test_proc
AS
err VARCHAR2 (1024);
BEGIN
talip_test.inner_test_proc;
EXCEPTION
WHEN OTHERS
THEN
err := SUBSTR (SQLERRM, 0, 1000);
DBMS_OUTPUT.put_line (err);
ROLLBACK;
END;
/

Şimdi talip_test paketinin SPEC kısmında biraz değişiklik yapalım. Üçüncü bir global değişken ekleyelim. Ve SPEC+BODY yeniden derleyelim.

CREATE OR REPLACE PACKAGE talip_test
IS
global_var NUMBER := 10;
global_var2 NUMBER := 10;
global_var3 NUMBER := 10;

PROCEDURE inner_test_proc;
END;
/

CREATE OR REPLACE PACKAGE BODY talip_test
IS
PROCEDURE inner_test_proc
IS
BEGIN
global_var := global_var + 1;
DBMS_OUTPUT.put_line (‘Değişken =’ || global_var);
END;
END;
/

outer_test_proc prosedürü invalid olacaktır. Prosedürümüzü aşağıdaki gibi derleyelim.

SQL> select status from dba_objects where object_name=’OUTER_TEST_PROC’;

STATUS

——-

INVALID

SQL> alter procedure outer_test_proc compile ;

SQL> select status from dba_objects where object_name=’OUTER_TEST_PROC’;

STATUS

——-

VALID

Bu durumda outer_test_proc prosedürü valid olmasına rağmen, veritabanına bağlı oturumlar outer_test_proc prosedürünü her çağırdıklarında ORA-06508 hatası alırlar.

SQL> begin outer_test_proc; end; /

ORA-06508: PL/SQL: could not find program unit being called

PL/SQL procedure successfully completed.

SQL> /

ORA-06508: PL/SQL: could not find program unit being called

PL/SQL procedure successfully completed.

“when others then” bloğu içerisinde exception tekrar aşağıdaki gibi raise edilirse, bağlı oturumlar prosedürü ilk çağırdıklarında hata alırlar ve ikinci kez çağırdıklarında işlem başarılı gerçekleşir.

CREATE OR REPLACE PROCEDURE outer_test_proc
AS
err VARCHAR2 (1024);
BEGIN
talip_test.inner_test_proc;
EXCEPTION
WHEN OTHERS
THEN
err := SUBSTR (SQLERRM, 0, 1000);
DBMS_OUTPUT.put_line (err);
ROLLBACK;
RAISE;
END;
/

Şimdi terkrar çalıştıralım. İlk çalıştırdığımızda hata alacağız. Tekrar çalıştırdığımızda işlem başarılı gerçekleşecektir.

SQL> begin outer_test_proc; end; /

begin outer_test_proc; end;

* ERROR at line 1: ORA-04068: existing state of packages has been discarded

ORA-04061: existing state of package “TALIP.TALIP_TEST” has been invalidated

ORA-04065: not executed, altered or dropped package “TALIP.TALIP_TEST”

ORA-06508: PL/SQL: could not find program unit being called: “TALIP.TALIP_TEST”

ORA-06512: at “TALIP.OUTER_TEST_PROC”, line 11 ORA-06512: at line 1

SQL> /

PL/SQL procedure successfully completed.

Faydalı olması dileğiyle…

Talip Hakan Öztürk

  1. yavuz
    29/01/2013, 11:32 pm

    Maşallah hocam🙂 Henüz o kadar ilerleyemesem de ilerde kesin başıma gelir böyle hatalar🙂 şimdilik uygulama öğrenme ve anlama aşamasındayım…

  2. 12/02/2013, 11:23 am

    Sürekli karşılan bir problem, çok teşekkürler..

  3. mehmet akif olgun
    26/11/2013, 9:08 pm

    bu hata çkys siteminde stok işlemlerinde sık sık karsılasıyoruz.ckys mühendisleri dikkatini cekmek lazım🙂

  1. No trackbacks yet.

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Connecting to %s

%d blogcu bunu beğendi: