Relatório clássico e função sql

Oracle Application Express - web application development tool (antigamente conhecido como Oracle HTML-DB)
Responder
Robson Costa
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 155
Registrado em: Sex, 17 Out 2008 6:05 pm
Localização: Campo Grande - MS

Olá,

Criei um relatório clássico na minha aplicação via função SQL. A cada dia, ela inclui uma nova coluna no relatório referente ao dia. Porém, quando eu acesso o relatório, após a atualização de mais um dia, dá erro ORA-01403. Esse erro para de aparecer quando eu entro no APEx para editar a página e salvo aí a nova coluna começa a aparecer.
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

ORA-01403: no data found é porque alguma query não ta retornando linha em um bloco PLSQL.

Como você ta fazendo a sua função ?
Robson Costa
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 155
Registrado em: Sex, 17 Out 2008 6:05 pm
Localização: Campo Grande - MS

O relatório é criado com este comando pl/sql:

Selecionar tudo

declare
   comando varchar2(32767);
   cursor datas is select distinct trunc(dt_lev) from table1 order by trunc(dt_lev);
   dt_menor date;
   v_data date;
begin
  comando := 'select campo1,';
  dt_menor:= to_date('27/02/2015','DD/MM/YYYY');
  open datas;
  loop
    fetch datas into v_data;
    exit when datas%notfound;
    if (v_data > dt_menor) then
        comando := comando ||tot1||' '||chr(34)||to_char(v_data,'DD/MM/YYYY')||chr(34)||',';
    end if;
   end loop;
   comando := rtrim(comando,',');
   comando := comando ||' from table1 group by campo1 order by campo1';
   close datas;
   return(comando);
end;
E a tabela é desta forma:

Selecionar tudo

Campo1   09/03/2015  10/03/2015
    X               77              88
    y                22             33
E assim sucessivamente, no final do dia há um job que insere os dados refrentes ao dia. Então após isso, a tabela deveria estar:

Selecionar tudo

Campo1   09/03/2015  10/03/2015 11/03/2015
    X               77              88                99
    y                22             33                 99
Mas não é o que acontece.
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Coloca pra nós um exemplo de query que ele está montando.
Acho que o problema é a criação da query.

Pelo que eu vi, é algo assim:

Selecionar tudo

select campo1,   CAMPO1   "09/03/2015",   CAMPO2 "10/03/2015",   CAMPO3 "11/03/2015"
from table1 group by campo1 order by campo1
Onde esse CAMPO1 vem de TOT1, que a gente não sabe bem o que pode ter.

Ta estranho, pois normalmente com GROUP BY, é preciso ter um SUM ali pra você obter o seu resultado. E não estou vendo isso.
Robson Costa
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 155
Registrado em: Sex, 17 Out 2008 6:05 pm
Localização: Campo Grande - MS

O PL/SQL correto seria esse:

Selecionar tudo

declare
   comando varchar2(32767);
   cursor datas is select distinct trunc(dt_lev) from table1 order by trunc(dt_lev);
   dt_menor date;
   v_data date;
begin
  comando := 'select campo1,';
  dt_menor:= to_date('27/02/2015','DD/MM/YYYY');
  open datas;
  loop
    fetch datas into v_data;
    exit when datas%notfound;
    if (v_data > dt_menor) then
        comando := comando ||fc1(campo1,v_data)||' '||chr(34)||to_char(v_data,'DD/MM/YYYY')||chr(34)||',';
    end if;
   end loop;
   comando := rtrim(comando,',');
   comando := comando ||' from table1 group by campo1 order by campo1';
   close datas;
   return(comando);
end;
A query produzida seria:

Selecionar tudo

select campo1, fc1(campo1,'09/03/2015') "09/03/2015", fc1(campo1,'10/03/2015') "10/03/2015", fc1(campo1,'11/03/2015') "11/03/2015"
from table1 group by campo1 order by campo1
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Bem, num GROUP BY, todos campos devem ter uma função tipo SUM, AVG, MIN, MAX, etc. (menos as que estão no GROUP BY).

Veja:

Selecionar tudo

SQL> select
  2    code_combination_id, chart_of_accounts_id
  3  from gl_code_combinations
  4  group by code_combination_id
  5  /
 
select
  code_combination_id, chart_of_accounts_id
from gl_code_combinations
group by code_combination_id
 
ORA-00979: not a GROUP BY expression
 
SQL> 
O Apex deve estar gerando algum erro assim internamente.
Robson Costa
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 155
Registrado em: Sex, 17 Out 2008 6:05 pm
Localização: Campo Grande - MS

Group by funciona. O problema acontece quando é uma nova data é incluída.

Tirei o group by e coloquei distinct
Robson Costa
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 155
Registrado em: Sex, 17 Out 2008 6:05 pm
Localização: Campo Grande - MS

O erro continua, não era a questão do group by ou distinct.
Renato Menezes Viana
Rank: Analista Pleno
Rank: Analista Pleno
Mensagens: 128
Registrado em: Sáb, 18 Nov 2006 11:51 am
Localização: Rio de Janeiro - RJ

Pessoal:

Selecionar tudo

select
  code_combination_id, chart_of_accounts_id
from gl_code_combinations
group by code_combination_id

ORA-00979: not a GROUP BY expression
Está faltando no group by a coluna chart_of_accounts_id.

Erro explicativo no link abaixo:

http://www.dba-oracle.com/t_ora_00979_n ... ession.htm

Pelo jeito você terá também que montar dinamicamente as colunas v_data que você agrega no

Selecionar tudo

comando := comando ||' from table1 group by campo1 order by campo1';
Não entendi muito bem, mas parece que na clausula GROUP BY e ORDER BY além do campo1 terá que existir os demais campon originados pelas colunas montadas de v_data.

Abs, Renato
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 5 visitantes