如何通过JAVA让DB2调用操作系统命令
引言:我们在工作中常用操作系统命令和DB2命令对数据库做数据的导入、导出等操作,但是DB2不支持复合SQL 语句调用操作系统命令,因此我们需要利用 UDF 来执行SQL 中不可用的操作(例如:执行一些SHELL或者BAT文件)。因为 UDF可以用外部语言(即,SQL 以外的其它语言,如JAVA,C)编写,并可以通过使用 CREATE 语句向数据库注册,这样我们就可以编写JAVA应用程序来调用操作系统命令和DB2的常用命令。
步骤(windows XP环境):
1、 编写JAVA程序:
public class os_cmdUDF {
public static int os_cmd(String cmd) {
Runtime rt = Runtime.getRuntime();
Process p=null;
int success = 0;
try {
p = rt.exec(cmd);
}
catch (Exception e) {
success = -1;
}
return (success);
}
}
2、编译我们的java源文件,并制作jar包:
首先,需要明确一个问题,java虚拟机(JVM)无法执行高于自身版本的.class文件。这里建议您使用DB2自带的JDK对JAVA源文件进行编译。
为了方便编译,将我们写完的JAVA文件保存到例如:C:\Program Files\IBM\SQLLIB\java\jdk\bin下。进入cmd命令行,转到路径C:\Program Files\IBM\SQLLIB\java\jdk\bin下,运行命令: javac os_cmdUDF.java 对源文件进行编译。然后将编译后的.class文件打成jar包:jar cf os_cmdUDF.jar os_cmdUDF.class 这样,jar包制作完成。
3、运行安装jar包到数据库:
首先我们需要连接到DB2数据库,建立连接之后使用如下SQL语句将jar包安装到数据库里:
call sqlj.install_jar(’file:///C:/Program Files/IBM/SQLLIB/java/jdk/bin/os_cmdUDF.jar’,’os_cmdUDF’)
其中file:///C:/Program Files/IBM/SQLLIB/java/jdk/bin/os_cmdUDF.jar为jar包的全路径,os_cmdUDF为指定路径下的jar包在DB2里的名称(声明到DB2下的jar包名可以自定义)。
4、运行create 建立函数:
CREATE os_cmd( IN VARCHAR(1000))
RETURNS INTEGER
EXTERNAL NAME 'os_cmdUDF:os_cmdUDF!os_cmd'
LANGUAGE JAVA
PARAMETER STYLE JAVA
NOT DETERMINISTIC
NO SQL
EXTERNAL ACTION
其中'os_cmdUDF:os_cmdUDF!os_cmd'第一个os_cmdUDF 为jar包名(即安装到DB2下jar包的名称),第二个os_cmdUDF为该os_cmdUDF jar包里名为os_cmdUDF的类名,os_cmd为该类里一个名为os_cmd的方法名。
5、测试函数是否可用:
values os_cmd('ipconfig')
返回结果,
1
-----------
0
1 条记录已选择。
函数可以用。
说明:因为在cmd下ipconfig命令为正确命令,命令执行成功返回0。同理,这里可以执行我们事先编写好的SHELL或者BAT文件,执行时需要注意路径的书写。例:在D盘下有一个文件名为a.bat批处理文件。调用函数: values os_cmd(‘d:///a.bat’)
6、创建存储过程,调用函数:
至此,我们可以方便的在存储过程里调用我们写好的函数。下面为一个简单的存储过程实例:
CREATE PROCEDURE P_OS_CMD(IN CMD VARCHAR(1000))
LANGUAGE SQL
BEGIN
RETURN os_cmd(CMD);
END
7、测试存储过程是否可用:
call p_os_cmd('a')
返回状态 = -1
说明:因为”a”不是cmd下的命令,所以执行失败,java执行后返回-1,所以返回状态为-1。
备注:
1、若要移除我们安装到db2里的jar包,使用:call sqlj.remove_jar(‘jar包名’) 移除。但需要注意的是,若有函数或存储过程在使用要被移除的jar包,需要将相应的函数和存储过程drop掉后再做移除操作。
2、再次强调,建议使用DB2的JDK编译java源文件。原理上低版本jdk编译的文件在高版本的jvm中可以运行,但不保证在DB2中是这样的。
3、file:///C:/Program Files/IBM/SQLLIB/java/jdk/bin/os_cmdUDF.jar中file:///与后面的C:/之间没有空格。直接copy该文档的代码会出现空格。
4、在DB2中调用系统命令是隐式的执行,比如使用命令行“notepad”新建记事本,是不会有反应的,但是使用命令删除文件,是可执行的。
附:UNIX环境下的JAVA源代码。第二个方法为检测所指文件是否存在。此外将命令行执行的结果通过IO流打印到控制台。
import COM.ibm.db2.app.UDF;
import java.io.*;
public class os_cmdUDF extends UDF{
public static int jfun_ExcCmd(String cmd) {
Runtime rt = Runtime.getRuntime();
String[] args= new String[] {"/bin/sh", "-c", cmd};
Process p=null;
int success = -1;
try{
p = rt.exec(args);
success = 0;
InputStreamReader reader =
new InputStreamReader(p.getInputStream());
BufferedReader br = new BufferedReader(reader);
while ((line = br.readLine()) != null) {
System.out.println(line);
//在控制台上打印出执行结果。
}
br.close();
reader.close();
}catch (Exception e) {
e.printStackTrace();
success = -1;
}
return success;
}
public static int jfun_IsFileExists(String url){
int i = -1;
File file = null;
try{
file = new File(url);
if(file.exists()){
//测试此抽象路径名表示的文件或目录是否存在。
i=0;
if(file.isFile()){
//测试此抽象路径名表示的文件是否是一个标准文件。
i=1;
}
}
}catch(Exception e){
return -1;
}
return i;
}
public static void main(String args[]){
StringBuffer buff = new StringBuffer();
if(null!=args){
for(int i=0;i<args.length;i++){
buff.append(args[i]);
if(i<args.length-1){
buff.append(" ");
}
}
}
}
}
如何通过JAVA让DB2调用操作系统命令的更多相关文章
- java调用操作系统命令
java的Runtime.getRuntime().exec(commandStr)可以调用执行cmd指令. cmd /c dir 是执行完dir命令后关闭命令窗口. cmd /k dir 是执行完d ...
- loadrunner 脚本开发-调用java jar文件远程操作Oracle数据库测试
调用java jar文件远程操作Oracle数据库测试 by:授客 QQ:1033553122 测试环境 数据库:linux 下Oracle_11g_R2 Loadrunner:11 备注:想学ora ...
- jsp页面:js方法里嵌套java代码(是操作数据库的),如果这个js 方法没被调用,当jsp页面被解析的时候,不管这个js方法有没有被调用这段java代码都会被执行?
jsp页面:js方法里嵌套java代码(是操作数据库的),如果这个js 方法没被调用,当jsp页面被解析的时候,不管这个js方法有没有被调用这段java代码都会被执行? 因为在解析时最新解析的就是JA ...
- Java实现Excel的操作
JAVA EXCEL API: 开源项目,通过它Java开发人员可以读取Excel文件的内容.创建新的Excel文件.更新已经存在的Excel文件.使用该API非Windows操作系统也可以通过纯Ja ...
- java中的IO操作
IO流是用来处理设备之间的数据传输,Java对数据的操作是通过流的方式进行,而操作流的对象都封装到java.io包中.根据操作数据的种类可以把IO流分为字节流(InputStream,OutputSt ...
- Java通过JNI调用C
Java调用C有多种方式,本文介绍笔者最近的学习过程,避免今后再犯类似的错误. 首先,Java肯定是调用C的动态链接库,即通过编译器编译后的dll/so文件. 下面介绍gcc编译dll的方法. 一般情 ...
- [转]Java远程方法调用
Java远程方法调用,即Java RMI(Java Remote Method Invocation)是Java编程语言里,一种用于实现远程过程调用的应用程序编程接口.它使客户机上运行的程序可以调用远 ...
- JAVA中的时间操作
java中的时间操作不外乎这四种情况: 1.获取当前时间 2.获取某个时间的某种格式 3.设置时间 4.时间的运算 好,下面就针对这四种情况,一个一个搞定. 一.获取当前时间 有两种方式可以获得,第一 ...
- Java数据库连接--JDBC调用存储过程,事务管理和高级应用
相关链接:Jdbc调用存储过程 一.JDBC常用的API深入详解及存储过程的调用 1.存储过程的介绍 我们常用的操作数据库语言SQL语句在执行的时候要先进行编译,然后执行,而存储过程是在大型数据库系统 ...
随机推荐
- [修正] Firemonkey SpeedButton 鼠标移开按钮后 IsPressed 为 False 的问题
未修正: 修正代码: 请将 FMX.StdCtrls.pas 复制到自己的工程目录下,再修改如下代码: procedure TCustomButton.RestoreButtonState; begi ...
- android4.4 重启的开机不播放开机铃声,按power键的开机播放开机铃声
平台:A33Android4.4Linux3.4 功能描述:实现重启的开机不播放开机铃声,按power键的开机播放开机铃声 一,无论关机还是重启都会经过rebootOrShutdown这个方法,在方法 ...
- 【非原创】Game23
#include<stdio.h>int main(){ int n,m,x=0,flag=0; scanf("%d%d",&n,&m); x=m/n; ...
- python中Excel表操作
python中关于excel表个的操作 使用 python中的xlwt和xlrd模块进行操作 # 2003之前:Excel:xls# 2003之后:Excel:xlsx# xlrd:读取的模块:xls ...
- Spring Cloud学习入门路线方案
Spring Cloud 为开发者提供了在分布式系统(如配置管理.服务发现.断路器.智能路由.微代理.控制总线.一次性Token.全局锁.决策竞选.分布式会话和集群状态)操作的开发工具.本Spring ...
- 20155227 2016-2017-2《Java程序设计》课程总结
20155227 2016-2017-2<Java程序设计>课程总结 (按顺序)每周作业链接汇总 预备作业1:我眼中的师生关系. 预备作业2:一些简单的C语言知识回顾,并总结之前一些成功的 ...
- 20155236 《Java程序设计》实验三(敏捷开发与XP实践)实验报告
20155236 <Java程序设计>实验三(敏捷开发与XP实践)实验报告 一.实验内容及步骤 XP基础 XP核心实践 相关工具 实验内容 1.在IDEA中使用工具(Code->Re ...
- Drupal7 针对特定条件才显示区块
当D7中开启PHP filter模块. Text format就会多出“PHP Code”选项. 而且,新建block时也会多出"Pages on which PHP code return ...
- Drupal学习(19) 使用jQuery
本节学习如果在Drupal里交互使用jQuery. jQuery在Drupal是内置支持的.存在根目录的misc目录中. 当调用drupal_add_js方法,会自动加载jQuery. 在Drupal ...
- win7升级到win10,出现算术运算溢出问题
前台winform,后台java代码是: OutputStream ou=(OutputStream)response.getOutputStream(); ou.write(rightSet.get ...