Есть ли способ использовать SET MARKUP CSV в окне командной строки в PL / SQL Developer?

#oracle #sqlplus #plsqldeveloper #spool

#Oracle #sqlplus #plsqldeveloper #spool

Вопрос:

Мой код, который я сейчас запускаю в окне командной строки в PL / SQL Developer:

 SET MARKUP CSV ON DELIMITER | QUOTE OFF
SET FEEDBACK OFF

SPOOL C:UsersDesktopSpoolTest.csv

select *
from Vendor_data t 
where rownum < 20
;

SPOOL OFF;
 

Мой вывод:

 222339           |067   |001 

306811           |045   |001 

024253           |067   |001             
 

Мне нужно удалить конечные пробелы:

 222339|067|001 

306811|045|001
 
024253|067|001                                  
 

Я получаю не удается УСТАНОВИТЬ РАЗМЕТКУ. Я должен запустить буферизацию в окне командной строки в PL / SQL Developer. Есть ли способ сделать это? Это фрагмент кода, который на самом деле довольно длинный.

Ответ №1:

SET команды принадлежат инструменту командной строки Oracle, SQL * Plus.

Я не использую PL / SQL Developer (и быстрый Google не возвращает ничего полезного), так что — поддерживает ли PL / SQL Developer SET команды вообще? Если нет, вам не повезло, но вы можете установить клиент Oracle (если у вас его еще нет) и запустить свой скрипт непосредственно в SQL * Plus.

С другой стороны, amp; если я не ошибаюсь, SET MARKUP CSV действительно для Oracle 18c и выше; в более низких версиях SET MARKUP HTML вы можете использовать (т. Е. Без CSV опции).

Ответ №2:

Средство командной строки разработчика PL / SQL — это другой продукт, чем утилита SQL*Plus командной строки Oracle, и у него другой набор поддерживаемых команд. Командная строка разработчика PL / SQL имитирует реальную функциональность SQL * Plus, но делает это только частично. Например, он не поддерживает SET MARKUP CSV команду. Вы можете найти полный список поддерживаемых команд в Руководстве разработчика PL / SQL (Справка -> Руководство пользователя).

В вашем случае конечные пробелы появляются, потому что вы печатаете заголовки столбцов. По-видимому, разработчик PL / SQL пытается выровнять строки по максимальной длине столбца:

 spool file.txt

select ao.object_name, ao.object_id, ao.created, ao.status
  from all_objects ao
 where rownum <= 3;

OBJECT_NAME                                                                       OBJECT_ID CREATED     STATUS
-------------------------------------------------------------------------------- ---------- ----------- -------
TS$                                                                                      16 26.01.2017  VALID
ICOL$                                                                                    20 26.01.2017  VALID
 

Имея в виду, что поддержка PL / SQL Developer команд SET очень ограничена, мы можем добиться спулинга, подобного CSV, просто не печатая заголовки и установив colwidth равным 1:

 spool file.txt

set colsep |
set heading off
set colwidth 1

select ao.object_name, ao.object_id, ao.created, ao.status
  from all_objects ao
 where rownum <= 3;

spool off
 

он сохраняет это в файле spool:

 TS$|16|26.01.2017 13:52:45|VALID
ICOL$|20|26.01.2017 13:52:45|VALID
C_FILE#_BLOCK#|8|26.01.2017 13:52:45|VALID
 

Если вам необходимо распечатать заголовки, вы можете добавить дополнительный select from dual перед основным sql только для печати заголовков.