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

 

--创建用户表
create table users (
    uid 
varchar2(10not null primary key,
    userName 
varchar2(20not null,
    pwd 
varchar2(20not 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存储过程返回一个列表,还要请各位读者多多指教

 

 

发布了23 篇原创文章 · 获赞 0 · 访问量 10万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章