【问题标题】:External Tables - "partial record at end of file" error when using FIXED外部表 - 使用 FIXED 时出现“文件末尾的部分记录”错误
【发布时间】:2023-04-05 04:26:02
【问题描述】:

在将 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

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

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

【问题讨论】:

  • 我认为你需要DELIMITED BY NEWLINE : download.oracle.com/docs/cd/B19306_01/server.102/b14215/…
  • @ypercude:恐怕你弄错了。从您链接的规范中:FIXED 子句用于将记录标识为所有具有固定长度字节大小的记录。为 FIXED 记录指定的大小必须包含任何记录终止字符,例如换行符。 我认为 OP 的 DDL 是正确的。

标签: database oracle plsql oracle11g external-tables


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    我找到了答案..

    文档说 FIXED 在末尾假定一个换行符。

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

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

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

    所以,如果在 Windows 上安装了 Oracle 11g,这是正确的代码 -

    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 的人很有用。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-25
      • 2018-03-19
      • 1970-01-01
      • 1970-01-01
      • 2021-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多