储存过程调用java类

本文通过实例来说明储存过程调用java类的详细过程。
实例描述:
在储存过程中通过调用java类的增,删,改方法对book 表进行操作。

代码演示:
1.book 表介绍:

Create Table book( 

Id Number Not Null, 

title Varchar2(50), 

publisher Varchar2(50), 

categoryname Varchar2(50), 

Constraint id_pk Primary Key (Id) 

);



2.编写java类:Bookshelf.java ;
代码如下:

import java.sql.Connection; 

import java.sql.DriverManager; 

import java.sql.PreparedStatement; 

import java.sql.SQLException; 


public class Bookshelf { 

 private static String url = "jdbc:oracle:thin:@10.158.130.94:1521:ORCL"; 

 private static String username = "bruce"; 

 private static String password = "infy"; 


 public static void insertBook(String id, String title, String publisher, String categoryName){ 

 String sql="insert into book values (?,?,?,?)"; 

 Connection conn = null; 

 PreparedStatement pstmt = null; 

 try{ 

 Class.forName("oracle.jdbc.driver.OracleDriver"); 

 conn = DriverManager.getConnection("jdbc:default:connection:"); 

 pstmt = conn.prepareStatement(sql); 

 pstmt.setInt(1, Integer.parseInt(id)); 

 pstmt.setString(2, title); 

 pstmt.setString(3, publisher); 

 pstmt.setString(4, categoryName); 

 pstmt.executeUpdate(); 

 }catch(Exception e){ 

 e.printStackTrace(); 

 }finally{ 

 try { 

 pstmt.close(); 

 conn.close(); 

 } catch (SQLException e) { 

 // TODO Auto-generated catch block 

 e.printStackTrace(); 

 } 

 } 

 } 


 public static void updateBook(String title, String publisher){ 

 String sql="update book set publisher = ? where title = ?"; 

 Connection conn = null; 

 PreparedStatement pstmt = null; 

 try{ 

 Class.forName("oracle.jdbc.driver.OracleDriver"); 

 conn = DriverManager.getConnection("jdbc:default:connection:"); 

 pstmt = conn.prepareStatement(sql); 

 pstmt.setString(2, title); 

 pstmt.setString(1, publisher); 

 pstmt.executeUpdate(); 

 }catch(Exception e){ 

 e.printStackTrace(); 

 }finally{ 

 try { 

 pstmt.close(); 

 conn.close(); 

 } catch (SQLException e) { 

 // TODO Auto-generated catch block 

 e.printStackTrace(); 

 } 

 } 

 } 


 public static void deleteBook(String title){ 

 String sql="delete from book where title = ?"; 

 Connection conn = null; 

 PreparedStatement pstmt = null; 

 try{ 

 Class.forName("oracle.jdbc.driver.OracleDriver"); 

 conn = DriverManager.getConnection("jdbc:default:connection:"); 

 pstmt = conn.prepareStatement(sql); 

 pstmt.setString(1, title); 

 pstmt.executeUpdate(); 

 }catch(Exception e){ 

 System.out.println(e.getMessage()); 

 }finally{ 

 try { 

 pstmt.close(); 

 conn.close(); 

 } catch (SQLException e) { 

 // TODO Auto-generated catch block 

 e.printStackTrace(); 

 } 

 } 

 } 

}



3.编译此java类:
javac Bookshelf.java
这一步必须成功完成,如果在编译中出现错误,应该检查环境配置和类文件。

4.将类装入oracle数据库:
在windows命令行下,输入
loadjava -u bruce@orcl/infy -verbose Bookshelf.java
将会看到关于加载该类到数据库的一系列注释。出现任何错误,加载都不会完成。
-verbose: 在执行loadjava过程中,显示进度信息。

5.储存过程中访问java类:
往book表中插入数据:
Create Or Replace Procedure insertBookViaJava(Id In Varchar2, Title In Varchar2, publisher In Varchar2,categoryname In Varchar2)
As
Language Java
Name 'Bookshelf.insertBook(java.lang.String, java.lang.String, java.lang.String, java.lang.String)';

更新book表中的数据:
Create Or Replace Procedure updateBookViaJava(Title Varchar2, publisher Varchar2)
As
Language Java
Name 'Bookshelf.updateBook(java.lang.String, java.lang.String)';

删除book表中的数据:
Create Or Replace Procedure deleteBookViaJava(Title Varchar2)
As
Language Java
Name 'Bookshelf.deleteBook(java.lang.String)';

6.方法调用:
现在,进入SQL*Plus,使用call命令执行java类:
call deleteBookViaJava("titleName");
你将看到如下响应:
Call completed.

除了使用call, 还可以在PL/SQL块中执行过程:

begin
deleteBookViaJava("titleName");
end;
/

7.Game over:
当调试java储存过程时,可以在java代码中调用System.out.println("......");
为了在SQL*Plus中显示输出,必须首先执行下面命令:
set serveroutput on

call DBMS_JAVA.SET_OUTPUT(10000);

调用DBMS_JAVA.SET_OUTPUT 将把System.out.println de 输出重定向到DBMS_OUTPUT.PUT_LINE.