출처 : http://forums.oracle.com/forums/thread.jspa?threadID=469195&tstart=420
제품 : ORACLE SERVER
작성날짜 : 2002-04-18
INVALID 상태의 OBJECT를 RECOMPILE하는 PROCEDURE
============================================================
Purpose
-----------------------------------------------------------------------------------------------------
Import를 하거나 DDL 작업을 하고 나서 procedure 나 package등의 pl/sql object가 invalid로 빠지는 경우가 있다.
이런 object들을 찾아서 recompile해주는 procedure를 소개한다.
Explanation
-----------------------------------------------------------------------------------------------------
이 procedure는 User 내의 모든 Invalid 상태의 procedure, function, package 등의 Object 들을 Recompile한다.
Compile에러가 발생하는 경우 dbms_output package를 이용하여 화면에 display해 주게 되므로 실행하기
전에 set serveroutput on 을 반드시 실행한다.
Invalid된 object가 많은 경우라면 compile에러의 확인을 위해 spool을 받는 것이 좋다.
CREATE OR REPLACE PROCEDURE RecompileInvalid IS
CURSOR getlist IS SELECT object_type, object_name FROM
user_objects WHERE status = 'INVALID' AND
object_type IN ('PROCEDURE', 'FUNCTION', 'PACKAGE',
'PACKAGE BODY', 'TRIGGER' );
schemaname VARCHAR2(100);
CURSOR geterr ( objname VARCHAR2, objtype VARCHAR2 ) IS
SELECT text, line, position FROM user_errors WHERE
name = objname AND type = objtype;
BEGIN
SELECT username INTO schemaname FROM user_users;
FOR getlistrec IN getlist LOOP
dbms_output.put_line( 'attempting compile on ' ||
getlistrec.object_name );
dbms_ddl.alter_compile( getlistrec.object_type,
schemaname, getlistrec.object_name );
END LOOP;
FOR getlistrec IN getlist LOOP
dbms_output.put_line( '-*-*-ERROR-*-*-' );
dbms_output.put_line( 'compile failed on ' ||
getlistrec.object_name );
FOR geterrrec IN geterr( getlistrec.object_name,
getlistrec.object_type ) LOOP
dbms_output.put_line( 'line: ' || geterrrec.line ||
' col: ' || geterrrec.position );
dbms_output.put_line( substr( geterrrec.text, 1, 100 ));
END LOOP;
END LOOP;
END;
/
Example
-----------------------------------------------------------------------------------------------------
SQL> spool Compile.log
SQL> set serveroutput on
SQL> exec recompileinvalid;
attempting compile on CRYPTIT
attempting compile on CRYPTIT
attempting compile on DECRYPT
attempting compile on ENCRYPT
attempting compile on SYNC_IM_INDEX
PL/SQL procedure successfully completed.
SQL> spool off
'::: DB ::: > Oracle' 카테고리의 다른 글
[OTN] DELETE, DROP, TRUNCATE의 비교 (1) | 2010.12.13 |
---|---|
[OTN] ALTER USER를 실행한 사용자를 확인하는 방법(SYSTEM EVENT TRIGGER) (0) | 2010.12.13 |
[OTN] 테이블의 COLUMN 이름을 변경하는 방법 (0) | 2010.12.10 |
[OTN] 힌트를 사용할 때 고려되어야 하는 사항 (0) | 2010.12.10 |
[OTN] LOB DATA 를 다른 TABLESPACE로 옮기는 방법 (0) | 2010.12.10 |