4 Replies Latest reply: Jun 2, 2017 9:09 AM by Douglas Schmitt RSS

    Rodar função do Oracle

    Douglas Schmitt

      Olá,

      Aqui na empresa temos uma função no Oracle que se passamos o ESTOQUE, PRODUTO, DIA e EMPRESA ela retorna o saldo do produto e como eu preciso criar um histórico mensal de saldos no QlikView pensei em utilizar essa função com um FOR passando todos os estoques, produtos, empresas e o último dia de cada mês.

       

      Para testar, utilizei um estoque, um produto e uma empresa, criando registros em 2017. O código foi esse:

      //42736 = 01/01/2017
      
      
      Set dataIni = '42736';
      let dif = ceil((monthstart(today())-Date(dataIni))/30);
      
      
      for i = 0 to $(dif)
      
      
      LET dt = AddMonths(MonthEnd($(dataIni)),i);
      
      
      LOAD
        *,
        AddMonths(MonthEnd($(dataIni)),$(i)) as Periodo;
      SQL SELECT es.cd_estoque,
        es.cd_produto,
        e.cd_multi_empresa,
        e.ds_estoque,
        p.ds_produto,
        dbamv.fnc_uvs_saldo_anterior(e.cd_estoque, p.cd_produto, '$(dt)',e.cd_multi_empresa) TOTAL
        FROM estoque e, produto p, est_pro es
      Where e.cd_estoque = es.cd_estoque
        and es.cd_produto = p.Cd_Produto
        and es.cd_estoque = 5
        and es.Cd_Produto = 825
        and e.cd_multi_empresa = 1;
      NEXT;
      
      
      

       

      E funcionou, dando este resultado:

      2017-06-02 - 002.png

       

      Sendo assim, apenas removi a parte do select abaixo:

        and es.cd_estoque = 5
        and es.Cd_Produto = 825
        and e.cd_multi_empresa = 1;
      
      

       

      Removendo esta parte, a ideia era pegar os saldos de todos os produtos, estoques, empresas do último dia de cada mês de 2017, porém apareceu o erro abaixo:

       

      2017-06-02 - 001.png

      QVX_UNEXPECTED_END_OF_DATA: SQL##f - SqlState: S1000, ErrorCode: 1000, ErrorMsg: [Oracle][ODBC][Ora]ORA-01000: máximo de cursores abertos excedido

      ORA-06512: em "DBAMV.VERIF_VL_FATOR_PROD", line 12

      ORA-06512: em "DBAMV.VERIF_VL_FATOR_PROD", line 83

      ORA-06512: em "DBAMV.FNC_UVS_SALDO_ANTERIOR", line 123

       

      LOAD

        *,

        AddMonths(MonthEnd(42736),0) as Periodo


      Então, alguém tem alguma ideia de como resolver este problema ?

       

      Obrigado.

        • Re: Rodar função do Oracle
          Clever Anjos

          Essa função "dbamv.fnc_uvs_saldo_anterior" deve estar abrindo um cursor que como são muitos dados deve estar estourando o limite de cursores abertos.


          Uma dúvida: Você não passa um parâmetro de data para a query? Não deveria estar passando?


          Possíveis saídas:

          • Discutir com o DBA se é possivel aumentar o limite de cursores
          • Verificar a lógica dessa função e reescrever em SQL puro, sem cursores
          • Fazer "fatiado" além data, por faixa de produtos ou empresas, ou algum campo que reduza o universo da consulta