`
wa20463165
  • 浏览: 1855 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

在线程中执行一个存储过程(oracle),运行一段时间之后就会报错

阅读更多
2012-10-16 09:50:34,575 [Thread-3] INFO [com.tg.thread.util.LoggerUtil] - java.sql.SQLException: ORA-00604: 递归 SQL 级别 1 出现错误
ORA-01000: 超出打开游标的最大数
ORA-00604: 递归 SQL 级别 1 出现错误
ORA-01000: 超出打开游标的最大数
ORA-01000: 超出打开游标的最大数
 
  at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134)
   at oracle.jdbc.ttc7.TTIoer.processError(TTIoer.java:289)
   at oracle.jdbc.ttc7.Oopen.receive(Oopen.java:120)
   at oracle.jdbc.ttc7.TTC7Protocol.open(TTC7Protocol.java:586)
   at oracle.jdbc.driver.OracleStatement.<init>(OracleStatement.java:385)
   at oracle.jdbc.driver.OracleStatement.<init>(OracleStatement.java:413)
   at oracle.jdbc.driver.OraclePreparedStatement.<init>(OraclePreparedStatement.java:119)
   at oracle.jdbc.driver.OracleCallableStatement.<init>(OracleCallableStatement.java:77)
   at oracle.jdbc.driver.OracleCallableStatement.<init>(OracleCallableStatement.java:48)
   at oracle.jdbc.driver.OracleConnection.privatePrepareCall(OracleConnection.java:1134)
   at oracle.jdbc.driver.OracleConnection.prepareCall(OracleConnection.java:988)
   at sun.reflect.GeneratedMethodAccessor108.invoke(Unknown Source)
   at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
   at java.lang.reflect.Method.invoke(Method.java:592)
   at org.hibernate.jdbc.BorrowedConnectionProxy.invoke(BorrowedConnectionProxy.java:74)
   at $Proxy1.prepareCall(Unknown Source)
   at com.tg.thread.busi.period.dao.CmPeriodInfoDaoImpl.execProce_strpPeriod(CmPeriodInfoDaoImpl.java:40)
   at com.tg.thread.busi.period.service.PeriodService.proess_StopPeriod(PeriodService.java:37)
   at com.tg.thread.test.TestThread.run(TestThread.java:62)
 
2012-10-16 09:50:34,575 [Thread-3] INFO [com.tg.thread.util.LoggerUtil] - PeriodService--> 期次过期过程 执行失败 数据库异常,过程返回null
2012-10-16 09:50:34,575 [Thread-3] INFO [com.tg.thread.util.LoggerUtil] - 正在执行的查询hql: from CmPeriodInfoBean t where (t.istate=2 or t.istate=3) and rownum<15 order by t.id desc 
2012-10-16 09:50:34,576 [Thread-3] INFO [com.tg.thread.util.LoggerUtil] - org.hibernate.exception.GenericJDBCException: could not execute query
   at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:126)
   at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:114)
   at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
   at org.hibernate.loader.Loader.doList(Loader.java:2235)
   at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2129)
   at org.hibernate.loader.Loader.list(Loader.java:2124)
   at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:401)
   at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:363)
   at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:196)
   at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1149)
   at org.hibernate.impl.QueryImpl.list(QueryImpl.java:102)
   at com.tg.thread.base.BaseDaoImpl.findObjects(BaseDaoImpl.java:92)
   at com.tg.thread.busi.period.service.PeriodService.getNoAwardsPeriods(PeriodService.java:204)
   at com.tg.thread.test.TestThread.run(TestThread.java:64)
Caused by: java.sql.SQLException: ORA-00604: 递归 SQL 级别 1 出现错误
ORA-01000: 超出打开游标的最大数
ORA-00604: 递归 SQL 级别 1 出现错误
ORA-01000: 超出打开游标的最大数
ORA-01000: 超出打开游标的最大数
 
  at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134)
   at oracle.jdbc.ttc7.TTIoer.processError(TTIoer.java:289)
   at oracle.jdbc.ttc7.Oopen.receive(Oopen.java:120)
   at oracle.jdbc.ttc7.TTC7Protocol.open(TTC7Protocol.java:586)
   at oracle.jdbc.driver.OracleStatement.<init>(OracleStatement.java:385)
   at oracle.jdbc.driver.OracleStatement.<init>(OracleStatement.java:413)
   at oracle.jdbc.driver.OraclePreparedStatement.<init>(OraclePreparedStatement.java:119)
   at oracle.jdbc.driver.OraclePreparedStatement.<init>(OraclePreparedStatement.java:92)
   at oracle.jdbc.driver.OracleConnection.privatePrepareStatement(OracleConnection.java:950)
   at oracle.jdbc.driver.OracleConnection.prepareStatement(OracleConnection.java:802)
   at org.hibernate.jdbc.AbstractBatcher.getPreparedStatement(AbstractBatcher.java:534)
   at org.hibernate.jdbc.AbstractBatcher.getPreparedStatement(AbstractBatcher.java:452)
   at org.hibernate.jdbc.AbstractBatcher.prepareQueryStatement(AbstractBatcher.java:161)
   at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1577)
   at org.hibernate.loader.Loader.doQuery(Loader.java:696)
   at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:259)
   at org.hibernate.loader.Loader.doList(Loader.java:2232)
   ... 10 more



--下面是存储过程的代码
create or replace procedure pro_stopPeriod--期次过期截至
(

   po_ErrCode Out Int, --错误代码
   po_ErrDesc Out varchar2, --错误描述
   po_orderAccoutSum Out Int --重置订单总数
)
is
   v_count int;
   v_period VARCHAR2(20);
   v_lotterycode VARCHAR2(20);
   cursor emp_cursor is
   select t.cperiodid,t.clotterycode from cm_period_info t
   where t.cendtime <to_char(sysdate,'yyyy-MM-dd HH:mm:ss') and (t.ISTATE=0 or t.ISTATE=1);


begin
   po_ErrCode :=9999;
   po_ErrDesc :='未知异常';
   po_orderAccoutSum:=0;
   OPEN emp_cursor;

   IF emp_cursor%ISOPEN THEN
   LOOP
   FETCH emp_cursor INTO v_period,v_lotterycode;
   EXIT WHEN emp_cursor%NOTFOUND;
   --处理代购0表示未处理; 1-收单成功 2-收单失败
   select count(*) into v_count from cm_orderinfo t where t.cperiodid=v_period and t.clotterycode=v_lotterycode
   and (t.tradestate=1 or t.tradestate=2 );
   if v_count>0 then
   update cm_orderinfo t1 set t1.TRADESTATE=11 where t1.cperiodid=v_period and t1.clotterycode=v_lotterycode;
   po_orderAccoutSum:=po_orderAccoutSum+v_count;
   ----缺少退款流程--单独线程处理
   end if;

   --处理合买
   select count(*) into v_count from cm_hm_info t where t.ILEAVINGNUM>0
   and t.ICPERIODS=v_period and t.CLOTTERYCODE=v_lotterycode and (t.ISTATE=0 or t.ISTATE=1);
   if v_count>0 then
   update cm_hm_info t set t.istate=5 where ( t.ILEAVINGNUM>0 or t.istate=0 or t.istate=1 ) and t.ICPERIODS=v_period and t.CLOTTERYCODE=v_lotterycode;
   po_orderAccoutSum:=po_orderAccoutSum+v_count;
   ---缺少退款流程--单独线程处理
   end if;

   end loop;
   CLOSE emp_cursor;

   update cm_period_info t set t.istate=2 where t.cendtime <to_char(sysdate,'yyyy-MM-dd HH:mm:ss');
   po_ErrCode :=0;
   po_ErrDesc :='期次停止并将相关订单修改为[出票失败]完成';
   commit;
   else
   po_ErrCode :=2001;
   po_ErrDesc :='游标未打开';
   commit;
   end if;



   /*
   LOOP
   FETCH emp_cursor INTO v_ename;
   EXIT WHEN emp_cursor%NOTFOUND;

   update cm_orderinfo t1 set t1.TRADESTATE=5 where t1.cperiodid=emp_cursor%cperiodid
   and t1.clotterycode=emp_cursor%clotterycode;
   po_orderAccoutSum:=emp_cursor%ROWCOUNT;
   END LOOP;
   end if;

   FOR Emp_record IN emp_cursor LOOP
   DBMS_OUTPUT.PUT_LINE(Emp_record.cperiodid|| Emp_record.clotterycode);
   END LOOP;
   */

Exception
   When Others Then
   po_ErrCode :=9999;
   po_ErrDesc := '未知异常' ;
   IF emp_cursor%ISOPEN THEN
   CLOSE emp_cursor;
   END IF;
   rollback;
end pro_stopPeriod;
分享到:
评论

相关推荐

    java编写oracle的存储过程,为什么调用System.in阻塞IO时不起作用?还报错?

    在Java编程中,Oracle存储过程的调用与标准输入(System.in)的交互可能会遇到一些问题,特别是当尝试使用System.in进行阻塞IO操作时。这个问题通常涉及到Java的多线程概念、I/O流的处理以及Oracle存储过程的执行...

    c++与Qt实现把定时器放进子线程中运行

    默认情况下,QTimer是在主线程中运行的,其触发的槽函数也会在主线程中执行。这在很多情况下是足够的,但如果槽函数执行时间较长或者涉及到复杂的计算,可能会导致主线程被占用,影响UI的响应速度。 QThread则是一...

    Winform基于多线程实现每隔1分钟执行一段代码

    6. **线程安全**:虽然这个简单的定时器实现没有特别处理线程同步问题,但在`Stop`方法中尝试停止线程时,它调用了`Abort`方法,这是一个粗暴的停止方式,可能会导致未完成操作的问题。在实际开发中,推荐使用更优雅...

    多个线程到达后才能执行某个任务,并且只能执行一次

    标题中的“多个线程到达后才能执行某个任务,并且只能执行一次”指的是在多线程环境下,需要确保一个任务在所有等待线程都到达特定条件后才开始执行,并且这个任务在整个程序运行过程中只被执行一次。这通常涉及到...

    多线程并行执行,汇总结果

    多线程并行执行是指在同一个程序中同时运行多个线程,每个线程负责不同的任务,以实现任务的并发执行。这种技术可以充分利用多核处理器的优势,将CPU的计算能力最大化,从而提高程序的运行效率。在Java中,可以通过...

    Java中一个线程执行死循环有什么后果

    标题所提及的场景是一个Java多线程环境,涉及到两个线程——ThreadA和ThreadB,它们分别执行Service类中的methodA()和methodB()方法。这两个方法分别同步在不同的对象上,即object1和object2。在这种情况下,线程A在...

    PyQt5多线程的执行和停止

    在Python的GUI编程中,PyQt5是一个广泛使用的库,它提供了丰富的功能,包括创建复杂的用户界面和处理多线程任务。本示例主要探讨如何在PyQt5中实现多线程的执行与停止,并通过进度条进行可视化展示。下面我们将深入...

    ORACLE启动报错常见问题解决

    Oracle数据库在启动过程中可能会遇到各种报错,这些错误通常是由于配置问题、资源限制或是系统级设置不当导致的。本文将详细解析ORACLE启动报错的常见问题及其解决方案。 首先,针对ORA-12500:“TNS:监听程序无法...

    C#线程 在某一时间内,只有N个线程在并发执行,其余都在队列中的实现

    在C#编程中,线程管理是一个重要的概念,特别是在多任务并行处理的场景下。在某些情况下,我们可能需要限制同一时间并发执行的线程数量,以避免资源过度消耗或确保程序的稳定性。本篇将详细介绍如何使用C#中的Mutex...

    易语言判断多个线程运行结束

    - 在易语言中,可以使用“创建线程”命令来创建一个新的线程,该命令会返回一个线程ID,这个ID用于后续的线程管理和操作。 - 当线程执行完毕或被强制中断时,系统会自动清理线程资源。但若需手动结束线程,可使用...

    java通过线程控制程序执行超时(新)

    在Java编程中,控制程序执行超时是一项重要的任务,特别是在多线程环境下,我们可能需要确保某个任务不会无限制地运行下去,导致资源耗尽。本文将深入探讨如何使用Java的线程机制来实现程序执行的超时控制,同时也会...

    易语言判断多线程是否运行结束

    多线程是指在一个进程中同时存在两个或更多的执行线程,它们共享同一内存空间,但各自有独立的执行路径。在易语言中,我们可以通过创建线程对象来启动新的线程,并通过特定的函数或子程序来控制和监视线程的状态。 ...

    Java操作Oracle数据库-多线程.rar

    在本例中,可能创建了多个线程来并行执行数据库查询,每个线程负责一个或多个任务,这样可以大大提高整体处理速度。 4. **同步与线程安全**:在多线程环境中,数据共享可能会引发竞态条件和死锁问题。因此,Java...

    多线程界面更新报错解决方法

    在软件开发过程中,特别是在Windows Forms应用程序中,开发者经常需要在后台线程中执行耗时操作,并且在这些操作完成后更新用户界面(UI)。然而,直接从非UI线程访问或修改UI控件可能会导致应用程序崩溃或异常行为...

    向量在同一个块中用多个线程执行

    在本实验中,启动了一个线程块,且该线程块中有10个线程,这意味着我们将在GPU的一个特定区域上同时运行10个线程,共同处理一个任务。 线程块是CUDA编程中并行度的基本单位,它内部的线程可以高效地共享数据,因为...

    解决winform编程中使用线程界面卡死的案例

    在Windows Forms(Winform)应用程序开发中,遇到界面(UI)卡死问题通常是由于长时间运行的任务阻塞了主线程,导致UI无法响应用户交互。主线程是负责更新和绘制用户界面的,如果在这个线程上执行了耗时操作,就会...

    QSerialport多线程方法

    使用Qt也已经有一段时间了,虽然使用过继承QThread重写run函数,以及继承QObject然后使用MoveToThread两种方法实现多线程,但是在QSerialPort的使用过程中,两种方法都存在一定的问题。 典型的问题: QObject: ...

    Java存储过程实现Oracle远程逻辑备份与恢复.pdf

    Oracle数据库是一个基于网络计算的系统,它内建了对Java的支持,包括Oracle JVM(Java Virtual Machine),这使得开发者能够在数据库服务器端执行复杂的计算任务,减轻客户端的负担。Java存储过程是Oracle数据库中的...

    java oracle,多线程,综合应用示例

    在描述中提到的博客链接(由于实际无法访问,我们只能根据题目提供信息进行推测)可能详细解释了一个使用Java实现的多线程案例。这个案例可能涉及到线程同步、线程通信、线程池等高级主题,比如`synchronized`关键字...

    Windows环境中Kill掉Oracle线程

    Oracle 提供了一个名叫 Orakill 的工具,可以在 Windows 环境下强制 Kill 掉一个线程。Orakill 的使用方法如下:在 Dos 提示符下,输入“orakill sid thread”,其中 sid 是 Oracle 的 Sid 号,thread 是 Oracle 的...

Global site tag (gtag.js) - Google Analytics