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:
Je teste le code de la façon suivante:
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;
Résultat affiché: {"nom": "Français", "valeurs": [1, 1]}
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);
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 :
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 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 le résultat
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;
value;list_id;disp;position
"Anglais";"2";"1";"0"
"Français";"1";"1";"1"
Partager