SQL*Loader-805的解決
使用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
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- SQL物件名無效的解決SQL物件
- SQL Server查詢慢的解決方案SQLServer
- 談談SQL慢查詢的解決思路SQL
- 用SQL解決兩道有趣的題(二)SQL
- 用SQL解決兩道有趣的題(一)SQL
- SQL 難點解決:序列生成SQL
- sql多參問題解決SQL
- 使用with as優化sql解決filter優化SQLFilter
- SQL SERVER Msg 7391解決方法SQLServer
- 教你解決整理SQL Server輸入的資料SQLServer
- SQL ERROR 7311解決方法SQLError
- PL/SQL亂碼解決方案(日文)SQL
- 動態sql和利用動態sql解決資料字典的讀取SQL
- SQL Server 匯出Excel有換行的解決方法SQLServerExcel
- 解決sql中上下左右backspace不能用的方法SQL
- 利用sql語句解決簡單的數學題SQL
- 一個使用SQL語句解決的小問題SQL
- SQL Server和Oracle間的資料同步解決方案SQLServerOracle
- 解決SQL Server 2005中鎖的問題SQLServer
- SQL Server中 ldf 檔案過大的解決方法SQLServer
- 解決 SQL Server 耗盡記憶體的情況SQLServer記憶體
- 解決Sql Server警報的疑難問題(轉)SQLServer
- 解決一個.NET聯接SQL的問題 (轉)SQL
- 什麼是 Flink SQL 解決不了的問題?SQL
- 用SQL解決有向圖問題SQL
- SQL Server置疑資料庫解決方法SQLServer資料庫
- SQL SERVER Msg 7357錯誤解決SQLServer
- sql在不新增索引的前提下下的解決思路SQL索引
- SQL Server CPU 利用率毛刺的分析定位與解決SQLServer
- SQL Server 資料庫無法重新命名的解決SQLServer資料庫
- sql server資料庫附加錯誤的解決過程SQLServer資料庫
- 怎麼解決SQL server 2000的中文問題?SQLServer
- 解決SQL Server常見的七個經典問題SQLServer
- SQL Server裡附加資料庫出錯的解決方法SQLServer資料庫
- Spark SQL中出現 CROSS JOIN 問題解決SparkSQLROS
- SQL Server伺服器CPU爆高解決SQLServer伺服器
- 用SQL解決有向圖問題(轉)SQL
- Mybatis批量更新SQL報錯☞解決辦法MyBatisSQL