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

Zyr*_*rax 1 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;
Run Code Online (Sandbox Code Playgroud)

但是,似乎oracle_loader正在从文本文件的第一列进行插入。是否有可能像文本文件中的第3列一样已经获取?

Ale*_*ole 5

如果您要忽略的文件中带分隔符的字段,只需在字段列表子句中使用虚拟字段名指定它们,而不要将它们包括在表列列表中。这将忽略文件中的前两个字段:

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;
Run Code Online (Sandbox Code Playgroud)

因此,如果您有一个包含(在这种情况下非常虚假的值)的文件:

Header
dummy_1|dummy_2|service_id|service_type|customer_name|telephone_no|account_number|fault_status|business_group
Run Code Online (Sandbox Code Playgroud)

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

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 
Run Code Online (Sandbox Code Playgroud)

如果需要,您可以在字段列表的中间放置更多的虚拟字段,而不仅仅是在开头。只要您的名称不与您使用的字段发生冲突,您就可以随意称呼它们,因此,如果您决定添加其他名称,则可能需要给它们起有意义的名称,以简化维护并简化工作在后面的表格列中。

顺便说一句,您可能希望将表列声明为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(
...
Run Code Online (Sandbox Code Playgroud)