2015-11-04 75 views
1

我使用下面的假脫機腳本與Oracle SQL Developer 4.1SQL Developer的後臺:如何擺脫第一,空行

set echo off 
set feedback off 
set termout off 

spool A.txt 
select /*csv*/ * from A where rownum <= 1000; 
spool off 

spool B.txt 
select /*csv*/ * from B where rownum <= 1000; 
spool off 

... 

但假脫機輸出文件包含在開始一個空行。

這是sqlplus spooling: How to get rid of first, empty line?詳細說明了同樣的問題。我試着用SET NEWPAGE NONE但是,作爲SQL Developer的4.1.2,這不僅導致了錯誤信息,並在輸出格式中沒有變化:

SP2-0158: unknown SET option "newpage" 

有沒有辦法抑制這種第一,空行的輸出在SQL Developer中?

回答

2

兩件事情:

  1. 這是默認的SQL * Plus的行爲,這是我們試圖模仿100%儘可能
  2. 有一個錯誤 - 我們不支持SET PAGESIZE 0,如果你與SET TRIMSPOOL ON一起使用,你將失去空行(S)

我們知道了名單上的下一個版本

1

這似乎不可能;之前有人問過,但我沒有看到任何解決辦法。 (試用set sqlformat csv而不是/*csv*/提示,以防萬一,但行爲是相同的)。

如果導出從電網爲CSV的查詢結果(右鍵單擊網格,選擇導出...),那麼你沒有得到的空行,但是這顯然是腳本外的手工工藝,所以不真的相當。

選項似乎是後處理去除空行,從電網出口,或者使用SQL * Plus,而不是運行腳本文件。沒有一個看起來很理想。

+0

後處理可以。不幸的是,讓SQL * Plus輸出一個CSV文件似乎很難:http://stackoverflow.com/q/643137/238421。 –

1

由於thatjeffsmith好心指出,厚福這個錯誤在下一個版本中得到解決。在此之前,您可以使用SQLcl(SQLDeveloper 4.1.2中包含的現代SQL * Plus和SQLDeveloper 4.1.2使用的SQL * Plus)與SED腳本一起完成所需的結果。

SQLcl位於:$ SQLDEV_HOME \的SQLDeveloper \ BIN \ SQL。 $ SQLDEV_HOME只是您安裝的SQLDeveloper版本的目錄。

在您的例子,要生成兩個獨立的輸出文件,A.TXT和B.txt,從一個單一的SQL文件。我下面提出的方法將要求將其分解爲兩個單獨的SQL文件:A.sql和B.sql。

A.sql:

set echo off 
set feedback off 
set termout off 
select /*csv*/ * from A where rownum <= 1000; 

B.sql:

set echo off 
set feedback off 
set termout off 
select /*csv*/ * from B where rownum <= 1000; 

下面是我的一個名爲sed腳本的一個在線內容 「中刪除先空白line.sed」:

0,/^$/{//d} 

「0」定義以下命令塊只應用於第一行。

「/^$ /」定義了要匹配的正則表達式模式。 「^」是一行的開始,「$」是行標記的結尾,所以這種模式只匹配行,絕對沒有內容,沒有空格......沒有。如果要刪除可能包含空格(製表符,空格)的行,則可以嘗試以下SED命令:0,/^[[:space:]] * $/{// d}

「 // d「定義腳本將刪除找到的匹配模式。

有關此SED腳本的更多詳細信息,請參閱:https://unix.stackexchange.com/questions/75424/remove-only-the-first-blank-line-sed

因此,要從每個SQL文件(A.sql和B.sql)的輸出中刪除第一個空白行,它們必須分別使用SQLcl執行,然後必須通過以下SED腳本從SQLcl輸出輸出如下:

$SQLDEV_HOME\sqldeveloper\bin\sql -s scott/[email protected] @A.sql | sed -f remove-first-blank-line.sed > A.txt 
$SQLDEV_HOME\sqldeveloper\bin\sql -s scott/[email protected] @B.sql | sed -f remove-first-blank-line.sed > B.txt 

的「-s」是「沉默」選項SQLcl(SQL * Plus一樣),從而確保沒有數據庫的登錄信息輸出到cluttter你的輸出文件。

「|」字符管道通過給定的SED腳本從SQLcl輸出。

「>」將SED腳本的所有輸出寫入輸出文件「mysql.out」。如果您需要使用另一個SQL腳本將更多數據附加到同一文件,請使用「>>」,以便您可以將數據追加到文件而不是覆蓋文件。

注意:是的,你也可以直接使用命令行上的SED命令,但這往往需要在逃避,這取決於你的操作系統運行在不同方式的特殊字符。我發現當我將SED命令保存在名爲SED的簡短腳本文件中時,我更有可能在各種平臺(例如Linux和Windows)上重新使用我的SED腳本。