我遇到了一些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表上选择,我可以看到目录的路径是正确的。
答案 0 :(得分:0)
问题与用户在操作系统侧的访问权限有关。它在Oracle支持说明中在“远程共享/服务器上创建数据库目录”(文档ID 739772.1)中定义
对于我来说,我创建了一个带有sysdba的目录,然后为了允许其他用户访问该外部表,我创建了另一个表,该表由Create Table as Select语句为外部表创建。否则,我需要将Windows Oracle Service所有者用户映射到注释中已定义的确切Oracle用户。 因此,这更适合我的情况。
总结一下步骤:
1-创建外部表T2
2-用CTAS创建一个名为T1的表到外部表
3-将SELECT权限授予T1
希望这对您有所帮助。