MySQL - Recibir JSON en procedimiento almacenado

 
Vista:
sin imagen de perfil

Recibir JSON en procedimiento almacenado

Publicado por Eduardo (5 intervenciones) el 14/04/2023 00:12:03
Saludos colegas,

Tengo el siguiente arreglo en formato JSON:

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
{
  "vc_stamp": "00120230403194906",
  "vc_local_id": 2,
  "vc_doc_fech": "20230403194906",
  "vc_doc_tipo": 2,
  "vc_crd_dias": 0,
  "vc_crd_venc": "20230403  ",
  "vc_pgo_efec": 20.00,
  "vc_pgo_visa": 0.00,
  "vc_pgo_mast": 0.00,
  "vc_pgo_amer": 0.00,
  "vc_pgo_vuel": 3.50,
  "vc_clie_id": 0,
  "vc_user_id": "EF  ",
  "items":
  [
    {
      "vd_arti_id": 292,
      "vd_unids": 10,
      "vd_prec_ttl": 3.00
    },
    {
      "vd_arti_id": 757,
      "vd_unids": 10,
      "vd_prec_ttl": 13.50
    }
  ]
}

Necesito hacer un procedimiento almacenado que reciba este json y con los datos inserte registros en las tablas 'proformas_cab' y 'proformas_det':

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
CREATE PROCEDURE sp_insert_proforma( IN data JSON)
BEGIN
 
DECLARE cStamp CHAR(17);
DECLARE nLocal INT ;
DECLARE cFecha CHAR(15) ;
 
SET cStamp = JSON_UNQUOTE( JSON_EXTRACT( data , "$.vc_stamp" ) ) ;
SET nLocal = JSON_UNQUOTE( JSON_EXTRACT( data , "$.vc_local_id" ) ) ;
SET cFecha = JSON_UNQUOTE( JSON_EXTRACT( data , "$.vc_doc_fech" ) ) ;
...
 
INSERT INTO proformas_cab (vc_stamp,vc_local_id,vc_doc_fech)
        VALUES ( cStamp , nLocal , cFecha ) ;
 
END;

Lo que no encuentro como hacer es iterar la sección "items" para poder insertar dichos datos en la tabla 'proformas_det'. Agradeceré cualquier ayuda.

Cordiales saludos.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil

Recibir JSON en procedimiento almacenado

Publicado por Eduardo (5 intervenciones) el 20/04/2023 01:52:28
Saludos a todos,

Ya encontré la respuesta, y no me la dio ningún experto HUMANO:

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
DELIMITER $$
 
CREATE PROCEDURE insertar_proforma(IN json_proforma JSON)
BEGIN
    DECLARE id_doc INT;
    DECLARE id_cli INT;
    DECLARE id_usr INT;
    DECLARE i INT DEFAULT 0;
    DECLARE n INT;
 
    SET n = JSON_LENGTH(json_proforma -> '$.items');
 
    IF n > 0 THEN
        SET id_doc = json_proforma ->> '$.id_documento';
        SET id_cli = json_proforma ->> '$.id_cliente';
        SET id_usr = json_proforma ->> '$.id_usuario';
 
        INSERT INTO proformas_cab (id_documento, id_cliente, id_usuario) VALUES (id_doc, id_cli, id_usr);
 
        WHILE i < n DO
            INSERT INTO proformas_det (id_producto, cantidad, precio_unitario)
            VALUES (JSON_EXTRACT(json_proforma, CONCAT('$.items[', i, '].id_producto')),
                    JSON_EXTRACT(json_proforma, CONCAT('$.items[', i, '].cantidad')),
                    JSON_EXTRACT(json_proforma, CONCAT('$.items[', i, '].precio_unitario')));
            SET i = i + 1;
        END WHILE;
    END IF;
END $$
 
DELIMITER ;

Una semana buscando videos de youtube e información en la red y CHAT GPT me dio la solución en menos de un minuto. Ese código lo escribio CHAT GPT en su totalidad.

Allí les dejo la solución para aquellos que estén buscando este tema. Esto debería estar en los cursos básicos ya que es la forma más idonea de crear operaciones CRUD tipo MAESTRO/DETALLES, ya que cualquier lenguaje de programación que uses en el frontend puede elaborar archivos JSON.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar