SQL Serverストアドプロシージャを作成するよう経営陣に勧められたC#開発者は、このようなプロシージャを生成することがよくあります。
create table #t1 (...);
insert into #t1 Select ... from table_a where ...;
insert into #t1 Select ... from table_b where ...;
update #t1 Set ... = ... where ...
Select * from #t1;
単一のステートメントはかなり単純であり、この方法により、正しい結果が生成されます。
多くの場合、私の仕事はそのような手順をOracleに移行することです。
次の事実に直面しましょう。
- SQL Serverの異なる一時テーブルは完全に独立しており、任意のアドホック構造を持つことができます。
- Oracleグローバル共通テーブルはグローバルオブジェクトであり、すべての用途で同じテーブル構造を共有します。この構造はどこでも使用されていますが、変更することはできません。
Oracle dbaから学んだことの1つは、可能な場合は常に一時テーブルの使用を避けることでした。SQLサーバーのパフォーマンスでさえ、このような変更の恩恵を受けます。
個々のインサートをユニオンに置き換える
最も単純なケースでは、上記は次のようなものに変換できます。
select case when ... then ... end, ... from table_a where ...
union
select case when ... then ... end, ... from table_b where ...
Order by ...;
関数の使用
スカラー関数とテーブル値関数はどちらも、プロシージャを上記の形式の単一のクエリに変換するのに役立ちます。
共通テーブル式、別名サブクエリファクタリング
サブクエリファクタリングは、一時テーブルを回避するためにOracleが提供するほぼ最高の機能です。これを使用すると、SQL ServerからOracleへの移行が簡単になります。これには、SQL Server 2005以降が必要です。
これらの変更により、SQL Serverのバージョンが改善され、多くの場合、移行が簡単になります。他の場合では、グローバル一時テーブルを使用すると、限られた時間で移行を行うことができますが、満足度が低くなります。
Oracleでグローバル一時テーブルの使用を回避する他の方法はありますか?