2017-04-19 66 views
0

我想创建一个基于CUSTOMER_ID的总和TOTALCOST的触发器。并将数据插入MAIN_ORDER表。如何使用GROUP BY在sql中创建触发器? (oracle数据库)

表:ORDER_DETAIL

 ID | CUSTOMER_ID | TOTALCOST 
      ------------------------ 
      1 | 1000 | 50 
      2 | 1000 | 50 
      3 | 2000 | 200 
      4 | 2000 | 200 

表:MAIN_ORDER

  CUSTOMER_ID | ORDER_PRICE 
      ------------------------ 
      1000 | 100 
      2000 | 400 

我都试过,但它不工作

CREATE OR REPLACE TRIGGER MOVEDETAIL 
BEFORE INSERT ON MAIN_ORDER FOR EACH ROW 
BEGIN 
SELECT ORDER_DETAIL.CUSTOMER_ID,ORDER_DETAIL.SUM(TOTALCOST) 
INTO :NEW.CUSTOMER_ID,:NEW.ORDER_PRICE 
FROM ORDER_DETAIL 
GROUP BY CUSTOMER_ID; 
END; 
+0

嗨, SO不是一般的教程网站。如果你google,“oracle触发器教程”中有很多很多的例子。 – OldProgrammer

+0

你是什么意思与“不工作”?你有错误吗?如果是这样,哪一个?还是意想不到的行为?如果是这样,你期望什么? – Aleksej

回答

0

保持放下你的触发,如果我没有理解好你有一个表ORDER_DETAIL,你想保留第二个表的数据(MAIN_ORDER)与ORDER_DETAIL数据上的每个修改对齐,因此MAIN_ORDER总是包含TOTALCOST的总和,对于中的每个ORDER_DETAIL

如果你想用触发器来做到这一点,你必须处理上ORDER_DETAIL每次修改,那就是你需要触发器,INSERTUPDATEDELETEORDER_DETAIL(不MAIN_ORDER)。

鉴于您只需保持信息对齐,我建议创建一个视图而不是处理带触发器的表。

例如:

CREATE OR REPLACE VIEW V_MAIN_ORDER 
AS SELECT CUSTOMER_ID, 
      SUM(TOTALCOST) AS ORDER_PRICE 
    FROM ORDER_DETAIL 
    GROUP BY CUSTOMER_ID 

的视图始终显示正确的信息,而无需触发

SQL> INSERT INTO ORDER_DETAIL(ID, CUSTOMER_ID, TOTALCOST) VALUES (1, 1000, 50); 

1 row created. 

SQL> INSERT INTO ORDER_DETAIL(ID, CUSTOMER_ID, TOTALCOST) VALUES (2, 1000, 50); 

1 row created. 

SQL> INSERT INTO ORDER_DETAIL(ID, CUSTOMER_ID, TOTALCOST) VALUES (3, 2000, 200); 

1 row created. 

SQL> INSERT INTO ORDER_DETAIL(ID, CUSTOMER_ID, TOTALCOST) VALUES (4, 2000, 200); 

1 row created. 

SQL> SELECT * FROM V_MAIN_ORDER; 

CUSTOMER_ID ORDER_PRICE 
----------- ----------- 
     1000   100 
     2000   400 

无论你在桌子上做什么

SQL> DELETE ORDER_DETAIL WHERE CUSTOMER_ID = 1000; 

2 rows deleted. 

SQL> SELECT * FROM V_MAIN_ORDER; 

CUSTOMER_ID ORDER_PRICE 
----------- ----------- 
     2000   400 

SQL>