【问题标题】:Is it possible to create a trigger for inserting data of a table on another table in Oracle?是否可以创建触发器以将表的数据插入到 Oracle 中的另一个表中?
【发布时间】:2018-12-02 23:16:25
【问题描述】:

我正在学习 Oracle,我有一个查询,如果像标题中所说的那样,创建一个触发器,可以将数据从一个表插入到另一个表中。我该怎么做?如果我有这个表:

create table personal(
    id_person);

create table mine(
    id_mine,
    name_mine,
    pay);

create table trip(
    id_trip,
    id_person,
    name_mine,
    date_trip);

create table assignment(
    id_assig,
    id_trip,
    pay);

assignment 表中的 pay 列是我要从表中自动插入的列我的通过触发器。

【问题讨论】:

  • 什么事件触发assignment的填充?插入trip???

标签: oracle plsql database-trigger


【解决方案1】:

然后您可以使用在表 MINE 上定义的 (BEFOREAFTER) INSERT 触发器作为以下:

CREATE OR REPLACE TRIGGER trg_bi_ins_mine
BEFORE INSERT ON mine
FOR EACH ROW 
DECLARE
  v_assigID assignment.id_assig%type := seq_assig.nextval;
  v_tripID  assignment.id_trip%type  := seq_trip.nextval;
BEGIN         
    insert into assignment( id_assig, id_trip, pay)
    values( v_assigID, v_tripID, :new.pay);
 -- this pay in (:new.pay) comes from inserted column value of the table "mine"
END;

【讨论】:

  • 这里的 BEFORE 触发器比 AFTER 触发器有什么优势?
  • @DavidFaber 在这种情况下,不会有任何区别。作为一个习惯,我更喜欢before,对于行级after类型触发器中的dml语句,我们可能会遇到mutating trigger problem而不是before的触发器......谢谢。
【解决方案2】:

我假设您表上的主键是 IDENTITY 列。

为了将pay 的值从表mine 插入表assignment,您需要知道id_trip 的值。这可以从name_mine 的值中得到,但我想知道这个值是否是唯一的?它会返回id_trip 的单个值还是可以返回多个值? date_trip 是否参与其中?这些都是您需要知道答案才能正确编写此触发器的所有问题。不过,这里是:

CREATE OR REPLACE TRIGGER ins_mine_pay
 AFTER INSERT ON mine
   FOR EACH ROW
BEGIN
  INSERT INTO assigment
    ( id_trip, pay )
  SELECT id_trip, :new.pay
    FROM trip
   WHERE mine_name = :new.mine_name;
END;
/

希望这会有所帮助。

【讨论】:

  • 没错,列 name_mine 它是一个独特的值,因此我设置了表格行程,感谢您的帮助我开始编辑我的触发器
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-03
  • 1970-01-01
相关资源
最近更新 更多