我有一个名为Active的字段的Oracle表.此字段具有唯一约束,因此只有一行将标记为"活动".
在添加新行或更新旧行时,数据库层中是否有任何方法只保留一行?
例
表的现状
ID Active
----------------
1 yes
Run Code Online (Sandbox Code Playgroud)
添加了一个新的活动行:
新表的状态
ID Active
----------------
1 No
2 Yes
Run Code Online (Sandbox Code Playgroud)
第1行使用Active = Yes进行更新
ID Active
----------------
1 Yes
2 No
Run Code Online (Sandbox Code Playgroud)
当然,当插入新行时,我无法使用触发器更新表.
有没有人知道如何做到这一点?
您需要使用有效值作为输入参数来调用此过程
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;
Run Code Online (Sandbox Code Playgroud)
您需要像这样调用您的过程,如下所示:
开始
set_tab
(
p_id =>2
,p_active_flag =>'Yes'
,p_dml_type =>'INSERT'
);
end;
/
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
628 次 |
最近记录: |