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萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章