posts - 495,  comments - 11,  trackbacks - 0
          > 引言
          日常開(kāi)發(fā)中,使用Oracle存儲(chǔ)過(guò)程,有時(shí)候會(huì)處理返回多個(gè)游標(biāo)的情況,下面介紹使用 Jorm 框架來(lái)處理這一情況

          > 數(shù)據(jù)庫(kù)準(zhǔn)備
          1.表
          CREATE TABLE `t_user` (                
                  `id` 
          int(11NOT NULL,               
                  `name` 
          varchar(50DEFAULT NULL,     
                  `sex` 
          char(4DEFAULT NULL,          
                  `age` 
          int(11DEFAULT NULL,          
                  `career` 
          varchar(100DEFAULT NULL,  
                  
          PRIMARY KEY (`id`)                   
          ) ENGINE
          =InnoDB DEFAULT CHARSET=utf8;

          2.存儲(chǔ)過(guò)程
          -- 定義存儲(chǔ)過(guò)程
          CREATE OR REPLACE PROCEDURE pro_query_users
          (
          --參數(shù)IN表示輸入?yún)?shù),OUT表示輸入?yún)?shù),類型可以使用任意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
           
          --用輸入?yún)?shù)給變量賦初值。
           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%';
           
           
          --錯(cuò)誤處理部分。OTHERS表示除了聲明外的任意錯(cuò)誤。SQLERRM是系統(tǒng)內(nèi)置變量保存了當(dāng)前錯(cuò)誤的詳細(xì)信息。
          Exception
             
          WHEN OTHERS Then
             
          ROLLBACK;
             
          Return;
          End pro_query_users;


          > 代碼
          1.實(shí)體類 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.測(cè)試

          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(
          120);
                          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);//返回第一個(gè)游標(biāo)
                          ResultSet rsTwo = (ResultSet) cs.getObject(3);//返回第二個(gè)游標(biāo)
                          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);
              }
          }

          項(xiàng)目地址:http://javaclub.sourceforge.net/jorm.html
          下載地址: http://sourceforge.net/projects/javaclub/files/jorm/
          posted on 2011-09-23 16:17 jadmin 閱讀(1284) 評(píng)論(1)  編輯  收藏

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 正阳县| 襄垣县| 卫辉市| 石屏县| 海晏县| 谢通门县| 文登市| 河西区| 黄浦区| 宝山区| 东乡县| 兴海县| 平凉市| 隆化县| 普定县| 华蓥市| 乡城县| 安乡县| 上林县| 抚州市| 阿尔山市| 巴彦县| 沛县| 密云县| 黄陵县| 旌德县| 黄浦区| 大新县| 阿鲁科尔沁旗| 汝阳县| 桦南县| 汉源县| 浮梁县| 海安县| 宝鸡市| 绥芬河市| 东安县| 八宿县| 建湖县| 安庆市| 浏阳市|