`
langgufu
  • 浏览: 2291033 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

如何在Oracle中使用Java存储过程(详解)(转)

阅读更多

Java存储过程今后在各大数据库厂商中越来越流行,功能也越来越强大。这里以Oracle为例,介绍一下java存储过程的具体用法。

一、如何创建java存储过程?

通常有三种方法来创建java存储过程。

1. 使用oracle的sql语句来创建:

e.g. 使用create or replace and compile java source named "<name>" as

后边跟上java源程序。要求类的方法必须是public static的,才能用于存储过程。

  1. SQL> create or replace and compile java source named "javademo1"
  2. 2 as
  3. 3 import java.sql.*;
  4. 4 public class JavaDemo1
  5. 5 {
  6. 6 public static void main(String[] argv)
  7. 7 {
  8. 8 System.out.println("hello, java demo1");
  9. 9 }
  10. 10 }
  11. 11 /
  12. Java 已创建。
  13. SQL> show errors java source "javademo1"
  14. 没有错误。
  15. SQL> create or replace procedure javademo1
  16. 2 as
  17. 3 language java name 'JavaDemo1.main(java.lang.String[])';
  18. 4 /
  19. 过程已创建。
  20. SQL> set serveroutput on
  21. SQL> call javademo1();
  22. 调用完成。
  23. SQL> call dbms_java.set_output(5000);
  24. 调用完成。
  25. SQL> call javademo1();
  26. hello, java demo1
  27. 调用完成。
  28. SQL> call javademo1();
  29. hello, java demo1
  30. 调用完成。

2. 使用外部class文件来装载创建

e.g. 这里既然用到了外部文件,必然要将class文件放到oracle Server的某一目录下边。

  1. public class OracleJavaProc
  2. {
  3. public static void main(String[] argv)
  4. {
  5. System.out.println("It's a Java Oracle procedure.");
  6. }
  7. }
  8. SQL> grant create any directory to scott;
  9. 授权成功。
  10. SQL> conn scott/tiger@iihero.oracledb
  11. 已连接。
  12. SQL> create or replace directory test_dir as 'd:/oracle';
  13. 目录已创建。
  14. SQL> create or replace java class using bfile(test_dir, 'OracleJavaProc.CLASS')
  15. 2 /
  16. Java 已创建。
  17. SQL> create or replace procedure testjavaproc as language java name 'OracleJavaProc.main(java.lang.String[])';
  18. 2 /
  19. 过程已创建。
  20. SQL> call testjavaproc();
  21. 调用完成。
  22. SQL> execute testjavaproc;
  23. PL/SQL 过程已成功完成。
  24. SQL> set serveroutput on size 5000
  25. SQL> call dbms_java.set_output(5000);
  26. 调用完成。
  27. SQL> execute testjavaproc;
  28. It's a Java Oracle procedure.

3. 我推荐的一种方法,直接使用loadjava命令远程装载并创建。
先创建一个类, e.g.

  1. import java.sql.*;
  2. import oracle.jdbc.*;
  3. public class OracleJavaProc {
  4. //Add a salgrade to the database.
  5. public static void addSalGrade(int grade, int losal, int hisal) {
  6. System.out.println("Creating new salgrade for EMPLOYEE...");
  7. try {
  8. Connection conn =
  9. DriverManager.getConnection("jdbc:default:connection:");
  10. String sql =
  11. "INSERT INTO salgrade " +
  12. "(GRADE,LOSAL,HISAL) " +
  13. "VALUES(?,?,?)";
  14. PreparedStatement pstmt = conn.prepareStatement(sql);
  15. pstmt.setInt(1,grade);
  16. pstmt.setInt(2,losal);
  17. pstmt.setInt(3,hisal);
  18. pstmt.executeUpdate();
  19. pstmt.close();
  20. }
  21. catch(SQLException e) {
  22. System.err.println("ERROR! Adding Salgrade: "
  23. + e.getMessage());
  24. }
  25. }
  26. }

使用loadjava命令将其装载到服务器端并编译:

  1. D:eclipse3.1workspacedbtest>loadjava -u scott/tiger@iihero.oracledb -v -resolve Or
  2. acleJavaProc.java
  3. arguments: '-u' 'scott/tiger@iihero.oracledb '-v' '-resolve' 'OracleJavaProc.java'
  4. creating : source OracleJavaProc
  5. loading : source OracleJavaProc
  6. resolving: source OracleJavaProc

查询一下状态:

  1. 连接到:
  2. Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
  3. With the Partitioning, OLAP and Oracle Data Mining options
  4. JServer Release 9.2.0.1.0 - Production
  5. SQL> SELECT object_name, object_type, status FROM user_objects WHERE object_type LIKE 'JAVA%';
  6. OBJECT_NAME
  7. --------------------------------------------------------------------------------
  8. OBJECT_TYPE STATUS
  9. ------------------------------------ --------------
  10. OracleJavaProc
  11. JAVA CLASS VALID
  12. OracleJavaProc
  13. JAVA SOURCE VALID

测试一下存储过程:

  1. SQL> create or replace procedure add_salgrade(id number, losal number, hisal num
  2. ber) as language java name 'OracleJavaProc.addSalGrade(int, int, int)';
  3. 2 /
  4. 过程已创建。
  5. SQL> set serveroutput on size 2000
  6. SQL> call dbms_java.set_output(2000);
  7. 调用完成。
  8. SQL> execute add_salgrade(6, 10000, 15000);
  9. Creating new salgrade for EMPLOYEE...
  10. PL/SQL 过程已成功完成。
  11. SQL> select * from salgrade where grade=6;
  12. GRADE LOSAL HISAL
  13. ---------- ---------- ----------
  14. 6 10000 15000

二、如何更新你已经编写的java存储过程?

假如要往类OracleJavaProc里添加一个存储过程方法,如何开发?
正确的步骤应该是先dropjava, 改程序,再loadjava。

e.g.修改OracleJavaProc类内容如下:

  1. import java.sql.*;
  2. import oracle.jdbc.*;
  3. public class OracleJavaProc {
  4. // Add a salgrade to the database.
  5. public static void addSalGrade(int grade, int losal, int hisal) {
  6. System.out.println("Creating new salgrade for EMPLOYEE...");
  7. try {
  8. Connection conn =
  9. DriverManager.getConnection("jdbc:default:connection:");
  10. String sql =
  11. "INSERT INTO salgrade " +
  12. "(GRADE,LOSAL,HISAL) " +
  13. "VALUES(?,?,?)";
  14. PreparedStatement pstmt = conn.prepareStatement(sql);
  15. pstmt.setInt(1,grade);
  16. pstmt.setInt(2,losal);
  17. pstmt.setInt(3,hisal);
  18. pstmt.executeUpdate();
  19. pstmt.close();
  20. }
  21. catch(SQLException e) {
  22. System.err.println("ERROR! Adding Salgrade: "
  23. + e.getMessage());
  24. }
  25. }
  26. public static int getHiSal(int grade)
  27. {
  28. try {
  29. Connection conn =
  30. DriverManager.getConnection("jdbc:default:connection:");
  31. String sql = "SELECT hisal FROM salgrade WHERE grade = ?";
  32. PreparedStatement pstmt = conn.prepareStatement(sql);pstmt.setInt(1, grade);
  33. ResultSet rset = pstmt.executeQuery();
  34. int res = 0;
  35. if (rset.next())
  36. {
  37. res = rset.getInt(1);
  38. }
  39. rset.close();
  40. return res;
  41. }
  42. catch (SQLException e)
  43. {
  44. System.err.println("ERROR! Querying Salgrade: "
  45. + e.getMessage());
  46. return -1;
  47. }
  48. }
  49. }

如何更新呢?

  1. D:eclipse3.1workspacedbtest>dropjava -u scott -v OracleJavaProc
  2. D:/tiger@iihero.oracledbeclipse3.1workspacedbtest>loadjava -u scott -v -resolve Or
  3. acleJavaProc/tiger@iihero.oracledb.java
  4. arguments: '-u' 'scott/tiger@iihero.oracledb' '-v' '-resolve' 'OracleJavaProc.java'
  5. creating : source OracleJavaProc
  6. loading : source OracleJavaProc
  7. resolving: source OracleJavaProc

后边的应用示例:

  1. SQL> create or replace function query_hisal(grade number) return number as langu
  2. age java name 'OracleJavaProc.getHiSal(int) return int';
  3. 2 /
  4. 函数已创建。
  5. SQL> set serveroutput on size 2000
  6. SQL> call dbms_java.set_output(2000);
  7. 调用完成。
  8. SQL> select query_hisal(5) from dual;
  9. QUERY_HISAL(5)
  10. --------------
  11. 9999
分享到:
评论

相关推荐

    java Oracle存储过程分页整理

    java 调用Oracle存储过程进行分页详解

    oracle 触发器实时调用java 中http接口

    oracle insert数据成功之后调用触发器,触发器调用存储过程,存储实时调用java http

    Java下使用Oracle存储过程(详解)第1/3页

    (作者:iihero on csdn) 一、如何创建java存储过程? 通常有三种方法来创建java存储过程。 1. 使用oracle的sql语句来创建: e.g. 使用create or replace and compile java source named “” as 后边跟上java源程序...

    Java调用Oracle存储过程详解

    主要介绍了Java调用Oracle存储过程详解的相关资料,需要的朋友可以参考下

    Oracle中命名块之存储过程的详解及使用方法

    ◆命名块:具有名称的PL/SQL块,这些命名块被存储在Oracle中,编译一次,以后只可调用就可多次执行。如:存储过程、存储函数、包、触发器等、  存储过程:无返回值;  存储函数:有返回值;  包:可容纳多个过程或...

    oracle学习详解 笔记

    oracle学习详解 笔记 建表,建库,权限,存储,索引,分页,+java分页——java存储

    java调用存储过程

    提供了java调用存储过程对oracle进行增删改查, 代码简洁明了,易于学习

    java 查询oracle数据库所有表DatabaseMetaData的用法(详解)

    下面小编就为大家带来一篇java 查询oracle数据库所有表DatabaseMetaData的用法(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    Oracle包应用详解.doc

    (2)包类似于C++和JAVA语言中的类,其中变量相当于类中的成员变量,过程和函数相当于类方法。把相关的模块归类成为包,可使开发人员利用面向对象的方法进行存储过程的开发,从而提高系统性能。 ...............

    6年javaEE开发的Word资料合集

    Java面试题 最小函数依赖 在数据库中实现base64编码和解码 java servlet总结 java的时间操作 画Web流程图的一点心得 深入Java核心 Java内存分配原理精讲 JAVA调用存储过程详解 经典SQL语句大全 使用jfreechart + ...

    Oracle 10g 学习笔记

    这个笔记是学习oracle数据库过程中整理出来的,比较详细,适合于初学者。 │ oracle与tomcat端口冲突.txt │ Oracle学习笔记.pdf │ Oracle学习笔记.wps │ 安装Oracle后myEclipse不能正常使用.txt │ 手工配置...

    疯狂JAVA讲义

    学生提问:当我们使用编译C程序时,不仅需要指定存放目标文件的位置,也需要指定目标文件的文件名,这里使用javac编译Java程序时怎么不需要指定目标文件的文件名呢? 13 1.5.3 运行Java程序 14 1.5.4 根据...

    oracle数据匹配merge into的实例详解

    oracle数据匹配merge into的实例详解 前言:  很久之前,估计在2010年左右在使用Oralce,当时有个需求就是需要对两个表...满足上面场景的三个功能即可,可以用程序如(java,C,C#)等各种实现,也可以使用存储过程oracle

    asp.net知识库

    也论该不该在项目中使用存储过程代替SQL语句 如何使数据库中的表更有弹性,更易于扩展 存储过程——天使还是魔鬼 如何获取MSSQLServer,Oracel,Access中的数据字典信息 C#中利用GetOleDbSchemaTable获取数据库内表信息...

    Spring中文帮助文档

    6.8.1. 在Spring中使用AspectJ进行domain object的依赖注入 6.8.2. Spring中其他的AspectJ切面 6.8.3. 使用Spring IoC来配置AspectJ的切面 6.8.4. 在Spring应用中使用AspectJ加载时织入(LTW) 6.9. 更多资源 7...

    SpringBoot集成Druid+MariaDB+Lombok+Mybatis-Plus详解

    Lombok:是一个可以通过简单的注解的形式来帮助我们简化消除一些必须有但显得很臃肿的 Java 代码的工具,简单来说,比如我们新建了一个类,然后在其中写了几个属性,然后通常情况下我们需要手动去建立getter和setter...

    Spring API

    6.8.1. 在Spring中使用AspectJ进行domain object的依赖注入 6.8.2. Spring中其他的AspectJ切面 6.8.3. 使用Spring IoC来配置AspectJ的切面 6.8.4. 在Spring应用中使用AspectJ加载时织入(LTW) 6.9. 更多资源 7...

Global site tag (gtag.js) - Google Analytics