使用Jorm处理Oracle存储过程返回多个游标

> 引言
日常开发中,使用Oracle存储过程,有时候会处理返回多个游标的情况,下面介绍使用 Jorm 框架来处理这一情况

> 数据库准备
1.表
CREATE TABLE `t_user` (
`id` int(11) NOT NULL,
`name` varchar(50) DEFAULT NULL,
`sex` char(4) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
`career` varchar(100) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

2.存储过程
-- 定义存储过程
CREATE OR REPLACE PROCEDURE pro_query_users
(
--参数IN表示输入参数,OUT表示输入参数,类型可以使用任意Oracle中的合法类型。
in_id IN NUMBER,
out_cursor_one OUT package_one.cursor_one,
out_cursor_two OUT package_two.cursor_two
)
AS
--定义变量
vs_id_value NUMBER; --变量

BEGIN
--用输入参数给变量赋初值。
vs_id_value:= in_id;

OPEN out_cursor_one FOR SELECT * FROM t_user WHERE id > vs_id_value;

OPEN out_cursor_two FOR SELECT * FROM t_user WHERE name LIKE '%a%';

--错误处理部分。OTHERS表示除了声明外的任意错误。SQLERRM是系统内置变量保存了当前错误的详细信息。
Exception
WHEN OTHERS Then
ROLLBACK;
Return;
End pro_query_users;


> 代码
1.实体类 User.java

import org.javaclub.jorm.annotation.Entity;
import org.javaclub.jorm.annotation.Id;
import org.javaclub.jorm.annotation.NoColumn;
import org.javaclub.jorm.annotation.PK;

@Entity(table = "t_user", lazy = true)
@PK(value = "id")
public class User {

@Id
private int id;

private String name;

private String sex;

private Integer age;

private String career;

@NoColumn
private int kvalue;

public User() {
super();
}

public User(String name, String sex, Integer age, String[] career) {
super();
this.name = name;
this.sex = sex;
this.age = age;
this.career = career;
}

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getSex() {
return sex;
}

public void setSex(String sex) {
this.sex = sex;
}

public Integer getAge() {
return age;
}

public void setAge(Integer age) {
this.age = age;
}

public String[] getCareer() {
return career;
}

public void setCareer(String[] career) {
this.career = career;
}

public int getKvalue() {
return kvalue;
}

public void setKvalue(int kvalue) {
this.kvalue = kvalue;
}

public String toString() {
StringBuffer sb = new StringBuffer();
sb.append("[" + id + ", " + name + ", " + sex + ", " + age + ", " + career + "]");
return sb.toString();
}
}

2.测试

import java.sql.CallableStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import java.util.ArrayList;
import java.util.List;

import org.javaclub.jorm.Jorm;
import org.javaclub.jorm.Session;
import org.javaclub.jorm.common.Numbers;
import org.javaclub.jorm.common.Strings;
import org.javaclub.jorm.demos.entity.User;
import org.javaclub.jorm.jdbc.callable.ProcedureCaller;
import org.javaclub.jorm.jdbc.sql.SqlParams;
import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;

/**
* ProcedureTest
*
* @author [url=mailto:gerald.chen.hz@gmail.com]Gerald Chen[/url]
* @version $Id: ProcedureTest.java 2011-8-25 下午06:18:17 Exp $
*/
public class ProcedureTest {

static Session session;

@BeforeClass
public static void setUpBeforeClass() throws Exception {
session = Jorm.getSession();
}

@AfterClass
public static void destroyAfterClass() {
Jorm.free();
}


@Test
public void save_user() {
session.clean(User.class);
User user = null;
for (int i = 0; i < 1600; i++) {
String sex = (i % 2 == 0 ? "男" : "女");
user = new User(Strings.fixed(5), sex, Numbers.random(98), Strings.random(8));
session.save(user);
}
}

@Test
public void oracle_load_two_cursor() {

save_user();

final String pro = "{call pro_query_users(?, ?, ?)}";
final List<User> gtIdUsers = new ArrayList<User>();
final List<User> likeNameUsers = new ArrayList<User>();

session.call(new ProcedureCaller() {

public CallableStatement prepare() throws SQLException {
CallableStatement cs = this.getSession().getConnection().prepareCall(pro);
cs.setInt(1, 20);
cs.registerOutParameter(2,oracle.jdbc.OracleTypes.CURSOR);
cs.registerOutParameter(3,oracle.jdbc.OracleTypes.CURSOR);
return cs;
}

public String callback(CallableStatement cs) throws SQLException {
cs.execute();
ResultSet rsOne = (ResultSet) cs.getObject(2);//返回第一个游标
ResultSet rsTwo = (ResultSet) cs.getObject(3);//返回第二个游标
while(rsOne != null && rsOne.next()) {
gtIdUsers.add(session.getPersister().toBean(rsOne, User.class));
}
while(rsTwo != null && rsTwo.next()) {
likeNameUsers.add(session.getPersister().toBean(rsTwo, User.class));
}
return null;
}
});

Assert.assertTrue(gtIdUsers.size() > 0);
System.out.println(gtIdUsers.size() + " => " + gtIdUsers);

Assert.assertTrue(likeNameUsers.size() > 0);
System.out.println(likeNameUsers.size() + " => " + likeNameUsers);
}
}

项目地址:[url]http://javaclub.sourceforge.net/jorm.html[/url]
下载地址: [url]http://sourceforge.net/projects/javaclub/files/jorm/[/url]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值