如何格式化Oracle SQL纯文本选择输出

时间:2008-09-27 18:07:54

标签: sql oracle formatting

我正在使用Oracle SQL(在SQLDeveloper中,因此我无法访问诸如COLUMN之类的SQLPLUS命令)来执行如下所示的查询:

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 PM 
2096                   F           25-SEP-08                 25-SEP-08                 25-SEP-08 01.41.02.517321000 AM 

2 rows selected

当我尝试将结果粘贴为电子邮件或问题报告中的格式很好的快速文本块等时,这很容易产生非常宽泛且笨拙的文本报告。最好的方法是什么?当我使用普通的Oracle SQL时,摆脱输出列中所有额外的空白区域?到目前为止,我的所有网络搜索都没有发现太多,因为所有的网页搜索结果都向我展示了如何使用SQLPLUS中的COLUMN之类的格式化命令(我没有)。

6 个答案:

答案 0 :(得分: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';

答案 1 :(得分:2)

在您的陈述中,您可以指定您要查找的输出类型:

select /*csv*/ col1, col2 from table;
select /*Delimited*/ col1, col2 from table;

还有其他格式可用,例如xml,html,text,loader等。

您可以在工具>下更改这些特定选项的格式偏好>数据库>公用事业>出口

请务必选择“运行脚本”而不是“运行语句”。

*这适用于Oracle SQL Developer v3.2

答案 2 :(得分:1)

使用sql可以对sql做什么限制。 SQL Plus具有格式化列的命令,但它们并不易于使用。

一种快速方法是将输出粘贴到excel并在那里格式化,或者只是附加电子表格。有些工具会将输出直接保存为电子表格。

答案 3 :(得分:0)

好问题。我真的不得不考虑一下。

您可以做的一件事就是更改SQL,使其只返回最窄的可用列。

e.g。 (我对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脚本进行管道传输。

如果我错过了解,那么请更新你的问题,我还有另外一步:)

答案 4 :(得分:0)

如果你没有返回很多行,我会经常使用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。

答案 5 :(得分:0)

为什么不使用“演员”功能?

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';