对于您发布的数据,它看起来像这样:如果第 9 个字符是 -,则取 BAL 值的子字符串,长度不超过 8 个字符,然后乘以 -1。
目标表:
SQL> desc table1
Name Null? Type
----------------------------------------------------- -------- ---------------------
BR VARCHAR2(10)
NAME VARCHAR2(10)
ACC VARCHAR2(10)
BAL NUMBER
控制文件:
load data
infile *
truncate into table table1
fields
trailing nullcols
(
Br POSITION(1:2),
Name POSITION(4:5),
acc POSITION(6:7),
bal POSITION(10:18) "to_number(substr(:bal, 1, 8), '9g999d99', 'nls_numeric_characters = .,') *
case when substr(:bal, -1) = '-' then -1 else 1 end"
)
begindata
10 B LO 1,000.12-
10 C SB 2,000.15
11 D FD 5,000.00
12 E RD 6,000.00
14 G LO 8,000.56-
15 Q LO 7,000.89-
加载会话和结果:
SQL> $sqlldr scott/tiger@kc11gt control=test35.ctl log=test35.log
SQL*Loader: Release 11.2.0.1.0 - Production on Sri O×u 24 12:24:59 2021
Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.
Commit point reached - logical record count 5
Commit point reached - logical record count 6
SQL> select * from table1;
BR NAME ACC BAL
---------- ---------- ---------- ----------
10 B LO -1000,12
10 C SB 2000,15
11 D FD 5000
12 E RD 6000
14 G LO -8000,56
15 Q LO -7000,89
6 rows selected.
SQL>
5000 和 6000 不显示小数,因为它是 NUMBER 数据类型列;如果您想查看小数,请使用带有适当格式掩码的 TO_CHAR 函数或(如果您使用的工具允许)设置数字格式,例如在 SQL*Plus 中
SQL> set numformat 9999d99
SQL> select * from table1;
BR NAME ACC BAL
---------- ---------- ---------- --------
10 B LO -1000,12
10 C SB 2000,15
11 D FD 5000,00
12 E RD 6000,00
14 G LO -8000,56
15 Q LO -7000,89