1

将 FIXED 参数与外部表一起使用时,我收到“文件末尾的部分记录”错误。

我正在使用 SQL Developer,Oracle 11g XE。

-------
foo.dat - Field lengths: fname=7;lname=8;year=4
-------
Alvin  Tolliver1976
KennethBaer    1963
Mary   Dube    1973 

这是表的 DDL:

CREATE TABLE emp_load (
    first_name CHAR(7)
    , last_name CHAR(8)
    , year_of_birth CHAR(4)
)
  ORGANIZATION EXTERNAL (
     TYPE ORACLE_LOADER 
     DEFAULT DIRECTORY ext_tab_dir
     ACCESS PARAMETERS (
           RECORDS FIXED 20 FIELDS (
               first_name CHAR(7)
               , last_name CHAR(8)
               ,  year_of_birth CHAR(4)
               )
      )
      LOCATION ('foo.dat'));

正在创建表 emp_load,但 select 语句失败并显示以下错误消息。执行时的错误消息select * from emp_load

ORA-29913: error in executing ODCIEXTTABLEFETCH callout
ORA-29400: data cartridge error
KUP-04018: <b>partial record at end of file C:\oracle\foo.dat</b>
29913. 00000 -  "error in executing %s callout"
*Cause:    The execution of the specified callout caused an error.
*Action:   Examine the error messages take appropriate action.

它唯一有效的时候是我制作 foo.dat 1 行(如下所示)并将 FIXED 长度更改为 19-

Alvin  Tolliver1976KennethBaer    1963Mary   Dube    1973

这似乎表明我在换行符方面做错了,但我不知道是什么。

任何帮助,将不胜感激。提前致谢!

4

2 回答 2

0

您在多行数据文件的最后一行之后缺少换行符。即你的最后一行长度是 19 个字节而不是 20 个字节。您可以检查数据文件的大小 - 它应该是 3 * 20 = 60 字节。

当您将数据文件更改为在一行中包含所有数据并使用RECORDS FIXED 19时一切正常,因为现在不需要换行。

于 2011-10-17T06:10:33.900 回答
0

我找到了答案。。

文档说 FIXED 在最后假定一个换行符。

在 Windows 中,换行符 (\r\n) 占用 2 个字节。
因此,在 Windows 中,传递给 FIXED 的长度应该是 = 字段总长度 + 2
在 Unix 中,它应该是 = 字段总长度 + 1

我已经在我的 Windows Vista 机器上安装了 Oracle 11g。所以 21 是总长度而不是 20。

文档中的示例可能适用于 Unix,它使用 1 个字节作为换行符 (\n)

因此,如果 Oracle 11g 安装在 Windows 上,这是正确的代码 -

CREATE TABLE emp_load (first_name CHAR(15), last_name CHAR(20), year_of_birth CHAR(4))
  组织外部(类型 ORACLE_LOADER 默认目录 filesdir
                         访问参数(记录固定 21 个字段
                                              (first_name CHAR(7),
                                               姓氏 CHAR(8),
                                               year_of_birth CHAR(4)))
                         位置('info1.dat'));

感谢 ypercube 提供替代解决方案。我赞成你的建议。(ypercube 建议使用 DELIMITED BY NEWLINE 提供了一个替代方案,实际上是一个更简单的解决方案。但我想发布上述内容,因为我认为这对尝试使用 Oracle 文档中的示例进行 FIXED 的人很有用。)

于 2011-10-17T22:06:09.017 回答