Oracle 11G、外部表和 .csv 文件

Posted

技术标签:

【中文标题】Oracle 11G、外部表和 .csv 文件【英文标题】:Oracle 11G, external tables and .csv file 【发布时间】:2013-08-23 19:35:39 【问题描述】:

Oracle 11g 中的外部表存在问题。我目前正在使用 DB Artisan 来运行我的查询。 CREATE 和 ORGANIZATION 代码成功执行,但是当我运行 select 语句时出现错误。我的 .csv 文件的设置方式与 EXTERNAL_TABLE 的布局相同,标题也是如此。

CREATE TABLE EXTERNAL_TABLE
(
    COL1 NUMBER(14),
     COL2 VARCHAR2(10),
     COL3 VARCHAR2(3),
     COL4 VARCHAR2(3),
     COL4 VARCHAR2(4),
     COL6 NUMBER(4,0),
     COL7 VARCHAR2(20),
     COL8 VARCHAR2(20),
     COL9 NUMBER(3)    
)
ORGANIZATION EXTERNAL 
(
    TYPE ORACLE_LOADER
    DEFAULT DIRECTORY FOLDER1
    ACCESS PARAMETERS
    (   
        RECORDS DELIMITED BY NEWLINE
        FIELDS TERMINATED BY ','
        MISSING FIELD VALUES ARE NULL
        (COL1 CHAR(14),
    COL2 CHAR(10),
    COL3 CHAR(3),
    COL4 CHAR(3),
    COL4 CHAR(4),
    COL6 CHAR(4),
    COL7 CHAR(20),
    COL8 CHAR(20),
    COL9 CHAR(3)                      
                )
    )
    LOCATION ('FILENAME.csv') --Name of flat file.
)
REJECT LIMIT 0;

跑步:

SELECT * FROM EXTERNAL_TABLE

给出这个错误:

ORA-29913: 执行 ODCIEXTTABLEOPEN 标注时出错 ORA-29400: 数据磁带错误 KUP-04027:文件名检查失败:A:\job\job\FILENAME_1234_5566.log

【问题讨论】:

检查软盘上的写保护标签。 哈哈!!!软盘的回归! Oracle 11g 从软盘读取是无价的。请注意 dolm77 - 在尝试导入文件之前将文件移动到您的硬盘。 ORGANIZATION 代码是 CREATE TABLE 命令的一部分,而不是单独的代码。 【参考方案1】:

KUP-04027:file name check failed 表示文件位置无效。

所以,给定这个文件名...

A:\job\job\FILENAME_1234_5566.log

...出现了几个想法:

    正如@jonearles 指出的那样,A: 传统上是为软盘驱动器保留的。您的数据库服务器(即托管您的数据库的机器)是否有 A: 驱动器?如果不是,您应该纠正它。 该驱动器真的有一个名为job 的根目录和一个名为job 的子目录吗?还是您的 DIRECTORY 对象 folder1 的路径中的拼写错误? 此外,您的示例代码将文件名指定为“FILENAME.csv”。显然这与错误消息中的文件名不匹配。您实际上为外部表定义中的文件名指定了什么? KUP-04027 的确切原因因操作系统而异,因为文件命名约定因每个操作系统而异。我的猜测是您的数据库确实驻留在远程 Unix 服务器上,但您正试图从本地 Windows PC 读取文件。如果这是您的方案,它将无法正常工作:您需要将文件上传到数据库服务器。

【讨论】:

一个驱动器是另一个映射驱动器的变量。它实际上是 J。抱歉,我应该具体一点。路径是 J:\proxy\proxy,在错误 3 上,它指的是我运行 SELECT 语句时创建的日志文件。真正的文件名是“FILENAME.csv”,它位于数据库所在的远程服务器上。所以 .csv 不在我的本地驱动器上,它在外部表的默认目录上,称为 DATA_TEMP。为了确定我的问题,我应该问哪些基本问题?【参考方案2】:

好的,这个问题很久以前就问过了,但是我最近自己也遇到了这个问题。

问题是 Oracle 外部表不完全支持引用远程网络位置的硬链接。 我所做的就是创建一个专门使用 UNC 路径的目录对象(例如 '\remoteserver\proxy' 来指向远程网络位置。这对我来说很神奇。

【讨论】:

【参考方案3】:

如果您在 RAC 中并且文件在 ACFS 中,则使用:

DISABLE_DIRECTORY_LINK_CHECK 

修复它!

见https://www.realdbamagic.com/using-external-table-windows-rac-acfs/

【讨论】:

以上是关于Oracle 11G、外部表和 .csv 文件的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在 PLSQL/Oracle 中动态创建外部表

oracle11g,18存储结构:暂时表,手工条带化,表/索引迁移表空间,删除表,外部表

在 Oracle 过程中创建外部表

外部表的 ORACLE 目录权限

Oracle 11g - 使用序列中的常量值填充表行

Migrating Oracle 11g R2 To Oracle 19c