CREATE OR REPLACE PROCEDURE ZZJHQR (
  RESULTSET OUT TEST_ZZJHQR.testresultset
)
AS
begin
open RESULTSET for
select * from rwfpb;
end; 
这个是ORACLE存储过程CREATE OR REPLACE PACKAGE TEST_ZZJHQR is
type testresultset is ref cursor;
end TEST_ZZJHQR;
这个是返回数据集的程序包public List getList() {
Session session =getSessionFactory().openSession();   
SQLQuery query = session.createSQLQuery("{Call LIMING_ZZJHQR()}");
return query.list();
}
这个是底层DAO调用存储过程的方法,返回一个LISTpublic ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd"); ApplicationContext context = getWebApplicationContext();
Irwglservice service = (Irwglservice)context.getBean("rwglservice");
zzjhqrForm zzForm = (zzjhqrForm) form;// TODO Auto-generated method stub
List resultList = null;
                     resultList = service.getList();
request.setAttribute("rwresultList", resultList);
ActionForward forward = mapping.getInputForward();
forward = mapping.findForward("success");
return forward;
}
         这个是ACTION调用DAO层方法得到一个LIST
         问题是执行完底层public List getList() {
Session session =getSessionFactory().openSession();   
SQLQuery query = session.createSQLQuery("{Call LIMING_ZZJHQR()}");
return query.list();
}方法时,报错!
java.sql.SQLException: ORA-06550: 第 1 行, 第 7 列: 
PLS-00306: 调用 'LIMING_ZZJHQR' 时参数个数或类型错误
ORA-06550: 第 1 行, 第 7 列: 
PL/SQL: Statement ignored
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134)
我感觉是我那个数据集参数没添加进去,问题是怎么添加啊,那算一个游标吧,游标参数怎么添加啊,用我的那种调用方式

解决方案 »

  1.   

    SQLQuery query = session.createSQLQuery("{Call LIMING_ZZJHQR()}");
    把这一句换成下面的试试:
    Query query = session.getNamedQuery("Call LIMING_ZZJHQR");
      

  2.   

    Connection conn = getSession().connection();CallableStatement stmt = conn.prepareCall("{Call LIMING_ZZJHQR()}");这样的吧
      

  3.   

    你这种方式不还要需要在表的映射文件中加
                <sql-query name = "getlist" callable="true">
      {call LIMING_ZZJHQR(?)}</sql-query>然后引用通过名称吗
    Query query = session.getNamedQuery("getlist");我那种方式为什么就不可以
      

  4.   

    用我上面说的那种方式报错2011-7-6 11:44:36 org.apache.catalina.core.ApplicationDispatcher invoke
    严重: Servlet.service() for servlet jsp threw exception
    javax.servlet.jsp.JspException: No getter method for property kind of bean list
      

  5.   


    getHibernateTemplate().execute(new HibernateCallback(){ public Object doInHibernate(Session session) throws HibernateException, SQLException {
    // TODO Auto-generated method stub
    SQLQuery query = session.createSQLQuery("call 过程");
    query.setParameter(0, "参数");
    //..............多个略
    return query.executeUpdate();
    }});
      

  6.   

    你能不能帮我看下一楼我发的 我要求返回一个LIST 还有存储过程里面就一个参数 应该算个游标 你别写的那么模糊啊 这些网上都有 不是执行不过去嘛
      

  7.   

    SQLQuery query = session.createSQLQuery("{Call LIMING_ZZJHQR(?)}");
    query.xxxxx(1,Type.XXXX);//设置注册类型
     result = query.getXXX(1);//获取结果集jdbc就是按上面那样来的, hibernate应该也一样,具体什么方法自己找下
      

  8.   

                 Connection conn = .....
                 ResultSet rs = null;
                CallableStatement proc = null;
                proc = (CallableStatement)conn
                        .prepareCall("{call 包名.存贮过程名(?)}");
                proc.registerOutParameter(1, OracleTypes.CURSOR);
                boolean result = proc.execute();
                if (result) {
                    rs = (ResultSet)proc.getObject(1);
                }
                rs = (ResultSet)proc.getObject(1);这样试试
      

  9.   

    ...首先我不是在网上随便给你找的,是我自己项目中复制过来的,明确的告诉你是能运行通过的!一个参数就一个setParameter,如果你需要返回值那么就不能用execute 而要用executeFind,返回值请调用query.list() ,这样就返回一个list对象里面就有相应的返回值,但我不建议你直接用query.list而更建议你使用query.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP); 这样声明后在query.list就返回一个list<map> map的key就是你数据库对应的列名称!更加方便你读取对应的数据,可读性也高了不少,我看了你的代码,你应该是使用了spring+hibernate ,spring对hibernate做完美封装,特别不建议你optionSession这样你写的事物配置就失去意义了,请使用回调函数!使用aop拦截来实现事物管理是最理想的!
      

  10.   


    @SuppressWarnings("unchecked")
    public List findCreateSqlMap(final String sql,final Map parameter) {
    List<Map> list = getHibernateTemplate().executeFind(new HibernateCallback(){
    public Object doInHibernate(Session session) throws HibernateException, SQLException {
    SQLQuery query = session.createSQLQuery(sql);
    query.setProperties(parameter).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
    return (List<Map>)query.list();
    }});
    return list;
    } @SuppressWarnings("unchecked")
    public List<Map> findCreateSqlMap(final String sql,final Object[] parameter) {
    List<Map> list = getHibernateTemplate().executeFind(new HibernateCallback(){
    public Object doInHibernate(Session session) throws HibernateException, SQLException {
    SQLQuery query = session.createSQLQuery(sql);
    for(int i=0;i<parameter.length;i++){
    query.setParameter(i, parameter[i]);
    }
    query.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
    return (List<Map>)query.list();
    }});
    return list;
    }这个是我们直接在dao层封装的,所有service层都调用这一个dao,这两个你都可以使用,第二个既可以调用过程也可以执行普通sql 我们一直这样用的!所以不存在运行不了的问题!
      

  11.   

    hibernate不支持存储过程,你用JDBC吧
      

  12.   

    问下啊 这2个第二个参数都分别怎么传递进去啊 没搞明白 第一个参数就是个SQL语句串 第二个参数是个数组吧 怎么定义穿进去啊
      

  13.   

    我记得hibernate有回调方法的呀,支持存储过程,上学的时候整过
    使用8楼的方法
    有两年了还没搞过hibernate呢,悲哀呵
      

  14.   


    不知道你解决了没有parameter明显就是参数的意思啦,
    select * from User u where u.name=?
    Map的key就是查询字段,name
    Map的value就是对应的值?占位符的值