2016-04-12 43 views
-3
create or replace trigger fineCalc 
AFTER UPDATE ON book_issue 
for each row 
when ((new.date_of_return-old.date_of_issue)>7) 
declare 
    rcpt_no number; 
    s_id char(10); 
begin 
    if :old.card_id in (select card_id from STUDENT_BOOK_ISSUE) 
    then 
    select max(receipt_no) into rcpt_no from fine; 
    select student_id into s_id from STUDENT_BOOK_ISSUE sbi where sbi.card_id=:old.card_id; 

    insert into fine values(rcpt_no+1,((:NEW.date_of_return-:OLD.date_of_issue-7)*5),s_id); 
    end if; 
end; 

Bu ORA-04079 alır: Apex SQL Atölyesi'nde geçersiz tetik şartname: ORA-04079: geçersiz tetik şartname

Oracle Apex screenshot

bunu nasıl düzeltebilirim?

+0

Bu, PLS-00405 alır: bu bağlamda alt sorguya izin verilmiyor, ORA-04079 değil. "If", [sorgu sonucunu bir değişkene almanız gerekir] (http://stackoverflow.com/a/29134619/266304) 'in bir parçası olarak alt sorgunuz olamaz. Lütfen [İyi bir soru nasıl sorabilirim?] (Http://stackoverflow.com/help/how-to-ask) adresine bakın. Çalıştığınız gerçek kodu ve aldığınız hatayı göstermek iyi bir başlangıç ​​olacaktır. –

+0

ben oracle 11g .... tetikleme işlemi gerçekleştiriyorum oracle SQL Developer iken ORA: 04079 hata gösteriyor Bu PLS-00405: Subquery bu bağlamda izin verilmiyor ..... şimdi ne yapmalıyım –

+0

Hatayla ilgili değil, ancak 'max (receipt_no)' yi kullanmak iyi bir fikir değildir; [bir dizi kullanmak daha iyidir] (http://stackoverflow.com/q/17210835/266304). –

cevap

1

Alex'in önerdiği gibi, dışarıda if koşulunu taşıyıp tekrar deneyin.

create or replace trigger fineCalc 
AFTER UPDATE ON book_issue 
for each row 
when ((new.date_of_return-old.date_of_issue)>7) 
declare 
    rcpt_no number; 
    s_id char(10); 
    v_count number; 
begin 
    select count(*) into v_count from STUDENT_BOOK_ISSUE where card_id=:old.card_id; 
    if v_count > 0 
    then 
    select max(receipt_no) into rcpt_no from fine; 
    select student_id into s_id from STUDENT_BOOK_ISSUE sbi where sbi.card_id=:old.card_id; 
    insert into fine values(rcpt_no+1,((:NEW.date_of_return-:OLD.date_of_issue-7)*5),s_id); 
    end if; 
end; 
+0

stilll aynı hatayı alıyorum .... ORA-04079 oracle 11g üzerinde –

+0

Üzgünüm 'begin' yan tümcesi doğru yerde değildi. Düzeltmek için @alex teşekkürler. @abhishekjadhavpatil - Güncellenmiş olan cevabı deneyin ve tekrar kontrol edin. – Utsav

+0

Bir ekran görüntüsü ekledim ... lütfen bir göz atın ... –