spool
- команда клиента, она не имеет никакого значения в блоке PL / SQL; и вы не можете писать в файлы на клиентском компьютере из PL / SQL. Вы можете написать на сервер , используя utl_file
(как предложено @kfinity и продемонстрировано @ BarbarosÖzhan), но это может не подходить для вашей ситуации.
Если вы хотите придерживаться буферизации на клиентском компьютере и не хотите постобрабатывать вывод в несколько файлов (как предложено @KaushikNayak), вы можете использовать другой уровень буферизации для генерации скрипта, что-то вроде :
spool temp_script.sql
select distinct 'spool list_' || department_name || '.txt' || chr(10)
|| 'select employee_name from employees where department_name = '''
|| department_name || ''' order by employee_name;' || chr(10)
from employees;
spool off
@temp_script.sql
В качестве более проработанного примера с использованием таблиц сотрудников и отделов по умолчанию для схемы HR:
set pages 0
set lines 500
set trimspool on
set feedback off
set echo off
spool temp_script.sql
prompt set pages 0
prompt set lines 500
prompt set trimspool on
prompt set feedback off
prompt set echo off
select distinct 'spool list_' || department_name || '.txt' || chr(10)
|| 'select employee_name from employees where department_name = '''
|| department_name || ''' order by employee_name;' || chr(10)
from employees;
prompt spool off
spool off
@temp_script.sql
Содержимое temp_script.sql
в этом случае заканчивается примерно так:
set pages 0
set lines 500
set trimspool on
set feedback off
set echo off
spool list_Administration.txt
select first_name || ' ' || last_name from employees where department_id = 10 order by last_name, first_name;
spool list_Marketing.txt
select first_name || ' ' || last_name from employees where department_id = 20 order by last_name, first_name;
spool list_Purchasing.txt
select first_name || ' ' || last_name from employees where department_id = 30 order by last_name, first_name;
...
spool list_Payroll.txt
select first_name || ' ' || last_name from employees where department_id = 270 order by last_name, first_name;
spool off
и один файл для каждого отдела, например list_Accounting.txt
William Gietz
Shelley Higgins
и list_Executive.txt
:
Lex De Haan
Steven King
Neena Kochhar
и т.д.. В этом примере есть несколько пустых файлов, но если бы я сделал начальный запрос, соединяющий две таблицы, то его бы не было; так как вы запрашиваете одну таблицу, которая для вас тоже не произойдет.