CREATE OR REPLACE FUNCTION humc_vl_contagem_ant
(contagem IN NUMBER ) RETURN number
IS
vl_produto NUMBER(16, 12);
qtd NUMBER(5);
vl_total NUMBER(16, 12);
BEGIN
vl_total := 0;
FOR C IN (SELECT * FROM itcontagem WHERE cd_contagem = contagem)
LOOP
SELECT Decode(qt_estoque, NULL, 0, qt_estoque) INTO qtd FROM copia_estoque WHERE cd_contagem = contagem AND cd_produto = c.cd_produto AND cd_lote = c.cd_lote AND qt_estoque > 0;
SELECT Decode(vl_ultima_entrada, NULL, 0, vl_ultima_entrada) INTO vl_produto FROM produto WHERE cd_produto = c.cd_produto;
vl_total := vl_total + (vl_produto * qtd);
END LOOP;
RETURN vl_total ;
END;
//Select
SELECT c.cd_contagem,
humc_vl_contagem_ant(c.cd_contagem)
FROM contagem c
mais todo retorno dela é vazio, alguém pode me ajudar
Fica um pouco difícil de saber qual é o problema, pois a gente não tem a sua base aqui pra testar.
Mas olhando por cima, parece que ele nem está entrando no LOOP. Ou está caindo em algum exception no fim da rotina.
Outra coisa que você pode melhorar é usar NVL em vez de DECODE.
CREATE OR REPLACE FUNCTION humc_vl_contagem_ant
(contagem IN NUMBER ) RETURN number
IS
vl_produto NUMBER(16, 12);
qtd NUMBER(5);
vl_total NUMBER(16, 12);
BEGIN
vl_total := 0;
FOR C IN (SELECT * FROM itcontagem WHERE cd_contagem = contagem)
LOOP
SELECT NVL(qt_estoque, 0)
INTO qtd
FROM copia_estoque
WHERE cd_contagem = contagem
AND cd_produto = c.cd_produto
AND cd_lote = c.cd_lote
AND qt_estoque > 0;
SELECT NVL(vl_ultima_entrada, 0)
INTO vl_produto
FROM produto
WHERE cd_produto = c.cd_produto;
vl_total := vl_total + (vl_produto * qtd);
END LOOP;
RETURN vl_total ;
END;
BEGIN
SELECT NVL(qt_estoque, 0)
INTO qtd
FROM copia_estoque
WHERE cd_contagem = contagem
AND cd_produto = c.cd_produto
AND cd_lote = c.cd_lote
AND qt_estoque > 0;
EXCEPTION
WHEN NO_DATA_FOUND THEN
qtd := 0;
END;
BEGIN
SELECT NVL(vl_ultima_entrada, 0)
INTO vl_produto
FROM produto
WHERE cd_produto = c.cd_produto;
EXCEPTION
WHEN NO_DATA_FOUND THEN
vl_produto := 0;
END;
Outra coisa legal a se fazer é colocar um When others geral da function dando um return -1 aiw se retornar -1 você já sabe que esta ocorrendo um erro na execução da function
CREATE OR REPLACE FUNCTION humc_vl_contagem_ant
(contagem IN NUMBER ) RETURN number
IS
vl_produto NUMBER(16, 12);
qtd NUMBER(5);
vl_total NUMBER(16, 12);
BEGIN
vl_total := 0;
FOR C IN (SELECT * FROM itcontagem WHERE cd_contagem = contagem)
LOOP
SELECT NVL(qt_estoque, 0)
INTO qtd
FROM copia_estoque
WHERE cd_contagem = contagem
AND cd_produto = c.cd_produto
AND cd_lote = c.cd_lote
AND qt_estoque > 0;
SELECT NVL(vl_ultima_entrada, 0)
INTO vl_produto
FROM produto
WHERE cd_produto = c.cd_produto;
vl_total := vl_total + (vl_produto * qtd);
END LOOP;
RETURN vl_total ;
EXCEPTION
WHEN OTHERS THEN
RETURN(-1);
END;