sql >> Databasteknik >  >> RDS >> Oracle

Hur man löser ORA-29913 med externa tabeller

ORA-29913 är ett av de vanligaste felen när man arbetar med externa tabeller i Oracle-databasen. Vi skulle titta på olika sätt som felet kan orsakas och vad som kan göras för att lösa felet

(1) Extern fil hittades inte eller felaktig behörighet

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

När du analyserar tabellen får du ett liknande meddelande:

SQL> kör sys.dbms_stats.gather_table_stats('SCOTT','EXAMPLE_EXTERNAL_TABLE');
BEGIN sys.dbms_stats.gather_table_stats('SCOTT','EXAMPLE_EXTERNAL_TABLE'); END;
*
FEL på rad 1:
ORA-29913:fel vid exekvering av ODCIEXTTABLEOPEN-utlysningen
ORA-29400:datakassettfel
KUP-04040:filtest1 .dat i TEST_DIR hittades inte
ORA-06512:vid “SYS.DBMS_STATS”, rad 7161
ORA-06512:vid “SYS.DBMS_STATS”, rad 7174
ORA-06512:vid rad 1

Eller generellt sett

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

Orsak

De externa filerna har flyttats från rätt plats

SQL> select * from dba_directories ;

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

Kontrollera filnamnen som är associerade med extern tabell

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

Kontrollerar nu på OS-nivå
$ cd /u01/oradata/external_files
$ ls test[1-2]/dat
Ingen sådan fil eller katalog

Så filer finns inte på rätt plats

Båda ovanstående frågor kan också kombineras enligt nedan

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';

Upplösning:
Flytta tillbaka båda filerna till den ursprungliga platsen

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

Nu
Båda uttalandena nedan kommer att lyckas

select * from Scott.example_external_table;
execute sys.dbms_stats.gather_table_stats('SCOTT','EXAMPLE_EXTERNAL_TABLE');

(2) Felaktigt dataformat i extern fil

FEL på rad 1:
ORA-29913:fel vid exekvering av ODCIEXTTABLEFETCH-texttext
ORA-30653:avvisningsgräns nådd
ORA-06512:vid "SYS.ORACLE_LOADER", rad 14
ORA-06512:vid rad 1

Orsak

(i) Den externa filen kan ha tomma rader
(ii) Kontrollera TAB-avgränsaren eller HEX-avgränsaren

a. TAB-avgränsaren '\t', som används av Oracle, representeras av ett HEX-värde '09'
b. HEX-värdet i datafilen bör matcha HEX-värdet som anges i
CREATE-satsen
c. HEX-specifikationen i CREATE-satsen bör se ut som 0X'gt;' eller 0x''
(iii) Om kolumnen läggs till i den externa tabellen, bör densamma finnas i extern fil

Upplösning
Kontrollera felet i loggen och åtgärda problemet därefter

(3) Fel med nollkolumn

FEL på rad 1:
ORA-29913:fel vid exekvering av ODCIEXTTABLEOPEN-utlysningen
ORA-29400:datakassettfel
KUP-04043:tabellkolumnen hittades inte i extern källa:

Orsak
Den externa filen har null-värden för den sista kolumnen som ursprungligen är en nummerkolumn. När vi ändrar noll till ett nummer 0, så lyckas frågan.

Upplösning
För att ladda ett NULL-värde måste vi inkludera ENCLOSED BY-avgränsare i tabelldefinitionen.

poster avgränsade av newline
fält som avslutas av ','
valfritt omslutna av ' ' <<<======
saknade fältvärden är null

(4) ORA-29913 kan också inträffa om Oracle inte kan skapa loggfilerna också. Så kontrollera om katalogernas tillstånd

(5) Externt tabellkatalogfel
ORA-29913-felet kan också inträffa i externa tabeller när du inte beviljar läs- och skrivbehörigheter till katalogen:

SKAPA ELLER ERSÄTT KATALOG extdir SOM ‘/u01/oradata/testdir’;
BEHANDLA LÄS I KATALOG testdir TILL ;
BEHANDLA SKRIVNING I KATALOG testdir TILL ;

Här är lite bra information om External Table. Du bör  kolla in

Vad är EXTERNA TABELLER i Oracle?

(1)Externa tabeller är skrivskyddade tabeller där data lagras i platta filer utanför databasen

(2) Du kan använda extern tabellfunktion för att komma åt externa filer som om de vore tabeller i databasen.

(3)   När du skapar en extern tabell definierar du dess struktur och plats med i oracle. I princip lagrar du bara metadata inuti oraklet

(4) När du frågar tabellen läser Oracle den externa tabellen och returnerar resultaten precis som om data hade lagrats i databasen.

(5) Oracle-servern tillhandahåller två stora oracle-drivrutiner för att läsa de platta filerna

  • Oracle_loader:Detta används för att läsa de platta filerna med hjälp av oracle loader-tekniken. Det tillåter i princip att läsa filerna som kan tolkas med sql loader-teknik
  • Oracle_datapump:Detta används för både import och export av data med plattformsoberoende format

Relaterade artiklar
Externa tabeller för Oracle :Kolla in det här inlägget för information om användning av extern tabell i Oracle med exempel, hur man skapar extern tabell, hur man använder den
Oracle Skapa tabell :Tabeller är den grundläggande enheten för datalagring i en Oracle Database.we täcker hur man använder Oracle create table-kommandot för att skapa tabell med främmande nyckel /primärnyckel
ORA-00936 missing expression :Lär dig felsöka ORA-00936 missing expression i oracle SQL.vad finns olika lösningar, hur vi kan undvika det, Oracle-buggar för detta fel
ORA-01017:ogiltigt användarnamn/lösenord; inloggning nekad:Lär dig den möjliga lösningen för ORA-01017 ogiltigt användarnamn/lösenord; inloggning nekad. Hur man löser det snabbt utan stora ansträngningar
ORA-00001 unik begränsning överträtt :Kolla in det här inlägget för den möjliga lösningen för orakelfelet ORA-00001 unik begränsning överträtt. Hur man löser och åtgärdar det
ORA-00911:ogiltigt tecken:Det här inlägget är avsett för vanliga orsaker till ORA-00911:ogiltigt tecken i Oracle med exempel och upplösning som hjälper dig att slutföra jobbet
ORA-00900:Detta inlägg för de olika lösningarna för ORA-00900 ogiltigt SQL-uttalande. Orsaker till felet. Hur man felsöker och löser det snabbt,
ORA-03113:slutet av filen på kommunikationskanalen:Kolla in metod för att lösa ORA -03113:slutet av filen på kommunikationskanalen. Det här felet kan inträffa vid start av databas, kör program
Oracle-dokumentation

Rekommenderade kurser

Här är den trevliga Udemy-kursen för Oracle SQL
Oracle-Sql-Steg-för-steg :Den här kursen täcker grundläggande sql, går med, skapar tabeller och ändrar dess struktur, Skapa vy, Union, Union -allt och mycket annat . En bra kurs och måste-kurs för SQL-startare
The Complete Oracle SQL Certification Course :Det här är en bra kurs för alla som vill vara redo för färdigheter i SQL-utvecklare. En trevlig förklarad kurs
Oracle SQL Developer:Essentials, Tips and Tricks :Oracle Sql-utvecklarverktyget används av många utvecklare. Den här kursen ger oss tricks och lektioner om hur man effektivt använder den och blir en produktiv SQL-utvecklare
Oracle SQL Performance Tuning Masterclass 2020 :Prestandajustering är en av de kritiska och mest eftertraktade färdigheterna. Det här är en bra kurs för att lära dig om det och börja göra sql-prestandajustering


  1. Aggregat och partitionering

  2. Är en RID-sökning snabbare än en nyckelsökning?

  3. En introduktion till datautvinning

  4. Använda ett IF-uttalande i en MySQL SELECT-fråga