How do I create a function that returns the lowest expiration date between batches of a given product?

1

How do I create a function that returns the lowest expiration date between batches of a given product?

Dry my SQL code:

create database Exemplo;

use Exemplo;
create table produto
(codProduto integer not null,
 nomeProduto varchar(50) not null,
 marca varchar(50) not null,
 precoCusto decimal(15,2) not null,
 precoVenda decimal(15,2) not null,
 primary key (codProduto)); 
 create table loteproduto
 (codProduto integer not null,
  codLote integer not null,
  nuLote char(10) not null,
  dtValidade date,
  primary key (codProduto, codLote),
  foreign key (codProduto) references produto(codProduto));
insert into produto (codProduto, nomeProduto, Marca, precoCusto, precoVenda) 
values (1, 'Inseticida 500 ML', 'SBP',4,7),
       (2, 'Pastilha refil', 'SBP', 2,4),
       (3, 'Refrigerante guaraná', 'Pureza', 3,5),    
       (4, 'Refrigerante laranja', 'Pureza', 3,5),
       (5, 'Amaciante amarelo', 'Downy', 6,9),
       (6, 'Amaciante rosa', 'Downy', 4,5),
       (7, 'Frango', 'Sadia', 5,10),
       (8, 'Peru', 'Sadia', 5,10);
insert into loteproduto (codProduto, codLote, nuLote, dtValidade) 
values (1, 1, '399A',null),
       (1, 2, '323A','2012-12-31'),
       (2, 1, 'EF2A','2012-12-30'),
       (7, 1, 'EF3A',null);
    
asked by anonymous 26.11.2014 / 18:21

2 answers

1

Logically you need to return this (and filter if necessary by parameters) or a record or table as below:

  DROP PROCEDURE IF EXISTS 'ObterLoteMinimo';
  CREATE PROCEDURE 'ObterLoteMinimo'(IN inCodigoProduto integer, IN inCodLote integer)

  -- por produto e lote
  select
       codProduto,
       codLote,
       min(dtValidade)
  from
       loteproduto
  where
       codLote = inCodLote,
       codProduto = inCodigoProduto 
  group by
        codProduto, codLote;
    
26.11.2014 / 18:28
0

Using function :

delimiter $
create function getMenorDataValidade(p_codProduto integer) returns date
begin
    return (select min(loteproduto.dtValidade)
            from loteproduto
            where loteproduto.codProduto = p_codProduto);
end
$ delimiter ;
    
02.12.2014 / 20:06