2015-04-02 2 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" -при Ошибка ORA-06512: на EU3MARKETS.PKG_LOADRFM2RESTAURANTDB, линии 983 (INSERT INTO REST_DATA Line)

ответ

0

Вы вставляете один из значений идентификаторов, который является первичным ключом, не позволяет повторяющиеся значения. Проверьте значение первичного ключа в базе данных и вставьте уникальный идентификатор.

0

Проблема заключается в том, что вы выбираете данные (включая столбцы pk) из вашей таблицы rest_data, а затем пытаетесь повторно вставить их обратно в одну и ту же таблицу. Поскольку вы не изменили значения в столбцах pk, вы по существу пытаетесь создать повторяющиеся строки, которые запрещает ограничение.

Что именно вы пытаетесь сделать и почему?

Кроме того, почему вы принимаете процедурный/строчный подход, когда вы можете использовать подход insert into ... select ... на основе набора? Это будет намного быстрее и проще в обслуживании!

+0

Я собираю данные из таблиц 'stg_rfm2_rest', 'stg_rfm2_rest_data' и т. Д. В CURSOR и используя этот КУРСОР для вставки данных в другую таблицу '' rest_data ' –

+0

Ах, извините, я неправильно читаю 'stg_rfm2_' как' stg_rfm2.' Duh! В этом случае вы по-прежнему выбираете строки, которые имеют значения в столбцах pk, которые уже существуют в таблице rest_data. Вам нужно либо пропустить эти строки, либо найти другой способ сделать их уникальными. – Boneist

Смежные вопросы