2010-08-04 5 views
0

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

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

Я получаю все содержимое по желанию, но с кр/Л.Ф. после 80 символов, содержание первой линии в остановке после 60 символов с 20 символов пробела, а содержание оставшихся строк останавливается после 40 символов с 40 символами пробела.

Если добавить:

set linesize 120; 

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

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

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

Любые предложения?

ответ

0

Коллега, который имел больше опыта SQLPLUS придумали следующий набор блок, который дал мне результат, который я искал:

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

Вы должны принять свой ответ, поскольку он решает вашу проблему для вас. – APC

+0

StackOverflow не позволяет мне принимать мой собственный ответ до тех пор, пока не пройдет день. – copaX

1

Мы можем установить линии на большое количество. Насколько велика зависимость от операционной системы, хотя я подозреваю, что большинство ОС поддерживают до 32K. Это из 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 параметров рекомендованы коллегой КОПАКС являются:

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

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

FEEDBACK - контроль является ли ROWCOUNT отображаемая в конце запроса

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

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

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

+0

К сожалению, да, это потому, что выход должен быть на клиенте, а не сам сервер базы данных. – copaX

+0

@copaX - в этом случае вы ограничены 32K, что позволяет LINESIZE. – APC