【问题标题】:How to activate a trigger on a date如何在日期激活触发器
【发布时间】:2011-10-14 13:21:04
【问题描述】:

当系统到达某个日期时,我怎么会有一个触发器来更新某个字段?

+---------------------+  +-------------+
|   Trains            |  |    Trips    |
+---------------------+  +-------------+
| id                  |  |  id         |
| distanceTraveled    |  |  endDate    |
|                     |  |  trainUsed  |
|                     |  |  distance   |
+---------------------+  +-------------+

火车:

  • train1, 0
  • train2, 0
  • train3, 0
  • train4, 0

旅行:

  • 1, 明天 12:00:00, train1, 10
  • 2, 明天 14:45:00, train3 ,20
  • 3, 02:15:00 明后, train1, 15

执行:

  • 明天 12:00:00,更新表 train,使 train1 的 distanceTraveled 字段变为 10
  • 明天 14:45:00,更新表 train,使 train3 的 distanceTraveled 字段变为 20
  • 后天 02:15:00,更新表 train,使 train1 的 distanceTraveled 字段变为 25

2 天后的最终结果将是

火车:

  • train1, 25
  • train2, 0
  • train3, 20
  • train4, 0

【问题讨论】:

    标签: oracle plsql triggers oracle10g dbms-scheduler


    【解决方案1】:

    你应该看看DBMS_SCHEDULER 包:

    DBMS_SCHEDULER 包提供了可从任何 PL/SQL 程序调用的调度函数和过程的集合。

    有点像内置的cron(具有更多功能)。

    【讨论】:

    • 谢谢,不完全是我需要的,但它帮助我弄清楚如何去做。
    • 如果这不是您所需要的,请删除接受并编辑您的问题以提供有关您想要的更多详细信息。有了一个被接受的答案,很少有人会看你的问题,所以你可能会错过一些好的建议。 (并且编辑您的问题将使其“活跃”并在首页上跳回一点。)
    • +1 用于替代触发器,触发器越少越好。
    【解决方案2】:

    为了充实@Mat的答案,我认为你想要的是这样的:

    create or replace procedure update_train_distance(p_train_id trains.id%type,
                                                      p_distance trips.distance%type) is
    begin
       update trains 
          set distancetraveled = nvl(distancetraveled,0)+p_distance
          where id = p_train_id;
    end update_train_distance;
    
    begin
    dbms_scheduler.create_program('sched_train_update',
                                  'STORED_PROCEDURE',
                                  'UPDATE_TRAIN_DISTANCE',
                                  2,
                                  TRUE);
    dbms_scheduler.define_program_argument('sched_train_update',
                                           1,
                                           'p_train_id',
                                           'VARCHAR2',
                                           '0');
    dbms_scheduler.define_program_argument('sched_train_update',
                                           2,
                                           'p_distance',
                                           'NUMBER',
                                           0);
    end;
    
    create or replace trigger trips_sched_ai
    after insert on trips
    for each row
    begin
       dbms_scheduler.create_job(job_name => 'TRIP_' || :new.id,
                                 program_name => 'sched_train_update',
                                 start_date => :new.enddate,
                                 auto_drop => true);
       dbms_scheduler.set_job_argument_value(job_name => 'TRIP_' || :new.id,
                                             argument_name => 'p_train_id',
                                             argument_value => :new.trainid);
       dbms_scheduler.set_job_argument_value(job_name => 'TRIP_' || :new.id,
                                             argument_name => 'p_distance',
                                             argument_value => :new.distance);
       dbms_scheduler.enable('TRIP_' || :new.id);
    end trg_trips_sched;
    

    您应该记住,这是一个未经测试的示例,我可能遗漏了一些东西。至少,您可能需要在作业执行之前添加触发器来处理更新或删除。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-25
      • 2021-06-28
      • 1970-01-01
      • 2011-01-21
      • 2023-01-31
      • 2020-06-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多