Tất cả những gì bạn cần là MERGE bản tường trình. Cả hai yêu cầu của bạn đều có thể được thực hiện cùng một lúc.
Cú pháp là -
MERGE INTO table_a a
USING table_b b
ON (a.column= b.column)
WHEN MATCHED THEN
UPDATE SET a.column= b.column
WHEN NOT MATCHED THEN
INSERT (column1, column2)
VALUES (b.val1, b.val2);
Cập nhật Ví dụ để hiển thị mệnh đề USING cho các tham số thủ tục
USING(
SELECT
p_HEAD_MARK hm,
p_PROJECT_NAME pn,
p_COLI_NUM cn,
p_ONSITE_UPD_QTY ouq
FROM DUAL) s
Sử dụng chúng dưới dạng s.hm, s.pn, s.cn, s.ouq
Cập nhật 2 Một trường hợp thử nghiệm hoàn chỉnh
Giả sử tôi có một bảng emp1
không có hàng. Tôi tạo một thủ tục lấy ename
dưới dạng INPUT, mà tôi sẽ sử dụng để chèn vào emp
bảng sử dụng MERGE .
SQL> SELECT * FROM emp1;
no rows selected
SQL>
SQL> CREATE OR REPLACE
2 PROCEDURE p(
3 p_ename IN VARCHAR2)
4 AS
5 BEGIN
6 MERGE INTO emp1 e USING
7 (SELECT p_ename AS ename FROM dual
8 ) s ON(e.ename = s.ename)
9 WHEN MATCHED THEN
10 UPDATE SET e.empno = 100 WHEN NOT MATCHED THEN
11 INSERT
12 (ename
13 ) VALUES
14 (s.ename
15 );
16 END;
17 /
Procedure created.
SQL>
SQL> sho err
No errors.
SQL>
SQL> BEGIN
2 p('SCOTT');
3 END;
4 /
PL/SQL procedure successfully completed.
SQL>
Hãy xem liệu giá trị có được chèn không.
SQL> SELECT ename FROM emp1;
ENAME
----------
SCOTT
SQL>