Bonjour

J'ai cherché toute la matinée mais je n'avance pas sur le sujet.
Je cherche à passer un json à une procédure et à traiter les différentes valeurs reçues.
Pour le moment, ma procédure est:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
 
create  procedure `test_js`(in `arg1` json)
begin
  select `arg1`->'$.liste[0]';
end;
Je teste le code de la façon suivante:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
 
set @js = '{"liste":[{"nom":"Français","valeurs":[1,1]},{"nom":"Anglais","valeurs":[2,1]}]}';
call test_js(@js);
Résultat affiché: {"nom": "Français", "valeurs": [1, 1]}

Jusque là, tout va bien !

Ce que je voudrais c'est récupérer chaque valeur du tableau "liste" sans connaître le nombre d'éléments du tableau.
Ici, il y en a 2 mais potentiellement plusieurs dans d'autres cas.
Le but est d'insérer plusieurs lignes dans une table à partir des valeurs de chaque ligne.
Pour chaque ligne je voudrai obtenir les valeurs de nom et les valeurs du tableau dans des variables.
Et là, je sèche. J'ai beau chercher sur le net, je ne trouve pas le bon tuto ou la bonne doc qui me dise comment faire.

Quelqu'un ici pourrait-il me donner une piste svp ?

...

Bon, à force d'acharnement :

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
 
use `import_modulr`;
truncate table `test`;
set @t = '{
  "liste": [
    {
      "nom": "Français",
      "valeurs": [1, 1, 1]
    },
    {
      "nom": "Anglais",
      "valeurs": [2, 1, 0]
    }
  ]
}';
call test_json_proc(@t);
select * from `test` `t`;
et la procédure

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
 
create
    definer = `root`@`%` procedure `test_json_proc`(in `values_list` json)
begin
    declare `t` int default 0;
    declare `line` json;
    declare `elem` json;
 
    set @`total` = json_length(`values_list` -> '$.liste');
    repeat
        set `line` = json_remove(`values_list` -> '$.liste', concat('$[', `t`, ']'));
        set `elem` = `line` -> '$[0]';
 
        insert into `test`
        values (`elem` ->> '$.nom', `elem` -> '$.valeurs[0]', `elem` -> '$.valeurs[1]', `elem` -> '$.valeurs[2]');
        set `t` = `t` + 1;
    until `t` = @`total` end repeat;
end;
et le résultat

value;list_id;disp;position
"Anglais";"2";"1";"0"
"Français";"1";"1";"1"