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);