因此,我正在翻译一个mysql触发器以在oracle数据库上运行,但是我卡在一个select上,导致标题中所述的错误。
我尝试了不同的解决方案,但似乎无济于事。
将()添加到语句的每个部分
从表oracle (select * from rezept r, zutat z -> select * from rezept r)
中删除了第二个“
将oracle Select z.ZUTATEN_ID from REZEPT r WHERE z.ZUTATEN_ID = r.Zutaten_ID
and (r.SPEISEKARTE_ID = :new.SPEISEKARTE_ID));
更改为oracle Select z.ZUTATEN_ID from REZEPT r WHERE z.ZUTATEN_ID = r.Zutaten_ID and (r.SPEISEKARTE_ID = 1));
可以解决问题,但不是我希望更新执行的操作。
CREATE OR REPLACE TRIGGER trg_bestand
after insert on BESTELLUNGEN
for each row
declare
isGericht int;
rezeptID int;
isUnterMindestbestand int;
var_col1 varchar2(32);
mail varchar2(4096);
rezept_zutaten_id int;
cursor cur IS SELECT Name_Zutat FROM zutaten where Bestand<Mindestbestand and benachrichtigt=0;
BEGIN
SELECT COUNT(1) into isGericht
FROM gericht
WHERE gericht.Speisekarte_ID = :New.Speisekarte_ID;
if isGericht=1 then
INSERT into history(Datum, Uhrzeit, Beschreibung, Autor) VALUES (CURRENT_DATE,CURRENT_DATE,'Bestände wurden angepasst durch eine Bestellung','trg_bestad');
rezeptID := (SELECT distinct r.Rezept_ID from rezept r where r.Speisekarte_ID=:new.Speisekarte_ID);
/* PROBLEM UPDATE */
Update zutaten z
set z.Bestand = (z.Bestand-(Select r.Menge FROM Rezept r WHERE z.ZUTATEN_ID = r.ZUTATEN_ID))
WHERE EXISTS (Select z.ZUTATEN_ID from REZEPT r WHERE z.ZUTATEN_ID = r.Zutaten_ID
and (r.SPEISEKARTE_ID = :new.SPEISEKARTE_ID));
/* PROBLEM UPDATE */
UPDATE speisekarte s
set s.GESPEERT = 1 where exists (select s.SPEISEKARTE_ID from speisekarte s, rezept r, zutaten z where r.SPEISEKARTE_ID = s.SPEISEKARTE_ID
and r.SPEISEKARTE_ID = z.ZUTATEN_ID
and z.BESTAND < r.MENGE);
SELECT COUNT(1) into isUnterMindestbestand
FROM zutaten
WHERE Mindestbestand>Bestand and benachrichtigt = 0;
if isUnterMindestbestand>=1 then
mail := 'Folgende Zutaten sind zur Zeit unter dem Mindestbestand und müssen gelifert werden:';
OPEN cur;
LOOP
FETCH cur INTO var_col1;
exit when cur%notfound;
mail := concat(concat(mail, '\n'), var_col1);
end loop;
close cur;
Insert into email(von, an, text, Uhrzeit, read) values ('noreply@bms.de','Frischeparadies@Lieferant.de',mail,current_date, 0);
INSERT into history(Datum, Uhrzeit, Beschreibung, Autor) VALUES (current_date,current_date,'Eine Bestell Email wurde an den Lieferanten geschickt','trg_bestad');
update zutaten set benachrichtigt= 1 where Mindestbestand>Bestand;
end if;
end if;
end;
这是发生错误的地方:(在WHERE EXISTS之后的select语句)
Update zutaten z
set z.Bestand = (z.Bestand-(Select r.Menge FROM Rezept r WHERE z.ZUTATEN_ID = r.ZUTATEN_ID))
WHERE EXISTS (Select z.ZUTATEN_ID
from REZEPT r
WHERE z.ZUTATEN_ID = r.Zutaten_ID
and (r.SPEISEKARTE_ID = :new.SPEISEKARTE_ID));
答案 0 :(得分:0)
如@Alex Poole所述,存在多个问题。
我已经解决了所有问题。尝试执行以下代码:
CREATE OR REPLACE TRIGGER TRG_BESTAND AFTER
INSERT ON BESTELLUNGEN
FOR EACH ROW
DECLARE
ISGERICHT INT;
REZEPTID INT;
ISUNTERMINDESTBESTAND INT;
VAR_COL1 VARCHAR2(32);
MAIL VARCHAR2(4000); -- UPDATED: CHANGED THE SIZE AS IT WILL BE GOING TO INSERTED IN EMAIL TABLE
-- TABLE DO NOT SUPPORT MORE THAN 4000 CHANRACTERS IN VARCHAR2 FIELDS
REZEPT_ZUTATEN_ID INT;
CURSOR CUR IS
SELECT
NAME_ZUTAT
FROM
ZUTATEN
WHERE
BESTAND < MINDESTBESTAND
AND BENACHRICHTIGT = 0;
BEGIN
SELECT
COUNT(1)
INTO ISGERICHT
FROM
GERICHT
WHERE
GERICHT.SPEISEKARTE_ID = :NEW.SPEISEKARTE_ID;
IF ISGERICHT = 1 THEN
INSERT INTO HISTORY (
DATUM,
UHRZEIT,
BESCHREIBUNG,
AUTOR
) VALUES (
CURRENT_DATE,
CURRENT_DATE,
'Bestände wurden angepasst durch eine Bestellung',
'trg_bestad'
);
-- UPDATED: USED INTO CALUSE AND COMMENTED PREVIOUS QUERY
SELECT DISTINCT
R.REZEPT_ID
INTO REZEPTID
FROM
REZEPT R
WHERE
R.SPEISEKARTE_ID = :NEW.SPEISEKARTE_ID;
-- PREVIOUS QUERY
--rezeptID := (SELECT distinct r.Rezept_ID from rezept r where r.Speisekarte_ID=:new.Speisekarte_ID);
/* PROBLEM UPDATE */
UPDATE ZUTATEN Z
SET
Z.BESTAND = (
SELECT
R.MENGE - Z.BESTAND
FROM
REZEPT R
WHERE
Z.ZUTATEN_ID = R.ZUTATEN_ID
)
WHERE
EXISTS (
SELECT
1 -- UPDATED
FROM
REZEPT R
WHERE
Z.ZUTATEN_ID = R.ZUTATEN_ID
AND R.SPEISEKARTE_ID = :NEW.SPEISEKARTE_ID
);
/* PROBLEM UPDATE */
UPDATE SPEISEKARTE S
SET
S.GESPEERT = 1
WHERE
EXISTS (
SELECT
1 -- UPDATED
FROM
REZEPT R, -- UPDATED: REMOVED SPEISEKARTE FROM INNER QUERY AS IT IS NOT NEEDED
ZUTATEN Z
WHERE
R.SPEISEKARTE_ID = S.SPEISEKARTE_ID
AND R.SPEISEKARTE_ID = Z.ZUTATEN_ID
AND Z.BESTAND < R.MENGE
);
SELECT
COUNT(1)
INTO ISUNTERMINDESTBESTAND
FROM
ZUTATEN
WHERE
MINDESTBESTAND > BESTAND
AND BENACHRICHTIGT = 0;
IF ISUNTERMINDESTBESTAND >= 1 THEN
MAIL := 'Folgende Zutaten sind zur Zeit unter dem Mindestbestand und müssen gelifert werden:';
OPEN CUR;
LOOP
FETCH CUR INTO VAR_COL1;
EXIT WHEN CUR%NOTFOUND;
MAIL := CONCAT(CONCAT(MAIL, CHR(10)), VAR_COL1); -- UPDATED: REMOVED \n AND USED CHR FUNCTION FOR NEW LINE
END LOOP;
CLOSE CUR;
INSERT INTO EMAIL (
VON,
AN,
TEXT,
UHRZEIT,
READ
) VALUES (
'noreply@bms.de',
'Frischeparadies@Lieferant.de',
MAIL,
CURRENT_DATE,
0
);
INSERT INTO HISTORY (
DATUM,
UHRZEIT,
BESCHREIBUNG,
AUTOR
) VALUES (
CURRENT_DATE,
CURRENT_DATE,
'Eine Bestell Email wurde an den Lieferanten geschickt',
'trg_bestad'
);
UPDATE ZUTATEN
SET
BENACHRICHTIGT = 1
WHERE
MINDESTBESTAND > BESTAND;
END IF;
END IF;
END;
分享练习结果。