`
残缺的完美
  • 浏览: 42794 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Oracle8i中使用Java语言来开发存储过程

阅读更多

在Oracle8i之前,开发人员只能使用PL/SQL来开发存储过程。而在Oracle8i之中,不仅可以使用原有的PL/SQL开发存储过程,而且也可以使用Java语言来开发存储过程。本篇文章将简单介绍关于这方面的知识,包括以下内容:(灰色显示的部分在此将不作详细介绍)

本文是我参考网上资料,整理出来的一份,文中所有代码语句均真实可用,因只是作测试,所以代码未表现实际业务操作。

一. 存储过程简介
二. Java存储过程
三. Java存储过程的开发步骤
四. 使用Java开发过程
五. 使用Java开发函数
六. 使用Java开发包
七. 使用Java开发触发器
八. 使用Java开发对象方法
九. 使用JDeveloper开发JSP

. 存储过程简介

存储过程是存储在数据库中的一段存储程序。当创建存储过程时,系统会对其进行编译,并将执行代码存储到数据库中。

1. 设计存储过程的方针

1) 在定义存储过程时,要使用其完成单一、相对集中的任务。
2) 在定义存储过程时,不要定义已经由其它特征所提供功能的过程。例如,不要定义强制数据完整性的过程(使用完整性约束)。

2. 存储过程的优点

1) 安全性

当创建了存储过程之后,可以将执行该过程的权限授予其它用户,从而使得他可以执行特定的数据库操作,而不能访问其它模式对象(例如表)。例如,你可以将执行过程(更新表)的权限授予其它用户,但不授予它们直接访问该表的权限。

2) 性能

① 存储过程只被发送到数据库一次,相对于SQL语句或PL/SQL块而言,其网络通信量更小。
② 当调用存储过程时,数据库会直接运行该存储过程,无需进行编译。相对于SQL语句或PL/SQL块而言,其执行速度更快。

3) 内存分配

存储过程充分利用了Oracle共享内存的能力。在将存储过程装载到内存中后,多个用户可以同时调用该存储过程,从而降低了应用对Oracle的实际内存需求。

4) 生产力

存储过程提高了开发生产力。通过将公共集合编写为存储过程,避免了冗余代码,从而提高了开发生产力。例如,我们可以编写用于插入、更新、删除DEPT表的过程,此后应用可以直接调用这些过程,而无需重写SQL语句。当管理数据的方法发生变化时,只需要修改过程,而不需要对应用进行任何修改。

. Java存储过程

在以前的Oracle版本中,开发存储过程是通过PL/SQL来完成的。而在Oracle8i版本中,我们不仅可以使用PL/SQL开发存储过程,而且还可以使用Java语言来开发存储过程。

1. PL/SQL与Java存储过程比较

与PL/SQL相比,使用Java语言开发存储过程有以下优点:

1) Java语言具有更强大的运算能力,提供了更多的运算方法。当要完成进行复杂运算的存储过程时,使用JSP(Java Storage Procedure)将是你最好的选择。
2) PL/SQL只能用于Oracle数据库,而Java语言可以应用于更多的数据库系统(如Sybase、DB2、Informix等等),所以Java存储过程将具有更好的兼容性、可移植性。

2. JSP(Java Storage Procedure)分类

Java存储过程包括过程、函数、触发器以及对象方法四种类型。

3. 调用JSP的四种方法

1) CALL语法
2) DML语句
3) PL/SQL块、子程序、包
4) 由触发器隐含调用

Java存储过程的开发步骤

1. 编写Java源代码

当开发Java存储过程时,首先应该编写Java源代码。

注意事项:

① 一般都写成public static方法作为Java存储过程
② 如果从SQL调用Java的实例方法。就必须在Oracle中建立Oracle Objects对象,用Java方法实现对象的方法。这个技术使用CREATE TYPE BODY命令。

2. 装载Java代码及类到Oracle8i数据库中

在编写了Java源代码之后,接下来应该将Java代码及相应的Java类装载到Oracle8i数据库中。

装载Java代码及类到RDBMS有以下两种方法:

1) 使用loadjava工具,通过该工具可以快速装载Java源代码(.java)、Java二进制代码(.class)以及Java打包文件(.jar)。
2) 使用CREATE Java、ALTER Java装载Java代码。

其中,前一种方法相对简单,并且我们推荐你使用这种方法。 如果借助于像PL/SQL Developer和JDeveloper来开发JSP装载过程就更简单,比如在PL/SQL DEveloper的SQL窗口第一行加上 "create or replace and compile java source named Foo as" 点执行工具按钮,PL/SQL Developer就知道是要把Java代码装载到Oracle中

3. 生成调用说明

在装载了Java类之后,接下来应该生成对public static方法的调用说明,最终完成Java存储过程的开发工作。就是声明哪些Java类方法要暴露给数据库调用。

完成上述步骤之后,就完成了Java存储过程的开发工作,然后就可以调用并执行该Java存储过程了。

下面将逐一分绍用Java开发几种存储过程的步骤,实例中的代码及操作均可在 Oracle 8.1.6 中成功执行。

:使用Java开发过程

过程用于执行某种操作。需要注意的是,过程所对应的Java方法返回值必须为空(void)。

下面讲述完成上述任务的方法及过程: (前三个步骤在开发函数、包、触发器、对象方法基本一致,所以在以后的介绍中将不再重复)

1. 编写Java源代码

程序清单如下(HelloJSP.java):(这段代码在开发其他几种过程的时候也要用到)

 

  1. import java.io.*;   
  2. import java.net.*;   
  3. import java.sql.*;   
  4.   
  5. import oracle.jdbc.driver.OracleDriver;   
  6.   
  7. public class HelloJSP {   
  8.   
  9.   
  10.     // 有返回值,要说明为数据库的函数,有参数   
  11.     public static String javaFunction(String userName) {   
  12.         // 取系统、数据记录信息等返回   
  13.         return "Hello " + userName;   
  14.     }   
  15.   
  16.   
  17.     //  有返回值,要说明为数据库的函数,无参数   
  18.     public static String javaFunction1() {   
  19.            
  20.         try {   
  21.             //通过URL连接读取http://java.sun.com:80上的内容   
  22.             // 注意,执行前需要指定用户对Socket java.sun.com:80的访问权限,解析与连接   
  23.             // 在sqlplus中以system用户调用dbms_java包的grant_permission过程,命令如下:   
  24.             // call dbms_java.grant_permission('SCOTT','java.net.SocketPermission',   
  25.             // 'java.sun.com:80', 'resolve,connect, accept');   
  26.              URL url = new URL("http://java.sun.com");   
  27.             InputStream is = url.openStream();   
  28.             BufferedReader br = new BufferedReader(new InputStreamReader(is));   
  29.                
  30.             //返回读取到的第一行字符串   
  31.             return br.readLine();   
  32.         } catch (Exception e) {   
  33.             return e.getMessage();   
  34.         }   
  35.     }   
  36.   
  37.     // 无返回值,要说明为数据库的过程   
  38.     // 执行成功后将会在c:/看到一个文件a,内容为你所输入的参数字符吕串   
  39.     public static void javaProcedure(String userName) {   
  40.         // todo something,如维护数据记录,读取系统信息等   
  41.         try {   
  42.   
  43.             // 取得连接就可以做你要的数据库操作,用默认连接   
  44.             Connection conn = new OracleDriver().defaultConnection();   
  45.             conn.close();   
  46.         } catch (SQLException e) {   
  47.         }   
  48.   
  49.         try {   
  50.             // 注意,执行前需要指定用户对文件c:/a至少有写的权限   
  51.             // 在sqlplus中以system用户调用dbms_java包的grant_permission过程,命令如下:   
  52.             // call dbms_java.grant_permission('SCOTT','java.io.FilePermission','c:/a','read,write');   
  53.             OutputStream os = new FileOutputStream("c:/a");   
  54.             os.write(userName.getBytes());   
  55.             os.close();   
  56.         } catch (IOException e) {   
  57.         }   
  58.     }   
  59.   
  60.   
  61.     public static void javaTrigger(int deptNo, String oldName,   
  62.                                    String newName) {   
  63.         // to do something   
  64.         // 我们可以直接调用上面的方法,也往产生一个文件c:/a,看看效果   
  65.         try {   
  66.             javaProcedure("Dept No: "+deptNo+" Old name: "+oldName+" New name: "+newName);   
  67.         }   
  68.         catch (Exception e) {   
  69.                
  70.         }   
  71.     }   
  72. }  

 

2. 装载Java代码及类到Oracle8i数据库中

在编写了Java源代码之后,就可以将Java对象装载到Oracle8i数据库中了。下面是完成这项任务的方法:

你的Java类中用到了哪些包,就应设置好相应的classpath环境变量, 例如:用以下命令

set classpath=%classpath%;%ORA_HOME%/jdbc/lib/classes12.zip;%ORA_HOME%/sqlj/lib/runtime.zip;%ORA_HOME%/sqlj/lib/translator.zip

实际操作loadjava时并没有你上面那样设置classpath也行,当前的classpath是CLASSPATH=.;E:\Oracle\Ora81\orb\classes\yoj.jar;E:\Oracle\Ora81\orb\classes\share.zip,其中这两个包也没有包含上面代码引入的类

装载命令用:

loadjava -user scott/tiger@orcl -o -v -f -r d:/jsp/HelloJSP.java

参数说明:
-o     使用OCI8 JDBC接口
-v     显示执行过程
-f     强制装载
-r     编译并解析类
最后一个参数就是源文件路径

3. 发行Java,生成调用说明

在装载了Java类后,就可以发行该Java类,并生成调用其方法的过程说明了(当然首先要登录到数据库了)

1)

  1. CREATE OR REPLACE PROCEDURE JavaProcedure(userName IN VARCHAR2)   
  2.        AUTHID CURRENT_USER  
  3.        AS LANGUAGE JAVA NAME 'HelloJSP.javaProcedure(java.lang.String)';   
  4.    /  

 

4. 调用JSP

在生成了调用Java方法的过程说明之后,我们就可以调用JSP了。例如:

call JavaProcedure('Unmi');

成功执行后将会在C盘根目录下产生一个文件a,内容为"Unmi".注意必须赋于SCOTT对文件c:/a的写权限,后面会有一个单独专题来讲解OracleJVM权限。

. 使用Java开发函数

函数用于返回特定数据。说明使用Java开发函数的方法。与使用Java开发过程不一样的就在发布调用说明与调用略有不同。前两步与上同

3. 发行Java,生成调用说明(先也要登录到数据库了)(下面分别生有有参和无参的函数说明)

1)

  1. CREATE OR REPLACE FUNCTION JavaFunction(userName IN VARCHAR2)    
  2.       RETURN VARCHAR2   
  3.       AUTHID CURRENT_USER  
  4.       AS LANGUAGE JAVA NAME 'HelloJSP.javaFunction(java.lang.String) return java.lang.String';   
  5.    /  

 

  1. CREATE OR REPLACE FUNCTION JavaFunction1    
  2.       RETURN VARCHAR2   
  3.       AUTHID CURRENT_USER  
  4.       AS LANGUAGE JAVA NAME 'HelloJSP.javaFunction1() return java.lang.String';   
  5.    /  

 

4. 调用JSP

在生成了调用Java方法的函数说明之后,就可以调用这些函数了

对函数的调用方式在最顶层可以有两种,call和sql中

1) call dbms_output.put_line(JavaFunction('Unmi'))
2) select JavaFunction1() from dual

. 使用Java开发包

Java类用于封装Java方法,与此类似,包用于封装过程和函数等。仍然以上面的代码为例。前两步与上同

3. 发行Java,生成调用说明

在装载了Java类后,就可以发行该Java类,并生成调用其方法的包了。 包名为HelloJSP。

1)

  1. CREATE OR REPLACE PACKAGE HelloJSP as  
  2.         FUNCTION  JavaFunction(userName IN VARCHAR2) return VARCHAR2;   
  3.         FUNCTION  JavaFunction1 return VARCHAR2;   
  4.         PROCEDURE JavaProcedure(userName IN VARCHAR2);   
  5.         PROCEDURE JavaTrigger(deptNo IN NUMBER,oldName IN VARCHAR2,newName IN VARCHAR2);   
  6.     END HelloJSP ;   
  7.     /  

 

2)

  1. CREATE OR REPLACE PACKAGE BODY HelloJSP as  
  2.         FUNCTION JavaFunction(userName IN VARCHAR2)    
  3.            RETURN VARCHAR2   
  4.            AS LANGUAGE JAVA NAME 'HelloJSP.javaFunction(java.lang.String) return java.lang.String';   
  5.   
  6.         FUNCTION JavaFunction1    
  7.            RETURN VARCHAR2   
  8.            AS LANGUAGE JAVA NAME 'HelloJSP.javaFunction1() return java.lang.String';   
  9.   
  10.         PROCEDURE JavaProcedure(userName IN VARCHAR2)   
  11.           AS LANGUAGE JAVA NAME 'HelloJSP.javaProcedure(java.lang.String)';   
  12.   
  13.         PROCEDURE javaTrigger(deptNo IN NUMBER, oldName IN VARCHAR2, newName IN VARCHAR2)   
  14.            AS LANGUAGE JAVA NAME 'HelloJSP.javaTrigger(int, java.lang.String, java.lang.String)';   
  15.     end HelloJSP ;   
  16.     /  

 

创建包的主体时,定义函数或过程体时不能加 "AUTHID CURRENT_USER"

4. 调用JSP

在生成了调用Java方法的包后,就可以调用这些方法所对应的函数和过程了。例如:

1) call dbms_output.put_line(HelloJSP.JavaFunction('Unmi'));
2) select HelloJSP.JavaFunction1() from dual;
3) call HelloJSP.JavaProcedure('Unmi');
4) call HelloJSP.JavaTrigger(10,'Kypfos','Unmi');

. 使用Java开发触发器

触发器是一段存储程序,当执行特定修改操作时,会触发它,并执行其中的存储程序。下面以表dept有记录变动时执行某个操作为例,说明使用Java开发触发器的方法。准确点讲这里所谓的使用Java开发触发器仍然是属于开发储过程的范畴,Java方法仍然是声明为数据库的存储过程。

3. 发行Java,生成调用说明

在装载了Java类后,就可以发行该Java类,并生成调用其方法的过程说明及触发器了。下面是完成该项任务的方法:

从下面两个步骤可以看出,触发器调用Java程序还必须借助于存储过程。由真正的数据库触发器传参到Java存储过程。


1)

  1. CREATE OR REPLACE PROCEDURE JavaTrigger(deptNo IN NUMBER, oldName IN VARCHAR2, newName IN VARCHAR2)   
  2.        AUTHID CURRENT_USER  
  3.        AS LANGUAGE JAVA NAME 'HelloJSP.javaTrigger(int, java.lang.String, java.lang.String)';   
  4.    /  


2)

  1. CREATE OR REPLACE TRIGGER CallJavaTrigger   
  2.       AFTER update OR delete OR insert ON dept   
  3.       FOR EACH ROW   
  4.       call JavaTrigger(:old.deptno,:old.dname,:new.dname)   
  5.    /  

 

4. 调用JSP

在创建了触发器之后,当修改作者工资时会自动调用其中的存储程序。例如:

update dept set dname=dname||'X' where deptno=20

.使用Java开发对象方法

对象类型是一种用户自定义的数据结构,它可以将数据类型、函数以及过程封装到该数据结构中。对象方法是指对象类型中的函数和过程,

Java对象类必须实现SQLData接口中的getSQLTypeName()、readSQL(SQLInput stream,String typeName)、writeSQL(SQLOut stream)方法

因为在数据库中创建对象在实际开发中比较少用,所以具体的操作方法这里略去,以后用到时再细究。

. 使用JDeveloper开发JSP

用JDeveloper开发Java存储过程,因为JDeveloper是一个Java IDE,同Oracle又是一家的,能结合的不好吗。基本过程是:

1) 配置好到Oracle数据库的连接
2) 编写好你要嵌入到Oracle中的Java类
3) 工程中New一个Loadjava and Java Store Procedures的deployment Profile
4) 选取要发布类的方法,JDeveloper会根据你的方法有无参数决定是过程还是函数
5) Deploy to 到你配置的数据库上

在Depolyment - Log 中会显示Depoly时的信息,如生成调用说明的语句。

总结:自己按上面的步骤一步步操作,常常会碰到一些问题,而且我都还不知道应该怎么去确定是什么问题,而用jDeveloper来开发Java存储过程,就非常之简单了。而且我还发现JDeveloper给我们开发Java存储过程带来了无比的方便,而且还是一款很棒的Java IDE,支持Struts、JSF、EJB、WebService、TopLink、Swing/AWT、还能画UML图,运行速度也很快。 在JDeveloper中还能够列出已加载到数据库中的Java Classes,而PL/SQL Developer只能看到已加载的Java Source,所以如果用loadjava加载的是一个class文件,在PL/SQL Developer中就是不可见了


参考资料:

1. Oracle8i中使用Java语言来开发存储过程(时代朝阳数据库(原晓通数据库)培训部Oracle 资料库) (原文中用的JDeveloper版本是2.0,现在都10.1.3了)
2. 用PL/SQL和Java开发Oracle8 i应用程序
3. 如何利用java过程执行操作系统命令 (ORACLE技术中国用户讨论组)
4. 保证执行Java的安全 (作者:Kuassi Mensah)
5. Permissions in the JDK (Sun官方文档)

分享到:
评论
1 楼 suifeng 2009-01-16  
多谢, 藏之.

相关推荐

    在Oracle8i中使用java编写存储过程.rar

    总之,Oracle8i的Java存储过程功能为开发人员提供了一种强大而灵活的方法来扩展数据库的功能,使得数据库不仅仅是存储数据的地方,还可以执行复杂的业务逻辑。通过学习和掌握这一技术,开发者可以创建出更高效、更...

    oracle8i开发使用手册

    《Oracle8i开发使用手册》是一本全面介绍Oracle8i数据库系统开发与使用的专业指南,旨在帮助开发者和管理员深入理解Oracle8i的核心功能,并提供在实际项目中的应用策略。手册内容广泛,涵盖了从数据库安装、配置到...

    Oracle8i Java Stored Procedures Developer’s Guide Release 2 (8.1

    Oracle8i Java存储过程开发指南是一份详细的文档,旨在帮助开发者学习如何使用Java存储过程在Oracle数据库中开发应用程序。该指南涵盖了Java存储过程的基本概念、开发步骤、调试技术等方面的内容。 Java存储过程的...

    使用Java语言开发存储过程.doc.doc

    【存储过程简介】 存储过程是数据库中的一种重要组件,它是一组为了...通过以上步骤,开发者可以在Oracle环境中使用Java语言开发出高效、安全且具有广泛适用性的存储过程,从而优化数据库管理和提升应用程序的功能。

    Oracle8i概述

    在Oracle8i中,SQLJ提供了更高效的方法来编写和执行SQL查询,它允许Java程序直接调用数据库中的存储过程或函数,从而减少了网络通信开销,提高了应用性能。 ##### 5.3 Enterprise JavaBeans支持 除了基本的Java...

    Oracle 8-8i开发使用手册.rar

    总的来说,Oracle 8-8i开发使用手册是开发者和数据库管理员的重要资源,它提供了全面的Oracle 8i知识,帮助用户理解和掌握在该版本数据库上进行高效开发和管理的技能。尽管现在Oracle已经发展到了更高的版本,但了解...

    Oracle数据库中的Java语言.pdf

    本文通过一个具体的实例——移动树型结构分支的程序,详细介绍了如何在Oracle数据库中使用Java开发存储过程。这个程序的主要目标是在树结构中移动一个节点及其所有子节点,同时保证不破坏树的完整性和避免形成断链或...

    Oracle数据库中存储过程开发研究 (1).pdf

    在Oracle 8i及后续版本中,除了传统的PL/SQL,还支持使用Java语言来编写存储过程,提供了更广泛的语言选择。 1. 存储过程的优点 - **性能优化**:存储过程在首次执行时会被编译,并存储在数据库的高速缓冲区中,...

    java_for_oracle.rar_for oracle_oracle

    综上所述,"java_for_oracle.rar_for oracle_oracle"这个压缩包提供了一个学习和实践在Oracle中使用Java开发存储过程的资源集合,对于希望深入理解Oracle数据库和Java结合的开发者来说是非常有价值的。

    Oracle8i Concepts .pdf

    这份文档由多个作者共同完成,包括Lefty Leverenz、Diana Rehfeld、Cathy Baird等,以及大量的贡献者,他们在Oracle8i的开发与完善过程中发挥了重要作用。以下是对该文档核心知识点的深度解读: ### 1. Oracle8i的...

    oracle8i.rar

    在本文中,我们将深入探讨Oracle 8i在Windows环境下的安装、配置、管理和使用等相关知识点。 1. **Oracle 8i概述** Oracle 8i是1999年发布的,其“i”代表“Internet”,强调了该版本对互联网技术的集成和支持。它...

    Oracle集合类型输出参数的PLSQL存储过程及其Java调用.docx

    在实际开发过程中,当需要返回复杂的数据结构,如二维数组或结果集时,可以通过存储过程中使用集合数据结构来实现。 #### 2. PL/SQL存储过程及Java程序的编写 ##### 2.1 索引表作为输出参数 索引表是一种非常灵活...

    利用Java程序实现Oracle数据库中大对象的存取.pdf

    Oracle从8i中使用了LOB(大对象)这种特殊的数据类型,实现了对这些数据的存储。 LOB是以对象的形式出现的,不同于以往的普通数据结构,因此具有对象的属性和方法,可以使用Java这种基于对象的语言进行操作。一个...

    java 调用ORCAL存储过程

    本文主要介绍如何使用Java来调用Oracle数据库中的存储过程,并通过两个具体的例子来展示无返回值和有返回值的情况。 #### 二、无返回值的存储过程调用 ##### 1. 创建存储过程 首先,我们需要在Oracle数据库中创建...

    Oracle8i_9i数据库基础

    Oracle8i和9i是Oracle数据库的两个重要版本,它们在数据库管理领域具有广泛的影响力,尤其对于初学者和专业人士来说,理解这两个版本的基础知识至关重要。本教程“Oracle8i_9i数据库基础”旨在深入浅出地介绍Oracle...

    oracle 8i pl/sql秘籍

    PL/SQL是Oracle专有的过程化语言,用于在Oracle数据库上编写存储过程、函数和触发器等。 本书涵盖了Oracle 8i版本,尽管这个版本相对较老,但其基础概念和编程技巧对于理解更新的Oracle版本(如11g、12c、19c)仍然...

    复件 (8) 1.Oracle8i_9i数据库基础.rar

    5. **存储过程语言PL/SQL的增强**:增强了PL/SQL,使其支持异常处理、游标、包等,提升了数据库程序的开发能力。 6. **并行服务器体系结构**:改进了并行执行机制,使得多用户环境下的性能得到了显著提升。 7. **...

    Oracle8i_9i 数据库基础

    Oracle8i引入了许多新特性,如对象-关系数据库功能、数据仓库优化、Java集成以及对XML的支持等。 Oracle9i则是在2001年发布的,进一步增强了对互联网应用的支持,如改进的XML处理、Web服务、数据复制和自动存储管理...

    Oracle and Java Development

    #### 三、使用Oracle 8i开发和部署应用 - **Oracle 8i简介**:Oracle 8i是Oracle公司推出的一款关系型数据库管理系统,支持网络计算环境中的各种应用需求。 - **技术亮点**: - 支持XML数据类型和处理功能。 - ...

Global site tag (gtag.js) - Google Analytics