代码之家  ›  专栏  ›  技术社区  ›  Lukman

从SQL*加载程序控制文件中访问数据文件名

  •  3
  • Lukman  · 技术社区  · 16 年前

    如何从SQL*Loader控制文件中访问输入数据文件名,以便将其与输入文件中的数据一起插入表中?

    例如,假设我有以下控制文件:

    LOAD DATA
    
    APPEND
    INTO TABLE STG_AM02_BA_RAW
    WHEN (1:2) = 'DT'
    (
            SUBSCRIBER_NO                   POSITION(11:18)CHAR, 
            ACCOUNT_NO                      POSITION(19:32)CHAR, 
            SUBSCRIBER_NAME                 POSITION(33:92)CHAR
    )
    

    我想做一些类似的事情:

    LOAD DATA
    
    APPEND
    INTO TABLE STG_AM02_BA_RAW
    WHEN (1:2) = 'DT'
    (
            SUBSCRIBER_NO                   POSITION(11:18)CHAR, 
            ACCOUNT_NO                      POSITION(19:32)CHAR, 
            SUBSCRIBER_NAME                 POSITION(33:92)CHAR, 
            INPUTFILE                       INPUTFILENAME()CHAR
    )
    

    假设我没有权限编辑将使用此控制文件调用SQL*Loader的shell脚本。

    3 回复  |  直到 16 年前
        1
  •  2
  •   Nick Pierpoint    16 年前

    从11g开始,无法直接从SQL*加载程序控制文件访问文件名。

    FN                ...        inputfile.txt
    DT     12345678XXX...XXXXXYYYYYYYYYYYYYYYY
    DT     12345678XXX...XXXXXYYYYYYYYYYYYYYYY
    DT     12345678XXX...XXXXXYYYYYYYYYYYYYYYY
    DT     12345678XXX...XXXXXYYYYYYYYYYYYYYYY
    DT     12345678XXX...XXXXXYYYYYYYYYYYYYYYY
    

    然后,您的加载脚本可以更改为:

    LOAD DATA
    
    APPEND
    INTO TABLE STG_AM02_BA_RAW
    WHEN (1:2) = 'FN'
    (
            INPUTFILE                       POSITION(1:92)CHAR
    )
    WHEN (1:2) = 'DT'
    (
            SUBSCRIBER_NO                   POSITION(11:18)CHAR, 
            ACCOUNT_NO                      POSITION(19:32)CHAR, 
            SUBSCRIBER_NAME                 POSITION(33:92)CHAR
    )
    

    这一切都取决于您是否可以更新数据文件。。。

    例如

    echo "FNinputfile.txt" > header.txt
    cat header.txt inputfile.txt > newinputfile.txt
    

    LOAD DATA
    TRUNCATE INTO TABLE STAGE_FILENAME
    WHEN (1:2) = 'FN'
    (
            INPUTFILE                       POSITION(1:92)CHAR
    )
    TRUNCATE INTO TABLE STAGE_DATA
    WHEN (1:2) = 'DT'
    (
            SUBSCRIBER_NO                   POSITION(11:18)CHAR, 
            ACCOUNT_NO                      POSITION(19:32)CHAR, 
            SUBSCRIBER_NAME                 POSITION(33:92)CHAR
    )
    

    ... 并使用SQL将它们连接在一起:

    insert into STG_AM02_BA_RAW
        (
        subscriber_no,
        account_no,
        subscriber_name,
        input_filename
        )
    select
        d.subscriber_no,
        d.account_no,
        d.subscriber_name,
        f.inputfile
    from
        stage_data d,
        inputfile d
    

    如果您有并发加载,则此过程将终止。

        SUBSCRIBER_NAME                 POSITION(92:*)CHAR
    
        2
  •  1
  •   Tom H zenazn    16 年前

    我不认为在您指定的情况下有办法做到这一点,因为在“数据”部分没有办法正确引用文件名。

    解决方案的两个想法:

    • 使用单独的SQL语句更新新插入的记录。您可能能够从调用SQL*Loader的批处理文件中构建语句。
    • 修改数据文件以包含文件名(同样,可以从批处理文件中完成)。
    • 让批处理文件构建控制文件,将文件名作为常量包含在内,这样您就可以

      INPUTFILE常量“my_data.dat”

    希望这有帮助。

        3
  •  0
  •   Nash    16 年前

    解决这个问题的简单方法是在每个记录的末尾添加一个额外的列,并将该列的位置映射到该字段。