(
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"的日志文件,其中就保存了出错的数据,有记事本打开看看那里出错,是否与外部表定义冲突。