2014年6月12日 星期四

Oracle - 找出壞掉的物件重新 compile


最近在交易檔加了一個欄位,然後一干人等全部都壞掉了,
因為壞掉的有一狗票,所以不太可能一個、一個慢慢去把它修好,
所以找了一下,寫成以下偷懶寫法:

SELECT 'ALTER ' || DECODE(SUBSTR(OBJECT_TYPE, 1, 7), 'PACKAGE', ' PACKAGE', OBJECT_TYPE) 
       || ' ' || OBJECT_NAME || ' COMPILE' 
       || DECODE(SUBSTR(OBJECT_TYPE, 1, 7), 'PACKAGE', ' PACKAGE;', ';')
FROM USER_OBJECTS
WHERE OBJECT_TYPE IN ('FUNCTION', 'PROCEDURE', 'PACKAGE', 'PACKAGE BODY')
      AND STATUS = 'INVALID';

簡單的說就是透過 USER_OBJECTS 這個資料表的 STATUS 來找出壞掉的物件,
要注意的是 PACKAGE 的 OBJECT_TYPE 會分成 PACKAGE 跟 PACKAGE BODY 這兩個,
所以要特別處理一下。

參考一下 ALTER PACKAGE

可以針對 PACKAGE BODY Recompile ,可能有省一點工吧?

ALTER PACKAGE hr.emp_mgmt COMPILE BODY; 

不過我想我還是直接對整個 PACKAGE Compile 吧!

ALTER PACKAGE emp_mgmt COMPILE PACKAGE;

我想等等阿輝應該會解釋一下兩者的差異,
我是看了半天看不出來,不知道是英文不好?還是他沒解釋?
阿輝換你了!(啪)


沒有留言:

張貼留言