解决外部表

时间:2016-11-18 10:59:07

标签: oracle load external

我遇到了一些Oracle外部表

的问题
create table myExternalTable
(field1, field2....)
ORGANIZATION EXTERNAL
(TYPE ORACLE_LOADER
DEFAULT DIRECTORY myDirectory
ACCESS PARAMETERS
(RECORDS DELIMITED BY NEWLINE
NOLOGFILE
NOBADFILE
NODISCARDFILE
FIELDS TERMINATED BY '$')
LOCATION ('data.dsv'));
commit;

alter table myExternalTable reject limit unlimited; --solve reject limit reached problem

select * from myExternalTable;

当我在桌子上选择时,我有这个错误:

ERROR at line 1:
ORA-29913: error in executing ODCIEXTTABLEOPEN callout
ORA-29400: data cartridge error
KUP-04040: file data.dsv in myDirectory not found

似乎错误描述不正确,因为通常表在创建时已经加载了data.dsv。 另外data.dsv存在于myDirectory中。

发生了什么事?有人可以帮忙吗?

注意:

而不是选择,这是我通常做的事情:

merge into myDatabaseTable
using
(select field1, field2,.... from myExternalTable) temp
on (temp.field1= myDatabaseTable.field1)
when matched then update
set myDatabaseTable.field1 = temp.field1,
 myDatabaseTable.field2 = temp.field2,
 ......;

这对我的开发环境有效,但在其他环境中,我遇到了我之前说的错误:

ERROR at line 1:
ORA-29913: error in executing ODCIEXTTABLEOPEN callout
ORA-29400: data cartridge error
KUP-04040: file data.dsv in myDirectory not found

首先我认为,在环境不起作用的情况下,目录没有指出它必须在哪里但是在dba_directories表上选择,我可以看到目录的路径是正确的。

1 个答案:

答案 0 :(得分:0)

问题与用户在操作系统侧的访问权限有关。它在Oracle支持说明中在“远程共享/服务器上创建数据库目录”(文档ID 739772.1)中定义

对于我来说,我创建了一个带有sysdba的目录,然后为了允许其他用户访问该外部表,我创建了另一个表,该表由Create Table as Select语句为外部表创建。否则,我需要将Windows Oracle Service所有者用户映射到注释中已定义的确切Oracle用户。 因此,这更适合我的情况。

总结一下步骤:

1-创建外部表T2

2-用CTAS创建一个名为T1的表到外部表

3-将SELECT权限授予T1

希望这对您有所帮助。