2012-03-24 2 views
1

Ich versuche, einen Auslöser zu schaffen, sondern Fehler mit ....Oracle Trigger-Fehler PL/SQL: ORA-00913: zu viele Werte

SQL> CREATE OR REPLACE TRIGGER INV_TOTAL 
    2 BEFORE INSERT OR UPDATE ON INVOICE 
    3 FOR EACH ROW 
    4 BEGIN 
    5  SELECT 
    6  NVL((SELECT R.SUBTOTAL FROM HOLIDAY_RESERVATION R WHERE R.RESV_ID = :NEW.INV_ID), 0) + 
    7  NVL((SELECT R.SUBTOTAL, (R.SUBTOTAL*20)/100 FROM HOLIDAY_RESERVATION R WHERE R.RESV_ID = :NEW.RESV_ID),0) 
    8  INTO :NEW.INV_TOTAL_PRICE 
    9  FROM DUAL; 
10 END; 
11/

Warning: Trigger created with compilation errors. 

SQL> SHOW ERRORS; 
Errors for TRIGGER INV_TOTAL: 

LINE/COL ERROR 
-------- ----------------------------------------------------------------- 
2/4  PL/SQL: SQL Statement ignored 
4/9  PL/SQL: ORA-00913: too many values 
SQL> 

Wo ist es zu viele Werte zu finden, alles, was ich will was in Feld Wert Ihrer wird wählen, 20% hinzufügen und ein Feld in einer anderen Tabelle aktualisieren

Antwort

0

der Grund für „zu viele Werte“ Fehler, dass Sie die folgenden Aktionen in der select-Anweisungen ist:

NVL((SELECT R.SUBTOTAL FROM HOLIDAY_RESERVATION R WHERE R.RESV_ID = :NEW.INV_ID), 0) ' 1 value 
NVL((SELECT R.SUBTOTAL, (R.SUBTOTAL*20)/100 FROM HOLIDAY_RESERVATION R WHERE R.RESV_ID = :NEW.RESV_ID),0) ' gives 2 values (subtotal, subtotal*20/100) 

NVL Aufruf mit 2 Werten wirft ORA-00 913. Selbst wenn dies nicht der Fall wäre, würde es sich irgendwann auswerfen, wenn Sie versuchen, 1 Wert mit 2 hinzuzufügen.

Außerdem würde ich neben jeder Deklaration vollständig qualifizierte Schemanamen festlegen.

1

Könnten Sie nicht nur etwas tun, wie folgt aus:

CREATE OR REPLACE TRIGGER INV_TOTAL 
BEFORE INSERT OR UPDATE ON INVOICE 
FOR EACH ROW 
BEGIN 
    -- Add 20% to subtotal and populate inv_total_price 
    SELECT (NVL(r.subtotal, 0) * 1.2) -- Multiplying by 1.2 adds 20% to the total 
    INTO :NEW.INV_TOTAL_PRICE 
    FROM holiday_reservation r 
    WHERE r.resv_id = :NEW.inv_id; 
EXCEPTION 
    WHEN no_data_found 
    THEN 
     -- Set the inv_total_price to zero as there was no corresponding 
     -- record in holiday_reservation. 
     :NEW.INV_TOTAL_PRICE := 0; 
END; 
/

Ich habe kein Terminal vor mir haben dies allerdings im Moment zu testen. :-(
N.B.:You wollen oder nicht die Ausnahme Abschnitt kann.
Hoffe, es hilft ...