Java调用存储过程返回数组
Java调用存储过程:
结合SQL操作与存储过程
create procedure set_death_age(poet VARCHAR2, poet_age NUMBER)
poet_id NUMBER;
begin SELECT id INTO poet_id FROM poets WHERE name = poet;
INSERT INTO deaths (mort_id, age) VALUES (poet_id, poet_age);
end set_death_age;
下面是调用上面存储过程的Java代码:
public static void setDeathAge(Poet dyingBard, int age) throws SQLException{
Connection con = null;
CallableStatement proc = null;
try {
con = connectionPool.getConnection();
proc = con.prepareCall("{ call set_death_age(?, ?) }");
proc.setString(1, dyingBard.getName());
proc.setInt(2, age);
proc.execute();
}
finally {
try { proc.close(); }
catch (SQLException e) {}
con.close();
}
}
Functions
存储过程可以有返回值,所以CallableStatement类有类似getResultSet这样的方法来获取返回值。当存储过程返回一个值时,你必须使用registerOutParameter方法告诉JDBC驱动器该值的SQL类型是什么。你也必须调整存储过程调用来指示该过程返回一个值。
下面接着上面的例子。这次我们查询Dylan Thomas逝世时的年龄。这次的存储过程使用:
create function snuffed_it_when (VARCHAR) returns integer ''declare
poet_id NUMBER;
poet_age NUMBER;
begin
--first get the id associated with the poet.
SELECT id INTO poet_id FROM poets WHERE name = $1;
--get and return the age.
SELECT age INTO poet_age FROM deaths WHERE mort_id = poet_id;
return age;
end;
下面是调用这个存储过程的Java代码:
connection.setAutoCommit(false);
CallableStatement proc = connection.prepareCall("{ ? = call snuffed_it_when(?) }"); proc.registerOutParameter(1, Types.INTEGER);
proc.setString(2, poetName); cs.execute();
int age = proc.getInt(2);
在使用存储过程中,我们有时需要传递可变数组,存在两种情况,存储过程有输入或输出参数为自定义可变数组的。在java代码中,如何正确调用oracle存储过程的自定义可变数组类型,在这里做一下示例说明.
java调用oracle存储过程的自定义类型:
plsql定义字符串和数值型可变数组:
一.定义全局类型:
CREATE OR REPLACE TYPE USERSEQID_ARRAY IS VARRAY(50000) OF NUMBER(9)
CREATE OR REPLACE TYPE USERNAME_ARRAY AS VARRAY(32) of varchar(32)
CREATE OR REPLACE TYPE USERPWD_ARRAY AS VARRAY(50000) of varchar(60)
二.java调用输出参数为自定义数组的存储过程:
2.1 输出参数为自定义数组的存储过程make_logincard_pro:
procedure make_logincard_pro (
p_cardsuitcode in varchar,
p_userseqidArr out USERSEQID_ARRAY ,
p_usernameArr out USERNAME_ARRAY
)
IS
v_addedtime date:= sysdate;
BEGIN
FOR ii IN 1 .. 10 LOOP
IF p_userseqidArr IS NULL THEN
p_userseqidArr := USERSEQID_ARRAY(ii);
ELSE
p_userseqidArr.EXTEND; --超过数组定义大小(50000)将抛出异常
p_userseqidArr(ii) := ii;
END IF;
IF p_usernameArr IS NULL THEN
p_usernameArr := USERSEQID_ARRAY(ii || 'TT');
ELSE
p_usernameArr.EXTEND; --超过数组定义大小(32)将抛出异常
p_usernameArr(ii) := ii || 'TT';
END IF;
END LOOP
END make_logincard_pro ;
2.2JAVA调用存储过程make_logincard_pro:
//代码片段
Connection con = session.connection();
java.sql.CallableStatement cst = con
prepareCall("call CNBT.test_pro(?,?,?)");
cst.setString(1, cardSuitCode);
cst.registerOutParameter(2, OracleTypes.ARRAY,"USERSEQID_ARRAY");
cst.registerOutParameter(3, OracleTypes.ARRAY,"USERNAME_ARRAY");
java.sql.Array userSeqIdArr = cst.getArray(2);
java.sql.Array userNameArr = cst.getArray(3);
if ( userSeqIdArr != null ) ...{
BigDecimal userSeqIdList[] = (BigDecimal[])userSeqIdArr.getArray();//数据库的number映射为BigDecimal
//。。。。。。
}
if ( userNameArr != null ) ...{
String userNameList[] = (String[])userNameArr.getArray();
//。。。。。。
}
--------------------------------------------------------------------------------
三. java调用输入参数为自定义数组的存储过程:
3.1 输入参数为自定义数组的存储过程update_logincard_pwd:
/**//**********************************************
* update_logincard_pwd *
*功能描述:更新密码存储过程 *
*输入参数: *
*输出参数: *
*作者:hanjiong *
***********************************************/
procedure update_logincard_pwd (
p_userSeqIdList in USERSEQID_ARRAY,
p_userPwdList in USERPWD_ARRAY,
p_resultcode out number
);
3.2 java调用存储过程update_logincard_pwd:
//代码片段
..........................
Connection con = session.connection();//使用的weblogic数据源
oracle.jdbc.OracleCallableStatement cst2 = (oracle.jdbc.OracleCallableStatement)con
.prepareCall(
"call CNBT.update_logincard_pwd(?,?,?)");
weblogic.jdbc.wrapper.Connection weblogicConn = (weblogic.jdbc.wrapper.Connection)con;
oracle.jdbc.OracleConnection oracleConn = (oracle.jdbc.OracleConnection)weblogicConn.getVendorConnection();//转化connection
oracle.sql.ArrayDescriptor des_USERSEQID_ARRAY =
oracle.sql.ArrayDescriptor.createDescriptor("USERSEQID_ARRAY",oracleConn);
oracle.sql.ArrayDescriptor des_USERPWD_ARRAY =
oracle.sql.ArrayDescriptor.createDescriptor("USERPWD_ARRAY",oracleConn);
oracle.sql.ARRAY ora_array1 = new oracle.sql.ARRAY(des_USERSEQID_ARRAY, oracleConn, userAccSeqIdArr);
oracle.sql.ARRAY ora_array2 = new oracle.sql.ARRAY(des_USERPWD_ARRAY, oracleConn, userPwdList);
cst2.setArray(1, ora_array1);
cst2.setArray(2, ora_array2);
cst2.registerOutParameter(3, java.sql.Types.INTEGER);
cst2.execute();
updateCode = cst2.getInt(3);
.....................................
....................................
因为我使用的是weblogic配置的数据源,在取得的connection对象时需要注意,通过数据源取得的Connection对象为weblogic.jdbc.wrapper.Connection,所以不能直接转化为oracle.jdbc.OracleConnection,否则会出现java.lang.ClassCastException异常,所以我们要通过weblogic.jdbc.wrapper.Connection.getVendorConnection()取得java.sql.Connection,在强制转化为oracle.jdbc.OracleConnection。
--------------------------------------------------------------------------------
通过上述两种情况,就可以在Oracle存储过程中使用zid
转载于:https://www.cnblogs.com/linbl/p/4681013.html
Java调用存储过程返回数组相关推荐
- java 存储过程 数组_Java调用存储过程返回数组
Java调用存储过程: 结合SQL操作与存储过程 create procedure set_death_age(poet VARCHAR2, poet_age NUMBER) poet_id NUMB ...
- Java 调用存储过程 返回结果集
这里使用Oracle数据库的thin连接. 下面是存储过程SQL 1 createorreplaceprocedure proc3(stid in student.stuid%type, stname ...
- java调用方法返回数组_JAVA使用下面的方法头编写方法,返回两个数组列表的并集...
importjava.util.Set;importjava.util.List;importjava.util.HashSet;importjava.util.TreeSet;importjava. ...
- Java调用存储过程(返回:简单类型VARCHAR、自定义对象STRUCT、列表数组VARRAY)
ORACLE 存储过程 练习七 数组专题 写在前面的废话 由于工作需要经常用到 ORACLE存储过程 其中数组是不可避免的一组成元素.那么让我们来体会一下 ORACLE存储过程的数组到低是如何使用的. ...
- java使用mybatis 调用存储过程返回一个游标结果集
瀚高数据库 目录 环境 文档用途 详细信息 环境 系统平台:IBM:Linux on System z Red Hat Enterprise Linux 7 版本:6.0,4.5 文档用途 mybat ...
- java 调用存储过程structdescriptor,Java调用oracle存储过程,集合入参的正确姿势
这是我工作之前遇到的一个需求,Java调用存储过程,入参是集合.踩了一些坑,决定写个干货,和大家分享下. 项目使用的oracle版本: com.oracle ojdbc6 11.2.0.1.0 sys ...
- myabatis oracle 调用存储过程返回list结果集
视频课:https://edu.csdn.net/course/play/7940 Mapper.xml 配置 <resultMap type="emp" id=" ...
- java使用集合存储过程_详解java调用存储过程并封装成map
详解java调用存储过程并封装成map 发布于 2020-5-1| 复制链接 摘记: 详解java调用存储过程并封装成map 本文代码中注释写的比较清楚不在单独说明,希望能帮助到大 ...
- java调用存储过程之环境测试
----oracle10g ojdbc14.jar ----oracle11g ojdbc6.jar <?xml version="1.0" encoding="U ...
最新文章
- Finding iPhone Memory Leaks: A “Leaks” Tool Tutorial[转]
- 关于AI方面创业公司的分析
- ssh_exchange_identification: Connection closed by remote host 问题的解决 (转)
- 用RadASM 开发窗口程序
- C# 垃圾回收器高效工作
- java实现各种算法
- 使用maven构建dubbo服务的可执行jar包
- oracle util_mail,Oracle UTL_MAIL邮件包程序使用实践
- QScrollArea 详解
- 使用vagrant因用户权限导致文件不可写问题的解决
- Keepalived 安装配置
- 如何用excel做正交分析_使用Excel进行有交互作用的正交设计方差分析
- vs2010 c# 配置项问题
- Windows下用C语言连接Mysql注意问题
- 【游戏】[C++] 贪吃蛇控制台版
- (二)VISIO 中间带箭头的弧线怎么画
- 格式工厂kux格式怎么转换成mp4
- 机器人领域的SCI期刊和会议
- 如何用WinRAR给压缩包设置和取消密码
- 3dsmax启动闪退的解决方法
热门文章
- 第九章 OGRE中的整个流程
- python中将数字转换成二进制数
- 按clear按钮清空两个文本框的内容,按copy按钮时将Source文本框的内容复制到Target文本框,按close按钮结束程序的运行
- 定时刷新网页脚本python_在特定时间后自动刷新Python脚本
- idea通过svn上传_SVN客户端使用(Windows)图文详解
- 新冠疫情相似句对判定,快速匹配准确答案
- Python+Flask京东电商价格实时监控,邮件提醒
- matlab要求 基础,Matlab基础考试要求.doc
- telnet服务器响应慢,交换机s10508 telnet登录后上反应慢
- 查询oracle表空间有什么数据,oracle查询表空间使用情况与查询有哪些数据库实例在运行...