问题描述
我目前在 PL/sql Developer 的命令行窗口中运行的代码:
SET MARKUP CSV ON DELIMITER | QUOTE OFF
SET FeedBACK OFF
SPOOL C:\Users\Desktop\SpoolTest.csv
select *
from vendor_data t
where rownum < 20
;
SPOOL OFF;
我的输出:
222339 |067 |001
306811 |045 |001
024253 |067 |001
我需要删除尾随空格:
222339|067|001
306811|045|001
024253|067|001
我遇到了无法设置标记的问题。我必须在 PL/sql Developer 的命令窗口中运行我的假脱机。有没有办法做到这一点?这是一段代码,实际上很长。
解决方法
SET
命令属于 Oracle 的命令行工具 SQL*Plus。
我不使用 PL/SQL Developer(而且 Google 很快没有返回任何有用的东西),所以 - PL/SQL Developer 是否支持 SET
命令?如果没有,那么您就不走运了,但是您可以安装 Oracle Client(如果您还没有安装)并直接在 SQL*Plus 中运行您的脚本。
另一方面,除非我错了,SET MARKUP CSV
对 Oracle 18c 及以上版本有效;在较低版本中,您可以使用 SET MARKUP HTML
(即没有 CSV
选项)。
PL/SQL Developer 的命令行工具是与 Oracle SQL*Plus
命令行实用程序不同的产品,它具有一组不同的受支持命令。 PL/SQL Developer 的命令行模拟了真正的 SQL*Plus 功能,但只是部分实现。例如,它不支持 SET MARKUP CSV
命令。您可以在 PL/SQL 开发人员手册(帮助 -> 用户指南)中找到受支持命令的完整列表。
在您的情况下,出现尾随空格是因为您正在打印列标题。显然,PL/SQL Developer 尝试按列的最大长度对齐行:
spool file.txt
select ao.object_name,ao.object_id,ao.created,ao.status
from all_objects ao
where rownum <= 3;
OBJECT_NAME OBJECT_ID CREATED STATUS
-------------------------------------------------------------------------------- ---------- ----------- -------
TS$ 16 26.01.2017 VALID
ICOL$ 20 26.01.2017 VALID
请记住,PL/SQL Developer 对 SET 命令的支持非常有限,我们可以通过简单地不打印标题并将 colwidth 设置为 1 来实现类似 CSV 的假脱机:
spool file.txt
set colsep |
set heading off
set colwidth 1
select ao.object_name,ao.status
from all_objects ao
where rownum <= 3;
spool off
将其保存到假脱机文件中:
TS$|16|26.01.2017 13:52:45|VALID
ICOL$|20|26.01.2017 13:52:45|VALID
C_FILE#_BLOCK#|8|26.01.2017 13:52:45|VALID
如果你必须打印标题,你可以在主 sql 之前添加一个额外的 select from dual 来打印标题。