设为首页 收藏本站
查看: 628|回复: 0

[经验分享] 使用Jorm处理Oracle存储过程返回多个游标

[复制链接]
YunVN网友  发表于 2016-8-15 06:45:50 |阅读模式
> 引言
日常开发中,使用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 Gerald Chen
* @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);
    }
}

项目地址:http://javaclub.sourceforge.net/jorm.html
下载地址: http://sourceforge.net/projects/javaclub/files/jorm/

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-257785-1-1.html 上篇帖子: oracle 递归查询一个树形结构的菜单 下篇帖子: Oracle 10g 读书笔记之 redo 与 undo
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表