Pular para o conteúdo
  • Este tópico contém 1 resposta, 2 vozes e foi atualizado pela última vez 17 anos atrás por Manoel872.
Visualizando 2 posts - 1 até 2 (de 2 do total)
  • Autor
    Posts
  • #85835
    santosclay
    Participante

      Bom 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
      BEGIN

      SELECT 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 5

      Alguém poderia me dizer o que estou fazendo de errado?

      Abraços Clayton.

      #85840
      Manoel872
      Participante

        SELECT 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

        Faz um teste coloca no where rownum=1, pois talvez esse select retorne mais de uma linha gerando o erro.

        Att,

        Manoel jr.

      Visualizando 2 posts - 1 até 2 (de 2 do total)
      • Você deve fazer login para responder a este tópico.