版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/samile6899/article/details/55512436
由于系统业务的复杂性,会经常用到Oracle数据的存储过程,那些比较复杂的逻辑就写在了存储过程中。今天有遇到一个需求,是需要在存储过程中调用windows系统上的bat批处理文件,之前做的都是java进行调用 .bat 批处理脚本程序,现在是需要在Oracle 的存储过程中进行调用系统的 .bat 脚本。第一感觉挺复杂了,后来完成了也就没什么了,挺简单的。经验教程记下来,后续如果需要使用的话,直接来找就可以了,当然也帮助了那些有同样需要的同志们。
1,首先要创建Java source
create or replace and compile java source named exesyscommand as
import java.io.*;
public class ExeSysCommand
{
public static String ExeCmd(String cmd) {
Process proc = null;
int exitValue;
try {
System.out.println(cmd);
proc = Runtime.getRuntime().exec(cmd);
exitValue = proc.waitFor();
if (exitValue == 0) {
return "PASS";
} else {
return "FAIL";
}
} catch (Exception e) {
return e.getMessage();
}
}
public static void main(String[] args)
{
System.out.println("No command line arguments");
System.out.println(ExeCmd("D:\\01_import.bat"));
System.out.println("No command line arguments");
}
}
2,其后要创建函数调用该Java source
CREATE OR REPLACE FUNCTION ExeCmd(cmd STRING) RETURN VARCHAR2 IS --执行OS命令测试
LANGUAGE JAVA NAME ' ExeSysCommand.ExeCmd(java.lang.String) return java.lang.String';
3,DBA登录数据库并授权数据库的某一用户
exec dbms_java.grant_permission( 'JYCRMX', 'SYS:java.io.FilePermission', 'D:\01_import.bat', 'execute');
exec dbms_java.grant_permission( 'JYCRMX', 'SYS:java.io.FilePermission', '<>', 'execute');
4,自己写一个简单的.bat批处理文件(本机放在D盘)
md d:\name777
exit
5,打开PL/SQL或者CMD控制台下进行测试
select execmd('D:\run.bat') from dual;
最后,出来的结果是这样的
OK,大功告成,接下来就是把这个自定义的函数给放到存储过程中就完了。
存储过程什么的就不写了,资源文件都上传到CSDN上了(
http://download.csdn.net/detail/samile6899/9756986),大家可以下载下来看看,多试几次就OK了!