ORA-29913 è uno degli errori comuni quando si lavora con tabelle esterne nel database Oracle. Vorremmo esaminare vari modi in cui l'errore può essere prodotto e cosa si può fare per risolvere l'errore
(1) File esterno non trovato o autorizzazione errata
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
Quando analizzi la tabella, ricevi un messaggio simile:
SQL> esegui sys.dbms_stats.gather_table_stats('SCOTT','EXAMPLE_EXTERNAL_TABLE');
BEGIN sys.dbms_stats.gather_table_stats('SCOTT','EXAMPLE_EXTERNAL_TABLE'); END;
*
ERRORE alla riga 1:
ORA-29913:errore nell'esecuzione del callout ODCIEXTTABLEOPEN
ORA-29400:errore cartuccia dati
KUP-04040:file test1 .dat in TEST_DIR non trovato
ORA-06512:in "SYS.DBMS_STATS", riga 7161
ORA-06512:in "SYS.DBMS_STATS", riga 7174
ORA-06512:in riga 1
O in generale
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
I file esterni sono stati spostati dalla posizione corretta
SQL> select * from dba_directories ;
OWNER DIRECTORY_NAME DIRECTORY_PATH
------ -------------- -----------------------
SYS TEST_DIR /u01/oradata/external_files
Controlla i nomi dei file associati alla tabella esterna
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
Ora verifica a livello di sistema operativo
$ cd /u01/oradata/external_files
$ ls test[1-2]/dat
Nessun file o directory di questo tipo
Quindi i file non sono presenti nella posizione corretta
Entrambe le query di cui sopra possono essere combinate come di seguito anche
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';
Risoluzione:
Sposta entrambi i file nella posizione originale
$ mv /u02/oradata/file_esterni/test2.dat /u01/oradata/file_esterni
$ mv /u02/oradata/file_esterni/test1.dat /u01/oradata/file_esterni
Ora
Entrambe le affermazioni seguenti avranno esito positivo
select * from Scott.example_external_table; execute sys.dbms_stats.gather_table_stats('SCOTT','EXAMPLE_EXTERNAL_TABLE');
(2) Formato dati errato nel file esterno
ERRORE alla riga 1: ORA-29913:errore nell'esecuzione del callout ODCIEXTTABLEFETCH ORA-30653:limite di scarto raggiunto ORA-06512:a “SYS.ORACLE_LOADER”, riga 14 ORA-06512:a riga 1 |
Motivo
(i) Il file esterno potrebbe avere righe vuote
(ii) Controllare il delimitatore TAB o il delimitatore HEX
un. Il delimitatore TAB '\t', utilizzato da Oracle, è rappresentato da un valore HEX '09'
b. Il valore esadecimale nel file di dati deve corrispondere al valore esadecimale specificato nell'
istruzione CREATE
c. La specifica HEX nell'istruzione CREATE dovrebbe apparire come 0X'
(iii) Se la colonna è stata aggiunta alla tabella esterna, la stessa dovrebbe essere presente nella file esterno
Risoluzione
Controlla l'errore nel registro e correggi il problema di conseguenza
(3) Errore con la colonna Null
ERRORE alla riga 1: ORA-29913:errore nell'esecuzione del callout ODCIEXTTABLEOPEN ORA-29400:errore cartuccia dati KUP-04043:colonna tabella non trovata in origine esterna: |
Motivo
Il file esterno ha valori Null per l'ultima colonna che originariamente è una colonna numerica. Quando cambiamo il valore null in un numero 0, la query ha esito positivo.
Risoluzione
Per caricare un valore NULL, dobbiamo includere il delimitatore ENCLOSED BY nella definizione della tabella.
record delimitati da newline campi terminati da ',' facoltativamente racchiusi da ' ' <<<===== valori di campo mancanti sono nulli |
(4) ORA-29913 può verificarsi anche se Oracle non è in grado di creare anche i file di registro. Quindi controlla l'autorizzazione delle directory
(5) Errore nella directory della tabella esterna
L'errore ORA-29913 può verificarsi anche nelle tabelle esterne quando non si concedono autorizzazioni di lettura e scrittura alla directory:
CREATE O SOSTITUIRE DIRECTORY extdir COME '/u01/oradata/testdir';
CONCEDERE LETTURA SULLA DIRECTORY testdir A
CONCEDERE SCRITTURA SULLA DIRECTORY testdir TO
Ecco alcune buone informazioni sulla tabella esterna, dovresti controllare
Cosa sono le TABELLE ESTERNE in Oracle?
(1)Le tabelle esterne sono tabelle di sola lettura in cui i dati sono archiviati in file flat esterni al database
(2) È possibile utilizzare la funzione tabella esterna per accedere a file esterni come se fossero tabelle all'interno del database.
(3) Quando crei una tabella esterna, ne definisci la struttura e la posizione con in Oracle. Fondamentalmente memorizzi i metadati all'interno dell'oracolo
(4) Quando si interroga la tabella, Oracle legge la tabella esterna e restituisce i risultati proprio come se i dati fossero stati archiviati nel database.
(5) Il server Oracle fornisce due principali driver Oracle per leggere i file flat
- Oracle_loader:viene utilizzato per leggere i file flat utilizzando la tecnologia Oracle Loader. In pratica permette di leggere i file che possono essere interpretati utilizzando la tecnologia sql loader
- Oracle_datapump:viene utilizzato sia per l'importazione che per l'esportazione di dati utilizzando un formato indipendente dalla piattaforma
Articoli correlati
Tabelle esterne Oracle:dai un'occhiata a questo post per informazioni sull'utilizzo di tabelle esterne in Oracle con esempi, come creare una tabella esterna, come usarla
Oracle Create table:le tabelle sono l'unità di base dell'archiviazione dei dati in un database Oracle. spieghiamo come utilizzare il comando Oracle create table per creare una tabella con chiave esterna/chiave primaria
ORA-00936 espressione mancante:scopri la risoluzione dei problemi ORA-00936 espressione mancante in Oracle SQL. quali sono le varie soluzioni, come possiamo evitarlo, Oracle bug per questi errori
ORA-01017:nome utente/password non validi; accesso negato:scopri la possibile risoluzione di ORA-01017 nome utente/password non validi; accesso negato. Come risolverlo rapidamente senza troppi sforzi
Ora-00001 vincolo univoco violato:dai un'occhiata a questo post per la possibile soluzione per l'errore Oracle ORA-00001 vincolo univoco violato. Come risolverlo e risolverlo
ORA-00911:carattere non valido :Questo post è per cause comuni di ORA-00911:carattere non valido in Oracle con esempi e risoluzione per aiutarti a completare il lavoro
ORA-00900 :Questo post per le varie soluzioni per ORA-00900 istruzione sql non valida. Motivi dell'errore. Come eseguire il debug e risolverlo rapidamente,
ORA-03113:fine del file sul canale di comunicazione:Scopri il metodo per risolvere ORA -03113:fine file sul canale di comunicazione. Questo errore potrebbe verificarsi all'avvio del database, durante l'esecuzione del programma
Documentazione Oracle
Corsi consigliati
Ecco il bel corso Udemy per Oracle SQL
Oracle-Sql-Step-by-step:questo corso copre SQL di base, join, creazione di tabelle e modifica della sua struttura, creazione di viste, unione, unione, tutto e molto altro . Un ottimo corso e un corso indispensabile per principianti SQL
Il corso completo di certificazione Oracle SQL :Questo è un buon corso per chiunque voglia essere pronto per il lavoro per le competenze di sviluppatore SQL. Un bel corso spiegato
Oracle SQL Developer:Essentials, Tips and Tricks :lo strumento di sviluppo Oracle Sql è utilizzato da molti sviluppatori. Questo corso offre trucchi e lezioni su come utilizzarlo in modo efficace e diventare uno sviluppatore sql produttivo
Oracle SQL Performance Tuning Masterclass 2020 :l'ottimizzazione delle prestazioni è una delle abilità critiche e più ricercate. Questo è un buon corso per conoscerlo e iniziare a ottimizzare le prestazioni di sql