【问题标题】:SQL Loader Error: "Variable length field exceeds maximum length."SQL 加载程序错误:“可变长度字段超出最大长度。”
【发布时间】:2012-04-30 15:13:10
【问题描述】:

我有一个 SQL 加载器控制文件,

LOAD DATA  
INFILE 'test.txt'  
INTO TABLE TEST replace  
fields terminated "|" optionally enclosed by '"' TRAILING NULLCOLS  
( DOCUMENTID INTEGER(10),  
  CUSTID INTEGER(10),  
  USERID INTEGER(10),  
  FILENAME VARCHAR(255),  
  LABEL VARCHAR(50),  
  DESCRIPTION VARCHAR(2000),  
  POSTDATE DATE "YYYY-MM-DD HH24:MI:SS" NULLIF POSTDATE="",  
  USERFILENAME VARCHAR(50),  
  STORAGEPATH VARCHAR(255)
)

当我在其上运行 SQL 加载器时,它给了我一个错误,
Record 1: Rejected - Error on table TEST, column FILENAME. Variable length field exceeds maximum length.

这是那一行..该列的长度远低于 255..

1|5001572|2|/Storage/Test/5001572/test.pdf|test.pdf||2005-01-13 11:47:49||

这是我在日志文件中注意到的一个奇怪的地方

Column Name | Position | Len | Term | Encl | Datatype
FILENAME | NEXT | 257 | | | VARCHAR

我在表格和控制文件中都将长度定义为 255。然而日志显示为 257?我尝试将控制文件中的长度降低到 253,所以它在日志文件中显示为 255,但同样的问题。

有什么帮助吗?这已经困扰我两天了。

谢谢。

【问题讨论】:

    标签: oracle sql-loader


    【解决方案1】:

    不要将数据字段定义为 VARCHAR2 和 INTEGER。使用 CHAR。大多数情况下,从文本文件加载数据时,您希望使用 CHAR,或者可能是 DATE,尽管它也是从文本格式转换而来的。大多数时候,您甚至不需要长度说明符。 CHAR 字段的默认长度为 255。您的控制文件应如下所示:

    LOAD DATA
    INFILE "test.txt"
    INTO TABLE TEST replace
    fields terminated "|" optionally enclosed by '"' TRAILING NULLCOLS
    (
      DOCUMENTID,
      CUSTID,
      USERID ,
      FILENAME,
      LABEL,
      DESCRIPTION CHAR(2000),
      POSTDATE DATE "YYYY-MM-DD HH24:MI:SS" NULLIF POSTDATE=BLANKS,
      USERFILENAME,
      STORAGEPATH
    )
    

    【讨论】:

    • 然后..就是这样。用 char 指定长度也不是为我做的,但你发布的内容很完美。谢谢!
    【解决方案2】:

    +1 用于 DCookie,但要扩展它,区分表中指定的数据类型和 SQL*loader 控制文件中的数据类型很重要,因为它们的含义完全不同,容易混淆。

    首先查看documentation,并注意在加载常规文本文件时,您需要使用“可移植”数据类型。

    Varchar 是一种“不可移植”的类型,其中:

    ...由一个二进制长度子字段和一个指定长度的字符串组成

    正如 DCookie 所说,CHAR 是要使用的东西,而 INTEGER EXTERNAL 是一种非常常用的 SQL*Loader 数据类型,您可能希望为 DOCUMENTID 等指定它。

    【讨论】:

    • 谢谢!我也会记住这一点。我没有意识到它们是两个独立的东西——我认为它们应该是数学。二进制长度子字段 + 指定长度也解释了为什么 255 变成 257。
    • +1,在这里同意大卫。 SQL Loader 控制文件类型规范和表本身的规范之间的区别似乎总是让人们感到困惑。我认为我在控制文件中除了 CHAR 和 DATE 之外没有使用过任何东西。
    • 对了,你知道为什么控制文件和表本身会有这些不同的类型吗?
    • 控制文件格式的多样性代表了数字等值在外部文件中的排序方式。加载它们时,Oracle 中实际上只有浮点数和数字,但它们在数据文件或流中的表示可能会有很大差异。
    猜你喜欢
    • 1970-01-01
    • 2019-10-10
    • 1970-01-01
    • 2016-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-20
    相关资源
    最近更新 更多