2

次のようなクエリを実行しています。

INSERT INTO foo (...) VALUES (...) RETURNING ROWID INTO :bind_var

SELECT ... FROM foo WHERE ROWID = :bind_var

基本的に、行を挿入してその ROWID を取得し、その ROWID に対して選択を行って、そのレコードからデータを取得します。ただし、ごくまれに、ROWID が見つからないことがあります。

私がやろうとしていることを行うためのより良い方法がおそらくあるという事実を無視して、データベースを使用している人が他にいないと仮定して、ROWID がすぐに変更される可能性はありますか?

UPDATE 関連するトリガーがあります。そのための DDL ステートメントは次のとおりです。

CREATE OR REPLACE TRIGGER "LOG_ELIG_DEMOGRAPHICS_TRG" 
before insert on log_elig_demographics
for each row
begin
select log_elig_demographics_seq.nextval into :new.log_idn from dual;
end;

基本的に、これは IDENTITY/AUTO INCREMENT フィールドをエミュレートするのに役立つように設定された単なるトリガーです。このトリガーに何か問題がありますか?

4

7 に答える 7

3

ROWIDは、次の場合を除いて変更されません。

  • たとえば、あるテーブルスペースから別のテーブルスペースにテーブルを移動します(ALTER TABLE t MOVE)。
  • 行が1つのパーティションから別のパーティションに切り替わります(行の移動が有効なパーティションテーブル)
  • INDEXORGANIZEDテーブルの主キーを更新します。

標準(HEAP)テーブルで行が1つのブロックから別のブロックに移動すると、たとえば元のブロックに収まらないほど大きくなるため、行が移行されます。Oracleは新しいブロックへのポインタを残し、行を移動します。行は元のROWIDを保持します。

ROWIDは信頼できます。たとえば、マテリアライズド・ビューをリフレッシュするためにレプリケーションで使用されます。

于 2009-09-29T19:39:32.260 に答える
2

他にもいくつかのことが起こっている可能性があります。まず、INSERT が失敗している可能性があります。エラー/例外をチェックしていますか? そうでない場合は、変数の値がジャンクである可能性があります。

次に、選択できるものを挿入することができます。Virtual Private Database / Row Level Security が責任を負う可能性があります。

第 3 に、挿入と選択の間にコミットすると、遅延制約により挿入が強制的にロールバックされる可能性があります。

第 4 に、ロールバックを行っている可能性があります。

于 2009-09-30T09:39:26.540 に答える
2

INSERT は次のようになります。

INSERT INTO foo 
  (primary_key,
   ...) 
VALUES 
  (log_elig_demographics_seq.nextval,
   ...) 
RETURNING primary_key INTO :bind_var

トリガーは必要ありません。

于 2009-09-29T18:53:29.593 に答える
2

私はウォルターに同意します。

それ以外の

INSERT INTO foo (...) VALUES (...) RETURNING ROWID INTO :bind_var
SELECT ... FROM foo WHERE ROWID = :bind_var


...なぜ次のことをしないのですか?

SELECT primaryKey_seq.nextVal
INTO bind_var
デュアルから;

INSERT INTO foo (primaryKeyColumn,...)
値 (bind_var,...);

SELECT ... FROM foo WHERE primaryKeyColumn = bind_var;
于 2009-09-30T04:35:38.140 に答える
1

挿入を逆にする可能性のあるトリガーがテーブルにありますか?

于 2009-09-29T18:30:21.123 に答える
1

私の経験では、このようなエラーが発生する最も可能性の高い理由は、その間のどこかでロールバックが発生したことです。または、コミットがあった場合は、別のユーザーがレコードを削除した可能性があります。

于 2009-09-29T18:45:00.063 に答える
1

バインド変数はどのように宣言されますか? SQLPlus では ROWID 型を使用できないため、型変換が行われます。これが時々 ROWID 値を変更している可能性があるのではないかと思います。

于 2009-09-30T17:24:39.203 に答える