2

エンドユーザーの不適切なキーボード設定が原因で、特定の無効な文字がデータベースに挿入されることがあります。

すべての列を反復処理し、無効な文字を置き換える pl/sql スクリプトがあります。スクリプトは 1 分もかからずに完了します (ただし、システムはまだベータ版であり、広く使用されていません)。

1 つの解決策は、テーブルに挿入する直前に無効な文字を置き換えるトリガーを作成することです。1 つの解決策は、スケジュールされたジョブを使用していわゆるスクリプトを実行することです。

どちらがより効率的ですか?

4

3 に答える 3

3

スケジュールされたジョブを使用する場合、無効な文字がデータ内にある時間がまだあります。そうでないことが非常に重要な場合は、トリガーを使用します。トリガーは、データベースに有効な文字のみが含まれていることを確認します。

ここでは効率はあまり重要ではないと思います。トリガーは、ユーザーによるデータ入力に簡単に追いつくことができます。

于 2012-05-16T12:58:02.283 に答える
1

正直なところ、トリガーのファンではありません。

更新が必要な行を識別するインデックスを提供することで、スケジュールされたジョブの効率を向上させることができます。

一般に、構文は次のようになります。

create index my_speshul_index on my_table(
  case when some_expression then 1 else null end);

some_expression は、これらの文字の存在を検出する式です -- おそらく regexp_like です。

次に、次のようにクエリします。

select ... from my_table
where case when some_expression then 1 else null end;
于 2012-05-16T12:48:27.610 に答える
0

もう1つの方法は、データを最初に入力したとおりにデータベースに入力できるようにすることですが、クリーンアップされたデータを含む仮想列を作成します。

ただし、これは、問題が数列に限定されている場合にのみ機能します。すべてのユーザーが入力可能な列である可能性があるため、regexp_replaceを使用したトリガーが最適な方法のようです。許可する文字によっては、次のような一連のステートメントのように単純な場合があります。

 :new.columnA := regexp_replace(:new.ColumnA,'[^[:print:]]','');

つまり、印刷できない文字をすべて削除するだけです。

于 2012-05-16T13:15:07.733 に答える