Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
em 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
em 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
-
em 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
em 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
Voltar para SQL
Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante