zoukankan      html  css  js  c++  java
  • Oracle创建外部表

    CREATE TABLE Extnl_Table

       (

            Col01 varchar2(100),

            Col02 Number,

            ......

       )
       ORGANIZATION EXTERNAL
        ( TYPE ORACLE_LOADER
          DEFAULT DIRECTORY "XXX"
          ACCESS PARAMETERS
          ( RECORDS DELIMITED BY 0X'0A' SKIP 1 fields terminated by ',' enclosed by '"' LRTRIM MISSING FIELD VALUES ARE NULL REJECT ROWS WITH ALL NULL FIELDS
        )
          LOCATION
           ( "CJ_DIR":'data.txt'
           )
        )

      ;

    外部表的定义关键是Oracle Loader参数,Records关键字后定义如果识别数据行,Fields关键字后定义如果识别字段,常用的如下:

     Records:

           DELIMITED BY 'XXX' —— 换行符,常用newline定义换行,如果文件中使用了特别的字符就要另外定义了;如果是特殊符号,可以使用OX'十六位值',例如tab(\t)的十六位是9,那么就是DELIMITED BY 0X'09';cr(\r)的十六位是d,那么就是DELIMITED BY 0X'0D'。

           SKIP X —— 跳过X行数据,有些文件中第一行是列名,需要跳过第一行,则使用SKIP 1。

    Fields:

           TERMINATED BY 'x' —— 字段分割符。

           ENCLOSED BY 'x' —— 字段引用符,包含在此符号内的数据都当成一个字段。例如一行数据格式如:"abc","a""b,""c,"。使用参数TERMINATED BY ',' ENCLOSED BY '"'后,系统会读到两个字段,第一个字段的值是abc,第二个字段值是a"b,"c,。

           LRTRIM —— 删除空白字符。

           MISSING FIELD VALUES ARE NULL —— 空缺值都设为Null。


    如果外部表文件的字段长度和分割符不确定,可以打开文件看看。但是如果文件非常大,比如用十几G,用UltraEdit之类的工具打开也许会等十几个小时。那么可以使用分割文件的工具将文件切割成1M左右的小文件,再用记事本打开,复制几行数据出来作测试用。

    读取外部表时最常见的问题就是报Buffer不足了,如果增大Read Size还不能解决问题,可能就是断行错误,也许是换行符不对。因为有些换行符在记事本中看不出来,比如说Windows的换行符是\n\r,而Mac等系统中是Line Feed(LF, 0x0A)。如果在Windows中打开带LF的文件,记事本中显示的是一个黑色的方块,而写字板中是能够显示正确的换行。所以最好使用UltraEdit打开,直接看16进制代码,使用DELIMITED BY 0X'xx'断行。

    还有可能在从外部表读取数据时,读取前面的数据没问题,读到一定的行数就报错。这可能是某行数据出问题导致。只是可以在外部文件目录下发现文件名带有"BAD"的日志文件,其中就保存了出错的数据,有记事本打开看看那里出错,是否与外部表定义冲突。

  • 相关阅读:
    Tomcat日志、项目中的log4j日志、e.printStackTrace()——我的日志最后到底跑哪去了?
    MySQL中有关TIMESTAMP和DATETIME的总结
    org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)
    @RequestBody和@RequestParam区别
    Synchronized的jvm实现
    星空雅梦
    星空雅梦
    星空雅梦
    星空雅梦
    星空雅梦
  • 原文地址:https://www.cnblogs.com/esestt/p/1277064.html
Copyright © 2011-2022 走看看