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

Zac*_*ber 7 oracle oracle11g

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

以下内容基于Oracle的外部表概念.我们使用的数据库是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')
);
Run Code Online (Sandbox Code Playgroud)

这是"external_table_test.dat"的内容:

56november, 15, 1980  baker             mary       alice      09/01/2004
87december, 20, 1970  roper             lisa       marie      01/01/1999
Run Code Online (Sandbox Code Playgroud)

我能够运行创建"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
Run Code Online (Sandbox Code Playgroud)

编辑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;
Run Code Online (Sandbox Code Playgroud)

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

056,baker,beth,mary
057,smith,teddy,john
Run Code Online (Sandbox Code Playgroud)

我必须将"EMP.BAD","EMP.LOG"和"external_table_test2.dat"的权限设置为777才能使其正常工作.oracle用户不拥有这些文件,但与文件位于同一组中.

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

Zac*_*ber 4

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

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