Исключение нулевого указателя генерируется, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:
null
. null
. null
, как если бы это был массив. null
, как если бы это был массив. null
как будто это было значение Throwable. Приложения должны бросать экземпляры этого класса, чтобы указать на другие незаконные использования объекта null
.
Ссылка: http://docs.oracle.com/javase/8/docs/api/java/lang/NullPointerException.html
Триггер оператора (который не имеет 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;
Удачи.