JAVA中連接數據庫叫JDBC(Java DataBase Connection).
那麼Java對不同的數據庫進行連接的方式都是一樣的。這是因為SUN公司定義了對數據庫操作的接口,而由各大數據庫廠商來實現。而這個實現就是我們在連接各種數據庫時拷入的JAR包。
這裡只是介紹 JDBC中是怎麼調用存儲過程
這是一個簡單的存儲過程
CREATE OR REPLACE PROCEDURE sp_test
(v_out OUT NUMBER)
AS
BEGIN
v_out:=10;
END;
Java中的程序
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection con=DriverManager.getConnection("jdbc:Oracle:thin:@localhost:1521:ORCL", "scott", "tiger");
int num=0;
String sql="{call sp_test(?)}";
CallableStatement cs=con.prepareCall(sql);
cs.setObject(1, num);
cs.registerOutParameter(1,Java.sql.Types.INTEGER);
cs.executeUpdate();
num=cs.getInt(1);
這時num的值就為10,這個是存儲過程sp_test返回的。
上面只是返回一個值,如果返回游標怎麼辦啦?
CREATE OR REPLACE PROCEDURE sp_test
(v_cur_list OUT sys_refcursor) // 這裡sys_refcursor 是系統定義游標,可以直接用,不再去新建
AS //游標,放到包中 在引用了。
BEGIN
OPEN v_cur_list FOR SELECT * FROM dept;
END;
Java中的代碼
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection con=DriverManager.getConnection("jdbc:Oracle:thin:@localhost:1521:ORCL", "scott", "tiger");
int num=0;
String sql="{call sp_test(?)}";
CallableStatement cs=con.prepareCall(sql);
cs.setObject(1, num);
cs.registerOutParameter(1,oracle.jdbc.OracleTypes.CURSOR);
cs.execute();
ResultSet rs=(ResultSet)cs.getObject(1);
while (rs.next()){
System.out.println(rs.getObject(1).toString()+rs.getObject(2).toString());
}
大家一定注意到了,這個兩端Java程序在執行的時候分別是cs.execute()和cs.executeUpdate();
這裡還可以改為cs.executeQuery(),雖然這個三個返回的數據類型都不一樣,但在調用存儲過程的時候這三個是通用的,是不是很神奇啊!