1. ホーム
  2. sql

[解決済み] 例外 ORA-08103: Hibernate の setfetchsize を使用するとオブジェクトが存在しない

2022-02-11 15:13:20

質問

Hibernateを使用しています。私は約100万レコードを取得する必要があり、それはタイムアウト例外を引き起こします。だから私は使用しています setfetchsize 6000レコードのために、それは6000レコードごとに複数のトランザクションに処理を分散させるように。

すべて取得するのに約21時間かかる。

しかし、レコードを取得している間に、誰かが取得するはずだったレコードの1つを削除した場合、私は取得します。 ORA-08103: object no longer exists .

ここで、検索中に削除されたオブジェクトをスキップしたいのです。どうすればよいのでしょうか?

どのように解決するのですか?

で作成されたグローバルテンポラリテーブル(GTT)に基づいてカーソルがオープンされている可能性が高いです。 ON COMMIT DELETE ROWS オプションで指定します。そして、その原因は ORA-08103: object no longer exists のエラーは commit 文の直後に続く delete ステートメントを使用します。以下は簡単な例です。

 SQL> declare
  2    type t_recs is table of number;
  3    l_cur sys_refcursor;    -- our cursor
  4    l_rec t_recs; 
  5  
  6  begin
  7  
  8    -- populating a global temporary table GTT1 with sample data  
  9    insert into GTT1(col)
 10      select level
 11        from dual
 12     connect by level <= 1000;
 13  
 14   open l_cur         -- open a cursor based on data from GTT1
 15    for select col
 16          from GTT1;
 17  
 18    -- here goes delete statement
 19    -- and
 20    commit;  <-- cause of the error. After committing  all data from GTT1 will be
 21              -- deleted and when we try to fetch from the cursor
 22    loop      -- we'll face the ORA-08103 error
 23      fetch l_cur    -- attempt to fetch data which are long gone.
 24       bulk collect into l_rec;
 25      exit when l_cur%notfound;
 26    end loop;
 27  
 28  end;
 29  /


ORA-08103: object no longer exists
ORA-06512: at line 24

によるグローバル一時テーブルの再作成 on commit preserve rows 句を使用することで、そのテーブルをベースとするカーソルから安全にデータを取得することができます。 ORA-08103: というエラーが発生します。