如何格式化 Oracle SQL 纯文本选择输出
Posted
技术标签:
【中文标题】如何格式化 Oracle SQL 纯文本选择输出【英文标题】:How to format Oracle SQL text-only select output 【发布时间】:2008-09-27 18:07:54 【问题描述】:我正在使用 Oracle SQL(在 SQLDeveloper 中,因此我无权访问 SQLPLUS 命令,例如 COLUMN)来执行如下所示的查询:
select assigner_staff_id as staff_id, active_flag, assign_date,
complete_date, mod_date
from work where assigner_staff_id = '2096';
它给我的结果看起来像这样:
STAFF_ID ACTIVE_FLAG ASSIGN_DATE COMPLETE_DATE MOD_DATE ---------------------- ------------ ----- -------- ------------------------- ----- -------- 2096 F 25-SEP-08 27-SEP-08 27-SEP-08 02.27.30.642959000 下午 2096 F 25-SEP-08 25-SEP-08 25-SEP-08 01.41.02.517321000 上午 已选择 2 行当我尝试将结果作为格式良好的快速-n-脏文本块粘贴到电子邮件或问题报告等中时,这可以很容易地生成非常宽且笨重的文本报告。什么是最好的方法当我只使用普通的 Oracle SQL 时,要摆脱输出列中的所有额外空白?到目前为止,我的所有网络搜索都没有出现太多,因为所有网络搜索结果都在向我展示如何使用 SQLPLUS 中的 COLUMN 等格式化命令(我没有)。
【问题讨论】:
【参考方案1】:在您的声明中,您可以指定要查找的输出类型:
select /*csv*/ col1, col2 from table;
select /*Delimited*/ col1, col2 from table;
还有其他可用的格式,例如 xml、html、text、loader 等。
您可以在工具 > 首选项 > 数据库 > 实用工具 > 导出下更改这些特定选项的格式
一定要选择 Run Script 而不是 Run Statement。
* 适用于 Oracle SQL Developer v3.2
【讨论】:
【参考方案2】:您使用什么来获得结果?您粘贴的输出看起来像是来自 SQL*PLUS。可能是您用来生成结果的任何工具都有一些修改输出的方法。
默认情况下,Oracle 根据标题的宽度或列数据的宽度输出列,其中更宽。
如果您想让列更小,您需要重命名它们或将它们转换为文本并使用 substr() 使默认值更小。
select substr(assigner_staff_id, 8) as staff_id,
active_flag as Flag,
to_char(assign_date, 'DD/MM/YY'),
to_char(complete_date, 'DD/MM/YY'),
mod_date
from work where assigner_staff_id = '2096';
【讨论】:
如前所述,我使用的是 Oracle SQLDeveloper(免费工具——我很便宜!)。它可能在幕后使用 SQLPLUS,但它不允许我使用 COLUMN 命令或大多数其他 SQLPLUS 命令。使用 substr(col, width) 是我所追求的——这有帮助!太好了!【参考方案3】:你可以用 sql 做什么受你的工具的限制。 SQL Plus 具有格式化列的命令,但它们并不易于使用。
一种快速的方法是将输出粘贴到 excel 中并在那里格式化,或者只是附加电子表格。有些工具会将输出直接保存为电子表格。
【讨论】:
好的,这是一个不错的选择。我刚刚检查了一下,SQL Developer 确实可以选择将结果导出为 CVS 或 XLS 文件。【参考方案4】:好问题。我真的不得不考虑一下。
您可以做的一件事是更改您的 SQL,使其只返回最窄的可用列。
例如(我对 oracle 语法不是很感兴趣,但类似的东西应该可以):
select substring( convert(varchar(4), assigner_staff_id), 1, 4 ) as id,
active_flag as act, -- use shorter column name
-- etc.
from work where assigner_staff_id = '2096';
这有意义吗? 如果您在 unix/linux 上执行此操作,我建议您从命令行运行它并通过 awk 脚本进行管道传输。
如果我有误会,请更新您的问题,我会再试一次:)
【讨论】:
我尝试将您的一部分答案粘贴到 SQLDeveloper 中,但 Oracle 似乎无法转换。我认为甲骨文的转换工作方式不同。不过,使用子字符串 (substr) 很有帮助。【参考方案5】:如果你没有返回很多行,我会经常使用Tom Kytes print_table 函数。
SQL> set serveroutput on
SQL> execute print_table('select * from all_objects where rownum < 3');
OWNER : SYS
OBJECT_NAME : /1005bd30_LnkdConstant
SUBOBJECT_NAME :
OBJECT_ID : 27574
DATA_OBJECT_ID :
OBJECT_TYPE : JAVA CLASS
CREATED : 22-may-2008 11:41:13
LAST_DDL_TIME : 22-may-2008 11:41:13
TIMESTAMP : 2008-05-22:11:41:13
STATUS : VALID
TEMPORARY : N
GENERATED : N
SECONDARY : N
-----------------
OWNER : SYS
OBJECT_NAME : /10076b23_OraCustomDatumClosur
SUBOBJECT_NAME :
OBJECT_ID : 22390
DATA_OBJECT_ID :
OBJECT_TYPE : JAVA CLASS
CREATED : 22-may-2008 11:38:34
LAST_DDL_TIME : 22-may-2008 11:38:34
TIMESTAMP : 2008-05-22:11:38:34
STATUS : VALID
TEMPORARY : N
GENERATED : N
SECONDARY : N
-----------------
PL/SQL procedure successfully completed.
SQL>
如果它有很多行,我会在 SQL Developer 中进行查询并保存为 xls,商务类型出于某种原因喜欢 excel。
【讨论】:
【参考方案6】:为什么不直接使用“cast”功能?
select
(cast(assigner_staff_id as VARCHAR2(4)) AS STAFF_ID,
(cast(active_flag as VARCHAR2(1))) AS A,
(cast(assign_date as VARCHAR2(10))) AS ASSIGN_DATE,
(cast(COMPLETE_date as VARCHAR2(10))) AS COMPLETE_DATE,
(cast(mod_date as VARCHAR2(10))) AS MOD_DATE
from work where assigner_staff_id = '2096';
【讨论】:
以上是关于如何格式化 Oracle SQL 纯文本选择输出的主要内容,如果未能解决你的问题,请参考以下文章