2013-05-12 6 views
1

Привет всем, кто получает это сообщение об ошибке при попытке создания триггера, и это меня немного озадачило. Вот мой код запуска.PL/SQL: заявление SQL игнорируется?

CREATE OR REPLACE TRIGGER CUSTOMER_AD 
    AFTER DELETE ON CUSTOMER 
    REFERENCING OLD AS OLD 
    FOR EACH ROW 
DECLARE 
    nPlaced_order_count NUMBER; 
BEGIN 
    SELECT COUNT(*) 
    INTO nPlaced_order_count 
    FROM PLACED_ORDERS p 
    WHERE p.FK1_CUSTOMER_ID = OLD.CUSTOMER_ID; 
IF nPlaced_order_count > 0 THEN 
INSERT into previous_customer 
(customer_id, 
first_name, 
last_name, 
address, 
AUDIT_USER, 
AUDIT_DATE) 
VALUES 
(:old.customer_id, 
:old.first_name, 
:old.last_name, 
:old.address, 
UPPER(v('APP_USER')), 
SYSDATE); 
END IF; 
END CUSTOMER_AD; 

И ошибка я получаю 'Ошибка в строке 4: PL/SQL: SQL заявления игнорировали 0.10 сек'

Любой любые догадки, почему?

спасибо за помощь

+0

Возможный дубликат [Trigger on delete, где у клиентов был заказ] (http://stackoverflow.com/questions/16508818/trigger-on-delete-where-customers-have-had-an-order) –

+0

похожее но совершенно другая проблема –

ответ

3

Погрешность показан только самый высокий уровень. В зависимости от того, где вы работаете, вы можете увидеть трассировку стека. Клиент точно определит, как это сделать; SQL * Plus или SQL Developer покажет вам больше, чем это, но я не знаю других клиентов. Если вы не можете увидеть детали в вашем клиенте, то вы можете запросить их с:

select * from user_errors where name = 'CUSTOMER_AD' and type = 'TRIGGER' 

Предполагая, что таблицы все существуют, это, вероятно, эта линия:

WHERE p.FK1_CUSTOMER_ID = OLD.CUSTOMER_ID; 

, которые должны быть:

WHERE p.FK1_CUSTOMER_ID = :OLD.CUSTOMER_ID; 

При ссылке на старое (или новое) значение из таблицы имя, указанное в предложении referencing, предшествует двоеточие, поэтому :OLD в этом случае. Как вы уже делаете в предложении insert ... values().

(Из комментариев мое предположение оказалось неправильным - так же как и недостающая проблема с двоеточием, имя таблицы действительно placed_order, без s).

Кажется, что вы скопировали код из обоих ответов на свой предыдущий вопрос, не понимая, что они делают. Возможно, вам стоит взглянуть на trigger design guidelines (в частности, о не дублирующих функциях базы данных) и syntax for create trigger, в котором представлен пункт referencing.

+0

Я понимаю код, который я запускаю в настоящее время. Я просто запятнал эту ошибку. Ive изменил то, что вы предложили, но все равно потянул ту же ошибку, я также проверил все имена таблиц и столбцов. –

+0

Кажется, что вокруг nPlaced_order_count NUMBER; это будет его утверждение, что оно не существует. любые идеи почему? @AlexPoole –

+0

Ошибка «Statement ignored» не говорит вам ничего конкретного, вам нужно посмотреть на стек ошибок. Если вы не видите его в своем клиенте, вы можете запросить его с помощью 'select * from user_errors, где name = 'CUSTOMER_AD' и type = 'TRIGGER'' –

Смежные вопросы