oracle 外部表列

omvjsjqw  于 2023-02-18  发布在  Oracle
关注(0)|答案(1)|浏览(105)

我有下面的代码。现在的问题是,我们希望在文件中有三列,但有时其他团队发送给我们4列。因此,它不会失败加载,而是加载前三列。当文件少于3列时,它会失败,这是预期的。当文件中存在额外的列时,我需要在失败的地方放置什么逻辑?

CREATE TABLE TESTING_DUMP (
"FIELD_1"            NUMBER,
"FIELD_2"            VARCHAR2(5),
"FIELD_3"            VARCHAR2(5)
)
ORGANIZATION external
(
TYPE oracle_loader
DEFAULT DIRECTORY MY_DIR
ACCESS PARAMETERS
(
  RECORDS DELIMITED BY NEWLINE CHARACTERSET US7ASCII
  BADFILE "MY_DIR":"TEST.bad"
  LOGFILE "MY_DIR":"TEST.log"
  READSIZE 1048576
  FIELDS TERMINATED BY "|" LDRTRIM
  MISSING FIELD VALUES ARE NULL
  REJECT ROWS WITH ALL NULL FIELDS
  (
  "LOAD"               CHAR(1),
  "FIELD_1"            CHAR(5),
  "FIELD_2"            INTEGER EXTERNAL(5),
  "FIELD_3"            CHAR(5)
  )
  )
  location
  (
  'Test.xls'
  )
)REJECT LIMIT 0;

文件Test.xls包含以下示例内容。第二行是正确的。第一行应该失败,但它没有。

|11111|22222|33333|AAAAA
|22222|33333|44444|
wfypjpf4

wfypjpf41#

我不知道如何在一个步骤中做到这一点,所以我会建议一个变通方案-看看它是否有帮助。
这是目标表,在最后应该只包含有效行:

SQL> create table ext_target
  2    (col1 number,
  3     col2 varchar2(5),
  4     col3 varchar2(5));

Table created.

外部表格仅包含一列,该列将包含整行(即,没有单独的列):

SQL> create table ext_dump
  2    (col  varchar2(100))
  3  organization external (
  4    type oracle_loader
  5    default directory ext_dir
  6    access parameters (
  7      records delimited by newline
  8      fields terminated by ','
  9      missing field values are null
 10      (
 11        col      char(100)    )
 12    )
 13    location ('test.txt')
 14  )
 15  reject limit unlimited;

Table created.

这是整个文件的内容:

|11111|22222|33333|AAAAA
|22222|33333|44444|
|55555|66666|

外部表格包含整个文件(不拒绝任何内容):

SQL> select * from ext_dump;

COL
--------------------------------------------------------------------------------
|11111|22222|33333|AAAAA
|22222|33333|44444|
|55555|66666|

只将有效行插入目标表(到目前为止,有两个条件:不应该有4个“列”,并且只能有4个| * 分隔符 *:

SQL> insert into ext_target (col1, col2, col3)
  2  select regexp_substr(col, '\w+', 1, 1),
  3         regexp_substr(col, '\w+', 1, 2),
  4         regexp_substr(col, '\w+', 1, 3)
  5  from ext_dump
  6  where regexp_substr(col, '\w+', 1, 4) is null
  7    and regexp_count(col, '\|') = 4;

1 row created.

唯一有效的行:

SQL> select * from ext_target;

      COL1 COL2  COL3
---------- ----- -----
     22222 33333 44444

SQL>

现在,您可以根据需要调整where子句;我贴的只是一个例子。

相关问题