天天看點

java執行db2指令_如何通過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

-----------

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

buff.append(args[i]);

if(i

buff.append(" ");

}

}

}

}

}

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語句在執行的時候要先進行編譯,然後執行,而存儲過程是在大型資料庫系統 ...

随機推薦

C#建立委托執行個體

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace MyDe ...

在uwp仿制WPF的Window

移植WPF軟體到uwp時碰到用作對話框的Window有多種處理選擇.我個人認為最省事的是用ContentDialog模拟Window. 比如你想把上面這個WPF窗體弄到uwp裡面去 1.修改Conte ...

(轉)html5開發之viewport使用

原文:http://www.php100.com/html/webkaifa/HTML5/2012/0831/10979.html 随着高端手機(Andriod,Iphone,Ipod,WinPhon ...

Android 橫屏時禁止輸入法全屏

在自己EditText的xml裡加上屬性 android:imeOptions="flagNoExtractUi"

stack around the variable “XX” was corrupted

晚上花了幾個小時fix了這個惱人的BUG!“在變量XX周圍的堆棧已損壞” 在網上找到的解釋是: 把“project->配置屬性->c/c++->代碼生成->基本運作時檢查 設定 ...

内容寫到 csv 格式的檔案中 及 讀取 csv 格式的檔案内容

Oracle自治事務

定        義: Autonomous transactions are independent transactions that can be called from within anot ...

微信公衆平台接口,asp.net實作

原文:微信公衆平台接口,asp.net實作 我為自己的笑話網開發了一個微信公衆平台的接口,在這裡分享給大家,希望能對朋友們有幫助,如果有什麼地方寫的不好,好請大家指點! 首先是要進行認證,認證的時候, ...

Apache自帶 ab壓測工具 Windows配置使用說明 - 随筆記錄

我們先來了解一下ab工具的概念,摘自網絡: ab是apache自帶的壓力測試工具.ab非常實用,它不僅可以對apache伺服器進行網站通路壓力測試,也可以對或其它類型的伺服器進行壓力測試.比如ngin ...

IIS安裝以及釋出

控制台-所有控制台項-程式和功能-打開或關閉windows功能-Internet 資訊服務,裡面全部打鈎點選确實.安裝完成.     控制台-管理工具-Internet 資訊服務管理器-輕按兩下打開 ...

上一篇: [恢]hdu 2114
下一篇: [恢]hdu 1321