前言
在有些應用中,當碰到一個比較復雜的業務處理時,單純靠程序中執行sql語句無法完成或非常的麻煩,於是,我們可以把業務邏輯寫到存儲過程中,以簡化程序處理。本文介紹一些Java程序如何調用Oracle的過程。 1、程序代碼:
Connection con = null;
CallableStatement proc = null;
con = connectionPool.getConnection();
proc = con.prepareCall("{ call set_death_age(?,?) }");
在Oracle中procedure是沒有返回值的,這種方式調用的是procedure,如果需要調用function時,則可以用:
proc = con.prepareCall("{ ?=call set_death_age(?) }");
?=call set_death_age(?)的第一個?就是function的返回值。
當然,我們還必須為向proc注冊出參和入參:
Connection con = null;
CallableStatement proc = null;
con = connectionPool.getConnection();
proc = con.prepareCall("{ call set_death_age(?,?) }");
proc.registerOutParameter(1, Types.INTEGER);
proc.setString(2, "name");
proc.execute();
2、在Oracle中
我們以執行過程為例,以下是過程的源碼:
create or replace procedure set_death_age(v_name in varchar2,v_age out number )
is
begin
select id into v_age from users where name = v_name;
return v_age;
end;
3、返回值為結果集
當返回的是一個結果集時。在過程中需要返回的類型是游標,oracle中為oracle.jdbc.OracleTypes.CURSOR類型,用stmt.registerOutParameter(1,oracle.jdbc.OracleTypes.CURSOR);返回的是ResultSet類型
CallableStatement toesUp = connection.prepareCall("{ call PK_AREA_PUBLIC.area_search(?,?,?) }");
toesUp.registerOutParameter(1, Types.VARCHAR);
toesUp.registerOutParameter(2, Types.INTEGER);
toesUp.registerOutParameter(3, oracle.jdbc.OracleTypes.CURSOR);
toesUp.execute();
int age = toesUp.getInt(2);
ResultSet rs = (ResultSet) toesUp.getObject(3);
在過程中
create or replace package PK_AREA_PUBLIC is
TYPE serarch_result IS REF CURSOR;
PROCEDURE area_search(v_area_id varchar2 ,cur_result_out OUT serarch_result) ;
end PK_AREA_PUBLIC;
create or replace package body PK_AREA_PUBLIC is
PROCEDURE area_search(v_area_id varchar2 ,cur_result_out OUT serarch_result)
IS
sqlstr VARCHAR2(1000);
BEGIN
sqlstr:='select * from code_area where area_id=:1 ';
OPEN cur_result_out FOR sqlstr using v_area_id ;
END area_search;
end PK_AREA_PUBLIC;
4、如果一個參數作為inout時
CallableStatement toesUp = connection.prepareCall("{ call list_early_deaths (?) }");
toesUp.setInt(20);
toesUp.registerOutParameter(1, Types.Ingter);
toesUp.execute();