我有一个名为Active的字段的Oracle表.
此字段具有唯一约束,因此只有一行将标记为“活动”.
此字段具有唯一约束,因此只有一行将标记为“活动”.
在添加新行或更新旧行时,数据库层中是否有任何方法只保留一行?
例
表的现状
ID Active ---------------- 1 yes
添加了一个新的活动行:
新表的状态
ID Active ---------------- 1 No 2 Yes
第1行使用Active = Yes进行更新
ID Active ---------------- 1 Yes 2 No
当然,当插入新行时,我无法使用触发器更新表.
有没有人知道如何做到这一点?
您需要使用有效值作为输入参数来调用此过程
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; /