sql - 我如何知道 MERGE 语句 (ORACLE) 执行了什么操作?
问题描述
有没有办法找出 ORACLE 过程中的 MERGE 语句执行了什么操作?
例如,如果我需要根据执行的操作(INSERT 或 UPDATE)随后执行不同的过程
ps忘了澄清,我正在考虑MERGE语句只处理一行的情况
解决方案
不修改表格,很难捕捉到已经做了什么。有一些解决方案可以在 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 块
推荐阅读
- java - JavaEE 全局捕获运行时异常
- angular - Angular:为什么带有 QueryList 的 ViewChild 只返回第一个实例?
- java - 将两个对象相乘
- ruby-on-rails - 如果定义了变量,则设置变量,如果未定义,则设置 null
- javascript - 在反应代码中调用 .getElementById 后返回 Null
- java - 如何使用 Java 中的 Stanford CoreNLP 提取普通和复杂句子或句子文档(主语、宾语和谓语)的三元组?
- symfony - 无法将 symfony/security 从 4.4.1 更新到 5.0.1
- javascript - HTML 元素没有正确调整大小 - 间距?
- google-oauth - 使用 GoogleWebAuthorizationBroker.AuthorizeAsync 时,用户可以点击错误的电子邮件地址
- javascript - 使用三元运算符消除重复显示的可能性