2015-11-04 3 views
1

Я использую следующий скрипт спулинга с Oracle SQL Developer 4.1:SQL Developer намотка: как избавиться от первой пустой строки

set echo off 
set feedback off 
set termout off 

spool A.txt 
select /*csv*/ * from A where rownum <= 1000; 
spool off 

spool B.txt 
select /*csv*/ * from B where rownum <= 1000; 
spool off 

... 

Но буферные выходные файлы содержат пустую строку в начале.

Эта же проблема, о которой идет речь в sqlplus spooling: How to get rid of first, empty line?. Я попытался с помощью SET NEWPAGE NONE, но, как в SQL Developer 4.1.2, это только приводит к сообщению об ошибке и не изменение формата вывод:

SP2-0158: unknown SET option "newpage" 

Есть ли способ, чтобы подавить вывод этой первой пустой строки в SQL Developer?

ответ

2

две вещи:

  1. это SQL по умолчанию * Plus поведение по, который мы пытаемся подражать 100% как можно больше
  2. есть ошибка - мы не поддерживаем SET PAGESIZE 0. Если использовать это в сочетании с SET TRIMSPOOL ON, вы потеряете пустую строку (ы)

мы получили его в список для следующего выпуска

1

Это не представляется возможным; это было задано раньше, но я не вижу разрешения. (Пробовал с set sqlformat csv вместо подсказки /*csv*/, на всякий случай, но поведение такое же).

Если вы экспортируете результаты запроса из сетки в виде CSV (щелкните правой кнопкой мыши по сетке и выберите «Экспорт ...»), вы не получите пустую строку, но это, очевидно, ручной процесс вне вашего скрипта, поэтому не действительно эквивалентны.

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

+0

Последующая обработка в порядке. Получение SQL * Plus для вывода CSV-файла кажется довольно сложным, к сожалению: http://stackoverflow.com/q/643137/238421. –

1

Как thatjeffsmith любезно отметил, hopefull y эта ошибка исправлена ​​в следующей версии. До тех пор вы можете выполнить желаемые результаты с помощью SQLcl (современный SQL * Plus, который включен и используется SQLDeveloper 4.1.2) в сочетании со сценарием SED.

SQLcl находится здесь: $ SQLDEV_HOME \ sqldeveloper \ bin \ sql. $ SQLDEV_HOME - это просто каталог установленной версии SQLDeveloper.

В вашем примере вы генерируете два отдельных выходных файла A.txt и B.txt из одного файла SQL. Мой следующий предложенный метод потребует, чтобы это было разбито на два отдельных файла SQL: A.sql и B.sql.

A.sql:

set echo off 
set feedback off 
set termout off 
select /*csv*/ * from A where rownum <= 1000; 

B.sql:

set echo off 
set feedback off 
set termout off 
select /*csv*/ * from B where rownum <= 1000; 

Ниже содержимое одной строки моей SED сценарий под названием "удалить-первых наводкой-line.sed":

0,/^$/{//d} 

«0» означает, что следующий следующий командный блок будет применен только к первой строке.

"/^$ /" определяет шаблон регулярного выражения для соответствия. «^» - это начало строки, а «$» - это маркер конца строки, поэтому этот шаблон соответствует только строкам, которые не имеют абсолютно никакого контента, а не пробелов ... ничего. Если вы хотите удалить строки, которые могут содержать пробелы (вкладки, пробелы), тогда вы можете попробовать эту команду SED: 0,/^ [[: пробел:]] * $/{// d}

" // d "определяет, что скрипт должен удалить найденный сопоставленный шаблон.

Для получения дополнительной информации об этом сценарии SED см .: https://unix.stackexchange.com/questions/75424/remove-only-the-first-blank-line-sed.

Итак, чтобы удалить первую пустую строку из выходных данных каждого файла SQL, A.sql и B.sql, они должны выполняться отдельно с использованием SQLcl, а затем вывод должен быть отправлен из SQLcl через следующий скрипт SED, как следующим образом:

$SQLDEV_HOME\sqldeveloper\bin\sql -s scott/[email protected] @A.sql | sed -f remove-first-blank-line.sed > A.txt 
$SQLDEV_HOME\sqldeveloper\bin\sql -s scott/[email protected] @B.sql | sed -f remove-first-blank-line.sed > B.txt 

«-s» является «молчание» вариантом для SQLcl (например, SQL * Plus), который гарантирует, что нет базы данных информации Логина выводится cluttter своего выходного файла.

"|" все строки выводятся из SQLcl через данный скрипт SED.

«>» записывает все выходные данные сценария SED в выходной файл «mysql.out». Если вам нужно добавить больше данных в этот же файл с помощью другого SQL-скрипта, используйте «>>», чтобы вы могли добавлять данные в файл вместо перезаписи файла.

ПРИМЕЧАНИЕ. Да, вы также можете использовать команду SED непосредственно в командной строке, но для этого часто требуется экранирование специальных символов различными способами в зависимости от того, на какой ОС вы работаете. Я нахожу, что я гораздо чаще могу повторно использовать сценарии SED на разных платформах (например, Linux и Windows), когда я сохраняю команды SED в коротких хорошо известных файлах SED-скриптов.

Смежные вопросы