Ошибка запуска Oracle PL / SQL: ORA-00913: слишком много значений - PullRequest
1 голос
/ 24 марта 2012

Я пытаюсь создать триггер, но возникают ошибки ....

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>

Где он находит слишком много значений, все, что мне нужно, это выбрать что в промежуточной сумме поля, добавить 20% и обновить поле в другой таблице

Ответы [ 2 ]

1 голос
/ 24 марта 2012

Не могли бы вы просто сделать что-то вроде этого:

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;
/

У меня нет терминала передо мной, чтобы проверить это в данный момент, хотя.:-(NB. Вы можете или не можете хотеть раздел об исключениях.Надеюсь, это поможет ...

0 голосов
/ 24 марта 2012

Причина ошибки «Слишком много значений» заключается в том, что в ваших операторах выбора вы делаете следующее:

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 с двумя значениями выдает ORA-00913. Даже если этого не произойдет, он в конечном итоге выкинет, когда вы попытаетесь добавить 1 значение с 2.

Кроме того, я бы установил полностью определенные имена схем рядом с каждым объявлением.

...