如果我做对了,您需要检查演示表中的 A、B、C 列中是否存在参数 A、B、C(从 API 接收)的现有组合。参数中可能存在 NULL 值。如果没有这样的组合,您必须插入一条记录。我不知道你如何生成你的 PK(列 DEMO_ID),所以我发明了我自己的。该主键列可以是任何东西。
首先,我创建了包含几行的演示表:
-- DEMO_ID DEMO_A DEMO_B DEMO_C
-- ---------- ---------- ---------- ----------
-- 100123 1 2 3
-- 100023 2 3
-- 100132 1 3 2
-- 100456 4 5 6
-- 100567 5 6 7
-- 100089 8 9
-- 100293 2 9 3
Next - 一个过程 SAVE 来检查是否存在,如果不存在则插入记录。
create or replace PROCEDURE SAVE
( p_demo_a in number,
p_demo_b in number,
p_demo_c in number,
p_demo_id out number
) AS
Status VarChar2(200);
BEGIN
Declare
Begin
Select DEMO_ID
Into p_demo_id
From DEMO
Where Nvl(DEMO_A, 999999999) = Nvl(p_demo_a, 999999999) And
Nvl(DEMO_B, 999999999) = Nvl(p_demo_b, 999999999) And
Nvl(DEMO_C, 999999999) = Nvl(p_demo_c, 999999999);
Status := 'OK - NO INSERT - RECORD EXISTS --> DEMO_ID = ' || p_demo_id;
Exception
WHEN NO_DATA_FOUND THEN
Begin
p_demo_id := 100000 + Nvl(To_Number(To_Char(p_demo_a) || To_Char(p_demo_b) || To_Char(p_demo_c)), 0);
INSERT INTO DEMO (DEMO_ID, DEMO_A, DEMO_B, DEMO_C)
VALUES(p_demo_id, p_demo_a, p_demo_b, p_demo_c);
Commit;
Status := 'OK - RECORD INSERTED --> DEMO_ID = ' || p_demo_id;
Exception
WHEN DUP_VAL_ON_INDEX THEN
p_demo_id := 0;
Status := 'ERR (SAVE) INNER BLOCK - DUP_VAL_ON_INDEX --> DEMO_ID = ' || p_demo_id;
WHEN OTHERS THEN
p_demo_id := 0;
Status := 'ERR (SAVE) INNER BLOCK - OTHERS --> ' || SQLERRM;
End;
WHEN OTHERS THEN
p_demo_id := 0;
Status := 'ERR (SAVE) OUTER BLOCK - OTHERS --> ' || SQLERRM;
End;
DBMS_OUTPUT.PUT_LINE(Status);
END SAVE;
测试 1。
SET SERVEROUTPUT ON
Declare
p_id NUMBER := Null;
Begin
SAVE(7, 6, 9, p_id);
If Nvl(p_id, 0) = 0 Then
DBMS_OUTPUT.PUT_LINE('Something went wrong - check the status');
End If;
End;
--
-- R e s u l t
--
-- anonymous block completed
-- OK - RECORD INSERTED --> DEMO_ID = 100769
测试 2. 具有空值
SET SERVEROUTPUT ON
Declare
p_id NUMBER := Null;
Begin
SAVE(7, Null, 9, p_id);
If Nvl(p_id, 0) = 0 Then
DBMS_OUTPUT.PUT_LINE('Something went wrong - check the status');
End If;
End;
--
-- R e s u l t
--
-- anonymous block completed
-- OK - RECORD INSERTED --> DEMO_ID = 100079
如果你用相同的参数再试一次,结果是:
--
-- R e s u l t
--
-- anonymous block completed
-- OK - NO INSERT - RECORD EXISTS --> DEMO_ID = 100079
使用我的 PK 定义系统,如果您将参数 A、B、C 传递为 Null、8、9 - 由于重复键会出现错误。
--
-- R e s u l t
--
-- anonymous block completed
-- ERR (SAVE) INNER BLOCK - DUP_VAL_ON_INDEX --> DEMO_ID = 0
-- Something went wrong - check the status
但是,如前所述 - 我不知道您如何生成这些代理键。在这种情况下,该键的 A、B、C 组合为 8、null、9 的记录与 null、8、9 不同,但我故意创建了相同的 PK 以显示可能的问题。如果在生成 PK 时有一个独特的数字代替空值(或者,甚至更好的是,一个序列号),那么这里将是一个新的 PK 并且将插入记录。因此,检查空值和插入应该不是问题,但 PK 生成可以。
问候...