簡體   English   中英

如何格式化Oracle SQL純文本選擇輸出

[英]How to format Oracle SQL text-only select output

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

在您的語句中,您可以指定要查找的輸出類型:

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

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

您可以在工具>首選項>數據庫>實用程序>導出下更改這些特定選項的格式

請務必選擇“運行腳本”而不是“運行語句”。

*這適用於Oracle SQL Developer v3.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';

你可以用sql做什么受到你的工具的限制。 SQL Plus具有格式化列的命令,但它們並不易於使用。

一種快速方法是將輸出粘貼到excel並在那里格式化,或者只是附加電子表格。 有些工具會將輸出直接保存為電子表格。

好問題。 我真的不得不考慮一下。

您可以做的一件事是更改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腳本進行管道傳輸。

如果我錯過了,那么請更新你的問題,我會再來一次:)

如果你沒有返回很多行,我會經常使用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。

為什么不使用“強制轉換”功能呢?

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM