在存儲過程中,有輸入的參數也有輸出參數,有一個問題是:如果我們要輸出的參數特別多,或者說要輸出一張表的所有字段,那張表可能有特別多的字段,我們要對每個輸出的字段都使用out參數嗎?可以是可以,但我們不可能這麼做。我們想:能不能像java程序中,能不能定義一個集合或者一個bean容器來包含所有要輸出的字段。
下面就使用光標類型的out參數來輸出我們需要的數據信息:
我們可以新建一個包:包頭和包體
包頭:
CREATE OR REPLACE
PACKAGE MYCORSOR AS --創建一個叫mycorsor的包
type user_cursor is ref cursor; --定義一個cursor類型的user_cursor
procedure queryuserlist(userlist out user_cursor); --創建存儲過程,輸出cursor類型userlist
END MYCORSOR;
包體:
CREATE OR REPLACE
PACKAGE BODY MYCORSOR AS
procedure queryuserlist(userlist out user_cursor) AS
BEGIN
open userlist for select * from TB_USER; --打開光標
END queryuserlist;
END MYCORSOR;
然後在應用程序調用這個存儲過程
package jdbc.test;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import org.junit.Test;
import jdbc.utils.JDBCUtils;
import oracle.jdbc.driver.OracleCallableStatement;
import oracle.jdbc.driver.OracleTypes;
public class testCursor {
@Test
public void testcursor() {
String sql = "{call MYCORSOR.queryuserlist(?)}";//包名.存儲過程
Connection conn = null;
CallableStatement call = null;
ResultSet rs = null;
try {
conn = JDBCUtils.getConn();
call = conn.prepareCall(sql);
call.registerOutParameter(1, OracleTypes.CURSOR);
call.execute();
rs = ((OracleCallableStatement) call).getCursor(1);--得到輸出內容
while (rs.next()) {
System.out.println("id=" + rs.getString("id") + "姓名爲:" + rs.getString("name") + "年齡爲"
+ rs.getString("age") + "月薪爲" + rs.getString("money"));
}
} catch (Exception e) {
// TODO: handle exception
} finally {
JDBCUtils.release(conn, call, rs);--釋放資源
}
}
}