需求
oracle调用第三方外部程序。oracle使用sqluldr2快速导出大批量数据,然后用winrar压缩后发送邮件。
源码
java source
create or replace and compile java source named jv_run_extpro as
import java.io.*;
import java.lang.*;
import java.util.*;
import java.sql.*;
import oracle.sql.*;
publicclass jv_run_extpro
{
publicstaticvoid run(string cmd) throws ioexception
{
process p=runtime.getruntime().exec(cmd);
streamgobbler errorgobbler = new streamgobbler(p.geterrorstream(), "error");
streamgobbler outputgobbler = new streamgobbler(p.getinputstream(), "output");
errorgobbler.start();
outputgobbler.start();
try
{
p.waitfor();
}
catch(interruptedexception ie)
{
system.out.println(ie);
}
}
publicstaticclass
streamgobbler extends thread {
inputstream is;
string type;
public streamgobbler(inputstream is, string type) {
this.is = is;
this.type = type;
}
publicvoid run() {
try {
inputstreamreader isr = new inputstreamreader(is);
bufferedreader br = new bufferedreader(isr);
string line = null;
while ((line = br.readline()) != null) {
if (type.equals("error")) {
system.out.println("error :" + line);
} else {
system.out.println("debug:" + line);
}
}
} catch (ioexception ioe) {
ioe.printstacktrace();
}
}
}
}
存储过程
create or replace procedure pro_jv_run_extpro(p_cmd varchar2) as
language java name ‘jv_run_extpro.run(java.lang.string)’;
调用
begin
pro_jv_run_extpro('sqluldr264.exe scott/hh@pdborcl query="select * from emp" field=, head=yes file=d:\desktop\tmp\sqluldr2\out2.txt');
pro_jv_run_extpro('"d:\program files\winrar\rar.exe" a -ep -df "d:\desktop\tmp\sqluldr2160916.rar" "d:\desktop\tmp\sqluldr2\out2.txt"');
end;
总结
java source里streamgobbler这个类不能少,用于异步读取命令的输出。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持www.887551.com。