關於導出
原理
通過sqlplus的的報表功能生成文本文件,但產生的文本文件因分析原因存在空行現象(只有回車沒有其它),可以通過第三方方式處理一下生成標准文本
A 學習過程
1 建表
SQL>CREATE TABLE TESTINOUT(ID NUMBER(10), USERNAME VARCHAR2(10), DATE1 DATE, MONEY NUMBER(6, 2));
2 添加數據
SQL>insert into TESTINOUT(id,username,date1,money) values(1,'will',to_date('29-12-2001','dd-mm-yyyy'),33.33)
SQL>insert into TESTINOUT(id,username,date1,money) values(2,'ddxxkk',to_date('29-12-2002','dd-mm-yyyy'),443.33)
SQL>insert into TESTINOUT(id,username,date1,money) values(1234567890,'thisistest',to_date('29-12-2002','dd-mm-yyyy'),4443.33)
3 設定列間距為'(沒有空格)
SQL> set colsep '
4
SQL>column id format a10 truncate
SQL>column money format a6 truncate
SQL> select to_char(id,'0000000009S') as id,username,to_char(date1,'yyyymmdd') as date1,to_char(money*100,'000000s') as money from testinout;
ID USERNAME DATE1 MONEY
----------------------------------
0000000001test 20011229003333
0000000002ddxxkk 20021229055500
1234567890thisistest20021229444333
B
測試過程
1編寫腳本
testinout.sql的內容如下
set colsep '
set trimspool on
set linesize 120
set pagesize 2000
set newpage 1
set heading off
set term off
column money format a6 truncate
column id format a10 truncate
spool d:\iii
select to_char(id,'0000000009S') as id,username,to_char(date1,'yyyymmdd') as date1,to_char(money*100,'000000s') as money from testinout;
spool off
exit;
2 執行腳本
sqlplus user1/user1@my8i @d:\testinout.sql
或
sqlplus user1/user1 @d:\testinout.sql>d:\t
3 d:\iii.lst的內容如下
0000000001test 20011229003333
0000000002ddxxkk 20021229055500
1234567890thisistest20021229444333
1234567890thisi漢字t20021229444333
4
完整的一次運行生的iii.lst的腳本 i.sql
CREATE TABLE TESTINOUT(ID NUMBER(10), USERNAME VARCHAR2(10), DATE1 DATE, MONEY NUMBER(6, 2));
insert into TESTINOUT(id,username,date1,money) values(1,'test',to_date('29-12-2001','dd-mm-yyyy'),33.33);
insert into TESTINOUT(id,username,date1,money) values(2,'ddxxkk',to_date('29-12-2002','dd-mm-yyyy'),443.33);
insert into TESTINOUT(id,username,date1,money) values(1234567890,'thisistest',to_date('29-12-2002','dd-mm-yyyy'),4443.33);
set colsep '
set trimspool on
set linesize 120
set pagesize 2000
set newpage 1
set heading off
set term off
column money format a6 truncate
column id format a10 truncate
spool d:\iii
select to_char(id,'0000000009S') as id,username,to_char(date1,'yyyymmdd') as date1,to_char(money*100,'000000s') as money from testinout;
spool off
執行
D:\>sqlplus user1/user1@my8i @i.sql
C
相關命令:
設定列間字符
set colsep '字符'
spool寫入文件前時是否將輸出的尾隨空格刪除
set trimspool on/off
指定一個報告行的寬度(字符數。一個漢字占2位),linesize選項范圍(自1至32767)
set linesize 行寬
指定一頁中的行數,默認為24行 pagesize選項范圍(自0至50000)
set pagesize 頁行數
控制列標題打印;默認為ON
set heading on/off
也就是說第4步中的如下信息是否顯示
ID USERNAME DATE1 MONEY
----------------------------------
新頁前空行數,如果等於0,新頁第1個字符前出現換行符
set newpage 行數
輸入內容到文件
spool off/文件名
控制SQL * PLUS 是否顯示在屏幕上,默認為ON,設為OFF,則表示直接從腳本中執行
set term off
關於導入
原理
通過SQL * Loader(sqlldr) 將文本類型件導入到數據表,
sqlldr通過控制文件(control='文件名') 進行相應工作
文本文件有兩個格式
定長記錄,每行記錄長度固定)
test 1234 33.44
ddxxkk 1211 123.00
變長記錄,通過特定的分界符進行分隔(下例用逗號為分界符)
test,1234,33.44
ddxxkk,1211,123.00
對於空行系統自行跳過
測試
1 編寫腳本d:\in.clt
load Data
Infile 'd:\iii.lst'
append
into table testinout
(id position(01:10) integer external,
username position(11:20) char,
date1 position(21:28) date 'yyyymmdd',
money position(29:34) ZONED(6,2)
)
2 執行腳本
D:\>sqlldr user1/user1@my8i control='d:\in.ctl'
3 分析結果
程序自生成日志 d:\in.log ,可以通過sqlldr參數指定 log='文件名'
程序自生壞數據文件 d:\iii.bad 可以通過sqlldr參數指定 bad='文件名'