quinta-feira, 17 de dezembro de 2009

ORA-29532

Olá pessoal, me deparei com um problema semana passada, um problema bem curioso porém muito chato de se resolver, ao tentar executar qualquer Package de Banco (ex.: DBMS_REPAIR) eu recebia a mensagem de erro ORA-29532, pois bem , resolvi pesquisar e me deparei com um problemão , observem.
Assim que comecei a pesquisar fui da tabela DBA_REGISTRY e para minha surpresa encontrei a seguinte informação :

SQL> /


COMP_NAME STATUS
—————————————- ———–
Oracle Database Java Packages INVALID

Passei então a pesquisar, e consultar alguns colegas sobre o erro que me parecia estranho, até que um deles me disse que em uma pós migração de versão do Oracle 10g, alguns pacotes ficaram invalidos , e esse em especial JAVA também estava, para corrigir tal problema é necessário que sejam REMOVIDO todos os pacotes JAVA do Database e REINSTALA-los conforme manda uma documentação do metalink, o erro que aparece sempre que tentamos utilizar alguma feature ou recurso do Banco, como Export etc e tal é esse :

ORA-29532: Java call terminated by uncaught Java exception: java.lang.ExceptionInInitializerError

Sendo assim, resolvi postar aqui a solução para esse problema. Então vamos lá, caso você note o erro acima em seu DATABASE verifique antes se este erro é ocasionado pelo fato dos pacotes Java estarem INVALIDOS como demonstrado acima, após feito isso e constatado o problema siga os passos a seguir :

spool full_rmjvm.log
set echo on
connect / as sysdba
startup mount
alter system set “_system_trig_enabled” = false scope=memory;
alter system enable restricted session;
alter database open;
@?/rdbms/admin/catnoexf.sql
@?/rdbms/admin/catnojav.sql
@?/xdk/admin/rmxml.sql
@?/javavm/install/rmjvm.sql
truncate table java$jvm$status;
select * from obj$ where obj#=0 and type#=0;
delete from obj$ where obj#=0 and type#=0;
commit;
select owner, count(*) from all_objects
where object_type like ‘%JAVA%’ group by owner;
select obj#, name from obj$
where type#=28 or type#=29 or type#=30 or namespace=32;
select o1.name from obj$ o1,obj$ o2
where o1.type#=5 and o1.owner#=1 and o1.name=o2.name and o2.type#=29;
shutdown immediate
set echo off
spool off
exit

Junte todos esses passos em um único script e o execute logado como SYS, ele fará todos os passos de remoção do JAVA da base de dados, feito isso verifique os logs, e em seguida execute a reinstalação dos pacotes JAVAS como segue abaixo :

spool full_jvminst.log;
set echo on
connect / as sysdba
startup mount
alter system set “_system_trig_enabled” = false scope=memory;
alter database open;
select obj#, name from obj$
where type#=28 or type#=29 or type#=30 or namespace=32;
@?/javavm/install/initjvm.sql
select count(*), object_type from all_objects
where object_type like ‘%JAVA%’ group by object_type;
@?/xdk/admin/initxml.sql
select count(*), object_type from all_objects
where object_type like ‘%JAVA%’ group by object_type;
@?/xdk/admin/xmlja.sql
select count(*), object_type from all_objects
where object_type like ‘%JAVA%’ group by object_type;
@?/rdbms/admin/catjava.sql
select count(*), object_type from all_objects
where object_type like ‘%JAVA%’ group by object_type;
@?/rdbms/admin/catexf.sql
select count(*), object_type from all_objects
where object_type like ‘%JAVA%’ group by object_type;
shutdown immediate
set echo off
spool off
exit

Pronto seus pacotes java estão reinstalados, utilizando o script UTLRP.sql que faz a recompilação dos objetos invalidos, certifique-se de que não tenha sobra nada invalido, este script se encontra no diretório “$ORACLE_HOME/rdbms/admin”, em seguida faça uma query na DBA_REGISTRY para verificar se os pacotes que anteriormente estavam como invalidos retornaram ao status de válidos :

SQL> /


COMP_NAME STATUS
—————————————- ———–
Oracle Database Java Packages VALID


SQL>

Eis que agora todos os recursos que anteriormente não funcionavam pelo fato de classes e procedures que tem chamadas em Java no oracle estavam inválidas, agora você poderá tranquilamente executar export, dbms’s etc.


Abraço á todos!!!
David