Итак, я транслирую триггер 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;
Вот где происходит ошибка: (оператор select после WHERE EXISTS)
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));