- Este tópico contém 1 resposta, 2 vozes e foi atualizado pela última vez 17 anos atrás por
Manoel872.
-
AutorPosts
-
17 de março de 2009 às 6:08 pm #85835
santosclay
ParticipanteBom dia a todos.
Pessoal preciso criar um função para retorna alguns calculos, no contexto que possuo hoje as contas se resumem em um calculo de valores e a busca de uma porcentagem.
Utilizando uma query eu faria:
SELECT CUSTO_PRODUTO.PERCENTUAL AS "PCT_PARAMETRO",
((CUSTO_PRODUTO.CUSTO_DIRETO * nValorConversor * nQuantidade) * (CUSTO_PRODUTO.PERCENTUAL / 100)) AS "VLR_PARAMETRO"
FROM DF31D.CUSTO_PRODUTO CUSTO_PRODUTO
CUSTO_PRODUTO.COD_ARMAZEM = 'I' AND
CUSTO_PRODUTO.COD_DIVISAO = 'I';
Dividindo para conquistar eu criaria duas funções, uma retornar a porcentagem e outra para retornar o valor e boas.
Agora prevendo uma possivel mudança de contexto de negocio, decidi criar type object (agora começa o pesadelo):
create or replace TYPE tParametroCusto IS OBJECT
(
nPorcentagemParametroCusto NUMBER(16,6),
nValorParametroCusto NUMBER(16,4)
);
e um Varray do mesmo:
create or replace TYPE vParametroCusto AS VARRAY(1) OF tParametroCusto;
Após isso criei a função a seguir:
create or replace FUNCTION CALCULA_PARAMETRO_CUSTO(nIdParametroCusto NUMBER, vArmazem VARCHAR, vDivisao VARCHAR, nNumeroParametroCusto NUMBER, nQuantidade NUMBER, nValorConversor NUMBER) RETURN vParametroCusto AS
aParametroCusto vParametroCusto := vParametroCusto(NULL);
nPorcentagem NUMBER := 0;
nValorParametro NUMBER := 0;
BEGIN
BEGINSELECT CUSTO_PRODUTO.PERCENTUAL AS "PCT_PARAMETRO",
((CUSTO_PRODUTO.CUSTO_DIRETO * nValorConversor * nQuantidade) * (CUSTO_PRODUTO.PERCENTUAL / 100)) AS "VLR_PARAMETRO"
INTO nPorcentagem, nValorParametro
FROM DF31D.CUSTO_PRODUTO CUSTO_PRODUTO
WHERE CUSTO_PRODUTO.COD_ARMAZEM = vArmazem AND
CUSTO_PRODUTO.COD_DIVISAO = vDivisao;
EXCEPTION
WHEN NO_DATA_FOUND THEN
nPorcentagem := 0;
nValorParametro := 0;
END;
aParametroCusto.EXTEND;
aParametroCusto(0).nPorcentagemParametroCusto := 1;
aParametroCusto(0).nValorParametroCusto := 1;
RETURN (aParametroCusto);
END CALCULA_PARAMETRO_CUSTO;
Ao executar a função recebo a seguinte mensagem:
DECLARE
teste vParametroCusto := vParametroCusto();
BEGIN
teste.EXTEND;
teste := CALCULA_PARAMETRO_CUSTO(48923343, 'I', 'I', 10, 20, 1);
DBMS_OUTPUT.PUT_LINE(teste(0).nPorcentagemParametroCusto);
DBMS_OUTPUT.PUT_LINE(teste(0).nValorParametroCusto);
END;
/
ERRO na linha 1:
ORA-06532: “Subscript outside of limit” (Subscrito além do limite)
ORA-06512: em “XXXXX.CALCULA_PARAMETRO_CUSTO”, line 18
ORA-06512: em line 5Alguém poderia me dizer o que estou fazendo de errado?
Abraços Clayton.
17 de março de 2009 às 7:29 pm #85840Manoel872
ParticipanteSELECT CUSTO_PRODUTO.PERCENTUAL AS “PCT_PARAMETRO”,
((CUSTO_PRODUTO.CUSTO_DIRETO * nValorConversor * nQuantidade) * (CUSTO_PRODUTO.PERCENTUAL / 100)) AS “VLR_PARAMETRO”
INTO nPorcentagem, nValorParametro
FROM DF31D.CUSTO_PRODUTO CUSTO_PRODUTO
WHERE CUSTO_PRODUTO.COD_ARMAZEM = vArmazem AND
CUSTO_PRODUTO.COD_DIVISAO = vDivisaoFaz um teste coloca no where rownum=1, pois talvez esse select retorne mais de uma linha gerando o erro.
Att,
Manoel jr.
-
AutorPosts
- Você deve fazer login para responder a este tópico.