首页 > 解决方案 > 我如何知道 MERGE 语句 (ORACLE) 执行了什么操作?

问题描述

有没有办法找出 ORACLE 过程中的 MERGE 语句执行了什么操作?

例如,如果我需要根据执行的操作(INSERT 或 UPDATE)随后执行不同的过程

ps忘了澄清,我正在考虑MERGE语句只处理一行的情况

标签: sqloracle

解决方案


不修改表格,很难捕捉到已经做了什么。有一些解决方案可以在 MERGE 语句中添加一个 PL/SQL 层来强制为每一行执行 PL/SQL 函数,但这会损害性能。

如果你真的需要它,可以添加一个额外的列,例如

SQL> create table t as select empno, ename, sal, ' '  tag from scott.emp where empno != 7934;

Table created.

SQL> create table t1 as select empno, ename, sal*5 sal from scott.emp where job = 'CLERK';

Table created.

SQL>
SQL> select * from t;

     EMPNO ENAME             SAL T
---------- ---------- ---------- -
      7369 SMITH             800
      7499 ALLEN            1600
      7521 WARD             1250
      7566 JONES            2975
      7654 MARTIN           1250
      7698 BLAKE            2850
      7782 CLARK            2450
      7788 SCOTT            3000
      7839 KING             5000
      7844 TURNER           1500
      7876 ADAMS            1100
      7900 JAMES             950
      7902 FORD             3000

13 rows selected.

SQL> select * from t1;

     EMPNO ENAME             SAL
---------- ---------- ----------
      7369 SMITH            4000
      7876 ADAMS            5500
      7900 JAMES            4750
      7934 MILLER           6500

SQL>
SQL> merge into t
  2  using ( select * from t1) t1
  3  on ( t.empno = t1.empno )
  4  when matched then
  5    update
  6    set t.sal = t1.sal, t.tag = 'U'
  7  when not matched then
  8    insert (t.empno,t.ename,t.sal,t.tag)
  9    values (t1.empno,t1.ename,t1.sal,'I');

4 rows merged.

SQL>
SQL> select * from t;

     EMPNO ENAME             SAL T
---------- ---------- ---------- -
      7369 SMITH            4000 U
      7499 ALLEN            1600
      7521 WARD             1250
      7566 JONES            2975
      7654 MARTIN           1250
      7698 BLAKE            2850
      7782 CLARK            2450
      7788 SCOTT            3000
      7839 KING             5000
      7844 TURNER           1500
      7876 ADAMS            5500 U
      7900 JAMES            4750 U
      7902 FORD             3000
      7934 MILLER           6500 I

14 rows selected.

我刚刚使用了 U/I,但此列可能是(例如)一个数字字段或类似的字段,以随着时间的推移处理多个 MERGE。

但是大多数人沿着这条路线前进,通常最终使用单独的 INSERT 和 UPDATE 块


推荐阅读