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

Como resolver ORA-29913 com tabelas externas


ORA-29913 é um dos erros comuns ao trabalhar com tabelas externas no banco de dados Oracle. Estaríamos analisando várias maneiras pelas quais o erro pode ser produzido e o que pode ser feito para resolver o erro

(1) Arquivo externo não encontrado ou permissão incorreta

SQL> select * from Scott.example_external_table;
select * from example_external_table
*
ERROR at line 1:
ORA-29913: error in executing ODCIEXTTABLEOPEN callout
ORA-29400: data cartridge error
KUP-04040: file test1.dat in TEST_DIR not found
ORA-06512: at "SYS.ORACLE_LOADER", line 14
ORA-06512: at line 1


Ao analisar a tabela, você recebe uma mensagem semelhante:

SQL> execute sys.dbms_stats.gather_table_stats('SCOTT','EXAMPLE_EXTERNAL_TABLE');
BEGIN sys.dbms_stats.gather_table_stats('SCOTT','EXAMPLE_EXTERNAL_TABLE'); END;
*
ERRO na linha 1:
ORA-29913:erro na execução da chamada ODCIEXTTABLEOPEN
ORA-29400:erro no cartucho de dados
KUP-04040:arquivo test1 .dat em TEST_DIR não encontrado
ORA-06512:em “SYS.DBMS_STATS”, linha 7161
ORA-06512:em “SYS.DBMS_STATS”, linha 7174
ORA-06512:na linha 1

Ou de maneira geral

ORA-20011: Approximate NDV failed:

ORA-29913: error in executing ODCIEXTTABLEOPEN callout
ORA-29400: data cartridge error
KUP-04040: file <file_name> in <directory_name> not found


Motivo

Os arquivos externos foram movidos do local correto

SQL> select * from dba_directories ;

OWNER DIRECTORY_NAME DIRECTORY_PATH
------ -------------- -----------------------
SYS TEST_DIR /u01/oradata/external_files


Verifique os nomes de arquivo associados à tabela externa

select * from dba_external_locations
where table_name='EXAMPLE_EXTERNAL_TABLE';OWNER TABLE_NAME LOCATION DIRECTORY_OWNER DIRECTORY_NAME
----- ------------- -------- --------------- ---------------
SYS EXAMPLE_EXTERNAL_TABLE test1.dat SYS TEST_DIR
SYS EXAMPLE_EXTERNAL_TABLE test2.dat SYS TEST_DIR


Agora verificando no nível do SO
$ cd /u01/oradata/external_files
$ ls test[1-2]/dat
Nenhum arquivo ou diretório

Portanto, os arquivos não estão presentes no local correto

Ambas as consultas acima podem ser combinadas como abaixo também

select TABLE_NAME, DIRECTORY_PATH||'/'||LOCATION file_name from DBA_EXTERNAL_LOCATIONS loc, dba_directories dir
where loc.DIRECTORY_OWNER=dir.OWNER
and loc.DIRECTORY_NAME=dir.DIRECTORY_NAME
and loc.OWNER='&1' and loc.TABLE_NAME='&2';


Resolução:
Mova de volta ambos os arquivos para o local original

$ mv /u02/oradata/external_files/test2.dat /u01/oradata/external_files
$ mv /u02/oradata/external_files/test1.dat /u01/oradata/external_files

Agora
A declaração abaixo será bem-sucedida
select * from Scott.example_external_table;
execute sys.dbms_stats.gather_table_stats('SCOTT','EXAMPLE_EXTERNAL_TABLE');

(2) Formato de dados incorreto em arquivo externo
ERRO na linha 1:
ORA-29913:erro na execução da chamada ODCIEXTTABLEFETCH
ORA-30653:limite de rejeição atingido
ORA-06512:em “SYS.ORACLE_LOADER”, linha 14
ORA-06512:na linha 1

Motivo

(i) O arquivo externo pode estar com linhas vazias
(ii) Verifique o delimitador TAB ou o delimitador HEX

uma. O delimitador TAB '\t', usado pelo Oracle, é representado por um valor HEX '09'
b. O valor HEX no arquivo de dados deve corresponder ao valor HEX especificado na
instrução CREATE
c. A especificação HEX na instrução CREATE deve se parecer com 0X'gt;' ou 0x''
(iii) Se a coluna adicionada à tabela externa, a mesma deve estar presente na arquivo externo

Resolução
Verifique o erro no log e corrija o problema de acordo

(3) Erro com coluna nula
ERROR na linha 1:
ORA-29913:erro na execução da chamada ODCIEXTTABLEOPEN
ORA-29400:erro do cartucho de dados
KUP-04043:coluna da tabela não encontrada na fonte externa:

Motivo
O arquivo externo tem valores nulos para a última coluna que é originalmente uma coluna numérica. Quando alteramos o nulo para um número 0, a consulta é bem-sucedida.

Resolução
Para carregar um valor NULL, precisamos incluir o delimitador ENCLOSED BY na definição da tabela.
registros delimitados por nova linha
campos terminados por ','
opcionalmente delimitados por ' ' <<<=====
valores de campo ausentes são nulos

(4) ORA-29913 também pode ocorrer se o Oracle não for capaz de criar os arquivos de log também. Portanto, verifique a permissão dos diretórios

(5) Erro de diretório de tabela externa
O erro ORA-29913 também pode ocorrer em tabelas externas quando você não concede permissões de leitura e gravação ao diretório:

CRIAR OU SUBSTITUIR DIRETÓRIO extdir AS '/u01/oradata/testdir';
GRANT READ ON DIRETÓRIO testdir PARA ;
GRANT WRITE ON DIRETÓRIO testdir PARA ;

Aqui estão algumas boas informações sobre a Tabela Externa. Você deve conferir

O que são EXTERNAL TABLES no Oracle?

(1) As tabelas externas são tabelas somente leitura onde os dados são armazenados em arquivos simples fora do banco de dados

(2) Você pode usar o recurso de tabela externa para acessar arquivos externos como se fossem tabelas dentro do banco de dados.

(3)   Ao criar uma tabela externa, você define sua estrutura e localização com in oracle. Basicamente você apenas armazena os metadados dentro do oráculo

(4) Quando você consulta a tabela, o oracle lê a tabela externa e retorna os resultados como se os dados tivessem sido armazenados no banco de dados.

(5) O servidor oracle fornece dois drivers oracle principais para ler os arquivos simples
  • Oracle_loader:É usado para ler os arquivos simples usando a tecnologia oracle loader. Basicamente permite ler os arquivos que podem ser interpretados usando a tecnologia sql loader
  • Oracle_datapump:usado para importar e exportar dados usando formato independente de plataforma

Artigos relacionados
Tabelas externas do Oracle:Confira este post para obter informações sobre o uso de tabela externa no oracle com exemplo, como criar tabela externa, como usá-la
Oracle Criar tabela:As tabelas são a unidade básica de armazenamento de dados em um banco de dados Oracle. nós aborda como usar o comando Oracle create table para criar tabela com chave estrangeira / chave primária podemos evitá-lo, erros do Oracle para esses erros
ORA-01017:nome de usuário/senha inválidos; logon negado:Aprenda a possível resolução de nome de usuário/senha inválidos ORA-01017; logon negado. Como resolvê-lo rapidamente sem muitos esforços
ORA-00001 restrição exclusiva violada:Confira este post para a possível solução para o erro oracle ORA-00001 restrição exclusiva violada. Como resolver e corrigir
ORA-00911:caractere inválido :Esta postagem é para causas comuns de ORA-00911:caractere inválido no oracle com exemplos e resolução para ajudá-lo a concluir o trabalho
ORA-00900 :Este post para as várias soluções para instrução sql inválida ORA-00900. Razões para o erro. Como depurar e resolvê-lo rapidamente,
ORA-03113:fim de arquivo no canal de comunicação:Confira método para resolver ORA -03113:fim de arquivo no canal de comunicação. Este erro pode ocorrer na inicialização do banco de dados, executando o programa
documentação do Oracle

Cursos recomendados


Aqui está o bom curso da Udemy para Oracle SQL
Oracle-Sql-Step-by-step:Este curso abrange sql básico, junções, criação de tabelas e modificação de sua estrutura, criação de exibição, união, união -tudo e muitas outras coisas . Um ótimo curso e curso obrigatório para iniciantes em SQL
O Curso Completo de Certificação Oracle SQL :Este é um bom curso para quem quer estar pronto para trabalhar com habilidades de desenvolvedor SQL. Um bom curso explicado
Oracle SQL Developer:Essentials, Tips and Tricks :A ferramenta de desenvolvedor Oracle Sql está sendo usada por muitos desenvolvedores. Este curso nos dá truques e lições sobre como usá-lo efetivamente e se tornar um desenvolvedor sql produtivo
Oracle SQL Performance Tuning Masterclass 2020 :O ajuste de desempenho é uma das habilidades críticas e mais procuradas. Este é um bom curso para aprender sobre isso e começar a fazer o ajuste de desempenho do sql