Allt du behöver är SAMMANSLUTNING påstående. Båda dina krav kan göras på en gång.
Syntaxen är -
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);
Uppdatera Exempel för att visa USING-satsen för procedurparametrar
USING(
SELECT
p_HEAD_MARK hm,
p_PROJECT_NAME pn,
p_COLI_NUM cn,
p_ONSITE_UPD_QTY ouq
FROM DUAL) s
Använd dessa som s.hm, s.pn, s.cn, s.ouq
Uppdatering 2 Ett komplett testfall
Låt oss säga att jag har en tabell emp1
utan rader. Jag skapar en procedur som tar ename
som INPUT, som jag kommer att använda för att infoga i emp
tabell med 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>
Låt oss se om värdet har infogats.
SQL> SELECT ename FROM emp1;
ENAME
----------
SCOTT
SQL>