2013-03-15 2 views
0

Привет Я новичок в PLSQL это первый раз я использую PLSQLКак я могу использовать PL/SQL курсор для петли для триггера

Я создал триггер с помощью PLSQL. Вот синтаксис, который я использую для создания этого триггера. но он дает ошибку как «[Err] ORA-24344: success with compilation error« Я не могу понять, где я ошибся. В этом триггере я использую цикл for с курсором. Я думаю, что что-то не так с этим курсором. Кто-нибудь может мне помочь выяснить, где я ошибся. Я использую Navicat для этого. Я боролся с этим в течение почти 5 дней :(заранее спасибо

CREATE OR REPLACE TRIGGER "c" AFTER INSERT ON "EMP_REPORT_TO" REFERENCING OLD AS "OLD" NEW AS "NEW" FOR EACH ROW 
DECLARE 

miclaim_supervisor_count number; 
employee_company_code number; 
employee_businessunit number; 

cursor projMgrsCursor is select b.BU_MEMBER_ID 
from BU_MEMBER b, EMP_SUB_DIV s 
where s.EMP_NO = :NEW.EMP_NO 
and s.SUB_DIVISION_CODE = '02' and s.DIV_CODE = '041' 
and b.BU_ID IN (select BU_ID from BU_MEMBER where BU_MEMBER_ID = :NEW.EMP_NO); 


BEGIN 
     delete from MICL_SUPERVISORS where EMP_NO = :NEW.EMP_NO and IS_OVVERRIDDEN = 0; 
     select count(*) into miclaim_supervisor_count from MICL_SUPERVISORS where EMP_NO = :NEW.EMP_NO and IS_OVVERRIDDEN = 1; 
     select COMPANY_CODE into employee_company_code from EMPLOYEE_MASTER where EMP_NO = :NEW.EMP_NO; 


if (employee_company_code = 'SOFT')then 

      OPEN projMgrsCursor; 

      FOR projMgrsCursor IN projMgrs 
      LOOP     
      insert into MICL_SUPERVISORS VALUES ((:NEW.ID), (SELECT SYSDATE FROM DUAL), :NEW.ENTRYADDEDBY_EMP_NO, 3000, 0, projMgrEmpNo, NULL,:NEW.EMP_NO); 
      END LOOP; 
     close projMgrsCursor; 

else 
      if(miclaim_supervisor_count IS NULL or miclaim_supervisor_count<1) then 
       insert into MICL_SUPERVISORS VALUES ((:NEW.ID), (SELECT SYSDATE `enter code here`FROM DUAL), :NEW.ENTRYADDEDBY_EMP_NO, 3000, 0, :NEW.SUP_EMP_NO, NULL,:NEW.EMP_NO); 
      end if; 
end if; 


END; 
; 
+0

Объявления переменных типов данных должно быть основано на типах столбцов - например. "employee_company_code emplyee_master.company_code% type;". Файл miclaim_supervisor_count может быть pls_integer. –

+0

miclaim_supervisor_count никогда не будет равно null, поскольку count (*) не возвращает null. Если вас интересует только то, существуют ли какие-либо записи, тогда поместите запрос rownum = 1. –

ответ

0

Спасибо за все? ур ответы и время :)

хорошо я понял, куда я пошел неправильно благодаря оракула разработчика SQL на самом деле что-то не так с петлей для

здесь код (исправленный код для цикла)

OPEN projMgrsCursor; 

    LOOP 
    FETCH projMgrsCursor INTO projMgrs; 
    EXIT WHEN projMgrsCursor%NOTFOUND; 
    insert into 
MICL_SUPERVISORS VALUES ((:NEW.ID), (SELECT SYSDATE FROM DUAL), :NEW.ENTRYADDEDBY_EMP_NO, 3000, 0,projMgrs, NULL,:NEW.EMP_NO); 
    END LOOP; 

    CLOSE projMgrsCursor; 

Надеется, что это поможет кому-либо, как я :)

0

Нет необходимости курсором вообще - почему бы не просто использовать SQL заявление, чтобы выполнить вставку