2014-01-31 4 views
2

Я хочу использовать функции spool в Oracle 11g.Использование Spool в Oracle 11g

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

В приведенном ниже примере я хочу temp_1.txt, чтобы содержать данные из A, B, C, D и E

In temp_2.txt Хочу данные только для D.

sqlplus user/[email protected] 

spool on temp_1.txt  
select * from A; 
select * from B; 
select * from C; 
spool on temp_2.txt 
select * from D; 
spool off temp_2.txt 
select * from E; 

exit; 

Примечание: - Так как это очень старый унаследованный код. Я не могу написать отдельный сеанс sqlplus для D или заказать заказ.

ответ

3

Как сделать все это в скрипте sqlplus. Команды хоста должны будут измениться, если вы когда-либо запускались в другой системе (например, Microsoft Windows). Но они также должны будут меняться в сценарии оболочки.

spool all_queries.txt 
select * from A; 
select * from B; 
select * from C; 
spool off 

spool only_d_query.txt 
select * from D; 
spool off 

host cat only_d_query.txt >>all_queries.txt 

spool all_queries.txt append 
select * from E; 
spool off 
2

Вы не можете этого сделать. The SPOOL command разрешает только один открытый файл за раз; ваша вторая команда, которая будет spool temp_2.txt (без on), закроет первый файл перед открытием и начнет запись ко второму. И off не принимает никаких дополнительных параметров.

Usage: SPOOL { <file> | OFF | OUT } 
where <file> is file_name[.ext] [CRE[ATE]|REP[LACE]|APP[END]] 

Одно решение было бы намотать выход заявлений в различные файлы:

spool temp_1.txt 
select * from A; 
select * from B; 
select * from C; 
spool temp_2.txt 
select * from D; 
spool temp_3.txt 
select * from E; 
spool off 

... а затем объединить все три файла в один из операционной системы, чтобы получить «хозяина» выходной файл, сохраняя при этом только файл D-only. например .:

cat temp_2.txt >> temp_1.txt 
cat temp_3.txt >> temp_1.txt 
rm temp_3.txt` 

Который оставляет temp_1.txt и temp_2.txt с содержанием вы хотели, если я правильно вас понял. Разный метод, если вы в Windows, конечно.

Альтернативно вы можете запускать запросы в блоке PL/SQL и использовать UTL_FILE для записи результатов в один или оба из двух открытых файлов. Но это немного больше работы и будет записывать файлы на сервере - так что вам нужны разрешения для объекта DIRECTORY для записи и доступа к каталогу базовой файловой системы, который указывает на получение файлов.