2010-07-17 92 views
0

我正在尝试创建一个触发器来执行以下操作。CREATE触发器帮助Oracle

在表A插入后,基于ID的查询表B(TableA.id = TableB.id),并插入相应的信息到表A

我有一种感觉,我的路要走,到目前为止所以任何帮助将不胜感激

CREATE OR REPLACE TRIGGER myTrig 
AFTER INSERT 
ON TABLEA 
BEGIN 
    INSERT INTO TABLEA 
    SELECT TABLEB.FIRST_NAME, TABLEB.LAST_NAME, SYSDATE 
    FROM TABLEA JOIN TABLEB ON 
    TABLEA.STUDENT_ID=TABLEB.STUDENT_ID 
    insert into TABLEA values (....); 
END; 

回答

2

这将无法正常工作。想想你在问什么。你想要一个触发器,当一行被插入到tableA中时触发到将一行插入表A。触发器什么时候停止发射?

甲骨文是足够聪明的一步,防止触发节节攀升无穷:

SQL> create or replace trigger t69_after_ins 
    2  after insert on t69 
    3 begin 
    4  insert into t69 values ('blah', 'blah', 99); 
    5 end; 
    6/

Trigger created. 

SQL> 

这里发生了什么:

SQL> insert into t69 values ('this', 'that', 1)  
    2/

insert into t69 values ('this', 'that', 1) 
      * 
ERROR at line 1: 
ORA-00036: maximum number of recursive SQL levels (50) exceeded 
ORA-06512: at "APC.T69_AFTER_INS", line 2 
ORA-04088: error during execution of trigger 'APC.T69_AFTER_INS' 
ORA-06512: at "APC.T69_AFTER_INS", line 2 
ORA-04088: error during execution of trigger 'APC.T69_AFTER_INS' 
ORA-06512: at "APC.T69_AFTER_INS", line 2 
ORA-04088: error during execution of trigger 'APC.T69_AFTER_INS' 
ORA-06512: at "APC.T69_AFTER_INS", line 2 
ORA-04088: error during execution of trigger 'APC.T69_AFTER_INS' 
ORA-06512: at "APC.T69_AFTER_INS", line 2 
ORA-04088: error during execution of trigger 'APC.T69_AFTER_INS' 
ORA-06512: at "APC.T69_AFTER_INS", line 2 
ORA-04088: error during execution of trigger 'APC.T69_AFTER_INS' 
ORA-06512: at "APC.T69_AFTER_INS", line 2 
ORA-04088: error during execution of trigger 'APC.T69_AFTER_INS' 
ORA-06512: at "APC.T69_AFTER_INS", line 2 
ORA-04088: error during execution of trigger 'APC.T69_AFTER_INS' 
ORA-06512: at "APC.T69_AFTER_INS", line 2 
ORA-04088: error during execution of trigger 'APC.T69_AFTER_I 


SQL> 

“有什么办法,我可以更新 TableA根据来自TableB的信息给出 这两个表中的ID?“

如果“更新”你实际上意味着UPDATE和 - 关键 - 取决于精确的逻辑,你希望实现,那么也许是:

SQL> create or replace trigger t69_after_ins 
    2  after insert on t69 
    3 begin 
    4  update t69 
    5   set name = (select name from t23 
    6      where t23.id = t69.id) 
    7   where name is null; 
    8 end; 
    9/

Trigger created. 

SQL> insert into t69 (id, name) values (122, null) 
    2/

1 row created. 

SQL> select name from t69 
    2 where id = 122 
    3/

NAME 
---------- 
MAISIE 

SQL> 

然而,这仍然是一个坏主意。触发器很难理解,并且可能会对我们的SQL性能产生有害的影响。所以我建议你尝试找出一种将你的逻辑构建到应用程序主体中的方法,而不是尝试使用触发器。

+0

好吧,这是有道理的。有没有什么办法可以根据来自TableB的信息更新TableA,给定两个表中的ID? – relyt 2010-07-17 04:26:44