oracle external table 从文件中获取选定的列

oracle external table get selected columns from the file

我在使用 oracle 外部时遇到问题 table 我有一个文本文件会有 50 多个不必要的列,现在我想 select 从文本文件到我的外部 table.

        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 列一样?

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

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

那么 table 将看不到前两个字段,并将包含:

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 

如果需要,您可以将更多的虚拟字段放在字段列表的中间,而不仅仅是开头。你当然可以给它们起任何名字,只要名字不与你使用的字段冲突,所以你可能想给它们起有意义的名字,以方便维护,如果你决定要包含另一个名字,让生活更轻松在稍后的 table 列中。

顺便说一下,您可能希望将 table 列声明为 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(
...