5

我正在使用 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 等格式化命令(我没有)。

4

6 回答 6

3

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

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

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

您可以在工具 > 首选项 > 数据库 > 实用程序 > 导出下更改这些特定选项的格式

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

* 这是针对 Oracle SQL Developer v3.2

于 2012-11-01T20:44:00.820 回答
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';
于 2008-09-27T18:22:56.327 回答
1

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

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

于 2008-09-27T18:33:48.780 回答
0

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

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

如果我错过了理解,那么请更新您的问题,我会再试一次:)

于 2008-09-27T18:26:18.643 回答
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。

于 2008-09-28T02:42:04.037 回答
0

为什么不直接使用“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';
于 2013-11-20T14:43:52.113 回答