2013-03-22 3 views
1

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

OPEN projMgrsCursor; 
     LOOP 
     FETCH projMgrsCursor INTO projMgr; 
     select micl_sup_id_seq.nextval into SUPID from dual; 
     insert into MICL_SUP VALUES ((SUPID), (SELECT SYSDATE FROM DUAL),        :NEW.ENTRYADDEDBY_EMP_NO, 3000, 0,projMgr, NULL,:NEW.EMP_NO); 
     END LOOP;  

     CLOSE projMgrsCursor; 

Это структура таблицы. Sup_ID первичный и уникальный ключ. Я не могу делать какие-либо смены в структуре таблицы

SUP_ID -primary key    
ASSIGNED_DATE    
ASSIGNED_BY_EMP_NO   
AMOUNT_LIMIT    
IS_OVVERRIDDEN  
SUP_EMP_NO   
RTD_EMP  
EMP_NO 

Чтобы ввести sup_ID я использую select micl_sup_id_seq.nextval into SUPID from dual; , но когда я запускаю этот код есть ошибка "RA-00001: unique constraint violated" (это не ошибка компиляции) Есть ли другой способ добавить sup_ID ?? где я ошибся? Просьба помочь мне Im собираюсь потерять свою работу из-за этот триггер и Im новичок спасибо заранее Экстренной помощи необходимой этого вопрос связан с этим триггером PlSQL trigger error ORA-0000 ORA-06512:

+0

Вы можете просто дать 'вставьте в MICL_SUP VALUES ((micl_sup_id_seq.nextval), (SELECT SYSDATE FROM DUAL), ...' в самой петле. Нет необходимости в отдельной переменной. – Rachcha

+0

nothar ошибка компиляции PL/SQL: заявление SQL игнорируется PL/SQL: ORA-00933: команда SQL не выполнена должным образом – cHaNkX

+0

вы уверены, что в таблице нет другого уникального поля? – Sebas

ответ

2

Почему не включая расчет micl_sup_id_seq.nextval в курсор?

cursor projMgrsCursor is 
    select b.BU_MEMBER_ID, micl_sup_id_seq.nextval SUPID 
    from ... 
+0

no can not do like that спасибо q – cHaNkX

0

Попробуйте переписывать код, как:

DECLARE 
    nSupid NUMBER; 
    projMgr VARCHAR2(32767); 
BEGIN 
    OPEN projMgrsCursor; 

    LOOP 
    FETCH projMgrsCursor INTO projMgr; 
    EXIT WHEN projMgrsCursor%NOTFOUND; 

    select micl_sup_id_seq.nextval into nSUPID from dual; 

    insert into MICL_SUP 
     (SUPID, ASSIGNED_DATE, ASSIGNED_BY_EMP_NO, AMOUNT_LIMIT, 
     IS_OVERRIDDEN, SUP_EMP_NO, RTD_EMP, EMP_NO) 
    VALUES 
     (nSupid, SYSDATE, :NEW.ENTRYADDEDBY_EMP_NO, 3000, 
     0,    projMgr, NULL, :NEW.EMP_NO); 
    END LOOP;  

    CLOSE projMgrsCursor; 

    DBMS_OUTPUT.PUT_LINE('Successful completion'); 
EXCEPTION 
    WHEN OTHERS THEN 
    DBMS_OUTPUT.PUT_LINE('Exception: ' || SQLCODE || ' ' || SQLERRM); 
    RAISE; 
END; 

Делите и наслаждайтесь.

+0

спасибо, но его не работает :( – cHaNkX

+0

ОК - я добавил «DBMS_OUTPUT.PUT_LINE» в конце кода, чтобы указать успешное завершение, и добавил блок обработчика исключений для отчета если какие-то исключения брошены. Попробуйте добавить их к своему коду и посмотреть, что распечатывает. –

+0

Я добавил его, но не использовал :) в любом случае спасибо – cHaNkX