6

refcursor を返す Oracle でストアド プロシージャを呼び出すと、エラーが発生します

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 

Spring MyBatis 統合プロジェクトを使用しています。MyBatisのバージョンは3.0.4です

プロシージャが実行されていることがわかります。ログは以下です。

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

私のマッパーXMLは次のとおりです。

<?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>

MyBatis バージョン 3.0.4 を使用しており、Oracle ドライバー jar は ojdbc14-10.2.0.3.0.jar です。

Procedure の IN および OUT パラメータとそのデータ型は次のとおりです。

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    

Javaの私のDTOは以下です(セッター/ゲッターメソッドを省略)

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;

何が起こっているのか手がかりが少なく、これに本当にこだわっているので、どんな助けも大歓迎です。

4

6 に答える 6

4

Javaではなく.netで同様の問題が発生しました。

私の問題は、グローバル一時テーブルに基づいてカーソルが開いたという事実に関連していました。GTTを「行の削除」から「行の保存をコミットする」に変更すると、正常に機能しました。

それがあなたのために働くかどうか見てください?

于 2011-06-15T05:24:43.633 に答える
0

これは、テーブルまたはデータファイルの物理的または論理的な破損である可能性があります。データの回復については、DBAに確認してください。Oracleテーブルから破損したデータを回復する方法の手順については、 http: //24x7dba.blogspot.com/2011/08/salvage-data-from-corrupted-oracle.htmlを参照してください。

于 2011-08-02T13:35:50.277 に答える
0

ORA-8103 「オブジェクトはもう存在しません」

エラー: ORA 8103

テキスト: オブジェクトはもう存在しません

原因: オブジェクトは、操作の開始後に別のユーザーによって削除されました。処置: オブジェクトへの参照を削除してください。

ORA-8103 は、SQL ステートメントが、ステートメントで参照されているオブジェクトに属していないブロックを検出したことを報告しています。原因 ORA-8103 は、無効なブロック タイプが原因です。ブロック ヘッダーに無効なブロック タイプが含まれているか、ブロック内のブロック タイプが予期されていません。たとえば、データ ブロック (Type=6) が予期されていましたが、実際のブロック情報はデータ ブロック (Type!=6) ではありません。ORA-8103 は、予期しない data_object_id によっても発生し、影響を受ける SQL ステートメントの実行中に、関連するオブジェクトの data_object_id が変更されます。

于 2016-02-22T08:48:04.580 に答える