我缺少“ ORA-00907:缺少右括号”的内容

时间:2019-06-12 23:26:13

标签: sql oracle

因此,我正在翻译一个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));

1 个答案:

答案 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;

分享练习结果。