Qlik Community

Qlik Brasil

Group community for Brazil users. discussion only in Portuguese.

Highlighted
dairan73
New Contributor III

Rodar função do Oracle

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.

1 Solution

Accepted Solutions
Employee
Employee

Re: Rodar função do Oracle

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
4 Replies
Employee
Employee

Re: Rodar função do Oracle

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
dairan73
New Contributor III

Re: Rodar função do Oracle

Sobre a data, a ideia é passar o último dia de cada mês com o for.


dbamv.fnc_uvs_saldo_anterior(e.cd_estoque, p.cd_produto, '$(dt)',e.cd_multi_empresa)

Por isso criei a variável 'dt'.

mario_sergio_ti
Valued Contributor

Re: Rodar função do Oracle

Amigo;

Se o seu usuário tiver permissões elevadas no BD, poderá abrir a função para saber o que faz;

Ou poderá rodar a query abaixo para pegar a consulta que sua query realiza no banco (usuário tem que ter permissões nas tabelas citadas).


Select S.USERNAME, s.sid, s.osuser, t.sql_id, sql_text

    From v$sqltext_with_newlines t,V$SESSION s

    Where t.address =s.sql_address

        And t.hash_value = s.sql_hash_value

        And s.status = 'ACTIVE'

        And s.username <> 'SYSTEM'

    Order By s.sid,t.piece

dairan73
New Contributor III

Re: Rodar função do Oracle

É, pelo visto vou ter que tentar pegar o código da função e reescrever.