java 调用 oracle存储过程返回列表

 

-- 创建用户表
create   table  users (
    uid 
varchar2 ( 10 not   null   primary   key ,
    userName 
varchar2 ( 20 not   null ,
    pwd 
varchar2 ( 20 not   null
);
-- 创建序列
create   or   replace  sequence seq
start 
with   1  
increment 
by   1
maxvalue 
20
minvalue 
20
cycle
cache 
20 ;
-- 创建一个有返回 procedure 首先需要创建一个包
create   or   replace  package pk_userlist
as
type ref_users 
is  ref  cursor -- 声明动态游标
end  pk_userlist;
create   or   replace procedure  sel_userlist(u_cursor out pk_userlist.ref_users)
is
begin
open  u_cursor  for   select   *   from  users;
end  sel_userlist;

下面是 java调用代码

// 建立一个持久类
public   class  Users implement java.io.Serializable  {
            
private Integer uid;
            
private String userName;
            
private String pwd;

            
public Users(){
            }

            
public Users(Integer uid){
                    
this.uid = uid;
            }

            
public Users(Integer uid,String userName,String pwd){
                   
this.uid = uid;
                   
this.userName = userName;
                   
this.pwd = pwd;
            }

            
public void setUid(Integer uid){
                    
this.uid = uid;
            }

            
public Integer getUid(){
                    
return uid;
            }

            
public void setUserName(String userName){
                   
this.userName = userName;
            }

            
public String getUserName(){
                   
return userName;
            }

            
public void setPwd(String pwd){
                  
this.pwd = pwd;
            }

            
public String getPwd(){
                  
return pwd;
            }

}
// end class Users
// 连接数据库类
public   class  ConManager  {
           
private static String driver = "oracle.jdbc.driver.OracleDriver";
           
private static String url = "jdbc:oracle:thin:@localhost:1521:orcl";
           
private static String userName = "scott";
           
private static String pwd = "tiger";
                
//加载 oracle 驱动
               static {
                      
try{
                  Class.forName(driver);
     }
catch(ClassNotFoundException ex){
               ex.printStackTrace();
     }
catch(Exception ex){
               ex.printStackTrace();
     }

                }

                
//获取连接
                public static Connection getConnection() {
                       
try{
                
return DriverManager.getConnection(url,userName,pwd);
        }
catch(SQLException ex){
                ex.printStackTrace();
                
return null;
                         }
catch(Exception ex){
                ex.printStackTrace();
                
return null;
                        }

              }
//end getConnection()
}
//  end class ConManager

public   class  UserDaoImpl {
            
private Connection conn = null;
            
private CallableStatement proc = null;
            
private ResultSet rs = null;
            
private Users users = null;

            
//查询方法,返回列表
            public List getUserAll(){
            List result 
= new ArrayList();
            
try{
    conn 
= ConManager.getConnection();
    
//如果得到的 connection 为空,直接返回一个 null;
    if(conn == null){
             
return null;
    }

    
/*调用存储过程*/
    proc 
= conn.prepareCall("{ call scott.sel_userlist(?)}");
    
/*传入一个输出参数,因为前面定义的存储过程参数是包,包里定义了一个游标,所以这里传进来一个游标用来输出*/
    proc.registerOutParameter(
1,oracle.jdbc.OracleTypes);
    
/*执行存储过程*/
    proc.execute();
    
/*得到结果集,并转换为 ResultSet */
    rs 
= (ResultSet)proc.getObject(1);
    
while(rs.next()){
                            users 
= new Users();
                            users.setUid(rs.getInt(
"uid"));
           users.setUserName(rs.getString(
"userName"));
           users.setPwd(rs.getString(
"pwd"));
           result.add(users);
    }

    
/*
                       *这里判断并不是必须,可在前台处理,前台我这就不写了,这里这样写只是为了更好的理解,
                       *真正开发最好放在前台处理
     *前台写法与这里一样,如果是结合struts or servlet 写法如下:
     *List list = UserDaoImpl.getUserAll();
     *if(list == null){
     *   request.setAttribute("error","没有你要查询的数据!!!"); 
     *}
    
*/

    
if(result.size() > 0 && result != null){
           
return result;
    }

    
else{
           
throw new Exception("没有你要查询的数据!!!");
    }

           }
catch(SQLException ex){
    ex.printStackTrace();
           }
catch(Exception ex){
      ex.printStackTrace();
           }
finally{
              
try{
    
//释放所有资源,关闭连接
    users = null;
    
this.close(rs,proc,null,conn);
             }
catch(SQLException ex){
    ex.printStackTrace();
             }

            }

             
return null;
}
 //end getUserAll()
//关闭连接
public void close(ResultSet rs,CallableStatement proc,PreparedStatement ps,Connection conn){
            
if(rs != null){
                  
try{
    rs.close();
                  }
catch(SQLException ex){
    ex.printStackTrace();
                  }

            }

            
if(proc != null){
                  
try{
    proc.close();
                  }
catch(SQLException ex){
    ex.printStackTrace();
                  }

           }

           
if(ps != null){
                  
try{
    ps.close();
                  }
catch(SQLException ex){
    ex.printStackTrace();
                  }

           }

           
if(conn != null){
                  
try{
    conn.close();
                   }
catch(SQLException ex){
    ex.printStackTrace();
                   }

           }

   }
//end close();
}
// end class UserDaoImpl

上面的代码实现了用 java 调用oracle存储过程返回一个列表,还要请各位读者多多指教

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值