関数やプロシージャの入力パラメータとしてのROWIDタイプの使用法についてさまざまな意見を聞きたいと思います。
私は通常、入力パラメーターとして主キーを使用して見ましたが、入力パラメーターとしてROWIDを使用することには何らかの欠点がありますか?WHERE句で使用すると、簡単で選択が非常に高速になると思います。
例えば:
FUNCTION get_row(p_rowid IN ROWID) RETURN TABLE%ROWTYPE IS...
コンセプトガイドから:
物理ROWIDは、特定のテーブルの行への可能な限り最速のアクセスを提供します。これらには行の物理アドレス(特定のブロックまで)が含まれており、単一のブロックアクセスで行を取得できます。Oracleは、行が存在する限り、そのROWIDが変更されないことを保証します。
ROWIDの主な欠点は、通常は安定していますが、状況によっては変更される可能性があることです。
ALTER TABLE MOVE
...)主キーは行を論理的に識別します。削除+挿入した後でも、常に正しい行が見つかります。ROWIDは行を物理的に識別し、主キーほど永続的ではありません。
Oracleは結果が一貫していることを保証するため、たとえばテーブル内の重複を削除するために、単一のSQLステートメントでROWIDを安全に使用できます。安全のために、行をロックしている場合(SELECT ... FOR UPDATE)にのみROWIDaccrossステートメントを使用することをお勧めします。
パフォーマンスの観点から、主キーアクセスは少し高価ですが、通常、単一行アクセスを多く行う場合にのみこれに気付くでしょう。ただし、パフォーマンスが重要な場合は、通常、rowidを使用した単一行処理よりも、セット処理を使用する方が大きなメリットを得ることができます。特に、DBとアプリケーションの間に多くのラウンドトリップがある場合、行アクセスのコストは、ラウンドトリップのコストと比較しておそらく無視できるでしょう。