从外部表中选择sqlplus错误:ORA-29913:执行ODCIEXTTABLEOPEN标注时出错

时间:2012-01-30 15:21:06

标签: oracle oracle11g

我已经设置了一个简单的Oracle外部表测试,我(与DBA和Unix管理员一起)无法开始工作。

以下内容基于Oracle的External Tables Concepts。我们使用的数据库是11g。

这是外部表定义:

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

这是“external_table_test.dat”的内容:

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

我能够运行创建“emp_load”的脚本,没有任何问题。我也可以很好地描述表格。当我尝试“select * from emp_load”时,我收到以下错误:

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

编辑1
oracle对目录具有读/写权限。

编辑2
通过使用以下外部表定义,我能够传递此错误:

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;

我的.dat文件看起来像这样......

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

我必须在“EMP.BAD”,“EMP.LOG”& “external_table_test2.dat”到777以使其工作。 oracle用户不拥有这些文件,但与文件位于同一组中。

当我将这些文件的权限设置为770时,我知道为什么我无法使用它?同样,oracle与那些文件在同一组中,所以我认为770对于权限是可以的......

5 个答案:

答案 0 :(得分:4)

我们的Oracle版本在Red Hat Enterprise Linux上运行。我们尝试了几种不同类型的组权限无济于事。 / defaultdir目录有一个组,它是oracle用户的辅助组。当我们更新/ defaultdir目录以拥有一组“oinstall”(oracle的主要组)时,我能够从该目录下的外部表中选择没有问题。

因此,对于其他出现并且可能存在此问题的人,请将该目录作为组使用oracle的主要组,并且可以像我们一样为您解决该问题。我们能够在目录和文件上将权限设置为770,并且选择外部表现在可以正常工作。

答案 1 :(得分:1)

请记住,运行oracle数据库的用户必须具有对/ defaultdir目录的写权限,而不是用户登录到oracle。通常,您以用户“Oracle”身份运行数据库。与您使用。

创建外部表的用户(必然)不同

检查您的目录权限。

答案 2 :(得分:1)

我们遇到了同样的问题:

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

在我们的例子中,我们有一个带有2个节点的RAC。在对日志目录提供写入权限后,双方 ,一切正常。

答案 3 :(得分:0)

我们在Windows上的Oracle RAC 11g上遇到此错误,解决方案是在两个节点上创建相同的操作系统目录树和外部文件。

答案 4 :(得分:-3)

当您想要创建external_table时,所有字段的名称必须以大写字母书写。

完成。