1.使用SQL*PLUS动态生成批量脚本 将spool与select命令结合起来使用,可以生成一个脚本,脚本中包含有可以批量执行某一任务的语句。 例1: 生成一个脚本,删除SCOTT用户下的所有的表: a. 创建gen_drop_table.sql文件,包含如下语句: SPOOL c:\drop_table.sql SELECT ''''DROP TABLE ''''|| table_name ||'''';'''' FROM user_tables; SPOOL OFF b. 以SCOTT用户登录数据库 SQLPLUS > @ …..\gen_dorp_table.sql c. 在c盘根目录下会生成文件drop_table.sql文件,包含删除所有表的语句,如下所示: SQL> SELECT ''''DROP TABLE ''''|| table_name ||'''';'''' FROM user_tables;
''''DROPTABLE''''||TABLE_NAME||'''';'''' -------------------------------------------------------------------------------- DROP TABLE DEPT; DROP TABLE EMP; DROP TABLE PARENT; DROP TABLE STAT_VENDER_TEMP; DROP TABLE TABLE_FORUM;
5 rows selected.
SQL> SPOOL OFF d. 对生成的drop_table.sql文件进行编辑去掉不必要的部分,只留下drop table …..语句 e. 在scott用户下运行dorp_table.sql文件,删除scott用户下所有的表。 SQLPLUS > @ c:\dorp_table.sql
a. 创建gen_drop_table.sql文件,包含如下语句: set echo off set feedback off set newpage none set pagesize 5000 set linesize 500 set verify off set pagesize 0 set term off set trims on set linesize 600 set heading off set timing off set verify off set numwidth 38 SPOOL c:\drop_table.sql SELECT ''''DROP TABLE ''''|| table_name ||'''';'''' FROM user_tables; SPOOL OFF b. 以SCOTT用户登录数据库 SQLPLUS > @ …..\gen_dorp_table.sql c. 在c盘根目录下会生成文件drop_table.sql文件,包含删除所有表的语句,如下所示: DROP TABLE DEPT; DROP TABLE EMP; DROP TABLE PARENT; DROP TABLE STAT_VENDER_TEMP; DROP TABLE TABLE_FORUM; d. 在scott用户下运行dorp_table.sql文件,删除scott用户下所有的表。 SQLPLUS > @ c:\dorp_table.sql
2.将一个表中的数据导出生成一个文本文件,列与列之间以”,”隔开 set echo off set feedback off set newpage none set pagesize 5000 set linesize 500 set verify off set pagesize 0 set term off set trims on set linesize 600 set heading off set timing off set verify off set numwidth 38 SPOOL c:\drop_table.sql select DEPTNO || '''','''' || DNAME FROM DEPT; SPOOL OFF 将上面的内容保存为一个文本文件后,以scott登录,执行该文件后显示结果: 10,ACCOUNTING 20,RESEARCH 30,SALES 40,OPERATIONS
通过上面的两个例子,我们可以将: set echo off set feedback off set newpage none set pagesize 5000 set linesize 500 set verify off set pagesize 0 set term off set trims on set linesize 600 set heading off set timing off set verify off set numwidth 38 SPOOL c:\具体的文件名 你要运行的sql语句 SPOOL OFF 作为一个模版,只要将必要的语句假如这个模版就可以了。
在oracle的较新版本中,还可以用set colsep命令来实现上面的功能: SQL> set colsep , SQL> select * from dept; 10,ACCOUNTING ,NEW YORK 20,RESEARCH ,DALLAS 30,SALES ,CHICAGO 40,OPERATIONS ,BOSTON 35,aa ,bb
3.动态生成spool命令所需的文件名 在我们上面的例子中,spool命令所需要的文件名都是固定的。有时我们需要每天spool一次,并且每次spool的文件名都不相同,如文件名包含当天的日期,该如何实现呢? column dat1 new_value filename; select to_char(sysdate,''''yyyymmddhh24mi'''') dat1 from dual; spool c:\&&filename..txt select * from dept; spool off;
4.如何从脚本文件中得到WINDOWS环境变量的值: 在windos中: spool c:\temp\%ORACLE_SID%.txt select * from dept; ... spool off