1) Строка в PL / SQL ограничена одинарными кавычками, а не двойными. Так что если вы хотите проверить, что такое gender
, вам нужно что-то вроде
if :new.gender = 'm' and lineCount = 3 THEN
dbms_output.put_line ('Error! User already has 3 lines');
elseif :new.gender = 'f' and lineCount = 1 THEN
dbms_output.put_line ('Error! User already has 1 line');
end if;
2) В вашем SELECT
утверждении отсутствует точка с запятой в конце.
3) Однако после устранения ошибок компиляции вы почти наверняка столкнетесь с ошибкой во время выполнения. Как правило, триггер уровня строки в таблице не может запрашивать эту же таблицу. Таким образом, ваш триггер уровня строки на cust_line
не может запросить таблицу cust_line
. Вы можете обойти это, создав пакет, содержащий коллекцию PL / SQL, а затем создав несколько триггеров. Триггер оператора before инициализирует коллекцию, триггер уровня строки заполняет коллекцию ключами из вновь вставленных строк. И затем триггер после оператора будет перебирать коллекцию, запрашивать таблицу и применять любую бизнес-логику, какую пожелаете. Это, однако, очень сложный подход, который редко требуется на практике. Как правило, вы гораздо лучше обслуживаете, используя ограничения, а не триггеры, или применяете бизнес-правила в хранимой процедуре, выполняющей вставки.