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(
...
我在使用 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(
...