`
javasogo
  • 浏览: 1770893 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

使用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 <a href="mailto:gerald.chen.hz@gmail.com">Gerald Chen</a>
*
@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);
}
}
0
1
分享到:
评论

相关推荐

    jorm-1.0.7.GA-javadoc

    jorm-1.0.7.GA-javadoc

    JORM_2.9_bin

    JORM(Java对象存储映射)Java开源的持久性框架。它为JOnAS J2EE应用服务器提供EJB 2.0 CMP。JORM还与Speedo JDO实现结合。

    p4jorm 1.6编译版本

    开始那个版本是1.7,有些同学遇到“java.lang.UnsupportedClassVersionError: Bad version ”问题,如果是jdk 1.6,请用此版本,或者自己编译一个,因为已发布源码

    jorm轻量级的orm框架

    不用写sql啦,不用创建表啦,一个比mybatis更轻量级,比hibernate好用的orm!

    p4jorm 1.0.1版本

    修补p4jorm jpa支持:查询参数赋值开始索引位置(position)错误(从1开始)

    java轻量级ORM实现-jorm (Just ORM)

    This project is based on Java, is a lightweight ORM model. Only concerned about the Object-Relationl Mapping, therefore more simple and easier to use, easier to control. Key support functions and ...

    p4jorm 源码 文档 示例

    你还写jdbc呢?还在反复HQL拼写工作?p4jorm让你无需写一行代码,即可进行CURD,真正的简单易学。本人用了3天时间完成,还请各位多多指点 http://blog.csdn.net/partner4java/article/details/8559661 ...

    p4jorm 1.0.3版本

    添加PageIndex的hashcode生成规则;解决form不能为空的错误。

    jorm-unit:JUnit扩展可协助服务器外自动化JPA测试

    单位 JUnit扩展可协助服务器外自动化JPA测试 检查

    面向对象设计 PPT

    主要讲的ssi框架,MVC对于我们来说,已经不陌生了,它起源于20世纪80年代针对smalltalk语言的一种软件设计模式,...由于最近用了一次SSI框架,因此本文主要是对Strtus2、Spring、iBatis三个开源的MVC框架进行一个小结。

    HealthDeterminants:健康可视化的社会决定因素

    多个决定因素对健康结果的相对贡献。 (nd)。 于2016年3月14日从检索 捕获电子健康记录中的社会和行为领域和措施:第2阶段(2014年)。 华盛顿特区:国家科学院出版社。 Gruszin,S.和Jorm,L.(2010年12月)。 ...

    最近收到的书

    最近收到的书籍 ...JORM, AF 阅读和拼写障碍的心理学。 波士顿:Routledge &amp; Kegan Paul,1983 年,134 页,价格不详。 KNOWLES, D., &amp; REEVES, N. 但是奶奶不需要她的袜子吗? 爱荷华州迪比克

Global site tag (gtag.js) - Google Analytics