`
hmx1388
  • 浏览: 37072 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
社区版块
存档分类
最新评论

JAVA调用oracle存储过程返回游标出现“对象不再存在”问题

阅读更多
运行在was5.1上的应用某个功能在DAO中调用存储过程返回游标时出现“java.sql.SQLException: ORA-08103: 对象不再存在”的错误,
系统开发框架:spring+hibernate+struts
系统运行环境:jdk1.5+wabsphere5.1+oracle9i
以下是调用存储过程的JAVA代码和过程内容
callableStatement = connection.prepareCall("CALL GET_GRADE(?,?,?,?,?)");

callableStatement.setObject(1, parameterArray.getOracleARRAY(connection));
callableStatement.registerOutParameter(2, OracleTypes.CURSOR);
callableStatement.registerOutParameter(3, OracleTypes.NUMBER);
callableStatement.registerOutParameter(4, OracleTypes.VARCHAR);
callableStatement.execute();

if (callableStatement.getInt(3) != 0) {
    String error = callableStatement.getString(5);
    throw BaseException.systemException("系统错误!" + error);
}

resoultSet = (ResultSet) callableStatement.getObject(2);
if (logger.isDebugEnabled()) {
	logger.debug("tree execute before");
}

执行到callableStatement.getObject(2)就出错了。
PROCEDURE GET_STANDARDGRADE(
       P_PARAMETERLIST IN OUT TYPE_PARAMETERLIST,
        P_HEAD OUT	T_CURSOR, -- 返回游标
        P_B_EXCEPTION IN OUT	NUMBER, -- =0:正常 非0 错误
        P_B_EXCEPTION_DESCRIPTION IN OUT VARCHAR2) -- 错误描述
IS
	W_SQLSTR		LONG;
	W_SUBQUERYSTRING	LONG;
	W_D_COLUMNSTRING	LONG;

	W_LOOPPOINT		NUMBER := 0;
	W_NAME			VARCHAR2(30);
	W_YEAR			NUMBER;
	CURSOR W_CURSOR IS
	SELECT GID,NAME
	FROM GRADE
	WHERE YEAR = W_YEAR
	ORDER BY GID;
	W_CURSOR_ROW W_CURSOR%ROWTYPE;
BEGIN
	P_B_EXCEPTION := -1;
	W_YEAR := PKG_PARAMETER.FNC_GETINTVALUEBYNAME('YEAR',P_PARAMETERLIST,1);

	IF P_HEAD%ISOPEN THEN
		CLOSE P_HEAD;
	END IF;

	delete from TMPTAB_RPT_TITLE;
	--临时表插入两行数据
         INSERT INTO TMPTAB_RPT_TITLE(ID,PID,COLUMNNAME)
	VALUES(2,NULL,'NAME');
	INSERT INTO TMPTAB_RPT_TITLE(ID,PID,COLUMNNAME)
	VALUES(1,NULL,'STDID');
         --获取临时表数据,返回游标
 	OPEN P_HEAD FOR SELECT * FROM TMPTAB_RPT_TITLE ORDER BY ID;
	P_B_EXCEPTION := 0;
	<<PROCEDURE_EXIT>>
	P_B_EXCEPTION := P_B_EXCEPTION +0;
END GET_STANDARDGRADE;

CREATE GLOBAL TEMPORARY TABLE YSBZ.TMPTAB_TREE_CONTAINER
(
    ID                             VARCHAR2(100),
    PID                            VARCHAR2(100),
    COLUMNNAME                     VARCHAR2(100)
)
ON COMMIT DELETE ROWS
NOCACHE
/


奇怪的是hibernate连接方式如果是DatasourceConnection会出现以上的错误,改成DriverManagerConnection方式运行又是正常的。
后来怀疑是临时表的问题,将ON COMMIT DELETE ROWS改成ON COMMIT PRESERVE ROWS
后问题解决了。
分享到:
评论

相关推荐

    java调用oracle存储过程(游标)相关

    总之,Java调用Oracle存储过程,尤其是处理游标,需要理解JDBC的使用、Oracle特定的类型以及存储过程的参数传递方式。通过合理的编程实践,我们可以高效地在Java应用程序中集成Oracle数据库的复杂操作。

    Java调用oracle存储过程通过游标返回临时表

    本篇文章将深入探讨如何使用Java调用Oracle存储过程,并通过游标获取存储过程中返回的临时表数据。 首先,Oracle存储过程是一种在数据库端执行的预编译SQL语句和PL/SQL代码集合。它可以接收参数、执行业务逻辑并...

    java调用oracle存储过程返回结果集,Record,cursor参照.pdf

    Java调用Oracle存储过程返回结果集Record、Cursor参照 Java调用Oracle存储过程返回结果集(Record)是指在Java程序中通过调用Oracle存储过程来获取记录集的结果。下面将详细介绍相关知识点。 创建Type 在Oracle中...

    JAVA调用ORACLE存储过程游标使用

    总结一下,Java调用Oracle存储过程并处理游标的关键步骤包括: 1. 创建Oracle存储过程,包含一个或多个OUT参数,这些参数为游标。 2. 在Java中,使用`CallableStatement`调用存储过程,注册OUT参数为`OracleTypes....

    用java调用oracle存储过程总结

    } } catch (SQLException ex1) { } } }}```总结与注意事项调用Oracle存储过程在Java中主要使用`CallableStatement`,通过占位符`?`来代表参数,并使用`setXXX`方法设置IN参数,`registerOutParameter`注册OUT或IN...

    java调用oracle存储过程或者函数

    以上就是Java调用Oracle存储过程或函数的主要知识点,实践中要根据具体情况进行适当的调整和优化。在处理过程中,参考Oracle的JDBC文档和官方示例,以及Java API文档,将有助于理解和解决问题。

    用callabledStatement调用oracle存储过程实用例子(IN OUT 传游标)

    Oracle 存储过程调用 CallabledStatement 实用例子(IN OUT 传游标) 一、Oracle 存储过程简介 Oracle 存储过程是一种可以在 Oracle 数据库中存储和执行的程序单元。存储过程可以由多种语言编写,例如 PL/SQL、...

    Oracle存储过程out游标

    在Java中,我们可以使用JDBC API来调用Oracle存储过程并处理返回的Out游标。`OracleProcedure.java`文件应该包含了这样的代码。以下是一个简单的示例: ```java CallableStatement cs = connection.prepareCall("{ ...

    jdbc连接例子 Oracle CLOB转换为String java调用存储过程之输出游标

    3. Java调用Oracle存储过程处理输出游标: 存储过程是预编译的SQL语句集合,可以在数据库服务器端执行。在Java中,可以使用`CallableStatement`来调用存储过程,特别是处理返回输出游标的存储过程。游标允许我们...

    Java调用oracle存储过程总结

    通过这些步骤,你可以成功地从Java应用程序中调用Oracle存储过程。确保正确配置JDBC驱动,理解存储过程的参数类型,并熟悉JDBC API,这样就能高效地实现数据交互了。在开发过程中,可以参考Oracle的官方文档以及各种...

    Oracle 存储过程JAVA调用存储过程 游标使用

    通过阅读和分析这些文件,你可以深入理解如何在Java应用程序中调用Oracle存储过程,并且有效地利用游标处理数据。这个过程涉及到数据库设计、SQL编写、PL/SQL编程以及Java JDBC技术,是数据库开发中的核心技能之一。

    Java调用Oracle存储过程的方法

    以上就是使用Java调用Oracle存储过程的方法,包括处理基本类型返回值和游标返回值。在实际开发中,可能还需要处理异常、事务管理等问题,确保代码的健壮性和可维护性。同时,为了提高性能,建议使用连接池管理数据库...

    Java获取Oracle存储过程返回的Cursor

    在Java编程中,有时我们需要调用Oracle数据库的存储过程,特别是当存储过程返回一个游标(Cursor)时,这种情况在处理大量数据或者分页查询时很常见。游标允许我们逐行处理结果集,而无需一次性加载所有数据,这对于...

    JAVA调用ORACLE存储过程通用类

    ### JAVA调用ORACLE存储过程通用类 #### 概述 在Java开发中,经常会遇到需要与数据库交互的情况,特别是当涉及到复杂的业务逻辑时,利用数据库的存储过程可以有效地提高程序性能并简化代码结构。本篇文章将详细...

    java调用Oracle存储过程

    另外,如果存储过程返回游标(结果集),可以通过`ResultSet`接口进行处理。记得检查存储过程的返回值,它通常是一个表示成功与否的状态。 在开发过程中,可以使用诸如IntelliJ IDEA或Eclipse这样的IDE进行调试,...

    Java调用oracle存储过程输出自定义对象或二维表

    本文将深入探讨如何在Java中调用Oracle存储过程,并输出自定义对象或二维表,以此提升数据处理效率。 首先,我们需要理解Java与Oracle数据库的连接方式。Java通过JDBC(Java Database Connectivity)API来实现对...

    springboot整合mybatis调用oracle存储过程

    本文将深入探讨如何在Spring Boot项目中整合MyBatis,实现调用Oracle存储过程并处理游标返回的数据。 首先,我们需要在Spring Boot项目中引入相关的依赖。在`pom.xml`文件中添加Oracle JDBC驱动(ojdbc66-oracle...

    java调用oracle存储过程返回结果集,Record,cursor.[参考].pdf

    总结来说,这个示例展示了如何在Java中调用Oracle存储过程,处理返回的Record类型数据,并将这些数据以Cursor形式返回。在实际开发中,这种技术常用于处理复杂的业务逻辑,尤其是在需要大量自定义数据结构和返回多行...

    java调用oracle存储过程

    总结起来,Java调用Oracle存储过程涉及到JDBC、数据库连接管理、CallableStatement的使用以及可能的自定义类型转换。通过合理运用这些技术,开发者可以高效地在Java应用中集成和利用Oracle数据库的功能。

Global site tag (gtag.js) - Google Analytics