Oracle FAQ | Your Portal to the Oracle Knowledge Grid |
![]() |
![]() |
Home -> Community -> Mailing Lists -> Oracle-L -> RE: Invalid Package under SYS
I use the following script to handle this situation for me.
Might be a good idea to take a cold backup of your database for just in = case.
Run the script as SYS.
...Rudy
=3D=3D=3D=3D=3D=3D=3Dbegin script revalidate.sql
-- name: $Id: revalidate.sql,v 1.15 2004/01/06 18:19:15 zungr Exp $
set feedback off
set timing off
exec dbms_output.disable
set serveroutput off
set serveroutput on
exec dbms_output.enable(2000000)
declare
type LIST_TVC is table of varchar2(128);
X_CYCLE exception;
N_CYCLE constant number :=3D -20991;
pragma exception_init(X_CYCLE, -20991);
M_CYCLE constant varchar2(80) :=3D 'Cycle detected';
objectStack LIST_TVC :=3D LIST_TVC();
depth number; compiled number; totalCompiled number; invalids number; totalInvalids number; startTime number; ddlTime number; position number; object varchar2(128); marker varchar2(48);
select to_char(sysdate, 'J.sssss')
into startTime from USER_USERS; /* get a count of invalid objects; this * will help us later in cycle detection */ select count(*) into totalInvalids from USER_OBJECTS where STATUS <> 'VALID'; select count(*) into invalids from (select distinct OBJECT_NAME, decode(OBJECT_TYPE, 'PACKAGE BODY', 'PACKAGE', 'TYPE BODY' , 'TYPE', OBJECT_TYPE) from USER_OBJECTS where STATUS <> 'VALID'); dbms_application_info.SET_ACTION('Compile'); depth :=3D 0; compiled :=3D -1;
depth :=3D depth + 1; compiled :=3D 0; for tCursor in=20 (select /*+ RULE */ OBJECT_NAME, OBJECT_TYPE from USER_OBJECTS where STATUS <> 'VALID' and (user <> 'SYS' or OBJECT_NAME not in (-- _NEXT_OBJECT showing up in USER_OBJECTS is=20 -- Oracle bug 691329, fixed in 817 '_NEXT_OBJECT', '_default_auditing_options_', 'DBMS_OUTPUT')) minus select /*+ RULE */ ad.NAME, ad.TYPE from ALL_OBJECTS ao, ALL_DEPENDENCIES ad where ao.STATUS <> 'VALID' and ao.OBJECT_TYPE =3D ad.REFERENCED_TYPE and ao.OBJECT_NAME =3D ad.REFERENCED_NAME and ao.OWNER =3D ad.REFERENCED_OWNER and ao.OWNER =3D ad.OWNER and ad.OWNER =3D user) loop dbms_application_info.SET_CLIENT_INFO( totalCompiled + 1 || '/' || invalids || '@' || depth || ': ' = || tCursor.OBJECT_NAME); object :=3D tCursor.OBJECT_TYPE || '.' || tCursor.OBJECT_NAME; if (totalCompiled >=3D totalInvalids) then /* we're compiling more objects than = were * originally invalid; now is the time = to * do a more rigorous check for cycles */ begin
-- /* see if the object's last_ddl_time
-- * is after this script started. if
-- * it is, then it's a strong =
indication
-- * that this script has just =
recompiled
-- * the object and if we have to =
recompile
-- * it again, it would mean that =
there's
-- * a cycle in the dependency chain
-- */
-- select to_char(LAST_DDL_TIME,
-- 'J.sssss')
-- into ddlTime
-- from USER_OBJECTS
-- where OBJECT_TYPE =3D tCursor.OBJECT_TYPE and
-- OBJECT_NAME =3D tCursor.OBJECT_NAME;
-- if (ddlTime > startTime) then
/* make a more thorough attempt to = determine * if there was indeed a cycle by = inspecting * the stack */ if (nvl(objectStack.COUNT, 0) > 0) then for position in objectStack.FIRST .. = objectStack.LAST loop if (objectStack(position) =3D object) then raise_application_error(N_CYCLE, M_CYCLE || ': ' || object); end if; end loop; end if;
-- end if; -- if (ddlTime > startTime)
exception when X_CYCLE then for position in objectStack.FIRST .. objectStack.LAST loop if (objectStack(position) <> object) then marker :=3D ''; else marker :=3D ' <<<<<<< <<<<<<< <<<<<<<'; end if; dbms_output.PUT_LINE( to_char(position, 'FM00000') || '=3D' || objectStack(position) || marker); end loop; dbms_output.PUT_LINE('Top=3D' || tCursor.OBJECT_NAME); raise; end; end if; objectStack.EXTEND; objectStack(objectStack.COUNT) :=3D object; objectType :=3D tCursor.OBJECT_TYPE; compileType :=3D ''; if (objectType =3D 'PACKAGE BODY') then objectType :=3D 'PACKAGE'; compileType :=3D 'BODY'; elsif (objectType =3D 'TYPE BODY') then objectType :=3D 'TYPE'; compileType :=3D 'BODY'; end if; begin execute immediate 'alter ' || objectType || ' ' || tCursor.OBJECT_NAME || ' ' || trim('compile' || ' ' || compileType); exception when X_CYCLE then raise; when others then dbms_output.put_line(replace(objectType, ' ') || '.' || tCursor.OBJECT_NAME || ': ' || SQLERRM); end; compiled :=3D compiled + 1; totalCompiled :=3D totalCompiled + 1; end loop; -- for tCursor in (...) end loop; -- while (compiled <> 0) /* adjust the depth because we always = loop * once more than necessary for a check = to * make sure that we didn't have to = compile * anything */
dbms_application_info.SET_ACTION(''); dbms_application_info.SET_CLIENT_INFO('');
if (totalCompiled =3D 0) then
dbms_output.PUT_LINE('Nothing invalid'); else
dbms_output.PUT_LINE('Recompiled ' || totalCompiled ||=20 ' object' || substr('s', 1, sign(totalCompiled - 1)) || ' in ' || depth || ' pass' || substr('es', 1, sign(depth - 1) * 3));end if;
set echo off
set pagesize 66
set feedback on
set heading on
set pagesize 32000
set timing off
select OBJECT_TYPE, OBJECT_NAME from USER_OBJECTS=20 where (user <> 'SYS' or OBJECT_NAME not in (-- _NEXT_OBJECT showing up in = USER_OBJECTS=20 -- is Oracle bug 691329, fixed in 817 '_NEXT_OBJECT', '_default_auditing_options_')) and STATUS <> 'VALID'
-----Original Message-----
From: oracle-l-bounce_at_freelists.org =
[mailto:oracle-l-bounce_at_freelists.org] On
Behalf Of Hamid Alavi
Sent: Monday, April 26, 2004 4:59 PM
To: 'Oracle-L (E-mail)
Subject: Invalid Package under SYS
I have run the utlirp under the sys account BUT Still I can see some
packages are invalid.
Any Idea or solution?
Thanks,
Hamid Alavi
Office : 818-737-0526
Cell phone : 818-416-5095
-- Archives are at http://www.freelists.org/archives/oracle-l/ FAQ is at http://www.freelists.org/help/fom-serve/cache/1.html -----------------------------------------------------------------Received on Tue Apr 27 2004 - 12:22:37 CDT
![]() |
![]() |