Oracle 使用插入到。。。在触发器中选择

Oracle 使用插入到。。。在触发器中选择,oracle,plsql,Oracle,Plsql,我要问的问题已经存在了。但我没有答案 请参考下面的链接。 我在一个表中有大约600列。在此表中每次插入后,我需要在另一个备份表中插入新行 请说明如何在触发器中使用INSERT INTO TABLE_NAME2 SELECT*FROM TABLE_NAME1查询 注意:不在insert或select子句中指定列 两个表的结构相同。在触发器中指定所有列名是困难的,而且如果添加了新列,我们还需要添加触发器 SQL> CREATE or REPLACE TRIGGER emp_after

我要问的问题已经存在了。但我没有答案

请参考下面的链接。

我在一个表中有大约600列。在此表中每次插入后,我需要在另一个备份表中插入新行

请说明如何在触发器中使用INSERT INTO TABLE_NAME2 SELECT*FROM TABLE_NAME1查询

注意:不在insert或select子句中指定列

两个表的结构相同。在触发器中指定所有列名是困难的,而且如果添加了新列,我们还需要添加触发器

    SQL> CREATE or REPLACE TRIGGER emp_after_insert AFTER INSERT ON emp
FOR EACH ROW
DECLARE
BEGIN
insert into emp_backup values (:new.empid, :new.fname, :new.lname);
DBMS_OUTPUT.PUT_LINE('Record successfully inserted into emp_backup table');
END;
参考:

参考:
您应该使用复合触发器。此触发器应如下所示:

CREATE OR REPLACE TRIGGER t_copy_table1
FOR INSERT ON table1
COMPOUND TRIGGER
    v_id number;

BEFORE EACH ROW IS
BEGIN
    v_id := :new.id;
END BEFORE EACH ROW;

AFTER STATEMENT IS
BEGIN 
    insert into table2 select * from table1 where id=v_id;
END AFTER STATEMENT;
END t_copy_table1;

你应该使用复合触发器。此触发器应如下所示:

CREATE OR REPLACE TRIGGER t_copy_table1
FOR INSERT ON table1
COMPOUND TRIGGER
    v_id number;

BEFORE EACH ROW IS
BEGIN
    v_id := :new.id;
END BEFORE EACH ROW;

AFTER STATEMENT IS
BEGIN 
    insert into table2 select * from table1 where id=v_id;
END AFTER STATEMENT;
END t_copy_table1;


可能会重复一个过程,在表2中插入数据会更容易?@Tenzin-不,这个插入是通过网页进行的。所以包在这里不适用。@Krzosik-那里大约有600列。你想让我把所有的列名都放进去吗?如果业务逻辑在数据库中,而你只是调用了一个过程来插入表1记录,那么这就不是问题了。然后,该过程将实现“创建表1记录时,在表2中创建备份”的业务逻辑。这将很容易,业务数据的逻辑将与业务数据保持一致。触发器只是为了让业务逻辑分散在错误的位置而进行的一种变通方法。可能更容易复制在表2中插入数据的过程?@Tenzin-不,此插入是通过网页进行的。所以包在这里不适用。@Krzosik-那里大约有600列。你想让我把所有的列名都放进去吗?如果业务逻辑在数据库中,而你只是调用了一个过程来插入表1记录,那么这就不是问题了。然后,该过程将实现“创建表1记录时,在表2中创建备份”的业务逻辑。这将很容易,业务数据的逻辑将与业务数据保持一致。触发器只是将业务逻辑分散到错误位置的一种变通方法。我要求的是不提及列,因为我在一个表中有大量的列。因此计划使用select*from。您至少需要写出一次列。这里您只提到3列。我要求的是不提及列,因为我在一个表中有大量的列。因此计划使用select*from。您需要至少写出一次列。这只适用于主表中的一次插入。如果主表上有INSERT AS SELECT done,则只有最后一行会复制到备份表中。您需要引入一个PL-SQL表来存储ID和您遇到的内存问题。@MarcoPolo OK,但没有说将对此表执行insert as select。我认为单次插入是正确的方法。这里还有一个条件,上面触发器中提到的id可能有重复项。但我只需要在第一个表中新插入的最后一个条目。@CHANDRUS因此,请使用一列作为该表的主键,我仅使用id来显示示例。这只适用于向主表中插入一次。如果主表上有INSERT AS SELECT done,则只有最后一行会复制到备份表中。您需要引入一个PL-SQL表来存储ID和您遇到的内存问题。@MarcoPolo OK,但没有说将对此表执行insert as select。我认为单次插入是正确的方法。这里还有一个条件,上面触发器中提到的id可能有重复项。但是我只需要在第一个表中新插入的最后一个条目。@CHANDRUS所以使用一个列作为这个表的主键,我只使用id来显示示例