我在使用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列一样已经获取?
如果您要忽略的文件中带分隔符的字段,只需在字段列表子句中使用虚拟字段名指定它们,而不要将它们包括在表列列表中。这将忽略文件中的前两个字段:
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)