发布网友 发布时间:2022-04-20 11:16
共1个回答
热心网友 时间:2022-05-06 03:35
java 存储过程今后在各大数据库厂商中越来越流行,功能也越来越强大。这里以 Oracle 为例,介绍一下java 存储过程的具体用法。 一、如何创建java 存储过程? 通常有三种方法来创建java 存储过程。 1. 使用oracle 的sql 语句来创建: e.g. 使用create or replace and compile java source named "" as 后边跟上java 源程序。要求类的方法必须是public static 的,才能用于存储过程。 SQL> create or replace and compile java source named "javademo1" 2 as 3 import java.sql.*; 4 public class JavaDemo1 5 { 6 public static void main(String[] args) 7 { 8 System.out.println("hello, java demo1"); 9 } 10 } 11 / Java 已创建。 SQL> show errors java source "javademo1" 没有错误。 SQL> create or replace procere javademo1 2 as 3 language java name 'JavaDemo1.main(java.lang.String[])'; 4 / 过程已创建。 SQL> set serveroutput on size 5000 SQL> call dbms_java.set_output(5000); --java 语言向控制台输出 SQL> execute javademo1(); --execute 存储过程名称 hello, java demo1 调用完成。 2. 使用外部class 文件来装载创建 Class 文件放置在其他目录下调用方法 e.g. 这里既然用到了外部文件,必然要将class 文件放到oracle Server 的某一目录下边。 public class OracleJavaProc { public static void main(String[] argv) { System.out.println("It's a Java Oracle procere."); } } SQL> grant create any directory to scott; 授权成功。 SQL> conn 已连接。 SQL> create or replace directory test_dir as 'd:/oracle'; 目录已创建。 using -- 使用 bfile---外部文件 SQL> create or replace java class using bfile(test_dir, 'OracleJavaProc.CLASS') 2 / Java 已创建。 SQL> create or replace procere testjavaproc as language java name 'OracleJavaProc.main(java.lang.String[])'; 2 / 过程已创建。 SQL> call testjavaproc(); 调用完成。 SQL> execute testjavaproc; PL/SQL 过程已成功完成。 SQL> set serveroutput on size 5000 SQL> call dbms_java.set_output(5000); 调用完成。 SQL> execute testjavaproc; It's a Java Oracle procere. 3. 我推荐的一种方法,直接使用loadjava 命令远程装载并创建。 先创建一个类, e.g. import java.sql.*; import oracle.jdbc.*; public class OracleJavaProc { //Add a salgrade to the database. public static void addSalGrade(int grade, int losal, int hisal) { System.out.println("Creating new salgrade for EMPLOYEE..."); try { Connection conn = DriverManager.getConnection("jdbc:default:connection:"); String sql = "INSERT INTO salgrade " + "(GRADE,LOSAL,HISAL) " + "VALUES(?,?,?)"; PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setInt(1,grade); pstmt.setInt(2,losal); pstmt.setInt(3,hisal); pstmt.executeUpdate(); pstmt.close(); } catch(SQLException e) { System.err.println("ERROR! Adding Salgrade: " + e.getMessage()); } } } 使用loadjava 命令将其装载到服务器端并编译: D:eclipse3.1workspacedbtest>loadjava -u -v -resolve Or acleJavaProc.java arguments: '-u' '-v' '-resolve' 'OracleJavaProc.java' creating : source OracleJavaProc loading : source OracleJavaProc resolving: source OracleJavaProc 查询一下状态: 连接到: Oracle9i Enterprise Edition Release 9.2.0.1.0 - Proction With the Partitioning, OLAP and Oracle Data Mining options JServer Release 9.2.0.1.0 - Proction SQL> SELECT object_name, object_type, status FROM user_objects WHERE object_type LIKE 'JAVA%'; OBJECT_NAME -------------------------------------------------------------------------------- OBJECT_TYPE STATUS ------------------------------------ -------------- OracleJavaProc JAVA CLASS VALID OracleJavaProc JAVA SOURCE VALID 测试一下存储过程: SQL> create or replace procere add_salgrade(id number, losal number, hisal num ber) as language java name 'OracleJavaProc.addSalGrade(int, int, int)'; 2 / 过程已创建。 SQL> set serveroutput on size 2000 SQL> call dbms_java.set_output(2000); 调用完成。 SQL> execute add_salgrade(6, 10000, 15000); Creating new salgrade for EMPLOYEE... PL/SQL 过程已成功完成。 SQL> select * from salgrade where grade=6; GRADE LOSAL HISAL ---------- ---------- ---------- 6 10000 15000 二、如何更新你已经编写的java 存储过程? 假如要往类OracleJavaProc 里添加一个存储过程方法,如何开发? 正确的步骤应该是先dropjava, 改程序,再loadjava。 e.g.修改OracleJavaProc 类内容如下: import java.sql.*; import oracle.jdbc.*; public class OracleJavaProc { // Add a salgrade to the database. public static void addSalGrade(int grade, int losal, int hisal) ...{ System.out.println("Creating new salgrade for EMPLOYEE..."); try ...{ Connection conn = DriverManager.getConnection("jdbc:default:connection:"); String sql = "INSERT INTO salgrade " + "(GRADE,LOSAL,HISAL) " + "VALUES(?,?,?