Bạn có thể thử cái này
1 MERGE
2 INTO target_table tgt
3 USING source_table src
4 ON ( src.object_id = tgt.object_id )
5 WHEN MATCHED
6 THEN
7 UPDATE
8 SET tgt.object_name = src.object_name
9 , tgt.object_type = src.object_type
10 WHEN NOT MATCHED
11 THEN
12 INSERT ( tgt.object_id
13 , tgt.object_name
14 , tgt.object_type )
15 VALUES ( src.object_id
16 , src.object_name
17 , src.object_type );
Cú pháp thoạt nhìn có vẻ hơi khó khăn nhưng nếu chúng ta đọc từ trên xuống dưới thì sẽ thấy nó khá trực quan. Lưu ý các điều khoản sau:
• MERGE (dòng 1):như đã nêu trước đây, đây là câu lệnh DML thứ 4 trong Oracle. Bất kỳ gợi ý nào mà chúng tôi có thể muốn thêm trực tiếp theo từ khóa này (tức là MERGE / * + HINT * /);
• INTO (dòng 2):đây là cách chúng tôi chỉ định mục tiêu cho MERGE. Đích phải là một bảng hoặc một chế độ xem có thể cập nhật (không thể sử dụng chế độ xem trong dòng ở đây);
• USING (dòng 3):mệnh đề USING đại diện cho tập dữ liệu nguồn cho MERGE. Đây có thể là một bảng duy nhất (như trong ví dụ của chúng tôi) hoặc một chế độ xem trong dòng;
• ON () (dòng 4):mệnh đề ON là nơi chúng ta cung cấp phép nối giữa tập dữ liệu nguồn và bảng đích. Lưu ý rằng các điều kiện kết hợp phải nằm trong dấu ngoặc đơn;
• WHEN MATCHED (dòng 5):mệnh đề này là nơi chúng tôi hướng dẫn Oracle phải làm gì khi chúng tôi đã có một bản ghi phù hợp trong bảng đích (tức là có một kết nối giữa tập dữ liệu nguồn và đích). Chúng tôi rõ ràng muốn CẬP NHẬT trong trường hợp này. Một trong những hạn chế của điều khoản này là chúng ta không thể cập nhật bất kỳ cột nào được sử dụng trong mệnh đề BẬT (mặc dù tất nhiên chúng ta không cần phải làm như vậy vì chúng đã khớp). Bất kỳ nỗ lực nào để bao gồm một cột tham gia sẽ tạo ra một ngoại lệ không hợp lệ không trực quan; và
• KHI KHÔNG ĐƯỢC KẾT HỢP (dòng 10):điều khoản này là nơi chúng tôi CHÈN các bản ghi mà không có kết quả phù hợp hiện tại.