INVALID OBJELERIN DERLENMESI (INVALID OBJECTS RECOMPILE)

Upgrade, patching ve bazı DDL değişiklikleri, bazı veritabanı nesnelerini geçersiz (Invalid objects) hale getirebilir. Nesneler yeniden derlenebilir. İnvalid Olmuş Objeleri bulmak için;

COLUMN object_name FORMAT A30
SELECT owner,
       object_type,
       object_name,
       status
FROM   dba_objects
WHERE  status = 'INVALID'
ORDER BY owner, object_type, object_name;

Bu sorgunun çıktısına göre Objeleri nasıl yeniden derleyeceğimize karar veririz.

El Yordamı İle Recompile Etmek: Az sayıda invalid object varsa tercih edilebilir. Örnekler aşağıda verilmiştir.

ALTER PACKAGE my_package COMPILE;
ALTER PACKAGE my_package COMPILE BODY;
ALTER PROCEDURE my_procedure COMPILE;
ALTER FUNCTION my_function COMPILE;
ALTER TRIGGER my_trigger COMPILE;
ALTER VIEW my_view COMPILE;

Veya

EXEC DBMS_DDL.alter_compile('PACKAGE', 'MY_SCHEMA', 'MY_PACKAGE');
EXEC DBMS_DDL.alter_compile('PACKAGE BODY', 'MY_SCHEMA', 'MY_PACKAGE');
EXEC DBMS_DDL.alter_compile('PROCEDURE', 'MY_SCHEMA', 'MY_PROCEDURE');
EXEC DBMS_DDL.alter_compile('FUNCTION', 'MY_SCHEMA', 'MY_FUNCTION');
EXEC DBMS_DDL.alter_compile('TRIGGER', 'MY_SCHEMA', 'MY_TRIGGER');

Çok sayıda invalid Obje varsa Tek tek uğraşmak zor olabilir bu durumda aşağıdaki gibi bir plsql kod bloğu ile toplu olarak bu işlem yapılabilir.

SET SERVEROUTPUT ON SIZE 1000000
BEGIN
  FOR cur_rec IN (SELECT owner,
                         object_name,
                         object_type,
                         DECODE(object_type, 'PACKAGE', 1,
                                             'PACKAGE BODY', 2, 2) AS recompile_order
                  FROM   dba_objects
                  WHERE  object_type IN ('PACKAGE', 'PACKAGE BODY')
                  AND    status != 'VALID'
                  ORDER BY 4)
  LOOP
    BEGIN
      IF cur_rec.object_type = 'PACKAGE' THEN
        EXECUTE IMMEDIATE 'ALTER ' || cur_rec.object_type || 
            ' "' || cur_rec.owner || '"."' || cur_rec.object_name || '" COMPILE';
      ElSE
        EXECUTE IMMEDIATE 'ALTER PACKAGE "' || cur_rec.owner || 
            '"."' || cur_rec.object_name || '" COMPILE BODY';
      END IF;
    EXCEPTION
      WHEN OTHERS THEN
        DBMS_OUTPUT.put_line(cur_rec.object_type || ' : ' || cur_rec.owner || 
                             ' : ' || cur_rec.object_name);
    END;
  END LOOP;
END;
/

UTL_RECOMP

Oracle tarafından sağlanan bu paketi tercih etmek daha mantıklı olabilir, oracle birçok bağımlığı hesaba katarak bu işlemi yapacaktır. UTL_RECOMP paketi objeleri derlemek için kullanılan iki adet procedure içermektedir. RECOMP_SERIAL tüm geçersiz nesleri tek tek recompile ederken RECOMP_PARALLEL ise belirtilen parallelikte bu işlemi gerçekleştirir.

PROCEDURE RECOMP_SERIAL(
   schema   IN   VARCHAR2    DEFAULT NULL,
   flags    IN   PLS_INTEGER DEFAULT 0);

PROCEDURE RECOMP_PARALLEL(
   threads  IN   PLS_INTEGER DEFAULT NULL,
   schema   IN   VARCHAR2    DEFAULT NULL,
   flags    IN   PLS_INTEGER DEFAULT 0);

Örnek

-- Schema level.
EXEC UTL_RECOMP.recomp_serial('SCOTT');
EXEC UTL_RECOMP.recomp_parallel(4, 'SCOTT');

-- Database level.
EXEC UTL_RECOMP.recomp_serial();
EXEC UTL_RECOMP.recomp_parallel(4);

-- Using job_queue_processes value.
EXEC UTL_RECOMP.recomp_parallel();
EXEC UTL_RECOMP.recomp_parallel(NULL, 'SCOTT');

Bu paketin kullanımı ile ilgili bir dizi kısıtlamam mevcuttur.

  • Compile işlemi tamamlanan kadar job lar disable halde kalır.
  • Bu paket yanlızca sysdba yetkisi ile kullanılabilir.
  • DDL işlemleri ile aynı anda çalıştırmak Deadlock a neden olabilir

Utlrp.sql VE utlprp.sql

Veritabanındaki tüm geçersiz nesneleri recomple yapmak için oracle tarafından sağlanan genellikle upgrade ve patch işlemleri gibi veritabanında yapılan büyük değişikler sonrasında veritabanında çalıştırlır. $ORACLE_HOME/rdbms/admin dizini altındadır. SYSDBA yetkisi olan bir user ile çalıştırılabilir.

DBMS_UTILITY.compile_schema

DBMS_UTILITY paketindeki compile_schema procedur belirtilen schema daki tüm fonksiyonları, paketleri, trigger ları compile eder.

EXEC DBMS_UTILITY.compile_schema(schema => 'SCOTT', compile_all => false);