【问题标题】:SQL Loader - Invalid NumberSQL 加载程序 - 无效数字
【发布时间】:2015-02-15 03:13:43
【问题描述】:

我正在尝试通过 SQLoader 加载数据,但在 Invalid Number 的数字字段中出现错误

我的数据文件:

00163604~12002~S~N~N~Panasonic Juicer 1.5l Steel Color~ss~E~A~12/15/2014 3:33:57 PM~N~N~N~Y~294~SA

控制文件:

LOAD DATA
INFILE "/home/dmf/ITEMLOC.txt"
APPEND
INTO TABLE DMF.MIG_ITEM_LC
FIELDS TERMINATED BY "~"
TRAILING NULLCOLS
(
ITEM "SUBSTRB(:ITEM,1,25)",
LOC "TO_NUMBER(:LOC)",
LOC_TYPE "SUBSTRB(:LOC_TYPE,1,1)",
CLEAR_IND "SUBSTRB(:CLEAR_IND,1,1)",
TAXABLE_IND "SUBSTRB(:TAXABLE_IND,1,1)",
LOCAL_ITEM_DESC "SUBSTRB(:LOCAL_ITEM_DESC,1,250)",
LOCAL_SHORT_DESC "SUBSTRB(:LOCAL_SHORT_DESC,1,120)",
STORE_ORD_MULT "SUBSTRB(:STORE_ORD_MULT,1,1)",
STATUS_UPDATE_DATE sysdate,
STATUS "SUBSTRB(:STATUS,1,1)",
STORE_PRICE_IND "SUBSTRB(:STORE_PRICE_IND,1,1)",
RPM_IND "SUBSTRB(:RPM_IND,1,1)",
EXT_UIN_IND "SUBSTRB(:EXT_UIN_IND,1,1)",
RANGED_IND "SUBSTRB(:RANGED_IND,1,1)",
PRIMARY_SUPP "TO_NUMBER(:PRIMARY_SUPP)",  -- The Error is coming here
PRIMARY_CNTRY "SUBSTRB(:PRIMARY_CNTRY,1,3)"
)

拒绝 - 表 DMF.MIG_I​​TEM_LC 的 PRIMARY_SUPP 列出错。 ORA-01722: 无效号码

如果我写给它常量,它会成功加载。

可能是什么问题?

【问题讨论】:

  • 数据库中的PRIMARY_SUPP列是如何定义的?它是在所有行上失败还是在某些行上失败?数据是否包含不可见的控制字符?哦,请确保您的描述列中没有一个包含您的分隔符,因为这会将所有内容都放在一个列中。
  • 在数据库中定义为NUMBER。并且没有任何描述有分隔符。当我给它一个常量 PRIMARY_SUPP CONSTANT '2' 时,它会被加载。但不是数据文件中的值

标签: sql oracle loading sql-loader


【解决方案1】:

您发布的数据对我来说很好。

SQL> select version from v$instance;

VERSION
-----------------
11.2.0.2.0

这是我使用的创建表语句:

create table test1
(
item varchar2(25),
loc number,
loc_type char(1),
clear_ind char(1),
taxable_ind char(1),
local_item_desc varchar2(250),
local_short_desc varchar2(120),
store_ord_mult char(1),
status char(1),
store_price_ind char(1),
rpm_ind char(1),
ext_uin_ind char(1),
ranged_ind char(1),
primary_supp number,
primary_cntry varchar2(3)
);

如果您在尝试仅加载您发布的一条记录时遇到此错误,那么我会怀疑是一个不可打印的字符,就像 @Gary_W 建议的那样。使用十六进制查看器查看数据以进行检查。

文件和您的 NLS_LANG 设置之间的字符集差异可能有问题,但在这种情况下我对此表示怀疑,因为您的数据看起来都是 ASCII 值。

【讨论】:

  • 谢谢拉塞尔,我刚刚发现我正在从数据文件中读取日期值之一,我还为其插入了 sysdate。因此,它插入了该变量的 sysdate 并将数据从文件推送到下一个变量。 (更新的控制文件)还有一个问题,有没有办法从数据文件中读取记录,而不是使用那个值,而是使用一个常量值?
  • 在这种情况下,最简单的方法是将您的 STATUS_UPDATE_DATE 列移动到 sqlldr 控制文件的末尾,因为您使用了 TRAILING NULLCOLS 选项,所以 Oracle 会假装数据中有一个额外的字段。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-18
  • 2019-07-24
  • 1970-01-01
  • 2021-07-10
  • 2011-05-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多