对于每个供应商(名称),显示其供应的物品的名称。练习游标嵌套 MySQL

For each supplier(name) show the names of the items it supplies. EXERCISES CURSOR NESTED MySQL

对于每个供应商(名称)显示其供应的项目的名称。

Files.sql

我的数据库中恰好有以下数据

数据库创建和删除

DROP DATABASE IF EXISTS almacen;

CREATE DATABASE IF NOT EXISTS almacen;

创建数据并将其添加到 table 文章

USE almacen;

CREATE TABLE articulos(
    cod_art VARCHAR(6) PRIMARY KEY,
    descripcion VARCHAR(45),
    precio FLOAT,
    stock INT,
    caducidad BOOLEAN,
    cod_prov VARCHAR(4),
    observaciones VARCHAR(45)
);

INSERT INTO articulos VALUES('DR-001','Lejia',0.80,18,FALSE,'A002','Muy Toxica'),
                            ('DR-002','Suavizante',2.40,10,FALSE,'A001','No volcar'),
                            ('DR-003','Quitamancha',5.00,18,FALSE,'B001','Muy Toxico'),
                            ('PA-001','Pan',1.00,35,TRUE,'B001','No tocar con las manos'),
                            ('PA-002','Palmerita',2.10,8,TRUE,'A001','Aplicar max 5 paquetes'),
                            ('PA-003','Napolitana',1.00,44,TRUE,'A002','Chocolate crema'),
                            ('VE-001','Lechuga',1.50,27,TRUE,'B002','No meter en la nevera'),
                            ('VE-002','Zanahoria',3.00,330,TRUE,'A001','No meter en la nevera');

创建并向客户添加数据table

CREATE TABLE clientes(
    cod_cliente INT AUTO_INCREMENT PRIMARY KEY,
    dni VARCHAR(9),
    nombreCli VARCHAR(25),
    ap1 VARCHAR(35),
    ap2 VARCHAR(35),
    descuento INT
);

INSERT INTO clientes VALUES(null,'45098765G','Juan','Perez','Soler',5),
                           (null,'33456739H','Antonio','Garcia','Toro',8),
                           (null,'23478962S','Ramon','Gonzalez','Tamudo',0),
                           (null,'45765432F','Jesus','Duarte','Fortes',4),
                           (null,'29876098G','Gabriel','Lopez','Vazquez',2);

创建数据并将其添加到 detallesFacturas

CREATE TABLE detallesFacturas(
    nFactura INT,
    cod_art VARCHAR(6),
    cantidad INT,
    desc_especial INT,
    PRIMARY KEY (nFactura,cod_art)
);

INSERT INTO detallesFacturas VALUES(6,'DR-003',5,2),
                                   (6,'PA-002',2,6),
                                   (7,'DR-003',4,0),
                                   (7,'DR-002',2,2),
                                   (8,'VE-002',3,5),
                                   (8,'PA-001',7,5),
                                   (1,'DR-001',2,2),
                                   (1,'PA-002',5,0),
                                   (1,'DR-002',10,4),
                                   (1,'VE-001',3,0),
                                   (2,'DR-002',2,4),
                                   (2,'VE-002',3,5),
                                   (2,'PA-001',2,2),
                                   (3,'PA-002',4,4),
                                   (3,'VE-002',1,3),
                                   (3,'DR-001',3,2),
                                   (4,'PA-001',2,0),
                                   (4,'PA-002',3,5),
                                   (4,'VE-002',2,2),
                                   (5,'VE-001',4,6),
                                   (5,'PA-001',3,3);

创建数据并将其添加到 facturas

CREATE TABLE facturas(
    nFactura INT AUTO_INCREMENT PRIMARY KEY,
    nCliente INT,
    fecha DATE,
    forma_pago VARCHAR(20)
);

INSERT INTO facturas VALUES(null,3,'2007-10-10','Contado'),
                           (null,2,'2007-10-11','Contado'),
                           (null,5,'2007-10-11','Cheque'),
                           (null,1,'2007-10-12','Transferencia'),
                           (null,5,'2007-10-14','Contado'),
                           (null,1,'2007-10-16','Cheque'),
                           (null,2,'2007-10-16','Transferencia'),
                           (null,4,'2007-10-17','Contado');

创建数据并将其添加到证明者

CREATE TABLE proveedores(
    cod_prov VARCHAR(4) PRIMARY KEY,
    nombre_prov VARCHAR(30),
    telefono VARCHAR(9),
    ciudad VARCHAR(20),
    descuento_1 INT,
    descuento_2 INT
);

INSERT INTO proveedores VALUES('A001','Distribuciones Sur','956525354','Ceuta',5,10),
                              ('A002','Todomasa SL','952875309','Malaga',3,6),
                              ('A003','La mancha pastelera','953709912','Jaen',15,20),
                              ('B001','Romelsa','912345762','Madrid',10,20),
                              ('B002','Gegatur SL','933988344','Barcelona',7,13);

Cursor.sql

USE almacen;
DELIMITER $$
DROP PROCEDURE IF EXISTS art $$
CREATE PROCEDURE art()
BEGIN

    DECLARE fin boolean;
    DECLARE c1_codProv VARCHAR(4);
    DECLARE c1_nomProv VARCHAR(30);
    DECLARE c2_Articulos VARCHAR(20);
    DECLARE cur_proveedor CURSOR FOR SELECT cod_prov,nombre_prov FROM proveedores;
    DECLARE cur_articulos CURSOR FOR SELECT descripcion FROM articulos WHERE cod_prov=c1_codProv;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET fin=true;
 
    SET fin=0;
    
    OPEN cur_proveedor;
    FETCH cur_proveedor INTO c1_codProv,c1_nomProv;
    WHILE fin=false DO
    
        SELECT c1_nomProv;
        FETCH cur_proveedor INTO c1_codProv,c1_nomProv;
        
        OPEN cur_articulos;
        FETCH cur_articulos INTO c2_Articulos;
        
        WHILE fin=false DO
        
            SELECT c2_Articulos;
            FETCH cur_articulos INTO c2_Articulos;
            
        END WHILE;
        
        SET fin = false;
        CLOSE cur_Articulos;
        FETCH cur_proveedor INTO c1_codProv,c1_nomProv;
        
     END WHILE;
     
     CLOSE cur_proveedor;
     
END $$
DELIMITER ;

call art();

我的光标让我失望,因为它没有 return 预期的结果。例如 DISTRIBUCIONES SUR 应该给我 SUAVIZANTE、PALMERITA 和 ZANAHORIA.

RUN EXAMPLE

我找到了我的错误。事实证明我有一个遗留的提取物,这就是为什么它打断了我并且没有正确地给我它,因为它覆盖了我以前的东西。

剩下的抓取就是被评论的抓取

USE almacen;
DELIMITER $$
DROP PROCEDURE IF EXISTS art $$
CREATE PROCEDURE art()
BEGIN

    DECLARE fin boolean DEFAULT FALSE;
    DECLARE c1_codProv VARCHAR(4);
    DECLARE c1_nomProv VARCHAR(30);
    DECLARE c2_Articulos VARCHAR(20);
    DECLARE cur_proveedor CURSOR FOR SELECT cod_prov,nombre_prov FROM proveedores;
    DECLARE cur_articulos CURSOR FOR SELECT descripcion FROM articulos WHERE cod_prov=c1_codProv;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET fin=true;
    
    OPEN cur_proveedor;
    FETCH cur_proveedor INTO c1_codProv,c1_nomProv;
    WHILE fin=FALSE DO
    
        SELECT c1_nomProv;
       # FETCH cur_proveedor INTO c1_codProv,c1_nomProv;
        
        OPEN cur_articulos;
        FETCH cur_articulos INTO c2_Articulos;
        
        WHILE fin=FALSE DO
        
            SELECT c2_Articulos;
            FETCH cur_articulos INTO c2_Articulos;
            
        END WHILE;
        
        SET fin = FALSE;
        CLOSE cur_Articulos;
        FETCH cur_proveedor INTO c1_codProv,c1_nomProv;
        
     END WHILE;
     SET fin = FALSE;
     CLOSE cur_proveedor;
     
END $$
DELIMITER ;

call art();

运行 示例: