#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 только для печати заголовков.