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调用存储过程返回数组相关推荐

  1. java 存储过程 数组_Java调用存储过程返回数组

    Java调用存储过程: 结合SQL操作与存储过程 create procedure set_death_age(poet VARCHAR2, poet_age NUMBER) poet_id NUMB ...

  2. Java 调用存储过程 返回结果集

    这里使用Oracle数据库的thin连接. 下面是存储过程SQL 1 createorreplaceprocedure proc3(stid in student.stuid%type, stname ...

  3. java调用方法返回数组_JAVA使用下面的方法头编写方法,返回两个数组列表的并集...

    importjava.util.Set;importjava.util.List;importjava.util.HashSet;importjava.util.TreeSet;importjava. ...

  4. Java调用存储过程(返回:简单类型VARCHAR、自定义对象STRUCT、列表数组VARRAY)

    ORACLE 存储过程 练习七 数组专题 写在前面的废话 由于工作需要经常用到 ORACLE存储过程 其中数组是不可避免的一组成元素.那么让我们来体会一下 ORACLE存储过程的数组到低是如何使用的. ...

  5. java使用mybatis 调用存储过程返回一个游标结果集

    瀚高数据库 目录 环境 文档用途 详细信息 环境 系统平台:IBM:Linux on System z Red Hat Enterprise Linux 7 版本:6.0,4.5 文档用途 mybat ...

  6. java 调用存储过程structdescriptor,Java调用oracle存储过程,集合入参的正确姿势

    这是我工作之前遇到的一个需求,Java调用存储过程,入参是集合.踩了一些坑,决定写个干货,和大家分享下. 项目使用的oracle版本: com.oracle ojdbc6 11.2.0.1.0 sys ...

  7. myabatis oracle 调用存储过程返回list结果集

    视频课:https://edu.csdn.net/course/play/7940 Mapper.xml 配置 <resultMap type="emp" id=" ...

  8. java使用集合存储过程_详解java调用存储过程并封装成map

    详解java调用存储过程并封装成map 发布于 2020-5-1| 复制链接 摘记: 详解java调用存储过程并封装成map           本文代码中注释写的比较清楚不在单独说明,希望能帮助到大 ...

  9. java调用存储过程之环境测试

    ----oracle10g ojdbc14.jar ----oracle11g ojdbc6.jar <?xml version="1.0" encoding="U ...

最新文章

  1. Finding iPhone Memory Leaks: A “Leaks” Tool Tutorial[转]
  2. 关于AI方面创业公司的分析
  3. ssh_exchange_identification: Connection closed by remote host 问题的解决 (转)
  4. 用RadASM 开发窗口程序
  5. C# 垃圾回收器高效工作
  6. java实现各种算法
  7. 使用maven构建dubbo服务的可执行jar包
  8. oracle util_mail,Oracle UTL_MAIL邮件包程序使用实践
  9. QScrollArea 详解
  10. 使用vagrant因用户权限导致文件不可写问题的解决
  11. Keepalived 安装配置
  12. 如何用excel做正交分析_使用Excel进行有交互作用的正交设计方差分析
  13. vs2010 c# 配置项问题
  14. Windows下用C语言连接Mysql注意问题
  15. 【游戏】[C++] 贪吃蛇控制台版
  16. (二)VISIO 中间带箭头的弧线怎么画
  17. 格式工厂kux格式怎么转换成mp4
  18. 机器人领域的SCI期刊和会议
  19. 如何用WinRAR给压缩包设置和取消密码
  20. 3dsmax启动闪退的解决方法

热门文章

  1. 第九章 OGRE中的整个流程
  2. python中将数字转换成二进制数
  3. 按clear按钮清空两个文本框的内容,按copy按钮时将Source文本框的内容复制到Target文本框,按close按钮结束程序的运行
  4. 定时刷新网页脚本python_在特定时间后自动刷新Python脚本
  5. idea通过svn上传_SVN客户端使用(Windows)图文详解
  6. 新冠疫情相似句对判定,快速匹配准确答案
  7. Python+Flask京东电商价格实时监控,邮件提醒
  8. matlab要求 基础,Matlab基础考试要求.doc
  9. telnet服务器响应慢,交换机s10508 telnet登录后上反应慢
  10. 查询oracle表空间有什么数据,oracle查询表空间使用情况与查询有哪些数据库实例在运行...