如何通过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语句在执行的时候要先进行编译,然后执行,而存储过程是在大型数据库系统 ...
随机推荐
- hive工作记录-20180513
Hive的数据导入: 1.从本地文件系统中导入数据到Hive表 基础语法1 : create table 表名(列名1 数据类型, 列名2 数据类型, … …) row format delimite ...
- Linux CentOS Python开发环境搭建教程
CentOS安装Python 1.CentOS已经自带安装了2.x版本,先尝试python命令检查已安装的版本.如果你使用rpm.yum或deb命令安装过,请使用相对命令查询. 2.复制安装文件链 ...
- x01.SportWeb: An Example for AspNetCore 2.0
新的刚来到,旧的就忘掉.学习 AspNet Core 2.0,没有好的例子,是很痛苦的.<Pro ASP.NET Core MVC 2>中的 SportsStore值得一看,不妨下载研究一 ...
- Websocket 临时参考网站
https://blog.csdn.net/SGuniver_22/article/details/74273839 https://www.zhihu.com/question/20215561 h ...
- leetcode记录-回文数
判断一个整数是否是回文数.回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数. 示例 1: 输入: 121 输出: true 示例 2: 输入: -121 输出: false 解释: 从左向 ...
- 机器人操作系统ROS-工作空间的建立
运行例子为重德智能的github中的robot_sim_demo 创建一个robot_ws工作空间 1. mkdir -p robot_ws/src #创建catkin 工作空间 2. cd ro ...
- 20155305 2016-2017-2 《Java程序设计》实验二 Java面向对象程序设计
实验二 Java面向对象程序设计 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设计模式 实验步骤 单元测试 1. ...
- 20155320 2016-2017-3 《Java程序设计》第三周学习总结
20155320 2016-2017-3 <Java程序设计>第三周学习总结 教材学习内容总结 定义类 步骤: 在程序中定义类 使用new关键词新建一个对象 声明参考名称,并将名称参考至新 ...
- [agc006F]Blackout
Description 传送门 Solution 这道题的操作是真的得服气..感谢各位大佬的指导. 首先我们看看答案的最大值:1010.哦不,这不可能存在,我们肯定不可能一轮轮枚举点进行扩展的. 所以 ...
- springboot+security+JWT实现单点登录
本次整合实现的目标:1.SSO单点登录2.基于角色和spring security注解的权限控制. 整合过程如下: 1.使用maven构建项目,加入先关依赖,pom.xml如下: <?xml v ...