对同一个表数据用procedure实现update的问题

[复制链接]
查看11 | 回复3 | 2017-7-3 09:38:11 | 显示全部楼层 |阅读模式
现想通过存储过程对200706月份的数据进行更新(即把200705月份的CPUAVGVALUE和MEMAVGVALUE的值insert到200706对应的CPUAVGVALUELAST,MEMAVGVALUELAST这2列中)
create table SMDR_ISM_CPU_MEM_MONTH
(
STATISMONTH VARCHAR2(32),
MANAGERIP VARCHAR2(64),
CPUAVGVALUE FLOAT,
CPUMAXVALUE FLOAT,
CPUAVGVALUELAST FLOAT,
CPUMAXVALUELAST FLOAT,
MEMAVGVALUE FLOAT,
MEMMAXVALUE FLOAT,
MEMAVGVALUELAST FLOAT,
MEMMAXVALUELAST FLOAT
)
在此表中保存有5月份和6月份的数据,对于同一行数据
CPUAVGVALUE 本月CPU平均值
CPUAVGVALUELAST上月CPU平均值
MEMAVGVALUE 本月MEM平均值
MEMAVGVALUELAST上月MEM平均值
Statismonth统计月份
表中的数据例如:
Managerip CPUAVGVALUEMEMAVGVALUE CPUAVGVALUELAST MEMAVGVALUELASTstatismonth
192.168.1.115
30
200706
192.168.3.125
40
200706
192.168.1.1 16
35
200705
192.168.3.1 26
45
200705
目前在CPUAVGVALUELAST,MEMAVGVALUELAST这2列数据是空的
现想通过存储过程实现把200705月份的CPUAVGVALUE和MEMAVGVALUE的值insert到200706这一行中
即数据变成
Managerip CPUAVGVALUEMEMAVGVALUE CPUAVGVALUELAST MEMAVGVALUELASTstatismonth
192.168.1.115
30
16
35
200706
192.168.3.125
40
26
45
200706
192.168.1.1 16
35
200705
192.168.3.1 26
45
200705
对于200705月份的数据不修改。
我写了个procedure,但发现不生效
CREATE OR REPLACE PROCEDURE proc_cpu_mem_month (
day
innumber
) IS
p_date date;
p_managerip SMDR_ISM_CPU_MEM_MONTH.managerip%TYPE;
p_cpumaxvalue SMDR_ISM_CPU_MEM_MONTH.CPUMAXVALUE%TYPE;
p_cpuavgvalue SMDR_ISM_CPU_MEM_MONTH.CPUAVGVALUE%TYPE;
p_memmaxvalue SMDR_ISM_CPU_MEM_MONTH.memMAXVALUE%TYPE;
p_memavgvalue SMDR_ISM_CPU_MEM_MONTH.memAVGVALUE%TYPE;
Cursor cur_managerip is
select distinct managerip from SMDR_ISM_CPU_MEM_MONTH

where statismonth = to_char(p_date,'yyyymm');
BEGIN
savepoint a;
p_date:=trunc(sysdate-day);
Open cur_managerip;
Loop
Fetch cur_managerip into p_managerip;
Exit when cur_managerip%notfound;

select CPUMAXVALUE,CPUAVGVALUE, MEMMAXVALUE,MEMAVGVALUE into
p_CPUMAXVALUE,p_CPUAVGVALUE,p_MEMMAXVALUE,p_MEMAVGVALUE

from SMDR_ISM_CPU_MEM_MONTH
where managerip=p_managerip and statismonth = to_char(p_date-31,'yyyymm');
update SMDR_ISM_CPU_MEM_MONTH
set CPUAVGVALUELAST=p_CPUAVGVALUE,CPUMAXVALUELAST=p_CPUMAXVALUE,

MEMAVGVALUELAST=p_MEMAVGVALUE,MEMMAXVALUELAST=p_MEMMAXVALUE
where managerip=p_managerip and statismonth=to_char(p_date,'YYYYMM');
commit;
end loop;
close cur_managerip;

exception
when others then
rollback to a;

END proc_cpu_mem_month;
每月1日执行proc_cpu_mem_month(1);
但执行后发现数据未更新。
请高手指点一下!!!
回复

使用道具 举报

千问 | 2017-7-3 09:38:11 | 显示全部楼层
看了一下你的这个过程,感觉有很多问题。
不如直接执行下面的,或者把它加到过程里
update smdr_ism_cpu_mem_month t set
t.cpuavgvaluelast=(select a.cpuavgvalue from smdr_ism_cpu_mem_month a where a.managerip=t.managerip and a.statismonth='200705'),
t.memavgvaluelast=(select b.memavgvalue from smdr_ism_cpu_mem_month b where b.managerip=t.managerip and b.statismonth='200705')
where t.statismonth='200706'
回复

使用道具 举报

千问 | 2017-7-3 09:38:11 | 显示全部楼层
原帖由 guoq.lee 于 2008-7-3 19:31 发表
看了一下你的这个过程,感觉有很多问题。
不如直接执行下面的,或者把它加到过程里
update smdr_ism_cpu_mem_month t set
t.cpuavgvaluelast=(select a.cpuavgvalue from smdr_ism_cpu_mem_month a where a.managerip=t.managerip and a.statismonth='200705'),
t.memavgvaluelast=(select b.memavgvalue from smdr_ism_cpu_mem_month b where b.managerip=t.managerip and b.statismonth='200705')
where t.statismonth='200706'

谢谢guoq.lee 的回复,希望能对写的procedure问题给出一些建议。
由于5,6月份的数据有几千行数据,通过update smdr_ism_cpu_mem_month t set...这种方式执行非常慢。
回复

使用道具 举报

千问 | 2017-7-3 09:38:11 | 显示全部楼层
存储过程写得不好。
p_date:=trunc(sysdate-day);
这个DAY是干什么的?要知道 SYSDATE已经是2008年了。这可能导致你的循环为空。
WHEN OTHERS 应该去掉. 没有必要搞什么SAVE POINT
不要在循环里面COMMIT, 这可能导致 ORA-1555 错误
几千行数据算什么,小意思。能用单个SQL的决不用存储过程。
如果真的数据很多,CREATE NEW_TABLE AS SELECT ... 比UPDATE要快。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行