SQL*Loader-805的解決

dbhelper發表於2014-11-26
使用sql*loader是大型專案中資料遷移的利器。如果是外部系統,其他資料庫到oracle的資料遷移,使用文字式檔案是最相容的方式。
sqlldr的載入效率是很高的,同時在oracle 10g以後推出的oracle_loader效率也不容小視。

sqlldr提供了額外的功能來生成external_table的建立和insert指令碼,不過control file是關鍵,今天嘗試的時候就出現了一些問題。

> sqlldr n1/n1 control=NAME_DATA_sqlldr.ctl external_table=generate_only
SQL*Loader: Release 11.2.0.2.0 - Production on Thu Jul 17 08:50:19 2014
Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.
SQL*Loader-805: CONTINUEIF not supported by External Table

這個問題在MOS上也沒有查到針對性的解決方案,就是提示不支援。

檢視control file的內容,如下:
> less NAME_DATA_sqlldr.ctl
LOAD DATA
CONTINUEIF LAST != "|"
INTO TABLE NAME_DATA
APPEND
FIELDS TERMINATED BY '__XXX__' OPTIONALLY ENCLOSED BY '"_"'
TRAILING NULLCOLS
(
   NAME_ID                          INTEGER EXTERNAL NULLIF (NAME_ID=BLANKS)
 , SYS_CREATION_DATE                DATE "MM/DD/YYYY HH24:MI:SS" NULLIF (SYS_CREATION_DATE=BLANKS)
。。。。。
現在的問題就是使用continueif導致了對於外部表不支援。

生成的資料檔案中,每行都是以|結尾
因為在oracle_loader中有records teminated by 的選項,可以嘗試先生成external table的指令碼,然後在指令碼中把“records teminated by newline" 修改為”records terminated by '|'" 
修改control file為如下的方式,就是刪除了continueif的語句
LOAD DATA
INTO TABLE NAME_DATA
APPEND
FIELDS TERMINATED BY '__DOX__' OPTIONALLY ENCLOSED BY '"_"'
TRAILING NULLCOLS
(
   NAME_ID                          INTEGER EXTERNAL NULLIF (NAME_ID=BLANKS)
。。。


然後在生成的日誌檔案中找到了如下的一段內容,簡單修改了表明
CREATE DIRECTORY statements needed for files
------------------------------------------------------------------------
CREATE DIRECTORY SYS_SQLLDR_XT_TMPDIR_00000 AS '/dbccbsPT1/oracle/NFTCUS1/export/MIG_SCRIPTS_TRUE/CM2_LOG'

CREATE TABLE statement for external table:
------------------------------------------------------------------------
CREATE TABLE NAME_DATA_EXT_TEST
(
  "NAME_ID" NUMBER(10),
 。。。。。
  "CONV_RUN_NO" NUMBER(3)
)
ORGANIZATION external 
(
  TYPE oracle_loader
  DEFAULT DIRECTORY SYS_SQLLDR_XT_TMPDIR_00000
  ACCESS PARAMETERS 
  (
    RECORDS DELIMITED BY NEWLINE 
    BADFILE 'SYS_SQLLDR_XT_TMPDIR_00000':'a.bad'
    LOGFILE 'a.log_xt'
    READSIZE 1048576

現在需要做的就是修改NEWLINE為 ’|’

然後嘗試建立。就沒有問題了。
SQL> select count(*)from name_data_ext_test;
  COUNT(*)
----------
      9355

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8494287/viewspace-1347095/,如需轉載,請註明出處,否則將追究法律責任。

相關文章