Skip to main content
Announcements
Join us at Qlik Connect for 3 magical days of learning, networking,and inspiration! REGISTER TODAY and save!
cancel
Showing results for 
Search instead for 
Did you mean: 
dairan73
Contributor III
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.

Labels (1)
1 Solution

Accepted Solutions
Clever_Anjos
Employee
Employee

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

View solution in original post

4 Replies
Clever_Anjos
Employee
Employee

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
Contributor III
Contributor III
Author

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
Partner - Specialist
Partner - Specialist

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

Consultor certificado | Quem compartilha, aprende!
https://www.linkedin.com/in/mariosergioti
dairan73
Contributor III
Contributor III
Author

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