Oracle跳过预告片行

时间:2016-08-09 09:46:14

标签: oracle plsql

我想通过跳过最后一行(即拖车行)来导入数据库表中的CSV文件。 我使用oracle的外部表方式导入文件。据我所知,只有在外部表中跳过标题并导入的方法。但我想跳过预告片并导入。我该怎么办?

以下是我的代码:

CREATE OR REPLACE DIRECTORY ext_tab_data AS 'C:\Users\hello\Desktop\';

CREATE TABLE buildinfo_ext (
  "BUILD NO" NUMBER NOT NULL ENABLE, 
  "DATE" DATE NOT NULL ENABLE
)
ORGANIZATION EXTERNAL (
  TYPE ORACLE_LOADER
  DEFAULT DIRECTORY ext_tab_data
  ACCESS PARAMETERS (
    RECORDS DELIMITED BY NEWLINE
    SKIP 1
    FIELDS TERMINATED BY ','
    MISSING FIELD VALUES ARE NULL
    (
      "BUILD NO" NUMBER NOT NULL ENABLE, 
      "DATE" DATE NOT NULL ENABLE
    )
  )
  LOCATION ('Info.csv')
)
PARALLEL 5
REJECT LIMIT UNLIMITED;

请帮助我。

提前致谢。

美好的一天!!!!

3 个答案:

答案 0 :(得分:0)

这应该跳过第一行:

...
RECORDS DELIMITED BY NEWLINE
SKIP 1
FIELDS TERMINATED BY ','
...

另一种方法是添加一个字段来表示行号,然后在查询表时使用它;添加此字段应创建一个字段LINE_NUMBER,其中包含文件中行的编号:

...
"DATE" DATE NOT NULL ENABLE,
LINE_NUMBER RECNUM
...

通过这种方式,您可以以相同的方式处理第一行和最后一行,只需检查行号。

答案 1 :(得分:0)

您可以尝试考虑一些过滤逻辑,如下所示。 PS这不是经过测试的代码。

CREATE TABLE buildinfo_ext (
  "BUILD NO" NUMBER NOT NULL ENABLE, 
  "DATE" DATE NOT NULL ENABLE
)
ORGANIZATION EXTERNAL (
  TYPE ORACLE_LOADER
  DEFAULT DIRECTORY ext_tab_data
  ACCESS PARAMETERS (
    RECORDS DELIMITED BY NEWLINE
    FIELDS TERMINATED BY ','
    MISSING FIELD VALUES ARE NULL
    (
      "BUILD NO" NUMBER NOT NULL ENABLE, 
      "DATE" DATE NOT NULL ENABLE
    )
   REJECT ROWS WITH ALL NULL FIELDS                      ----You can try check if that records is null. Or some other logic,
    (
    "BUILD NO" NUMBER
     TERMINATED BY "," OPTIONALLY ENCLOSED BY '"',
     "DATE" DATE
    )
  )
  LOCATION ('Info.csv')
)
PARALLEL 5
REJECT LIMIT UNLIMITED;

答案 2 :(得分:0)

  

让我们看一下场景,就像我们不知道数据,但现在我们想跳过最后一行

如果您对数据一无所知(例如,它在预告片的内置编号字段中没有神奇的数字,您可以查找;并且它不会成为无论如何都被拒绝了,因为它根本不是数字;等等)是the PREPROCESSOR clause,让它调用一个脚本,为你删除文件的最后一行。

例如,如果我创建名为remove_last_line的{​​{3}}(在同一目录中,但它可以 - 而且应该 - 在其他地方)只包含对sed命令的调用(或GNU /usr/bin/head --lines=-1 $1命令也适用于Linux):

 #!/bin/bash
 /bin/sed '$d' $1

然后我可以告诉Oracle我希望在加载文件之前传递该文件:

CREATE TABLE buildinfo_ext (
  "BUILD NO" NUMBER, 
  "DATE" DATE
)
ORGANIZATION EXTERNAL (
  TYPE ORACLE_LOADER
  DEFAULT DIRECTORY ext_tab_data
  ACCESS PARAMETERS (
    RECORDS DELIMITED BY NEWLINE
    SKIP 1
    PREPROCESSOR 'remove_last_line'
    FIELDS TERMINATED BY ','
    MISSING FIELD VALUES ARE NULL
    (
      "BUILD NO", 
      "DATE" CHAR(10) DATE_FORMAT DATE MASK "YYYY-MM-DD"
    )
  )
  LOCATION ('Info.csv')
)
--PARALLEL 5
REJECT LIMIT UNLIMITED;

我已禁用PARRALEL选项,因为它与SKIP发生冲突,但您当然也可以让预处理程序删除标题。我也调整了其他一些内容。

然后我创建一个Info.csv包含:

Build number,Date
1,2016-07-01
2,2016-07-02
2 records

当我查询表时,我只看到文件中的两个有效行:

select * from buildinfo_ext;

  BUILD NO DATE    
---------- ---------
         1 01-JUL-16
         2 02-JUL-16

未生成.bad个文件,且.log文件未报告任何问题:

 LOG file opened at 08/09/16 15:56:14

KUP-05004:   Warning: Intra source concurrency disabled because parallel select was not requested.

KUP-05007:   Warning: Intra source concurrency disabled because the preprocessor option is being used.

Field Definitions for table BUILDINFO_EXT
  Record format DELIMITED BY NEWLINE
  Data in file has same endianness as the platform
  Rows with all null fields are accepted

  Fields in Data Source:

    BUILD NO                        CHAR (255)
      Terminated by ","
      Trim whitespace same as SQL Loader
    DATE                            CHAR (10)
      Date datatype DATE, date mask YYYY-MM-DD
      Terminated by ","
      Trim whitespace same as SQL Loader

Date Cache Statistics for table BUILDINFO_EXT
  Max Size:      1000
  Entries :         2
  Hits    :         0
  Misses  :         0

从您在Windows上的目录路径,但您可以使用预处理器批处理脚本执行类似的操作。其他操作系统可能还需要不同的脚本才能达到同样的效果。