[oracle_br] Re: SQL LOADER

2011-11-17 Por tôpico José Laurindo
  Bom, primeiro eu não conhecia essa coisa ainda, então fui no pai dos burros 
(nosso amigo google) e em http://en.wikipedia.org/wiki/Lilian_date descobri que 
esse negócio nada mais é do que o número de dias decorridos desde 15 de Outubro 
de 1582 da nossa era. Segundo, no manual Oracle apropriado ("Oracle® Database 
SQL Reference" na entrada de "Format Models" a gente vê que pra converter um 
número representando qtdade de dias pra data full basicamente o RDBMS nos dá o 
J, que é a data Juliana (qtdade de dias desde 01 de Janeiro de 4712 antes de 
Cristo).
  Sendo assim, há um gap, um intervalo entre dias Lilian e dias Julian, que 
pode ser calculado via aritmética de datas :
  
SYSTEM@O10GR2:SQL>alter session set NLS_DATE_FORMAT='dd/mm/ hh24:mi:ss BC';

Sessão alterada.

SYSTEM@O10GR2:SQL>alter session set NLS_LANGUAGE='ENGLISH';

Session altered.

SYSTEM@O10GR2:SQL>select to_date(1, 'J') from dual;

TO_DATE(1,'J')
--
01/01/4712 00:00:00 BC

SYSTEM@O10GR2:SQL>select sysdate from dual;

SYSDATE
--
17/11/2011 17:57:34 AD

SYSTEM@O10GR2:SQL>select to_date('15/10/1582 00:00:00 AD', 'dd/mm/ 
hh24:mi:ss BC') - to_date('01/01/4712 00:00:00 BC', 'dd/mm/ hh24:mi:ss BC') 
from dual;

TO_DATE('15/10/158200:00:00AD','DD/MM/HH24:MI:SSBC')-TO_DATE('01/01/471200:00:00BC','DD/MM/HH24:MI:SSBC')
-

  2299160

==> Aí fica fácil, basta a gente Adicionar o gap que vc pode usar o formato 
Julian :

SYSTEM@O10GR2:SQL>select to_date(1 + 2299160, 'J') LILIAN_DATE from dual;

LILIAN_DATE
--
15/10/1582 00:00:00 AD

=> Portanto, a conversão correta da LILIAN 40497 para data full seria :

SYSTEM@O10GR2:SQL>select to_date(40497 + 2299160, 'J') LILIAN_DATE from dual;

LILIAN_DATE
--
29/08/1693 00:00:00 AD

É isso, vc teria que no controlfile do seu sql*loader ter a coluna com o valor 
numérico ADICIONADA do gap, e depois esse resultado vc transforma em data com 
máscara J ...

 []s
 
   Chiappa

--- Em oracle_br@yahoogrupos.com.br, Eduardo Souza  escreveu
>
> Caros amigos,
> 
> estou construindo um sql loader e tenho um campo data no formato LILIAN
> DATE.  Inclui o formato (DATE MASK "J") mas a data gerada projeta outro
> ano.
> 
> Os dados em questão são os seguintes:
> 
> LILIAN DATE =  40497
> 
> Data resultante = 16/11/4602
> 
> Tal qual o resultado da query abaixo:
> 
> select to_date('40497','j') from dual;
> 
> 
> 
> Alguém sabe de tem mais algum parametro na máscara do SQL LOADER para que a
> data seja corretamente convertida?
> 
> 
> 
> Grande abraço.
> 
> 
> [As partes desta mensagem que não continham texto foram removidas]
>




Re: [oracle_br] SELECT chato!

2011-11-17 Por tôpico Marcos de Moura Gonçalves
Que bom! :)

Pena eu ser de Brasília... Quando estiver em Curitiba eu cobro o chopp!
kk

[]s

Marcos

Em 17 de novembro de 2011 16:53, Milton Bastos Henriquis Junior <
milton.bas...@meta.com.br> escreveu:

> **
>
>
> Boa tarde Marcos!
>
> Parabéns, sua query ficou SENSACIONAL!
> Perfeita, retornou exatamente o que eu queria, se encaixou na regra, e vc
> ainda conseguiu fazer sem usar funções analíticas...
> Funcionou muito bem, muito obrigado!
>
> Abraço!
>
>
> --
> Milton Bastos
> http://miltonbastos.com
>
> -Mensagem original-
> De: oracle_br@yahoogrupos.com.br [mailto:oracle_br@yahoogrupos.com.br] Em
> nome de Marcos de Moura Gonçalves
> Enviada em: quinta-feira, 17 de novembro de 2011 16:19
> Para: oracle_br@yahoogrupos.com.br
> Assunto: Re: [oracle_br] SELECT chato!
>
>
> Boa tarde Milton,
>
> Parafraseando o Chiappa: pmfji... rs Eu imaginei uma solução em SELECT,
> ficou relativamente simples, veja se é o que vc precisa:
>
> SELECT datahora
> FROM (SELECT z.datahora,
> CASE
> WHEN z.datahora = z.datahora_mais_15
> THEN (SELECT MIN (y.datahora)
> FROM tabela y
> WHERE y.a = 392597 and y.datahora > z.datahora)
> ELSE z.datahora_mais_15
> END datahora_mais_15_ajustado
> FROM (SELECT x.datahora, (SELECT MAX (y.datahora)
> FROM tabela y
> WHERE y.a = 392597 and y.datahora <= x.datahora +
> (15 / 24 / 60)) datahora_mais_15
> FROM tabela x
> where x.a = 392597
> ORDER BY x.datahora) z) m
> START WITH m.datahora = (SELECT MIN(y.datahora) FROM tabela y where
> y.datahora = 392597)
> CONNECT BY PRIOR m.datahora_mais_15_ajustado = m.datahora
> /
>
> O SELECT principal é o select onde uso o alias x. Nele trago apenas a
> coluna datahora e crio uma coluna datahora_mais_15 onde pego o maior valor
> datahora de algum outro registro que seja menor à própria datahora mais 15
> minutos (15 / 24 / 60). Depois faço uma correção para pegar o próximo
> registro quando não tem nenhum num intervalo de 15 minutos, isto é, quando
> datahora = datahora_mais_15 (é o case no select externo ao primeiro). Pra
> finalizar, no select mais externo, faço um connect by prior conectando
> datahora ao datahora_mais_15_ajustado. Acredito que esse select deve te
> retornar apenas as horas que vc precisa. Aí é ajeitar a solução à query que
> vc precisa.
>
> []s
>
> Marcos
>
> Em 17 de novembro de 2011 10:15, Milton Bastos Henriquis Junior <
> milton.bas...@meta.com.br> escreveu:
>
> > **
>
> >
> >
> > Bom dia pessoal!
> >
> > Ambiente:
> > Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - 64bit
> > Production (Exadata)
> >
> > Estou enferrujado em SQL e preciso fazer um Select que está me
> > assombrando... se alguém conseguir me ajudar, ficarei muito agradecido!
> > Lá vai:
> >
> > Tenho uma tabela, e fiz a seguinte query:
> >
> > select a, to_char(datahora, '/mm/dd HH24:MI') b, c
> > from tabela
> > where a = 392597
> > order by 2;
> >
> > A B C
> > 392597 2011/11/10 07:43 4847277
> > 392597 2011/11/10 07:45 4847316
> > 392597 2011/11/10 07:47 4847357
> > 392597 2011/11/10 07:49 4847404
> > 392597 2011/11/10 07:52 4847471
> > 392597 2011/11/10 07:53 4847500
> > 392597 2011/11/10 07:55 4847547
> > 392597 2011/11/10 07:57 4847595
> > 392597 2011/11/10 07:59 4847631
> > 392597 2011/11/10 08:01 4847664
> > 392597 2011/11/10 08:04 4847715
> > 392597 2011/11/10 08:05 4847732
> > 392597 2011/11/10 08:08 484
> > 392597 2011/11/10 08:09 4847800
> > 392597 2011/11/10 08:11 4847851
> > 392597 2011/11/10 08:13 4847901
> > 392597 2011/11/10 08:15 4847952
> > 392597 2011/11/10 08:17 4848002
> > 392597 2011/11/10 08:19 4848049
> > 392597 2011/11/10 08:21 4848100
> >
> > Isolei esta amostra de dados pra facilitar a explicação.
> >
> > A query que preciso montar será para gerar um relatório, que terá como
> > parâmetro de entrada a coluna A - por isso fixei um valor na cláusula
> WHERE.
> > Reparem que há um registro a cada 2 minutos (considerando a coluna B), e
> > caso seja gerado um relatório com o período de 3 dias, por exemplo, o
> > relatório ficaria muito extenso.
> > A idéia é diminuir a quantidade de registros - reparem que a coluna C é
> um
> > valor cumulativo (na real o campo C é um odômetro de um veículo, ou seja,
> > kilometragem total de um veículo).
> > Portanto, para este relatório, não é necessário ter TODOS os registros. A
> > idéia é filtrar e trazer registros a cada 15 minutos, usando a seguinte
> > regra:
> >
> > - O primeiro registro é de 07:43 (conforme exemplo acima).
> > - O próximo registro do relatório deve ser o registro anterior acrescido
> > de 15 minutos, porém NÃO deve ultrapassar 15 minutos.
> > 07:43 + 00:15 = 07:58.
> > Portanto o segundo registro a ser mostrado seria o das 07:57.
> > O terceiro: 07:57 + 00:15 = 08:12, portanto seria o registro das 8:11.
> >
> > Neste exemplo coincidiu do segundo e terceiro registros serem igual ao
> > anterior + 14 minutos, mas foi coincidência, pode ser que não exista um
> > registro com 14 minutos a mais que o anterior (daí quero pegar com 13...
> ou
> >

RES: RES: [oracle_br] Re: SELECT chato!

2011-11-17 Por tôpico jljlsilva
Milton,
se vc adicionar o filtro do código do veículo e colocar um período menor, será 
que evitaria o problema com a temp?
algo assim:

with interv_15min as
(
 select data_inicial + (rownum - 1)/24/60*15 inicio_interv_15m, data_inicial + 
(rownum)/24/60*15 fim_interv_15m, rownum
 from (select to_date('10/11/2011 07:00:00','dd/mm/ hh24:mi:ss') 
data_inicial, to_date('10/11/2011 08:59:59','dd/mm/ hh24:mi:ss') data_final 
from dual)
 connect by level <= (data_final - data_inicial)*1440/15
 order by 1
)
select *
from teste t, interv_15min i
where t.datahora = (select min(t2.datahora) from teste t2 where t2.datahora >= 
i.inicio_interv_15m and t2.datahora <= i.fim_interv_15m)
and   t.codigo = 392597;


--- Em oracle_br@yahoogrupos.com.br, Milton Bastos Henriquis Junior 
 escreveu
>
> 
> Boa tarde JL!
> 
> Muito obrigado pela contribuição... Ainda não consegui testar, pois a query 
> exigiu mais espaço na TEMP, e eu não tenho a senha de SYSTEM para alterar o 
> banco.
> Já mandei uma solicitação pra equipe de infra, vamos ver se me respondem
> 
> 
> Por enquanto, muito obrigado, assim que eu conseguir rodar a query eu 
> respondo aqui pra vcs!
> 
> --
> Milton Bastos
> http://miltonbastos.com
> 
> De: oracle_br@yahoogrupos.com.br [mailto:oracle_br@yahoogrupos.com.br] Em 
> nome de JLSilva
> Enviada em: quinta-feira, 17 de novembro de 2011 14:16
> Para: oracle_br@yahoogrupos.com.br
> Assunto: Re: RES: [oracle_br] Re: SELECT chato!
> 
> 
> 
> Milton,
> será que isto resolve?
> gerei os grupos (intervalos de 15 minutos) e peguei os primeiros valores de 
> cada grupo.
> 
> with interv_15min as
> (
> select trunc(data_inicial) + (rownum - 1)/24/60*15 inicio_interv, 
> trunc(data_inicial) + (rownum)/24/60*15 fim_interv
> from (select to_date('10/11/2011','dd/mm/') data_inicial, 
> to_date('10/11/2011 23:59:59','dd/mm/ hh24:mi:ss') data_final from dual)
> connect by level <= (data_final - data_inicial)*1440/15
> order by 1
> )
> select *
> from teste t, interv_15min i
> where t.datahora = (select min(t2.datahora) from teste t2 where t2.datahora 
> >= i.inicio_interv and t2.datahora <= i.fim_interv);
> 
> CODIGO DATAHORA ODOMETRO INICIO_INTERV FIM_INTERV
> -- ---  --- ---
> 392597 10/11/2011 07:43:00 4847277 10/11/2011 07:30:00 10/11/2011 07:45:00
> 392597 10/11/2011 07:45:00 4847316 10/11/2011 07:45:00 10/11/2011 08:00:00
> 392597 10/11/2011 08:01:00 4847664 10/11/2011 08:00:00 10/11/2011 08:15:00
> 392597 10/11/2011 08:15:00 4847952 10/11/2011 08:15:00 10/11/2011 08:30:00
> 
> On Nov 17, 2011, at 13:25 , José Laurindo wrote:
> 
> > Esse conceito de "último do grupo anterior" tá meio confuso pra mim ainda, 
> > mas pelo que entendi vc quer ter dois grupos : primeiro quer agrupar em 
> > grupos de 15 minutos (é o exemplo do link), e depois dentro resultset vc 
> > quer encontrar o máximo valor dentro de cada grupo, aí seria o SELECT 
> > anterior dentro de outro, agrupando com GREATEST  O que talvez invalide 
> > esse approach é quando vc diz que se não tiver registros pra agrupar dentro 
> > do intervalo de 15 minutos aí vc quer o registro mais próximo, não há uma 
> > função NEAREST similar á GREATEST - porém, no manual das Analíticas (ie, o 
> > "Oracle® Database Data Warehousing Guide" ele diz , sobre o WINDOW (para 
> > obter sliding windows de dados) que se leva em conta se os dados estão 
> > próximos da borda da janela, isso pode ser que te atenda ...
> >
> > Dá uma pensada em cima, se não sair nada mesmo mostra pra gente até onde vc 
> > chegou, que num tempinho livre podemos palpitar mais em cima ...
> >
> > []s
> >
> > Chiappa
> >
> >
> > --- Em oracle_br@yahoogrupos.com.br, 
> > Milton Bastos Henriquis Junior  escreveu
> >>
> >> Chiappa, obrigado pela ajuda...
> >>
> >> O problema é não basta eu guardar apenas o registro anterior na memória - 
> >> que é o que as funções analíticas fazem.
> >>
> >> No exemplo aí do link, o cara "muda de grupo" quando o intervalo entre um 
> >> registro e outro é maior que 3 segundos... no meu caso é bem diferente, 
> >> preciso mudar de grupo quando o próximo registro for o maior dentro de um 
> >> intervalo de tempo, comparando com o ultimo registro do grupo anterior (e 
> >> não com o registro imediatamente anterior).
> >>
> >>
> >> --
> >> Milton Bastos
> >> http://miltonbastos.com
> >>
> >> De: oracle_br@yahoogrupos.com.br 
> >> [mailto:oracle_br@yahoogrupos.com.br]
> >>  Em nome de José Laurindo
> >> Enviada em: quinta-feira, 17 de novembro de 2011 11:15
> >> Para: oracle_br@yahoogrupos.com.br
> >> Assunto: [oracle_br] Re: SELECT chato!
> >>
> >>
> >>
> >> Colega, quando se fala em agrupamento não-fixo, dependente de comparações 
> >> entre registros, E ainda com total cumulativo, quase que Obrigatoriamente 
> >> se fala em funções

RES: [oracle_br] SELECT chato!

2011-11-17 Por tôpico Milton Bastos Henriquis Junior
Boa tarde Marcos!

Parabéns, sua query ficou SENSACIONAL!
Perfeita, retornou exatamente o que eu queria, se encaixou na regra, e vc ainda 
conseguiu fazer sem usar funções analíticas...
Funcionou muito bem, muito obrigado!

Abraço!

--
Milton Bastos
http://miltonbastos.com

-Mensagem original-
De: oracle_br@yahoogrupos.com.br [mailto:oracle_br@yahoogrupos.com.br] Em nome 
de Marcos de Moura Gonçalves
Enviada em: quinta-feira, 17 de novembro de 2011 16:19
Para: oracle_br@yahoogrupos.com.br
Assunto: Re: [oracle_br] SELECT chato!

Boa tarde Milton,

Parafraseando o Chiappa: pmfji... rs Eu imaginei uma solução em SELECT,
ficou relativamente simples, veja se é o que vc precisa:

SELECT datahora
FROM (SELECT z.datahora,
   CASE
  WHEN z.datahora = z.datahora_mais_15
 THEN (SELECT MIN (y.datahora)
 FROM tabela y
WHERE y.a = 392597 and y.datahora > z.datahora)
  ELSE z.datahora_mais_15
   END datahora_mais_15_ajustado
  FROM (SELECT   x.datahora, (SELECT MAX (y.datahora)
 FROM tabela y
WHERE y.a = 392597 and y.datahora <= x.datahora +
(15 / 24 / 60)) datahora_mais_15
FROM tabela x
where x.a = 392597
ORDER BY x.datahora) z) m
START WITH m.datahora = (SELECT MIN(y.datahora) FROM tabela y where
y.datahora = 392597)
CONNECT BY PRIOR m.datahora_mais_15_ajustado = m.datahora
/

O SELECT principal é o select onde uso o alias x. Nele trago apenas a
coluna datahora e crio uma coluna datahora_mais_15 onde pego o maior valor
datahora de algum outro registro que seja menor à própria datahora mais 15
minutos (15 / 24 / 60). Depois faço uma correção para pegar o próximo
registro quando não tem nenhum num intervalo de 15 minutos, isto é, quando
datahora = datahora_mais_15 (é o case no select externo ao primeiro). Pra
finalizar, no select mais externo, faço um connect by prior conectando
datahora ao datahora_mais_15_ajustado. Acredito que esse select deve te
retornar apenas as horas que vc precisa. Aí é ajeitar a solução à query que
vc precisa.

[]s

Marcos


Em 17 de novembro de 2011 10:15, Milton Bastos Henriquis Junior <
milton.bas...@meta.com.br> escreveu:

> **
>
>
> Bom dia pessoal!
>
> Ambiente:
> Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - 64bit
> Production (Exadata)
>
> Estou enferrujado em SQL e preciso fazer um Select que está me
> assombrando... se alguém conseguir me ajudar, ficarei muito agradecido!
> Lá vai:
>
> Tenho uma tabela, e fiz a seguinte query:
>
> select a, to_char(datahora, '/mm/dd HH24:MI') b, c
> from tabela
> where a = 392597
> order by 2;
>
> A B C
> 392597 2011/11/10 07:43 4847277
> 392597 2011/11/10 07:45 4847316
> 392597 2011/11/10 07:47 4847357
> 392597 2011/11/10 07:49 4847404
> 392597 2011/11/10 07:52 4847471
> 392597 2011/11/10 07:53 4847500
> 392597 2011/11/10 07:55 4847547
> 392597 2011/11/10 07:57 4847595
> 392597 2011/11/10 07:59 4847631
> 392597 2011/11/10 08:01 4847664
> 392597 2011/11/10 08:04 4847715
> 392597 2011/11/10 08:05 4847732
> 392597 2011/11/10 08:08 484
> 392597 2011/11/10 08:09 4847800
> 392597 2011/11/10 08:11 4847851
> 392597 2011/11/10 08:13 4847901
> 392597 2011/11/10 08:15 4847952
> 392597 2011/11/10 08:17 4848002
> 392597 2011/11/10 08:19 4848049
> 392597 2011/11/10 08:21 4848100
>
> Isolei esta amostra de dados pra facilitar a explicação.
>
> A query que preciso montar será para gerar um relatório, que terá como
> parâmetro de entrada a coluna A - por isso fixei um valor na cláusula WHERE.
> Reparem que há um registro a cada 2 minutos (considerando a coluna B), e
> caso seja gerado um relatório com o período de 3 dias, por exemplo, o
> relatório ficaria muito extenso.
> A idéia é diminuir a quantidade de registros - reparem que a coluna C é um
> valor cumulativo (na real o campo C é um odômetro de um veículo, ou seja,
> kilometragem total de um veículo).
> Portanto, para este relatório, não é necessário ter TODOS os registros. A
> idéia é filtrar e trazer registros a cada 15 minutos, usando a seguinte
> regra:
>
> - O primeiro registro é de 07:43 (conforme exemplo acima).
> - O próximo registro do relatório deve ser o registro anterior acrescido
> de 15 minutos, porém NÃO deve ultrapassar 15 minutos.
> 07:43 + 00:15 = 07:58.
> Portanto o segundo registro a ser mostrado seria o das 07:57.
> O terceiro: 07:57 + 00:15 = 08:12, portanto seria o registro das 8:11.
>
> Neste exemplo coincidiu do segundo e terceiro registros serem igual ao
> anterior + 14 minutos, mas foi coincidência, pode ser que não exista um
> registro com 14 minutos a mais que o anterior (daí quero pegar com 13... ou
> com 12... e assim por diante).
>
> Caso não exista um registro dentro dos próximos 15 minutos, ou seja, com
> intervalo MENOR que 15 minutos, daí tem que vir o próximo registro com
> tempo mais próximo (+00:16... +00:17... e assim por diante).
>
> É possível fazer isto apenas com uma query? Ou precisari

Re: [oracle_br] verificar objetos pertencentes ao data file

2011-11-17 Por tôpico JLSilva
Tem um pequeno probleminha aí..
Quando o datafile está offline, AFAIK, a informação do dicionário de dados 
referente ao conteúdo desse datafile fica indisponível também.

O select seria na dba_extents.

Obtenha o file#:
select file# from v$datafile where name = '/local/nomearquivo.dbf';

Verifique a dba_extents:
select * from dba_extents where file_id = ;

Observe ainda que, se esse banco for um 11gR2, existe uma nova funcionalidade 
que faz com que tabelas/índices não aloquem segments/extents (deferred segment 
creation).

On Nov 17, 2011, at 16:40 , Samuel Santos wrote:

> O que pode haver é a dependência de algum objeto a TABLESPACE, no qual é 
> composto pelo datafile, vc deverá efetuar um select buscando todas as 
> dependências que 
> 
> há nesta TABLESPACE, "apagar" os objetos se necessário e/ou movê-las para uma 
> outra TABLESPACE - logo após excluir a TABLESPACE(antiga).
> 
> 
> select segment_name from dba_segments where owner = 'TESTE' and 
> tablespace_name not like '%TBS_DADOS%'
> 
>  
> Atenciosamente,
> 
> 
> Samuel
> 
> 
>> 
>> De: Marcio - Yahoo 
>> Para: oracle_br@yahoogrupos.com.br
>> Enviadas: Quinta-feira, 17 de Novembro de 2011 16:07
>> Assunto: [oracle_br] verificar objetos pertencentes ao data file
>> 
>> 
>>   
>> Boa tarde!
>> 
>> Tenho um datafile “vazio”, teoricamente não tenho nenhum objeto nele. Tornei
>> esse dafa file off-line, e agora recebi um alerta de que esse datafile
>> precisa de recuperação.
>> 
>> Como faço pra verificar se esse data file tem dependentes, quero confirmar
>> antes de excluir.
>> 
>> Márcio.
>> 
>> [As partes desta mensagem que não continham texto foram removidas]
>> 
>> 
>> 
>> 
>> 
> 
> [As partes desta mensagem que não continham texto foram removidas]
> 
> 
> 
> 
> 
> --
>> Atenção! As mensagens do grupo ORACLE_BR são de acesso público e de inteira 
>> responsabilidade de seus remetentes.
> Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/ 
> --
>> Apostilas » Dicas e Exemplos » Função » Mundo Oracle » Package » Procedure » 
>> Scripts » Tutoriais - O GRUPO ORACLE_BR TEM SEU PROPRIO ESPAÇO! VISITE: 
>> http://www.oraclebr.com.br/  
> 
>  Links do Yahoo! Grupos
> 
> 





--
>Atenção! As mensagens do grupo ORACLE_BR são de acesso público e de inteira 
>responsabilidade de seus remetentes.
Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/ 
--
>Apostilas » Dicas e Exemplos » Função » Mundo Oracle » Package » Procedure » 
>Scripts » Tutoriais - O GRUPO ORACLE_BR TEM SEU PROPRIO ESPAÇO! VISITE: 
>http://www.oraclebr.com.br/  

 Links do Yahoo! Grupos

<*> Para visitar o site do seu grupo na web, acesse:
http://br.groups.yahoo.com/group/oracle_br/

<*> Para sair deste grupo, envie um e-mail para:
oracle_br-unsubscr...@yahoogrupos.com.br

<*> O uso que você faz do Yahoo! Grupos está sujeito aos:
http://br.yahoo.com/info/utos.html




Re: [oracle_br] SELECT chato!

2011-11-17 Por tôpico Marcos de Moura Gonçalves
Boa tarde Milton,

Parafraseando o Chiappa: pmfji... rs Eu imaginei uma solução em SELECT,
ficou relativamente simples, veja se é o que vc precisa:

SELECT datahora
FROM (SELECT z.datahora,
   CASE
  WHEN z.datahora = z.datahora_mais_15
 THEN (SELECT MIN (y.datahora)
 FROM tabela y
WHERE y.a = 392597 and y.datahora > z.datahora)
  ELSE z.datahora_mais_15
   END datahora_mais_15_ajustado
  FROM (SELECT   x.datahora, (SELECT MAX (y.datahora)
 FROM tabela y
WHERE y.a = 392597 and y.datahora <= x.datahora +
(15 / 24 / 60)) datahora_mais_15
FROM tabela x
where x.a = 392597
ORDER BY x.datahora) z) m
START WITH m.datahora = (SELECT MIN(y.datahora) FROM tabela y where
y.datahora = 392597)
CONNECT BY PRIOR m.datahora_mais_15_ajustado = m.datahora
/

O SELECT principal é o select onde uso o alias x. Nele trago apenas a
coluna datahora e crio uma coluna datahora_mais_15 onde pego o maior valor
datahora de algum outro registro que seja menor à própria datahora mais 15
minutos (15 / 24 / 60). Depois faço uma correção para pegar o próximo
registro quando não tem nenhum num intervalo de 15 minutos, isto é, quando
datahora = datahora_mais_15 (é o case no select externo ao primeiro). Pra
finalizar, no select mais externo, faço um connect by prior conectando
datahora ao datahora_mais_15_ajustado. Acredito que esse select deve te
retornar apenas as horas que vc precisa. Aí é ajeitar a solução à query que
vc precisa.

[]s

Marcos


Em 17 de novembro de 2011 10:15, Milton Bastos Henriquis Junior <
milton.bas...@meta.com.br> escreveu:

> **
>
>
> Bom dia pessoal!
>
> Ambiente:
> Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - 64bit
> Production (Exadata)
>
> Estou enferrujado em SQL e preciso fazer um Select que está me
> assombrando... se alguém conseguir me ajudar, ficarei muito agradecido!
> Lá vai:
>
> Tenho uma tabela, e fiz a seguinte query:
>
> select a, to_char(datahora, '/mm/dd HH24:MI') b, c
> from tabela
> where a = 392597
> order by 2;
>
> A B C
> 392597 2011/11/10 07:43 4847277
> 392597 2011/11/10 07:45 4847316
> 392597 2011/11/10 07:47 4847357
> 392597 2011/11/10 07:49 4847404
> 392597 2011/11/10 07:52 4847471
> 392597 2011/11/10 07:53 4847500
> 392597 2011/11/10 07:55 4847547
> 392597 2011/11/10 07:57 4847595
> 392597 2011/11/10 07:59 4847631
> 392597 2011/11/10 08:01 4847664
> 392597 2011/11/10 08:04 4847715
> 392597 2011/11/10 08:05 4847732
> 392597 2011/11/10 08:08 484
> 392597 2011/11/10 08:09 4847800
> 392597 2011/11/10 08:11 4847851
> 392597 2011/11/10 08:13 4847901
> 392597 2011/11/10 08:15 4847952
> 392597 2011/11/10 08:17 4848002
> 392597 2011/11/10 08:19 4848049
> 392597 2011/11/10 08:21 4848100
>
> Isolei esta amostra de dados pra facilitar a explicação.
>
> A query que preciso montar será para gerar um relatório, que terá como
> parâmetro de entrada a coluna A - por isso fixei um valor na cláusula WHERE.
> Reparem que há um registro a cada 2 minutos (considerando a coluna B), e
> caso seja gerado um relatório com o período de 3 dias, por exemplo, o
> relatório ficaria muito extenso.
> A idéia é diminuir a quantidade de registros - reparem que a coluna C é um
> valor cumulativo (na real o campo C é um odômetro de um veículo, ou seja,
> kilometragem total de um veículo).
> Portanto, para este relatório, não é necessário ter TODOS os registros. A
> idéia é filtrar e trazer registros a cada 15 minutos, usando a seguinte
> regra:
>
> - O primeiro registro é de 07:43 (conforme exemplo acima).
> - O próximo registro do relatório deve ser o registro anterior acrescido
> de 15 minutos, porém NÃO deve ultrapassar 15 minutos.
> 07:43 + 00:15 = 07:58.
> Portanto o segundo registro a ser mostrado seria o das 07:57.
> O terceiro: 07:57 + 00:15 = 08:12, portanto seria o registro das 8:11.
>
> Neste exemplo coincidiu do segundo e terceiro registros serem igual ao
> anterior + 14 minutos, mas foi coincidência, pode ser que não exista um
> registro com 14 minutos a mais que o anterior (daí quero pegar com 13... ou
> com 12... e assim por diante).
>
> Caso não exista um registro dentro dos próximos 15 minutos, ou seja, com
> intervalo MENOR que 15 minutos, daí tem que vir o próximo registro com
> tempo mais próximo (+00:16... +00:17... e assim por diante).
>
> É possível fazer isto apenas com uma query? Ou precisaria de uma procedure?
>
> Em tempo: preciso das 3 colunas no relatório, além de algumas outras que
> são irrelevantes pra montagem da query. A princípio o importante é trazer
> apenas os registros dentro dessa regra, com a coluna C correspondente
> corretamente.
>
> Um chopp pra quem conseguir resolver!
>
> Att,
> --
> Milton Bastos
> http://miltonbastos.com
>
> This message has been scanned for malware by Websense. www.websense.com
>
> [As partes desta mensagem que não continham texto foram removidas]
>
>  
>


[As partes desta mensagem 

Re: [oracle_br] Re: ORA-06508 PL/SQL: could not find program unit being called

2011-11-17 Por tôpico Fabio
Elcio,

Este package/procedure já existia? Ele foi recompilado enquanto sua
aplicação fazia uso?
Sua aplicação utiliza connection pools?
Caso as três respostas sejam afirmativas e vc já verificou tudo o que os
outros colegas citaram, basta vc reiniciar as connection pools garantindo
que todas as sessões tenham sido renovadas e testar novamente.

Constantemente tenho este problema quando os desenvolvedores fazem uma
atualização nos packages com a aplicação em funcionamento.

Regards,

Fabio

2011/11/17 José Laurindo 

> **
>
>
> Com quase que absoluta certeza, Não está tudo certo não : essa msg indica
> que algum componente não foi encontrado, OU o usuário executor não tem
> privs adequados, OU (o que o pessoal sempre esquece de verificar) está
> inválido ... Pode ser um sinônimo, pode ser um stored PL/SQL, pode ser uma
> permissão faltante (seja via ROLE, seja executada diretamente via GRANT),
> pode ser uma informação de sessão (por exemplo, um CONTEXT)
> inválido/inexistente, é por aí... Isso sem falar que, SE a sua aplicação é
> desenvolvida em Forms (o que vc não diz), os objetos PL/SQL tem um status
> mantido,pode ser necessária uma re-compilação...
> Eu sugiro primeiro começar pelo banco : consulte a DBA_OBJECTS pra ver
> quem está inválido, peça COUNTs agrupando pelo tipo de objeto e compare com
> o ambiente PROD onde tudo tá rodando, consulte os privilégios do usuário
> executor,verifique o status/existência dos objetos que não contém data e
> não fazem processamento mas podem ser requeridos durante a execução (como
> DBLINKS, DIRECTORIES, Contexts, Sinônimos), etc ...
>
> Feito isso e nada encontrado, em segundo lugar, se for Forms Verifique o
> ambiente (principalmente as variáveis FORMSxx_PATH e relacionadas), e peça
> um Compile all no Forms em questão (pra compilar todos os PL/SQLs do
> Forms), apague e regere o .FMX e re-execute.
>
> Caso nada resolva, aí é DEBUG mesmo, é acionar os recursos de debug que vc
> tenha na Aplicação pra saber exatamente o que estava sendo executado quando
> deu o erro - se for Aplicação em Forms, vc tem o recurso do Debugger
> interno ou da execução passo-a-passo, se for outra coisa aí varia, vc tem
> que ver o que vc tem à disposição Outra possibilidade é vc fazer uma
> trace da sessão executando o Aplicativo, e uma outra seria vc setar um
> Evento no database para quando der o erro vc gerar um dump, com alter
> system set events '6508 trace name errorstack level 3'; 
>
> []s
>
> Chiappa
>
> --- Em oracle_br@yahoogrupos.com.br, Elcio Francisco 
> escreveu
>
> >
> > Bom dia pessoal. Estou com um aplicação aqui até ontem estava
> funcionando tudo bem. Hoje fui fazer mais um teste em homologação ele esta
> me retornando o erro:  ORA-06508 PL/SQL: could not find program unit being
> called.  Ja verifiquei tudo e esta tudo certo. Gostaria de uma ajuda para
> resolver isso.
> > Obrigado
> > Banco : Oracle 10G
> >
> > Elcio Francisco
> > Analista de Sistemas MulticréditoBelo Horizonte - MG
> > P Antes de imprimir pense em sua responsabilidade com o MEIO AMBIENTE
> >  Adote os 3Rs na sua vida: Reduza, Reutilize, Recicle!
> >
> > [As partes desta mensagem que não continham texto foram removidas]
> >
>
>  
>


[As partes desta mensagem que não continham texto foram removidas]





--
>Atenção! As mensagens do grupo ORACLE_BR são de acesso público e de inteira 
>responsabilidade de seus remetentes.
Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/ 
--
>Apostilas » Dicas e Exemplos » Função » Mundo Oracle » Package » Procedure » 
>Scripts » Tutoriais - O GRUPO ORACLE_BR TEM SEU PROPRIO ESPAÇO! VISITE: 
>http://www.oraclebr.com.br/  

 Links do Yahoo! Grupos

<*> Para visitar o site do seu grupo na web, acesse:
http://br.groups.yahoo.com/group/oracle_br/

<*> Para sair deste grupo, envie um e-mail para:
oracle_br-unsubscr...@yahoogrupos.com.br

<*> O uso que você faz do Yahoo! Grupos está sujeito aos:
http://br.yahoo.com/info/utos.html




RES: RES: [oracle_br] Re: SELECT chato!

2011-11-17 Por tôpico Milton Bastos Henriquis Junior

Boa tarde JL!

Muito obrigado pela contribuição... Ainda não consegui testar, pois a query 
exigiu mais espaço na TEMP, e eu não tenho a senha de SYSTEM para alterar o 
banco.
Já mandei uma solicitação pra equipe de infra, vamos ver se me respondem


Por enquanto, muito obrigado, assim que eu conseguir rodar a query eu respondo 
aqui pra vcs!

--
Milton Bastos
http://miltonbastos.com

De: oracle_br@yahoogrupos.com.br [mailto:oracle_br@yahoogrupos.com.br] Em nome 
de JLSilva
Enviada em: quinta-feira, 17 de novembro de 2011 14:16
Para: oracle_br@yahoogrupos.com.br
Assunto: Re: RES: [oracle_br] Re: SELECT chato!



Milton,
será que isto resolve?
gerei os grupos (intervalos de 15 minutos) e peguei os primeiros valores de 
cada grupo.

with interv_15min as
(
select trunc(data_inicial) + (rownum - 1)/24/60*15 inicio_interv, 
trunc(data_inicial) + (rownum)/24/60*15 fim_interv
from (select to_date('10/11/2011','dd/mm/') data_inicial, 
to_date('10/11/2011 23:59:59','dd/mm/ hh24:mi:ss') data_final from dual)
connect by level <= (data_final - data_inicial)*1440/15
order by 1
)
select *
from teste t, interv_15min i
where t.datahora = (select min(t2.datahora) from teste t2 where t2.datahora >= 
i.inicio_interv and t2.datahora <= i.fim_interv);

CODIGO DATAHORA ODOMETRO INICIO_INTERV FIM_INTERV
-- ---  --- ---
392597 10/11/2011 07:43:00 4847277 10/11/2011 07:30:00 10/11/2011 07:45:00
392597 10/11/2011 07:45:00 4847316 10/11/2011 07:45:00 10/11/2011 08:00:00
392597 10/11/2011 08:01:00 4847664 10/11/2011 08:00:00 10/11/2011 08:15:00
392597 10/11/2011 08:15:00 4847952 10/11/2011 08:15:00 10/11/2011 08:30:00

On Nov 17, 2011, at 13:25 , José Laurindo wrote:

> Esse conceito de "último do grupo anterior" tá meio confuso pra mim ainda, 
> mas pelo que entendi vc quer ter dois grupos : primeiro quer agrupar em 
> grupos de 15 minutos (é o exemplo do link), e depois dentro resultset vc quer 
> encontrar o máximo valor dentro de cada grupo, aí seria o SELECT anterior 
> dentro de outro, agrupando com GREATEST  O que talvez invalide esse 
> approach é quando vc diz que se não tiver registros pra agrupar dentro do 
> intervalo de 15 minutos aí vc quer o registro mais próximo, não há uma função 
> NEAREST similar á GREATEST - porém, no manual das Analíticas (ie, o "Oracle® 
> Database Data Warehousing Guide" ele diz , sobre o WINDOW (para obter sliding 
> windows de dados) que se leva em conta se os dados estão próximos da borda da 
> janela, isso pode ser que te atenda ...
>
> Dá uma pensada em cima, se não sair nada mesmo mostra pra gente até onde vc 
> chegou, que num tempinho livre podemos palpitar mais em cima ...
>
> []s
>
> Chiappa
>
>
> --- Em oracle_br@yahoogrupos.com.br, 
> Milton Bastos Henriquis Junior  escreveu
>>
>> Chiappa, obrigado pela ajuda...
>>
>> O problema é não basta eu guardar apenas o registro anterior na memória - 
>> que é o que as funções analíticas fazem.
>>
>> No exemplo aí do link, o cara "muda de grupo" quando o intervalo entre um 
>> registro e outro é maior que 3 segundos... no meu caso é bem diferente, 
>> preciso mudar de grupo quando o próximo registro for o maior dentro de um 
>> intervalo de tempo, comparando com o ultimo registro do grupo anterior (e 
>> não com o registro imediatamente anterior).
>>
>>
>> --
>> Milton Bastos
>> http://miltonbastos.com
>>
>> De: oracle_br@yahoogrupos.com.br 
>> [mailto:oracle_br@yahoogrupos.com.br] 
>> Em nome de José Laurindo
>> Enviada em: quinta-feira, 17 de novembro de 2011 11:15
>> Para: oracle_br@yahoogrupos.com.br
>> Assunto: [oracle_br] Re: SELECT chato!
>>
>>
>>
>> Colega, quando se fala em agrupamento não-fixo, dependente de comparações 
>> entre registros, E ainda com total cumulativo, quase que Obrigatoriamente se 
>> fala em funções analíticas : essas danadas são mais flexíveis que uma cobra 
>> de borracha , e mais úteis que qualquer cinto de utilidades de herói dos 
>> quadrinhos.
>> No caso, eu recomendo o mesmo approach de 
>> http://asktom.oracle.com/pls/apex/f?p=100:11:0P11_QUESTION_ID:13946369553642#14274333173515
>>  , ie : o valor do registro anterior é mantido em memória (essa é uma 
>> funcionalidade básica das funções analíticas), e vc o compara com o registro 
>> atualmente lido, se estiver no intervalo vc agrupa/totaliza, se não estiver 
>> vc inicia um novo grupo... No caso-exemplo do link a pessoa queria agrupar a 
>> cada 3 segundos, o conceito é o mesmo pra vc agrupar a cada 15 minutos.
>>
>> []s
>>
>> Chiappa
>>
>>
>> --- Em 
>> oracle_br@yahoogrupos.com.br,
>>  Milton Bastos Henriquis Junior  escreveu
>>>
>>> Bom dia pessoal!
>>>
>>> Ambiente:
>>> Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - 64bit

Re: RES: [oracle_br] Re: SELECT chato!

2011-11-17 Por tôpico JLSilva
Milton,
será que isto resolve?
gerei os grupos (intervalos de 15 minutos) e peguei os primeiros valores de 
cada grupo.

with interv_15min as
(
 select trunc(data_inicial) + (rownum - 1)/24/60*15 inicio_interv, 
trunc(data_inicial) + (rownum)/24/60*15 fim_interv
 from (select to_date('10/11/2011','dd/mm/') data_inicial, 
to_date('10/11/2011 23:59:59','dd/mm/ hh24:mi:ss') data_final from dual)
 connect by level <= (data_final - data_inicial)*1440/15
 order by 1
)
select *
from teste t, interv_15min i
where t.datahora = (select min(t2.datahora) from teste t2 where t2.datahora >= 
i.inicio_interv and t2.datahora <= i.fim_interv);

CODIGO DATAHORAODOMETRO INICIO_INTERV   FIM_INTERV
-- ---  --- ---
392597 10/11/2011 07:43:00  4847277 10/11/2011 07:30:00 10/11/2011 07:45:00
392597 10/11/2011 07:45:00  4847316 10/11/2011 07:45:00 10/11/2011 08:00:00
392597 10/11/2011 08:01:00  4847664 10/11/2011 08:00:00 10/11/2011 08:15:00
392597 10/11/2011 08:15:00  4847952 10/11/2011 08:15:00 10/11/2011 08:30:00

On Nov 17, 2011, at 13:25 , José Laurindo wrote:

> Esse conceito de "último do grupo anterior" tá meio confuso pra mim ainda, 
> mas pelo que entendi vc quer ter dois grupos : primeiro quer agrupar em 
> grupos de 15 minutos (é o exemplo do link), e depois dentro  resultset vc 
> quer encontrar o máximo valor dentro de cada grupo, aí seria o  SELECT 
> anterior dentro de outro, agrupando com GREATEST  O que talvez invalide 
> esse approach é quando vc diz que se não tiver registros pra agrupar dentro 
> do intervalo de 15 minutos aí vc quer o registro mais próximo, não há uma 
> função NEAREST similar á GREATEST - porém, no manual das Analíticas (ie, o 
> "Oracle® Database Data Warehousing Guide" ele diz , sobre o WINDOW (para 
> obter sliding windows de dados) que se leva em conta se os dados estão 
> próximos da borda da janela, isso pode ser que te atenda ...
> 
> Dá uma pensada em cima, se não sair nada mesmo mostra pra gente até onde vc 
> chegou, que num tempinho livre podemos palpitar mais em cima ...
> 
> []s
> 
>   Chiappa
> 
> 
> --- Em oracle_br@yahoogrupos.com.br, Milton Bastos Henriquis Junior 
>  escreveu
>> 
>> Chiappa, obrigado pela ajuda...
>> 
>> O problema é não basta eu guardar apenas o registro anterior na memória - 
>> que é o que as funções analíticas fazem.
>> 
>> No exemplo aí do link, o cara "muda de grupo" quando o intervalo entre um 
>> registro e outro é maior que 3 segundos... no meu caso é bem diferente, 
>> preciso mudar de grupo quando o próximo registro for o maior dentro de um 
>> intervalo de tempo, comparando com o ultimo registro do grupo anterior (e 
>> não com o registro imediatamente anterior).
>> 
>> 
>> --
>> Milton Bastos
>> http://miltonbastos.com
>> 
>> De: oracle_br@yahoogrupos.com.br [mailto:oracle_br@yahoogrupos.com.br] Em 
>> nome de José Laurindo
>> Enviada em: quinta-feira, 17 de novembro de 2011 11:15
>> Para: oracle_br@yahoogrupos.com.br
>> Assunto: [oracle_br] Re: SELECT chato!
>> 
>> 
>> 
>> Colega, quando se fala em agrupamento não-fixo, dependente de comparações 
>> entre registros, E ainda com total cumulativo, quase que Obrigatoriamente se 
>> fala em funções analíticas : essas danadas são mais flexíveis que uma cobra 
>> de borracha , e mais úteis que qualquer cinto de utilidades de herói dos 
>> quadrinhos.
>> No caso, eu recomendo o mesmo approach de 
>> http://asktom.oracle.com/pls/apex/f?p=100:11:0P11_QUESTION_ID:13946369553642#14274333173515
>>  , ie : o valor do registro anterior é mantido em memória (essa é uma 
>> funcionalidade básica das funções analíticas), e vc o compara com o registro 
>> atualmente lido, se estiver no intervalo vc agrupa/totaliza, se não estiver 
>> vc inicia um novo grupo... No caso-exemplo do link a pessoa queria agrupar a 
>> cada 3 segundos, o conceito é o mesmo pra vc agrupar a cada 15 minutos.
>> 
>> []s
>> 
>> Chiappa
>> 
>> 
>> --- Em oracle_br@yahoogrupos.com.br, 
>> Milton Bastos Henriquis Junior  escreveu
>>> 
>>> Bom dia pessoal!
>>> 
>>> Ambiente:
>>> Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - 64bit 
>>> Production (Exadata)
>>> 
>>> Estou enferrujado em SQL e preciso fazer um Select que está me 
>>> assombrando... se alguém conseguir me ajudar, ficarei muito agradecido!
>>> Lá vai:
>>> 
>>> Tenho uma tabela, e fiz a seguinte query:
>>> 
>>> select a, to_char(datahora, '/mm/dd HH24:MI') b, c
>>> from tabela
>>> where a = 392597
>>> order by 2;
>>> 
>>> A B C
>>> 392597 2011/11/10 07:43 4847277
>>> 392597 2011/11/10 07:45 4847316
>>> 392597 2011/11/10 07:47 4847357
>>> 392597 2011/11/10 07:49 4847404
>>> 392597 2011/11/10 07:52 4847471
>>> 392597 2011/11/10 07:53 4847500
>>> 392597 2011/11/10 07:55 4847547
>>> 392597 2011/11/10 07:57 4847595
>>> 392597 2011/11/10 07:59 4847631
>>> 392597 2011/11/10 08:01 4847664
>>> 392597 2011/11/10 08:04 4847715
>>> 392597 2

[oracle_br] Re: UTL_FILE

2011-11-17 Por tôpico José Laurindo
Bem, como ele diz :

 "Tentei executar com um arquivo de  tamanho  de registro menor é processa 
normalmente"
 
 imagino que não seja o caso de permissões, se o fosse arquivos de QUALQUER 
tamanho dariam o erro - pela descrição lá que o colega dá, parece ser mesmo 
questão do tamanho de registro default sendo usado e ficando insuficiente...
 
  []s
  
Chiappa


--- Em oracle_br@yahoogrupos.com.br, Mucio Oliveira  escreveu
>
> Eduardo,
> Voce precisa verificar se o diretório onde está o arquivo a ser lido
> está 'credenciado'.
> Verificar com o select, os diretorios válidos (separados por virgula):
> select value
> from v$parameter
> where upper(name) like '%UTL%FILE%'
> 
> Coloque o seu arquivo num desses diretórios.
> 
> Segue script para validação de diretório e arquivo, coloque o dir. e
> arquivo e veja se abre.
> 
> declare
> l_cli   utl_file.file_type;
> v_dir varchar2(40)   := '/sa_lgd8_p/app/ftp';
> v_ARQ varchar(50):= '62619_12_2009.txt'; --'&arq_cli';
> --
> BEGIN
>-- Efetua a abertura do arquivo / Pessoa - Cliente
>begin
>l_cli  := utl_file.fopen(v_DIR, v_ARQ, 'R', 6000);
>exception
>when utl_file.invalid_path then
> utl_file.fclose(l_cli);
> raise_application_error(-20044,'Problema ao abrir arquivo
> '||v_DIR||'/'||v_ARQ||', diretorio invalido.');
>when utl_file.invalid_mode then
> utl_file.fclose(l_cli);
> raise_application_error(-20043,'Problema ao abrir arquivo
> '||v_DIR||'/'||v_ARQ||', Modo invalido.');
>when utl_file.invalid_operation then
> utl_file.fclose(l_cli);
> raise_application_error(-20042,'Problema ao abrir arquivo
> '||v_DIR||'/'||v_ARQ||', Operacao invalida.');
>end;
>--
>DBMS_OUTPUT.PUT_LINE('ARQUIVO ABERTO COM SUCESSO!');
> END;
> /
> 
> 
> Em 16 de novembro de 2011 16:30, José Laurindo
> escreveu:
> 
> > **
> >
> >
> > A única restrição que existe (afora os limites do SO/hardware) é no
> > tocante à comprimento de linha , a linha pode ser de no máximo 32767 bytes
> > : no seu caso (é um chute, já que vc ** Não ** nos mostra o que está
> > fazendo) , o que parece estar acontecendo é que vc não está declarando o
> > tamanho máximo da linha ao abrir e ler o arquivo, aí o UTL_FILE tá usando o
> > default de 1000 bytes, nesse caso de 1405 bytes isso é acima do default, dá
> > pau... A solução, se for isso mesmo, é simplesmente vc DECLARAR o tamanho
> > máximo ao abrir e ler o arquivo, tipo :
> >
> > .
> > BEGIN
> > -- Open file.
> > l_file := UTL_FILE.fopen(l_location, l_filename, 'r', 32767);
> > .
> > -- Read and output first line.
> > UTL_FILE.get_line(l_file, l_text, 32767);
> > 
> >
> >
> > O default e o limite são explicitados nos manuais PL/SQL da própria
> > Oracle...
> >
> > []s
> >
> > Chiappa
> >
> >
> > --- Em oracle_br@yahoogrupos.com.br, Eduardo Souza 
> > escreveu
> >
> > >
> > > Caros amigos,
> > >
> > > estou construindo um Pl/Sql utilizando UTL_FILE. No comando
> > utl_file.get_line
> > > estou recebendo o erro abaixo:
> > >
> > > Error at line 1
> > >
> > > ORA-29284: file read error
> > >
> > > ORA-06512: at "SYS.UTL_FILE", line 18
> > >
> > > ORA-06512: at "SYS.UTL_FILE", line 610
> > >
> > > ORA-06512: at line 8
> > > o tamanho do registro é de 1405. Tentei executar com um arquivo de
> > tamanho
> > > de registro menor é processa normalmente.
> > >
> > > Existe alguma restrição com tamanho de registro?
> > >
> > > Obrigado a todos.
> > >
> > >
> > > [As partes desta mensagem que não continham texto foram removidas]
> > >
> >
> >  
> >
> 
> 
> [As partes desta mensagem que não continham texto foram removidas]
>




RES: [oracle_br] Re: SELECT chato!

2011-11-17 Por tôpico José Laurindo
Esse conceito de "último do grupo anterior" tá meio confuso pra mim ainda, mas 
pelo que entendi vc quer ter dois grupos : primeiro quer agrupar em grupos de 
15 minutos (é o exemplo do link), e depois dentro  resultset vc quer encontrar 
o máximo valor dentro de cada grupo, aí seria o  SELECT anterior dentro de 
outro, agrupando com GREATEST  O que talvez invalide esse approach é quando 
vc diz que se não tiver registros pra agrupar dentro do intervalo de 15 minutos 
aí vc quer o registro mais próximo, não há uma função NEAREST similar á 
GREATEST - porém, no manual das Analíticas (ie, o "Oracle® Database Data 
Warehousing Guide" ele diz , sobre o WINDOW (para obter sliding windows de 
dados) que se leva em conta se os dados estão próximos da borda da janela, isso 
pode ser que te atenda ...

Dá uma pensada em cima, se não sair nada mesmo mostra pra gente até onde vc 
chegou, que num tempinho livre podemos palpitar mais em cima ...

 []s
 
   Chiappa
   

--- Em oracle_br@yahoogrupos.com.br, Milton Bastos Henriquis Junior 
 escreveu
>
> Chiappa, obrigado pela ajuda...
> 
> O problema é não basta eu guardar apenas o registro anterior na memória - que 
> é o que as funções analíticas fazem.
> 
> No exemplo aí do link, o cara "muda de grupo" quando o intervalo entre um 
> registro e outro é maior que 3 segundos... no meu caso é bem diferente, 
> preciso mudar de grupo quando o próximo registro for o maior dentro de um 
> intervalo de tempo, comparando com o ultimo registro do grupo anterior (e não 
> com o registro imediatamente anterior).
> 
> 
> --
> Milton Bastos
> http://miltonbastos.com
> 
> De: oracle_br@yahoogrupos.com.br [mailto:oracle_br@yahoogrupos.com.br] Em 
> nome de José Laurindo
> Enviada em: quinta-feira, 17 de novembro de 2011 11:15
> Para: oracle_br@yahoogrupos.com.br
> Assunto: [oracle_br] Re: SELECT chato!
> 
> 
> 
> Colega, quando se fala em agrupamento não-fixo, dependente de comparações 
> entre registros, E ainda com total cumulativo, quase que Obrigatoriamente se 
> fala em funções analíticas : essas danadas são mais flexíveis que uma cobra 
> de borracha , e mais úteis que qualquer cinto de utilidades de herói dos 
> quadrinhos.
> No caso, eu recomendo o mesmo approach de 
> http://asktom.oracle.com/pls/apex/f?p=100:11:0P11_QUESTION_ID:13946369553642#14274333173515
>  , ie : o valor do registro anterior é mantido em memória (essa é uma 
> funcionalidade básica das funções analíticas), e vc o compara com o registro 
> atualmente lido, se estiver no intervalo vc agrupa/totaliza, se não estiver 
> vc inicia um novo grupo... No caso-exemplo do link a pessoa queria agrupar a 
> cada 3 segundos, o conceito é o mesmo pra vc agrupar a cada 15 minutos.
> 
> []s
> 
> Chiappa
> 
> 
> --- Em oracle_br@yahoogrupos.com.br, 
> Milton Bastos Henriquis Junior  escreveu
> >
> > Bom dia pessoal!
> >
> > Ambiente:
> > Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - 64bit 
> > Production (Exadata)
> >
> > Estou enferrujado em SQL e preciso fazer um Select que está me 
> > assombrando... se alguém conseguir me ajudar, ficarei muito agradecido!
> > Lá vai:
> >
> > Tenho uma tabela, e fiz a seguinte query:
> >
> > select a, to_char(datahora, '/mm/dd HH24:MI') b, c
> > from tabela
> > where a = 392597
> > order by 2;
> >
> > A B C
> > 392597 2011/11/10 07:43 4847277
> > 392597 2011/11/10 07:45 4847316
> > 392597 2011/11/10 07:47 4847357
> > 392597 2011/11/10 07:49 4847404
> > 392597 2011/11/10 07:52 4847471
> > 392597 2011/11/10 07:53 4847500
> > 392597 2011/11/10 07:55 4847547
> > 392597 2011/11/10 07:57 4847595
> > 392597 2011/11/10 07:59 4847631
> > 392597 2011/11/10 08:01 4847664
> > 392597 2011/11/10 08:04 4847715
> > 392597 2011/11/10 08:05 4847732
> > 392597 2011/11/10 08:08 484
> > 392597 2011/11/10 08:09 4847800
> > 392597 2011/11/10 08:11 4847851
> > 392597 2011/11/10 08:13 4847901
> > 392597 2011/11/10 08:15 4847952
> > 392597 2011/11/10 08:17 4848002
> > 392597 2011/11/10 08:19 4848049
> > 392597 2011/11/10 08:21 4848100
> >
> > Isolei esta amostra de dados pra facilitar a explicação.
> >
> > A query que preciso montar será para gerar um relatório, que terá como 
> > parâmetro de entrada a coluna A - por isso fixei um valor na cláusula WHERE.
> > Reparem que há um registro a cada 2 minutos (considerando a coluna B), e 
> > caso seja gerado um relatório com o período de 3 dias, por exemplo, o 
> > relatório ficaria muito extenso.
> > A idéia é diminuir a quantidade de registros - reparem que a coluna C é um 
> > valor cumulativo (na real o campo C é um odômetro de um veículo, ou seja, 
> > kilometragem total de um veículo).
> > Portanto, para este relatório, não é necessário ter TODOS os registros. A 
> > idéia é filtrar e trazer registros a cada 15 minutos, usando a seguinte 
> > regra:
> >
> > - O primeiro registro é de 07:43 (conforme exemplo acima).
> > - O próximo registro do relatório deve ser o registro anterior acresc

RES: [oracle_br] Re: SELECT chato!

2011-11-17 Por tôpico Milton Bastos Henriquis Junior
Chiappa, obrigado pela ajuda...

O problema é não basta eu guardar apenas o registro anterior na memória - que é 
o que as funções analíticas fazem.

No exemplo aí do link, o cara "muda de grupo" quando o intervalo entre um 
registro e outro é maior que 3 segundos... no meu caso é bem diferente, preciso 
mudar de grupo quando o próximo registro for o maior dentro de um intervalo de 
tempo, comparando com o ultimo registro do grupo anterior (e não com o registro 
imediatamente anterior).


--
Milton Bastos
http://miltonbastos.com

De: oracle_br@yahoogrupos.com.br [mailto:oracle_br@yahoogrupos.com.br] Em nome 
de José Laurindo
Enviada em: quinta-feira, 17 de novembro de 2011 11:15
Para: oracle_br@yahoogrupos.com.br
Assunto: [oracle_br] Re: SELECT chato!



Colega, quando se fala em agrupamento não-fixo, dependente de comparações entre 
registros, E ainda com total cumulativo, quase que Obrigatoriamente se fala em 
funções analíticas : essas danadas são mais flexíveis que uma cobra de borracha 
, e mais úteis que qualquer cinto de utilidades de herói dos quadrinhos.
No caso, eu recomendo o mesmo approach de 
http://asktom.oracle.com/pls/apex/f?p=100:11:0P11_QUESTION_ID:13946369553642#14274333173515
 , ie : o valor do registro anterior é mantido em memória (essa é uma 
funcionalidade básica das funções analíticas), e vc o compara com o registro 
atualmente lido, se estiver no intervalo vc agrupa/totaliza, se não estiver vc 
inicia um novo grupo... No caso-exemplo do link a pessoa queria agrupar a cada 
3 segundos, o conceito é o mesmo pra vc agrupar a cada 15 minutos.

[]s

Chiappa


--- Em oracle_br@yahoogrupos.com.br, 
Milton Bastos Henriquis Junior  escreveu
>
> Bom dia pessoal!
>
> Ambiente:
> Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - 64bit Production 
> (Exadata)
>
> Estou enferrujado em SQL e preciso fazer um Select que está me assombrando... 
> se alguém conseguir me ajudar, ficarei muito agradecido!
> Lá vai:
>
> Tenho uma tabela, e fiz a seguinte query:
>
> select a, to_char(datahora, '/mm/dd HH24:MI') b, c
> from tabela
> where a = 392597
> order by 2;
>
> A B C
> 392597 2011/11/10 07:43 4847277
> 392597 2011/11/10 07:45 4847316
> 392597 2011/11/10 07:47 4847357
> 392597 2011/11/10 07:49 4847404
> 392597 2011/11/10 07:52 4847471
> 392597 2011/11/10 07:53 4847500
> 392597 2011/11/10 07:55 4847547
> 392597 2011/11/10 07:57 4847595
> 392597 2011/11/10 07:59 4847631
> 392597 2011/11/10 08:01 4847664
> 392597 2011/11/10 08:04 4847715
> 392597 2011/11/10 08:05 4847732
> 392597 2011/11/10 08:08 484
> 392597 2011/11/10 08:09 4847800
> 392597 2011/11/10 08:11 4847851
> 392597 2011/11/10 08:13 4847901
> 392597 2011/11/10 08:15 4847952
> 392597 2011/11/10 08:17 4848002
> 392597 2011/11/10 08:19 4848049
> 392597 2011/11/10 08:21 4848100
>
> Isolei esta amostra de dados pra facilitar a explicação.
>
> A query que preciso montar será para gerar um relatório, que terá como 
> parâmetro de entrada a coluna A - por isso fixei um valor na cláusula WHERE.
> Reparem que há um registro a cada 2 minutos (considerando a coluna B), e caso 
> seja gerado um relatório com o período de 3 dias, por exemplo, o relatório 
> ficaria muito extenso.
> A idéia é diminuir a quantidade de registros - reparem que a coluna C é um 
> valor cumulativo (na real o campo C é um odômetro de um veículo, ou seja, 
> kilometragem total de um veículo).
> Portanto, para este relatório, não é necessário ter TODOS os registros. A 
> idéia é filtrar e trazer registros a cada 15 minutos, usando a seguinte regra:
>
> - O primeiro registro é de 07:43 (conforme exemplo acima).
> - O próximo registro do relatório deve ser o registro anterior acrescido de 
> 15 minutos, porém NÃO deve ultrapassar 15 minutos.
> 07:43 + 00:15 = 07:58.
> Portanto o segundo registro a ser mostrado seria o das 07:57.
> O terceiro: 07:57 + 00:15 = 08:12, portanto seria o registro das 8:11.
>
> Neste exemplo coincidiu do segundo e terceiro registros serem igual ao 
> anterior + 14 minutos, mas foi coincidência, pode ser que não exista um 
> registro com 14 minutos a mais que o anterior (daí quero pegar com 13... ou 
> com 12... e assim por diante).
>
> Caso não exista um registro dentro dos próximos 15 minutos, ou seja, com 
> intervalo MENOR que 15 minutos, daí tem que vir o próximo registro com tempo 
> mais próximo (+00:16... +00:17... e assim por diante).
>
> É possível fazer isto apenas com uma query? Ou precisaria de uma procedure?
>
> Em tempo: preciso das 3 colunas no relatório, além de algumas outras que são 
> irrelevantes pra montagem da query. A princípio o importante é trazer apenas 
> os registros dentro dessa regra, com a coluna C correspondente corretamente.
>
> Um chopp pra quem conseguir resolver!
>
> Att,
> --
> Milton Bastos
> http://miltonbastos.com
>
>
>
> This message has been scanned for malware by Websense. www.websense.com
>
>
> [As partes desta mensagem que não continham texto fora

[oracle_br] Re: ORA-06508 PL/SQL: could not find program unit being called

2011-11-17 Por tôpico José Laurindo
Com quase que absoluta certeza, Não está tudo certo não : essa msg indica que 
algum componente não foi encontrado, OU o usuário executor não tem privs 
adequados,  OU (o que o pessoal sempre esquece de verificar) está inválido ... 
Pode ser um sinônimo, pode ser um stored PL/SQL, pode ser uma permissão 
faltante (seja via ROLE, seja executada diretamente via GRANT), pode ser uma 
informação de sessão (por exemplo, um CONTEXT) inválido/inexistente, é por 
aí... Isso sem falar que, SE a sua aplicação é desenvolvida em Forms (o que vc 
não diz), os objetos PL/SQL tem um status mantido,pode ser necessária uma 
re-compilação... 
 Eu sugiro primeiro começar pelo banco : consulte a DBA_OBJECTS pra ver quem 
está inválido, peça COUNTs agrupando pelo tipo de objeto e compare com o 
ambiente PROD onde tudo tá rodando, consulte os privilégios do usuário 
executor,verifique o status/existência dos objetos que não contém data e não 
fazem processamento mas podem ser requeridos durante a execução (como DBLINKS, 
DIRECTORIES, Contexts, Sinônimos), etc ...  
 
  Feito isso e nada encontrado, em segundo lugar, se for Forms Verifique o 
ambiente (principalmente as variáveis FORMSxx_PATH e  relacionadas), e peça um 
Compile all no Forms em questão (pra compilar todos os PL/SQLs do Forms), 
apague e regere o .FMX e re-execute.
  
  Caso nada resolva, aí é DEBUG mesmo, é acionar os recursos de debug que vc 
tenha na Aplicação pra saber exatamente o que estava sendo executado quando deu 
o erro - se for Aplicação em Forms, vc tem o recurso do Debugger interno ou da 
execução passo-a-passo, se for outra coisa aí varia, vc tem que ver o que vc 
tem à disposição Outra possibilidade é vc fazer uma trace da sessão 
executando o Aplicativo, e uma outra seria  vc setar um Evento no database para 
quando der o erro vc gerar um dump, com alter system set events '6508 trace 
name errorstack level 3'; 
  
   []s
   
 Chiappa

--- Em oracle_br@yahoogrupos.com.br, Elcio Francisco  
escreveu
>
> Bom dia pessoal. Estou com um aplicação aqui até ontem estava funcionando 
> tudo bem. Hoje fui fazer mais um teste em homologação ele esta me retornando 
> o erro:  ORA-06508 PL/SQL: could not find program unit being called.  Ja 
> verifiquei tudo e esta tudo certo. Gostaria de uma ajuda para resolver isso.
> Obrigado
> Banco : Oracle 10G
> 
> Elcio Francisco 
> Analista de Sistemas MulticréditoBelo Horizonte - MG
> P Antes de imprimir pense em sua responsabilidade com o MEIO AMBIENTE
>  Adote os 3Rs na sua vida: Reduza, Reutilize, Recicle!
> 
> [As partes desta mensagem que não continham texto foram removidas]
>




Re: [oracle_br] ORA-06508 PL/SQL: could not find program unit being called

2011-11-17 Por tôpico Gerson Junior
Já tive este problema em uma ocasião pelo simples fato de existir um objeto
com o mesmo nome do Schema, por exemplo: Nome do schema é MINHAAPP, e
existia uma procedure chamada MINHAAPP, por erro do desenvolvedor.

Da uma olhada nisso, só por desencargo!!

Não sendo isso, com certeza é um dos passos que nosso amigo Samuel citou.

Abraços!



Gerson S. de Vasconcelos Júnior
OCA DBA - Oracle Certified Associate
Fone: (81) 9816-0236
Msn: gerson.vasconce...@gmail.com
Skype: gersonvjunior
http://www.diaadiaoracle.com.br/


Em 17 de novembro de 2011 10:29, Samuel Santos
escreveu:

> **
>
>
> Olá, Elcio.
> Segue á dica de como resolver o erro ORA-06508: PL/SQL: could not find
> program unit being called.
> CAUSA
>
> O erro ORA-06508: PL/SQL: could not find program unit being called é
> causado quando o Oracle não consegue executar o método chamado, por
> ele não existir, por estar com erro, ou por não haver grant ou
> sinonimos.
>
> CORREÇÃO
>
> Para corrigir esse erro, é só proceder com a inversão das causas, ou seja:
> 1. Se for inexistencia do método:
> 1. Verificar se o nome está escrito correto na chamada;
> 2. Criar o método, caso não exista;
> 2. Se o método estiver com erro:
> 1. Recompile, se for erro de compilação irá resolver;
> 2. Resolva o outro problema para o método funcionar;
> 3. Se for um método de outro usuário:
> 1. Verificar se está criado um sinonimo;
> 2. Verificar se foi dados um grant;
> Caso precise de mais alguma ajuda, comente com a dúvida que tentarei
> ajudar.
>
> Att,
>
> Samuel
>
> >
> >De: Elcio Francisco 
> >Para: oracle_br@yahoogrupos.com.br
> >Enviadas: Quinta-feira, 17 de Novembro de 2011 11:16
> >Assunto: [oracle_br] ORA-06508 PL/SQL: could not find program unit being
> called
> >
> >
> >
> >Bom dia pessoal. Estou com um aplicação aqui até ontem estava funcionando
> tudo bem. Hoje fui fazer mais um teste em homologação ele esta me
> retornando o erro:  ORA-06508 PL/SQL: could not find program unit being
> called.  Ja verifiquei tudo e esta tudo certo. Gostaria de uma ajuda para
> resolver isso.
> >Obrigado
> >Banco : Oracle 10G
> >
> >Elcio Francisco
> >Analista de Sistemas MulticréditoBelo Horizonte - MG
> >P Antes de imprimir pense em sua responsabilidade com o MEIO AMBIENTE
> > Adote os 3Rs na sua vida: Reduza, Reutilize, Recicle!
> >
> >[As partes desta mensagem que não continham texto foram removidas]
> >
> >
> >
> >
> >
>
> [As partes desta mensagem que não continham texto foram removidas]
>
>  
>


[As partes desta mensagem que não continham texto foram removidas]





--
>Atenção! As mensagens do grupo ORACLE_BR são de acesso público e de inteira 
>responsabilidade de seus remetentes.
Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/ 
--
>Apostilas » Dicas e Exemplos » Função » Mundo Oracle » Package » Procedure » 
>Scripts » Tutoriais - O GRUPO ORACLE_BR TEM SEU PROPRIO ESPAÇO! VISITE: 
>http://www.oraclebr.com.br/  

 Links do Yahoo! Grupos

<*> Para visitar o site do seu grupo na web, acesse:
http://br.groups.yahoo.com/group/oracle_br/

<*> Para sair deste grupo, envie um e-mail para:
oracle_br-unsubscr...@yahoogrupos.com.br

<*> O uso que você faz do Yahoo! Grupos está sujeito aos:
http://br.yahoo.com/info/utos.html




[oracle_br] Re: SELECT chato!

2011-11-17 Por tôpico José Laurindo
Colega, quando se fala em agrupamento não-fixo, dependente de comparações entre 
registros,  E ainda com total cumulativo, quase que Obrigatoriamente se fala em 
funções analíticas : essas danadas são mais flexíveis que uma cobra de borracha 
, e mais úteis que qualquer cinto de utilidades de herói dos quadrinhos.
 No caso, eu recomendo o mesmo approach de 
http://asktom.oracle.com/pls/apex/f?p=100:11:0P11_QUESTION_ID:13946369553642#14274333173515
 , ie : o valor do registro anterior é mantido em memória (essa é uma 
funcionalidade básica das funções analíticas), e vc o compara com o registro 
atualmente lido, se estiver no intervalo vc agrupa/totaliza, se não estiver vc 
inicia um novo grupo... No caso-exemplo do link a pessoa queria agrupar a cada 
3 segundos, o conceito é o mesmo pra vc agrupar a cada 15 minutos.
 
  []s
  
Chiappa


--- Em oracle_br@yahoogrupos.com.br, Milton Bastos Henriquis Junior 
 escreveu
>
> Bom dia pessoal!
> 
> Ambiente:
> Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - 64bit Production 
> (Exadata)
> 
> Estou enferrujado em SQL e preciso fazer um Select que está me assombrando... 
> se alguém conseguir me ajudar, ficarei muito agradecido!
> Lá vai:
> 
> Tenho uma tabela, e fiz a seguinte query:
> 
> select  a, to_char(datahora, '/mm/dd HH24:MI') b,  c
> from tabela
> where a = 392597
> order by 2;
> 
> AB C
> 392597  2011/11/10 07:43 4847277
> 392597  2011/11/10 07:45 4847316
> 392597  2011/11/10 07:47 4847357
> 392597  2011/11/10 07:49 4847404
> 392597  2011/11/10 07:52 4847471
> 392597  2011/11/10 07:53 4847500
> 392597  2011/11/10 07:55 4847547
> 392597  2011/11/10 07:57 4847595
> 392597  2011/11/10 07:59 4847631
> 392597  2011/11/10 08:01 4847664
> 392597  2011/11/10 08:04 4847715
> 392597  2011/11/10 08:05 4847732
> 392597  2011/11/10 08:08 484
> 392597  2011/11/10 08:09 4847800
> 392597  2011/11/10 08:11 4847851
> 392597  2011/11/10 08:13 4847901
> 392597  2011/11/10 08:15 4847952
> 392597  2011/11/10 08:17 4848002
> 392597  2011/11/10 08:19 4848049
> 392597  2011/11/10 08:21 4848100
> 
> Isolei esta amostra de dados pra facilitar a explicação.
> 
> A query que preciso montar será para gerar um relatório, que terá como 
> parâmetro de entrada a coluna A - por isso fixei um valor na cláusula WHERE.
> Reparem que há um registro a cada 2 minutos (considerando a coluna B), e caso 
> seja gerado um relatório com o período de 3 dias, por exemplo, o relatório 
> ficaria muito extenso.
> A idéia é diminuir a quantidade de registros - reparem que a coluna C é um 
> valor cumulativo (na real o campo C é um odômetro de um veículo, ou seja, 
> kilometragem total de um veículo).
> Portanto, para este relatório, não é necessário ter TODOS os registros. A 
> idéia é filtrar e trazer registros a cada 15 minutos, usando a seguinte regra:
> 
>  - O primeiro registro é de 07:43 (conforme exemplo acima).
>  - O próximo registro do relatório deve ser o registro anterior acrescido de 
> 15 minutos, porém NÃO deve ultrapassar 15 minutos.
> 07:43 + 00:15 = 07:58.
> Portanto o segundo registro a ser mostrado seria o das 07:57.
> O terceiro: 07:57 + 00:15 = 08:12, portanto seria o registro das 8:11.
> 
> Neste exemplo coincidiu do segundo e terceiro registros serem igual ao 
> anterior + 14 minutos, mas foi coincidência, pode ser que não exista um 
> registro com 14 minutos a mais que o anterior (daí quero pegar com 13... ou 
> com 12... e assim por diante).
> 
> Caso não exista um registro dentro dos próximos 15 minutos, ou seja, com 
> intervalo MENOR que 15 minutos, daí tem que vir o próximo registro com tempo 
> mais próximo (+00:16... +00:17... e assim por diante).
> 
> É possível fazer isto apenas com uma query? Ou precisaria de uma procedure?
> 
> Em tempo: preciso das 3 colunas no relatório, além de algumas outras que são 
> irrelevantes pra montagem da query. A princípio o importante é trazer apenas 
> os registros dentro dessa regra, com a coluna C correspondente corretamente.
> 
> Um chopp pra quem conseguir resolver!
> 
> Att,
> --
> Milton Bastos
> http://miltonbastos.com
> 
> 
> 
> This message has been scanned for malware by Websense. www.websense.com
> 
> 
> [As partes desta mensagem que não continham texto foram removidas]
>




Re: [oracle_br] Re: UTL_FILE

2011-11-17 Por tôpico Mucio Oliveira
Eduardo,
Voce precisa verificar se o diretório onde está o arquivo a ser lido
está 'credenciado'.
Verificar com o select, os diretorios válidos (separados por virgula):
select value
from v$parameter
where upper(name) like '%UTL%FILE%'

Coloque o seu arquivo num desses diretórios.

Segue script para validação de diretório e arquivo, coloque o dir. e
arquivo e veja se abre.

declare
l_cli   utl_file.file_type;
v_dir varchar2(40)   := '/sa_lgd8_p/app/ftp';
v_ARQ varchar(50):= '62619_12_2009.txt'; --'&arq_cli';
--
BEGIN
   -- Efetua a abertura do arquivo / Pessoa - Cliente
   begin
   l_cli  := utl_file.fopen(v_DIR, v_ARQ, 'R', 6000);
   exception
   when utl_file.invalid_path then
utl_file.fclose(l_cli);
raise_application_error(-20044,'Problema ao abrir arquivo
'||v_DIR||'/'||v_ARQ||', diretorio invalido.');
   when utl_file.invalid_mode then
utl_file.fclose(l_cli);
raise_application_error(-20043,'Problema ao abrir arquivo
'||v_DIR||'/'||v_ARQ||', Modo invalido.');
   when utl_file.invalid_operation then
utl_file.fclose(l_cli);
raise_application_error(-20042,'Problema ao abrir arquivo
'||v_DIR||'/'||v_ARQ||', Operacao invalida.');
   end;
   --
   DBMS_OUTPUT.PUT_LINE('ARQUIVO ABERTO COM SUCESSO!');
END;
/


Em 16 de novembro de 2011 16:30, José Laurindo
escreveu:

> **
>
>
> A única restrição que existe (afora os limites do SO/hardware) é no
> tocante à comprimento de linha , a linha pode ser de no máximo 32767 bytes
> : no seu caso (é um chute, já que vc ** Não ** nos mostra o que está
> fazendo) , o que parece estar acontecendo é que vc não está declarando o
> tamanho máximo da linha ao abrir e ler o arquivo, aí o UTL_FILE tá usando o
> default de 1000 bytes, nesse caso de 1405 bytes isso é acima do default, dá
> pau... A solução, se for isso mesmo, é simplesmente vc DECLARAR o tamanho
> máximo ao abrir e ler o arquivo, tipo :
>
> .
> BEGIN
> -- Open file.
> l_file := UTL_FILE.fopen(l_location, l_filename, 'r', 32767);
> .
> -- Read and output first line.
> UTL_FILE.get_line(l_file, l_text, 32767);
> 
>
>
> O default e o limite são explicitados nos manuais PL/SQL da própria
> Oracle...
>
> []s
>
> Chiappa
>
>
> --- Em oracle_br@yahoogrupos.com.br, Eduardo Souza 
> escreveu
>
> >
> > Caros amigos,
> >
> > estou construindo um Pl/Sql utilizando UTL_FILE. No comando
> utl_file.get_line
> > estou recebendo o erro abaixo:
> >
> > Error at line 1
> >
> > ORA-29284: file read error
> >
> > ORA-06512: at "SYS.UTL_FILE", line 18
> >
> > ORA-06512: at "SYS.UTL_FILE", line 610
> >
> > ORA-06512: at line 8
> > o tamanho do registro é de 1405. Tentei executar com um arquivo de
> tamanho
> > de registro menor é processa normalmente.
> >
> > Existe alguma restrição com tamanho de registro?
> >
> > Obrigado a todos.
> >
> >
> > [As partes desta mensagem que não continham texto foram removidas]
> >
>
>  
>


[As partes desta mensagem que não continham texto foram removidas]





--
>Atenção! As mensagens do grupo ORACLE_BR são de acesso público e de inteira 
>responsabilidade de seus remetentes.
Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/ 
--
>Apostilas » Dicas e Exemplos » Função » Mundo Oracle » Package » Procedure » 
>Scripts » Tutoriais - O GRUPO ORACLE_BR TEM SEU PROPRIO ESPAÇO! VISITE: 
>http://www.oraclebr.com.br/  

 Links do Yahoo! Grupos

<*> Para visitar o site do seu grupo na web, acesse:
http://br.groups.yahoo.com/group/oracle_br/

<*> Para sair deste grupo, envie um e-mail para:
oracle_br-unsubscr...@yahoogrupos.com.br

<*> O uso que você faz do Yahoo! Grupos está sujeito aos:
http://br.yahoo.com/info/utos.html




[oracle_br] SELECT chato!

2011-11-17 Por tôpico Milton Bastos Henriquis Junior
Bom dia pessoal!

Ambiente:
Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - 64bit Production 
(Exadata)

Estou enferrujado em SQL e preciso fazer um Select que está me assombrando... 
se alguém conseguir me ajudar, ficarei muito agradecido!
Lá vai:

Tenho uma tabela, e fiz a seguinte query:

select  a, to_char(datahora, '/mm/dd HH24:MI') b,  c
from tabela
where a = 392597
order by 2;

AB C
392597  2011/11/10 07:43 4847277
392597  2011/11/10 07:45 4847316
392597  2011/11/10 07:47 4847357
392597  2011/11/10 07:49 4847404
392597  2011/11/10 07:52 4847471
392597  2011/11/10 07:53 4847500
392597  2011/11/10 07:55 4847547
392597  2011/11/10 07:57 4847595
392597  2011/11/10 07:59 4847631
392597  2011/11/10 08:01 4847664
392597  2011/11/10 08:04 4847715
392597  2011/11/10 08:05 4847732
392597  2011/11/10 08:08 484
392597  2011/11/10 08:09 4847800
392597  2011/11/10 08:11 4847851
392597  2011/11/10 08:13 4847901
392597  2011/11/10 08:15 4847952
392597  2011/11/10 08:17 4848002
392597  2011/11/10 08:19 4848049
392597  2011/11/10 08:21 4848100

Isolei esta amostra de dados pra facilitar a explicação.

A query que preciso montar será para gerar um relatório, que terá como 
parâmetro de entrada a coluna A - por isso fixei um valor na cláusula WHERE.
Reparem que há um registro a cada 2 minutos (considerando a coluna B), e caso 
seja gerado um relatório com o período de 3 dias, por exemplo, o relatório 
ficaria muito extenso.
A idéia é diminuir a quantidade de registros - reparem que a coluna C é um 
valor cumulativo (na real o campo C é um odômetro de um veículo, ou seja, 
kilometragem total de um veículo).
Portanto, para este relatório, não é necessário ter TODOS os registros. A idéia 
é filtrar e trazer registros a cada 15 minutos, usando a seguinte regra:

 - O primeiro registro é de 07:43 (conforme exemplo acima).
 - O próximo registro do relatório deve ser o registro anterior acrescido de 15 
minutos, porém NÃO deve ultrapassar 15 minutos.
07:43 + 00:15 = 07:58.
Portanto o segundo registro a ser mostrado seria o das 07:57.
O terceiro: 07:57 + 00:15 = 08:12, portanto seria o registro das 8:11.

Neste exemplo coincidiu do segundo e terceiro registros serem igual ao anterior 
+ 14 minutos, mas foi coincidência, pode ser que não exista um registro com 14 
minutos a mais que o anterior (daí quero pegar com 13... ou com 12... e assim 
por diante).

Caso não exista um registro dentro dos próximos 15 minutos, ou seja, com 
intervalo MENOR que 15 minutos, daí tem que vir o próximo registro com tempo 
mais próximo (+00:16... +00:17... e assim por diante).

É possível fazer isto apenas com uma query? Ou precisaria de uma procedure?

Em tempo: preciso das 3 colunas no relatório, além de algumas outras que são 
irrelevantes pra montagem da query. A princípio o importante é trazer apenas os 
registros dentro dessa regra, com a coluna C correspondente corretamente.

Um chopp pra quem conseguir resolver!

Att,
--
Milton Bastos
http://miltonbastos.com



This message has been scanned for malware by Websense. www.websense.com


[As partes desta mensagem que não continham texto foram removidas]



Re: [oracle_br] Re: Data Pump - permissão do arquivo gerado

2011-11-17 Por tôpico [Paulo Sousa]
Luciana,

crie ou peça para criar um grupo de S.O. comum aos dois. Assim você não tem
problemas/restrições com o pessoal de redes/S.O. reclamando que vai ter que
adicionar fulano ao grupo DBA. Esse grupo existiria para suportar essa sua
operação, um grupo datapump, por exemplo.

Abraço.

Paulo Sousa
paulorso...@gmail.com

"No caráter, na conduta, no estilo, em todas as coisas, a simplicidade é a
suprema virtude." (Henry Wadsworth)



2011/11/15 Anderson Araujo de Oliveira 

> **
>
>
> Uma outra alternativa era mudar o umask do usuario owner da base de dados,
> ele define o privilegios dos arquivos criados criados pelo oracle, por
> exemplo, é comum o oracle ter umask de 027, o que significa que os
> diretorios terao privilegios 750 (dono tem tudo, grupo tem leitura e
> execucao e os outros nao tem nada) e os arquivos ficam com privilegio 640
> (dono tem leitura e gravacao, o grupo tem leitura e os outros nao tem nada)
> Apenas uma dica rapida nos privilegios, o primeiro numero representa o
> dono, o segundo o grupo e o terceiro os outros, os privilegios sao: leitura
> 4, escrita 2 e execução 1, por isso 7 é privilégio total (4 + 2 + 1) e 6 é
> leitura e gravacao (4 + 2)
> No caso do umask, como comentei antes, para saber o privilegio é so fazer
> 777 (privilegio total para os 3 niveis [dono/grupo/outros]) menos o umask
> definido, dai vc tera os privilegios dos diretorios. Para os arquivos, como
> o umask nao da privilegio de execução para eles, se o resultado for um
> numero impar, basta subtrair 1 (valor que representa execução) que vc tera
> seus privilegios.
>
> 
> De: Luciana Missao Osako Camargo 
> Para: oracle_br@yahoogrupos.com.br
> Enviadas: Sexta-feira, 11 de Novembro de 2011 10:17
> Assunto: Re: [oracle_br] Re: Data Pump - permissão do arquivo gerado
>
>
> Obrigada pessoal!
>
> Vou ver o que é possível aqui.
>
> Luciana
> Em 10 de novembro de 2011 21:30, José Laurindo
> escreveu:
>
> > **
> >
> >
> > Eduardo, com certeza resolveria, mas pelo que a Luciana descreve, a
> > questão é o CHMOD tem que ser feito pelo owner do arquivo (o que ela não
> > é), ou por quem tenha esse privilégio (que ela não tem) 
> >
> > Luciana , a questão aí é que o arquivo de expor do datapump é feito **
> > internamente ** pelo banco de dados (é um programa dentro do banco de
> dados
> > que o escreve), então NECESSARIAMENTE vai ser gerado pelo usuário unix
> dono
> > do banco de dados, E com a umask default dele, como vc percebeu - aliás,
> > ESSA foi uma das maiores mudanças de paradigma do expdp em relação ao exp
> > tradicional, o exp tradicional não era executado dentro do banco, o expdp
> > é...
> > Na verdade, QUALQUER arquivo gerado dentro do banco de dados (como os
> arqs
> > gerados pelo UTL_FILE, como os arquivos de log, trace e alerta, enfim)
> são
> > gerados assim ... Absolutamente NÂO IMPORTA que o usuário que chama o
> > client do expdp é X : necessariamente o expdp VAI chamar a API interna
> dele
> > dentro do banco de dados, o arquivo VAI ser gravado pelo banco de dados,
> > então cai no acima - é o mesmo que vc conectar no sqlplus com um usuário
> Y
> > e chamar um script que crie arquivos pelo UTL_FILE, por exemplo : o
> > UTL_FILE é um programa interno do banco de dados, o arquivo dse saída VAI
> > estar como acima...
> >
> > Que eu saiba, as suas opções necessariamente implicam em intervenção do
> > DBA, que é quem tem a senha do usuário unix dono do RDBMS Oracle, e/ou do
> > sysadmin unix... Seriam elas :
> >
> > a) o DBA muda o umask do usuário dono do RDBMS Oracle, incluindo um
> > read-only para os outros
> >
> > ou
> >
> > b) o sysadmin cria um grupo OUTROS no unix, adiciona o usuário dono do
> > RDBMS ** e ** o seu usuário unix nesse grupo, e deixa esse grupo como o
> > default group (** sem ** eliminar/alterar os outros grupos) para o
> usuário
> > dono do RDBMS
> >
> > ou
> >
> > c) o sysadmin ou o DBA criam um job (cron database via java, o que for)
> > que a cada 5 minutos roda um script que consulta se há arquivos no
> > diretório-destino em questão, se houver dá um CHMOD
> >
> > ou
> >
> > d) o dba escreve um shell script MY_EXPDP que chama o expdp e depois faz
> > um chmod no arquivo gerado, e dá priv de execução nesse script pra vc
> >
> > ou variações do tema... Mas é isso, afaik vc como usuária-final NÂO vai
> > conseguir fazer nada, ok ?
> >
> > []s
> >
> > Chiappa
> >
> > --- Em oracle_br@yahoogrupos.com.br, Eduardo 
> escreveu
> > >
> > > chmod não resolve?
> > >
> > > 2011/11/10 Luciana Missao Osako Camargo 
> > >
> > > > **
> > > >
> > > >
> > > > >
> > > > >
> > > > >
> > > > Pessoal,
> > > >
> > > > Estou tentando executar o expdp, trocando uma operação executada pelo
> > exp
> > > > e estou com dificuldades quanto a permissão do arquivo gerado.
> > > >
> > > > Estou no Oracle10g R2 em ambiente Unix.
> > > >
> > > > O usuário que executa o expdp NÃO é oracle, nem grupo dba.
> > > > O usuário que executa