oracle存储过程返回多个游标实例

楼主
我是社区第303位番薯,欢迎点我头像关注我哦~
oracle存储过程返回多个游标实例
定义两个包(package
CREATE OR REPLACE PACKAGE pro_package_test_001 AS
TYPE Test_CURSOR01
IS REF CURSOR;
end pro_package_test_001;

CREATE OR REPLACE PACKAGE pro_package_test_002 AS
TYPE Test_CURSOR02
IS REF CURSOR;
end pro_package_test_002;
定义存储过程
CREATE OR REPLACE PROCEDURE pro_query_001
(
--参数IN表示输入参数,OUT表示输入参数,类型可以使用任意Oracle中的合法类型。
in_lx  IN Varchar2,
p_cus_01 OUT pro_package_test_001.Test_CURSOR01,
p_cus_02 OUT pro_package_test_002.Test_CURSOR02     
)
AS
--定义变量
vs_lx   VARCHAR2(1);   --变量
vs_test1_id   VARCHAR2(100);   --变量
vs_test1_mc   VARCHAR2(100);   --变量
vs_test2_id   VARCHAR2(100);   --变量
vs_test2_mc   VARCHAR2(100);   --变量
--default_c SYS_REFCURSOR;   
BEGIN
--用输入参数给变量赋初值。
vs_lx:= in_lx;
--插入test1表。
OPEN p_cus_01 FOR  Select
    a.id
As id1,
    a.mc
As mc1,
    b.id
As id2,
    b.mc
As mc2
   
Into
    vs_test1_id,
    vs_test1_mc,
    vs_test2_id,
    vs_test2_mc
   
From test1 a,test2 b Where a.id = b.id And a.lx = vs_lx;
   
   
--if p_cus_01%rowcount = 0 then
   --    p_cus_01:=default_c;
   -- end if;
  
OPEN p_cus_02 FOR  Select
    id
As id1,
    mc
As mc1
   
Into
    vs_test1_id,
    vs_test1_mc
   
From test2  Where lx = vs_lx;  
   
-- if p_cus_02%rowcount = 0 then
    --   p_cus_02:=default_c;
  --  end if;      
--错误处理部分。OTHERS表示除了声明外的任意错误。SQLERRM是系统内置变量保存了当前错误的详细信息。
Exception
   
WHEN OTHERS Then
   
ROLLBACK;
   
Return;
End pro_query_001;

java 代码调用
     public void ProcQuery(String procString,String [] params) throws Exception {
         Session session =
null;
         Connection conn =
null;
         ResultSet rs1 =
null;
         ResultSet rs2 =
null;
           CallableStatement proc =
null;
           procString = "{call pro_query_001(?,?,?)}";
           params =
new String [1];
          params[0]="0";
         
try {   
              session = getHibernateTemplate().getSessionFactory()
            .openSession();
              conn = session.connection();
             proc = conn.prepareCall(procString);
             proc.setString(1, params[0]);     
//传入的参数
             proc.registerOutParameter(2,oracle.jdbc.OracleTypes.CURSOR);
             proc.registerOutParameter(3,oracle.jdbc.OracleTypes.CURSOR);
             proc.execute();
             rs1 = (ResultSet)proc.getObject(2);
//返回第一个游标
             rs2 = (ResultSet)proc.getObject(3);//返回第二个游标
            while(rs1 != null && rs1.next()) {
                  System.out.println(">>>"+rs1.getString("id1"));
                  System.out.println(">>>"+rs1.getString("mc1"));
                  System.out.println(">>>"+rs1.getString("id2"));
                  System.out.println(">>>"+rs1.getString("mc2"));
            }
            
while(rs2 != null && rs2.next()) {
                System.out.println(">>>"+rs1.getString("id1"));
                System.out.println(">>>"+rs1.getString("mc1"));
          }            
         }
catch (SQLException e) {   
             e.printStackTrace();   
            
throw new Exception("调用存储过程的时候发生错误[sql = " + procString + "]", e);         
         }  
finally {
            
if (proc != null)
                 proc.close();
            
if (rs1 != null)
                 rs1.close();
            
if (rs2 != null)
                 rs2.close();
            
if (conn != null)
             conn.close();
         }
     }




分享扩散:

沙发
发表于 2012-3-22 11:30:03
移动到资料下载区
------------------------------------------
我们的目标,保证没有0回复!!!!
板凳
发表于 2012-3-22 15:47:36
:)现在手头上没什么事,看看文档学习学习。
地板
发表于 2012-3-22 15:49:12
参数IN表示输入参数,OUT表示输入参数

亲呐,注释是不是错了。
5楼
发表于 2012-4-2 09:38:57
:Q
6楼
发表于 2012-4-7 22:19:32
学习了,不错
7楼
发表于 2015-8-3 21:46:54
应用于什么样的场景呢?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

6回帖数 1关注人数 8038浏览人数
最后回复于:2015-8-3 21:46

返回顶部 返回列表