求知 文章 文库 Lib 视频 iProcess 课程 角色 咨询 工具 讲座 Modeler   Code  
会员   
 
  
每天15篇文章
不仅获得谋生技能
更可以追随信仰
 
 
     
   
分享到
如何在Oracle中使用Java存储过程 (详解)
 

作者:iihero,发布于2012-3-30

 

因为,java存储过程今后在各大数据库厂商中越来越流行,功能也越来越强大。这里以Oracle为例,介绍一下java存储过程的具体用法。

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

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

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

e.g. 使用create or replace and compile java source named "<name>" as

后边跟上java源程序。要求类的方法必须是public static的,才能用于存储过程。

SQL> create or replace and compile java source named "javademo1"

as

import java.sql.*;

public class JavaDemo1

{

public static void main(String[] argv)

{

System.out.println("hello, java demo1");

}

}

/

Java 已创建。

SQL> show errors java source "javademo1"

没有错误。

SQL> create or replace procedure javademo1

as

language java name 'JavaDemo1.main(java.lang.String[])';

/

过程已创建。

SQL> set serveroutput on

SQL> call javademo1();

调用完成。

SQL> call dbms_java.set_output(5000);

调用完成。

SQL> call javademo1();

hello, java demo1

调用完成。

SQL> call javademo1();

hello, java demo1

调用完成。

2. 使用外部class文件来装载创建

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

public class OracleJavaProc

{

public static void main(String[] argv)

{

System.out.println("It's a Java Oracle procedure.");

}

}

SQL> grant create any directory to scott;

授权成功。

SQL> conn scott/tiger@iihero.oracledb

已连接。

SQL> create or replace directory test_dir as 'd:/oracle';

目录已创建。

SQL> create or replace java class using bfile(test_dir, 'OracleJavaProc.CLASS')

2 /

Java 已创建。

SQL> create or replace procedure 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 procedure.

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 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

查询一下状态:

连接到:

Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production

With the Partitioning, OLAP and Oracle Data Mining options

JServer Release 9.2.0.1.0 - Production

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 procedure 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(?,?,?)";

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());

}

}

public static int getHiSal(int grade)

{

try {

Connection conn =

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

String sql = "SELECT hisal FROM salgrade WHERE grade = ?";

PreparedStatement pstmt = conn.prepareStatement(sql);pstmt.setInt(1, grade);

ResultSet rset = pstmt.executeQuery();

int res = 0;

if (rset.next())

{

res = rset.getInt(1);

}

rset.close();

return res;

}

catch (SQLException e)

{

System.err.println("ERROR! Querying Salgrade: "

+ e.getMessage());

return -1;

  }

}

}

如何更新呢?

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

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。


相关文章 相关文档 相关视频



我们该如何设计数据库
数据库设计经验谈
数据库设计过程
数据库编程总结
数据库性能调优技巧
数据库性能调整
数据库性能优化讲座
数据库系统性能调优系列
高性能数据库设计与优化
高级数据库架构师
数据仓库和数据挖掘技术
Hadoop原理、部署与性能调优

 
分享到
 
 
     


MySQL索引背后的数据结构
MySQL性能调优与架构设计
SQL Server数据库备份与恢复
让数据库飞起来 10大DB2优化
oracle的临时表空间写满磁盘
数据库的跨平台设计
更多...   


并发、大容量、高性能数据库
高级数据库架构设计师
Hadoop原理与实践
Oracle 数据仓库
数据仓库和数据挖掘
Oracle数据库开发与管理


GE 区块链技术与实现培训
航天科工某子公司 Nodejs高级应用开发
中盛益华 卓越管理者必须具备的五项能力
某信息技术公司 Python培训
某博彩IT系统厂商 易用性测试与评估
中国邮储银行 测试成熟度模型集成(TMMI)
中物院 产品经理与产品管理
更多...   
 
 
 
 
 
每天2个文档/视频
扫描微信二维码订阅
订阅技术月刊
获得每月300个技术资源
 
 

关于我们 | 联系我们 | 京ICP备10020922号 京公海网安备110108001071号