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

时间:2020-03-06 14:49:43  来源:igfitidea点击:

我正在使用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 PM 
2096                   F           25-SEP-08                 25-SEP-08                 25-SEP-08 01.41.02.517321000 AM 

2 rows selected

当我尝试将结果作为格式正确的快速N脏文本块粘贴到电子邮件或者问题报告等中时,这可以很容易地生成非常广泛且笨拙的文本报告。摆脱的最佳方法是什么当我仅使用普通的Oracle SQL时,输出列中所有多余的空格是多少?到目前为止,我所有的网络搜索都没有得到太多改善,因为所有网络搜索结果都向我展示了如何使用SQLPLUS中的COLUMN之类的格式化命令来实现它(我没有)。

解决方案

我们正在使用什么来获得结果?我们粘贴的输出看起来像是来自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';

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

我们可以做的一件事是更改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脚本对其进行管道传输。

如果我误会了,请更新问题,我将再进行一次:)

sql的功能受工具的限制。 SQL Plus具有用于格式化列的命令,但它们并非真正易于使用。

一种快速的方法是将输出粘贴到excel中并在其中设置格式,或者仅添加电子表格。一些工具会将输出直接保存为电子表格。

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