问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

java如何调用存储过程 代码如下,最好能解释下相关函数的作用,不胜感...

发布网友 发布时间:2022-04-24 02:05

我来回答

2个回答

热心网友 时间:2022-04-14 18:28

这是我以前的学习笔记,LZ凑合着看看吧,应该能看懂一些吧
===================================================
55 java跟oracle 调用(存储过程,函数等)
55.1 Java调用无参的函数
1:函数为:
create or replace function MyF1 return varchar2 is
Result varchar2(20);
begin
dbms_output.put_line('now in My F1');
Result := 'Now MyF1 return';
return(Result);
end MyF1;

2:Java程序
/**
* 演示调用有一个没有参数的函数
* @throws Exception
*/
private static void t1() throws Exception {
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection conn = DriverManager.getConnection(
"jdbc:oracle:thin:@127.0.0.1:1521:orcl", "test", "test");
try {
CallableStatement stmt = conn
.prepareCall("{?=call MyF1()}");
stmt.registerOutParameter(1, Types.VARCHAR);
stmt.execute();
System.out.println(stmt.getString(1));
} finally {
conn.close();
}
}

55.2 Java调用无参但有返回值的存储过程
1:存储过程
create or replace procere MyP1(str out Varchar2) is
begin
dbms_output.put_line('Hello Procere.');
str :='Haha,Hello Procere';
end MyP1;

2:程序
/**
* 如何调用无参但有返回值的存储过程 测试的存储过程
* @throws Exception
*/
private static void t2() throws Exception {
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection conn = DriverManager.getConnection(
"jdbc:oracle:thin:@127.0.0.1:1521:orcl", "test", "test");
try {
CallableStatement stmt = conn.prepareCall("{call MyP1(?)}");
// 注意,这里的stmt.getInt(1)中的数值1并非任意的,而是和存储过程中的out列对应的,
// 如果out是在第一个位置,那就是 stmt.getInt(1),如果是第三个位置,就是getInt.getInt(3),
// 当然也可以同时有多个返回值,那就是再多加几个out 参数了。
stmt.registerOutParameter(1, Types.VARCHAR);
stmt.execute();
System.out.println(stmt.getString(1));
} finally {
conn.close();
}
}

55.3 Java调用有参的(传入)函数
1:函数
create or replace function MyF2(a number,b varchar2) return varchar2 is
Result varchar2(50);
begin
dbms_output.put_line('a==='||a||',b=='||b);
Result := a||b;
return(Result);
end MyF2;

2:程序
/**
* 调用有参的函数
* @throws Exception
*/
private static void t3() throws Exception {
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection conn = DriverManager.getConnection(
"jdbc:oracle:thin:@127.0.0.1:1521:orcl", "test", "test");
try {
CallableStatement stmt = conn
.prepareCall("{?=call MyF2(?,?)}");
stmt.setInt(2, 15);
stmt.setString(3, "HelloF2");
stmt.registerOutParameter(1, Types.VARCHAR);
stmt.execute();

System.out.println(stmt.getString(1));
} finally {
conn.close();
}
}

55.4 Java调用有参的(传入传出)存储过程
1:存储过程
create or replace procere MyP2(a in number,b in varchar2,c out varchar2) is
begin
dbms_output.put_line('a=='||a||',b=='||b);
c := 'ret=='||a||',b=='||b;
end MyP2;

2:程序
/**
* 调用有参数和返回值的存储过程
* @throws Exception
*/
private static void t4() throws Exception {
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection conn = DriverManager.getConnection(
"jdbc:oracle:thin:@127.0.0.1:1521:orcl", "test", "test");
try {
CallableStatement stmt = conn.prepareCall("{call MyP2(?,?,?)}");
stmt.setInt(1, 5);
stmt.setString(2, "测试");
stmt.registerOutParameter(3, Types.VARCHAR);
stmt.execute();

System.out.println(stmt.getString(3));
} finally {
conn.close();
}
}

55.5 Java向存储过程传入传出对象的数组
1:在数据中创建对象
create or replace type UserModel as object(
uuid varchar2(20),
name varchar2(20)
);

2:在数据库中建立对象的集合类型
create or replace type userCol as table of UserModel;

create or replace type retUserCol as table of UserModel;

3:在数据库中建立包
包头:
create or replace package MyTestPackage is
TYPE dbRs IS REF CURSOR;
procere MyP3(a1 in userCol,a2 out dbRs);

end MyTestPackage;

包体:
create or replace package body MyTestPackage is

procere MyP3(a1 in userCol,a2 out dbRs) as
umCol retUserCol := retUserCol();
begin
for i in 1.. a1.count loop
insert into tbl_test values (a1(i).uuid,a1(i).name);
end loop;
commit;

umCol.Extend;
umCol(1):=UserModel('retUuid11','retName11');
umCol.Extend;
umCol(2):=UserModel('retUuid22','retName22');

open a2 for select * from table(cast(umCol as retUserCol));
end;

begin
null;
end MyTestPackage;

4:程序:
/**
* 测试向pl/sql传入对象集合,从pl/sql返回任意的对象的集合
* @param list
* @throws Exception
*/
private static void t5(List list) throws Exception {
CallableStatement stmt = null;
Connection con = null;
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
con = DriverManager.getConnection(
"jdbc:oracle:thin:@127.0.0.1:1521:orcl", "test", "test");
if (con != null) {
ARRAY aArray = getArray(con, "USERMODEL", "USERCOL", list);//该函数调用的第二三个参数必须大写
stmt = con.prepareCall("{call MyTestPackage.MyP3(?,?)}");
((OracleCallableStatement) stmt).setARRAY(1, aArray);
stmt.registerOutParameter(2, OracleTypes.CURSOR);
stmt.execute();
ResultSet rs=(ResultSet)stmt.getObject(2);

while(rs.next()){
String uuid = rs.getString("uuid");
String name = rs.getString("name");
System.out.println("the uuid="+uuid+",name="+name);
}

}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
private static ARRAY getArray(Connection con, String OracleObj, String Oraclelist,
List objlist) throws Exception {
ARRAY list = null;
if (objlist != null && objlist.size() > 0) {
StructDescriptor structdesc = new StructDescriptor(OracleObj, con);
STRUCT[] structs = new STRUCT[objlist.size()];
Object[] result = new Object[0];
for (int i = 0; i < objlist.size(); i++) {
result = new Object[2];//数组大小应和你定义的数据库对象(UserModel)的属性的个数
result[0] = ((UserModel)(objlist.get(i))).getUuid(); //将list中元素的数据传入result数组
result[1] = ((UserModel)(objlist.get(i))).getName(); //

structs[i] = new STRUCT(structdesc, con, result);
}
ArrayDescriptor desc = ArrayDescriptor.createDescriptor(Oraclelist,
con);
list = new ARRAY(desc, con, structs);
}
return list;
}

如果使用Tomcat的DBCP的连接池,需要把连接进行转换
public Connection getNativeConnection(Connection con) throws SQLException {
if (con instanceof DelegatingConnection) {
Connection nativeCon = ((DelegatingConnection) con).getInnermostDelegate();
return (nativeCon != null ? nativeCon : con.getMetaData().getConnection());
}
return con;
}

热心网友 时间:2022-04-14 19:46

真的忘饿了。。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
脚崴了挂什么科、急急急 linux 解压缩工具--tar命令 生日祝福语闺蜜 简短独特暖心 QQ有哪些隐藏的图标??他们分别是什么??怎么样点亮?? QQ业务的各种图标怎么点亮? qq怎么点亮图标和名字 诗中书万象=求下联 大爱如山藏万象下联 中国电子展:电位器和可调电阻的区别是什么?这四点很明显 电位器的接线方法是什么 电位器的工作原理如何 做Java开发都需要学什么?怎么学? 我想用java做一个类,使其能访问数据库中的一个表!能实现增加、删除、修... 《JSP&Servlet学习笔记》pdf下载在线阅读,求百度网盘云资源 寻书&lt;涂抹oracle三思笔记之一步一步学Oracle 完整的PDF版电子书 &gt;麻烦... oracle 列转行 软件工程专业应届生对数据库原理那本书要求的掌握程度 三思笔记-一步一步学习oracle Oracle 9i中如何查看事物,如何查看会话,如果回答的话请按顺序,先回答事... 谁有oracle数据库学习资料或笔记都可? 推荐几本linux oracle数据库的书 请朋友推荐本 关于oracle 教程 方面的书籍。。从最基础开始的 尽量能... Oracle 10G 数据库 CUUG的oracle学习笔记谁有? oracle的nvl和nvl2是什么函数,两者区别是什么呢 Oracle学习笔记的介绍 Oracle学习笔记的内容介绍 安卓上,有没有“模拟”微信分享成功的app 请教学习一下手机微信分享网页并截图的方法 请问这对头像是什么动漫里的 安卓系统可以分享QQ音乐到微信朋友圈吗? 肺癌早期能治愈吗? 早期肺癌能百分百治愈吗? 早期浸润性肺腺癌治愈率? 早期肺癌治愈的几率有多大?_肺癌 我刚被查出肺癌早期,我想知道如果马上接受治疗是否可治愈,几率大吗? 周围型肺癌的早期治愈率是多少 周围型肺癌 早期肺癌治愈能活多久? 肺腺癌治愈率有多少? 肺腺癌早期治愈率是多少呢? 肺癌早期手术治疗效果怎么样,治愈的几率大么 肺癌治愈率 肺癌早期治愈的可能性是百分之几? 肺癌的治愈率有多少? 生物免疫治疗早期肺癌效果好吗? 早期肺癌手术后复发的可能性大吗? 肺癌早期可以治愈吗? 我的电脑显示不出来了? oppor9tm怎么截屏? 台式电脑桌面不显示“我的电脑”怎么办 OPPOR9tm怎样截屏