在oracle10g中编写了一个带游标的存储过程,在hibernate3.0中不知该怎么调用啊。
第一种方式:直接用sql的接口,报错信息如下:org.hibernate.HibernateException: Exception while trying to autodiscover types.
at org.hibernate.loader.custom.CustomLoader.autoDiscoverTypes(CustomLoader.java:153)
at org.hibernate.loader.Loader.getResultSet(Loader.java:1678)
at org.hibernate.loader.Loader.doQuery(Loader.java:662)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:224)
at org.hibernate.loader.Loader.doList(Loader.java:2145)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2029)
at org.hibernate.loader.Loader.list(Loader.java:2024)
at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:111)
at org.hibernate.impl.SessionImpl.listCustomQuery(SessionImpl.java:1655)
at org.hibernate.impl.AbstractSessionImpl.list(AbstractSessionImpl.java:142)
at org.hibernate.impl.SQLQueryImpl.list(SQLQueryImpl.java:164)
at com.onevr.dao.impl.BaseHibernateDao.toProcedure(BaseHibernateDao.java:519)
at com.onevr.dao.impl.statistics.StatDaoImpl.getSelfStat(StatDaoImpl.java:188)
at dao.StatDaoTest.testPesonal(StatDaoTest.java:65)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.junit.internal.runners.TestMethodRunner.executeMethodBody(TestMethodRunner.java:99)
at org.junit.internal.runners.TestMethodRunner.runUnprotected(TestMethodRunner.java:81)
at org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:34)
at org.junit.internal.runners.TestMethodRunner.runMethod(TestMethodRunner.java:75)
at org.junit.internal.runners.TestMethodRunner.run(TestMethodRunner.java:45)
at org.junit.internal.runners.TestClassMethodsRunner.invokeTestMethod(TestClassMethodsRunner.java:71)
at org.junit.internal.runners.TestClassMethodsRunner.run(TestClassMethodsRunner.java:35)
at org.junit.internal.runners.TestClassRunner$1.runUnprotected(TestClassRunner.java:42)
at org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:34)
at org.junit.internal.runners.TestClassRunner.run(TestClassRunner.java:52)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:38)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
Caused by: java.sql.SQLException: ORA-00900: 无效 SQL 语句 at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:111)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:330)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:282)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:277)
at oracle.jdbc.driver.T4C8Odscrarr.receive(T4C8Odscrarr.java:213)
at oracle.jdbc.driver.T4CPreparedStatement.doDescribe(T4CPreparedStatement.java:728)
at oracle.jdbc.driver.OracleStatement.describe(OracleStatement.java:3453)
at oracle.jdbc.driver.OracleResultSetMetaData.<init>(OracleResultSetMetaData.java:56)
at oracle.jdbc.driver.OracleResultSetImpl.getMetaData(OracleResultSetImpl.java:137)
at org.hibernate.loader.custom.CustomLoader.autoDiscoverTypes(CustomLoader.java:122)
... 33 more第二种方式:
   String  sql="{call venture_success(90,100)}";
   ResultSet rs =null;
   Connection conn = null;
   conn = getSession().connection();
   CallableStatement call = conn.prepareCall(sql);
   rs = call.executeQuery();
又总是报错:“无效的sql语句”。
达人指教......

解决方案 »

  1.   

    oracle的存储过程输出游标,必须把游标作为一个out参数你这里没有输出参数,是不行的。
    存储过程要用CallableStatement来调。String sql="{call venture_success(90,100)}";
    ResultSet rs =null;
    Connection conn = null;
    conn = getSession().connection();
    CallableStatement call = conn.prepareCall(sql);
    rs = call.executeQuery();
    又总是报错:“无效的sql语句”。:
    --->
    String sql="{call venture_success(?,?)}";
    ......
    CallableStatement call = conn.prepareCall(sql);
    call.setInt(1,90);
    call.setInt(2,100);
    call.registerOutParameter(.....
    call.execute();
    ...
    rs = call.getObject(...)好像是这样一个过程,忘了。
      

  2.   

    hib的没有,纯java的有,这事sql:
    create or replace procedure proc_sel_stat_total_with_date(
    in_start_time varchar2,
    in_end_time varchar2,
    in_page_size number,
    in_start_page number,
    out_cr_series OUT SYS_REFCURSOR
    )
    AS 
    begin

    open out_cr_series for
    select t.series_id,
    s.series_name,
    t.chapter_id,
    c.chapter_no,
    t.view_zero_count,
    t.view_count,
    t.gold_coins
    from (
    select row_number() over(order by view_count desc) rn,
    series_id,
    chapter_id,
    view_zero_count,
    view_count,
    gold_coins
    from (
    select ucc.series_id,
    ucc.chapter_id,
    sum(ucc.view_zero_count) view_zero_count,
    sum(ucc.view_count) view_count,
    sum(ucc.gold_coins) gold_coins
    from 
    dat_ct_stat_use_coins_chapter ucc
    where substr(pay_time,0,8) >= in_start_time
    and substr(pay_time,0,8) <= in_end_time
    group by ucc.series_id,
    ucc.chapter_id
    )
    ) t,dat_ct_series s,dat_ct_chapter c
    where t.series_id = s.series_id
    and t.chapter_id = c.chapter_id
    and t.rn > in_page_size * (in_start_page-1)
    and t.rn <= in_page_size * in_start_page; Exception when others then
    raise;
    end proc_sel_stat_total_with_date;
    /这事java:
    public ArrayList<StatTotalObj> getStatTotalPage(String startTime,
    String endTime, long pageSize, long pageStart)
    throws ComicException {
    ArrayList<StatTotalObj> lst = new ArrayList<StatTotalObj>();
    ICallableStatement cs = null;
    ResultSet rs = null; try {
    cs = DbFactory.getInstance().getCallableStatement(
    DBI.SERVER_DB_NAME, proc_sel_stat_total_with_date); cs.setString(1, startTime);
    cs.setString(2, endTime);
    cs.setLong(3, pageSize);
    cs.setLong(4, pageStart);
    cs.registerOutParameter(5, OracleTypes.CURSOR); cs.execute(); rs = (ResultSet) cs.getObject(5); while (rs.next()) {
    StatTotalObj obj = new StatTotalObj();
    obj.setSeriesId(String.valueOf(rs
    .getBigDecimal(DBI.SERIES.SERIES_ID)));
    obj.setSeriesName(rs.getString(DBI.SERIES.SERIES_NAME));
    obj.setChapterId(String.valueOf(rs
    .getBigDecimal(DBI.CHAPTER.CHAPTER_ID)));
    obj.setChapterNo(String.valueOf(rs
    .getInt(DBI.CHAPTER.CHAPTER_NO)));
    obj.setViewZeroCount(String.valueOf(rs
    .getBigDecimal(DBI.STAT.VIEW_ZERO_COUNT)));
    obj.setViewCount(String.valueOf(rs
    .getBigDecimal(DBI.STAT.VIEW_COUNT)));
    obj.setGoldCoins(String.valueOf(rs
    .getBigDecimal(DBI.CHAPTER.GOLD_COINS))); lst.add(obj);
    }
    } catch (Exception e) {
    throw new ComicException(e);
    } finally {
    try {
    if (rs != null) {
    rs.close();
    }
    if (cs != null) {
    cs.close();
    }
    } catch (SQLException e) {
    throw new ComicException(e);
    }
    }
    return lst;
    }
      

  3.   

    private static final String proc_sel_stat_total_with_date = "{ call proc_sel_stat_total_with_date(?,?,?,?,?)}";
    这句忘了,一共5个参数,5个?号,最后哪个是输出的游标。