Oracle Java存儲(chǔ)過程訪問異構(gòu)數(shù)據(jù)庫的方案
以下的文章主要介紹的是如何用Oracle Java的存儲(chǔ)過程來訪問異構(gòu)數(shù)據(jù)庫的實(shí)際操作,我們都知道在通常的企業(yè)實(shí)際應(yīng)用中,Oracle數(shù)據(jù)庫的類型可能會(huì)有多種,這些異構(gòu)數(shù)據(jù)庫之間的互連往往成為某個(gè)應(yīng)用的瓶頸。
解決的辦法有多種,一是透過應(yīng)用程序作為橋梁,在異構(gòu)數(shù)據(jù)庫之間牽線搭橋;二是數(shù)據(jù)庫廠商提供的解決方案,比如SQL Server的Link Server, Oracle的Transparent Gateway技術(shù);三是 通過數(shù)據(jù)庫的應(yīng)用擴(kuò)展接口,例如Oracle的PL/SQL允許透過Java擴(kuò)展訪問外部數(shù)據(jù)庫。
本文著眼于第三點(diǎn),以O(shè)racle連接SQL Server為例,探討如何利用Java編寫PL/SQL訪問SQL Server,這點(diǎn)對(duì)于那些需要在非WINDOWS平臺(tái)下訪問SQL Server的Oracle應(yīng)用特別有意義。
本文中系統(tǒng)配置如下。
一、硬件及操作系統(tǒng)
Dell Intel Xeon Server + Windows2000 Server
二、數(shù)據(jù)庫環(huán)境
Oracle 8.1.7
三、安裝
欲使Oracle支持Java,必須在Oracle上安裝Jserver組件。在安裝Oracle軟件的時(shí)候,如果選擇典型安裝,Jserver是默認(rèn)安裝的,如果選擇自定義安裝,記得選擇Jserver組件。還有另一種方法可以手工安裝Jserver.辦法是:
進(jìn)入Oracle安裝目錄下的\javavm\install目錄,以sys用戶的身份執(zhí)行initjvm.sql,這個(gè)腳本會(huì)為數(shù)據(jù)庫配置一個(gè)Java運(yùn)行環(huán)境,同時(shí)會(huì)把基本的java類庫裝載到數(shù)據(jù)庫中去。建議在執(zhí)行此腳本之前,先閱讀\javavm\readme.txt文件,里面包括安裝前對(duì)數(shù)據(jù)庫某些配置的必要修改的說明,以及對(duì)腳本執(zhí)行出錯(cuò)的處理描述。
腳本執(zhí)行時(shí)間大約10分鐘,如果失敗可以重新執(zhí)行。
在腳本執(zhí)行完畢后,用DBA Studio工具可以看到多了Jserver這個(gè)東西。
四、權(quán)限賦予
要能在Oracle中執(zhí)行Java存儲(chǔ)過程,需要一個(gè)javauserpriv的角色,這個(gè)角色在安裝Jserver后會(huì)自動(dòng)創(chuàng)建,將此角色賦給各個(gè)Oracle的使用賬號(hào)。
五、編寫Oracle Java存儲(chǔ)過程
1、 在本地機(jī)器上編寫一個(gè)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類文件上傳到數(shù)據(jù)庫中。
例如:C:\>loadjava –u test/oracle@mytest -o –v –r d:\TEST.java
當(dāng)然,除了上載.java文件,也可以上載.class/.jar/.properties文件,上載后的文件在數(shù)據(jù)庫中會(huì)以O(shè)bject的形式存在.
文件若有改動(dòng),可以重新上載,會(huì)將以前的版本覆蓋掉。
3、 生成聲明接口
上載的java類需要發(fā)布成一個(gè)可供調(diào)用的接口,這些接口可以是Store Procesure/Trrigger/Function 等。
- SQL>create or replace procedure test_java
- as language java
- name 'TEST.main(java.lang.String[])';
- /
4、 測(cè)試
- SQL> set serveroutput on size 5000
- SQL> call dbms_java.set_output(5000);
調(diào)用完成。
- SQL> execute test_java;
- HELLO THIS iS A JAVA PROCEDURE
PL/SQL 過程已成功完成。
- SQL> call test_java();
- HELLO THIS iS A JAVA PROCEDURE
調(diào)用完成。
5、 以上是一個(gè)簡(jiǎn)單的java 類,其實(shí)如果要在Oracle中訪問到非Oracle的數(shù)據(jù)庫,只
要在java 類中實(shí)現(xiàn)訪問非Oracle數(shù)據(jù)庫就可以了。
- 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為你的數(shù)據(jù)庫的
- 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;
- }
值得注意的一點(diǎn)是,通過java存儲(chǔ)訪問SQL Server,如果返回一個(gè)結(jié)果集,在9i以下的Oracle版本是沒有對(duì)應(yīng)的數(shù)據(jù)類型可以轉(zhuǎn)換的,一個(gè)可以變通的辦法是要么返回一個(gè)字符串,要么將返回的結(jié)果集存放到Oracle中的表里。這樣做是為了方便那些非Windows平臺(tái)下無法直接訪問SQL Server的程序。
六、外部程序調(diào)用Oracle java存儲(chǔ)過程
調(diào)用java存儲(chǔ)過程的方法跟調(diào)用一般的Oracle Java存儲(chǔ)過程的方法是一樣的.
【編輯推薦】


















