其实,这篇短文,我早就应该写了。因为,java存储过程今后在各大数据库厂商中越来越流行,功能也越来越强大。这里以Oracle为例,介绍一下java存储过程的具体用法。
作者:iihero  
一、如何创建java存储过程?
通常有三种方法来创建java存储过程。

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

e.g. 使用create or replace and compile java source named "<name>" as
       后边跟上java源程序。要求类的方法必须是public static的,才能用于存储过程。

如何在Oracle中使用Java存储过程 (详解)_oracleSQL> create or replace and compile java source named "javademo1"
如何在Oracle中使用Java存储过程 (详解)_oracle  2  as
如何在Oracle中使用Java存储过程 (详解)_oracle  3  import java.sql.*;
如何在Oracle中使用Java存储过程 (详解)_oracle  4  public class JavaDemo1
如何在Oracle中使用Java存储过程 (详解)_oracle  5  {
如何在Oracle中使用Java存储过程 (详解)_oracle  6  public static void main(String[] argv)
如何在Oracle中使用Java存储过程 (详解)_oracle  7  {
如何在Oracle中使用Java存储过程 (详解)_oracle  8  System.out.println("hello, java demo1");
如何在Oracle中使用Java存储过程 (详解)_oracle  9  }
如何在Oracle中使用Java存储过程 (详解)_oracle 10  }
如何在Oracle中使用Java存储过程 (详解)_oracle 11  /
如何在Oracle中使用Java存储过程 (详解)_oracle
如何在Oracle中使用Java存储过程 (详解)_oracleJava 已创建。
如何在Oracle中使用Java存储过程 (详解)_oracle
如何在Oracle中使用Java存储过程 (详解)_oracleSQL> show errors java source "javademo1"
如何在Oracle中使用Java存储过程 (详解)_oracle没有错误。
如何在Oracle中使用Java存储过程 (详解)_oracle
如何在Oracle中使用Java存储过程 (详解)_oracleSQL> create or replace procedure javademo1
如何在Oracle中使用Java存储过程 (详解)_oracle  2  as
如何在Oracle中使用Java存储过程 (详解)_oracle  3  language java name 'JavaDemo1.main(java.lang.String[])';
如何在Oracle中使用Java存储过程 (详解)_oracle  4  /
如何在Oracle中使用Java存储过程 (详解)_oracle
如何在Oracle中使用Java存储过程 (详解)_oracle过程已创建。
如何在Oracle中使用Java存储过程 (详解)_oracle
如何在Oracle中使用Java存储过程 (详解)_oracleSQL> set serveroutput on
如何在Oracle中使用Java存储过程 (详解)_oracleSQL> call javademo1();
如何在Oracle中使用Java存储过程 (详解)_oracle
如何在Oracle中使用Java存储过程 (详解)_oracle调用完成。
如何在Oracle中使用Java存储过程 (详解)_oracle
如何在Oracle中使用Java存储过程 (详解)_oracleSQL> call dbms_java.set_output(5000);
如何在Oracle中使用Java存储过程 (详解)_oracle
如何在Oracle中使用Java存储过程 (详解)_oracle调用完成。
如何在Oracle中使用Java存储过程 (详解)_oracle
如何在Oracle中使用Java存储过程 (详解)_oracleSQL> call javademo1();
如何在Oracle中使用Java存储过程 (详解)_oraclehello, java demo1
如何在Oracle中使用Java存储过程 (详解)_oracle
如何在Oracle中使用Java存储过程 (详解)_oracle调用完成。
如何在Oracle中使用Java存储过程 (详解)_oracle
如何在Oracle中使用Java存储过程 (详解)_oracleSQL> call javademo1();
如何在Oracle中使用Java存储过程 (详解)_oraclehello, java demo1
如何在Oracle中使用Java存储过程 (详解)_oracle调用完成。

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

如何在Oracle中使用Java存储过程 (详解)_oraclepublic class OracleJavaProc
如何在Oracle中使用Java存储过程 (详解)_oracle{
如何在Oracle中使用Java存储过程 (详解)_oracle    public static void main(String[] argv)
如何在Oracle中使用Java存储过程 (详解)_oracle    {
如何在Oracle中使用Java存储过程 (详解)_oracle        System.out.println("It's a Java Oracle procedure.");
如何在Oracle中使用Java存储过程 (详解)_oracle    }
如何在Oracle中使用Java存储过程 (详解)_oracle}
如何在Oracle中使用Java存储过程 (详解)_oracle
如何在Oracle中使用Java存储过程 (详解)_oracle
如何在Oracle中使用Java存储过程 (详解)_oracleSQL> grant create any directory to scott;
如何在Oracle中使用Java存储过程 (详解)_oracle
如何在Oracle中使用Java存储过程 (详解)_oracle授权成功。
如何在Oracle中使用Java存储过程 (详解)_oracle
如何在Oracle中使用Java存储过程 (详解)_oracleSQL> conn scott/tiger@iihero.oracledb
如何在Oracle中使用Java存储过程 (详解)_oracle已连接。
如何在Oracle中使用Java存储过程 (详解)_oracleSQL> create or   replace   directory   test_dir   as  'd:/oracle';
如何在Oracle中使用Java存储过程 (详解)_oracle
如何在Oracle中使用Java存储过程 (详解)_oracle目录已创建。
如何在Oracle中使用Java存储过程 (详解)_oracle
如何在Oracle中使用Java存储过程 (详解)_oracleSQL> create or replace java class using bfile(test_dir, 'OracleJavaProc.CLASS')
如何在Oracle中使用Java存储过程 (详解)_oracle  2  /
如何在Oracle中使用Java存储过程 (详解)_oracle
如何在Oracle中使用Java存储过程 (详解)_oracleJava 已创建。
如何在Oracle中使用Java存储过程 (详解)_oracle
如何在Oracle中使用Java存储过程 (详解)_oracleSQL> create or replace procedure testjavaproc as language java name 'OracleJavaProc.main(java.lang.String[])';
如何在Oracle中使用Java存储过程 (详解)_oracle  2  /
如何在Oracle中使用Java存储过程 (详解)_oracle
如何在Oracle中使用Java存储过程 (详解)_oracle过程已创建。
如何在Oracle中使用Java存储过程 (详解)_oracle
如何在Oracle中使用Java存储过程 (详解)_oracleSQL> call testjavaproc();
如何在Oracle中使用Java存储过程 (详解)_oracle
如何在Oracle中使用Java存储过程 (详解)_oracle调用完成。
如何在Oracle中使用Java存储过程 (详解)_oracle
如何在Oracle中使用Java存储过程 (详解)_oracleSQL> execute testjavaproc;
如何在Oracle中使用Java存储过程 (详解)_oracle
如何在Oracle中使用Java存储过程 (详解)_oraclePL/SQL 过程已成功完成。
如何在Oracle中使用Java存储过程 (详解)_oracle
如何在Oracle中使用Java存储过程 (详解)_oracleSQL> set serveroutput on size 5000
如何在Oracle中使用Java存储过程 (详解)_oracleSQL> call dbms_java.set_output(5000);
如何在Oracle中使用Java存储过程 (详解)_oracle
如何在Oracle中使用Java存储过程 (详解)_oracle调用完成。
如何在Oracle中使用Java存储过程 (详解)_oracle
如何在Oracle中使用Java存储过程 (详解)_oracleSQL> execute testjavaproc;
如何在Oracle中使用Java存储过程 (详解)_oracleIt's a Java Oracle procedure.

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

如何在Oracle中使用Java存储过程 (详解)_oracleimport java.sql.*;
如何在Oracle中使用Java存储过程 (详解)_oracleimport oracle.jdbc.*;
如何在Oracle中使用Java存储过程 (详解)_oracle
如何在Oracle中使用Java存储过程 (详解)_sql_89如何在Oracle中使用Java存储过程 (详解)_sql_90public class OracleJavaProc ...{
如何在Oracle中使用Java存储过程 (详解)_存储过程_91
如何在Oracle中使用Java存储过程 (详解)_存储过程_91   //Add a salgrade to the database.
如何在Oracle中使用Java存储过程 (详解)_java_93如何在Oracle中使用Java存储过程 (详解)_oracle_94   public static void addSalGrade(int grade, int losal, int hisal) ...{
如何在Oracle中使用Java存储过程 (详解)_存储过程_91
如何在Oracle中使用Java存储过程 (详解)_存储过程_91      System.out.println("Creating new salgrade for EMPLOYEE...");
如何在Oracle中使用Java存储过程 (详解)_存储过程_91
如何在Oracle中使用Java存储过程 (详解)_java_93如何在Oracle中使用Java存储过程 (详解)_oracle_94      try ...{
如何在Oracle中使用Java存储过程 (详解)_存储过程_91         Connection conn =
如何在Oracle中使用Java存储过程 (详解)_存储过程_91            DriverManager.getConnection("jdbc:default:connection:");
如何在Oracle中使用Java存储过程 (详解)_存储过程_91
如何在Oracle中使用Java存储过程 (详解)_存储过程_91         String sql =
如何在Oracle中使用Java存储过程 (详解)_存储过程_91            "INSERT INTO salgrade " +
如何在Oracle中使用Java存储过程 (详解)_存储过程_91            "(GRADE,LOSAL,HISAL) " +
如何在Oracle中使用Java存储过程 (详解)_存储过程_91            "VALUES(?,?,?)";
如何在Oracle中使用Java存储过程 (详解)_存储过程_91         PreparedStatement pstmt = conn.prepareStatement(sql);
如何在Oracle中使用Java存储过程 (详解)_存储过程_91         pstmt.setInt(1,grade);
如何在Oracle中使用Java存储过程 (详解)_存储过程_91         pstmt.setInt(2,losal);
如何在Oracle中使用Java存储过程 (详解)_存储过程_91         pstmt.setInt(3,hisal);
如何在Oracle中使用Java存储过程 (详解)_存储过程_91         pstmt.executeUpdate();
如何在Oracle中使用Java存储过程 (详解)_存储过程_91         pstmt.close();
如何在Oracle中使用Java存储过程 (详解)_javad_113         }
如何在Oracle中使用Java存储过程 (详解)_java_93如何在Oracle中使用Java存储过程 (详解)_oracle_94      catch(SQLException e) ...{
如何在Oracle中使用Java存储过程 (详解)_存储过程_91         System.err.println("ERROR! Adding Salgrade: " 
如何在Oracle中使用Java存储过程 (详解)_存储过程_91           + e.getMessage());
如何在Oracle中使用Java存储过程 (详解)_javad_113         }
如何在Oracle中使用Java存储过程 (详解)_javad_113   }
如何在Oracle中使用Java存储过程 (详解)_oracle_120}

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

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

查询一下状态:

如何在Oracle中使用Java存储过程 (详解)_oracle连接到:
如何在Oracle中使用Java存储过程 (详解)_oracleOracle9i Enterprise Edition Release 9.2.0.1.0 - Production
如何在Oracle中使用Java存储过程 (详解)_oracleWith the Partitioning, OLAP and Oracle Data Mining options
如何在Oracle中使用Java存储过程 (详解)_oracleJServer Release 9.2.0.1.0 - Production
如何在Oracle中使用Java存储过程 (详解)_oracle
如何在Oracle中使用Java存储过程 (详解)_oracleSQL> SELECT object_name, object_type, status FROM user_objects WHERE object_type LIKE 'JAVA%';
如何在Oracle中使用Java存储过程 (详解)_oracle
如何在Oracle中使用Java存储过程 (详解)_oracleOBJECT_NAME
如何在Oracle中使用Java存储过程 (详解)_oracle--------------------------------------------------------------------------------
如何在Oracle中使用Java存储过程 (详解)_oracle
如何在Oracle中使用Java存储过程 (详解)_oracleOBJECT_TYPE                          STATUS
如何在Oracle中使用Java存储过程 (详解)_oracle------------------------------------ --------------
如何在Oracle中使用Java存储过程 (详解)_oracleOracleJavaProc
如何在Oracle中使用Java存储过程 (详解)_oracleJAVA CLASS                           VALID
如何在Oracle中使用Java存储过程 (详解)_oracle
如何在Oracle中使用Java存储过程 (详解)_oracleOracleJavaProc
如何在Oracle中使用Java存储过程 (详解)_oracleJAVA SOURCE                          VALID

测试一下存储过程:

如何在Oracle中使用Java存储过程 (详解)_oracleSQL> create or replace procedure add_salgrade(id number, losal number, hisal num
如何在Oracle中使用Java存储过程 (详解)_oracleber) as language java name 'OracleJavaProc.addSalGrade(int, int, int)';
如何在Oracle中使用Java存储过程 (详解)_oracle  2  /
如何在Oracle中使用Java存储过程 (详解)_oracle
如何在Oracle中使用Java存储过程 (详解)_oracle过程已创建。
如何在Oracle中使用Java存储过程 (详解)_oracle
如何在Oracle中使用Java存储过程 (详解)_oracleSQL> set serveroutput on size 2000
如何在Oracle中使用Java存储过程 (详解)_oracleSQL> call dbms_java.set_output(2000);
如何在Oracle中使用Java存储过程 (详解)_oracle
如何在Oracle中使用Java存储过程 (详解)_oracle调用完成。
如何在Oracle中使用Java存储过程 (详解)_oracle
如何在Oracle中使用Java存储过程 (详解)_oracleSQL> execute add_salgrade(61000015000);
如何在Oracle中使用Java存储过程 (详解)_oracleCreating new salgrade for EMPLOYEE...
如何在Oracle中使用Java存储过程 (详解)_oracle
如何在Oracle中使用Java存储过程 (详解)_oraclePL/SQL 过程已成功完成。
如何在Oracle中使用Java存储过程 (详解)_oracle
如何在Oracle中使用Java存储过程 (详解)_oracleSQL> select * from salgrade where grade=6;
如何在Oracle中使用Java存储过程 (详解)_oracle
如何在Oracle中使用Java存储过程 (详解)_oracle     GRADE      LOSAL      HISAL
如何在Oracle中使用Java存储过程 (详解)_oracle---------- ---------- ----------
如何在Oracle中使用Java存储过程 (详解)_oracle         6      10000      15000

 

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

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

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

如何在Oracle中使用Java存储过程 (详解)_oracleimport java.sql.*;
如何在Oracle中使用Java存储过程 (详解)_oracleimport oracle.jdbc.*;
如何在Oracle中使用Java存储过程 (详解)_oracle
如何在Oracle中使用Java存储过程 (详解)_sql_89如何在Oracle中使用Java存储过程 (详解)_sql_90public class OracleJavaProc ...{
如何在Oracle中使用Java存储过程 (详解)_存储过程_91
如何在Oracle中使用Java存储过程 (详解)_存储过程_91   // Add a salgrade to the database.
如何在Oracle中使用Java存储过程 (详解)_java_93如何在Oracle中使用Java存储过程 (详解)_oracle_94   public static void addSalGrade(int grade, int losal, int hisal) ...{
如何在Oracle中使用Java存储过程 (详解)_存储过程_91
如何在Oracle中使用Java存储过程 (详解)_存储过程_91      System.out.println("Creating new salgrade for EMPLOYEE...");
如何在Oracle中使用Java存储过程 (详解)_存储过程_91
如何在Oracle中使用Java存储过程 (详解)_java_93如何在Oracle中使用Java存储过程 (详解)_oracle_94      try ...{
如何在Oracle中使用Java存储过程 (详解)_存储过程_91         Connection conn =
如何在Oracle中使用Java存储过程 (详解)_存储过程_91            DriverManager.getConnection("jdbc:default:connection:");
如何在Oracle中使用Java存储过程 (详解)_存储过程_91
如何在Oracle中使用Java存储过程 (详解)_存储过程_91         String sql =
如何在Oracle中使用Java存储过程 (详解)_存储过程_91            "INSERT INTO salgrade " +
如何在Oracle中使用Java存储过程 (详解)_存储过程_91            "(GRADE,LOSAL,HISAL) " +
如何在Oracle中使用Java存储过程 (详解)_存储过程_91            "VALUES(?,?,?)";
如何在Oracle中使用Java存储过程 (详解)_存储过程_91         PreparedStatement pstmt = conn.prepareStatement(sql);
如何在Oracle中使用Java存储过程 (详解)_存储过程_91         pstmt.setInt(1,grade);
如何在Oracle中使用Java存储过程 (详解)_存储过程_91         pstmt.setInt(2,losal);
如何在Oracle中使用Java存储过程 (详解)_存储过程_91         pstmt.setInt(3,hisal);
如何在Oracle中使用Java存储过程 (详解)_存储过程_91         pstmt.executeUpdate();
如何在Oracle中使用Java存储过程 (详解)_存储过程_91         pstmt.close();
如何在Oracle中使用Java存储过程 (详解)_javad_113         }
如何在Oracle中使用Java存储过程 (详解)_java_93如何在Oracle中使用Java存储过程 (详解)_oracle_94      catch(SQLException e) ...{
如何在Oracle中使用Java存储过程 (详解)_存储过程_91         System.err.println("ERROR! Adding Salgrade: " 
如何在Oracle中使用Java存储过程 (详解)_存储过程_91           + e.getMessage());
如何在Oracle中使用Java存储过程 (详解)_javad_113         }
如何在Oracle中使用Java存储过程 (详解)_javad_113   }
如何在Oracle中使用Java存储过程 (详解)_存储过程_91   
如何在Oracle中使用Java存储过程 (详解)_存储过程_91   public static int getHiSal(int grade)
如何在Oracle中使用Java存储过程 (详解)_java_93如何在Oracle中使用Java存储过程 (详解)_oracle_94   ...{
如何在Oracle中使用Java存储过程 (详解)_java_93如何在Oracle中使用Java存储过程 (详解)_oracle_94    try ...{
如何在Oracle中使用Java存储过程 (详解)_存储过程_91        Connection conn =
如何在Oracle中使用Java存储过程 (详解)_存储过程_91          DriverManager.getConnection("jdbc:default:connection:");
如何在Oracle中使用Java存储过程 (详解)_存储过程_91        String sql = "SELECT hisal FROM salgrade WHERE grade = ?";
如何在Oracle中使用Java存储过程 (详解)_存储过程_91        PreparedStatement pstmt = conn.prepareStatement(sql);pstmt.setInt(1, grade);
如何在Oracle中使用Java存储过程 (详解)_存储过程_91        ResultSet rset = pstmt.executeQuery();
如何在Oracle中使用Java存储过程 (详解)_存储过程_91        int res = 0;
如何在Oracle中使用Java存储过程 (详解)_存储过程_91        if (rset.next())
如何在Oracle中使用Java存储过程 (详解)_java_93如何在Oracle中使用Java存储过程 (详解)_oracle_94        ...{
如何在Oracle中使用Java存储过程 (详解)_存储过程_91            res = rset.getInt(1);
如何在Oracle中使用Java存储过程 (详解)_javad_113        }
如何在Oracle中使用Java存储过程 (详解)_存储过程_91        rset.close();
如何在Oracle中使用Java存储过程 (详解)_存储过程_91        return res;
       }
如何在Oracle中使用Java存储过程 (详解)_存储过程_91    catch (SQLException e) 
如何在Oracle中使用Java存储过程 (详解)_java_93如何在Oracle中使用Java存储过程 (详解)_oracle_94    ...{
如何在Oracle中使用Java存储过程 (详解)_存储过程_91        System.err.println("ERROR! Querying Salgrade: " 
如何在Oracle中使用Java存储过程 (详解)_存储过程_91           + e.getMessage());
          return -1;
如何在Oracle中使用Java存储过程 (详解)_javad_113    }    
如何在Oracle中使用Java存储过程 (详解)_javad_113   }
如何在Oracle中使用Java存储过程 (详解)_存储过程_91      
如何在Oracle中使用Java存储过程 (详解)_javad_113}

如何更新呢?

D:eclipse3.1workspacedbtest>dropjava -u scott -v OracleJavaProc

D:/tiger@iihero.oracledbeclipse3.1workspacedbtest>loadjava -u scott -v -resolve Or
acleJavaProc/tiger@iihero.oracledb.java
arguments: '-u' 'scott/tiger@iihero.oracledb' '-v' '-resolve' 'OracleJavaProc.java'
creating : source OracleJavaProc
loading  : source OracleJavaProc
resolving: source OracleJavaProc

后边的应用示例:

SQL> create or replace function query_hisal(grade number) return number as langu
age java name 'OracleJavaProc.getHiSal(int) return int';
  2  /

函数已创建。

SQL> set serveroutput on size 2000
SQL> call dbms_java.set_output(2000);

调用完成。
SQL> select query_hisal(5) from dual;

QUERY_HISAL(5)
--------------
          9999

全文完!

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