2

システムが特定の日付に達したときに特定のフィールドを更新するトリガーを設定するにはどうすればよいですか?

すなわち

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

列車 :

  • 電車1、0
  • 電車2、0
  • 電車3、0
  • 電車4,0

旅行 :

  • 1、12:00:00 明日、列車 1、10
  • 2, 14:45:00 明日, 列車 3 ,20
  • 3、02:15:00以降、train1、15

実行:

  • 明日の 12:00:00 に、テーブル train を更新して、train1 の distanceTraveled フィールドが 10 になるようにします。
  • 明日の 14:45:00 に、train3 の distanceTraveled フィールドが 20 になるようにテーブル train を更新します。
  • 明日の 02:15:00 にテーブル train を更新して、train1 の distanceTraveled フィールドが 25 になるようにします。

2日後の最終結果は

列車 :

  • 電車1、25
  • 電車2、0
  • 電車3、20
  • 電車4,0
4

2 に答える 2

7

DBMS_SCHEDULERパッケージを見てください :

DBMS_SCHEDULER パッケージは、任意の PL/SQL プログラムからコール可能なスケジューリング関数およびプロシージャのコレクションを提供します。

組み込みのようなものですcron(より多くの機能を備えています)。

于 2011-07-27T19:10:35.867 に答える
3

@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;

これはテストされていない例であり、見落としがある可能性があることに注意してください。少なくとも、ジョブを実行する前に、更新または削除を処理するトリガーを追加する必要があります。

于 2011-07-27T20:45:07.567 に答える