Как отформатировать вывод только для текста Oracle SQL

StackOverflow https://stackoverflow.com/questions/144167

  •  02-07-2019
  •  | 
  •  

Вопрос

Я использую 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

Это может очень легко привести к созданию очень широкого и громоздкого текстового отчета, когда я пытаюсь вставить результаты в виде красиво отформатированного текстового блока quick-n-dirty в электронное письмо или отчет о проблеме и т.д.Каков наилучший способ избавиться от всех лишних пробелов в выходных столбцах, когда я использую простой Oracle SQL?Пока что все мои поисковые запросы в Интернете не дали особых результатов, поскольку все результаты веб-поиска показывают мне, как это сделать, используя команды форматирования, такие как COLUMN в SQLPLUS (которых у меня нет).

Это было полезно?

Решение

Что вы используете для получения результатов?Вставленный вами вывод выглядит так, как будто он получен из 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';

Другие советы

В своем заявлении вы можете указать тип выходных данных, которые вы ищете:

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

То, что вы можете делать с 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-скрипт.

Если я что-то не понял, то, пожалуйста, обновите свой вопрос, и я попробую еще раз :)

Если у вас не будет возвращено много строк, я буду часто использовать Таблица печати Тома Кайтса функция.

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 с атрибуция
Не связан с StackOverflow
scroll top