3
Speaking of variables that can be declared within Begin, I saw that it has Declare and set only that I don’t know when to use them. I saw that you have set @x, set x, set x = x+1, set x := x+1; they all confuse me and I don’t know what they’re right for.
I have this code that is to get the code of the product that each customer more bought. I wanted him to take the first client of each code and show it, because I ordered it down.
You’re leaving as follows: product name, code Product, client, qtdComprada;
ABAJUR 15 JOSE TAVARES DE OLUVEIRA 2
LAPISEIRA 1.2 10 JOSE TAVARES DE OLUVEIRA 1
CAIXA DE SOM 16 JOSE TAVARES DE OLUVEIRA 1
CANETA VERMELHA 3 MANOEL JOAQUIM PURTUGA 2
LAPISEIRA 0.9 9 MANOEL JOAQUIM PURTUGA 1
I wanted to show the first line of each customer.
DROP PROCEDURE IF EXISTS uspProdutoMaisCompradoCliente $$
CREATE PROCEDURE uspProdutoMaisCompradoCliente ()
BEGIN
DECLARE done BOOLEAN DEFAULT FALSE;
DECLARE vNomeProd VARCHAR(250);
DECLARE vNomeCli VARCHAR(250);
DECLARE vQtdComprProd INT(11);
DECLARE contador int;
DECLARE cursor_a CURSOR FOR (
select produto.nome as nomeProd, cliente.nome as cliente,
count(produto.codigo) as qtdComprProd
from cliente
inner join nota_fiscal
on cliente.codigo = nota_fiscal.cod_cliente
inner join item_nota_fiscal
on item_nota_fiscal.numero_nf = nota_fiscal.numero_nf
inner join produto
on produto.codigo = item_nota_fiscal.cod_produto
group by produto.nome , produto.codigo , cliente.nome , cliente.codigo
order by cliente.nome, qtdComprProd desc
);
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = TRUE;
DROP TEMPORARY TABLE IF EXISTS tempTabela;
CREATE TEMPORARY TABLE tempTabela (
tNomeProd VARCHAR(250),
tNomeCli VARCHAR(250),
tQtdComprProd INT(11)
);
OPEN cursor_a;
REPEAT
FETCH cursor_a INTO vNomeProd,vNomeCli, vQtdComprProd;
IF NOT done THEN
INSERT INTO tempTabela VALUES (vNomeProd, vNomeCli, vQtdComprProd);
END IF;
UNTIL done END REPEAT;
close cursor_a;
SELECT * FROM tempTabela;
END $$
DELIMITER ;
Tables:
CREATE TABLE ESTADO (
ESTADO VARCHAR(02) NOT NULL,
NOME VARCHAR(100) NOT NULL,
PRIMARY KEY (ESTADO)
) ;
CREATE TABLE CIDADE (
CODIGO INTEGER NOT NULL,
NOME VARCHAR(250) NOT NULL,
ESTADO VARCHAR(02),
PRIMARY KEY (CODIGO),
FOREIGN KEY (ESTADO) REFERENCES ESTADO (ESTADO)
) ;
CREATE TABLE CLIENTE (
CODIGO INT NOT NULL AUTO_INCREMENT,
NOME VARCHAR(250) NOT NULL,
RUA VARCHAR(250),
NUMERO VARCHAR(10),
COD_CIDADE INTEGER,
PRIMARY KEY (CODIGO),
FOREIGN KEY (COD_CIDADE) REFERENCES CIDADE (CODIGO)
);
CREATE TABLE FORNECEDOR (
CODIGO INTEGER NOT NULL,
NOME VARCHAR(250) NOT NULL,
RUA VARCHAR(250),
NUMERO VARCHAR(10),
COD_CIDADE INTEGER,
PRIMARY KEY (CODIGO),
FOREIGN KEY (COD_CIDADE) REFERENCES CIDADE (CODIGO)
);
CREATE TABLE PRODUTO (
CODIGO INTEGER NOT NULL,
NOME VARCHAR(250) NOT NULL,
PCO_ATUAL_CPA DECIMAL(10,2),
PCO_ATUAL_VDA DECIMAL(10,2),
QTD_ESTOQUE INTEGER,
QTD_EST_MIN INTEGER,
QTD_EST_MAX INTEGER,
QTD_PTO_CPA INTEGER,
IDF_ATIVO_SN VARCHAR(01) DEFAULT 'S',
COD_FORNECEDOR INTEGER,
PRIMARY KEY (CODIGO),
FOREIGN KEY (COD_FORNECEDOR) REFERENCES FORNECEDOR (CODIGO)
) ;
CREATE TABLE NOTA_FISCAL (
NUMERO_NF INTEGER NOT NULL,
DTA_VENDA DATE NOT NULL,
COD_CLIENTE INTEGER,
VALOR_TOTAL DECIMAL(10,2),
PRIMARY KEY (NUMERO_NF),
FOREIGN KEY (COD_CLIENTE) REFERENCES CLIENTE (CODIGO)
) ;
CREATE TABLE ITEM_NOTA_FISCAL (
NUMERO_NF INTEGER NOT NULL,
COD_PRODUTO INTEGER NOT NULL,
QTD_VEDIDA INTEGER,
PCO_RECEBIDO DECIMAL(10,2),
PRIMARY KEY (NUMERO_NF, COD_PRODUTO),
FOREIGN KEY (NUMERO_NF) REFERENCES NOTA_FISCAL (NUMERO_NF),
FOREIGN KEY (COD_PRODUTO) REFERENCES PRODUTO (CODIGO)
) ;
I saw it again, but I made a mistake:
delimiter $$
DROP PROCEDURE IF EXISTS uspProdutoMaisCompradoCliente $$
CREATE PROCEDURE uspProdutoMaisCompradoCliente ()
BEGIN
DECLARE done BOOLEAN DEFAULT FALSE;
DECLARE vNomeProd VARCHAR(250);
DECLARE vNomeCli VARCHAR(250);
DECLARE vQtdComprProd INT(11);
DECLARE contador int;
DECLARE cursor_a CURSOR FOR (
select produto.nome as nomeProd, cliente.nome as cliente,
count(produto.codigo) as qtdComprProd
from cliente
inner join nota_fiscal
on cliente.codigo = nota_fiscal.cod_cliente
inner join item_nota_fiscal
on item_nota_fiscal.numero_nf = nota_fiscal.numero_nf
inner join produto
on produto.codigo = item_nota_fiscal.cod_produto
group by produto.nome , produto.codigo , cliente.nome , cliente.codigo
order by cliente.nome, qtdComprProd desc
);
set @itens :=produto.nome as nomeProd, cliente.nome as cliente, count(produto.codigo) as qtdComprProd;
DECLARE cursor_b CURSOR FOR (
select @itens from cliente
inner join nota_fiscal
on cliente.codigo = nota_fiscal.cod_cliente
inner join item_nota_fiscal
on item_nota_fiscal.numero_nf = nota_fiscal.numero_nf
inner join produto
on produto.codigo = item_nota_fiscal.cod_produto
group by produto.nome , produto.codigo , cliente.nome , cliente.codigo
order by cliente.nome, qtdComprProd desc
);
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = TRUE;
DROP TEMPORARY TABLE IF EXISTS tempTabela;
CREATE TEMPORARY TABLE tempTabela (
tNomeProd VARCHAR(250),
tNomeCli VARCHAR(250),
tQtdComprProd INT(11)
);
OPEN cursor_a;
OPEN cursor_b;
REPEAT
FETCH cursor_a INTO vNomeProd,vNomeCli, vQtdComprProd;
IF NOT done THEN
INSERT INTO tempTabela VALUES (vNomeProd, vNomeCli, vQtdComprProd);
END IF;
UNTIL done END REPEAT;
close cursor_a;
SELECT * FROM tempTabela;
END $$
DELIMITER ;
DECLARE is when you declare a variable and its type... (at the beginning of its creation), SET is when you want to change its behavior, and "arrow" some value for this declared variable.
– Ivan Ferrer
Redo wrong. Items is a variable, which contains a string, if you do not put the quotes, you will be breaking everything.
– Ivan Ferrer
In the answer I did not do so.
– Ivan Ferrer