web-dev-qa-db-fra.com

erreur sqlplus sur select from external table: ORA-29913: erreur lors de l'exécution de la légende ODCIEXTTABLEOPEN

J'ai mis en place un simple test de table externe Oracle que je ne peux pas mettre au travail (avec un administrateur DBA et Unix).

Ce qui suit est basé sur/ Concepts de tables externes . La base de données utilisée est 11g.

Voici la définition de la table externe:

drop table emp_load;

CREATE TABLE emp_load
    (employee_number      CHAR(5),
     employee_dob         DATE,
     employee_last_name   CHAR(20),
     employee_first_name  CHAR(15),
     employee_middle_name CHAR(15),
     employee_hire_date   DATE)
  ORGANIZATION EXTERNAL
    (TYPE Oracle_LOADER
     DEFAULT DIRECTORY defaultdir
     ACCESS PARAMETERS
       (RECORDS DELIMITED BY NEWLINE
        FIELDS (employee_number      CHAR(2),
                employee_dob         CHAR(20),
                employee_last_name   CHAR(18),
                employee_first_name  CHAR(11),
                employee_middle_name CHAR(11),
                employee_hire_date   CHAR(10) date_format DATE mask "mm/dd/yyyy"
               )
       )
     LOCATION ('external_table_test.dat')
);

Voici le contenu de "external_table_test.dat":

56november, 15, 1980  baker             mary       alice      09/01/2004
87december, 20, 1970  roper             Lisa       marie      01/01/1999

Je suis capable d'exécuter le script qui crée "emp_load" sans aucun problème. Je peux aussi décrire la table bien. Lorsque je tente "select * from emp_load", j'obtiens les erreurs suivantes:

SQL> select * from emp_load;
select * from emp_load
              *
ERROR at line 1:
ORA-29913: error in executing ODCIEXTTABLEOPEN callout
ORA-29400: data cartridge error
error opening file /defaultdir/EMP_LOAD_29305.log

EDIT 1
Oracle dispose d’autorisations de lecture/écriture sur le répertoire.

EDIT 2
J'ai pu obtenir cette erreur en utilisant la définition de table externe suivante:

CREATE TABLE emp_load
    (employee_number      CHAR(3),
     employee_last_name   CHAR(20),
     employee_middle_name CHAR(15),
     employee_first_name  CHAR(15)
     )
  ORGANIZATION EXTERNAL
    (TYPE Oracle_LOADER
     DEFAULT DIRECTORY defaultdir
     ACCESS PARAMETERS
       (RECORDS DELIMITED BY NEWLINE
        BADFILE DHHSMAPSIS:'EMP.BAD'
        LOGFILE DHHSMAPSIS:'EMP.LOG'
        FIELDS TERMINATED BY ','
       )
    LOCATION ('external_table_test2.dat')
)
REJECT LIMIT UNLIMITED;

Mon fichier .dat ressemble à ceci ...

056,baker,beth,mary
057,smith,teddy,john

Je devais définir les autorisations sur "EMP.BAD", "EMP.LOG" & "external_table_test2.dat" sur 777 pour que cela fonctionne. L'utilisateur Oracle ne possède pas ces fichiers, mais appartient au même groupe que les fichiers.

Avez-vous une idée de la raison pour laquelle je ne parviens pas à faire fonctionner cela lorsque je définis les autorisations sur ces fichiers sur 770? Encore une fois, Oracle est dans le même groupe que ces fichiers, donc je me suis dit que 770 serait OK pour les permissions ...

7
Zack Macomber

Notre version d'Oracle s'exécute sur Red Hat Enterprise Linux. Nous avons expérimenté plusieurs types d'autorisations de groupe en vain. Le répertoire/defaultdir avait un groupe qui était un groupe secondaire pour l'utilisateur Oracle. Lorsque nous avons mis à jour le répertoire/defaultdir pour créer un groupe de "oinstall" (groupe principal d'Oracle), j'ai pu sélectionner des tables externes situées sous ce répertoire sans problème.

Ainsi, pour les autres personnes qui pourraient avoir ce problème, indiquez que le groupe principal d’Oracle est le groupe et qu’il pourra le résoudre comme vous l’avez fait. Nous avons pu définir les autorisations sur le répertoire et les fichiers sur 770 et la sélection sur les tables externes fonctionne correctement.

4
Zack Macomber

N'oubliez pas que c'est l'utilisateur qui exécute la base de données Oracle qui doit disposer des autorisations en écriture sur le répertoire/defaultdir, et non l'utilisateur connecté à Oracle. En règle générale, vous exécutez la base de données en tant qu'utilisateur "Oracle". Ce n'est pas le même utilisateur (nécessairement) que vous avez créé la table externe.

Vérifiez également les autorisations de votre répertoire.

1
DCookie

Nous avons rencontré le même problème:

ORA-29913: error in executing ODCIEXTTABLEOPEN callout
ORA-29400: data cartridge error error opening file /fs01/app/rms01/external/logs/SH_EXT_TAB_VGAG_DELIV_SCHED.log

Dans notre cas, nous avions un RAC avec 2 nœuds. Après avoir donné l’autorisation d’écriture sur le répertoire des journaux, des deux côtés , tout a bien fonctionné.

1
Timo

Nous avons eu cette erreur sur Oracle RAC 11g sous Windows et la solution consistait à créer la même arborescence de répertoires de système d'exploitation et le même fichier externe sur les deux nœuds.

0
Carlo