Function return error

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

Poston Wed, 09 May 2007 8:26 pm

Guys I have this function:
Code: Select all
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
           

plus all her return is empty, can someone help me my select: [/code]
rickab7
Location: campo grande

stephany henrique de almeida batista

Poston Thu, 10 May 2007 3:25 pm

It gets a little hard to know what the problem is, because we don't have their base here to test.
But looking over, it looks like he's not even getting into the LOOP. Or is falling in some exception at the end of the routine.

Another thing you can improve is to use NVL rather than DECODE.

Code: Select all
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
Location: 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

Poston Thu, 17 May 2007 10:56 am

It would be interesting to you treat When_no_tada_found and when too_many_rows in these two select statements.

This way it won't fall off function if an error occurs.

Code: Select all
      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
Location: Campo Grande - MS

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

Poston Thu, 17 May 2007 10:59 am

Another cool thing you can do is put a When others General function giving a return -1 aiw if return -1 you'l know this occuring an error in the execution of the function
Code: Select all
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
Location: Campo Grande - MS

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



Return to SQL

Who is online

Users browsing this forum: No registered users and 4 guests