有谁用过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) )
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
在使用SQL*Loader(sqlldr)时,针对Oracle的NUMBER类型字段,您需要根据字段的具体精度和小数位数来指定数据类型。对于您的问题,可以这样修改控制文件(.ctl)中的字段定义:
cr_code NUMBER(8)
对应的是一个整数,没有小数部分。在控制文件中,您已经使用了 INTEGER EXTERNAL
,这是正确的处理方式。
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)类型。