Буферизация запроса, содержащего столбец XMLTYPE, с использованием sqlplus - PullRequest
0 голосов
/ 05 августа 2010

У меня есть запрос, который объединяет (вручную с помощью ||) несколько столбцов, один из которых является полем XMLTYPE (вызывая для него getClobVal ()). Если я буферирую вывод запроса с помощью sqlplus со следующими параметрами:

set long 30000;
set pagesize 0;
set feedback off;

Я получаю все содержимое по желанию, но с cr / lf после 80 символов, содержание первой строки останавливается после 60 символов с 20 символами пробела, а содержимое остальных строк останавливается после 40 символов с 40 символами пробела ,

Если я добавлю:

set linesize 120;

Я получаю те же результаты с дополнительными пробелами после фактического содержимого (60 символов пробела в строке 1, 80 символов пробела в оставшихся строках в строке)

Можно ли использовать sqlplus и буферизацию для создания выходного файла csv для результатов запроса, содержащего большое количество текста?

Я понимаю, что делать это с помощью буферизации не идеальный метод, но мне нужно иметь возможность создать этот CSV-файл таким образом, чтобы его можно было выполнить в командной строке или через командный файл.

Есть предложения?

Ответы [ 2 ]

1 голос
/ 05 августа 2010

Мы можем установить размер строки на большое число.Размер зависит от операционной системы, хотя я подозреваю, что большинство ОС будет поддерживать до 32 КБ.Это из Windows ....

SQL> set linesize 10000
SQL> set linesize 32767
SQL> set linesize 999999
SP2-0267: linesize option 999999 out of range (1 through 32767)
SQL>

Если у вас XML-текст длиннее, значит, вам не повезло.

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

Если вы можете написать на сервер, есть альтернативы.UTL_FILE по-прежнему имеет ограничение на размер строки в 32767 символов, но по крайней мере мы должны выполнить некоторые программные операции, чтобы гарантировать, что строка не будет обрезана в середине тега.

Однако, вероятно, лучшим решением является использование DBMS_XSLPROCESSOR.CLOB2FILE () , который является частью функциональности XMLDB.


Для полноты связанных параметров SQL * Plusколлега copaX рекомендует:

PAGE - установка этого значения в ноль подавляет заголовки и предотвращает выбросы страниц в выводе
ECHO - контролирует, отображается ли оператор SQL при запуске сценария

Оба PAGE' and ECHO` настроены так, чтобы избежать постороннего текста в выводе.По этой же причине часто задается следующий параметр

FEEDBACK - определяет, будет ли отображаться число строк в конце запроса

LONG - определяет количество отображаемого длинного текста
LONGCHUNKSIZE - контролирует количество длинного текста, отображаемого перед переносом столбца
TRIMSPOOL - удаляет пробелы, права на которые дополняют строку до значения LINESIZE

LONG и LONGCHUNKSIZE shoudlустановите одно и то же значение, чтобы весь столбец отображался в одной выходной строке.

Все эти параметры и многое другое объяснено в документации .

0 голосов
/ 05 августа 2010

Сотрудник, который имел больше опыта работы с sqlplus, предложил следующий набор блоков, который дал мне результат, который я искал:

set pagesize 0 echo off;
SET LINESIZE 30000 LONG 30000 LONGCHUNKSIZE 30000 Trimspool on;
...