传统使用Java ScrptRunner类执行sql脚本时会有很多语法限制,程序只能最简单的sql语句,该功能并不适用于实际应用场景;因此可以改变思路,使用Java直接执行Dos命令的方式去批量执行脚本;


1.Java执行Dos命令的方式

结合使用 java.lang库下的Process与Runtime类的方法;

Runtime.getRuntime().exec 用于调用外部可执行程序或系统命令,并重定向外部程序的标准输入、标准输出和标准错误到缓冲池。

Process process = Runtime.getRuntime().exec( "cd ./a/b/c");
process.waitfor();

Runtime.getRuntime().exec共有六个重载方法:可以根据自己实际应用场景进行拼装

// 在单独的进程中执行指定的外部可执行程序的启动路径或字符串命令
public Process exec(String command)
    
// 在单独的进程中执行指定命令和变量
public Process exec(String[] cmdArray)
    
// 在指定环境的独立进程中执行指定命令和变量
public Process exec(String command, String[] envp)
    
// 在指定环境的独立进程中执行指定的命令和变量
public Process exec(String[] cmdArray, String[] envp)
    
// 在指定环境和工作目录的独立进程中执行指定的字符串命令
public Process exec(String command, String[] envp, File dir)
    
// 在指定环境和工作目录的独立进程中执行指定的命令和变量
public Process exec(String[] cmdarray, String[] envp, File dir)
    
// 参数说明:
    cmdarray // 包含所调用命令及其参数的数组。数组第一个元素是命令,其余是参数
    envp     // 字符串数组,其中每个元素的环境变量的设置格式为 name=value,如果子进程应该继承当前进程的环境,则该参数为null
    dir      // 子进程的工作目录;如果子进程应该继承当前进程的工作目录,则该参数为null
    
// 参数cmdArray 示例:shutdown -s -t 3600
String arr[] = {"shutdown","-s","-t","3600"};
Process process = Runtime.getRuntime().exec(arr[]);
/*
注意:
    在调用这个方法时,不能将命令和参数放在一起,eg:String arr[] = {"shutdown -s -t 3600"};
    这样会导致程序把“shutdown -s -t 3600”当成是一条命令的名称,然后去查找“shutdown -s -t 3600”这条命令,它当然会找不到,所以就会报错
*/

实例:

StringBuilder result = new StringBuilder("");
BufferedReader br = null;
Process process = null;

try {
    // Linux版本
    process = Runtime.getRuntime().exec(new String[]{"/bin/sh",command});
    // Windows版本
    // process = Runtime.getRuntime().exec(new String[]{"cmd /c",command});
    process.waitFor();
    br = new BufferedReader(new InputStreamReader(process.getInputStream()));
    String line = null;
    while ((line = br.readLine()) != null){
        result.append(line).append("\n");
    }
}
catch (Exception e){
    log.error("执行脚本失败",e);
}
finally {
    CloseStream.closed(br);
    process.destroy();
}

2.Oracle版本命令

SQL plus登录方式:

  1. 以操作系统权限认证的oracle sys管理员登陆
    sqlplus / as sysdba
  2. 不在cmd或者terminal当中暴露密码的登陆方式
    sqlplus /nolog
    SQL> conn /as sysdba & SQL> conn sys/password as sysdba
  3. 非管理员用户登陆
    sqlplus scott/tiger
  4. 非管理员用户使用tns别名登陆
    sqlplus scott/tiger@orcl
  5. 管理员用户使用tns别名登陆
    sqlplus sys/password@orcl as sysdba

执行脚本命令 @

完整命令:

cd /home/oracle/filePath/oracle/Install && << EOF sqlplus username/passWd@IP:1521/orcl @install.sql >/home/oracle/logFile.log 2>&1 \r\n EOF

命令关键点:

  1. &&
    用来连接多个命令
  2. << EOF
    表示自定义终止符,配合结尾处的 EOF 能够在执行完 sqlplus 命令后退出SQL plus模式。
  3. @install.sql
    表示执行当前目录下的install.sql脚本
  4. >/home/oracle/logFile.log 2>&1
    将SQL plus命令的执行结果,存储到.log文件中;2>&1 表示 将标准错误重定向到标准输出。这里标准输出已经重定向到了 .log,那么标准错误也会输出到.log。

3.MySQL版本命令

mysql常用参数介绍:

mysql
-h:数据库IP
-P(大写): 数据库端口
-u:用户名
-p:用户密码
-D:数据库名称
-e:需要执行的命令

执行脚本命令 source

完整命令:

cd /home/oracle/filePath/oracle/Install && << EOF mysql -hIP -P3306 -username -ppassWd -D database -e "source install.sql" >/home/oracle/logFile.log 2>&1 \r\n EOF

命令关键点:

-e 后的参数值为执行的source命令,需要使用双引号圈起来