Blz ? Antes de responder, eu ** tenho que observar que o DBMS_REPAIR.CHECK é **
uma ** das maneiras de se checar por corrupção : vc TEM que usar várias, pois
as Dieferentes ferramentas vão te verificar diferentes tipos de corrupção -
assim sendo, além dela vc ** VAI ** ter que necessariamente usar Também o
dbverify (tanto ONLINE quanto OFFLINE - algo que MUITA GENTE esquece!), ** VAI
** usar o analyze table validate structure, um export full (só pra fazer a
leitura geral de tudo), pelo RMAN fazendo primeiro um BACKUP VALIDATE e depois
um BACKUP VALIDATE CHECK LOGICAL DATABASE ARCHIVELOG ALL, E DEPOIS Óbvio que
vai usar as tools que tiver no Sistema Operacional para (com banco Aberto no
caso das não-destrutivas/que não alteram nada, E com o banco FECHADO nas
outras) procurar por falhas eou olhar logsmsgs de sistema ref. disco,
filesystem, memória e hardware em geral SE vc está confiando Só e Apenas no
DBMS_REPAIR,CHECK para identificar corrupção, vc está fazendo um serviço
INCOMPLETO aí, blz ? fechado ?
Isso posto, a sua resposta : um ORA-600 *** não é *** para ser tratado como
uma Exceção (ie, algo Possível e passível de ocorrer) , mas sim indica um BUG,
de pleno direito, okdoc ? É ERRO mesmo, então vc TEM que antes de mais nada
fazer uma pesquisa por BUGs abertos na sua versão e no seu SO - dado que tua
versão 11.2.0.1 indica que NENHUM PATCHSET (e talvez nenhum patch de forma
geral ?) nunca foi aplicado nesse ambiente, chances existem de que seja isso
mesmo, Verifique, pois Provavelmente até já deve existir ou bugfix ou
workaround...
Como vc diz que ao informar a string com o nome a rotina em tese funciona,
Provavelmente deve ser um bug de referência no PL/SQL , então o Workaround
óbvio é , ao invés de ter um loop passando por ref o valor, gere um script com
as n linhas que vc quer, mais ou menos tipo (se vc for usar sql*plus) :
delete from cerv.log10 ;
variable num_corrupt number;
select 'sys.DBMS_REPAIR.CHECK_OBJECT ( SCHEMA_NAME => ' || chr(39) || 'CERV' ||
chr(39) || ', OBJECT_NAME =>' || table_name
|| ', REPAIR_TABLE_NAME => ' || chr(39) || 'REPAIR_TABLE' || chr(39) || ',
CORRUPT_COUNT =>:num_corrupt' as linha_comando
table_name from user_tables where 1=1 and table_name not in ( select
view_name from user_views) ;
===> Isso te geraria uma lista com as N chamadas para o DBMS_RAPAIR (uma pra
cada tabela) , é só jogar essa lista prum arquivo-texto (via SPOOL,
provavelmente), salvar esse arquivo-texto com extensão .SQL e executá-lo como
um script de comandos...
Uma variação da técnica é passar a string gerada para cada chamada pra um
EXECUTE IMMEDIATE, pra já sair executando ao invés de salvar em disco o texto
com os comandos - eu gosto mais de gerar o texto em um arquivo porque é mais
fácil de debugar E já tou com ele na mão se precisar repetir e/ou se precisar
executar só uma parte, mas vai do gosto...
OBS : eu NEM PRECISO DIZER, imagino, que o código acima é PSEUDO-CÓDIGO mais
que qquer outra coisa, é só uma SUGESTÃO, não é de forma NENHUMA código pronto
pra sair executando, okdoc ??
[]s
Chiappa