質問するログイン新規登録

質問編集履歴

2

テストコード記載

2020/12/06 14:10

投稿

FujiCandy
FujiCandy

スコア13

title CHANGED
File without changes
body CHANGED
@@ -52,4 +52,58 @@
52
52
  tmpとしては、
53
53
  1の処理を以下のように保持し、2の結果をそれぞれ足しこむという処理になります。
54
54
  A,0100
55
- B,0200
55
+ B,0200
56
+
57
+ 今回の知りたかった場所の実装はできました。
58
+ コミットとロールバックテストはできてませんが、こんな感じでサンプルテスト。
59
+ ```ここに言語を入力
60
+ create table raw (id int,primary key(id));
61
+ insert into raw values(1),(2),(3);
62
+ create table tmp (id int,primary key(id));
63
+ create table hon (id int,primary key(id));
64
+
65
+ delimiter //
66
+
67
+ DROP PROCEDURE IF EXISTS ABC;
68
+ truncate table tmp;
69
+
70
+ CREATE PROCEDURE `ABC`()
71
+ Block1: begin
72
+ declare v_done int default 0;
73
+ declare v_id int;
74
+ declare dummy int default 0;
75
+ declare v_cur cursor for select * from raw;
76
+ declare continue handler for sqlstate '02000' set v_done = 1;
77
+
78
+ Start transaction;
79
+
80
+ open v_cur;
81
+ fetch v_cur into v_id;
82
+ while v_done != 1 do
83
+ if v_id <> 3 then
84
+ SET dummy = 0;
85
+ insert into tmp value (v_id) ON DUPLICATE KEY UPDATE id = v_id;
86
+ else
87
+ SET dummy = 0;
88
+ Block2: begin
89
+ declare v2_done int default 0;
90
+ declare v2_id int;
91
+ declare v2_cur cursor for select * from tmp;
92
+ declare continue handler for sqlstate '02000' set v2_done = 1;
93
+ open v2_cur;
94
+ fetch v2_cur into v2_id;
95
+ while v2_done != 1 do
96
+ insert into hon value (v2_id) ON DUPLICATE KEY UPDATE id = v2_id;
97
+ fetch v2_cur into v2_id;
98
+ end while;
99
+ End Block2;
100
+ end if;
101
+ fetch v_cur into v_id;
102
+ end while;
103
+
104
+ close v_cur;
105
+ COMMIT;
106
+ end Block1;
107
+ //
108
+ delimiter ;
109
+ ```

1

具体例の記載をしました。

2020/12/06 14:10

投稿

FujiCandy
FujiCandy

スコア13

title CHANGED
File without changes
body CHANGED
@@ -5,15 +5,8 @@
5
5
  Version:5.7.22-log
6
6
  分離レベル:REPEATABLE-READ
7
7
 
8
- データとしては以下の形式で、TBL内にいくつかの塊があってそれごとに処理するというものです。
8
+ TBL内にいくつかの塊があってそれごとに処理するというものです。
9
- 塊1,2020/12/01,1,AAA,09:00
9
+ ※最下部に具体データと処理概要を記載
10
- 塊1,2020/12/01,2,AAA,10:00
11
- 塊1,2020/12/01,3,AAA,11:00
12
- 塊1,2020/12/01,2,BBB,12:00
13
- 塊1,2020/12/01,3,BBB,13:00
14
- 塊1,2020/12/01,4,BBB,14:00
15
- 塊2,2020/12/01,1,BBB,09:00 …ここから別の塊
16
- ・・・続く。
17
10
 
18
11
  具体的なソースがまだなく、実装して動くかすらわからないですが、
19
12
  やりたいことは以下のようなフローです。
@@ -32,4 +25,31 @@
32
25
  END IF;
33
26
  カーソルA終了
34
27
  コミット
35
- ```
28
+ ```
29
+
30
+ データの例示が難しいので、処理概要も含めて具体的に記載します。
31
+ TBL_A(元データ) これが1つの塊です。必ず区分は1,4はあって1塊。
32
+ 日付,時刻,区分,種別
33
+ 20201205,0900,1,
34
+ 20201205,1000,2,A
35
+ 20201205,1100,3,A
36
+ 20201205,1200,2,A
37
+ 20201205,1300,3,B
38
+ 20201205,1500,2,B
39
+ 20201205,1700,3,B
40
+ 20201205,1800,4,
41
+ 日付違いが続く
42
+
43
+ 処理概要
44
+ 1.区分3→2の時間をそれぞれ求める。 A:1h B:2h
45
+ 2.区分2→3のすべての合計を求めて、種別数で割る。1h + 1h + 2h = 4h / 2 = 2h
46
+ 1に対して2を足しこみ、データを投入する。
47
+
48
+ 最終結果(TBL_B)
49
+ 20201205,A,0300
50
+ 20201205,B,0400
51
+
52
+ tmpとしては、
53
+ 1の処理を以下のように保持し、2の結果をそれぞれ足しこむという処理になります。
54
+ A,0100
55
+ B,0200