Ошибка Oracle SQL PLS-00049: неверная переменная связывания «NEW.NOOFCUSTOMERS»

Мне нужно создать триггер для добавления «NoOfCustomers» в таблицу STORE. Если количество клиентов превышает лимит, то будет отображаться сообщение об ошибке. Я получаю сообщение об ошибке "неверная переменная связывания" NEW.NOOFCUSTOMERS" при попытке запустить триггер, и я не могу понять, почему.

CREATE OR REPLACE TRIGGER NoOfCustomersTrigger 
      BEFORE INSERT ON STORE
      FOR EACH ROW 
      DECLARE V_CAPACITY SHOPS.LIMIT%TYPE;
    BEGIN 
          SELECT LIMIT INTO V_LIMIT
          FROM SHOPS, SERVES
          WHERE CUSTID = SERVES.CUSTID AND STORENO = :NEW.STORENO;
          IF (:NEW.NOOFCUSTOMERS > V_LIMIT) THEN 
            RAISE_APPLICATION_ERROR (-20004,'The Number of Customers exceeds the LIMIT'); 
          END IF; 
        END; 

person BrownEye    schedule 28.10.2013    source источник
comment
Я только что понял, нужно ли мне уже создавать NOOFCUSTOMERS в нем?   -  person BrownEye    schedule 28.10.2013
comment
Вы спрашиваете, нужно ли вам, чтобы NOOFCUSTOMERS уже существовало в таблице? Поскольку код pl/SQL оценивает структуру таблицы во время компиляции, ответ положительный.   -  person Mureinik    schedule 28.10.2013
comment
Да, я понял это сразу после того, как спросил. Теперь у меня есть две ошибки: 1) PL/SQL: ORA-00918: столбец определен неоднозначно 2) PL/SQL: оператор SQL игнорируется   -  person BrownEye    schedule 28.10.2013
comment
ORA-00918 означает, что столбец с одинаковым именем существует в обеих таблицах - добавьте префиксы к столбцам: tablename.columnname в запросе.   -  person krokodilko    schedule 28.10.2013


Ответы (1)


Похоже, в вашем коде есть некоторые ошибки,

  1. Используйте V_LIMIT в разделе объявления вместо V_CAPACITY, так как вы используете v_limit в своем коде.
  2. Оператор sql выдаст ошибку column ambiguously defined. На столбцы необходимо ссылаться как на TABLE.COLUMN_NAME или TABLE_ALIAS.COLUMN_NAME.

Попробуйте так,

CREATE OR REPLACE 
TRIGGER noofcustomerstrigger 
      BEFORE INSERT ON STORE
      FOR EACH ROW 
DECLARE v_limit shops.LIMIT%TYPE;
BEGIN 
     SELECT LIMIT INTO v_limit
     FROM shops A, serves b
     WHERE A.custid = b.custid AND storeno = :NEW.storeno;

     IF (:NEW.noofcustomers > v_limit) THEN 
          raise_application_error (-20004,'The Number of Customers exceeds the LIMIT'); 
     END IF; 
END;
person Dba    schedule 28.10.2013