spool time.txt
select sysdate from dual; ----获取系统时间
spool off exit
文件命名为time.sql,保存在D盘根目录下。
BAT文件:
命名为test.bat sqlplus LIFE/LIFE_PWD@o122g4 @d:time.sql
执行完成后,产生一个time.txt文件:
SYSDATE
--------------
24-12月-09
Usage: SPOOL { <file> | OFF | OUT }
where <file> is file_name[.ext] [CRE[ATE]|REP[LACE]|APP[END]]
SQL> exit
那么执行多个sql脚本该怎么处理呢?下面做个实例:我们需要删除多个表,首先判断表是否存在,不存在的话直接create,否则drop table,这里有三个任务(CREATECONTRACTMASTER.SQL/CREATECONTRACTPRODUCT.SQL/CREATEGROUPPRODUCT.SQL);
一 准备SQL脚本:
1.CREATECONTRACTMASTER.SQL:
SPOOL CONTRACTMST.LOG
DECLARE
M_COUNT NUMBER;
IF EXISTS(SELECT COUNT(1) INTO M_COUNT FROM ALL_ALL_TABLES WHERE TABLE_NAME = UPPER('T_CONTRACT_MASTER')) THEN
DROP TABLE T_CONTRACT_MASTER;
ELSE
CREATE TABLE T_CONTRACT_MASTER(
POL_ID NUMBER(10),
POL_CODE VARCHAR2(20),
CREATE_USER VARCHAR2(10),
CREATE_DATE DATE,
UPDATE_USER VARCHAR2(10),
UPDATE_TIME DATE
);
END IF;
SPOOL OFF
EXIT;
2.CREATECONTRACTPRODUCT.SQL:
SPOOL CONTRACTPROD.LOG
DECLARE
M_COUNT NUMBER;
IF EXISTS(SELECT COUNT(1) INTO M_COUNT FROM ALL_ALL_TABLES WHERE TABLE_NAME = UPPER('T_CONTRACT_PRODUCT')) THEN
DROP TABLE T_CONTRACT_PRODUCT;
ELSE
CREATE TABLE T_CONTRACT_PRODUCT(
PRD_ID NUMBER(10),
PRD_NAME VARCHAR2(20),
POL_ID NUMBER(10),
CREATE_USER VARCHAR2(10),
CREATE_DATE DATE,
UPDATE_USER VARCHAR2(10),
UPDATE_TIME DATE
);
END IF;
SPOOL OFF
EXIT;
3.CREATEGROUPPRODUCT.SQL:
SPOOL GROUPPRD.LOG
DECLARE
M_COUNT NUMBER;
IF EXISTS(SELECT COUNT(1) INTO M_COUNT FROM ALL_ALL_TABLES WHERE TABLE_NAME = UPPER('T_GROUP_PRODUCT')) THEN
DROP TABLE T_GROUP_PRODUCT;
ELSE
CREATE TABLE T_GROUP_PRODUCT(
PRD_ID NUMBER(10),
POL_ID NUMBER(10),
CREATE_USER VARCHAR2(10),
CREATE_DATE DATE,
UPDATE_USER VARCHAR2(10),
UPDATE_TIME DATE
);
END IF;
SPOOL OFF
EXIT;
二 编写批处理命令文件(EXECSQL.BAT):批处理命令文件与SQL脚本最好放置在同一目录下,这样,可以设置成相对路径。否则,用绝对路径在执行时可能比较麻烦。
EXECSAL.BAT:
SQLPLUS LIFE/LIFE_PWD@o122g4;
@CREATECONTRACTMASTER.SQL
@CREATECONTRACTPRODUCT.SQL
@CREATEGROUPPRODUCT.SQL
EXIT;
当然,通常会把所有的脚本重新用一个sql脚本组合起来,然后用批处理命令调用这个SQL脚本即可。
注意:如果是需要传递值,直接将参数放到SPOOL的脚本中。
SET TERMOUT OFF ----显示脚本中的命令的执行结果,缺省为on
SET NEWPAGE 1
SET SPACE 0
SET PAGESIZE 0 --输出每页行数,缺省为24,为了避免分页,可设定为0。
SET ECHO OFF ---显示start启动的脚本中的每个sql命令,缺省为on
SET FEEDBACK OFF --回显本次sql命令处理的记录条数,缺省为on
SET VERIFY OFF --设置是否显示替代变量被替代前后的语句
SET HEADING OFF ---输出域标题,缺省为on
SET MARKUP HTML OFF ---html 元素标签开关 打开
SPOOL OFF
SET TRIMSPOOL ON ---去除重定向(spool)输出每行的拖尾空格,缺省为off
SET TRIMOUT ON ---去除标准输出每行的拖尾空格,缺省为off
-- spool 到当前目录中
spool output.tmp
spool off
-- 构造查询语句
@@output.tmp
set colsep' ' ---域输出分隔符
当然,还有一种方法,就是用VBA产生脚本。以下脚本没有验证过!
Dim WshShell, oExec
Set WshShell = CreateObject("WScript.Shell")'创建脚本对象
Set oExec = WshShell.Exec("sqlplus -S LIFE/LIFE@O122G4 @D:\a.sql")'-s是不回显,然后跟用户名和密码,之后是sql语句路径
Set oExec = WshShell.Exec("sqlplus -S scott/tiger @D:\b.sql")