`
iihero
  • 浏览: 250389 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

如何在Oracle中使用Java存储过程 (详解)

阅读更多

其实,这篇短文,我早就应该写了。因为,java存储过程今后在各大数据库厂商中越来越流行,功能也越来越强大。这里以Oracle为例,介绍一下java存储过程的具体用法。
任何转载,请尊重版权。(作者:iihero on csdn)

一、如何创建java存储过程?
通常有三种方法来创建java存储过程。

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

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

SQL>createorreplaceandcompilejavasourcenamed"javademo1"
2as
3importjava.sql.*;
4publicclassJavaDemo1
5{
6publicstaticvoidmain(String[]argv)
7{
8System.out.println("hello,javademo1");
9}
10}
11/

Java已创建。

SQL
>showerrorsjavasource"javademo1"
没有错误。

SQL
>createorreplaceprocedurejavademo1
2as
3languagejavaname'JavaDemo1.main(java.lang.String[])';
4/

过程已创建。

SQL
>setserveroutputon
SQL
>calljavademo1();

调用完成。

SQL
>calldbms_java.set_output(5000);

调用完成。

SQL
>calljavademo1();
hello,javademo1

调用完成。

SQL
>calljavademo1();
hello,javademo1
调用完成。

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

publicclassOracleJavaProc
{
publicstaticvoidmain(String[]argv)
{
System.out.println("It
'saJavaOracleprocedure.");
}
}


SQL>grantcreateanydirectorytoscott;

授权成功。

SQL>connscott/tiger@iihero.oracledb
已连接。
SQL>createorreplacedirectorytest_diras
'd:\oracle';

目录已创建。

SQL>createorreplacejavaclassusingbfile(test_dir,
'OracleJavaProc.CLASS')
2/

Java已创建。

SQL>createorreplaceproceduretestjavaprocaslanguagejavaname
'OracleJavaProc.main(java.lang.String[])';
2/

过程已创建。

SQL>calltestjavaproc();

调用完成。

SQL>executetestjavaproc;

PL/SQL过程已成功完成。

SQL>setserveroutputonsize5000
SQL>calldbms_java.set_output(5000);

调用完成。

SQL>executetestjavaproc;
It
'saJavaOracleprocedure.

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

importjava.sql.*;
importoracle.jdbc.*;

publicclassOracleJavaProc...{

//Addasalgradetothedatabase.
publicstaticvoidaddSalGrade(intgrade,intlosal,inthisal)...{

System.out.println(
"CreatingnewsalgradeforEMPLOYEE...");

try...{
Connectionconn
=
DriverManager.getConnection(
"jdbc:default:connection:");

Stringsql
=
"INSERTINTOsalgrade"+
"(GRADE,LOSAL,HISAL)"+
"VALUES(?,?,?)";
PreparedStatementpstmt
=conn.prepareStatement(sql);
pstmt.setInt(
1,grade);
pstmt.setInt(
2,losal);
pstmt.setInt(
3,hisal);
pstmt.executeUpdate();
pstmt.close();
}

catch(SQLExceptione)...{
System.err.println(
"ERROR!AddingSalgrade:"
+e.getMessage());
}

}

}

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

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

查询一下状态:

连接到:
Oracle9iEnterpriseEditionRelease
9.2.0.1.0-Production
WiththePartitioning,OLAPandOracleDataMiningoptions
JServerRelease
9.2.0.1.0-Production

SQL
>SELECTobject_name,object_type,statusFROMuser_objectsWHEREobject_typeLIKE'JAVA%';

OBJECT_NAME
--------------------------------------------------------------------------------

OBJECT_TYPESTATUS
--------------------------------------------------
OracleJavaProc
JAVACLASSVALID

OracleJavaProc
JAVASOURCEVALID

测试一下存储过程:

SQL>createorreplaceprocedureadd_salgrade(idnumber,losalnumber,hisalnum
ber)
aslanguagejavaname'OracleJavaProc.addSalGrade(int,int,int)';
2/

过程已创建。

SQL
>setserveroutputonsize2000
SQL
>calldbms_java.set_output(2000);

调用完成。

SQL
>executeadd_salgrade(6,10000,15000);
Creatingnewsalgrade
forEMPLOYEE...

PL
/SQL过程已成功完成。

SQL
>select*fromsalgradewheregrade=6;

GRADELOSALHISAL
------------------------------
61000015000

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

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

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

importjava.sql.*;
importoracle.jdbc.*
;

publicclassOracleJavaProc...
{

//Addasalgradetothedatabase.

publicstaticvoidaddSalGrade(intgrade,intlosal,inthisal)...{

System.out.println(
"CreatingnewsalgradeforEMPLOYEE..."
);

try...
{
Connectionconn
=

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

Stringsql
=

"INSERTINTOsalgrade"+
"(GRADE,LOSAL,HISAL)"+
"VALUES(?,?,?)";
PreparedStatementpstmt
=
conn.prepareStatement(sql);
pstmt.setInt(
1
,grade);
pstmt.setInt(
2
,losal);
pstmt.setInt(
3
,hisal);
pstmt.executeUpdate();
pstmt.close();
}

catch(SQLExceptione)...{
System.err.println(
"ERROR!AddingSalgrade:"

+
e.getMessage());
}

}


publicstaticintgetHiSal(intgrade)
...
{
try...
{
Connectionconn
=

DriverManager.getConnection(
"jdbc:default:connection:");
Stringsql
="SELECThisalFROMsalgradeWHEREgrade=?"
;
PreparedStatementpstmt
=
conn.prepareStatement(sql);pstmt.setInt(1, grade);
ResultSetrset
=
pstmt.executeQuery();
intres=0
;
if
(rset.next())
...
{
res
=rset.getInt(1
);
}

rset.close();
returnres;
}
catch
(SQLExceptione)
...
{
System.err.println(
"ERROR!QueryingSalgrade:"

+
e.getMessage());
return -1;
}

}


}

如何更新呢?

D:eclipse3.1workspacedbtest>dropjava-uscott-vOracleJavaProc

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

后边的应用示例:

SQL>createorreplacefunctionquery_hisal(gradenumber)returnnumberaslangu
agejavaname
'OracleJavaProc.getHiSal(int)returnint'
;
2/


函数已创建。

SQL
>setserveroutputonsize2000
SQL
>calldbms_java.set_output(2000);

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

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

9999

全文完!

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


分享到:
评论

相关推荐

    java Oracle存储过程分页整理

    java 调用Oracle存储过程进行分页详解

    oracle 触发器实时调用java 中http接口

    oracle insert数据成功之后调用触发器,触发器调用存储过程,存储实时调用java http

    Java下使用Oracle存储过程(详解)第1/3页

    (作者:iihero on csdn) 一、如何创建java存储过程? 通常有三种方法来创建java存储过程。 1. 使用oracle的sql语句来创建: e.g. 使用create or replace and compile java source named “” as 后边跟上java源程序...

    Java调用Oracle存储过程详解

    主要介绍了Java调用Oracle存储过程详解的相关资料,需要的朋友可以参考下

    Oracle中命名块之存储过程的详解及使用方法

    ◆命名块:具有名称的PL/SQL块,这些命名块被存储在Oracle中,编译一次,以后只可调用就可多次执行。如:存储过程、存储函数、包、触发器等、  存储过程:无返回值;  存储函数:有返回值;  包:可容纳多个过程或...

    java调用存储过程

    提供了java调用存储过程对oracle进行增删改查, 代码简洁明了,易于学习

    oracle学习详解 笔记

    oracle学习详解 笔记 建表,建库,权限,存储,索引,分页,+java分页——java存储

    java 查询oracle数据库所有表DatabaseMetaData的用法(详解)

    下面小编就为大家带来一篇java 查询oracle数据库所有表DatabaseMetaData的用法(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    Oracle包应用详解.doc

    (2)包类似于C++和JAVA语言中的类,其中变量相当于类中的成员变量,过程和函数相当于类方法。把相关的模块归类成为包,可使开发人员利用面向对象的方法进行存储过程的开发,从而提高系统性能。 ...............

    6年javaEE开发的Word资料合集

    Java面试题 最小函数依赖 在数据库中实现base64编码和解码 java servlet总结 java的时间操作 画Web流程图的一点心得 深入Java核心 Java内存分配原理精讲 JAVA调用存储过程详解 经典SQL语句大全 使用jfreechart + ...

    Oracle 10g 学习笔记

    这个笔记是学习oracle数据库过程中整理出来的,比较详细,适合于初学者。 │ oracle与tomcat端口冲突.txt │ Oracle学习笔记.pdf │ Oracle学习笔记.wps │ 安装Oracle后myEclipse不能正常使用.txt │ 手工配置...

    oracle数据匹配merge into的实例详解

    oracle数据匹配merge into的实例详解 前言:  很久之前,估计在2010年左右在使用Oralce,当时有个需求就是需要对两个表...满足上面场景的三个功能即可,可以用程序如(java,C,C#)等各种实现,也可以使用存储过程oracle

    疯狂JAVA讲义

    学生提问:当我们使用编译C程序时,不仅需要指定存放目标文件的位置,也需要指定目标文件的文件名,这里使用javac编译Java程序时怎么不需要指定目标文件的文件名呢? 13 1.5.3 运行Java程序 14 1.5.4 根据...

    asp.net知识库

    也论该不该在项目中使用存储过程代替SQL语句 如何使数据库中的表更有弹性,更易于扩展 存储过程——天使还是魔鬼 如何获取MSSQLServer,Oracel,Access中的数据字典信息 C#中利用GetOleDbSchemaTable获取数据库内表信息...

    Spring中文帮助文档

    6.8.1. 在Spring中使用AspectJ进行domain object的依赖注入 6.8.2. Spring中其他的AspectJ切面 6.8.3. 使用Spring IoC来配置AspectJ的切面 6.8.4. 在Spring应用中使用AspectJ加载时织入(LTW) 6.9. 更多资源 7...

    SpringBoot集成Druid+MariaDB+Lombok+Mybatis-Plus详解

    Lombok:是一个可以通过简单的注解的形式来帮助我们简化消除一些必须有但显得很臃肿的 Java 代码的工具,简单来说,比如我们新建了一个类,然后在其中写了几个属性,然后通常情况下我们需要手动去建立getter和setter...

    Spring API

    6.8.1. 在Spring中使用AspectJ进行domain object的依赖注入 6.8.2. Spring中其他的AspectJ切面 6.8.3. 使用Spring IoC来配置AspectJ的切面 6.8.4. 在Spring应用中使用AspectJ加载时织入(LTW) 6.9. 更多资源 7...

Global site tag (gtag.js) - Google Analytics