我正在使用以下假脱机脚本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中抑制第一个空行的输出?
答案 0 :(得分:2)
两件事:
我们已将其列入下一版本的列表
答案 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脚本。