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

其实,这篇短文,我早就应该写了。因为,Java存储过程今后在各大数据库厂商中越来越流行,功能也越来越强大。这里以Oracle为例,介绍一下java存储过程的具体用法。

创新互联2013年至今,是专业互联网技术服务公司,拥有项目做网站、网站建设网站策划,项目实施与项目整合能力。我们以让每一个梦想脱颖而出为使命,1280元芒市做网站,已为上家服务,为芒市各地企业和个人服务,联系电话:13518219792

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

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

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

e.g. 使用create or replace and compile java source named "" 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.    
  27.    public static int getHiSal(int grade)
  28.    {
  29.     try {
  30.         Connection conn =
  31.           DriverManager.getConnection("jdbc:default:connection:");
  32.         String sql = "SELECT hisal FROM salgrade WHERE grade = ?";
  33.         PreparedStatement pstmt = conn.prepareStatement(sql);pstmt.setInt(1, grade);
  34.         ResultSet rset = pstmt.executeQuery();
  35.         int res = 0;
  36.         if (rset.next())
  37.         {
  38.             res = rset.getInt(1);
  39.         }
  40.         rset.close();
  41.         return res;
  42.        }
  43.     catch (SQLException e) 
  44.     {
  45.         System.err.println("ERROR! Querying Salgrade: " 
  46.            + e.getMessage());
  47.           return -1;
  48.     }    
  49.    }
  50.       
  51. }

如何更新呢?

 
 
 
  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

全文完!

用法个人见解:不要手动drop java source, 不要手动drop procedure。

分享标题:如何在Oracle中使用Java存储过程(详解)
当前地址:http://www.shufengxianlan.com/qtweb/news29/83579.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联