Plsql: Как написать этот триггер, используя триггер уровня оператора?

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

  1. Вызов метода экземпляра объекта null.
  2. Доступ или изменение поля объекта null.
  3. Принимая длину null, как если бы это был массив.
  4. Доступ или изменение слотов null, как если бы это был массив.
  5. Бросок null как будто это было значение Throwable.

Приложения должны бросать экземпляры этого класса, чтобы указать на другие незаконные использования объекта null.

Ссылка: http://docs.oracle.com/javase/8/docs/api/java/lang/NullPointerException.html

0
задан Miztory 4 April 2019 в 23:41
поделиться

1 ответ

Триггер оператора (который не имеет FOR EACH ROW) не может использовать :OLD и :NEW, потому что у него нет доступа к значениям строки. Но в этом случае они вам на самом деле не нужны - вам просто нужно думать по-другому.

Что вас волнует, так это то, что после выполнения заявления есть люди с более чем тремя навыками? Так что вам нужно выяснить, как найти этот бит информации.

Следующее должно сделать это для вас:

create or replace trigger checkskillnum
  before insert or update on sneeded
begin
  FOR aRow IN (select pnumber, count(*) as SKILL_COUNT
                 from sneeded 
                 group by pnumber
                 order by COUNT(*) DESC)
  LOOP
    IF aRow.SKILL_COUNT > 3 THEN
      RAISE_APPLICATION_ERROR(-20030, 'A position does not need more than 4 skills');
    END IF;

    EXIT;    -- The first row will have the highest SKILL_COUNT, so only need to  
  END LOOP;  -- check the first row.
end CHECKSKILLNUM;

Удачи.

0
ответ дан Bob Jarvis 4 April 2019 в 23:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: