Bonjour,
je suis nouveau sous mysql et j'essaye de creer une pocedure assez simple.
Elle a ete acceptee mais le comportement est plutot bizarre.
Voici la table:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 create table down( user int not null, month varchar(7) not null, size int ); alter table down add constraint cUser_fk foreign key(user) references auth(id); create unique index iDown_x1 on down(user); create unique index iDown_x2 on down(user,month);
Ma proc, add_user_size(in user_id int, in month varchar(7), in size int) doit:
- creer une entree si il n'y a pas deja un couple (user_id, month)
- ajouter la size si il y a deja une entree
Voici le code
Lorsque je fais un premier call:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 DELIMITER $$ create procedure add_user_size( in user_id int, in month varchar(7), in size int ) begin declare month_exist int; declare c_size int; select count(*) into month_exist from down where user=user_id and month=month; if (month_exist > 0) then select size into c_size from down where user=user_id and month=month; set c_size = c_size + size; update down set size=c_size where user=user_id and month=month; else insert into down ( user, month, size ) values ( user_id, month, size ); end if; end $$ DELIMITER ;
Une ligne est cree.
Code : Sélectionner tout - Visualiser dans une fenêtre à part call add_user_size(3, "2013.10", 200);
Par contre qu'en ensuite je la reutilise avec:
La size passe a 600 au lieu de 500... oO
Code : Sélectionner tout - Visualiser dans une fenêtre à part call add_user_size(3, "2013.10", 300);
Si je continue, j'ai encore un comportement etrange.
- Quelqu'un peu m'expliquer ce qui ne va pas?
- Autre question, suis je oblige de passer par une premiere requete pour avoir le count(*) ou y a't'il un moyen de faire directement la requete pour avoir la size et ensuite tester si le select a eu des reponses?
- Derniere question: comment puis je passer le parametre size en inout afin de modifier cette variable (au lieu de c_size) et la retourner en output. Dois je faire un return size a la fin?
Merci d'avance.
Partager