- 浏览: 250389 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
no_studio:
期待实现SqlServer
发布异种数据库导入工具jmyetl-1.0.2 -
babydeed:
不错 再接再厉
发布异种数据库导入工具jmyetl-1.0.2 -
iihero:
niwtsew 写道贴个俺自己写的linux下的版本,其实没必 ...
命令行快速找出class文件所在的jar包 -
niwtsew:
说错,是strings不是string
命令行快速找出class文件所在的jar包 -
niwtsew:
贴个俺自己写的linux下的版本,其实没必要用7z,直接jar ...
命令行快速找出class文件所在的jar包
其实,这篇短文,我早就应该写了。因为,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
调用完成。
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.
{
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());
}
}
}
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
acleJavaProc.java
arguments:'-u''scott/tiger@iihero.oracledb'-v''-resolve''OracleJavaProc.java'
creating:sourceOracleJavaProc
loading:sourceOracleJavaProc
resolving:sourceOracleJavaProc
查询一下状态:
连接到:
Oracle9iEnterpriseEditionRelease9.2.0.1.0-Production
WiththePartitioning,OLAPandOracleDataMiningoptions
JServerRelease9.2.0.1.0-Production
SQL>SELECTobject_name,object_type,statusFROMuser_objectsWHEREobject_typeLIKE'JAVA%';
OBJECT_NAME
--------------------------------------------------------------------------------
OBJECT_TYPESTATUS
--------------------------------------------------
OracleJavaProc
JAVACLASSVALID
OracleJavaProc
JAVASOURCEVALID
Oracle9iEnterpriseEditionRelease9.2.0.1.0-Production
WiththePartitioning,OLAPandOracleDataMiningoptions
JServerRelease9.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);
CreatingnewsalgradeforEMPLOYEE...
PL/SQL过程已成功完成。
SQL>select*fromsalgradewheregrade=6;
GRADELOSALHISAL
------------------------------
61000015000
ber)aslanguagejavaname'OracleJavaProc.addSalGrade(int,int,int)';
2/
过程已创建。
SQL>setserveroutputonsize2000
SQL>calldbms_java.set_output(2000);
调用完成。
SQL>executeadd_salgrade(6,10000,15000);
CreatingnewsalgradeforEMPLOYEE...
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;
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;
}
}
}
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
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)fromdual;
QUERY_HISAL(5)
--------------
9999
agejavaname'OracleJavaProc.getHiSal(int)returnint';
2/
函数已创建。
SQL>setserveroutputonsize2000
SQL>calldbms_java.set_output(2000);
调用完成。
SQL>selectquery_hisal(5)fromdual;
QUERY_HISAL(5)
--------------
9999
全文完!
用法个人见解:不要手动drop java source, 不要手动drop procedure。
发表评论
-
发布异种数据库导入工具jmyetl-1.0.2
2012-06-11 05:14 1675利用空闲时间,折腾了一个,界面不太擅长,比较简陋,但是相信大家 ... -
各种数据库临时表的使用区别总结
2012-05-24 08:22 2391[size=large]虽然SQL92, 99, 2003, ... -
Oracle11.2.0非安装版(简装版)制作完成(仅供开发人员参考使用)
2012-03-11 13:57 1738作者: iihero@CSDN, 2012.3.11. 请尊重 ... -
常用的数据库连接串(JDBC篇)
2011-12-23 06:58 0看到网上传来传去的jdbc url连接串总结,好多都是粘来粘去 ... -
DBCP连接池的最简单应用(用于ORACLE数据库)
2011-11-19 05:54 4394鉴于有人问起DBCP直接用于JDBC连接的问题,我做了一个最简 ... -
Oracle的几位创始人
2011-11-04 00:31 1765Oracle共有三位创始人。 1. Larry Ellison ... -
DBeaver数据库管理工具连接Sybase数据库使用体验
2011-09-26 20:12 7204从http://dbeaver.jkiss.org/下 ... -
OCI几个小问题
2011-04-26 10:23 17081、CLOG/BLOG的插入 找了很多OCI的例子以及一些P ... -
关于Oracle中的rownum两个使用原则
2005-12-07 10:49 847rownum 只能< 不能>rownum 是在排序 ... -
突破Oracle for win2k的2G内存限制
2005-12-10 23:54 924....众所周知,在32位的操作系统如win2K上,操作系统能 ... -
访问Oracle Spatial中的SDO_GEOMETRY字段的方法(windows下)
2005-12-10 23:57 27221.使用oci或者occi,在安装oracle后可以在orac ... -
WindowsNT/2000/XP中的Oracle服务简介
2005-12-12 20:19 887这里以9.0.1为例,对9.2以及10g都有效。 注:SID ... -
Oracle服务启动的问题
2005-12-12 20:32 876软件环境: 操作系统:Windows 2000 Advanc ... -
使用 ADO.NET 和 Oracle 进行高级数据访问
2005-12-15 20:47 1199使用 ADO.NET 和 Oracle 进行高级数据访问 [ ... -
Oracle9i中OCCI在VC6下不能DEBUG的问题及解决方法
2006-08-20 17:13 951前段时间,在csdn论坛上 ... -
看了看几个数据库厂商的发展历史
2006-08-20 18:01 1066这两天把Oracle以及DB2、Sybase、SQL Serv ... -
关于Oracle数据库中的undo回滚段
2006-09-25 22:50 1005Oracle数据库当中,关于日志与回滚那一部分,与别的数据库确 ... -
使用exp/imp传输表空间(Oracle)
2006-09-25 22:52 976有时候,可以使用exp将 ... -
Oracle中SCN的理解
2006-09-25 22:54 744系统检查点scn(v$database(c ... -
Oracle中JDBC对BLOB和CLOB读取的专用处理和通用处理
2007-02-26 20:38 802设有表:createtableblobimg(idintpri ...
相关推荐
java 调用Oracle存储过程进行分页详解
oracle insert数据成功之后调用触发器,触发器调用存储过程,存储实时调用java http
(作者:iihero on csdn) 一、如何创建java存储过程? 通常有三种方法来创建java存储过程。 1. 使用oracle的sql语句来创建: e.g. 使用create or replace and compile java source named “” as 后边跟上java源程序...
主要介绍了Java调用Oracle存储过程详解的相关资料,需要的朋友可以参考下
◆命名块:具有名称的PL/SQL块,这些命名块被存储在Oracle中,编译一次,以后只可调用就可多次执行。如:存储过程、存储函数、包、触发器等、 存储过程:无返回值; 存储函数:有返回值; 包:可容纳多个过程或...
提供了java调用存储过程对oracle进行增删改查, 代码简洁明了,易于学习
oracle学习详解 笔记 建表,建库,权限,存储,索引,分页,+java分页——java存储
下面小编就为大家带来一篇java 查询oracle数据库所有表DatabaseMetaData的用法(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
(2)包类似于C++和JAVA语言中的类,其中变量相当于类中的成员变量,过程和函数相当于类方法。把相关的模块归类成为包,可使开发人员利用面向对象的方法进行存储过程的开发,从而提高系统性能。 ...............
Java面试题 最小函数依赖 在数据库中实现base64编码和解码 java servlet总结 java的时间操作 画Web流程图的一点心得 深入Java核心 Java内存分配原理精讲 JAVA调用存储过程详解 经典SQL语句大全 使用jfreechart + ...
这个笔记是学习oracle数据库过程中整理出来的,比较详细,适合于初学者。 │ oracle与tomcat端口冲突.txt │ Oracle学习笔记.pdf │ Oracle学习笔记.wps │ 安装Oracle后myEclipse不能正常使用.txt │ 手工配置...
oracle数据匹配merge into的实例详解 前言: 很久之前,估计在2010年左右在使用Oralce,当时有个需求就是需要对两个表...满足上面场景的三个功能即可,可以用程序如(java,C,C#)等各种实现,也可以使用存储过程oracle
学生提问:当我们使用编译C程序时,不仅需要指定存放目标文件的位置,也需要指定目标文件的文件名,这里使用javac编译Java程序时怎么不需要指定目标文件的文件名呢? 13 1.5.3 运行Java程序 14 1.5.4 根据...
也论该不该在项目中使用存储过程代替SQL语句 如何使数据库中的表更有弹性,更易于扩展 存储过程——天使还是魔鬼 如何获取MSSQLServer,Oracel,Access中的数据字典信息 C#中利用GetOleDbSchemaTable获取数据库内表信息...
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...
Lombok:是一个可以通过简单的注解的形式来帮助我们简化消除一些必须有但显得很臃肿的 Java 代码的工具,简单来说,比如我们新建了一个类,然后在其中写了几个属性,然后通常情况下我们需要手动去建立getter和setter...
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...