Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

ORA-20001 em R12 Coletar estatísticas de esquema em 11g(FND_HISTOGRAM_COLS)


O programa “Gather Schema Statistics” relatou os seguintes erros nos arquivos de log de solicitação:
Error #1: ERROR: While GATHER_TABLE_STATS:
object_name=GL.JE_BE_LINE_TYPE_MAP***ORA-20001: invalid column name or duplicate columns/column groups/expressions in method_opt***
Error #2: ERROR: While GATHER_TABLE_STATS:
object_name=GL.JE_BE_LOGS***ORA-20001: invalid column name or duplicate columns/column groups/expressions in method_opt***
Error #3: ERROR: While GATHER_TABLE_STATS:
object_name=GL.JE_BE_VAT_REP_RULES***ORA-20001: invalid column name or duplicate columns/column groups/expressions in method_opt***

Error #4: ERROR: While GATHER_TABLE_STATS: object_name=FII.FII_FIN_ITEM_HIERARCHIES***ORA-20001: invalid column name or duplicate columns/column groups/expressions in method_opt***

Isso ocorreu se houver colunas duplicadas ou inválidas em FND_HISTOGRAMS_COL

(1 ) Existem linhas duplicadas na tabela FND_HISTOGRAM_COLS para a tabela JE_BE_LINE_TYPE_MAP. Devido a esse problema, FND_STATS tenta coletar informações de histograma usando o comando errado e falha com erros ORA-20001.

O SQL a seguir deve retornar uma linha, não duas:
SQL>select column_name, nvl(hsize,254) hsize
from FND_HISTOGRAM_COLS
where table_name = 'JE_BE_LINE_TYPE_MAP'
order by column_name;

COLUMN_NAME HSIZE
------------------------------ ----------
SOURCE 254
SOURCE 254

Como há duas linhas na tabela de histogramas, FND_STATS cria o seguinte comando para coletar estatísticas na tabela ‘JE_BE_LINE_TYPE_MAP’:
dbms_Stats.gather_table_stats(OWNNAME => 'GL', TABNAME
=>'JE_BE_LINE_TYPE_MAP',METHOD_OPT=>'FOR ALL COLUMNS SIZE 1 FOR COLUMNS SOURCE SIZE 254 FOR
COLUMNS SOURCE SIZE 254');

O comando acima funcionará em bancos de dados 9i e 10G, mas falhará com erros ora-20001 em 11G.

(2) A coluna não existe na tabela, mas ainda está listada na tabela FND_HISTOGRAMS_COL.

Você pode usar o seguinte SQL para identificar. O SQL solicitará o nome da tabela, use o nome da tabela dos erros. Nos exemplos acima, você pode usar FII_FIN_ITEM_HIERARCHIES.
select hc.table_name, hc.column_name
from FND_HISTOGRAM_COLS hc , dba_tab_columns tc
where hc.table_name ='&TABLE_NAME'
and hc.table_name= tc.table_name (+)
and hc.column_name = tc.column_name (+)
and tc.column_name is null;

Descubra todas as linhas duplicadas e/ou obsoletas em FND_HISTOGRAM_COLS e exclua uma delas. Lembre-se de fazer um backup da tabela FND_HISTOGRAM_COLS antes de excluir quaisquer dados.
— identifique linhas duplicadas
select table_name, column_name, count(*)
from FND_HISTOGRAM_COLS
group by table_name, column_name
having count(*) > 1;

— Use os resultados acima no SQL a seguir para excluir duplicatas
delete from FND_HISTOGRAM_COLS
where table_name = '&TABLE_NAME'
and column_name = '&COLUMN_NAME'
and rownum=1;

— Use o seguinte SQL para excluir linhas obsoletas
delete from FND_HISTOGRAM_COLS
where (table_name, column_name) in
(
select hc.table_name, hc.column_name
from FND_HISTOGRAM_COLS hc , dba_tab_columns tc
where hc.table_name ='&TABLE_NAME'
and hc.table_name= tc.table_name (+)
and hc.column_name = tc.column_name (+)
and tc.column_name is null
);

Também lê
ORA-00900:Instrução SQL inválida
ORA-03113
ora-29283:operação de arquivo inválida
ORA-29285:erro de gravação de arquivo
ORA-00054