Предупреждение: процедура создана с ошибками компиляции? - PullRequest
0 голосов
/ 14 декабря 2011

Почему это дает мне ошибки?

CREATE OR REPLACE trigger customerLineCount
BEFORE insert on  cust_line 
for each row
when(new.cust_id > 0)
DECLARE
    lineCount number;
BEGIN
    select count (*) into lineCount
    from  (cust_line inner join  customer
    on cust_line.cust_id = customer.cust_id)
    where (customer.cust_id = :new.cust_id)

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

Ответы [ 2 ]

5 голосов
/ 15 декабря 2011

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 инициализирует коллекцию, триггер уровня строки заполняет коллекцию ключами из вновь вставленных строк. И затем триггер после оператора будет перебирать коллекцию, запрашивать таблицу и применять любую бизнес-логику, какую пожелаете. Это, однако, очень сложный подход, который редко требуется на практике. Как правило, вы гораздо лучше обслуживаете, используя ограничения, а не триггеры, или применяете бизнес-правила в хранимой процедуре, выполняющей вставки.

3 голосов
/ 14 декабря 2011

Вы пропустили точку с запятой после первого выделения в теле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...