2014-12-12 3 views
0

Я немного новичок в SQL, поэтому, пожалуйста, несите меня. Я пытаюсь создать триггер, который будет обновлять цену в моей корзине (COMANDA), всякий раз, когда я включаю в нее новый продукт (PRODUS). Я искал, как я могу это сделать, но все, что я пробовал, не удалось. Любая помощь и советы могут быть разными. Вот мои таблицы, отношения и моя последняя попытка создания триггера.Создайте триггер для обновления столбца таблицы при вставке или обновлении в другой таблице (Oracle SQL)

DROP TABLE CLIENT; 
DROP TABLE COMANDA; 
DROP TABLE ITEMCOMANDA; 
DROP TABLE PRODUS; 

CREATE TABLE CLIENT 
(
STRADA VARCHAR2 (50) , 
NUME VARCHAR2 (20) , 
PRENUME VARCHAR2 (20) , 
ORAS VARCHAR2 (10) , 
JUDET VARCHAR2 (10) , 
ID  NUMBER (3) NOT NULL, 
UNIQUE (ID) 
) ; 
ALTER TABLE CLIENT ADD CONSTRAINT CLIENT_PK PRIMARY KEY (ID) ; 

CREATE TABLE COMANDA 
(
ID  NUMBER (3) NOT NULL , 
DATA  DATE , 
VALUARE NUMBER , 
CLIENT_ID NUMBER (3) NOT NULL, 
UNIQUE (ID) 
) ; 
ALTER TABLE COMANDA ADD CONSTRAINT COMANDA_PK PRIMARY KEY (ID) ; 

CREATE TABLE ITEMCOMANDA 
(
ID   NUMBER (3) NOT NULL , 
COMANDA_ID NUMBER (3) NOT NULL , 
PRODUS_ID NUMBER (3) NOT NULL, 
UNIQUE (ID) 
) ; 
ALTER TABLE ITEMCOMANDA ADD CONSTRAINT ITEMCOMANDA_PK PRIMARY KEY (ID) ; 

CREATE TABLE PRODUS 
(
ID  NUMBER (3) NOT NULL , 
DENUMIRE VARCHAR2 (50) , 
PRET  NUMBER, 
UNIQUE (ID) 
) ; 
ALTER TABLE PRODUS ADD CONSTRAINT PRODUS_PK PRIMARY KEY (ID) ; 

ALTER TABLE COMANDA ADD CONSTRAINT CLIENT_COMANDA_FK FOREIGN KEY (CLIENT_ID) REFERENCES CLIENT (ID) ; 

ALTER TABLE ITEMCOMANDA ADD CONSTRAINT ITEMCOMANDA_COMANDA_FK FOREIGN KEY (COMANDA_ID) REFERENCES COMANDA (ID) ; 

ALTER TABLE ITEMCOMANDA ADD CONSTRAINT ITEMCOMANDA_PRODUS_FK FOREIGN KEY (PRODUS_ID) REFERENCES PRODUS (ID) ; 

DROP TRIGGER TR; 

CREATE TRIGGER TR 
AFTER INSERT OR UPDATE OF PRET ON PRODUS 
FOR EACH ROW 
BEGIN 
IF (PRODUS.ID = ITEMCOMANDA.PRODUS_ID AND ITEMCOMANDA.COMANDA_ID) THEN 
UPDATE COMANDA SET VALOARE = VALOARE + PRET; 
END IF; 
END; 

И я получаю эту ошибку:

Error(2,13): PLS-00357: Table,View Or Sequence reference 'PRODUS.ID' not allowed in this context 

Я попытался modufung это немного и теперь это:

CREATE TRIGGER TR 
AFTER INSERT ON PRODUS 
REFERENCING NEW AS NR 
FOR EACH ROW 
WHEN (SELECT IC.PRODUS_ID FROM ITEMCOMANDA IC, COMANDA C WHERE IC.CIMANDA_ID = C.ID) = NR.ID 
    UPDATE COMANDA SET VALOARE = (VALOARE + NR.PRET); 

И я получаю эту ошибку на выбор (хотя я поставляется экспрессионист):

Отчет об ошибке - ORA-00936: отсутствует выражение 00936. 00000 - "отсутствует выражение" * Причина:
* Действие:

+1

Какая ошибка? У вас есть орфографическая ошибка VALAORE – Mihai

+0

Извините, я забыл исправить это. Это ошибка, которую я получаю: Ошибка (2,13): PLS-00357: Таблица, Ссылка на просмотр или последовательность «PRODUS.ID» не разрешена в этом контексте –

ответ

0

Не делайте этого.

Не используйте триггер для обновления значения, которое вы могли бы просто вычислить, используя функцию агрегата, такую ​​как SUM.

В вашем конкретном случае добавление элемента в корзину должно быть таким же простым, как добавление строки в таблицу ITEMCOMANDA. Позже, когда вам нужно рассчитать общую цену корзину говорят ID: 123, вы будете прибегать на такой запрос:

SELECT SUM(PRODUS.PRET) 
FROM ITEMCOMANDA JOIN PRODUS 
ON PRODUS.ID = ITEMCOMANDA.PRODUC_ID 
WHERE ITEMCOMANDA.COMANDA_ID = 123 

Untested. Beware of typos!

В приведенном выше запросе, предложение WHERE ограничить область в корзину ID: 123 , Операция JOIN связывает с ней все элементы, содержащиеся в этом порядке. Наконец, функция SUM() просто вычислит общую цену.

+0

Спасибо, но я хотел, чтобы моя структура БД осталась прежней и имела в любое время правильные значения в каждой таблице. –

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