(LƯU Ý:mã này chưa được kiểm tra và tôi có thể viết tắt dấu phẩy ở đây hoặc dấu ngoặc đơn ở đó ...)
Hai khối đó dường như chỉ khác nhau trong cột hành động và một phép nối, vì vậy bạn có thể loại bỏ 2 chân IF và chuyển việc kiểm tra p_update_mode thành một câu lệnh CASE như sau:
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;
Truy vấn trong khối FULL của bạn cho biết chúng ta không nên tham gia với B trong chế độ này. Vì vậy, mệnh đề LEFT JOIN chỉ trả về các hàng khi ở chế độ INCREMENTAL, nhưng sẽ không tạo ra hàng nào cho chế độ FULL.
Đây cần phải là kết hợp TRÁI hoặc chúng tôi có thể không nhận được bất kỳ hàng nào từ data_view của bạn không tương ứng với các thực thể trong B cho chế độ ĐẦY ĐỦ. Nói cách khác, nếu đây vẫn là một JOIN thông thường, truy vấn tổng thể của bạn sẽ không có hàng nào ở chế độ ĐẦY ĐỦ do mệnh đề AND trong phép nối.
Cuối cùng, bộ lọc VÀ trong mệnh đề WHERE ở dưới cùng trở nên cần thiết vì bây giờ có THAM GIA TRÁI. Nếu không có điều này, khi chạy ở chế độ INCREMENTAL, bạn sẽ nhận được MỌI hàng trong data_view REGARDLESS của bạn về việc có một hàng thực thể tương ứng ở B hay không. Ngay cả khi bạn đang tham gia trên entity_id, phép nối bên trái sẽ đưa một hàng trở lại cho mỗi hàng trong T ngay cả khi không có hàng phù hợp trong B, bởi vì đó là những gì LEFT JOIN được thiết kế để làm.
Tất cả những gì đã nói, bạn sẽ phải quyết định xem liệu nó có đáng để trộn hai khối này hay không. Chỉ vì bạn CÓ THỂ, không có nghĩa là bạn NÊN. Hiệu suất của bạn có thể tốt hơn để nó theo cách bạn có - hãy chạy một số bài kiểm tra. Chỉ bạn mới biết khối lượng dữ liệu và tần suất xử lý. Bạn cũng cần xem xét việc duy trì mã của mình, vì anh chàng / cô gái tiếp theo sẽ phải tìm ra điều gì đang xảy ra ở đây.