форматирование csv-файла с помощью sqlplus в скрипте оболочки

#sql #oracle

Вопрос:

Я использую sqlplus в сценарии оболочки для подключения к базе данных и файлу spool .csv.

код-это:-

 sqlplus -s user/pass@db <<EOF> /dev/null 2>amp;1
SET COLSEP ','
SET FEEDBACK OFF
SET TRIMSPOOL ON
SET UNDERLINE OFF
SET LINESIZE 10000
SET PAGESIZE 10000

spool customer.csv 

select * from customer where cust_name='john';
spool off
EOF
 

выход:-
введите описание изображения здесь

я получаю обрезку заголовка для нескольких колумов, таких как 1-й, 2-й, 4-й и 7-й.

ожидаемый результат:- введите описание изображения здесь

Ответ №1:

Вам нужно будет указать SQL*Plus , какой ширины вы хотите, чтобы были столбцы. Предполагая, что я правильно подсчитал длину каждого заголовка

 column sys_creation_date format a17
column sys_update_date   format a15
column dl_service        format a10
column eff_date_time     format a13
 

Возможно, вам будет приятнее переключиться на SQLcl, так как это облегчает создание CSV-файлов. Просто

 select /*csv*/ * from emp
 

или

 set sqlformat csv
select * from emp
 

Комментарии:

1. есть ли у нас возможность установить формат для всех столбцов?

2. здесь…настройка формата поможет только в том случае , если столбцов меньше, что если у нас 50-70 столбцов, то это не очень хорошая идея.

3. @Roger — Если вы используете SQL*Plus , и вы хотите убедиться, что заголовок столбца распечатан полностью, вам нужно будет отформатировать столбец. Да, это потенциально 70 строк форматирования, если в вашем запросе 70 столбцов. Вот почему SQLcl, как правило, является лучшим вариантом, если только вы по какой-то причине не привязаны к старым инструментам.

4. @JustinCave — sqlcli не требуется для использования директивы /*csv*/. sqlplus (по крайней мере, на 19c) также справится с этим.

5. @EdStevens — Интересно. Я знал, что разработчик SQL и SQLcl поддерживают это. Не знал, что он был добавлен SQL*Plus .