windows用批处理调用Oracle脚本

SPOOL时间的SQL脚本: 
   

Java代码  收藏代码
  1. spool time.txt  
  2. select sysdate from dual; ----获取系统时间  
  3. spool off exit   


    文件命名为time.sql,保存在D盘根目录下。 
BAT文件: 
    命名为test.bat sqlplus LIFE/LIFE_PWD@o122g4 @d:time.sql 
执行完成后,产生一个time.txt文件: 

Java代码  收藏代码
  1. SYSDATE                                                                           
  2. --------------                                                                   
  3. 24-12月-09                                                                      
  4.   
  5. Usage: SPOOL { <file> | OFF | OUT }  
  6. where <file> is file_name[.ext] [CRE[ATE]|REP[LACE]|APP[END]]  
  7. SQL> exit   


那么执行多个sql脚本该怎么处理呢?下面做个实例:我们需要删除多个表,首先判断表是否存在,不存在的话直接create,否则drop table,这里有三个任务(CREATECONTRACTMASTER.SQL/CREATECONTRACTPRODUCT.SQL/CREATEGROUPPRODUCT.SQL);
一 准备SQL脚本: 
1.CREATECONTRACTMASTER.SQL: 

Java代码  收藏代码
  1. SPOOL CONTRACTMST.LOG   
  2. DECLARE  
  3.    M_COUNT NUMBER;  
  4.  IF EXISTS(SELECT COUNT(1) INTO M_COUNT FROM ALL_ALL_TABLES WHERE TABLE_NAME = UPPER('T_CONTRACT_MASTER')) THEN  
  5.    DROP TABLE T_CONTRACT_MASTER;  
  6.  ELSE  
  7.    CREATE TABLE T_CONTRACT_MASTER(  
  8.    POL_ID NUMBER(10),  
  9.    POL_CODE VARCHAR2(20),  
  10.    CREATE_USER VARCHAR2(10),  
  11.    CREATE_DATE DATE,  
  12.    UPDATE_USER VARCHAR2(10),  
  13.    UPDATE_TIME DATE  
  14.   );  
  15.  END IF;  
  16.  SPOOL OFF  
  17.  EXIT;  


2.CREATECONTRACTPRODUCT.SQL: 
 

Java代码  收藏代码
  1. SPOOL CONTRACTPROD.LOG  
  2.   DECLARE  
  3.    M_COUNT NUMBER;  
  4.  IF EXISTS(SELECT COUNT(1) INTO M_COUNT FROM ALL_ALL_TABLES WHERE TABLE_NAME = UPPER('T_CONTRACT_PRODUCT')) THEN  
  5.    DROP TABLE T_CONTRACT_PRODUCT;  
  6.  ELSE   
  7.    CREATE TABLE T_CONTRACT_PRODUCT(  
  8.    PRD_ID NUMBER(10),  
  9.    PRD_NAME VARCHAR2(20),  
  10.    POL_ID NUMBER(10),  
  11.    CREATE_USER VARCHAR2(10),  
  12.    CREATE_DATE DATE,  
  13.    UPDATE_USER VARCHAR2(10),  
  14.    UPDATE_TIME DATE  
  15.   );  
  16.  END IF;   
  17.  SPOOL OFF  
  18.  EXIT;  


3.CREATEGROUPPRODUCT.SQL: 

Java代码  收藏代码
  1. SPOOL GROUPPRD.LOG    
  2. DECLARE  
  3.    M_COUNT NUMBER;  
  4.  IF EXISTS(SELECT COUNT(1) INTO M_COUNT FROM ALL_ALL_TABLES WHERE TABLE_NAME = UPPER('T_GROUP_PRODUCT')) THEN  
  5.    DROP TABLE T_GROUP_PRODUCT;  
  6.  ELSE  
  7.    CREATE TABLE T_GROUP_PRODUCT(  
  8.    PRD_ID NUMBER(10),  
  9.    POL_ID NUMBER(10),  
  10.    CREATE_USER VARCHAR2(10),  
  11.    CREATE_DATE DATE,  
  12.    UPDATE_USER VARCHAR2(10),  
  13.    UPDATE_TIME DATE  
  14.   );  
  15.  END IF;  
  16.  SPOOL OFF  
  17.  EXIT;  


二 编写批处理命令文件(EXECSQL.BAT):批处理命令文件与SQL脚本最好放置在同一目录下,这样,可以设置成相对路径。否则,用绝对路径在执行时可能比较麻烦。 
 

Java代码  收藏代码
  1. EXECSAL.BAT:  
  2.   SQLPLUS LIFE/LIFE_PWD@o122g4;  
  3.   @CREATECONTRACTMASTER.SQL  
  4.   @CREATECONTRACTPRODUCT.SQL  
  5.   @CREATEGROUPPRODUCT.SQL  
  6.   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")

posted @ 2014-12-04 15:46  sunruntheway  阅读(427)  评论(0)    收藏  举报