2015-11-04 78 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脚本。