(CATATAN:kode ini belum diuji dan saya mungkin menggunakan koma di sini atau tanda kurung di sana...)
Kedua blok tersebut tampaknya hanya berbeda dalam kolom aksi dan gabungan, sehingga Anda dapat menghilangkan 2 kaki IF dan memindahkan pemeriksaan p_update_mode ke dalam pernyataan CASE seperti ini:
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;
Kueri di blok LENGKAP Anda mengatakan bahwa kita tidak boleh bergabung ke B dalam mode ini. Jadi klausa LEFT JOIN hanya mengembalikan baris ketika dalam mode INCREMENTAL, tetapi seharusnya tidak menghasilkan baris untuk mode LENGKAP.
Ini harus bergabung dengan KIRI atau kami mungkin tidak mendapatkan baris apa pun dari tampilan_data Anda yang tidak sesuai dengan entitas di B untuk mode LENGKAP. Dengan kata lain, jika ini tetap GABUNG biasa, keseluruhan kueri Anda akan mendapatkan nol baris dalam mode LENGKAP karena klausa AND dalam gabungan.
Terakhir, filter AND di klausa WHERE di bagian bawah menjadi perlu sekarang karena ada LEFT JOIN. Tanpa ini, saat menjalankan dalam mode INCREMENTAL, Anda akan mendapatkan SETIAP baris di data_view Anda TERLEPAS dari ada baris entitas yang sesuai di B atau tidak. Meskipun Anda bergabung di entity_id, gabungan kiri akan mengembalikan baris untuk setiap baris di T bahkan tanpa baris yang cocok di B, karena itulah yang dirancang untuk dilakukan oleh LEFT JOIN.
Semua yang dikatakan, Anda harus memutuskan apakah layak memadukan kedua blok ini. Hanya karena Anda BISA, bukan berarti Anda HARUS. Kinerja Anda mungkin lebih baik membiarkannya seperti yang Anda miliki--jalankan beberapa tes. Hanya Anda yang tahu volume data dan frekuensi pemrosesan. Anda juga perlu mempertimbangkan pemeliharaan kode Anda, karena orang berikutnya harus mencari tahu apa yang terjadi di sini.