我的触发器中的错误在哪里

时间:2017-11-09 21:26:28

标签: oracle plsql database-trigger

嘿我现在看这个触发器几个小时,有人可以帮助我吗? 这些触发器适用于数据库。我确保所有这些表都存在。

create or replace TRIGGER postleizahl_check
 BEFORE  
 INSERT  or  UPDATE   on  Kunden
 FOR EACH ROW


BEGIN
DECLARE PLZ varchar(5) ;
SET PLZ := (Select PLZ from PLZVERZEICHNIS where Ort = new.Ort) ;
if :new.Postleitzahl = PLZ then 
INSERT INTO Kunden (KUNDEN_NUMMER,NACHNAME, VORNAME, STRAßE , POSTLEITZAHL, HAUSNUMMER,ORT )
VALUES (new.KUNDEN_NUMMER,new.NACHNAME,new.VORNAME, new.STRAßE ,new.POSTLEITZAHL, new.HAUSNUMMER,new.ORT ); 
else 
 RAISE_APPLICATION_ERROR 
           (-20001, 'PLZ Exestiert nicht. ');
end if ;

end;


CREATE OR REPLACE TRIGGER nachbestellen
AFTER INSERT ON Bestellungen
For Each Row
BEGIN
if Bestellungen.Datum = GETDATE THEN 
INSERT INTO LIEFERANTENBESTELLUNG(Artikel_Nummer,LIEFERANTEN_NUMMER,DATUM,Artikel_Name)
VALUES(new.Artikel_Nummer,new.Artikel_Namen,new.DATUM,new.LIEFERANTEN_NUMMER);
END IF ;
END;

1 个答案:

答案 0 :(得分:1)

你的声明语句必须在你的开始之前,而'set'是一个SQL * Server结构,而不是Oracle。所有'new'都应该以冒号(:)作为前缀;

附加注释:varchar是一种有效类型,但在Oracle中,您应该使用varchar2。目前它们在Oracle中的工作方式相同,但Oracle保留将来更改它的权利,最有可能符合varchar的ANSI标准。

CREATE OR REPLACE TRIGGER postleizahl_check
    BEFORE INSERT OR UPDATE
    ON kunden
    FOR EACH ROW
DECLARE
    plz   VARCHAR (5);
BEGIN
    plz   := (SELECT plz
                FROM plzverzeichnis
               WHERE ort = :new.ort);

    IF :new.postleitzahl = plz
    THEN
        INSERT INTO kunden (
                   kunden_nummer, nachname, vorname
                 , straße, postleitzahl, hausnummer
                 , ort
                    )
             VALUES (
                        :new.kunden_nummer, :new.nachname, :new.vorname
                      , :new.straße, :new.postleitzahl, :new.hausnummer
                      , :new.ort
                    );
    ELSE
        raise_application_error (-20001, 'PLZ Exestiert nicht. ');
    END IF;
END;

CREATE OR REPLACE TRIGGER nachbestellen
    AFTER INSERT
    ON bestellungen
    FOR EACH ROW
BEGIN
    IF bestellungen.datum = getdate
    THEN
        INSERT INTO lieferantenbestellung (
                   artikel_nummer, lieferanten_nummer, datum
                 , artikel_name
                    )
             VALUES (
                        :new.artikel_nummer, :new.artikel_namen, :new.datum
                      , :new.lieferanten_nummer
                    );
    END IF;
END;