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
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 ;
Lorsque je fais un premier call:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
call add_user_size(3, "2013.10", 200);
Une ligne est cree.
Par contre qu'en ensuite je la reutilise avec:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
call add_user_size(3, "2013.10", 300);
La size passe a 600 au lieu de 500... oO

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.