oracle在插入表之前检查重复值
我有两个函数在插入表之前检查重复值,但我不知道哪种方法更有效 第一种方法:oracle在插入表之前检查重复值,oracle,plsql,insert,Oracle,Plsql,Insert,我有两个函数在插入表之前检查重复值,但我不知道哪种方法更有效 第一种方法: select count(*) into ln_rec_cnt from ieexco_tbl t where t.ieexco_dept_code = p_dept and NVL(t.IEEXCO_SEQ, '|') = NVL(p_indx, '|') if ln_rec_cnt > 0 then raise_application_erro
select count(*)
into ln_rec_cnt
from ieexco_tbl t
where t.ieexco_dept_code = p_dept
and NVL(t.IEEXCO_SEQ, '|') = NVL(p_indx, '|')
if ln_rec_cnt > 0 then
raise_application_error(-20001, 'Save coordinator record repeatedly');
end if;
第二种方法:
insert into ieexco_tbl t
(IEEXCO_DEPT_CODE,
IEEXCO_SEQ,
IEEXCO_NAME,
IEEXCO_PHONE,
IEEXCO_EMAIL,
IEEXCO_CREATE_DATE,
IEEXCO_OPR_PIDM)
select
p_dept,
p_indx(i),
p_name(i),
p_tel(i),
p_email(i),
sysdate,
p_opr_pidm
from dual
where not exists(SELECT 1
FROM ieexco_tbl
WHERE IEEXCO_DEPT_CODE = p_dept
and NVL(IEEXCO_SEQ,'|')= NVL(p_indx(i),'|'));
第二种方法非常快
INSERT...
SELECT
Column_Name
FROM dual WHERE NOT EXISTS (SELECT 1 FROM ..)
另外,请检查唯一键的结构。
执行插入,并响应(忽略)DUP_VAL_ON_索引异常
这在并发方面是最安全的,因为如果其他人已完成插入但未提交,则插入将等待锁定的记录,然后在其他事务提交时出错(或在其他事务回滚时成功)。为什么不对(IEEXCO\ SEQ,IEEXCO\ DEPT\ CODE)设置唯一约束。这样,无论何时插入,对于任何重复记录,插入都将失败。您不必编写额外的条件或查询来检查它。问题是为什么要一次插入一行?看起来您正在使用一个记录集合,并比较要插入的每个记录。为什么不对所有记录执行单次插入到,并使用约束和异常对其进行管理?这是正确的方法,但要求表在IEEXCO_SEQ上声明唯一约束。