5

重複の可能性:
sysdateに基づいてトリガー

1.毎日12:00(24時間形式)に更新操作を実行する必要があるテーブルがあります。

これをどのように達成する必要がありますか?

テーブルスキーマ:

CREATE TABLE CHARGES   
(
    total NUMBER(30),
    admitdate TIMESTAMP(6),
    dischargedate TIMESTAMP(30)
)

アルゴリズムの更新:

if 
{
   dischargedate="null" 
   then total=admitdate-sysdate=difference in days * Total
   Do this every day at 12:00(24 Hr. Format)
}
else
{  
  do nothing.    
}
4

3 に答える 3

1

24時間ごとにジョブを実行する標準は、システムパッケージを使用してこの間隔でジョブを実行することDBMS_SCHEDULERです。

例えば:

BEGIN
  DBMS_SCHEDULER.create_job (
    job_name        => 'update_charges',
    job_type        => 'PLSQL_BLOCK',
    job_action      => 'BEGIN my_procedure; END;',
    start_date      => TRUNC(SYSDATE) + 0.5,
    repeat_interval => 'freq=daily;',
    end_date        => NULL,
    enabled         => TRUE,
    comments        => 'Update the discharged date in charges.');
END;
/

次に、実行するプロシージャを作成します。

create or replace PROCEDURE my_procedure is

begin

  update charges
     set total = admitdate - sysdate
   where dischargedate is null;

end;
/

admitdateこれにより、列の合計がとSYSDATEの間の日数に更新されます。

しかし、私はこれを行う必要性に疑問を持っています。これは、昔からの「年齢を保存する必要があるか」という質問に非常によく似ています。答えはノーだと思います。あなたはある時点で絶対に間違っているはずであり、ジョブが手動で正しく実行されない原因となる可能性がいくつかあります。データベースからデータを抽出するときに、この列をその場で計算します。

于 2013-01-01T18:55:26.963 に答える
0

Oracleにはスケジューラが組み込まれていません。これに取り組むにはいくつかの異なる方法があります。ここに2つあります:

1)サーバーのスケジューリングメカニズムを介して実行されるSQLスクリプトを作成します。Unix / Linuxの場合、これはcronジョブになります。Windowsの場合、これはスケジュールされたタスクになります。

2)CREATE_JOB構文を使用してスケジュールされたジョブを作成します。

BEGIN
DBMS_SCHEDULER.CREATE_JOB (
    job_name           =>  'update_charges',
    job_type           =>  'STORED_PROCEDURE',
    job_action         =>  'MYSCHEMA.SOME_PKG.UPDATE_CHARGES',
    start_date         =>  '28-APR-08 12.00.00 PM Australia/Sydney',
    repeat_interval    =>  'FREQ=DAILY;INTERVAL=1', /* every other day */
    end_date           =>  '20-NOV-13 12.00.00 PM Australia/Sydney',
    job_class          =>  'batch_update_jobs',
    comments           =>  'My new job');
END;
于 2013-01-01T18:55:35.937 に答える
0

SQLとして表現すると、あなたのアルゴリズムはUPDATE以下のステートメントで実装されていると思います。totalアルゴリズムを実行するたびに、それ自体で乗算したいようです。それが私の誤解かあなたのタイプミスだと思います。total単に許可日と現在の日付の差に等しい方が理にかなっているようです。

UPDATE CHARGES
   SET Total = DATEDIFF(d, GETDATE(), AdmitDate)
 WHERE DischargeDate IS NULL;

このクエリが効率的に実行されるようにするには、DischargeDate列にインデックスを付ける必要があります。

毎日特定の時間にこれを行うには、いくつかの選択肢があります。

独自のサーバーコードを実行している場合の1つのアプローチは、そのコードで作業をスケジュールし、必要なときにいつでも実行することです。サーバー側のアーキテクチャに適切な監視と管理が組み込まれている場合。

別のアプローチは、使用しているOSに応じて、chronまたはジョブを実行することです。at

于 2013-01-01T18:56:21.183 に答える