【问题标题】:Where is the error in my Triggers [closed]我的触发器中的错误在哪里[关闭]
【发布时间】:2018-04-23 00:50:29
【问题描述】:

嘿,我已经看了好几个小时了,有人可以帮我吗? 这些触发器显然适用于数据库。我确保所有这些表都存在。S

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;

【问题讨论】:

  • 你在使用什么 rdbms?
  • 我们正在与 Oracle 和 sql developer 合作
  • 你得到的错误是什么?
  • 有什么问题?您在互联网上请一群陌生人花时间帮助您:您至少可以花一些时间来提出一个体面的问题。

标签: oracle plsql database-trigger


【解决方案1】:

您的声明语句必须在开始之前出现,并且“set”是 SQL*Server 构造,而不是 Oracle。您所有的“新”都应以冒号 (:) 为前缀;

附加注释: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;

【讨论】:

  • 不应该对PLZ 变量的赋值类似于select plz into plz from ... 吗?
  • 感谢您的帮助,它必须从...中选择 plz 到 plz 中。如果 bestellungen.datum = getdate 不起作用,但其他一切正常
  • 您的 IF 语句失败有两个原因。
  • 您的 IF 语句失败有两个原因。首先, getdate 不是 Oracle 函数(至少是 Oracle 提供的)。其次,对 datum 的引用应该是 :new.datum 而不是 table.column 名称。还要记住,Oracle 日期包含日期和时间。如果您只想要日期,请使用 trunc。所以试试: if trunc(:new.datum) = trunc(sysdate)
  • plz := (SELECT plz FROM plzverzeichnis WHERE ort = :new.ort); 你不能分配这样的变量。您必须使用into 子句。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-29
  • 2017-10-23
  • 2017-09-06
  • 2011-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多