程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle數據庫基礎 >> Oracle Java存儲過程訪問異構數據庫的方案

Oracle Java存儲過程訪問異構數據庫的方案

編輯:Oracle數據庫基礎

以下的文章主要介紹的是如何用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類。

  1. public class TEST  
  2. {  
  3. public static void main (String args[])   
  4. {  
  5. System.out.println("HELLO THIS iS A Java PROCEDURE");  
  6. }  
  7. }  
  8. <?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 等。

  1. SQL>create or replace procedure test_Java   
  2. as language Java   
  3. name 'TEST.main(Java.lang.String[])';  

4、 測試

  1. SQL> set serveroutput on size 5000  
  2. SQL> call dbms_Java.set_output(5000); 

調用完成。

  1. SQL> execute test_Java;  
  2. HELLO THIS iS A Java PROCEDURE 

PL/SQL 過程已成功完成。

  1. SQL> call test_Java();  
  2. HELLO THIS iS A Java PROCEDURE 

調用完成。

5、 以上是一個簡單的Java 類,其實如果要在Oracle中訪問到非Oracle的數據庫,只

要在Java 類中實現訪問非Oracle數據庫就可以了。

  1. public static String getStringFomSql(){  
  2. String strResult ="";  
  3. Connection conn = null;  
  4. Statement stmt = null;  
  5. ResultSet rs = null;  
  6. try {  
  7. Class.forName("com.inet.tds.TdsDriver").newInstance();   
  8. String url="jdbc:inetdae7:10.24.09.192:1433?database=pubs";   

pubs為你的數據庫的

  1. String user="sa";   
  2. String passWord="123";   
  3. connDriverManager.getConnection(url,user,passWord);   
  4. String sql="select top 1 dtype,dname from test";   
  5. stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);   
  6. rs=stmt.executeQuery(sql);   
  7. if( rs.next()){  
  8. strResult = "The result from sql server is:dtype->" + rs.getString("dtype") + " dname->" + rs.getString("dname");  
  9. }  
  10. } catch (InstantiationException e) {  
  11. TODO Auto-generated catch block  
  12. e.printStackTrace();  
  13. strResult = "Operator fail in InstantiationException";  
  14. } catch (IllegalAccessException e) {  
  15. TODO Auto-generated catch block  
  16. e.printStackTrace();  
  17. strResult = "Operator fail in IllegalAccessException";  
  18. } catch (ClassNotFoundException e) {  
  19. TODO Auto-generated catch block  
  20. e.printStackTrace();  
  21. strResult = "Operator fail in ClassNotFoundException";  
  22. } catch (SQLException e) {  
  23. TODO Auto-generated catch block  
  24. e.printStackTrace();  
  25. strResult = "Operator fail in SQLException";  
  26. }  
  27. finally{  
  28. try {  
  29. rs.close();  
  30. conn.close();  
  31. } catch (SQLException e1) {  
  32. e1.printStackTrace();  
  33. }  
  34. }  
  35. return strResult;  
  36. }  


值得注意的一點是,通過Java存儲訪問SQL Server,如果返回一個結果集,在9i以下的Oracle版本是沒有對應的數據類型可以轉換的,一個可以變通的辦法是要麼返回一個字符串,要麼將返回的結果集存放到Oracle中的表裡。這樣做是為了方便那些非Windows平台下無法直接訪問SQL Server的程序。

六、外部程序調用Oracle Java存儲過程

調用java存儲過程的方法跟調用一般的Oracle Java存儲過程的方法是一樣的.

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved