CallableStatement的相关用法解疑
CallableStatement度娘文本解释
CallableStatement 对象为所有的DBMS 提供了一种以标准形式调用已储存过程的方法。
拼代码
private static Connection conn = null;
private static CallableStatement Service =null;
public static Map imports(String url,String user,String password) throws SQLException
{
Map map = new HashMap();
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
conn=DriverManager.getConnection(url, user, password);
Service = conn.prepareCall("{call fw_abli_export_data_gl(?)}");
Service.setString(1, srvid);
Service.execute();
} catch (Exception e) {
e.printStackTrace();
conn.rollback();
map.put("e", e);
}
finally{
Service.close();
conn.close();
}
return map;
}
下面就是对代码进行深入讲解
代码前半段无关乎这次讲解的主题,直接从重点开始说起。
前面说过,CallableStatement就是用标准形式调用已存储过程的。调用的存储过程有两种,一种是不带返回参数的,一种是带返回参数的。
create or replace procedure fw_abli_export_data_gl(srvid in varchar2)as
begin
...
end fw_abli_export_data_gl; //以上是存储过程的定义
Service = conn.prepareCall("{call fw_abli_export_data_gl(?)}");
Service.setString(1, srvid);
//Service.setInt(..,..)
Service.execute();
//不带返回参数,问号代表占位符,fw_abli_export_data_gl毫无疑问就是过程名
create or replace procedure fw_abli_export_data_gl(srvid out varchar2)as
begin
...
end fw_abli_export_data_gl; //以上是存储过程的定义
Service = conn.prepareCall("{call fw_abli_export_data_gl(?)}");
Service.registerOutParameter(1, srvid);
Service.execute();
String srvid = Service.getString(1);
//带返回参数的
如果返回的是列表,由于oracle存储过程没有返回值,它的所有返回值都是通过out参数来替代的,列表同样也不例外,但由于是集合,所以不能用一般的参数,必须要用pagkage了.所以要分两部分.
第一部分:建一个程序包
create or replace pakeage mypakeage as
type my_cursor is ref cursor;
end mypackage;
第二部分,建存储过程:
create or replace procedure fw_abli_export_data_gl(gl_Cursor out mypackage.my_cursor) as
begin
open gl_Cursor for select t.* from base.XXXX t;
end fw_abli_export_data_gl;
//java代码
Service = registerOutParameter(1, oracle.jdbc.OracleTypes.CURSOR);
。。。
ResultSet rs = (ResultSet)Service.getObject(1);