oracle外部表从文件中获取选定的列

时间:2015-03-04 08:05:07

标签: oracle oracle10g

我遇到oracle外部表的问题我有一个文本文件会有50多个不必要的列,现在我想从文本文件中选择一些列到我的外部表。

        create table tmpdc_ticket(
        SERVICE_ID CHAR(144),
        SERVICE_TYPE CHAR(50),
        CUSTOMER_NAME CHAR(200),
        TELEPHONE_NO CHAR(144),
        ACCOUNT_NUMBER CHAR(144),
        FAULT_STATUS CHAR(50),
        BUSINESS_GROUP CHAR(100)
    )
    organization external(
        type    oracle_loader
        default directory sample_directory
        access parameters(
            records delimited by newline
            nologfile
            skip 1
            fields terminated by '|'
            missing field values are null
                (SERVICE_ID CHAR(144),
                 SERVICE_TYPE CHAR(50),
                 CUSTOMER_NAME CHAR(200),
                 TELEPHONE_NO CHAR(144),
                 ACCOUNT_NUMBER CHAR(144),
                 FAULT_STATUS CHAR(50),
                 BUSINESS_GROUP CHAR(100)
            )
        )
        location(sample_directory:'sample_file.txt')
    )
    reject limit 1
    noparallel
    nomonitoring;

然而,似乎oracle_loader正在从我的文本文件的第一列插入。是否有可能像文本文件中的第3列一样?

1 个答案:

答案 0 :(得分:3)

如果您要在文件中设置了要忽略的分隔字段,只需在the field list clause中使用虚拟字段名称指定它们,并且不要将它们包含在表列列表中。这将忽略文件中的前两个字段:

create table tmpdc_ticket(
    SERVICE_ID CHAR(144),
    SERVICE_TYPE CHAR(50),
    CUSTOMER_NAME CHAR(200),
    TELEPHONE_NO CHAR(144),
    ACCOUNT_NUMBER CHAR(144),
    FAULT_STATUS CHAR(50),
    BUSINESS_GROUP CHAR(100)
)
organization external(
    type    oracle_loader
    default directory sample_directory
    access parameters(
        records delimited by newline
        nologfile
        skip 1
        fields terminated by '|'
        missing field values are null
            (DUMMY_1,
             DUMMY_2,
             SERVICE_ID CHAR(144),
             SERVICE_TYPE CHAR(50),
             CUSTOMER_NAME CHAR(200),
             TELEPHONE_NO CHAR(144),
             ACCOUNT_NUMBER CHAR(144),
             FAULT_STATUS CHAR(50),
             BUSINESS_GROUP CHAR(100)
        )
    )
    location(sample_directory:'sample_file.txt')
)
reject limit 1
noparallel
nomonitoring;

所以如果你有一个文件包含(在这种情况下非常人为的值):

Header
dummy_1|dummy_2|service_id|service_type|customer_name|telephone_no|account_number|fault_status|business_group

然后表格将看不到前两个字段,并且将包含:

select * from tmpdc_ticket;

SERVICE_ID SERVICE_TYPE CUSTOMER_NAME TELEPHONE_NO ACCOUNT_NUMBER FAULT_STATUS BUSINESS_GROUP
---------- ------------ ------------- ------------ -------------- ------------ --------------
service_id service_type customer_name telephone_no account_number fault_status business_group 

如果需要,您可以在字段列表的中间放置更多虚拟字段,而不仅仅是在开头。当然,只要名称不与您正在使用的字段冲突,您就可以调用它们,因此您可能希望为它们提供有意义的名称以便于维护并使您的生活更轻松,如果您确定要包含另一个在表格列中稍后。

顺便说一下,您可能希望将表列声明为VARCHAR2而不是CHAR:

create table tmpdc_ticket(
    SERVICE_ID VARCHAR2(144),
    SERVICE_TYPE VARCHAR2(50),
    CUSTOMER_NAME VARCHAR2(200),
    TELEPHONE_NO VARCHAR2(144),
    ACCOUNT_NUMBER VARCHAR2(144),
    FAULT_STATUS VARCHAR2(50),
    BUSINESS_GROUP VARCHAR2(100)
)
organization external(
...