需求 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(Strin 在Oracle数据库中,有时我们需要调用外部程序来执行特定任务,比如在本例中的需求是:从Oracle数据库中导出大量数据,使用`sqluldr2`工具快速生成数据文件,然后利用`WinRAR`进行压缩,最后通过邮件发送。为实现这一功能,可以借助Java Source来创建自定义的存储过程。下面我们将详细讲解如何操作。 我们创建一个名为`jv_run_extpro`的Java源代码,其主要目的是通过`Runtime.getRuntime().exec(cmd)`方法执行系统命令。在这个Java类中,定义了一个`run`方法,该方法接收一个字符串参数`cmd`,表示要执行的外部程序命令。同时,类中还包含了一个内部类`StreamGobbler`,用于异步读取并处理命令执行时的输出流,避免阻塞。 ```java 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(); } } } } ``` 接下来,我们需要将这个Java源代码编译并注册到Oracle数据库中,使其成为可以调用的Java类。完成这一步后,就可以创建一个存储过程`pro_jv_run_extpro`,该过程会调用`jv_run_extpro.run`方法执行指定的命令。 ```sql create or replace procedure pro_jv_run_extpro(p_cmd varchar2) as language java name 'jv_run_extpro.run(java.lang.String)'; ``` 现在,我们可以调用这个存储过程来执行我们的任务。例如,导出数据并压缩: ```sql 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; ``` 这里,第一个调用`pro_jv_run_extpro`使用`sqluldr2`导出`emp`表的数据到文本文件`OUT2.TXT`,第二个调用则是使用`WinRAR`将文件压缩为`20160916.rar`。 值得注意的是,Java Source在Oracle中的使用需要确保数据库具有执行Java代码的权限,以及正确的JVM环境。在实际应用中,还需要考虑错误处理、日志记录等更复杂的情况,以确保程序的健壮性和可维护性。 此外,`StreamGobbler`类在处理命令输出时起到了关键作用,它可以避免因等待输出流导致的阻塞,确保命令能够正常执行。如果在实际操作中遇到类似问题,如Java通过`Runtime`调用外部程序出现阻塞,可以参考相关的解决方法,例如使用`StreamGobbler`类进行异步读取。 通过Java Source在Oracle中调用外部程序,可以实现数据库与外部世界的交互,扩展Oracle的功能,满足各种复杂的需求。在设计这类解决方案时,应充分考虑性能、安全和稳定性,确保系统的可靠运行。
- hujingding2021-04-28资源和文件标题严重不符
- 粉丝: 8
- 资源: 959
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助