在调用存储过程时 我给邦定了个游标类型的输出参数用来获得查询结果集
结果在程序中使用报错 类型长度大于最大值!
因为公司刚刚更新了oracle驱动 是什么10.2版本滴! 
以前用滴好好滴 大虾门 高手们帮帮忙啊!小弟在此先谢过了

解决方案 »

  1.   

    这是包头
    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;
        }
    没有换驱动前是很好用的
      

  2.   

    上面的程序就是调用的代码啊!
    procName 就是存储过程的名字 params就是存储过程输入参数列表