在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语句”。
达人指教......
第一种方式:直接用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语句”。
达人指教......
存储过程要用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(...)好像是这样一个过程,忘了。
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;
}
这句忘了,一共5个参数,5个?号,最后哪个是输出的游标。