INVAILD 오브젝트 COMPILE 처리
SELECT DISTINCT 'ALTER '||OBJECT_TYPE||' '||OWNER||'.'|| OBJECT_NAME || ' COMPILE ;' AS COMP_COMMAND
FROM DBA_OBJECTS
WHERE STATUS = 'INVALID'
AND OBJECT_TYPE NOT IN ( 'PACKAGE BODY','SYNONYM')
UNION
-- 패키지 바디만
SELECT DISTINCT 'ALTER PACKAGE ' ||OWNER||'.'|| OBJECT_NAME || ' COMPILE BODY;' AS COMP_COMMAND
FROM DBA_OBJECTS
WHERE STATUS = 'INVALID'
AND OBJECT_TYPE IN ( 'PACKAGE BODY')
order by 1
;
INVALID 오브젝트 관리 프로시져
CREATE OR REPLACE PROCEDURE RTIS_DBA.SP_COMPILE_INVAILD_OBJECT
(
-- OBJECT_OWNER IN VARCHAR2 DEFAULT NULL, -- OBJECT OWNER
p_obj_nm IN VARCHAR2 DEFAULT NULL, -- OBJECT NAME
p_obj_ty IN VARCHAR2 DEFAULT 'SYNONYM', -- OBJECT NAME
p_exec in number default 1 -- 0 :SQL만 출력 , 1:실행
) -- authid current_user
IS
CURSOR INVALID_OBJECT IS
SELECT DISTINCT OWNER,OBJECT_TYPE,OBJECT_NAME
FROM DBA_OBJECTS
WHERE STATUS = 'INVALID'
AND OBJECT_TYPE IN (p_obj_ty)
AND OBJECT_NAME = p_obj_nm
AND OWNER NOT IN ('ERPAPP','ERPHR','PUBLIC','MIGCOMMON','MIGBASEDATA');
V_SQL VARCHAR2(5000);
V_MSG long;
BEGIN
DBMS_OUTPUT.ENABLE;
FOR V_ROW IN INVALID_OBJECT
LOOP
BEGIN
DBMS_OUTPUT.ENABLE(4000);
-- 바뀐 유저로 권한 주기
V_SQL := 'ALTER '||V_ROW.OBJECT_TYPE||' '||V_ROW.OWNER||'.'|| V_ROW.OBJECT_NAME || ' COMPILE';
IF p_exec <> 0 THEN
EXECUTE IMMEDIATE V_SQL;
DBMS_OUTPUT.PUT_LINE('SUCCESS VALID: '||V_SQL);
ELSE
DBMS_OUTPUT.PUT_LINE('SQL : '||V_SQL);
END IF;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('ERR MESSAGE : ' ||V_SQL||'-'|| SQLERRM);
END;
END LOOP;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('ERR MESSAGE : ' || SQLERRM);
END;
/