posts - 78,  comments - 48,  trackbacks - 0
          ???

          ?
          Oracle8i中使用Java語(yǔ)言來(lái)開(kāi)發(fā)存儲(chǔ)過(guò)程
          本篇文章來(lái)源與時(shí)代朝陽(yáng)數(shù)據(jù)庫(kù)(原曉通數(shù)據(jù)庫(kù))培訓(xùn)部Oracle?資料庫(kù)。
          在Oracle8i之前,開(kāi)發(fā)人員只能使用PL/SQL來(lái)開(kāi)發(fā)存儲(chǔ)過(guò)程。而在Oracle8i之中,不僅可以使用原有的PL/SQL開(kāi)發(fā)存儲(chǔ)過(guò)程,而且也可以使用Java語(yǔ)言來(lái)開(kāi)發(fā)存儲(chǔ)過(guò)程。本篇文章將簡(jiǎn)單介紹關(guān)于這方面的知識(shí),包括以下內(nèi)容:
          ?
          l???????? 存儲(chǔ)過(guò)程簡(jiǎn)介;
          l???????? Java存儲(chǔ)過(guò)程
          l???????? Java存儲(chǔ)過(guò)程的開(kāi)發(fā)步驟
          l???????? 使用Java開(kāi)發(fā)過(guò)程;
          l???????? 使用Java開(kāi)發(fā)函數(shù);
          l???????? 使用Java開(kāi)發(fā)包;
          l???????? 使用Java開(kāi)發(fā)觸發(fā)器;
          l???????? 使用Java開(kāi)發(fā)對(duì)象方法;
          l???????? 使用JDeveloper開(kāi)發(fā)JSP。 存儲(chǔ)過(guò)程簡(jiǎn)介
          存儲(chǔ)過(guò)程是存儲(chǔ)在數(shù)據(jù)庫(kù)中的一段存儲(chǔ)程序。當(dāng)創(chuàng)建存儲(chǔ)過(guò)程時(shí),系統(tǒng)會(huì)對(duì)其進(jìn)行編譯,并將執(zhí)行代碼存儲(chǔ)到數(shù)據(jù)庫(kù)中。
          ?
          1.???????? 設(shè)計(jì)存儲(chǔ)過(guò)程的方針
          ?
          l???????? 在定義存儲(chǔ)過(guò)程時(shí),要使用其完成單一、相對(duì)集中的任務(wù)。
          l???????? 在定義存儲(chǔ)過(guò)程時(shí),不要定義已經(jīng)由其它特征所提供功能的過(guò)程。例如,不要定義強(qiáng)制數(shù)據(jù)完整性的過(guò)程(使用完整性約束)。
          ?
          2.???????? 存儲(chǔ)過(guò)程的優(yōu)點(diǎn)
          1)??????? 安全性
          ?
          當(dāng)創(chuàng)建了存儲(chǔ)過(guò)程之后,可以將執(zhí)行該過(guò)程的權(quán)限授予其它用戶,從而使得他可以執(zhí)行特定的數(shù)據(jù)庫(kù)操作,而不能訪問(wèn)其它模式對(duì)象(例如表)。例如,你可以將執(zhí)行過(guò)程(更新表)的權(quán)限授予其它用戶,但不授予它們直接訪問(wèn)該表的權(quán)限。
          ?
          2)??????? 性能
          ?
          l???????? 存儲(chǔ)過(guò)程只被發(fā)送到數(shù)據(jù)庫(kù)一次,相對(duì)于SQL語(yǔ)句或PL/SQL塊而言,其網(wǎng)絡(luò)通信量更小。
          l???????? 當(dāng)調(diào)用存儲(chǔ)過(guò)程時(shí),數(shù)據(jù)庫(kù)會(huì)直接運(yùn)行該存儲(chǔ)過(guò)程,無(wú)需進(jìn)行編譯。相對(duì)于SQL語(yǔ)句或PL/SQL塊而言,其執(zhí)行速度更快。
          ?
          3)??????? 內(nèi)存分配
          ?
          存儲(chǔ)過(guò)程充分利用了Oracle共享內(nèi)存的能力。在將存儲(chǔ)過(guò)程裝載到內(nèi)存中后,多個(gè)用戶可以同時(shí)調(diào)用該存儲(chǔ)過(guò)程,從而降低了應(yīng)用對(duì)Oracle的實(shí)際內(nèi)存需求。
          ?
          4)??????? 生產(chǎn)力
          ?
          存儲(chǔ)過(guò)程提高了開(kāi)發(fā)生產(chǎn)力。通過(guò)將公共集合編寫(xiě)為存儲(chǔ)過(guò)程,避免了冗余代碼,從而提高了開(kāi)發(fā)生產(chǎn)力。例如,我們可以編寫(xiě)用于插入、更新、刪除AUTHS表的過(guò)程,此后應(yīng)用可以直接調(diào)用這些過(guò)程,而無(wú)需重寫(xiě)SQL語(yǔ)句。當(dāng)管理數(shù)據(jù)的方法發(fā)生變化時(shí),只需要修改過(guò)程,而不需要對(duì)應(yīng)用進(jìn)行任何修改。 Java存儲(chǔ)過(guò)程
          在以前的Oracle版本中,開(kāi)發(fā)存儲(chǔ)過(guò)程是通過(guò)PL/SQL來(lái)完成的。而在Oracle8i版本中,我們不僅可以使用PL/SQL開(kāi)發(fā)存儲(chǔ)過(guò)程,而且還可以使用Java語(yǔ)言來(lái)開(kāi)發(fā)存儲(chǔ)過(guò)程。
          ?
          1.???????? PL/SQL與Java存儲(chǔ)過(guò)程比較
          ?
          與PL/SQL相比,使用Java語(yǔ)言開(kāi)發(fā)存儲(chǔ)過(guò)程有以下優(yōu)點(diǎn):
          ?
          l???????? Java語(yǔ)言具有更強(qiáng)大的運(yùn)算能力,提供了更多的運(yùn)算方法。當(dāng)要完成進(jìn)行復(fù)雜運(yùn)算的存儲(chǔ)過(guò)程時(shí),使用JSP將是你最好的選擇。
          l???????? PL/SQL只能用于Oracle數(shù)據(jù)庫(kù),而Java語(yǔ)言可以應(yīng)用于更多的數(shù)據(jù)庫(kù)系統(tǒng)(如Sybase、DB2、Informix等等),所以Java存儲(chǔ)過(guò)程將具有更好的兼容性、可移植性。
          ?
          2.???????? JSP分類
          Java存儲(chǔ)過(guò)程包括過(guò)程、函數(shù)、觸發(fā)器以及對(duì)象方法四種類型。
          ?
          3.???????? 調(diào)用JSP的四種方法
          ?
          l???????? CALL語(yǔ)法;
          l???????? DML語(yǔ)句;
          l???????? PL/SQL塊、子程序、包;
          l???????? 由觸發(fā)器隱含調(diào)用。 Java存儲(chǔ)過(guò)程的開(kāi)發(fā)步驟
          1.???????? 編寫(xiě)Java源代碼
          ?
          當(dāng)開(kāi)發(fā)Java存儲(chǔ)過(guò)程時(shí),首先應(yīng)該編寫(xiě)Java源代碼。如下圖所示:
          注意事項(xiàng):
          ?
          l????????? 當(dāng)以public方式聲明類時(shí),類名必須與其文件名完全一致。
          l????????? 只有public static方法可以作為Java存儲(chǔ)過(guò)程。
          ?
          2.???????? 裝載Java代碼及類到Oracle8i數(shù)據(jù)庫(kù)中
          在編寫(xiě)了Java源代碼之后,接下來(lái)應(yīng)該將Java代碼及相應(yīng)的Java類裝載到Oracle8i數(shù)據(jù)庫(kù)中。如下圖所示:
          裝載Java代碼及類到RDBMS有以下兩種方法:
          ?
          l???????? 使用loadjava工具,通過(guò)該工具可以快速裝載Java源代碼(.java)、Java二進(jìn)制代碼(.class)以及Java打包文件(.jar)。
          l???????? 使用CREATE Java、ALTER Java裝載Java代碼。
          ?
          其中,前一種方法相對(duì)簡(jiǎn)單,并且我們推薦你使用這種方法。
          ?
          3.???????? 生成調(diào)用說(shuō)明
          ?
          在裝載了Java類之后,接下來(lái)應(yīng)該生成對(duì)public static方法的調(diào)用說(shuō)明,最終完成Java存儲(chǔ)過(guò)程的開(kāi)發(fā)工作。如下圖所示:
          ?
          完成上述步驟之后,就完成了Java存儲(chǔ)過(guò)程的開(kāi)發(fā)工作,然后就可以調(diào)用并執(zhí)行該Java存儲(chǔ)過(guò)程了。 使用Java開(kāi)發(fā)過(guò)程
          過(guò)程用于執(zhí)行某種操作。需要注意的是,過(guò)程所對(duì)應(yīng)的Java方法返回值必須為空(void)。本節(jié)以創(chuàng)建用于插入、修改和刪除AUTHS表的JSP為例,說(shuō)明使用Java開(kāi)發(fā)過(guò)程的方法。如下圖所示:
          下面講述完成上述任務(wù)的方法及過(guò)程:
          ?
          1.???????? 編寫(xiě)Java源代碼
          ?
          程序清單如下(manipulate_auths.java):
          ?
          /* 導(dǎo)入Java類 */
          import java.sql.*;
          import java.io.*;
          import oracle.jdbc.driver.*;
          ?
          /* 主類 */
          public class manipulate_auths {
          ?
          ? public static void insert_auths
          ??? (String code,String name,int sex,String birthdate,String entry_date_time)
          ? throws SQLException {
          ?
          ??? /* 建立到數(shù)據(jù)庫(kù)的缺省連接 */
          ??? Connection conn = new OracleDriver().defaultConnection();
          ??? /* 構(gòu)造動(dòng)態(tài)SQL語(yǔ)句 */
          String sql = "INSERT INTO auths
          ?(author_code,name,sex,birthdate,entry_date_time) " +
          ???????????????? "VALUES (?,?,?,?,?)";
          ??? /* 使用try ... catch語(yǔ)句抓取并拋出例外 */
          ??? try {
          ????? /* 準(zhǔn)備動(dòng)態(tài)SQL語(yǔ)句 */
          ????? PreparedStatement pstmt = conn.prepareStatement(sql);
          ????? /* 設(shè)置動(dòng)態(tài)SQL參數(shù)值 */
          ????? pstmt.setString(1, code);
          ????? pstmt.setString(2, name);
          ????? pstmt.setInt(3, sex);
          ????? pstmt.setString(4, birthdate);
          ????? pstmt.setString(5, entry_date_time);
          ????? /* 執(zhí)行動(dòng)態(tài)SQL語(yǔ)句 */
          ????? pstmt.executeUpdate();
          ????? /* 關(guān)閉動(dòng)態(tài)SQL語(yǔ)句 */
          ????? pstmt.close();
          ??? } catch (SQLException e) { }
          ? }
          ?
          ? public static void delete_auths (String code)
          ? throws SQLException {
          ?
          ??? /* 建立到數(shù)據(jù)庫(kù)的缺省連接 */
          ??? Connection conn = new OracleDriver().defaultConnection();
          ??? /* 構(gòu)造動(dòng)態(tài)SQL語(yǔ)句 */
          ??? String sql = "DELETE FROM auths? WHERE author_code = ?";
          ??? /* 使用try ... catch語(yǔ)句抓取并拋出例外 */
          ??? try {
          ????? /* 準(zhǔn)備動(dòng)態(tài)SQL語(yǔ)句 */
          ????? PreparedStatement pstmt = conn.prepareStatement(sql);
          ????? /* 設(shè)置動(dòng)態(tài)SQL參數(shù)值 */
          ????? pstmt.setString(1, code);
          ????? /* 執(zhí)行動(dòng)態(tài)SQL語(yǔ)句 */
          ????? pstmt.executeUpdate();
          ????? /* 關(guān)閉動(dòng)態(tài)SQL語(yǔ)句 */
          ????? pstmt.close();
          ??? } catch (SQLException e) { }
          ? }
          ?
          ? public static void modify_salary (String code,float salary)
          ? throws SQLException {
          ?
          ??? /* 建立到數(shù)據(jù)庫(kù)的缺省連接 */
          ??? Connection conn = new OracleDriver().defaultConnection();
          ??? /* 構(gòu)造動(dòng)態(tài)SQL語(yǔ)句 */
          ??? String sql = "UPDATE auths SET salary = ? WHERE author_code = ?";
          ??? /* 使用try ... catch語(yǔ)句抓取并拋出例外 */
          ??? try {
          ????? /* 準(zhǔn)備動(dòng)態(tài)SQL語(yǔ)句 */
          ????? PreparedStatement pstmt = conn.prepareStatement(sql);
          ????? /* 設(shè)置動(dòng)態(tài)SQL參數(shù)值 */
          ????? pstmt.setFloat(1, salary);
          ????? pstmt.setString(2, code);
          ????? /* 執(zhí)行動(dòng)態(tài)SQL語(yǔ)句 */
          ????? pstmt.executeUpdate();
          ????? /* 關(guān)閉動(dòng)態(tài)SQL語(yǔ)句 */
          ????? pstmt.close();
          ??? } catch (SQLException e) { }
          ? }
          }
          2.???????? 裝載Java代碼及類到Oracle8i數(shù)據(jù)庫(kù)中
          ?
          在編寫(xiě)了Java源代碼之后,就可以將Java對(duì)象裝載到Oracle8i數(shù)據(jù)庫(kù)中了。下面是完成這項(xiàng)任務(wù)的方法:
          ?

          ?
          3.???????? 發(fā)行Java,生成調(diào)用說(shuō)明
          ?
          在裝載了Java類后,就可以發(fā)行該Java類,并生成調(diào)用其方法的過(guò)程說(shuō)明了。下面是完成該項(xiàng)任務(wù)的方法:
          ?




          ?
          4.???????? 調(diào)用JSP
          在生成了調(diào)用Java方法的過(guò)程說(shuō)明之后,我們就可以調(diào)用JSP了。例如:
          ?

          使用Java開(kāi)發(fā)函數(shù)
          函數(shù)用于返回特定數(shù)據(jù)。本節(jié)將通過(guò)創(chuàng)建用于返回作者的文章標(biāo)題,以及某種類型的文章個(gè)數(shù)為例,說(shuō)明使用Java開(kāi)發(fā)函數(shù)的方法。如下圖所示:
          ?
          ?
          下面講述完成上述任務(wù)的方法和過(guò)程。
          ?
          1.???????? 編寫(xiě)Java源代碼
          ?
          程序清單如下(query_article.java):
          ?
          /* 導(dǎo)入Java類 */
          import java.sql.*;
          import java.io.*;
          import oracle.jdbc.driver.*;
          ?
          /* 主類 */
          public class query_article {
          ?
          ? public static String auths_article(String code)
          ? throws SQLException {
          ?
          ??? /* 建立到數(shù)據(jù)庫(kù)的缺省連接 */
          ??? Connection conn = new OracleDriver().defaultConnection();
          ??? /* 構(gòu)造動(dòng)態(tài)SQL語(yǔ)句 */
          ??? String sql1 = "SELECT name FROM auths WHERE author_code=?";
          ??? String sql2 = "SELECT title FROM article WHERE author_code=?";
          ??? /* 聲明并初始化auths_article變量 */
          ??? String auths_article = new String();
          ??? /* 使用try ... catch語(yǔ)句抓取并拋出例外 */
          ??? try {
          ????? /* 準(zhǔn)備動(dòng)態(tài)SQL語(yǔ)句 */
          ????? PreparedStatement pstmt = conn.prepareStatement(sql1);
          ????? /* 設(shè)置動(dòng)態(tài)SQL參數(shù)值 */
          ????? pstmt.setString(1, code);
          ????? /* 執(zhí)行查詢,并將結(jié)果保存到結(jié)果集中 */
          ????? ResultSet rset = pstmt.executeQuery();
          ????? /* 循環(huán)獲取并處理結(jié)果集數(shù)據(jù) */
          ????? while(rset.next())
          ??????? auths_article =auths_article + rset.getString(1);
          ????? /* 關(guān)閉結(jié)果集 */
          ????? rset.close();
          ????? /* 關(guān)閉動(dòng)態(tài)SQL語(yǔ)句 */
          ????? pstmt.close();
          ??? } catch (SQLException e) {}
          ??? auths_article = auths_article + "所編寫(xiě)文章的標(biāo)題如下:\n";
          ?
          ??? try {
          ????? /* 準(zhǔn)備動(dòng)態(tài)SQL語(yǔ)句 */
          ????? PreparedStatement pstmt = conn.prepareStatement(sql2);
          ????? /* 設(shè)置動(dòng)態(tài)SQL參數(shù)值 */
          ????? pstmt.setString(1, code);
          ????? /* 執(zhí)行查詢,并將結(jié)果保存到結(jié)果集中 */
          ????? ResultSet rset = pstmt.executeQuery();
          ????? /* 循環(huán)獲取并處理結(jié)果集數(shù)據(jù) */
          ????? while(rset.next()) {
          ??????? auths_article =auths_article + "??? " + rset.getString(1) + "\n";
          ????? }
          ????? /* 關(guān)閉結(jié)果集 */
          ????? rset.close();
          ????? /* 關(guān)閉動(dòng)態(tài)SQL語(yǔ)句 */
          ????? pstmt.close();
          ??? } catch (SQLException e) {}
          ??? return auths_article;
          ? }
          ?
          ? public static String query_type_article_number(String code)
          ? throws SQLException {
          ?
          ??? /* 建立到數(shù)據(jù)庫(kù)的缺省連接 */
          ??? Connection conn = new OracleDriver().defaultConnection();
          ??? /* 構(gòu)造動(dòng)態(tài)SQL語(yǔ)句 */
          ??? String sql = "SELECT count(*) FROM article WHERE article_code IN "
          ?????? + "(SELECT article_code FROM article_type WHERE type_code=?)";
          ??? String article_number = new String("類型為" + code + "的文章共有 ");
          ??? /* 使用try ... catch語(yǔ)句抓取并拋出例外 */
          ??? try {
          ????? /* 準(zhǔn)備動(dòng)態(tài)SQL語(yǔ)句 */
          ????? PreparedStatement pstmt = conn.prepareStatement(sql);
          ????? /* 設(shè)置動(dòng)態(tài)SQL參數(shù)值 */
          ????? pstmt.setString(1, code);
          ? ????/* 執(zhí)行查詢,并將結(jié)果保存到結(jié)果集中 */
          ????? ResultSet rset = pstmt.executeQuery();
          ????? /* 循環(huán)獲取并處理結(jié)果集數(shù)據(jù) */
          ????? while(rset.next())
          ??????? article_number = article_number + rset.getString(1) + "篇";
          ????? /* 關(guān)閉結(jié)果集 */
          ????? rset.close();
          ????? /* 關(guān)閉動(dòng)態(tài)SQL語(yǔ)句 */
          ????? pstmt.close();
          ??? } catch (SQLException e) {}
          ??? return article_number;
          ? }
          }
          ?
          2.???????? 裝載Java代碼及類到Oracle8i數(shù)據(jù)庫(kù)中
          ?
          在編寫(xiě)了Java源代碼之后,就可以將Java對(duì)象裝載到Oracle8i數(shù)據(jù)庫(kù)中了。下面是完成這項(xiàng)任務(wù)的方法:

          ?
          3.???????? 發(fā)行Java,生成調(diào)用說(shuō)明
          ?
          在裝載了Java類后,就可以發(fā)行該Java類,并生成調(diào)用其方法的函數(shù)說(shuō)明了。下面是完成該項(xiàng)任務(wù)的方法:
          ?


          ?
          4.???????? 調(diào)用JSP
          ?
          在生成了調(diào)用Java方法的函數(shù)說(shuō)明之后,就可以調(diào)用這些函數(shù)了。例如:
          ?
          使用Java開(kāi)發(fā)
          Java類用于封裝Java方法,與此類似,包用于封裝過(guò)程和函數(shù)等。本節(jié)將通過(guò)創(chuàng)建用于管理表subject的包為例,說(shuō)明使用Java開(kāi)發(fā)包的方法。如下圖所示:
          ?

          ?
          下面講述完成上述任務(wù)的方法和過(guò)程。
          ?
          1.???????? 編寫(xiě)Java源代碼
          ?
          程序清單如下(manage_subject.java):
          ?
          /* 導(dǎo)入Java類 */
          import java.sql.*;
          import java.io.*;
          import oracle.jdbc.driver.*;
          ?
          /* 主類 */
          public class manage_subject {
          ?
          ? public static String query_subject()
          ? throws SQLException {
          ??? /* 建立到數(shù)據(jù)庫(kù)的缺省連接 */
          ??? Connection conn = new OracleDriver().defaultConnection();
          ??? /* 構(gòu)造SQL語(yǔ)句 */
          ??? String sql = "SELECT * FROM subject";
          ??? /* 聲明并初始化subject變量 */
          ??? String subject = new String();
          ??? /* 使用try ... catch語(yǔ)句抓取并拋出例外 */
          ??? try {
          ????? /* 創(chuàng)建Statement對(duì)象 */
          ????? Statement stmt = conn.createStatement();
          ????? /* 執(zhí)行SQL語(yǔ)句,并將查詢結(jié)果賦給結(jié)果集 */
          ????? ResultSet rset = stmt.executeQuery(sql);
          ????? /* 循環(huán)獲取并處理結(jié)果集變量 */
          ????? while(rset.next())
          ??????? subject = subject + rset.getString(1) + "\n";
          ????? /* 關(guān)閉結(jié)果集 */
          ????? rset.close();
          ??? } catch (SQLException e) {}
          ??? return subject;
          ? }
          ?
          ? public static void insert_subject(String subject)
          ? throws SQLException {
          ?
          ??? /* 建立到數(shù)據(jù)庫(kù)的缺省連接 */
          ??? Connection conn = new OracleDriver().defaultConnection();
          ??? /* 構(gòu)造動(dòng)態(tài)SQL語(yǔ)句 */
          ??? String sql = "INSERT INTO subject VALUES(?)";
          ??? /* 使用try ... catch語(yǔ)句抓取并拋出例外 */
          ??? try {
          ????? /* 準(zhǔn)備動(dòng)態(tài)SQL語(yǔ)句 */
          ????? PreparedStatement pstmt = conn.prepareStatement(sql);
          ????? /* 設(shè)置動(dòng)態(tài)SQL參數(shù)值 */
          ????? pstmt.setString(1, subject);
          ????? /* 執(zhí)行動(dòng)態(tài)SQL語(yǔ)句 */
          ????? pstmt.executeUpdate();
          ????? /* 關(guān)閉動(dòng)態(tài)SQL語(yǔ)句 */
          ????? pstmt.close();
          ??? } catch (SQLException e) {}
          ? }
          ?
          ? public static void delete_subject(String subject)
          ? throws SQLException {
          ?
          ??? /* 建立到數(shù)據(jù)庫(kù)的缺省連接 */
          ??? Connection conn = new OracleDriver().defaultConnection();
          ??? /* 構(gòu)造動(dòng)態(tài)SQL語(yǔ)句 */
          ??? String sql = "DELETE FROM subject WHERE subject=?";
          ??? /* 使用try ... catch語(yǔ)句抓取并拋出例外 */
          ??? try {
          ????? /* 準(zhǔn)備動(dòng)態(tài)SQL語(yǔ)句 */
          ????? PreparedStatement pstmt = conn.prepareStatement(sql);
          ????? /* 設(shè)置動(dòng)態(tài)SQL參數(shù)值 */
          ????? pstmt.setString(1, subject);
          ????? /* 執(zhí)行動(dòng)態(tài)SQL語(yǔ)句 */
          ????? pstmt.executeUpdate();
          ????? /* 關(guān)閉動(dòng)態(tài)SQL語(yǔ)句 */
          ????? pstmt.close();
          ??? } catch (SQLException e) {}
          ? }
          ?
          ? public static void update_subject(String old_subject,String new_subject)
          ? throws SQLException {
          ?
          ??? /* 建立到數(shù)據(jù)庫(kù)的缺省連接 */
          ??? Connection conn = new OracleDriver().defaultConnection();
          ??? /* 構(gòu)造動(dòng)態(tài)SQL語(yǔ)句 */
          ??? String sql = "UPDATE subject SET subject=? WHERE subject=?";
          ??? /* 使用try ... catch語(yǔ)句抓取并拋出例外 */
          ??? try {
          ????? /* 準(zhǔn)備動(dòng)態(tài)SQL語(yǔ)句 */
          ????? PreparedStatement pstmt = conn.prepareStatement(sql);
          ????? /* 設(shè)置動(dòng)態(tài)SQL參數(shù)值 */
          ????? pstmt.setString(1, new_subject);
          ????? pstmt.setString(2, old_subject);
          ????? /* 執(zhí)行動(dòng)態(tài)SQL語(yǔ)句 */
          ????? pstmt.executeUpdate();
          ????? /* 關(guān)閉動(dòng)態(tài)SQL語(yǔ)句 */
          ????? pstmt.close();
          ??? } catch (SQLException e) {}
          ? }
          }
          ?
          2.???????? 裝載Java代碼及類到Oracle8i數(shù)據(jù)庫(kù)中
          ?
          在編寫(xiě)了Java源代碼之后,就可以將Java對(duì)象裝載到Oracle8i數(shù)據(jù)庫(kù)中了。下面是完成這項(xiàng)任務(wù)的方法:
          ?


          ?
          3.???????? 發(fā)行Java,生成調(diào)用說(shuō)明
          ?
          在裝載了Java類后,就可以發(fā)行該Java類,并生成調(diào)用其方法的包了。下面是完成該項(xiàng)任務(wù)的方法:



          4.???????? 調(diào)用JSP
          ?
          在生成了調(diào)用Java方法的包后,就可以調(diào)用這些方法所對(duì)應(yīng)的函數(shù)和過(guò)程了。例如:
          ?




          使用Java開(kāi)發(fā)觸發(fā)器
          觸發(fā)器是一段存儲(chǔ)程序,當(dāng)執(zhí)行特定修改操作時(shí),會(huì)觸發(fā)它,并執(zhí)行其中的存儲(chǔ)程序。下面以記載表AUTHS作者工資更新情況的觸發(fā)器為例,說(shuō)明使用Java開(kāi)發(fā)觸發(fā)器的方法。如下圖所示:
          ?


          ?
          下面講述完成上述任務(wù)的方法和過(guò)程。
          ?
          1.???????? 編寫(xiě)Java源代碼
          ?
          程序清單如下(trigger.java):
          ?
          /* 導(dǎo)入Java類 */
          import java.sql.*;
          import java.io.*;
          import oracle.jdbc.driver.*;
          /* 主類 */
          public class trigger {
          ?
          ? public static void log_salary(String name,float old_sal,float new_sal)
          ? throws SQLException {
          ?
          ??? /* 建立到數(shù)據(jù)庫(kù)的缺省連接 */
          ??? Connection conn = new OracleDriver().defaultConnection();
          ??? String sql = "INSERT INTO salary_audit VALUES(?,?,?)";
          ?
          ??? /* 使用try ... catch語(yǔ)句抓取并拋出例外 */
          ??? try {
          ????? PreparedStatement pstmt = conn.prepareStatement(sql);
          ????? pstmt.setString(1, name);
          ????? pstmt.setFloat(2, old_sal);
          ????? pstmt.setFloat(3, new_sal);
          ????? pstmt.executeUpdate();
          ????? pstmt.close();
          ??? } catch (SQLException e) {}
          ? }
          }
          ?
          2.???????? 裝載Java代碼及類到Oracle8i數(shù)據(jù)庫(kù)中
          ?
          在編寫(xiě)了Java源代碼之后,就可以將Java對(duì)象裝載到Oracle8i數(shù)據(jù)庫(kù)中了。下面是完成這項(xiàng)任務(wù)的方法:
          ?


          3.???????? 發(fā)行Java,生成調(diào)用說(shuō)明
          ?
          在裝載了Java類后,就可以發(fā)行該Java類,并生成調(diào)用其方法的過(guò)程說(shuō)明及觸發(fā)器了。下面是完成該項(xiàng)任務(wù)的方法:




          ?
          4.???????? 調(diào)用JSP
          ?
          在創(chuàng)建了觸發(fā)器之后,當(dāng)修改作者工資時(shí)會(huì)自動(dòng)調(diào)用其中的存儲(chǔ)程序。例如:
          ?

          使用Java開(kāi)發(fā)對(duì)象方法
          對(duì)象類型是一種用戶自定義的數(shù)據(jù)結(jié)構(gòu),它可以將數(shù)據(jù)類型、函數(shù)以及過(guò)程封裝到該數(shù)據(jù)結(jié)構(gòu)中。對(duì)象方法是指對(duì)象類型中的函數(shù)和過(guò)程,本節(jié)將以獲取和增加對(duì)象工資信息為例,說(shuō)明使用Java開(kāi)發(fā)對(duì)象方法的方法。如下圖所示:

          ?
          下面講述完成上述任務(wù)的方法及過(guò)程:
          ?
          1.???????? 編寫(xiě)Java源代碼
          ?
          程序清單如下(object_type.java):
          ?
          /* 導(dǎo)入Java類 */
          import java.sql.*;
          import java.io.*;
          import oracle.sql.*;
          import oracle.jdbc.driver.*;
          import oracle.oracore.*;
          import oracle.jdbc2.*;
          import java.math.*;
          ?
          /* 主類,實(shí)現(xiàn)了SQLData接口 */
          public class object_type implements SQLData {
          ?
          ? /* 聲明private變量,它們對(duì)應(yīng)于對(duì)象類型的屬性 */
          ? private String code;
          ? private String name;
          ? private BigDecimal sex;
          ? private BigDecimal salary;
          ?
          ? /* 方法get_name():對(duì)象類型的方法,用于獲取對(duì)象姓名 */
          ? public String get_name() {
          ??? return name;
          ? }
          ?
          ? /* 方法get_salary():對(duì)象類型的方法,用于獲取對(duì)象工資 */
          ? public BigDecimal get_salary() {
          ??? BigDecimal sal = salary;
          ??? return sal;
          ? }
          ? /* 方法raise_salary():對(duì)象類型的方法,用于增加對(duì)象工資 */
          ? public void raise_salary(BigDecimal raise) {
          ??? salary = salary.add(raise);
          ? }
          ?
          ? /* 以下程序段實(shí)現(xiàn)了接口SQLData */
          ? String sql_type;
          ? public String getSQLTypeName() throws SQLException {
          ??? return sql_type;
          ? }
          ?
          ? public void readSQL(SQLInput stream, String typeName) throws SQLException {
          ??? sql_type = typeName;
          ??? code = stream.readString();
          ??? name = stream.readString();
          ??? sex = stream.readBigDecimal();
          ??? salary = stream.readBigDecimal();
          ??}
          ?
          ? public void writeSQL(SQLOutput stream) throws SQLException {
          ??? stream.writeString(code);
          ??? stream.writeString(name);
          ??? stream.writeBigDecimal(sex);
          ??? stream.writeBigDecimal(salary);
          ? }
          }
          ?
          2.???????? 裝載Java代碼及類到Oracle8i數(shù)據(jù)庫(kù)中
          ?
          在編寫(xiě)了Java源代碼之后,就可以將Java對(duì)象裝載到Oracle8i數(shù)據(jù)庫(kù)中了。下面是完成這項(xiàng)任務(wù)的方法:
          ?


          ?
          3.???????? 發(fā)行Java,生成調(diào)用說(shuō)明
          ?
          在裝載了Java類后,就可以發(fā)行該Java類,并生成調(diào)用其方法的相應(yīng)對(duì)象方法了。下面是完成該項(xiàng)任務(wù)的方法:
          ?



          ?
          4.???????? 調(diào)用JSP
          ?
          在創(chuàng)建了對(duì)象類型及對(duì)象方法之后,就可以調(diào)用這些對(duì)象方法了。例如:
          ?
          使用JDeveloper開(kāi)發(fā)JSP
          本節(jié)以創(chuàng)建用于操縱ARTICLE表的JSP為例,說(shuō)明使用JDeveloper 2.0開(kāi)發(fā)JSP的方法。如下圖所示:

          這里只簡(jiǎn)單介紹使用JDeveloper開(kāi)發(fā)JSP的過(guò)程和步驟,而關(guān)于如何使用JDeveloper請(qǐng)讀者參見(jiàn)相關(guān)手冊(cè)。
          ?
          1.???????? 準(zhǔn)備工作
          ?
          1)??????? 選擇“File—> New Workspace”,創(chuàng)建名稱為jsp.jws的工作組。如下圖所示:
          ?

          ?
          2)??????? 選擇“File—>New Project”,此時(shí)會(huì)啟動(dòng)新項(xiàng)目創(chuàng)建向?qū)В@示如下對(duì)話框:
          ?

          ?
          3)??????? 選中“Create an <Empty Project>”,然后單擊“Next”,此時(shí)會(huì)顯示如下對(duì)話框:

          ?
          4)??????? 如上圖所示,在“Project Name”框中鍵入“article”,項(xiàng)目路徑框中鍵入“d:\jsp”,然后單擊“Next”,此時(shí)會(huì)顯示如下對(duì)話框:
          ?

          ?
          5)??????? 在上圖的對(duì)話框中鍵入你所需要的信息,然后單擊“Next”,此時(shí)會(huì)顯示如下對(duì)話框:
          ?

          ?
          6)??????? 單擊“Finish”,完成項(xiàng)目的創(chuàng)建過(guò)程,此時(shí)的圖形界面如下:
          ?

          ?
          2.???????? 編寫(xiě)Java源代碼
          ?
          在完成了準(zhǔn)備工作之后,我們就可以編寫(xiě)Java源代碼了。步驟如下:
          ?
          1)??????? 選擇“File—>New”,此時(shí)會(huì)彈出如下對(duì)話框:
          ?


          ?
          2)??????? 如上圖所示,選中“Class”,然后單擊“OK”,此時(shí)會(huì)彈出如下對(duì)話框:
          ?

          ?
          3)??????? 如上圖所示,在“Class Name”框中鍵入“article”,選中“Style”中的“Public”,然后單擊“OK”,此時(shí)會(huì)增加名稱為“article.java”的節(jié)點(diǎn)。如下圖所示:
          ?

          ?
          4)??????? 雙擊“article.java”節(jié)點(diǎn),會(huì)顯示編輯工作區(qū)。如下圖所示:
          ?

          ?
          5)??????? 然后,在編輯工作區(qū)中編寫(xiě)如下的Java源代碼(article.java):
          ?
          /* 導(dǎo)入Java類 */
          import java.sql.*;
          import java.io.*;
          import oracle.jdbc.driver.*;
          ?
          /* 主類 */
          public class article {
          ?
          ? public static String query_article(String code)
          ? throws SQLException {
          ??? /* 建立到數(shù)據(jù)庫(kù)的缺省連接 */
          ??? Connection conn = new OracleDriver().defaultConnection();
          ??? /* 構(gòu)造動(dòng)態(tài)SQL語(yǔ)句*/
          ??? String sql = "SELECT author_code,title FROM article " +
          ????????????????? "WHERE article_code = ?";
          ??? /* 聲明String變量article_info,該變量將用于存儲(chǔ)文章信息 */
          ??? String article_info = new String();
          ?
          ??? /* 使用try ... catch語(yǔ)句抓取并拋出例外 */
          ??? try {
          ????? /* 準(zhǔn)備動(dòng)態(tài)SQL語(yǔ)句 */
          ????? PreparedStatement pstmt = conn.prepareStatement(sql);
          ????? /* 設(shè)置動(dòng)態(tài)SQL參數(shù)值 */
          ????? pstmt.setString(1, code);
          ????? ResultSet rset = pstmt.executeQuery();
          ????? /* 循環(huán)獲取并處理結(jié)果 */
          ????? while(rset.next()) {
          ??????? article_info = "作者代碼:? " + rset.getString(1) + "\n";
          ??????? article_info = article_info + "文章標(biāo)題:? " +
          ????????????????????????? rset.getString(2);
          ????? }
          ????? /* 關(guān)閉結(jié)果集 */
          ????? rset.close();
          ????? /* 關(guān)閉動(dòng)態(tài)SQL語(yǔ)句 */
          ????? pstmt.close();
          ??? } catch (SQLException e) {}
          ??? return article_info;
          ? }
          ?
          ? public static void insert_article(String article_code,
          ????? String author_code,String secrate_level,String pub_date)
          ? throws SQLException {
          ??? /* 建立到數(shù)據(jù)庫(kù)的缺省連接 */
          ??? Connection conn = new OracleDriver().defaultConnection();
          ??? /* 構(gòu)造動(dòng)態(tài)SQL語(yǔ)句 */
          ??? String sql = "INSERT INTO article (article_code,author_code," +
          ??????????????????? "secrate_level,pub_date) VALUES (?,?,?,?)";
          ??? /* 使用try ... catch語(yǔ)句抓取并拋出例外 */
          ??? try {
          ????? /* 準(zhǔn)備動(dòng)態(tài)SQL語(yǔ)句 */
          ????? PreparedStatement pstmt = conn.prepareStatement(sql);
          ????? /* 設(shè)置動(dòng)態(tài)SQL參數(shù)值 */
          ????? pstmt.setString(1, article_code);
          ????? pstmt.setString(2, author_code);
          ????? pstmt.setString(3, secrate_level);
          ????? pstmt.setString(4, pub_date);
          ????? pstmt.executeUpdate();
          ????? /* 關(guān)閉動(dòng)態(tài)SQL語(yǔ)句 */
          ????? pstmt.close();
          ??? } catch (SQLException e) {}
          ? }
          ?
          ? public static void delete_article (String code)
          ? throws SQLException {
          ??? /* 建立到數(shù)據(jù)庫(kù)的缺省連接 */
          ??? Connection conn = new OracleDriver().defaultConnection();
          ??? /* 構(gòu)造SQL語(yǔ)句 */
          ??? String sql = "DELETE FROM article? WHERE article_code = ?";
          ??? /* 使用try ... catch語(yǔ)句抓取并拋出例外 */
          ??? try {
          ????? /* 準(zhǔn)備動(dòng)態(tài)SQL語(yǔ)句 */
          ????? PreparedStatement pstmt = conn.prepareStatement(sql);
          ????? /* 設(shè)置動(dòng)態(tài)SQL參數(shù)值 */
          ????? pstmt.setString(1, code);
          ????? pstmt.executeUpdate();
          ????? /* 關(guān)閉動(dòng)態(tài)SQL語(yǔ)句 */
          ?? ???pstmt.close();
          ??? } catch (SQLException e) {}
          ? }
          ?
          ? public static void update_article (String code,String secrate_level)
          ? throws SQLException {
          ??? /* 建立到數(shù)據(jù)庫(kù)的缺省連接 */
          ??? Connection conn = new OracleDriver().defaultConnection();
          ??? /* 構(gòu)造動(dòng)態(tài)SQL語(yǔ)句 */
          ? ??String sql = "UPDATE article SET secrate_level = ?" +
          ????????????????? " WHERE article_code = ?";
          ??? /* 使用try ... catch語(yǔ)句抓取并拋出例外 */
          ??? try {
          ????? /* 準(zhǔn)備動(dòng)態(tài)SQL語(yǔ)句 */
          ????? PreparedStatement pstmt = conn.prepareStatement(sql);
          ????? /* 設(shè)置動(dòng)態(tài)SQL參數(shù)值 */
          ???? ?pstmt.setString(1, secrate_level);
          ????? pstmt.setString(2, code);
          ????? pstmt.executeUpdate();
          ????? /* 關(guān)閉動(dòng)態(tài)SQL語(yǔ)句 */
          ????? pstmt.close();
          ??? } catch (SQLException e) {}
          ? }
          }
          ?
          3.???????? 配置并發(fā)行JSP
          ?
          步驟如下:
          ?
          1)??????? 選擇“Project—>Deploy—>New Profile”,此時(shí)會(huì)彈出如下對(duì)話框:
          ?

          ?
          2)??????? 如上圖所示,選中“Deploy Java Classes and Stored Procedure to Oracle8i”,然后單擊“Next”,此時(shí)會(huì)彈出如下對(duì)話框:
          ?

          ?
          3)??????? 單擊“Next”,此時(shí)會(huì)彈出如下對(duì)話框:
          ?

          ?
          4)??????? 單擊“Next”,此時(shí)會(huì)顯示如下對(duì)話框:
          ?

          ?
          5)??????? 單擊“Next”,此時(shí)會(huì)顯示如下對(duì)話框:
          ?

          ?
          6)??????? 清除“Default Database Package”框,然后單擊“Next”,此時(shí)會(huì)顯示如下對(duì)話框:
          ?

          ?
          7)??????? 單擊“New”創(chuàng)建數(shù)據(jù)庫(kù)連接,此時(shí)會(huì)彈出如下對(duì)話框:
          ?

          ?
          該對(duì)話框用于配置數(shù)據(jù)庫(kù)連接信息,按照你的數(shù)據(jù)庫(kù)設(shè)置來(lái)配置相應(yīng)參數(shù)。完成數(shù)據(jù)庫(kù)連接的配置后,單擊“Test Connection”測(cè)試配置是否正確。如果配置不正確,則修改配置參數(shù)。
          ?
          8)??????? 單擊“OK”,此時(shí)會(huì)彈出如下對(duì)話框:
          ?

          ?
          在該對(duì)話框中顯示了相應(yīng)的數(shù)據(jù)庫(kù)連接信息。
          ?
          9)??????? 單擊“Next”,此時(shí)會(huì)彈出如下對(duì)話框:
          ?

          ?
          10)???? 單擊“Finish”,此時(shí)會(huì)彈出如下對(duì)話框:
          ?

          ?
          11)???? 單擊“No”退出配置,然后在主窗口中選中配置文件“Profile1.prf”,單擊鼠標(biāo)右鍵,此時(shí)會(huì)顯示如下彈出菜單:
          ?

          ?
          12)???? 從彈出菜單中選擇“Properties”,此時(shí)會(huì)顯示如下對(duì)話框:
          ?

          ?
          13)???? 選擇“Methods”頁(yè),此時(shí)的對(duì)話框如下所示:
          ?

          ?
          14)???? 如上圖所示,選中Publish下的所有單選框,然后單擊“Done”,此時(shí)會(huì)顯示如下對(duì)話框:
          ?

          ?
          15)???? 單擊“Yes”,會(huì)開(kāi)始配置和發(fā)行JSP,并最終顯示如下界面:
          ?

          ?
          16)???? 單擊“Done”,此時(shí)會(huì)顯示如下信息框:
          ?

          ?
          17)???? 單擊“OK”,這樣我們就完成了配置和發(fā)行JSP的全部過(guò)程了。然后,我們就可以調(diào)用JSP完成相應(yīng)任務(wù)了。
          ?
          4.???????? 調(diào)用JSP
          ?
          在創(chuàng)建了基于Java的函數(shù)和過(guò)程之后,就可以調(diào)用這些函數(shù)和過(guò)程了。方法如下:
          ?





          posted on 2006-08-16 15:18 黑咖啡 閱讀(315) 評(píng)論(0)  編輯  收藏 所屬分類: Tec Article

          <2006年8月>
          303112345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          留言簿(2)

          隨筆分類(67)

          文章分類(43)

          Good Article

          Good Blogs

          Open Source

          最新隨筆

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 湘阴县| 台北市| 和田市| 唐山市| 濉溪县| 永寿县| 民丰县| 罗源县| 石首市| 华蓥市| 建始县| 新密市| 廊坊市| 怀远县| 津南区| 邵东县| 荥阳市| 仙游县| 保定市| 祁阳县| 繁昌县| 康乐县| 福清市| 绿春县| 宁海县| 兴仁县| 兖州市| 娄烦县| 福安市| 金阳县| 三江| 常熟市| 新邵县| 赫章县| 海晏县| 龙胜| 石泉县| 尖扎县| 都江堰市| 浏阳市| 焦作市|