Oracle使用java source調用外部程序


需求

Oracle調用第三方外部程序。Oracle使用sqluldr2快速導出大批量數據,然后用winrar壓縮后發送郵件。

本文檔主要實現前兩步需求,發送郵件程序這里不再說明。

原碼

授權

begin dbms_java.grant_permission('SCOTT','SYS:java.io.FilePermission','<<ALL FILES>>','read,write,execute,delete'); end;

begin dbms_java.grant_permission('SCOTT','java.lang.RuntimePermission','*','writeFileDescriptor' ); end;

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.*;

public class jv_run_extpro

{

public static void 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);

}

}

public static class StreamGobbler extends Thread {

 

InputStream is;

String type;

 

public StreamGobbler(InputStream is, String type) {

this.is = is;

this.type = type;

}

 

public void 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();

}

}

}

} 

說明:

StreamGobbler這個類不能少,用於異步讀取命令的輸出。

存儲過程

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\sqluldr2\20160916.rar" "D:\Desktop\tmp\sqluldr2\OUT2.TXT"');

end;

參數說明:

a: 壓縮文件

-ep:包內不顯示壓縮路徑

-df:壓縮后刪除原文件

總結

程序執行需要授權,如需要查看執行日志,可在sqlplus下先執行:

Set serveroutput on

Exec dbms_java.set_output(5000);


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM