在调用存储过程时 我给邦定了个游标类型的输出参数用来获得查询结果集
结果在程序中使用报错 类型长度大于最大值!
因为公司刚刚更新了oracle驱动 是什么10.2版本滴!
以前用滴好好滴 大虾门 高手们帮帮忙啊!小弟在此先谢过了这是包头
create or replace package test_pkg
IS
type test_cur_typ is ref cursor ;
procedure test_cur_proc(v_cur in out test_cur_pkg.test_cur_typ);END test_pkg;
下面是包体
create or replace package body test_cur_pkg IS procedure test_cur_proc( v_cur in out test_cur_pkg.test_cur_typ)
IS
begin
open v_cur for select * from fw_module;
END test_cur_proc;
end test_cur_pkg;
程序: /**
* 执行存储过程,不支持有返回参数的存储过程,考虑到存储过程返回结果集时<br/>
* 必须用到游标做为输出参数,在程序内部封装了个游标类型的变量,调用时不用
* 另外再传输出参数了.
* @param dataSourceCode
* 数据源<br >
* @param procName
* 存储过程名称<br >
* @param params
* 输入参数参数列表<br >
* @return 用List包装的查询结果.List里的元素是HashMap封装的查询结果集的每一行纪录<br >
* @throws Exception
*/
public List queryProc(String dataSourceCode, String procName, String[] params) throws Exception {
Connection conn = getConnection(dataSourceCode);
StringBuffer sb = new StringBuffer();
for (int i = 0; i < params.length; i++) {
sb.append("?,");
}
String strSql="";
CallableStatement cste=null;
if(params.length!=0){
strSql = sb.toString().substring(0, sb.toString().length() - 1);
strSql="{ call "+procName+"( " + strSql + ")}";
cste = conn.prepareCall(strSql);
}else
{
cste = conn.prepareCall("{call "+procName+"(?)}");
}
int paramFalg=1;
for (int i = 0; i < params.length; i++) {
cste.setString(i+1, params[i]);
paramFalg++;
}
cste.registerOutParameter(paramFalg,oracle.jdbc.OracleTypes.CURSOR);
cste.executeQuery();
ResultSet set=(ResultSet)cste.getObject(paramFalg);
List resultList = this.resultSetToList(set);
set.close();
cste.close();
RdbConnectionManager.closeConnection(conn);
return resultList;
}
没有换驱动前是很好用的
结果在程序中使用报错 类型长度大于最大值!
因为公司刚刚更新了oracle驱动 是什么10.2版本滴!
以前用滴好好滴 大虾门 高手们帮帮忙啊!小弟在此先谢过了这是包头
create or replace package test_pkg
IS
type test_cur_typ is ref cursor ;
procedure test_cur_proc(v_cur in out test_cur_pkg.test_cur_typ);END test_pkg;
下面是包体
create or replace package body test_cur_pkg IS procedure test_cur_proc( v_cur in out test_cur_pkg.test_cur_typ)
IS
begin
open v_cur for select * from fw_module;
END test_cur_proc;
end test_cur_pkg;
程序: /**
* 执行存储过程,不支持有返回参数的存储过程,考虑到存储过程返回结果集时<br/>
* 必须用到游标做为输出参数,在程序内部封装了个游标类型的变量,调用时不用
* 另外再传输出参数了.
* @param dataSourceCode
* 数据源<br >
* @param procName
* 存储过程名称<br >
* @param params
* 输入参数参数列表<br >
* @return 用List包装的查询结果.List里的元素是HashMap封装的查询结果集的每一行纪录<br >
* @throws Exception
*/
public List queryProc(String dataSourceCode, String procName, String[] params) throws Exception {
Connection conn = getConnection(dataSourceCode);
StringBuffer sb = new StringBuffer();
for (int i = 0; i < params.length; i++) {
sb.append("?,");
}
String strSql="";
CallableStatement cste=null;
if(params.length!=0){
strSql = sb.toString().substring(0, sb.toString().length() - 1);
strSql="{ call "+procName+"( " + strSql + ")}";
cste = conn.prepareCall(strSql);
}else
{
cste = conn.prepareCall("{call "+procName+"(?)}");
}
int paramFalg=1;
for (int i = 0; i < params.length; i++) {
cste.setString(i+1, params[i]);
paramFalg++;
}
cste.registerOutParameter(paramFalg,oracle.jdbc.OracleTypes.CURSOR);
cste.executeQuery();
ResultSet set=(ResultSet)cste.getObject(paramFalg);
List resultList = this.resultSetToList(set);
set.close();
cste.close();
RdbConnectionManager.closeConnection(conn);
return resultList;
}
没有换驱动前是很好用的
List resultList = this.resultSetToList(set); 出来的吧。是的话,resultSetToList 代码 和 fw_module 粘出来。