使用sqlldr匯入日期格式欄位的問題
有這麼一個資料,按照一分鐘統計資料的查詢數,欄位內容:
stat_date date, stat_num number(10)
stat_date表示統計日期,stat_num表示統計數目
資料如下:
2009-03-04 15:40:00, 4454
2009-03-04 15:41:00, 3360
2009-03-04 15:42:00, 7543
現要將這些資料匯入到資料庫的w_ldap_stat表中,我首先想到了用
awk將資料組裝成SQL語句。即每條記錄一個insert語句插入到資料庫
中。以前也做過類似的指令碼。但是感覺這樣比較繁瑣,而且也沒有必
要,因為Oracle已經為我們提供了一個現成的工具:sqlldr。
使用這個工具,我們就不用將每行記錄都組裝成insert語句來插入了。
使用sqlldr載入資料,首先需要建立一個控制檔案,用於對要匯入的數
據進行針對性的配置:
------------------------------ldapload.ctl----------------------------
load data
infile '20090417.dat' --指定要匯入的檔名
--insert --插入資料,要求源資料表為空
append --擴充套件資料,在原表基礎上增加資料
--replace --替換資料,刪除原有資料,再插入新資料
into table w_ldap_stat --指定表名
fields terminated by ',' --指定欄位分隔符
(stat_date, stat_num) --指定匯入對應的欄位
使用sqlldr進行匯入:
sqlldr control=ldapload.ctl
結果匯入情況如下:
Number to load: ALL
Number to skip: 0
Errors allowed: 50
Bind array: 64 rows, maximum of 256000 bytes
Continuation: none specified
Path used: Conventional
Table W_LDAP_STAT, loaded from every logical record.
Insert option in effect for this table: APPEND
Column Name Position Len Term Encl Datatype
------------------------------ ---------- ----- ---- ---- ---------------------
STAT_DATE FIRST * , O(") CHARACTER
STAT_NUM NEXT * , O(") CHARACTER
Data File 30.dat -
Record 1: Rejected - Error on table W_LDAP_STAT, column STAT_NUM.
Column not found before end of logical record (use TRAILING NULLCOLS)
Record 2: Rejected - Error on table W_LDAP_STAT, column STAT_NUM.
Column not found before end of logical record (use TRAILING NULLCOLS)
Record 3: Rejected - Error on table W_LDAP_STAT, column STAT_NUM.
Column not found before end of logical record (use TRAILING NULLCOLS)
...
Record 7: Rejected - Error on table W_LDAP_STAT, column STAT_DATE.
ORA-01861: literal does not match format string
Record 8: Rejected - Error on table W_LDAP_STAT, column STAT_DATE.
ORA-01861: literal does not match format string
MAXIMUM ERROR COUNT EXCEEDED - Above statistics reflect partial run.
....
Table W_LDAP_STAT:
0 Rows successfully loaded.
51 Rows not loaded due to data errors.
0 Rows not loaded because all WHEN clauses were failed.
0 Rows not loaded because all fields were null.
從日誌中可以看到,出現了兩個錯誤。
一個是stat_num欄位有插入空資料的情況,這個的確是不需要的資料,可以排除。
一個是stat_date欄位出現了ORA-01861錯誤,日期格式不匹配。這個是為什麼呢?
難道是在源資料中還要轉成日期格式?如下:
to_date('2009-03-04 15:40:00','yyyy-mm-dd hh24:mi:ss'), 4454
to_date('2009-03-04 15:41:00','yyyy-mm-dd hh24:mi:ss'), 3360
to_date('2009-03-04 15:42:00','yyyy-mm-dd hh24:mi:ss'), 7543
再次匯入出現如下錯誤:
Record 1: Rejected - Error on table W_LDAP_STAT, column STAT_DATE.
ORA-01858: a non-numeric character was found where a numeric was expected
Record 2: Rejected - Error on table W_LDAP_STAT, column STAT_DATE.
ORA-01858: a non-numeric character was found where a numeric was expected
Record 3: Rejected - Error on table W_LDAP_STAT, column STAT_DATE.
ORA-01858: a non-numeric character was found where a numeric was expected
奇怪了,是什麼原因呢?難道是因為空格將日期和時間分開的緣故?
於是嘗試增加
optionally enclosed by '"'
用以把對應的欄位給引起來,表示這是一個欄位的內容
"2009-03-04 15:40:00", 4454
"2009-03-04 15:41:00", 3360
"2009-03-04 15:42:00", 7543
但匯入還是失敗。難道是我比較笨,不能理解sqlldr的功能?
找找網上看,看有沒有跟我一樣笨的。結果不搜不知道一搜一大堆。
看來這個不是個別問題啊,是普遍存在的,老外也有不少遇到的。
最後看到一個解決方法,就是在控制檔案中,對匯入的日期的欄位進行格式化:
stat_date timestamp 'yyyy-mm-dd hh24:mi:ss'
即如下:
--------------------------------ldapload.ctl-------------------------------
load data
infile 'test.dat'
--infile '29.dat'
--insert
append
into table w_ldap_stat
fields terminated by ','
optionally enclosed by '"'
(stat_date timestamp "yyyy-mm-dd hh24:mi:ss", stat_num)
這樣匯入就完全正常了。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12932950/viewspace-590740/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- sqlldr匯入日期函式SQL函式
- 使用plsql 匯出欄位為json 格式SQLJSON
- MySql 查詢某一天日期格式欄位走索引問題MySql索引
- 關於MySQL中使用LOAD DATA INFILE匯入csv檔案時的日期格式問題MySql
- 根據時間欄位匯入資料的問題總結
- 【匯入匯出】sqlldr 匯入案例SQL
- impdp匯入包含xmltype型別欄位空表報錯問題XML型別
- oracle sqlldr匯入OracleSQL
- 使用sqlldr匯入文字資料到oracleSQLOracle
- impdp匯入XMLTYPE欄位型別的資料出現亂碼的問題XML型別
- 使用oracle sqlldr匯入文字資料的例子OracleSQL
- sqlldr載入效能問題的排查SQL
- win7 中 IIS 7 now() 等時間日期函式返回格式問題(不匹配 ACCESS 的 datetime 欄位的格式)Win7函式
- 資料匯入SQLLDRSQL
- 【實驗】【SQL*Loader】使用SQLLDR將資料載入到CLOB欄位SQL
- sqlldr的問題SQL
- SQLLDR——CTL檔案:欄位設定SQL
- 關於oracle中blob欄位的錄入問題Oracle
- 【SQL*Loader】sqlldr匯入SQL
- 透過sqlldr匯入到sys使用者SQL
- 通過sqlldr匯入到sys使用者SQL
- 關於9i匯入資料到10g時候欄位大小的問題
- ElementUI日期元件格式化問題UI元件
- 使用element ui 日期選擇器獲取值後的格式問題UI
- MySQL 大欄位問題MySql
- [20140426]使用sqlldr匯入.txtSQL
- 【匯入匯出】sqlldr 匯入含有內嵌換行符的資料SQL
- sqlldr 匯入資料範例SQL
- GridView繫結欄位格式DataFormatString的使用ViewORM
- sqlldr批量匯入匯出資料測試SQL
- sqlldr批次匯入匯出資料測試SQL
- 測試TOM=SQLLDR載入日期資料SQL
- jQuery 匯入庫和使用格式jQuery
- oracle資料庫使用sqlldr命令匯入txt資料Oracle資料庫SQL
- 資料庫欄位問題資料庫
- sqlldr匯入資料中文亂碼SQL
- 通過SQLLDR匯入LOB資料SQL
- Dbeaver 匯出Excel 格式變化的問題Excel