储存过程调用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.