以下的文章主要介紹的是如何用Oracle Java的存儲過程來訪問異構數據庫的實際操作,我們都知道在通常的企業實際應用中,Oracle數據庫的類型可能會有多種,這些異構數據庫之間的互連往往成為某個應用的瓶頸。
解決的辦法有多種,一是透過應用程序作為橋梁,在異構數據庫之間牽線搭橋;二是數據庫廠商提供的解決方案,比如SQL Server的Link Server, Oracle的Transparent Gateway技術;三是 通過數據庫的應用擴展接口,例如Oracle的PL/SQL允許透過Java擴展訪問外部數據庫。
本文著眼於第三點,以Oracle連接SQL Server為例,探討如何利用Java編寫PL/SQL訪問SQL Server,這點對於那些需要在非Windows平台下訪問SQL Server的Oracle應用特別有意義。
本文中系統配置如下。
一、硬件及操作系統
Dell Intel Xeon Server + Windows2000 Server
二、數據庫環境
Oracle 8.1.7
三、安裝
欲使Oracle支持Java,必須在Oracle上安裝Jserver組件。在安裝Oracle軟件的時候,如果選擇典型安裝,Jserver是默認安裝的,如果選擇自定義安裝,記得選擇Jserver組件。還有另一種方法可以手工安裝JServer.辦法是:
進入Oracle安裝目錄下的\javavm\install目錄,以sys用戶的身份執行initjvm.sql,這個腳本會為數據庫配置一個Java運行環境,同時會把基本的java類庫裝載到數據庫中去。建議在執行此腳本之前,先閱讀\Javavm\readme.txt文件,裡面包括安裝前對數據庫某些配置的必要修改的說明,以及對腳本執行出錯的處理描述。
腳本執行時間大約10分鐘,如果失敗可以重新執行。
在腳本執行完畢後,用DBA Studio工具可以看到多了JServer這個東西。
四、權限賦予
要能在Oracle中執行Java存儲過程,需要一個Javauserpriv的角色,這個角色在安裝JServer後會自動創建,將此角色賦給各個Oracle的使用賬號。
五、編寫Oracle Java存儲過程
1、 在本地機器上編寫一個Java類。
- public class TEST
- {
- public static void main (String args[])
- {
- System.out.println("HELLO THIS iS A Java PROCEDURE");
- }
- }
- <?XML:namespace prefix = o ns = "urn:schemas-microsoft-com:office:Office" />
2、 用loadjava指令將寫好的Java類文件上傳到數據庫中。
例如:C:\>loadjava –u test/Oracle@mytest -o –v –r d:\TEST.Java
當然,除了上載.Java文件,也可以上載.class/.jar/.propertIEs文件,上載後的文件在數據庫中會以Object的形式存在.
文件若有改動,可以重新上載,會將以前的版本覆蓋掉。
3、 生成聲明接口
上載的Java類需要發布成一個可供調用的接口,這些接口可以是Store Procesure/Trrigger/Function 等。
- SQL>create or replace procedure test_Java
- as language Java
- name 'TEST.main(Java.lang.String[])';
- /
4、 測試
- SQL> set serveroutput on size 5000
- SQL> call dbms_Java.set_output(5000);
調用完成。
- SQL> execute test_Java;
- HELLO THIS iS A Java PROCEDURE
PL/SQL 過程已成功完成。
- SQL> call test_Java();
- HELLO THIS iS A Java PROCEDURE
調用完成。
5、 以上是一個簡單的Java 類,其實如果要在Oracle中訪問到非Oracle的數據庫,只
要在Java 類中實現訪問非Oracle數據庫就可以了。
- public static String getStringFomSql(){
- String strResult ="";
- Connection conn = null;
- Statement stmt = null;
- ResultSet rs = null;
- try {
- Class.forName("com.inet.tds.TdsDriver").newInstance();
- String url="jdbc:inetdae7:10.24.09.192:1433?database=pubs";
pubs為你的數據庫的
- String user="sa";
- String passWord="123";
- conn= DriverManager.getConnection(url,user,passWord);
- String sql="select top 1 dtype,dname from test";
- stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
- rs=stmt.executeQuery(sql);
- if( rs.next()){
- strResult = "The result from sql server is:dtype->" + rs.getString("dtype") + " dname->" + rs.getString("dname");
- }
- } catch (InstantiationException e) {
- TODO Auto-generated catch block
- e.printStackTrace();
- strResult = "Operator fail in InstantiationException";
- } catch (IllegalAccessException e) {
- TODO Auto-generated catch block
- e.printStackTrace();
- strResult = "Operator fail in IllegalAccessException";
- } catch (ClassNotFoundException e) {
- TODO Auto-generated catch block
- e.printStackTrace();
- strResult = "Operator fail in ClassNotFoundException";
- } catch (SQLException e) {
- TODO Auto-generated catch block
- e.printStackTrace();
- strResult = "Operator fail in SQLException";
- }
- finally{
- try {
- rs.close();
- conn.close();
- } catch (SQLException e1) {
- e1.printStackTrace();
- }
- }
- return strResult;
- }
值得注意的一點是,通過Java存儲訪問SQL Server,如果返回一個結果集,在9i以下的Oracle版本是沒有對應的數據類型可以轉換的,一個可以變通的辦法是要麼返回一個字符串,要麼將返回的結果集存放到Oracle中的表裡。這樣做是為了方便那些非Windows平台下無法直接訪問SQL Server的程序。
六、外部程序調用Oracle Java存儲過程
調用java存儲過程的方法跟調用一般的Oracle Java存儲過程的方法是一樣的.