ORA-08103: l'objet n'existe plus: Cette erreur se produit pour Oracle Procédure de retour Refcursor de MyBatis
Lors de l'appel d'une Procédure Stockée Oracle de retour refcursor j'obtiens une erreur
2011-05-10 03:36:23 DirtiesContextTestExecutionListener [DEBUG] After test method: context [[TestContext@3a363a36 testClass = AccountActivityServiceTest, locations = array<String>['classpath:/com/bnymellon/pwb/pfdetails/service/test/test-application-context.xml'], testInstance = com.bnymellon.pwb.pfdetails.service.test.AccountActivityServiceTest@6d2c6d2c, testMethod = getData@AccountActivityServiceTest, testException = org.springframework.jdbc.UncategorizedSQLException:
### Error updating database. Cause: java.sql.SQLException: ORA-08103: object no longer exists
### The error may involve com.bnymellon.pwb.pfdetails.persistence.AccountActivityMapper.getAccountActivityData-Inline
### The error occurred while setting parameters
### Cause: java.sql.SQLException: ORA-08103: object no longer exists
; uncategorized SQLException for SQL []; SQL state [72000]; error code [8103]; ORA-08103: object no longer exists
; nested exception is java.sql.SQLException: ORA-08103: object no longer exists
Je suis à l'aide de Printemps MyBatis integraton projet. la version de MyBatis est 3.0.4
Je peux voir, la Procédure est exécutée. Les journaux sont ci-dessous.
2011-05-10 03:36:16 PreparedStatement [DEBUG] ==> Executing: {call PWMWI.PAM_TRANSACTION_PKG.ACCOUNT_ACTIVITY( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)}
2011-05-10 03:36:16 PreparedStatement [DEBUG] ==> Parameters: 1987(Integer), 5627(Integer), null, null, 2010-01-01(Date), 2010-12-31(Date), All Asset Classes(String), [All, PYR](String), (String), null
Mon Mappeur XMl est comme suit:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.bnymellon.pwb.pfdetails.persistence.AccountActivityMapper">
<select id="getAccountActivityData"
parameterType="com.bnymellon.pwb.pfdetails.common.AccountActivityDTO"
statementType="CALLABLE">
{call PWMWI.PAM_TRANSACTION_PKG.ACCOUNT_ACTIVITY(
#{userInstance,mode=IN, jdbcType=INTEGER},
#{accountGroupId,mode=IN,
jdbcType=INTEGER},
#{accountId,mode=IN, jdbcType=VARCHAR},
#{accountId,mode=IN, jdbcType=VARCHAR},
#{startDate,mode=IN,
jdbcType=DATE},
#{endDate,mode=IN, jdbcType=DATE},
#{assetClass,mode=IN, jdbcType=VARCHAR},
#{transactionType,mode=IN,
jdbcType=VARCHAR},
#{cusipId,mode=IN, jdbcType=VARCHAR},
#{ticker,mode=IN, jdbcType=VARCHAR},
#{domainList,mode=OUT,jdbcType=CURSOR,javaType=java.sql.ResultSet,resultMap=aaDataMap})}
</select>
<resultMap type="com.bnymellon.pwb.pfdetails.domain.AccountActivity"
id="aaDataMap">
<result column="TICKER" property="ticker" jdbcType="VARCHAR" />
<result column="CUSIP" property="cusIp" jdbcType="VARCHAR" />
<result column="SECURITY_NAME" property="securityName"
jdbcType="VARCHAR"></result>
<result column="ASSET_CLASS" property="assetClass" jdbcType="VARCHAR" />
<result column="TRADE_DATE" property="tradeDate" jdbcType="DATE" />
<result column="SETTLE_DATE" property="settleDate" jdbcType="DATE" />
<result column="DESCRIPTION" property="description" jdbcType="VARCHAR" />
<result column="RECORD_TYPE" property="description" jdbcType="VARCHAR" />
<result column="ACCOUNT_NUMBER" property="accountNumber"
jdbcType="VARCHAR" />
<result column="QUANTITY" property="shares" jdbcType="VARCHAR" />
<result column="LONG_DESC" property="transDesc" jdbcType="VARCHAR" />
<result column="PORT_NUM" property="indicator" jdbcType="INTEGER" />
<result column="AMOUNT" property="amount" jdbcType="VARCHAR" />
</resultMap>
</mapper>
Je suis à l'aide de MyBatis version 3.0.4 et mon Oracle jar du pilote est ojdbc14-10.2.0.3.0.jar
D'entrée et DE SORTIE des paramètres et leurs types de données pour la Procédure sont comme ci-dessous:
P_USER_INST NUMBER IN
P_GROUP_ID NUMBER IN
P_ENTITY_ID CHAR IN
P_ENTITY_NAME VARCHAR2 (30) IN
P_START_DATE DATE IN
P_END_DATE DATE IN
P_ASSETCLASS CHAR IN
P_TRAN_TYPE CHAR IN
P_PRIMARY_ASSET_ID VARCHAR2 IN
P_TICKER VARCHAR2 IN
P_ACCOUNT_DETAIL_CUR REF CURSOR OUT
Mon DTO en Java ci-dessous(en omettant les méthodes setter/getter)
private Integer userInstance;
private Integer accountGroupId;
private String accountId;
private Date startDate;
private Date endDate;
private String transactionType;
private String ticker;
private String cusipId;
private String assetClass;
private List<AccountActivity> domainList;
Toute aide est très apprécié car je suis indice de moins en moins ce qui se passe et vraiment coincé sur cette.
OriginalL'auteur chotachetan | 2011-05-11
Vous devez vous connecter pour publier un commentaire.
J'ai juste eu un problème similaire avec .net plutôt que de Java.
mon problème lié au fait que le curseur ouvert sur une table temporaire globale. lorsque nous avons changé le GTT "lors de la validation de préserver les lignes" à partir de "supprimer les lignes" il a bien fonctionné.
voir si cela fonctionne pour vous?
OriginalL'auteur Andrew
Cela peut être une corruption, physique ou logique, dans un tableau ou un fichier de données.
Vérifiez auprès de votre DBA pour la récupération de données. Vous pouvez trouver les étapes sur la façon de récupérer des données corrompues à partir d'une table Oracle à http://24x7dba.blogspot.com/2011/08/salvage-data-from-corrupted-oracle.html
OriginalL'auteur george
ORA-8103 "l'objet n'existe plus"
Erreur: ORA 8103
Texte: l'objet n'existe plus
Cause: L'objet a été supprimé par un autre utilisateur depuis le début de l'opération.
Action: Supprimer les références à l'objet.
ORA-8103 signale qu'une instruction SQL trouvé un bloc qui n'appartient plus à l'objet référencé dans la déclaration.
Cause
ORA-8103 est causée par une défaillance de type bloc. Le bloc d'en-tête a une défaillance de type de bloc ou le type de bloc à l'intérieur du bloc n'est pas prévu; par exemple, un bloc de données (Type=6) a été prévu
mais les informations de bloc n'est pas un bloc de données (de Type!=6).
ORA-8103 est également causée par un inattendu data_object_id où il est en train de changer pour les objets tandis que les concernés exécution de l'instruction SQL.
OriginalL'auteur ParnassusData
Après avoir passé une semaine enfin j'ai résolu le Problème:
Solution: le Plus probable qu'un curseur est ouvert sur une table temporaire globale(GTT), qui avait été créé avec SUR les COMMETTRE SUPPRIMER des LIGNES d'option. Et la cause de l'ORA-08103: l'objet n'existe plus d'erreur est s'engager déclaration qui a suivi juste après l'instruction delete. DBA équipe n'a pas d'accord pour changer la GTT
comme lors de la validation de préserver les lignes donc, finalement, j'ai ajouté le code de base en Java de la Couche de Service[la mise en Œuvre de la collection Printemps - Transaction Programmatique]
OriginalL'auteur user1765387