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存儲過程返回一個列表,還要請各位讀者多多指教