1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
| CREATE OR REPLACE PROCEDURE proc1 IS
TYPE numtab IS TABLE OF NUMBER INDEX BY binary_integer;
numt number_table;
TYPE dattab IS TABLE OF DATE INDEX BY binary_integer;
datt dattab;
high NUMBER;
cc1 varchar2(10);
cc2 varchar2(10);
sss varchar2(1000);
datex DATE;
datim DATE;
v_rec NUMBER;
BEGIN
INSERT INTO mylog(comments)
VALUES('Начало работы');
datt.DELETE;
numt := number_table();
--
SELECT COUNT(reg_date) INTO high -- определяем количество записей, где reg_date is not null
FROM mytest;
--
FOR i IN 1.. 5*high
LOOP
numt.extend;
numt(numt.COUNT) := round(dbms_random.VALUE(1,high)); -- создаем массив случайных чисел
END LOOP;
INSERT INTO mylog(comments)
VALUES('Массив случайных чисел создан');
--
FOR vv IN (SELECT reg_date, rownum nn
FROM mytest
WHERE reg_date IS NOT NULL )
loop
dbms_output.put_line('n='||vv.nn||' date='||vv.reg_date); -- пример серверного вывода в спул
datt(vv.nn) := vv.reg_date; -- создаем массив для перемешивания
END loop;
--
FOR i IN 1.. 5*high
loop
datex := datt(MOD(i, high)+1);
datt(MOD(i, high)+1) := datt(numt(i));
dbms_output.put_line('i='||i||' n='||numt(i)||' date_i='||datex||' date_n='||datt(numt(i)) ); -- второй пример серверного вывода в спул
datt(numt(i)) := datex; -- перемешиваем даты в массиве
END loop;
INSERT INTO mylog(comments)
VALUES('Перемешиваеие в массиве завершено');
--
FOR vv IN (SELECT id_rec, reg_date, rowid id, rownum nn
FROM mytest
WHERE reg_date IS NOT NULL )
LOOP
v_rec := vv.id_rec;
cc1 := to_char(last_day(vv.reg_date),'dd');
cc2 := to_char(datt(vv.nn),'dd');
datex:= vv.reg_date;
IF to_number(cc2) > to_number(cc1) THEN
cc2 := cc1;
END IF;
datim := to_date(cc2||'.'||to_char(datex,'mm.yyyy'),'dd.mm.yyyy');
UPDATE mytest
SET new_date = datim
WHERE rowid= vv.id;
INSERT INTO mylog(id_rec, old_date, new_date, comments)
VALUES(vv.id_rec, datex, datim, 'Произведена штатная замена. Использована дата '||to_char(datt(vv.nn),'dd.mm.yyyy'));
END loop;
INSERT INTO mylog(comments)
VALUES('Работа завершена');
COMMIT;
exception
WHEN others THEN
sss := SQLERRM;
INSERT INTO mylog(id_rec, old_date, new_date, comments)
VALUES(v_rec, datex, datim, 'Err: '||sss);
COMMIT;
raise;
END; |