Oracle

게시글 보기
작성자 유건데이타 등록일 2015-08-14
제목 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
Comment
등록된 코멘트가 없습니다.