oracle表有几百万数据,我要把日期那一列修改为本年的随机一天该怎么写存储过程啊
答案:2 悬赏:40 手机版
解决时间 2021-03-01 13:13
- 提问者网友:太高姿态
- 2021-02-28 18:08
oracle表有几百万数据,我要把日期那一列修改为本年的随机一天该怎么写存储过程啊
最佳答案
- 五星知识达人网友:荒野風
- 2021-02-28 19:28
表名为test,日期字段为sysdatetime,直接执行匿名块即可
declare
cursor c_cur is select * from test
for update;
v_year varchar(20);
v_J varchar2(50);
v_logintime varchar2(50);
begin
select to_char(sysdate,'yyyy') into v_year from dual;
v_year := v_year||'-01-01';
select to_char(TO_DATE(v_year,'yyyy-mm-dd'),'J') into V_J from DUAL;
for i in c_cur loop
select to_char(TO_DATE(trunc(DBMS_RANDOM.VALUE(V_J,V_J+364)),'J'),'yyyy-mm-dd') into v_logintime from DUAL;
update test1 set sysdatetime=to_date(v_logintime,'yyyy-mm-dd')
where current of c_cur;
end loop;
commit;
end;
declare
cursor c_cur is select * from test
for update;
v_year varchar(20);
v_J varchar2(50);
v_logintime varchar2(50);
begin
select to_char(sysdate,'yyyy') into v_year from dual;
v_year := v_year||'-01-01';
select to_char(TO_DATE(v_year,'yyyy-mm-dd'),'J') into V_J from DUAL;
for i in c_cur loop
select to_char(TO_DATE(trunc(DBMS_RANDOM.VALUE(V_J,V_J+364)),'J'),'yyyy-mm-dd') into v_logintime from DUAL;
update test1 set sysdatetime=to_date(v_logintime,'yyyy-mm-dd')
where current of c_cur;
end loop;
commit;
end;
全部回答
- 1楼网友:荒野風
- 2021-02-28 20:00
declare
v_id int;
v_value date;
v_days_on_year int;
-- 定义游标.
cursor c_test_main is
select id, value from test_main
for update;
begin
-- 计算本年多少天
v_days_on_year := trunc( add_months(sysdate,12), 'yyyy' ) - trunc( sysdate, 'yyyy' );
-- 打开游标.
open c_test_main;
-- 填充数据.
fetch c_test_main into v_id, v_value;
-- 假如检索到了数据,才处理.
while c_test_main%found loop
-- 更新数据.
update
test_main
set
value = trunc( sysdate, 'yyyy' ) + trunc(dbms_random.value(0, v_days_on_year-1))
where
current of c_test_main;
-- 填充下一条数据.
fetch c_test_main into v_id, v_value;
end loop;
-- 关闭游标
close c_test_main;
end;
/
主要知识点:
1. trunc( sysdate, 'yyyy' ) 取本年第一天
2. trunc( add_months(sysdate,12), 'yyyy' ) 明年的第一天
3. dbms_random.value(0, v_days_on_year-1)) 获取一个 0 - 天数之间的 随机数
不过数据量几百万, 不知道是不是需要 中间 提交几次。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯