SQL Developer假脱机:如何摆脱第一个空行

时间:2015-11-04 11:56:09

标签: sql oracle output oracle-sqldeveloper flat-file

我正在使用以下假脱机脚本Oracle SQL Developer 4.1

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中抑制第一个空行的输出?

3 个答案:

答案 0 :(得分:2)

两件事:

  1. 这是默认的SQL * Plus行为,我们尝试尽可能地模拟100%
  2. 有一个错误 - 我们不支持SET PAGESIZE 0.如果你将它与SET TRIMSPOOL一起使用,你将丢失空白行
  3. 我们已将其列入下一版本的列表

答案 1 :(得分:1)

这似乎不可能;之前有人问过,但我没有看到任何解决方案。 (尝试使用set sqlformat csv而不是/*csv*/提示,以防万一,但行为是相同的。)

如果您将网格中的查询结果导出为CSV(右键单击网格并选择导出...),那么您不会得到空行,但这显然是脚本之外的手动过程,所以不是真的等效。

选项似乎是对文件进行后处理以删除空行,从网格导出或使用SQL * Plus运行脚本。这些都不是理想的。

答案 2 :(得分:1)

正如杰夫史密斯所说,希望这个错误在下一个版本中得到修复。在此之前,您可以使用SQLcl(SQLDeveloper 4.1.2中包含和使用的现代SQL * Plus)以及SED脚本来完成所需的结果。

SQLcl位于:$ SQLDEV_HOME \ sqldeveloper \ bin \ sql。 $ SQLDEV_HOME只是已安装的SQLDeveloper版本的目录。

在您的示例中,您将从单个SQL文件生成两个单独的输出文件A.txt和B.txt。我提出的以下方法将要求将其分解为两个单独的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脚本的一行内容名为“remove-first-blank-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/tiger@XE @A.sql | sed -f remove-first-blank-line.sed > A.txt
$SQLDEV_HOME\sqldeveloper\bin\sql -s scott/tiger@XE @B.sql | sed -f remove-first-blank-line.sed > B.txt

“-s”是SQLcl的“静默”选项(如SQL * Plus),它确保没有数据库登录信息输出来阻止输出文件。

“|”字符管道通过给定的SED脚本从SQLcl输出所有输出。

“&gt;”将SED脚本的所有输出写入输出文件“mysql.out”。如果需要使用其他SQL脚本将更多数据附加到同一文件,请使用“&gt;&gt;”这样您就可以将数据附加到文件而不是覆盖文件。

注意:是的,您也可以直接在命令行上使用SED命令,但这通常需要以不同的方式转义特殊字符,具体取决于您运行的操作系统。我发现当我将SED命令保存在名称很短的SED脚本文件中时,我更有可能在各种平台(例如Linux和Windows)上重用我的SED脚本。