oracle的spool導出查詢數據到txt腳本

之前用過spool導出oracle數據爲文本,可惜一直也沒有整理下,今天再次用到,網上找了相關文檔,也算作個記錄。

 

第一部分(實例,主要分兩步),第二部分(參數小總結),第三部分(完全參數總結) 

第一部分 
第一步 :這是我的導出數據的腳本call.sql
conn scott/tiger
set echo off
set term off
set line 1000 pages 0
set feedback off
set heading off
set trimspool on 
spool /temp/test/ldr_test.csv
select a.empno||',"'||a.ename||'",'||to_char(a.hiredate,'yyyy-mm-dd hh24:mi:ss')||','||a.sal from test a; 
spool off
set trimspool off
set heading on
set feedback on
set term on
set echo on
exit

註釋:call.sql腳本執行方法 (1)sqlplus /nolog 先進入sqlplus命令模式
                                         (2)start call.sql  sqlplus命令模式下執行

第二步 :導入數據的腳本add_test.ctl
LOAD DATA
INFILE ldr_test.csv
TRUNCATE INTO TABLE test
FIELDS TERMINATED BY","  OPTIONALLY ENCLOSED BY'"'
(EMPNO,ENAME,HIREDATE date 'yyyy-mm-dd hh24:mi:ss',SAL)

註釋在第一步導出數據後,執行add_test.sql腳本命令爲: sqlplus scott/tiger control=add_test.ctl

至此用sqlplus導入/出數據完成了,如果有些參數不明白,請看一下第二三部分。
..忘了說test測試表的結構了,create table test as select empno,ename,hiredate,sal from emp; 
            
第二部分 
spool本身其實沒有啥難的 ,就是set參數的個數太太多啦!!!下面就是我網上Copy的,當然有一些是自己加上去的
SQL>set colsep' '; //-域輸出分隔符

SQL>set newp none  //設置查詢出來的數據分多少頁顯示,如果需要連續的數據,中間不要出現空行就把newp設置爲none,這樣輸出的數據行都是連續的,中間沒有空行之類的

SQL>set echo off; //顯示start啓動的腳本中的每個sql命令,缺省爲on

SQL> set echo on               //設置運行命令是是否顯示語句

SQL> set feedback on;       //設置顯示已選擇XX

SQL>set feedback off;      //回顯本次sql命令處理的記錄條數,缺省爲on即去掉最後的 "已經選擇10000"

SQL>set heading off;    //輸出域標題,缺省爲on 設置爲off就去掉了select結果的字段名,只顯示數據

SQL>set headsep off  //標題分隔符

SQL>set pagesize 0;     //輸出每頁行數,缺省爲24,爲了避免分頁,可設定爲0。(可以簡寫爲:set pages 0

SQL>set linesize 80;     //輸出一行字符個數,缺省爲80。(可以簡寫爲:set line 80

SQL>set numwidth 12;     //輸出number類型域長度,缺省爲10

SQL>set termout/term off;    //顯示腳本中的命令的執行結果,缺省爲on

SQL>set trimout on; //去除標準輸出每行的拖尾空格,缺省爲off

SQL>set trimspool on; //去除重定向(spool)輸出每行的拖尾空格,缺省爲off

SQL>set serveroutput on;  //設置允許顯示輸出類似dbms_output

SQL> set timing on;          //設置顯示已用時間:XXXX”

SQL> set autotrace on-;    //設置允許對執行的sql進行分析

SQL>set verify off                     //可以關閉和打開提示確認信息old 1new 1的顯示



第三部分 
這個是純Copyset命令全家福 ,呵呵,很專業,如果看不習慣的話可以全部改成小寫
使用set命令的語法如下: SET 系統變量  
其中系統變量及其可選值如下:
  ARRAY[SIZE]          {20(默認值)|n}
  AUTO[COMMIT]         {OFF(默認值)|ON|IMM[EDIATE]}
  BLO[CKTERMINATOR]    {.(默認值)|C}
  CMDS[EP]             {;|C|OFF(默認值)|ON}
  COM[PATIBILITY]      {V5|V6|V7|NATIVE(默認值)}
  CON[CAT]             {.(默認值)|C|OFF|ON(默認值)}
  COPYC[OMMIT]         {0(默認值)|n}
  CRT crt              
  DEF[INE]             {&|C|OFF|ON(默認值)}
  ECHO                 {OFF|ON}
  EMBEDDED             {OFF(默認值)|ON}
  ESC[APE]             {\(默認值)|C|OFF(默認值)|ON}
  FEED[BACK]           {6(默認值)|n|OFF|ON}
  FLU[SH]              {OFF|ON(默認值)}
  HEA[DING]            {OFF|ON(默認值)}
  HEADS[EP]            {|(默認值)|C|OFF|ON(默認值)}
  LIN[ESIZE]           {80(默認值)|n}
  LONG                 {80(默認值)|n}
  LONGC[HUNKSIZE]      {80(默認值)|n}
  MAXD[ATA]            n
  NEWP[AGE]            {1(默認值)|n}
  NULL text
  NUMF[ORMAT]          格式
  NUM[WIDTH]           {10(默認值)|n}
  PAGES[IZE]           {14(默認值)|n}
  PAU[SE]              {OFF(默認值)|ON|text}
  RECSEP               {WR[APPED](默認值)|EA[CH]|OFF}
  RECSEPCHAR           { |C}
  SCAN                 {OFF|ON(默認值)}
  SERVEROUT[PUT]       {OFF|ON} [SIZE n]
  SHOW[MODE]           {OFF(默認值)|ON}
  SPA[CE]              {1(默認值)|n}
  SQLC[ASE]            {MIX[ED](默認值)|LO[WER]|UP[PER]}
  SQLCO[NTINUE]        {>;(默認值)|文本}
  SQLN[UMBER]          {OFF|ON(默認值)}
  SQLPER[FIX]          {#(默認值)|C}
  SQLP[ROMPT]          {SQL>;(默認值)|文本}
  SQLT[ERMINATOR]      {;(默認值)|C|OFF|ON(默認值)}
  SUF[FIX]             {SQL(默認值)|文本}
  TAB                  {OFF|ON(默認值)}
  TERM[OUT]            {OFF|ON(默認值)}
  TI[ME]               {OFF(默認值)|ON}
  TIMI[NG]             {OFF(默認值)|ON}
  TRIM[OUT]            {OFF|ON(默認值)}
  UND[ERLINE]          {-(默認值)|C|OFF|ON(默認值)}
  VER[IFY]             {OFF|ON(默認值)}
  WRA[P]               {OFF|ON(默認值)}

系統變量說明:
  ARRAY[SIZE] {20(默認值)|n} 置一批的行數,SQL*PLUS一次從數據庫獲取的行數,有效值爲15000. 大的值可提高查詢和子查詢的有效性,可獲取許多行,但也需要更多的內存.當超過1000,其效果不大.

  AUTO[COMMIT] {OFF(默認值)|ON|IMM[EDIATE]} 控制ORACLE對數據庫的修改的提交ON,ORACLE執行每個SQL命令或PL/SQL塊後對數據庫提交修改;OFF時則制止自動提交,需要手工地提交修改,例如用SQL的 COMMIT命令. IMMEDIATE功能同ON.

  BLO[CKTERMINATOR] {.(默認值)|C} 置非字母數字字符,用於結束PL/SQL.要執行塊時,必須發出RUN命令或/命令.

  CMDS[EP] {;|C|OFF(默認值)|ON} 置非字母數字字符,用於分隔在一行中輸入的多個SQL/PLUS命令.ONOFF控制在一行中是否能輸入多個命令. ON時將自動地將命令分隔符設爲分號(;).其中C表示所置字符.

  COM[PATIBILITY] {V5|V6|V7|NATIVE(默認值)} 指定當前所鏈接的ORACLE版本.如果當前ORACLE的版本爲5,則置COMPATIBILITYV5; 爲版本6時置成V6; 爲版本7時置成V7. 如果希望由數據庫決定該設置,在置成NATIVE.

  CON[CAT] {.(默認值)|C|OFF|ON(默認值)}設置結束一替換變量引用的字符.在中止替換變量引用字符之後可跟所有字符,作爲體會組成部分,否則 SQL*PLUS將解釋爲替換變量名的一部分.CONCAT開關爲ON,SQL*PLUS可重置CONCAT的值爲點(.).

  COPYC[OMMIT] {0(默認值)|n} 控制COPY命令提交對數據庫修改的批數.每次拷貝n批後,將提交到目標數據庫.有效值爲05000. 可用變量ARRAYSIZE設置一批的大小.如果置COPYCOMMIT0,則僅在COPY操作結束時執行一次提交.

  CRT crt  改變SQL*PLUS RUNFORM命令使用的缺省CRT文件.如果置CRT不包含什麼,crt僅包含''''.如果在一個Form的系統調用期間,要使用NEW.CRT(缺省CRTOLD.CRT),可按下列形式調用Form:
    SQL>;RUNFORM -C NEW form
    或者
    SQL>;SET CRT NEW
    SQL>;RUNFORM form
第二中方法存儲CRT選擇,以致在下次運行RUNFORM命令(是在同一次SQL*PLUS交互中),不需要指定.

  DEF[INE] {&|C|OFF|ON(默認值)} 設置在替換變量時所使用的字符.ONOFF控制SQL*PLUS是否掃描替換變量的命令及用他們的值代替. DEFINEONOFF的設置控制SCAN變量的設置.

  ECHO {OFF|ON} 控制START命令是否列出命令文件中的每一命令.ON,列出命令;OFF,制止列清單.

  EMBEDDED {OFF(默認值)|ON} 控制每一報表在一頁中開始的地方OFF,迫使每一報表是在新頁的頂部開始;ON,運行一報表在一頁的任何位置開始.

  ESC[APE] {\(默認值)|C|OFF(默認值)|ON} 定義作爲Escape字符的字符.OFF,使Escape字符不起作用.ON,使Escape字符起作用.

  FEED[BACK] {6(默認值)|n|OFF|ON} 顯示由查詢返回的記錄數.ONOFF置顯示爲開或關.FEEDBACKON,等價於置n1. 如果置FEEDBACK0,等價於將它置成OFF.

  FLU[SH] {OFF|ON(默認值)} 控制輸出送至用戶的顯示設備.OFF,運行操作系統做緩衝區輸出;ON,不允許緩衝僅當非交互方式運行命令文件時使用OFF,這樣可減少程序I/O總是,從而改進性能.

  HEA[DING] {OFF|ON(默認值)} 控制報表中列標題的打印.ON,在報表中打印列標題;OFF時禁止打印列標題.

  HEADS[EP] {|(默認值)|C|OFF|ON(默認值)} 定義標題分隔字符.可在COLUMN命令中使用標題分隔符,將列標題分成多行.ONOFF將標題分隔置成開或關.當標題分隔爲關(OFF),SQL*PLUS打印標題分隔符像任何字符一樣.

  LIN[ESIZE] {80(默認值)|n} SQL*PLUS在一行中顯示的字符總數,它還控制在TTITLEBTITLE中對準中心的文本和右對齊文本可定義LINESIZE1至最大值,其最大值依賴於操作系統.

  LONG {80(默認值)|n} 爲顯示和拷貝LONG類型值的最大寬度的設置對於ORACLE7, n的最大值爲2G字節;對於版本6,最大值爲32767.

  LONGC[HUNKSIZE] {80(默認值)|n} SQL*PLUS檢索LONG類型值的增量大小.由於內存的限制,可按增量檢索,該變量僅應用於ORACLE7.

  MAXD[ATA] n  SQL*PLUS可處理的最大行寬字符數,其缺省值和最大值在不同操作系統中是可變的.

  NEWP[AGE] {1(默認值)|n} 置每一頁的頭和頂部標題之間要打印的空行數.如果爲0, 在頁之間送一換號符,並在許多終端上清屏.

  NULL text 設置表示空值(null)的文本,如果NULL沒有文本,則顯示空格(缺省時). 使用COLUMN命令中的NULL子句可控制NULL變量對該列的設置.

  NUMF[ORMAT] 格式  設置顯示數值的缺省格式,該格式是數值格式.

  NUM[WIDTH] {10(默認值)|n} 對顯示數值設置缺省寬度.

  PAGES[IZE] {14(默認值)|n} 置從頂部標題至頁結束之間的行數.11英寸長的紙上打印報表,其值爲54,上下各留一英寸(NEWPAGE值爲6).

  PAU[SE] {OFF(默認值)|ON|text} 在顯示報表時,控制終端滾動.在每一暫停時,必須按RETURN.ON將引起SQL*PLUS在每一報表輸出頁開始時暫停.所指定的文本是每一次 SQL*PLUS暫停時顯示的文本.如果要鍵入多個詞,必須用單引號將文本括起來.

  RECSEP {WR[APPED](默認值)|EA[CH]|OFF}
  RECSEPCHAR { |C}  指定顯示或打印記錄分行符的條件.一個記錄分行符,是由RECSEPCHAR指定的字符組成的單行.空格爲RECSEPCHAR的默認字符.
  RECSEP 告訴SQL*PLUS在哪兒做記錄分隔.例如將RECSEP置成WRAPPED,在每一纏繞行之後,打印記錄分行符.如果將RECSEP置成 EACH,SQL*PLUS在每一行後打印一記錄分行符.如果將RECSEP置成OFF, SQL*PLUS不打印分行符.  

來源:http://blog.csdn.net/mousever/article/details/7962202




個人實例

#! /bin/ksh
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
sqlplus chnlmgr/chnlmgr@chnldb<<!
set pagesize 0;
set long 90000;
set feedback off;
set echo off;
spool spool_album_song.txt;

select trim(B.ALBUM_ID)||','||trim(A.ALBUM_NAME)||','||trim(B.nums) from CH_T_ALBUM_INFO A inner join (select ALBUM_ID ,count(*) as nums from CH_T_SONG_ALBUM_INFO group by ALBUM_ID having count(*)>20) B on A.ALBUM_ID=B.ALBUM_ID;

exit ;
!
echo "`date` END"



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章