2015-04-02 196 views
-2

我通过从CURSOR中选择数据插入到表中,但我得到一个唯一的约束违规。 下面是该查询:唯一约束(SchemaName.DATA1_PK)

CURSOR cRestParmRestData(nSetId in number) IS 
    SELECT distinct rstdata.rest_id, 
      rstdata.rest_inst_id, 
      rstdata.pren_set_id, 
      rstdata.cusm_set_id, 
      rstdata.asn_set_typ, 
      rstdata.mkt_id, 
      rstdata.crte_ts, 
      rstdata.crte_user_id 
     FROM stg_rfm2_rest_data rstdata, 
      stg_rfm2_rest rest, 
      stg_rfm2_sets srs, 
      stg_rfm2_dset srd 
    WHERE (
       rest.rest_id = rstdata.rest_id 
       AND rest.rest_inst_id = rstdata.rest_inst_id 
       AND rstdata.stg_restaurant_id = rest.stg_restaurant_id 
      ) 
     and srs.set_id = rstdata.cusm_set_id 
     and srd.set_id = srs.set_id 
     and rstdata.cusm_set_id = nSetId 
     and srs.typ = nCustomParmSetTyp; 





     IF (rcRestSets.sets_typ IN (nCustomParmSetTyp)) THEN 
     BEGIN 
      vBlockDescription := 'INSERT INTO rest_data for setId:'||rcRestSets.sets_set_id; 
     for rcRstData in cRestParmRestData(nSetId => rcRestSets.sets_set_id) loop 
      INSERT INTO rest_data 
      (rest_id, 
      rest_inst_id, 
      pren_set_id, 
      cusm_set_id, 
      asn_set_typ, 
      mkt_id, 
      crte_ts, 
      crte_user_id) 

      VALUES 
      (rcRstData.rest_id, 
      rcRstData.rest_inst_id, 
      rcRstData.pren_set_id, 
      rcRstData.cusm_set_id, 
      rcRstData.asn_set_typ, 
      rcRstData.mkt_id, 
      sysdate, 
      rcRstData.crte_user_id); 
     END LOOP; 
     EXCEPTION 
     WHEN OTHERS THEN 
     nTemp := pkg_misc.fn_insertLogDetail(nLogId, 'Parameter Set', vBlockDescription, null, null,TO_CHAR(SQLCODE)||' , '||'Error '||dbms_utility.format_error_backtrace, SUBSTR(SQLERRM,1,500)||'sets_crtr_node_id =>'||rcRestSets.sets_crtr_node_id); 
      vLogStus :=1; 
     END; 

     end if; 

我不知道我做错了,我得到异常

“ORA-00001:唯一约束(EU3MARKETS.REST_DATA_PK)violatedsets_crtr_node_id => 326” -at错误ORA-06512:在EU3MARKETS.PKG_LOADRFM2RESTAURANTDB,线983(INSERT INTO REST_DATA线)

回答

0

要插入的ID值,其是主键中的一个,不允许重复的值。检查数据库中的主键值并插入唯一的ID。

0

该问题似乎是由于您正在从rest_data表中选择数据(包括您的pk列),然后尝试将它们重新插入到同一个表中。由于您没有更改pk列中的值,因此您基本上正在尝试创建重复行,这种约束被禁止。

你究竟在做什么,为什么?

另外,当你可以做一套基于集合的insert into ... select ...方法时,你为什么要采用程序/逐行方法?这将更快,更容易维护!

+0

我收集从表“stg_rfm2_rest”,“stg_rfm2_rest_data”等数据转换成光标和使用该光标插入另一个表中数据“” rest_data“ – 2015-04-02 09:17:30

+0

阿右,对不起,我误读了'stg_rfm2_'如' stg_rfm2.' Duh!在这种情况下,您仍然选择在rest_data表中已经存在的pk列中具有值的行,您需要跳过这些行或找到另一种使它们唯一的方法。 – Boneist 2015-04-02 09:29:42