1. This site uses cookies. By continuing to use this site, you are agreeing to our use of cookies. Learn More.

  2. Anuncie Aqui ! Entre em contato fdantas@4each.com.br

Progress/Oracle: ** máximo de cursores abertos excedido

Discussão em 'Progress 4GL' iniciado por ds201, Dezembro 19, 2019.

  1. ds201

    ds201 Membro Participativo

    Bom dia a todos

    Tenho um cliente que usa Progress com um banco Oracle.
    Neste cliente há um programa apresentando o erro abaixo.
    Não tenho experiência com o Oracle.
    Alguma ideia de como resolver este problema? Ou melhor: Como evita-lo?
    O que leva a este erro?

    ORACLE error -1000 veja "ORACLE Error Messages and Codes Manual". (1252)
    ** máximo de cursores abertos excedido

    Obrigado
  2. ds201

    ds201 Membro Participativo

    O mais estranho é que o erro esta ligado ao "For each".
    Mesmo quando eu comento o que esta dentro do loop o erro se mantém.

    for each HCM.mapa_risco
    no-lock:

    process events.
    /*
    create tt-gera-plan-CSV.
    assign
    tt-gera-plan-CSV.campo-de--label = "cdn_plano_lotac"
    tt-gera-plan-CSV.campo-de = string(HCM.mapa_risco.cdn_plano_lotac)
    tt-gera-plan-CSV.campo-para = string(HCM.mapa_risco.cdn_plano_lotac).
    release tt-gera-plan-CSV.
    */
    end.
  3. bootstrapmaster

    bootstrapmaster Moderator Moderador Equipe de Suporte

    acredito que seja problemas pra equipe de infra, provavel que o meta esquema do progress esteja divergente do oracle, isso pode acontecer na hora de fazer atualizações, vai ter que revisar essa parte, contece com todos os for each ou só com algumas tabelas especificas ?
  4. ds201

    ds201 Membro Participativo

    Bom dia

    O erro não acontece para todos os "for each".

    O fonte abaixo esta apresentado erro.

    Código:
    /*----------------------------------------------------------------------------------*/
    /*--- Mostra a quantidade de registros nas planilhas informadas.                 ---*/
    /*----------------------------------------------------------------------------------*/
    
    def var h_acomp  as handle no-undo.
    def var c-tabela as char   no-undo.
    
    run utp/ut-acomp.p persistent set h_acomp.
    run pi-inicializar in h_acomp (input "Estudando o ambiente...").
    
    input  from C:\TMP\01__Lˆ_Plan__Conta_reg_tab\Lista_de_TABELAS__Entrada.txt.
    output to   C:\tmp\Rel_01___.txt.
    
    repeat:
       import unformatted c-tabela.
       assign c-tabela = lc(c-tabela).
      
       find shhcm._file
          where shhcm._file._file-name = trim(c-tabela)
          no-lock
          no-error.
    
       if avail shhcm._file then do:
          run C:\TMP\01__Lˆ_Plan__Conta_reg_tab\Le_plan__Conta_reg_tab_det.p shhcm._file._file-name.
       end.
       else do:
          put
             caps(c-tabela) format "x(40)"
             " | "
             -1             format "->>>,>>9"
             skip.
       end.
    end.
    
    run pi-finalizar in h_acomp.
    input close.
    output close.
    /*--- fim ---*/
    
    Código:
    /*----------------------------------------------------------------------------------*/
    /*--- Mostra a quantidade de registros nas planilhas informadas. DET.            ---*/
    /*----------------------------------------------------------------------------------*/
    
    def var i-qtd-reg as int no-undo init 0.
    
    for each {1}
       no-lock:
    
       process events.
       assign i-qtd-reg = i-qtd-reg + 1.
    end.
    
    put
       "{1}"       format "x(40)"
       " | "
       i-qtd-reg   format "->>>,>>9"
       skip.
    
    return "OK".
    /*--- fim ---*/
    

    Obrigado
  5. ds201

    ds201 Membro Participativo

    Já este outro código este funcionando sem problemas.

    Código:
    /*----------------------------------------------------------------------------------*/
    /*--- Lista campos (parte de ¡ndice Primario).                                 ---*/
    /*--- Esta versÆo lista TODOS os campos que sÆo parte de ¡ndice pr¡m rio.        ---*/
    /*----------------------------------------------------------------------------------*/
    
    define temp-table tt-guia no-undo
       field tabela           like _file._file-name
       field indice           like _index._index-name
       field indice-seq       like _index-field._index-seq
       field nome-campo       like _field._field-name
       field extent-campo     like _field._extent
       field tipo-campo       like _field._data-type
       field obs-1            as char format "x(30)"
       index i-guia is primary
          tabela
          indice
          indice-seq
          nome-campo.
    
    def var h_acomp           as handle no-undo.
    def var c-tabela          as char   no-undo.
    def var i-num-reg-lidos   as int    no-undo.
    
    run utp/ut-acomp.p persistent set h_acomp.
    run pi-inicializar in h_acomp (input "Estudando o ambiente...").
    
    output to C:\tmp\Rel_02__Full___.txt convert source "ibm850" unbuffered.
    
    /*--- Lˆ estrutura de ¡ndices e grava temp-table "tt-guia" ---------------*/
    assign i-num-reg-lidos = 0.
    
    for each _file
       where not _hidden
       no-lock,
       each _index of _file
       no-lock
       by _file-name:
      
       process events.
       assign i-num-reg-lidos = i-num-reg-lidos + 1.
       run pi-acompanhar in h_acomp(input "Fase 1/2 Monta tt-guia " + string(i-num-reg-lidos)).
    
       for each _index-field of _index:
          find _field of _index-field
             no-error.
               
          if available (_field) then do:
             if _field._data-type <> "date"    and
                _field._data-type <> "logical" then do:
                create tt-guia.
                assign
                   tt-guia.tabela        = _file._file-name
                   tt-guia.indice        = _index._index-name
                   tt-guia.indice-seq    = _index-field._index-seq
                   tt-guia.nome-campo    = _field._field-name
                   tt-guia.extent-campo  = _field._extent
                   tt-guia.tipo-campo    = _field._data-type
                   tt-guia.obs-1         = if _field._extent <> 0 then 'CUIDADO_1: _field._extent <> 0.' else ''.
                release tt-guia.
             end.
          end.
       end.
    end.
    
    /*--- Lista a temp-table "tt-guia" ---------------------------------------*/
    assign i-num-reg-lidos = 0.
    
    for each tt-guia
       no-lock
       by tt-guia.tabela
       by tt-guia.indice
       by tt-guia.indice-seq
       by tt-guia.nome-campo:
      
       process events.
       assign i-num-reg-lidos = i-num-reg-lidos + 1.
       run pi-acompanhar in h_acomp(input "Fase 2/2 Lista tt-guia " + string(i-num-reg-lidos)).
    
       display
          tt-guia
          with width 200.
    end.
    
    run pi-finalizar in h_acomp.
    output close.
    /*--- fim ---*/
    
    
  6. bootstrapmaster

    bootstrapmaster Moderator Moderador Equipe de Suporte

    o seu problema está na passagem dos dados, na macro substituição, tenta usar query dinamica, se quer só contar os registros, pode usar um select também ...
    Código:
    define variable icount as integer no-undo.
    select count(*) into iCount from emitente.
    disp iCount.
    
    Quem sabe o select não sobrecarregue a memoria da sessão.

Compartilhe esta Página