开发者社区 问答 正文

oracle sqlldr命令:报错

有谁用过oracle的sqlldr命令?现在遇到这么一个问题,我在编写ctrl文件时候,如果表结构中有number类型的字段不知道怎么写,如number(8)和number(16,2)怎么写,请教下大神!

表结构如下:


create table test_tab(  
  ac_code    VARCHAR2(10 CHAR),
  cr_code    NUMBER(8),
  sb_code    VARCHAR2(8 CHAR),
  opp_no     VARCHAR2(32 CHAR),
  run_date   DATE,
  t_am       NUMBER(16,2),
  bal        VARCHAR2(1 CHAR)
);

ctrl文件如下:

load data 
CHARACTERSET 'UTF8'
infile 'F:/test_tab.txt'            
append into table test_tab    
fields terminated by '|'
trailing nullcols
(
  ac_code    CHAR(10),
  cr_code    INTEGER EXTERNAL,
  sb_code    CHAR(8),
  opp_no     CHAR(32),
  run_date   DATE,
  t_am       DECIMAL EXTERNAL,
  bal        CHAR(1)
)



展开
收起
kun坤 2020-06-14 08:22:29 565 分享 版权
阿里云 AI 助理回答

在使用SQL*Loader(sqlldr)时,针对Oracle的NUMBER类型字段,您需要根据字段的具体精度和小数位数来指定数据类型。对于您的问题,可以这样修改控制文件(.ctl)中的字段定义:

  1. cr_code NUMBER(8) 对应的是一个整数,没有小数部分。在控制文件中,您已经使用了 INTEGER EXTERNAL,这是正确的处理方式。

  2. t_am NUMBER(16,2) 是一个带有两位小数的数值。这里应该使用 DECIMAL EXTERNAL 并指定位数和小数点后的位数。但是,标准的SQL*Loader语法并不直接支持指定小数点后的位数。一种常见的做法是加载为字符串,然后在数据库层面进行转换,或者确保文本文件中的数据格式正确,并且在数据库中通过触发器或过程来进行必要的转换。但为了直接匹配,可以尝试如下写法,尽管这可能需要数据文件中的值严格符合格式:

load data 
CHARACTERSET 'UTF8'
infile 'F:/test_tab.txt'            
append into table test_tab    
fields terminated by '|' 
trailing nullcols
(
  ac_code    CHAR(10),
  cr_code    INTEGER EXTERNAL,
  sb_code    CHAR(8),
  opp_no     CHAR(32),
  run_date   DATE "YYYY-MM-DD",
  t_am       DECIMAL EXTERNAL (16,2), -- 注意这里尝试直接指定精度和小数位数,但需实际测试确认
  bal        CHAR(1)
)

请注意,直接在DECIMAL EXTERNAL后面添加精度和小数位数的格式(如(16,2))是一种期望的行为表示,实际是否生效可能会依赖于SQL*Loader的具体版本以及配置,因此建议先在测试环境中验证此方案。

如果上述方法不适用,考虑将t_am字段以文本形式加载(比如用CHAR类型),然后在数据库中通过触发器或后续的SQL操作将其转换为NUMBER(16,2)类型。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答