是否可以在合并的 when-not-matched-then 子句中报告错误(引发异常或其他任何内容)?我的目标是像
WHEN NOT MATCHED THEN RAISE NO_DATA_FOUND;
Run Code Online (Sandbox Code Playgroud)
或者任何会告诉调用者脚本失败的东西。
您可以使用触发器执行此操作。
注意:这太可怕了,但我想不出另一种方法来实现这一点。
测试表:
create table testmerge
(
col1 number primary key ,
col2 number
);
insert into testmerge values ( 1, 1 );
create table testmerge2
(
col1 number primary key,
col2 number
);
insert into testmerge2 values ( 2, 2 );
Run Code Online (Sandbox Code Playgroud)
在合并表上触发:
create or replace trigger testmergeerror_btrig
before insert on testmerge
for each row
begin
if :new.col1 = -99999999999 and :new.col2 = -99999999999
then
raise_application_error(-20000,'Your error message');
end if;
end;
/
Run Code Online (Sandbox Code Playgroud)
合并:
MERGE INTO testmerge t1
USING testmerge2 t2
ON (t1.col1 = t2.col1)
WHEN MATCHED THEN
UPDATE SET t1.col2 = t2.col2
WHEN NOT MATCHED THEN
insert(col1,col2) values (-99999999999,-99999999999);
Run Code Online (Sandbox Code Playgroud)
基本上,当一行不匹配时,我们设置一些值(您的应用程序永远不会使用,是的,我知道这是一种可怕的方式!)在INSERT
触发器中寻找,然后触发错误。
测试用例:
SQL> MERGE INTO testmerge t1
2 USING testmerge2 t2
3 ON (t1.col1 = t2.col1)
4 WHEN MATCHED THEN
5 UPDATE SET t1.col2 = t2.col2
6 WHEN NOT MATCHED THEN
7 insert(col1,col2) values (-99999999999,-99999999999);
USING testmerge2 t2
*
ERROR at line 2:
ORA-20000: Your error message
ORA-06512: at "PHIL.TESTMERGEERROR_BTRIG", line 4
ORA-04088: error during execution of trigger 'PHIL.TESTMERGEERROR_BTRIG'
SQL>
Run Code Online (Sandbox Code Playgroud)