PLS-00201: identifier ‘DBMS_JAVA.START_IMPORT’ must be declared ao realizar import

Estou no meio de uma homologação de migração de plataforma e versão de banco de dados e a técnica escolhida foi utilizar o datapump para isso, simples né? Faz o export, copia e importa, mas um dos detalhes desse ambiente é que o cliente utiliza alguns programas em java dentro do banco de dados, no log do import, peguei o seguinte erro:

Processing object type DATABASE_EXPORT/SCHEMA/JAVA_SOURCE/JAVA_SOURCE
ORA-39083: Object type JAVA_SOURCE failed to create with error:
ORA-06550: line 1, column 43:
PLS-00201: identifier 'DBMS_JAVA.START_IMPORT' must be declared
ORA-06550: line 1, column 33:
PL/SQL: Statement ignored
Failing sql is:
DECLARE STATUS NUMBER; BEGIN STATUS := DBMS_JAVA.START_IMPORT('Util', 0,28,0,3,935,1); IF STATUS !=0 THEN IF STATUS > 0 THEN STATUS := -STATUS; END IF; execute immediate 'declare an exception; pragma exception_init(an, ' || status || '); ' || 'begin raise an; end
ORA-39083: Object type JAVA_SOURCE failed to create with error:
ORA-06550: line 1, column 43:
PLS-00201: identifier 'DBMS_JAVA.START_IMPORT' must be declared

Ao verificar o status do Java no banco com o seguinte comando, notei que ele não estava instalado:

select comp_name, version, status from dba_registry;

Corrigindo o erro ORA-39083

No MOS você pode encontrar a nota Master Note for Oracle JVM 1098505.1 que mostra diversos detalhes sobre a JVM separada por versão, como nesse ambiente estou rodando a versão 11.2.0.4, vou me basear na nota Safe repair/reinstall of the JVM Component in 11.2 and up 2314363.1, essa nota é bem extensa(e recomendo que você leia ela) mas o que precisamos é da seguinte sequencia de comandos, se for um cluster, deixe apenas uma das instâncias no ar.

No meu caso, ao executar o primeiro comando conforme sugerido pela nota, ele informava que a view não existia:

create or replace java system
/

Sendo assim, já segui para os próximos passos:

startup mount
alter database open;
alter system enable restricted session;
alter system set "_system_trig_enabled" = false scope=memory;
alter system set "java_jit_enabled" = false scope=memory;

Nos comandos abaixo, a nota fala para fazer uma copia do arquivo  initjvm.sql com o nome reinitjvm.sql e editar algumas linhas dele pois o arquivo original pode remover objetos que não deveriam ser removidos!

Como não sei se posso reproduzir isso aqui, recomendo que a nota seja lida, no meu caso como eu não possuía os componentes da JVM instalados, eu poderia ter executado direto o initijvm.sql

spool log_jvm.log
@?/javavm/install/reinitjvm.sql
@?/xdk/admin/initxml.sql
@?/rdbms/admin/catjava.sql
@?/rdbms/admin/catexf.sql
spool off

Um problema que peguei foi que ao tentar executar o create or replace java system algum cache foi criado e tive que reiniciar a instância para executar os comandos acima, por sorte ele da um erro bem claro falando sobre isso.

Após os comandos terem sido executados(aqui no meu ambiente ele levou alguns bons minutos), você pode executar novamente o select dos componentes e ver se a JVM foi instalada e está válida, além é claro de validar o arquivo de spool para ver se algum erro aconteceu.

Por fim, recompile os objetos inválidos com o utlrp.sql e o ambiente está pronto.

Bonus

Caso seu import já tenha sido realizado e você precise apenas dos objetos java, você pode executar o seguinte comando para fazer isso:

impdp user/senha directory=import dumpfile=expdp_full_XXXXX.dmp logfile=impdp_java.log include=JAVA_CLASS,JAVA_SOURCE schemas=XXX
chevron_left
chevron_right