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上声明唯一约束。