`
llyzq
  • 浏览: 579811 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

java 通过调用存储过程获取结果集

阅读更多

转自 http://wilent.iteye.com/blog/40704

        一般在java中,数据查询是通过Statement, PreparedStatement获取结果集,今天向大家介绍通过CallableStatement调用存储过程,从而获取结果集.
       本文是所用的数据库为oracle.
      一.  测试数据库表:

sql 代码
 
  1. create   table  wilent_user(  
  2.                 id number(5) primary   key ,  
  3.                 name  varchar2(100),  
  4.                 sex varchar2(1),    --Y为男,F为女;   
  5.                 group_id number(5),  
  6.                 teach varchar2(50)    --学历;   
  7.                 );  
  8.   
  9.                 create   table  wilent_group(  
  10.                     id number(5) primary   key ,  
  11.                     name  varchar2(100)  
  12.                  );  
  13.                  
  14.                         insert   into  wilent_group  values (1,'组1');  
  15.         insert   into  wilent_group  values (2,'组2');  
  16.         insert   into  wilent_group  values (3,'组3');  
  17.         insert   into  wilent_group  values (4,'组4');  
  18.         insert   into  wilent_group  values (5,'组5');  
  19.          
  20.         insert   into  wilent_user  values (1,'吴','Y',1,'大专');  
  21.         insert   into  wilent_user  values (2,'李','Y',1,'大专');  
  22.         insert   into  wilent_user  values (3,'赵','N',2,'本科');  
  23.         insert   into  wilent_user  values (4,'金','Y',2,'高中');  
  24.         insert   into  wilent_user  values (5,'钱','N',2,'大专');  
  25.         insert   into  wilent_user  values (6,'孙','N',1,'大专');  
  26.         insert   into  wilent_user  values (7,'高','Y',3,'本科');  
  27.         insert   into  wilent_user  values (8,'宋','N',3,'高中');  
  28.         insert   into  wilent_user  values (9,'伍','Y',3,'大专');  
  29.         insert   into  wilent_user  values (10,'欧','Y',4,'本科');  
  30.         insert   into  wilent_user  values (11,'庄','N',4,'硕士');  
  31.         insert   into  wilent_user  values (12,'纪','Y',4,'本科');  
  32.         insert   into  wilent_user  values (13,'陈','Y',5,'大专');  
  33.         insert   into  wilent_user  values (14,'龙','N',5,'大专');  
  34.         insert   into  wilent_user  values (15,'袁','Y',5,'高中');  
  35.         insert   into  wilent_user  values (16,'杨','Y',1,'本科');  
  36.         insert   into  wilent_user  values (17,'江','N',1,'大专');  
  37.         insert   into  wilent_user  values (18,'刘','Y',1,'硕士');  
  38.         insert   into  wilent_user  values (19,'郭','N',3,'硕士');  
  39.         insert   into  wilent_user  values (20,'张','Y',3,'大专');  
  40.         insert   into  wilent_user  values (21,'文','N',3,'硕士');  
  41.         insert   into  wilent_user  values (22,'李','N',4,'大专');  
  42.         insert   into  wilent_user  values (23,'梅','Y',4,'本科');  
  43.         insert   into  wilent_user  values (24,'王','N',4,'大专');  
  44.         insert   into  wilent_user  values (25,'吕','N',5,'高中');  
  45.         insert   into  wilent_user  values (26,'范','Y',5,'本科');  
  46.         insert   into  wilent_user  values (27,'许','N',1,'大专');  
  47.         insert   into  wilent_user  values (28,'墨','Y',1,'高中');  
  48.         insert   into  wilent_user  values (29,'孔','N',1,'本科');  
  49.         insert   into  wilent_user  values (30,'蔡','Y',1,'大专');  


       二.  oracle 存储过程

            
sql 代码
 
  1. --自定义类型;  
  2. Create   Or   Replace  Type wilent_row_table  As  Object  
  3. (  
  4.        group_name Varchar2(100),  
  5.        group_count Number(4),  
  6.        male_count Number(4),  
  7.        woman_count Number(4),  
  8.        da_count Number(4),  
  9.        ben_count Number(4)  
  10. );  
  11. /  
  12.   
  13. --定义一个嵌套表类型;
  14. Create   Or   Replace  Type wilent_tab_type  Is   Table   Of  wilent_row_table;  
  15. /  
  16. --返回一个游标类型;   
  17. Create   Or   Replace  Package wilent_types  As    
  18.        Type cursor_type Is  Ref  Cursor ;  
  19. End  wilent_types;  
  20. /  
  21. Create   Or   Replace   Procedure  wilent_group_count(recordSet  Out  wilent_types.cursor_type)  
  22. As   
  23.   v_tab wilent_tab_type := wilent_tab_type();               
  24.   index_max Number(4);                         --wilent_group最大的id;   
  25.   index_min Number(4);                         --wilent_group最小的id;   
  26.   index_for Number(4);  
  27.     
  28.   group_name Varchar2(100);  
  29.   user_count Number(4);  
  30.   male_count Number(4);  
  31.   woman_count Number(4);  
  32.   da_count Number(4);  
  33.   ben_count Number(4);  
  34. Begin   
  35.      dbms_output.put_line('as ');  
  36.      Select   Max (g.Id)  Into  index_max  From  wilent_group g;  
  37.      --dbms_output.put_line(index_max);   
  38.      Select   Min (g.Id)  Into  index_min  From  wilent_group g;  
  39.      --dbms_output.put_line(index_min);   
  40.      For  index_for  In  Index_min..index_max Loop  
  41.          --添加新记录;   
  42.          v_tab.Extend;  
  43.          Select   Name   Into  group_name  From  wilent_group  Where  Id=index_for;  
  44.          Select   Count (*)  Into  user_count  From  wilent_user u, wilent_group g  Where  u.group_id=g.Id  And  g.Id=index_for;  
  45.          Select   Count (*)  Into  male_count  From  wilent_user u, wilent_group g  Where  u.group_id=g.Id  And  g.Id=index_for  And  sex='Y';  
  46.          Select   Count (*)  Into  woman_count  From  wilent_user u, wilent_group g  Where  u.group_id=g.Id  And  g.Id=index_for  And  sex='N';  
  47.          Select   Count (*)  Into  da_count  From  wilent_user u, wilent_group g  Where  u.group_id=g.Id  And  g.Id=index_for  And  teach='大专';  
  48.          Select   Count (*)  Into  ben_count  From  wilent_user u, wilent_group g  Where  u.group_id=g.Id  And  g.Id=index_for  And  teach='本科';  
  49.          --把记录写入;   
  50.          v_tab(v_tab.Last ) := wilent_row_table(group_name,user_count,male_count,woman_count,da_count,ben_count);  
  51.      End  Loop;  
  52.        
  53.      --把记录放在游标里;   
  54.      Open  recordset  For   
  55.       --Table(Cast(v_tab As wilent_tab_type))目的是把v_tab强转为wilent_tab_type表  
  56.           Select  group_name,group_count ,male_count ,woman_count ,da_count ,ben_count   From   Table ( Cast (v_tab  As  wilent_tab_type))  Order   By  group_name;  
  57. End  wilent_group_count;  
  58. /  
  59.   
  60. --测试wilent_group_count();   
  61. declare   
  62.   recordset wilent_types.cursor_type;  
  63. Begin   
  64.     wilent_group_count(recordset);  
  65. End ;  

     
          三. java代码:

          
java 代码
 
  1. package  com.wilent.oracle;  
  2.   
  3. import  java.sql.CallableStatement;  
  4. import  java.sql.Connection;  
  5. import  java.sql.ResultSet;  
  6. import  java.sql.SQLException;  
  7.   
  8. import  oracle.jdbc.driver.OracleTypes;  
  9.   
  10. import  com.wilent.db.ConnectionManager;  
  11.   
  12. public   class  TestProcedure {  
  13.     public   static   void  main(String[] args) {  
  14.         //获得conn连接,读者可以自行写;   
  15.         Connection conn = ConnectionManager.getConnection();  
  16.         ResultSet rs = null ;  
  17.         try  {  
  18.             CallableStatement proc = conn.prepareCall("{call wilent_group_count(?)}" );  
  19.             proc.registerOutParameter(1 , OracleTypes.CURSOR);  
  20.             proc.execute();  
  21.               
  22.             rs = (ResultSet) proc.getObject(1 );  
  23.             System.out.println("组名\t总计\t男性\t女性\t大专\t本科" );  
  24.             while (rs.next())  
  25.             {  
  26.                 StringBuffer buffer = new  StringBuffer();  
  27.                 buffer.append(rs.getString("group_name" ));  
  28.                 buffer.append("\t" );  
  29.                 buffer.append(rs.getInt("group_count" ));  
  30.                 buffer.append("\t" );  
  31.                 buffer.append(rs.getInt("male_count" ));  
  32.                 buffer.append("\t" );  
  33.                 buffer.append(rs.getInt("woman_count" ));  
  34.                 buffer.append("\t" );  
  35.                 buffer.append(rs.getInt("da_count" ));  
  36.                 buffer.append("\t" );  
  37.                 buffer.append(rs.getInt("ben_count" ));  
  38.                 System.out.println(buffer.toString());  
  39.             }  
  40.         } catch  (Exception e) {  
  41.             e.printStackTrace();  
  42.         }  
  43.         finally {  
  44.             try  {  
  45.                 conn.close();  
  46.             } catch  (SQLException e) {  
  47.                 e.printStackTrace();  
  48.             }  
  49.         }  
  50.     }  

    四. 运行结果

    组名    总计    男性    女性    大专    本科
    组1    10        6      4      6      2
    组2    3         1      2      1      1
    组3    6         3      3      2      1
    组4    6         3      3      2      3
    组5    5         3      2      2      1
   
分享到:
评论

相关推荐

    java调用oracle存储过程返回结果集,Record,cursor参照.pdf

    本文介绍了Java调用Oracle存储过程返回结果集Record和Cursor的相关知识点,包括创建Type、PACKAGE和PROCEDURE,Java代码中调用存储过程,并获取结果集。这些知识点对深入了解Oracle存储过程和Java调用Oracle存储过程...

    java 调用存储过程

    值得注意的是,上述代码中的文件名列表(如Project1.cfg、Unit1.dcu等)与Java调用存储过程无关,它们看起来像是Delphi或FreePascal项目的文件,这些文件通常用于描述项目配置、单元信息、表单布局等,而不是与Java...

    java调用存储过程(含out参数)

    总之,调用存储过程是Java开发中处理数据库操作的重要环节。理解如何设置`IN`和`OUT`参数,并正确地执行和获取结果,将有助于提高代码的效率和可维护性。希望这个详细讲解对你有所帮助,如果你在实践中遇到任何问题...

    java调用oracle存储过程或者函数

    以上就是Java调用Oracle存储过程或函数的主要知识点,实践中要根据具体情况进行适当的调整和优化。在处理过程中,参考Oracle的JDBC文档和官方示例,以及Java API文档,将有助于理解和解决问题。

    Java调用数据库存储过程[mysql测试通过]

    本篇文章将深入探讨如何使用Java与MySQL数据库进行交互,实现调用存储过程,并提供一个测试通过的实例。 首先,理解存储过程是数据库管理系统提供的一种预编译的SQL语句集合,它封装了特定的功能,可以提高执行效率...

    java调用存储过程同时返回值和多个table

    java调用存储过程,支持获取return值,output返回值,以及查询的表数据,表数据允许有多个查询结果集

    Java调用带参数的存储过程并返回集合

    // 获取结果集 ``` 4. **处理结果集**:遍历`ResultSet`,获取存储过程返回的集合数据: ```java while (rs.next()) { int id = rs.getInt("id"); String name = rs.getString("name"); // ... 其他字段 System...

    java调用oracle存储过程并得到结果集

    在Java编程中,调用Oracle数据库的存储过程并获取结果集是一项常见的任务。在这个场景下,我们将使用JDK 1.5版本,MyEclipse集成开发环境,以及Oracle 11g数据库。以下是对这个主题的详细解释: 首先,我们需要确保...

    springboot mybatis 动态调用oracle存储过程,通过存储过程名称,就能动态调用存储过程、java动态调用or

    能不能写个动态的业务,只输入存储过程名称,自动获取存储过程参数,并且参数的数据从前台传递过来,这个就通用了。只写一个通用方法,就可以调用所有的存储过程。只根据输入不同的存储过程名称、参数内容,自动调用...

    Java程序调用存储过程

    Java程序调用存储过程是数据库操作中的常见任务,特别是在处理大量数据或需要高效执行复杂业务逻辑时。存储过程是预编译的SQL语句集合,它们可以提高性能、减少网络流量,并提供更好的安全性。在Java应用程序中调用...

    Java调用Mysql存储过程

    6. **获取结果**:如果是查询型存储过程,可以使用`ResultSet`获取结果;如果是有输出参数的存储过程,可以通过`CallableStatement`获取输出参数的值: ```java int outputParamValue = cs.getInt(2); // 获取输出...

    java 调用db2存储过程

    二、 Java 调用存储过程 要在 Java 中调用存储过程,需要使用 JDBC 连接 DB2 数据库。首先,需要加载 DB2 驱动程序: ```java String JDBCDriver = "com.ibm.db2.jcc.DB2Driver"; ``` 然后,使用 DriverManager ...

    java调用存储过程

    Java调用存储过程是数据库操作中的常见任务,特别是在复杂的业务逻辑和数据处理中。MyEclipse作为一款强大的Java集成开发环境,提供了方便的工具来支持这一功能。下面将详细介绍如何在MyEclipse中使用Java调用存储...

    java调用oracle存储过程实现增删改查

    在Java编程中,调用Oracle数据库的存储...总之,通过Java调用Oracle存储过程,我们可以有效地执行数据库操作,同时利用存储过程带来的性能和安全优势。了解如何正确设置参数、执行和处理结果是成功实现这一目标的关键。

    java中调用sql存储过程详细例子

    下面将详细介绍如何使用Java调用存储过程。 1. **创建CallableStatement对象** 首先,我们需要创建一个`CallableStatement`实例,这可以通过`Connection`对象的`prepareCall`方法完成。存储过程的调用格式通常以`...

    java调用存储过程小结.pdf

    Java 调用存储过程小结 Java 调用存储过程是指在 Java 程序中调用数据库中的存储过程,以便实现复杂的业务逻辑和数据处理。存储过程是指保存在数据库并在数据库端执行的程序,可以使用特殊的语法在 Java 类中调用...

    java调用Oracle存储过程的代码

    总结,通过Java调用Oracle存储过程,我们需要配置JDBC驱动,建立数据库连接,创建CallableStatement,设置参数,执行存储过程,并处理返回的结果。在这个例子中,我们展示了如何调用一个简单的存储过程并打印返回的...

    java调用存储过程返回数组

    总结来说,Java调用存储过程并处理返回数组,需要理解存储过程的定义,正确使用`CallableStatement`或其子类如`OracleCallableStatement`,以及处理Oracle特定数据类型的方法。通过这些技巧,我们可以有效地在Java...

    Java调用oracle存储过程通过游标返回临时表

    本篇文章将深入探讨如何使用Java调用Oracle存储过程,并通过游标获取存储过程中返回的临时表数据。 首先,Oracle存储过程是一种在数据库端执行的预编译SQL语句和PL/SQL代码集合。它可以接收参数、执行业务逻辑并...

    调用存储过程(java)

    - 处理结果:如果存储过程有结果集,可以通过`ResultSet`对象获取数据;如果有输出参数,使用`CallableStatement.getXXX()`方法获取。 4. **示例代码**: ```java import java.sql.*; public class ...

Global site tag (gtag.js) - Google Analytics