Erro de retorno de Função

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
  

Mensagemem Qua, 09 Mai 2007 8:26 pm

Galera tenho essa função:

Código: Selecionar todos
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

meu select:



[/code]
rickab7
Localização: campo grande

stephany henrique de almeida batista

Mensagemem Qui, 10 Mai 2007 3:25 pm

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.

Código: Selecionar todos
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;
dr_gori
Localização: Portland, OR USA

Thomas F. G

Você já respondeu a dúvida de alguém hoje?
http://glufke.net/oracle/search.php?search_id=unanswered

Mensagemem Qui, 17 Mai 2007 10:56 am

Seria Interessante você tratar o When_no_tada_found e when too_many_rows nestas Duas selects.

desta Forma não vai cair Fora de function se ocorrer algum erro.

Código: Selecionar todos
      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;
TBou
Localização: Campo Grande - MS

Thiago Bourscheidt
thiago.info@apoiorural.com.br
Analista de Sistemas

Mensagemem Qui, 17 Mai 2007 10:59 am

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

Código: Selecionar todos
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;
TBou
Localização: Campo Grande - MS

Thiago Bourscheidt
thiago.info@apoiorural.com.br
Analista de Sistemas



Voltar para SQL

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

cron