【问题标题】:Sqlldr loader number column importSqlldr 加载器编号列导入
【发布时间】:2024-01-06 14:28:01
【问题描述】:

下面是我的原始文件

br-Name-acc-Bal
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-

我想使用 sqlldr 将这些数据导入到我的表中,并且我需要在 bal 列前面没有 (,) 逗号的 (-) 符号。


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) ----->What should I mention here??? (Here am using datatype as number(17,3))
)

begindata

我正在寻找如下结果

你能帮我解决这个问题吗

【问题讨论】:

    标签: oracle oracle-sqldeveloper sql-loader


    【解决方案1】:

    对于您发布的数据,它看起来像这样:如果第 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
    

    【讨论】:

    • 实际上我的原始金额列超过 8 个字符,我可以提什么来代替 '9g999d99'。 Amt 列数据类型为 varchar2(25)。样本量 1. 22,43,000.00 2. 22,43,000.00- 3. 4,2,24,3000.00
    • 如果您不知道数据的外观,您就有问题了。您最好的选择是确保输入数据看起来绝对有效。负数应以“减号”开头,并且不应有任何格式应用于数字(小数除外,如果存在的话)。