引言:我們在工作中常用作業系統指令和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 資訊服務管理器-輕按兩下打開 ...