Plsql 如何创建基于时间段的触发器它必须做和函数

Plsql 如何创建基于时间段的触发器它必须做和函数,plsql,oracle11g,database-trigger,Plsql,Oracle11g,Database Trigger,我想在Oracle11g中创建一个触发器,它必须每5分钟对order表中price列的值求和一次。我该怎么做?正确的方法是使用一个物化视图来计算总数 create table t23 (id number primary key , qty number); create materialized view log on t23; create materialized view t23_total refresh force start with sysdate + 5/(60

我想在Oracle11g中创建一个触发器,它必须每5分钟对order表中price列的值求和一次。我该怎么做?

正确的方法是使用一个物化视图来计算总数

create table t23 (id number primary key , qty number);

create materialized view log on t23;

create materialized view  t23_total 
refresh force
    start with sysdate + 5/(60*24)
    next sysdate  + 5/(60*24)
as
select sum(qty) as total_qty
from t23
/
这是实现总体目标的最有效方法。每五分钟刷新一次。如果你想实时保持总数,你可以使用

create materialized view t23_total 
refresh on commit
as
select sum(qty) as total_qty
from t23
/

您可以创建计划程序作业以每5分钟运行一次

declare
   v_anon_block varchar2(500) :=
     q'{begin
          insert into mylog(log_date,total_price) select SYSDATE, SUM(price) 
             from order;
          commit;
        end;}';
 begin
     dbms_scheduler.create_job (
        job_name           =>  'SUM_PRICE_JOB',
        job_type           =>  'PLSQL_BLOCK',
        job_action         =>  v_anon_block,
        start_date         =>  SYSDATE,
        repeat_interval    =>  'FREQ=MINUTELY;INTERVAL=5;',
        enabled            =>  TRUE,
        comments           =>  '5 minute Refresh');
 end;
 /

为什么要使用“旧”数据?我是说,每5分钟计算一次这个值的目的是什么?按要求及时、实时提供。创建这样做的视图或函数,例如

create or replace view v_sum_price as
  select sum(price) 
  from orders_table;

这两个都很可能缺少一些附加信息(订单ID?项目ID?其他信息?)。此外,我看不出将订单表中的价格值相加有什么意义。你如何使用它?例如,对于餐厅:订单表包含以下价格:

ITEM     PRICE   QUANTITY 
Coke       1.5          2
Burger     4.0          2
Wine       2.3          1
Salad      0.8          1
现在你们知道价格列的和等于8.6。它包含哪些有用的信息?绝对没有(或者我看不到)


如果您描述一下您要解决的问题,可能会有所帮助。

这听起来不像是一项触发任务,而是某种预定任务。当某些表发生事件时触发。Tim,告诉我如何完成此任务。使用物化视图检查我的答案并让我知道它是否有效。请阅读:。
ITEM     PRICE   QUANTITY 
Coke       1.5          2
Burger     4.0          2
Wine       2.3          1
Salad      0.8          1