我有一个Oracle表,其中包含名为 Active 的字段。 此字段具有唯一约束,因此只有一行将标记为“活动”。
数据库层中是否有任何方法在添加新行或更新旧行时只保留一行?
示例
表的当前状态
ID Active
----------------
1 yes
添加了一个新的活动行:
表格的新状态
ID Active
----------------
1 No
2 Yes
第1行更新为Active = Yes
ID Active
----------------
1 Yes
2 No
当插入新行时,我无法使用触发器更新表格。
有没有人知道如何做到这一点?
答案 0 :(得分:3)
您需要使用有效值作为输入参数
来调用此过程CREATE OR REPLACE PROCEDURE t416493.set_tab
(
p_id IN tab.id%TYPE
,p_active_flag IN tab.active%TYPE
,p_dml_type IN VARCHAR2
)
IS
CURSOR check_flag_exists
IS
SELECT id
FROM tab
WHERE active = p_active_flag;
v_id tab.id%TYPE;
v_active_flag VARCHAR2(3);
BEGIN
OPEN check_flag_exists;
FETCH check_flag_exists INTO v_id;
IF check_flag_exists%FOUND THEN
IF p_active_flag ='Yes' THEN
v_active_flag :='No';
ELSE
v_active_flag :='Yes';
END IF;
UPDATE tab
SET active = v_active_flag
WHERE id =v_id;
END IF;
CLOSE check_flag_exists;
IF p_dml_type ='INSERT' THEN
INSERT INTO tab
(id
,active
)
VALUES
(p_id
,p_active_flag
);
ELSIF p_dml_type ='UPDATE' THEN
UPDATE tab
SET active =p_active_flag
WHERE id =v_id;
END IF;
END set_tab;
你需要像下面这样调用你的proc:
开始
set_tab
(
p_id =>2
,p_active_flag =>'Yes'
,p_dml_type =>'INSERT'
);
end;
/