PL/SQL和Java開發Oracle8i應用程式(1)

來源:互聯網
上載者:User

隨著Oracle8i的發布,Oracle 在資料庫裡支援了二種主要的程式設計語言PL/SQL和Java。今天,Oracle的許多客戶既使用PL/SQL建立資料庫應用程式,也使用Java建立資料庫應用程式。既然存在二種資料庫程式設計語言,那麼就有一個很自然的問題:建立Oracle8i應用程式時,PL/SQL和Java 哪一個更好?

我們來快速地回顧一下,PL/SQL給Oracle資料庫開發人員提供了強大的功能,包括:高效能、易使用、無縫地與SQL結合,以及強壯性。現在,PL/SQL依舊是一個成熟的開發資料庫應用程式的過程性語言,而且是建立SQL密集型和資料密集型應用程式的理想語言。隨著Oracle8i的推出,Oracle 在資料庫裡引入了Java,給這種十分流行的通用語言提供了強壯的、大規模的平台。

利用企業JavaBean和CORBA,可以用Java開發多層、面向組件的應用程式;也可以用Java開發傳統的資料庫預存程序。Oracle8i 提供了多種特性,可以簡化用PL/SQL和Java建立應用程式的過程,而且可以容易地把二種語言編寫的應用程式組合起來。

本文提供了有關Oracle8i中PL/SQL和Java特性的技術概述,並就如何利用它們建立應用程式提供了實際可行的指導。分成四個部分:由於許多Oracle 客戶都有現存的PL/SQL應用程式,所以,我們開始時,先描述如何現有的PL/SQL程式與Java組合,擴充現有PL/SQL程式;然後,我們描述二種語言裡共有的應用程式編程特性,解釋如何把PL/SQL和Java共同使用;在第三部分,描述怎樣利用PL/SQL和Java 建立應用程式才算最好(例如:什麼時候用PL/SQL最合適,什麼時候用Java最合適);最後,我們討論一些真實的例子,實際示範Oracle的客戶們目前在Oracle8i裡是如何使用PL/SQL和Java的。

用PL/SQL和JAVA建立應用程式

開始,我們首先看一下擁有PL/SQL應用程式的客戶的情境:客戶們想在伺服器裡增加新的Java代碼,從而擴充原有的PL/SQL應用程式。有三個特別的問題需要考慮:第一,Oracle8i裡支援的主要預存程序類型是什麼,可以用什麼途徑調用它們;第二,Java在Oracle8i裡如何工作,Java如何同PL/SQL互操作;第三,Oracle8i 伺服器如何處理PL/SQL和Java之間的名稱解析。在整個教程裡, “Java”這個單詞,既指標準的Java,也指SQLJ (Java裡的嵌入SQL),只有在明確地表明討論不同概念時,才表示不同的意思。

Oracle8i中預存程序的類型

Oracle8i支援的預存程序類型有幾種?Oracle8i 支援四種不同類型的預存程序用PL/SQL或Java,都可以實現全部四種類型的預存程序。這四種預存程序類型是:

預存程序頂級預存程序允許客戶用任意商業邏輯擴充SQL。客戶用名稱調用預存程序,可以在SQL、PL/SQL包、以及“頂級”位置上調用預存程序。

儲存函數儲存函數實質上與預存程序相同,不同之處在於儲存函數向調用者傳回值。可以用名稱調用儲存函數,也可以在SQL、PL/SQL包、以及“頂級”位置上調用儲存函數。

資料庫觸發器:觸發器是與特定的表和視圖關聯的商業規則,修改對錶或視圖時,SQL自動調用觸發器。Oracle8i 提供了幾種類型的觸發器:在SQLDML語句執行之前或之後激發的觸發器;在每一行更新之前或之後激發的觸發器;事件觸發程序(例如:登入、退出、DDL語句、資料庫啟動或關閉等的觸發器);替代(instead-of)觸發器。所有這些觸發器類型,都可以用PL/SQL或Java編寫。

物件類型方法 Oracle8 ™ 發行版8.0和Oracle8i提供了用SQL定義複合資料型別的能力。這些物件類型的方法,可以用Java實現,也可用PL/SQL實現。例如,可以用SQL定義一個訂單物件類型purchase_order_t,如下所示:

CREATE TYPE purchase_order_t AS OBJECT (
pono NUMBER,
custref REF customer_info_t,
orderdate DATE,
shipdate DATE,
line_item_list line_item_list_t,
shiptoaddr address_t,
MEMBER FUNCTION
total_value RETURN NUMBER,
) ;

然後實現這個物件類型的方法:

CREATE OR REPLACE TYPE BODY purchase_order_t AS
MEMBER FUNCTION total_value RETURN NUMBER IS
i INTEGER;
stock stock_info_t;
line_item line_item_t;
total NUMBER := 0;
cost NUMBER;
BEGIN
// 在這裡插入具體的PL/SQL代碼或者譯Java預存程序的調用。
END;

在Oracle 8i 裡,這四種儲存程式類型的每一種,都可以從不同的調用環境調用,這些調用環境是:

SQL語句可以在任何SQL語句內部調用函數。頂級CALL文法使用CALL語句,可以在頂級調用過程和函數。CALL是隨Oracle8i新引進的文法。PL/SQL塊、子程式、包可以在PL/SQL子程式、包或匿名塊裡調用它們。請注意:Java儲存程式自己可以在匿名的BEGIN … END 塊內被調用。觸發器的隱式調用。最後,PL/SQL或Java預存程序可以在觸發器執行的時候,隱式地被調用。

把JAVA與現存的PL/SQL程式結合

要想理解如何才能把Java 應用程式和現有的PL/SQL預存程序結合起來,我們首先要理解開發Java預存程序的三個步驟:

第一步:編寫Java 預存程序:第一步是編寫要做成預存程序的Java程式。可以用標準的Java編寫,也可以用SQLJ編寫?因為預存程序通常都是SQL密集型的,所以用SQLJ編寫預存程序,是一個效率較高的方法。

public class Foo {
public static String prependHello(String tail) {
return "Hello " + tail;}}

第二步:步署、發布預存程序:用Java開發工具編寫完Java程式後,要把它裝載進Oracle8i。要用Oracle提供的loadjava命令列工具,以源檔案、二進位檔案、.class類檔案、Java .jar歸檔檔案的形式,把Java程式裝載進Oracle8i中的目標資料庫大綱。Loadjava是一個Java程式,它用Oracle的JDBC驅動程式串連伺服器,自動把一組Java程式裝載進伺服器。(還可以使用CREATE JAVA這個工具,它是SQL*Plus的SQLDDL命令)

>loadjava -user scott/tiger@oudelsrv-1:5521:ORCL Foo.class

命令執行之後,會把類foo的方法裝入scott的大綱(請參閱第後面有關Java、SQL和PL/SQL名稱的內容,瞭解命名空間解析的問題)。下一步是,把方法登記到SQL上。這一步為什麼是必不可少的呢?如果只用PL/SQL,就沒有必要顯式地把PL/SQL過程登記到SQL上?對SQL來說,每個PL/SQL過程自動就是可見的。反之,在使用Java的時候,所有的Java方法對SQL來說都是不可見的?要讓一個Java方法能夠作為預存程序,在SQL裡調用它,就必須顯式地把它“發布”到SQL當中。Java 類和方法不會自動地發布到資料字典、SQL和PL/SQL裡,原因有二:

Java應用程式裡的大多數方法,通常是由其它Java程式調用;而且Java到Java的調用,發生在Java虛擬機器環境裡,沒有必要暴露給SQL。

SQL編譯器需要有關SQL資料類型到Java資料類型如何映射參數的指導,還需要正確重載調用的資訊,以便給出與原始實際參數值對應的SQL資料類型。這需要開發人員的幹預,所以只有某些頂級Java方法需要在SQL和PL/SQL裡調用。


相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.