我有两个函数可以在插入表之前检查重复值,但是我不知道哪种方法更有效?
第一种方法:
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),'|'));
答案 0 :(得分:2)
都不是。 执行插入操作,并响应(忽略)DUP_VAL_ON_INDEX异常。
在并发方面,这是最安全的方法,就像其他人已完成插入但未提交一样,插入将在锁定的记录上等待,然后在其他事务提交时出错(如果其他事务回滚则成功)。
答案 1 :(得分:-3)
第二种方法很快
INSERT...
SELECT
Column_Name
FROM dual WHERE NOT EXISTS (SELECT 1 FROM ..)
还要检查unique key