每周从一个 table 计算多行的总和并将其写入另一个 table
Calculate the SUM of multiple rows from one table and have it written to another table, weekly
我不是一个经验丰富的 SQL 编码员,我是边学边学的。我有一个任务需要每周自动执行一次。这项工作有几个部分:
1) 从几列计算多行的总和。
select SUM(TOTAL_COST) from TABLE_1 and select SUM(TOTAL_HOURS) from TABLE_1
2) 将 TABLE_1 中的 2 个 SUM 写入 TABLE_2 中的 2 列。
我们将这些列称为:SUM_OF_COST 和 SUM_OF_HOURS 来自 Table_2
3) 这个作业需要每周执行一次
BEGIN
DBMS_SCHEDULER.SET_ATTRIBUTE (
name => 'update_job',
attribute => 'repeat_interval',
value => 'freq=weekly; byday=wed');
END;
/
上面的代码只是我对我认为会用到什么的理解。我知道我必须将上面前两个步骤的整个工作写到一个包中?我假设我会在工作中引用该包(第 3 步)。我需要有关如何着手编写此内容的帮助。在将 SUM 写入 TABLE_2 之前是否需要将 SUM 写入另一列,或者它可以计算 SUM 然后将值写入 TABLE_2 而不将该值存储在 TABLE_1 中?如何将代码拼凑起来进行计算,然后写入第二个 table?任何帮助将不胜感激。谢谢!
你走对了。
您需要创建一个每周执行的 procedure
。
CREATE OR REPLACE PROCEDURE sum_weekly IS
BEGIN
INSERT INTO TABLE_2(SUM_OF_COST ,SUM_OF_HOURS ) (SELECT SUM(cost),SUM(hour) FROM TABLE_1)
COMMIT;
END;
有关 insert select syntax 的更多信息。
然后你需要创建schedule:
BEGIN
DBMS_SCHEDULER.CREATE_JOB (
job_name => 'my.sum_weekly.schedule',
job_type => 'PLSQL_BLOCK',
job_action => 'BEGIN sum_weekly(); END;',
start_date => sysdate,
repeat_interval => 'FREQ=WEEKLY',
enabled => TRUE,
comments => 'Gather table statistics from Table 1 to Table 2');
END;
repeat_interval
的示例。
FREQ=HOURLY;INTERVAL=4
every 4 hour
FREQ=HOURLY;INTERVAL=4;BYMINUTE=10;BYSECOND=30
every 4 hours, 10 minutes, 30 seconds of;
FREQ=YEARLY;BYYEARDAY=-276
every 31 th March;
FREQ=YEARLY;BYMONTH=MAR;BYMONTHDAY=31
every 31 th March;
检查设置是否正确 interval
DECLARE next_run_date TIMESTAMP;
BEGIN
DBMS_SCHEDULER.EVALUATE_CALENDAR_STRING (
'FREQ=HOURLY;INTERVAL=4;BYMINUTE=10;BYSECOND=30'
,SYSTIMESTAMP
,NULL
,next_run_date) ;
DBMS_OUTPUT.PUT_LINE ( 'next_run_date: ' || next_run_date );
END;
要查看您的日程安排,请使用以下查询:
SELECT job_name, state, enabled FROM user_scheduler_jobs;
我不是一个经验丰富的 SQL 编码员,我是边学边学的。我有一个任务需要每周自动执行一次。这项工作有几个部分:
1) 从几列计算多行的总和。
select SUM(TOTAL_COST) from TABLE_1 and select SUM(TOTAL_HOURS) from TABLE_1
2) 将 TABLE_1 中的 2 个 SUM 写入 TABLE_2 中的 2 列。
我们将这些列称为:SUM_OF_COST 和 SUM_OF_HOURS 来自 Table_2
3) 这个作业需要每周执行一次
BEGIN
DBMS_SCHEDULER.SET_ATTRIBUTE (
name => 'update_job',
attribute => 'repeat_interval',
value => 'freq=weekly; byday=wed');
END;
/
上面的代码只是我对我认为会用到什么的理解。我知道我必须将上面前两个步骤的整个工作写到一个包中?我假设我会在工作中引用该包(第 3 步)。我需要有关如何着手编写此内容的帮助。在将 SUM 写入 TABLE_2 之前是否需要将 SUM 写入另一列,或者它可以计算 SUM 然后将值写入 TABLE_2 而不将该值存储在 TABLE_1 中?如何将代码拼凑起来进行计算,然后写入第二个 table?任何帮助将不胜感激。谢谢!
你走对了。
您需要创建一个每周执行的 procedure
。
CREATE OR REPLACE PROCEDURE sum_weekly IS
BEGIN
INSERT INTO TABLE_2(SUM_OF_COST ,SUM_OF_HOURS ) (SELECT SUM(cost),SUM(hour) FROM TABLE_1)
COMMIT;
END;
有关 insert select syntax 的更多信息。
然后你需要创建schedule:
BEGIN
DBMS_SCHEDULER.CREATE_JOB (
job_name => 'my.sum_weekly.schedule',
job_type => 'PLSQL_BLOCK',
job_action => 'BEGIN sum_weekly(); END;',
start_date => sysdate,
repeat_interval => 'FREQ=WEEKLY',
enabled => TRUE,
comments => 'Gather table statistics from Table 1 to Table 2');
END;
repeat_interval
的示例。
FREQ=HOURLY;INTERVAL=4
every 4 hour
FREQ=HOURLY;INTERVAL=4;BYMINUTE=10;BYSECOND=30
every 4 hours, 10 minutes, 30 seconds of;
FREQ=YEARLY;BYYEARDAY=-276
every 31 th March;
FREQ=YEARLY;BYMONTH=MAR;BYMONTHDAY=31
every 31 th March;
检查设置是否正确 interval
DECLARE next_run_date TIMESTAMP;
BEGIN
DBMS_SCHEDULER.EVALUATE_CALENDAR_STRING (
'FREQ=HOURLY;INTERVAL=4;BYMINUTE=10;BYSECOND=30'
,SYSTIMESTAMP
,NULL
,next_run_date) ;
DBMS_OUTPUT.PUT_LINE ( 'next_run_date: ' || next_run_date );
END;
要查看您的日程安排,请使用以下查询:
SELECT job_name, state, enabled FROM user_scheduler_jobs;