报告合并的 when-not-matched-then 子句中的错误

Hig*_*tor 5 oracle

是否可以在合并的 when-not-matched-then 子句中报告错误(引发异常或其他任何内容)?我的目标是像

WHEN NOT MATCHED THEN RAISE NO_DATA_FOUND;
Run Code Online (Sandbox Code Playgroud)

或者任何会告诉调用者脚本失败的东西。

Phi*_*lᵀᴹ 7

您可以使用触发器执行此操作。

注意:这太可怕了,但我想不出另一种方法来实现这一点。

测试表:

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)