windows用批处理调用Oracle脚本
SPOOL时间的SQL脚本:
- 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")

浙公网安备 33010602011771号