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
等等。在此示例中,有几个空文件,但如果我将初始查询加入这两个表,则不会有;因为您正在查询一个不会发生在您身上的表。