TECH
QUESTION
자주하는 질문답변 입니다.
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 | |||
---|---|---|---|
등록된 코멘트가 없습니다. |