(注:このコードはテストされていないため、コンマや括弧がずれている可能性があります...)
これら 2 つのブロックはアクション列と結合のみが異なるように見えるため、2 つの IF 脚を削除して、p_update_mode のチェックを次のような CASE ステートメントに移動できます。
CREATE OR REPLACE PROCEDURE update_dynamic_entity(p_entity_type VARCHAR2 DEFAULT NULL, p_update_mode VARCHAR2) IS BEGIN INSERT INTO dynamicentitygtt (entity_type, entity_id, entity_code, synonyms, action) WITH data_view AS ( -- ITEM table SELECT 'ITEM' entity_type, -- This separates inserted values item_id data_id, item_name data_name, item_desc data_desc, creation_date FROM itemde UNION ALL -- ORG table SELECT 'ORG' entity_type, -- This separates inserted values org_id, org_name, org_desc, creation_date FROM orgde -- NEXT entity table ) SELECT upper(t.entity_type), t.data_id, t.data_name, t.data_desc, CASE lower(p_update_mode) WHEN 'incremental' THEN CASE WHEN t.creation_date > b.max_last_update_date THEN 'update' WHEN t.creation_date < b.max_last_update_date THEN 'add' END WHEN 'full' THEN 'add' END action FROM data_view t LEFT JOIN batch_run_details b ON b.entity_type = t.entity_type AND lower(p_update_mode )='incremental' WHERE (upper(p_entity_type) = t.entity_type OR p_entity_type IS NULL) AND (lower(p_update_mode) = 'full' OR (lower(p_update_mode) = 'incremental' AND b.entity_type IS NOT NULL) ); END update_dynamic_entity;
プレ>FULL ブロック内のクエリは、このモードで B に参加すべきではないと言っています。したがって、LEFT JOIN 句は INCREMENTAL モードの場合にのみ行を返しますが、FULL モードの場合は行を生成しません。
これは LEFT 結合である必要があります。そうしないと、FULL モードの B のエンティティに対応しない行が data_view から取得されない可能性があります。つまり、これが通常の JOIN のままである場合、結合の AND 句のために、クエリ全体で FULL モードでゼロ行が取得されます。
最後に、LEFT JOIN があるため、一番下の WHERE 句の AND フィルターが必要になります。これがないと、INCREMENTAL モードで実行すると、B に対応するエンティティ行があるかどうかに関係なく、data_view にすべての行が表示されます。 entity_id で結合している場合でも、左結合は、B に一致する行がなくても、T の各行に対して行を戻します。これが LEFT JOIN が設計されているためです。
とはいえ、これら 2 つのブロックをブレンドする価値があるかどうかを判断する必要があります。できるからといって、そうすべきだというわけではありません。そのままにしておくと、パフォーマンスが向上する可能性があります。いくつかのテストを実行してください。データの量と処理の頻度を知っているのはあなただけです。次の担当者がここで何が起こっているのかを理解する必要があるため、コードのメンテナンスについても考慮する必要があります。