[oracle_br] Re: SELECT travando o BD

2017-11-07 Por tôpico jlchia...@yahoo.com.br [oracle_br]
Essa é uma situação ** EXTREMAMENTE ** rara, eu tenho que voltar no tempo 
mentalmente pelo menos uns 10 anos pra lembrar de algum caso onde vi isso, E 
sempre era coisa lááá do 10g, que foi a versão onde foi introduzido mais 
pesadamente MUTEXES no controle de latches, as primeiras implementações tinham 
algumas issues
 O conselho que eu posso te dar é ler a nota metalink "Resolving Issues Where 
'PMON failed to acquire latch, see PMON dump' Warnings are Seen in the Alert 
Log" (Doc ID 976714.1) e os links de troubleshoot dela... EM ESPECIAL, essa 
nota mostra como vc analisar o TRACE DO PMON para vc descobrir qual 
PID/processo do sistema está segurando o latch, com isso vc deve ser capaz de 
identificar se é uma sessão interna do banco (caso em que PODE SER que vc tenha 
problemas no seu dicionário, por exemplo corrupção ou estatísticas das tabelas 
internas inapropriadas, digamos) Ou se é alguma rotina da sua própria aplicação 
(nunca duvide da Criatividade de alguns desenvolvedores, que fazem um bololô 
com SQL dinâmico e/ou sem usar BIND VARIABLES), mostra como usar as tools 
EXTERNAS ao core do RDBMS (como ASH/AWR, RDA, osWatcher, oradebug
 
 []s
 
   Chiappa

[oracle_br] Re: SELECT com COUNT(*) demorando para retornar

2016-08-08 Por tôpico jlchia...@yahoo.com.br [oracle_br]
Ops, corrige meu typo aí : troca o "= between" por apenas "between", claro...

[]s

  Chiappa

[oracle_br] Re: SELECT com COUNT(*) demorando para retornar

2016-08-08 Por tôpico jlchia...@yahoo.com.br [oracle_br]
Blz ? Então, a primeira explicação que me vêm à mente é baseada no ** FATO ** 
de que, ao contrário do que os novatos pensam, ** NEM SEMPRE ** o acesso via 
índice é melhor / mais rápido / mais performático para TODOS os casos 
(https://asktom.oracle.com/pls/asktom/f?p=100:11:0P11_QUESTION_ID:6749454952894
 tem um caso Clássico disso), E ao colocar um HINT vc ** ENGESSA **, vc ** 
FORÇA ** o CBO a usar o índice se possível, INDEPENDENTE de isso ser Bom ou 
Ruim... A minha Suposição é que nessa tabela com esse índice forçado o COUNT(*) 
é obrigado a ler todos (ou quase todos) os blocos do Índice (o que não acontece 
com o SQL SEM o COUNT), e devido ao FATO de que essa leitura é feita 
bloco-a-bloco, seria muito mais performático se obter os blocos todos de uma 
vez via FULL TABLE SCAN, cujo I/O é MULTIBLOCK, lendo Múltiplos Blocos de uma 
tacada só Essa diferença de performance entre ler uma larga porção de 
blocos via index (em single-block) VERSUS se ler essa mesma larga porção de 
blocos via TABLE SCAN (em multiblock) é o que estava por trás da diferença de 
performance no caso que indiquei e Suponho que é o que está por trás da sua 
situação, também : para PROVAR ou DESPROVAR, faça um trace+tkprof de uma sessão 
fazendo COUNT com o tal hint, de uma outra fazendo o mesmo COUNT ** sem ** o 
HINT e veja o que vc vai ver
 
 Não é o que vc perguntou mas ** tenho ** que dizer, também : se as minhas 
suposições de que a coluna DTA_EXTRACAO é do tipo DATE ** E ** que há índice 
considerando essa coluna estão corretas, esse SQL apresenta uma ** Péssima 
Qualidade **, ele faz a proeza de numa só vez ele violar pelo menos DUAS best 
practices : ele permite CONVERSÂO IMPLÍCITA, ao comparar a string '03-aug-2016' 
com a coluna do tipo DATE dta_extracao, ** e ** como cereja do bolo ao mesmo 
tempo ele Também mete uma função na coluna indexada - AMBAS as caquinhas podem 
fazer um índice não ser usado/levado em conta, imagino que foi daí que veio o 
HINT, inclusive - aquela historinha, ao invés de consertar o SQL lixento neguim 
sai metendo HINTs... 
 
 SE for isso mesmo, a correção desse SQL é simples :

 SELECT COUNT(*)
  from stg_catalogo_status v 
 WHERE v.dta_extracao = between TO_DATE('03/08/2016 00:00:00', 'dd/mm/ 
hh24:mi:ss')
and TO_DATE('03/08/2016 23:59:59', 'dd/mm/ 
hh24:mi:ss');

==> Essas simples alterações tanto eliminam a necessidade de função na coluna 
indexada(a TRUNC no caso, que suponho estava aqui para 'eliminar' a porção HORA 
da coluna DATE), quanto Também permite comparação de coluna DATE com valores 
DATE, yep ??

 []s
 
   Chiappa

[oracle_br] Re: select com data

2016-06-23 Por tôpico jlchia...@yahoo.com.br [oracle_br]
Muito fácil, para se definir um intervalo vc usa o BETWEEN, isso ficaria 
(usando teu exemplo) :

SELECT colunasqueeuquero FROM nomedatabela
 WHERE colunadotipodate BETWEEN to_date('22/06/2016 21:00:00', 'dd/mm/ 
hh24:mi:ss')
 AND to_date('23/06/2016 
09:00:00', 'dd/mm/ hh24:mi:ss')


[]s

  Chiappa

[oracle_br] Re: select para descobrir o caminho do TNSNAMES?

2015-03-23 Por tôpico jlchia...@yahoo.com.br [oracle_br]
Tudo jóia ?? Então, de cara tenho que te dizer que NÃO, esse tipo de informação 
do cliente não é necessária para o funcionamento do database, então tabela 
interna NENHUMA, afaik, registra a localização do TNSNAMES.ORA usado para 
indicar o alvo da conexão, então NÃO TEM COMO se obter isso via SELECT nenhum, 
okdoc ??
 Uma opção seria vc, a partir da máquina-cliente da qual vc quer saber a 
localização do TNSNAMES.ORA, ter as variáveis necessárias setadas e pedir um 
TNSPING, esse comando mostra o caminho paara o TNSNAMES que foi usado
 Note porém que em condições normais isso  Não é Necessário  : 
localizar o TNSNAMES.ORA usado é via de regra uma questão simples - SE a 
variável TNS_ADMIN estiver setada, ela indica o caminho pra ele, E SE a 
variável não estiver setada, o default é $ORACLE_HOME/network/admin , 
simples  Única coisa é que eu disse em condições normais porque sempre há 
as exceções, como por exemplo aplicações que oram programadas para procurar o 
TNSNAMES.ORA num lugar específico : como um exemplo, algumas versões antigas do 
TOAD que usei deixavam você indicar o PATH aonde estava o TNSNAMES.ORA, 
independente das variáveis de ambiente...

  []s

   Chiappa

OBS : lembro apenas que se for Windows o Sistema Operacional, além das 
variáveis de ambiente podemos ter TAMBÉM indicação de localização do TNSNAMES 
no REGISTRY...

RE: [oracle_br] Re: select para descobrir o caminho do TNSNAMES?

2015-03-23 Por tôpico Leandro Tadeu Belpiede ltbelpi...@hotmail.com [oracle_br]
obrigado pela ajuda de todos

 
To: oracle_br@yahoogrupos.com.br
From: oracle_br@yahoogrupos.com.br
Date: Mon, 23 Mar 2015 09:55:38 -0700
Subject: [oracle_br] Re: select para descobrir o caminho do TNSNAMES?














 

 



  



  
  
  Tudo jóia ?? Então, de cara tenho que te dizer que NÃO, esse tipo de 
informação do cliente não é necessária para o funcionamento do database, então 
tabela interna NENHUMA, afaik, registra a localização do TNSNAMES.ORA usado 
para indicar o alvo da conexão, então NÃO TEM COMO se obter isso via SELECT 
nenhum, okdoc ??
 Uma opção seria vc, a partir da máquina-cliente da qual vc quer saber a 
localização do TNSNAMES.ORA, ter as variáveis necessárias setadas e pedir um 
TNSPING, esse comando mostra o caminho paara o TNSNAMES que foi usado
 Note porém que em condições normais isso  Não é Necessário  : 
localizar o TNSNAMES.ORA usado é via de regra uma questão simples - SE a 
variável TNS_ADMIN estiver setada, ela indica o caminho pra ele, E SE a 
variável não estiver setada, o default é $ORACLE_HOME/network/admin , 
simples  Única coisa é que eu disse em condições normais porque sempre há 
as exceções, como por exemplo aplicações que oram programadas para procurar o 
TNSNAMES.ORA num lugar específico : como um exemplo, algumas versões antigas do 
TOAD que usei deixavam você indicar o PATH aonde estava o TNSNAMES.ORA, 
independente das variáveis de ambiente...

  []s

   Chiappa

OBS : lembro apenas que se for Windows o Sistema Operacional, além das 
variáveis de ambiente podemos ter TAMBÉM indicação de localização do TNSNAMES 
no REGISTRY...



 









  

RE: [oracle_br] Re: select para descobrir o caminho do TNSNAMES?

2015-03-23 Por tôpico Eduardo Perdomo panc...@gmail.com [oracle_br]
O problema acontece também quando se instala vários clientes.
Ou se instala um banco na máquina cliente, como o xe por exemplo. O que eu
faço é localizar os tnsnames e ir drletando um a um até achar aquele que a
aplicação está usando. Ou seja reclamar. Ou quando a aplicação não acha o
banco e tem varios clients. Eu mesclo todos os tnsnames.
Em 23/03/2015 17:06, Leandro Tadeu Belpiede ltbelpi...@hotmail.com
[oracle_br] oracle_br@yahoogrupos.com.br escreveu:



 obrigado pela ajuda de todos


 --
 To: oracle_br@yahoogrupos.com.br
 From: oracle_br@yahoogrupos.com.br
 Date: Mon, 23 Mar 2015 09:55:38 -0700
 Subject: [oracle_br] Re: select para descobrir o caminho do TNSNAMES?


  Tudo jóia ?? Então, de cara tenho que te dizer que NÃO, esse tipo de
 informação do cliente não é necessária para o funcionamento do database,
 então tabela interna NENHUMA, afaik, registra a localização do TNSNAMES.ORA
 usado para indicar o alvo da conexão, então NÃO TEM COMO se obter isso via
 SELECT nenhum, okdoc ??
  Uma opção seria vc, a partir da máquina-cliente da qual vc quer saber a
 localização do TNSNAMES.ORA, ter as variáveis necessárias setadas e pedir
 um TNSPING, esse comando mostra o caminho paara o TNSNAMES que foi usado
  Note porém que em condições normais isso  Não é Necessário  :
 localizar o TNSNAMES.ORA usado é via de regra uma questão simples - SE a
 variável TNS_ADMIN estiver setada, ela indica o caminho pra ele, E SE a
 variável não estiver setada, o default é $ORACLE_HOME/network/admin ,
 simples  Única coisa é que eu disse em condições normais porque
 sempre há as exceções, como por exemplo aplicações que oram programadas
 para procurar o TNSNAMES.ORA num lugar específico : como um exemplo,
 algumas versões antigas do TOAD que usei deixavam você indicar o PATH aonde
 estava o TNSNAMES.ORA, independente das variáveis de ambiente...

   []s

Chiappa

 OBS : lembro apenas que se for Windows o Sistema Operacional, além das
 variáveis de ambiente podemos ter TAMBÉM indicação de localização do
 TNSNAMES no REGISTRY...




Re: [oracle_br] Re: select para descobrir o caminho do TNSNAMES?

2015-03-23 Por tôpico Fabiano Lira fabianocl...@gmail.com [oracle_br]
Vc pode dar um 'where tnsping' no windows.

Ele vai te mostrar todos os clients instalados.

Em 23 de março de 2015 17:34, Eduardo Perdomo panc...@gmail.com [oracle_br]
oracle_br@yahoogrupos.com.br escreveu:



 O problema acontece também quando se instala vários clientes.
 Ou se instala um banco na máquina cliente, como o xe por exemplo. O que eu
 faço é localizar os tnsnames e ir drletando um a um até achar aquele que a
 aplicação está usando. Ou seja reclamar. Ou quando a aplicação não acha o
 banco e tem varios clients. Eu mesclo todos os tnsnames.
 Em 23/03/2015 17:06, Leandro Tadeu Belpiede ltbelpi...@hotmail.com
 [oracle_br] oracle_br@yahoogrupos.com.br escreveu:



 obrigado pela ajuda de todos


 --
 To: oracle_br@yahoogrupos.com.br
 From: oracle_br@yahoogrupos.com.br
 Date: Mon, 23 Mar 2015 09:55:38 -0700
 Subject: [oracle_br] Re: select para descobrir o caminho do TNSNAMES?


  Tudo jóia ?? Então, de cara tenho que te dizer que NÃO, esse tipo de
 informação do cliente não é necessária para o funcionamento do database,
 então tabela interna NENHUMA, afaik, registra a localização do TNSNAMES.ORA
 usado para indicar o alvo da conexão, então NÃO TEM COMO se obter isso via
 SELECT nenhum, okdoc ??
  Uma opção seria vc, a partir da máquina-cliente da qual vc quer saber a
 localização do TNSNAMES.ORA, ter as variáveis necessárias setadas e pedir
 um TNSPING, esse comando mostra o caminho paara o TNSNAMES que foi usado
  Note porém que em condições normais isso  Não é Necessário  :
 localizar o TNSNAMES.ORA usado é via de regra uma questão simples - SE a
 variável TNS_ADMIN estiver setada, ela indica o caminho pra ele, E SE a
 variável não estiver setada, o default é $ORACLE_HOME/network/admin ,
 simples  Única coisa é que eu disse em condições normais porque
 sempre há as exceções, como por exemplo aplicações que oram programadas
 para procurar o TNSNAMES.ORA num lugar específico : como um exemplo,
 algumas versões antigas do TOAD que usei deixavam você indicar o PATH aonde
 estava o TNSNAMES.ORA, independente das variáveis de ambiente...

   []s

Chiappa

 OBS : lembro apenas que se for Windows o Sistema Operacional, além das
 variáveis de ambiente podemos ter TAMBÉM indicação de localização do
 TNSNAMES no REGISTRY...






-- 
Atenciosamente,
Fabiano Lira.


[oracle_br] Re: select para tabela candidata a shrink

2014-10-31 Por tôpico ederson200...@yahoo.com.br [oracle_br]
Marcio,

Dá uma olhada aqui: 
http://oraclemais.blogspot.com.br/2014/07/shrink-de-objetos-retomando-o-espaco.html
 
http://oraclemais.blogspot.com.br/2014/07/shrink-de-objetos-retomando-o-espaco.html


Ederson Elias 
DBA Oracle - http://br.linkedin.com/pub/ederson-elias/24/8b/8b0
 Labor improbus omnia vincit
  


Re: [oracle_br] RE: Select full

2014-01-17 Por tôpico Bruno N. Barboza
Muito obrigado pelas respostas!!


Em 14 de janeiro de 2014 17:55, jlchia...@yahoo.com.br escreveu:



  Bom, faz tempo que milh€ ¢Ãµes de registros deixou de ser algo extremo
 am hardware de produ€ ¢Ã§Ã£o, enterprise-class, mas de qquer maneira, eu
 penso nas coisas de sempre, ie :

  a) SE o teu servidor tiver capacidade sobrando (ie, mem€ ¢Ã³ria, banda de
 I/O, CPU, etc) ainda n€ ¢Ã£o usada e dispon€ ¢Ã­vel, vc pode fazer a query
 em paralelo : isso implica que sess€ ¢Ãµes escravas ser€ ¢Ã£o abertas e
 alocadas ao mesmo tempo, cada uma lendo um pedacinho da tabelona 
 Veja a Documenta€ ¢Ã§Ã£o do RDBMS (especialmente o manual de Concepts e o
 DW Guide da tua vers€ ¢Ã£o) para conceitos, sintaxes e alguns exemplos, e
 sites de refer€ ¢Ãªncia como http://oracledoug.com/px.html e
 https://asktom.oracle.com/pls/asktom/f?p=100:11:0P11_QUESTION_ID:39946845137685para
  mais detalhes...
  S€ ¢Ã³ REPITO : vc s€ ¢Ã³ pode pensar nisso ** SE ** realmente vc tem a
 capacidade sobrando no servidor : caso hoje ele j€ ¢Ã¡ esteja no gargalo,
 Muito Provavelmente n€ ¢Ã£o vai haver capacidade de I/O, poder de CPU e
 mem€ ¢Ã³ria livre para fazer frente € ¢Ã  n sess€ ¢Ãµes escravas atacando
 ao mesmo tempo...

  b) se assegurar que o sistema operacional e o I/O est€ ¢Ã¡ setado para a
 melhor performance poss€ ¢Ã­vel : por exemplo, € ¢Ã© CR€ ¢Ã’­TICO que o
 ambiente permita I/O As€ ¢Ã­ncrono (Asynchronous I/O) e (via de regra)
 Direct I/O  : Asynch significa que haver€ ¢Ã¡ m€ ¢Ãºltiplos I/Os
 simult€ ¢Ã¢noes, ie , os pr€ ¢Ã³ximos I/Os que sejam independentes daquele
 em execu€ ¢Ã§Ã£o no momento N€ ¢Ã’£O PRECISAM ficar esperando que o atual
 termine... Isso € ¢Ã© IMPRESCIND€ ¢Ã’­VEL em opera€ ¢Ã§Ãµes de full table
 scan que seja usado paralelismo, ajuda em muito via de regra paraque as
 sess€ ¢Ãµes escravas n€ ¢Ã£o fiquem esperando umas pelas outras...
J€ ¢Ã¡ o Direct I/O significa que os dados lidos s€ ¢Ã£o enviados
 diretamente para o RDBMS, que j€ ¢Ã¡ tem buffers e caches Pr€ ¢Ã³prios,
 n€ ¢Ã£o se perdendo tempo em se fazer o Sistema Operacional copiar o que
 foi lido para os buffers/caches de sistema operacional Via de regra
 esse setting € ¢Ã© Positivo para a performance...
   alguns ajustes do sub-sistema de I/O (como striping size, balanceamento
 de discos, etc) podem tamb€ ¢Ã©m influenciar se vc est€ ¢Ã¡ usando um
 storage de discos : isso € ¢Ã© algo a se alinhar com os sysadmins e time de
 storage

  c)   n€ ¢Ã£o com se assegurar que o armazenamento interno est€ ¢Ã¡ OK, e
 que as configs de DB est€ ¢Ã£o apropriadas : por exemplo, o RDBMS ao fazer
 um full-table scan l€ ¢Ãª uma por€ ¢Ã§Ã£o de blocos cont€ ¢Ã­guos, o
 chamado EXTENT : se a tabela tiver sido criada com extents muito
 pequenos/consistentemente menores do que o m€ ¢Ã¡ximo de bytes que o
 sistema operacional pode ler, OU se o tamanho do extent n€ ¢Ã£o for um
 m€ ¢Ãºltiplo exato do tamanho m€ ¢Ã¡ximo de I/O do sistema operacional, ao
 inv€ ¢Ã©s de um I/O ser€ ¢Ã£o necess€ ¢Ã¡rios dois para ler o mesmo
 extent Outros pontos, ainda dentro do database :
- pode valer a pena (via ALTER SESSION) setar temporariamente o
 par€ ¢Ã¢metro DB_FILE_MULTIBLOCK_READ_COUNT para um n€ ¢Ãºmero de blocos
 que se equipare ao m€ ¢Ã¡ximo I/O do sistema operacional
- vc ** TEM ** que garantir que os dados da tal tabela est€ ¢Ã£o
 gravados em extents com o ** m€ ¢Ã­nimo poss€ ¢Ã­vel ** de espa€ ¢Ã§o em
 branco e/ou blocos alocados mas n€ ¢Ã£o usados - o objetivo aqui € ¢Ã©,
 mais uma vez, diminuir ao m€ ¢Ã¡ximo a qtdade de blocos (e portanto a
 qtdade de I/Os) necess€ ¢Ã¡ria para se recuperar a informa€ ¢Ã§Ã£o...
 E que fique claro : blocos com espa€ ¢Ã§o em branco e/ou n€ ¢Ã£o
 usados podem resultar tanto das op€ ¢Ã§Ãµes de controle de armazenamento da
 tabela (exemplo, o porcentual de espa€ ¢Ã§o que o RDBMS reserva para
 futuros UPDATEs) quanto de DMLs , como DELETEs que removeram os dados mas o
 espa€ ¢Ã§o n€ ¢Ã£o foi reusado, ou de opera€ ¢Ã§Ãµes de APPEND de dados ...

  d) vc VAI se assegurar, dentro do poss€ ¢Ã­vel, que a rotina ser€ ¢Ã¡
 agendada para uma data/hora em que n€ ¢Ã£o est€ ¢Ã£o sendo feitos grandes
 DMLs na tal tabela grande : a quest€ ¢Ã£o € ¢Ã© que, para se assegurar que
 n€ ¢Ã£o h€ ¢Ã¡ leitura suja, de dados n€ ¢Ã£o-comitados, durante DMLs a
 informa€ ¢Ã§Ã£o consistente € ¢Ã© armazenada em undo blocks, que significam
 mais I/Os extras

  []s

Chiappa





--
Att,
Bruno N. Barboza


[oracle_br] RE: Select full

2014-01-14 Por tôpico jlchiappa
 Bom, faz tempo que milhões de registros deixou de ser algo extremo am 
hardware de produção, enterprise-class, mas de qquer maneira, eu penso nas 
coisas de sempre, ie :
 
 a) SE o teu servidor tiver capacidade sobrando (ie, memória, banda de I/O, 
CPU, etc) ainda não usada e disponível, vc pode fazer a query em paralelo : 
isso implica que sessões escravas serão abertas e alocadas ao mesmo tempo, 
cada uma lendo um pedacinho da tabelona  Veja a Documentação do RDBMS 
(especialmente o manual de Concepts e o DW Guide da tua versão) para conceitos, 
sintaxes e alguns exemplos, e sites de referência como 
http://oracledoug.com/px.html e 
https://asktom.oracle.com/pls/asktom/f?p=100:11:0P11_QUESTION_ID:39946845137685
 para mais detalhes...
 Só REPITO : vc só pode pensar nisso ** SE ** realmente vc tem a capacidade 
sobrando no servidor : caso hoje ele já esteja no gargalo, Muito Provavelmente 
não vai haver capacidade de I/O, poder de CPU e memória livre para fazer frente 
à n sessões escravas atacando ao mesmo tempo...
 
 b) se assegurar que o sistema operacional e o I/O está setado para a melhor 
performance possível : por exemplo, é CRÍTICO que o ambiente permita I/O 
Asíncrono (Asynchronous I/O) e (via de regra) Direct I/O  : Asynch significa 
que haverá múltiplos I/Os simultânoes, ie , os próximos I/Os que sejam 
independentes daquele em execução no momento NÃO PRECISAM ficar esperando que o 
atual termine... Isso é IMPRESCINDÍVEL em operações de full table scan que seja 
usado paralelismo, ajuda em muito via de regra paraque as sessões escravas não 
fiquem esperando umas pelas outras...
   Já o Direct I/O significa que os dados lidos são enviados diretamente para o 
RDBMS, que já tem buffers e caches Próprios, não se perdendo tempo em se fazer 
o Sistema Operacional copiar o que foi lido para os buffers/caches de sistema 
operacional Via de regra esse setting é Positivo para a performance...
  alguns ajustes do sub-sistema de I/O (como striping size, balanceamento de 
discos, etc) podem também influenciar se vc está usando um storage de discos : 
isso é algo a se alinhar com os sysadmins e time de storage
  
 c)   não com se assegurar que o armazenamento interno está OK, e que as 
configs de DB estão apropriadas : por exemplo, o RDBMS ao fazer um full-table 
scan lê uma porção de blocos contíguos, o chamado EXTENT : se a tabela tiver 
sido criada com extents muito pequenos/consistentemente menores do que o máximo 
de bytes que o sistema operacional pode ler, OU se o tamanho do extent não for 
um múltiplo exato do tamanho máximo de I/O do sistema operacional, ao invés de 
um I/O serão necessários dois para ler o mesmo extent Outros pontos, ainda 
dentro do database :
   - pode valer a pena (via ALTER SESSION) setar temporariamente o parâmetro 
DB_FILE_MULTIBLOCK_READ_COUNT para um número de blocos que se equipare ao 
máximo I/O do sistema operacional
   - vc ** TEM ** que garantir que os dados da tal tabela estão gravados em 
extents com o ** mínimo possível ** de espaço em branco e/ou blocos alocados 
mas não usados - o objetivo aqui é, mais uma vez, diminuir ao máximo a qtdade 
de blocos (e portanto a qtdade de I/Os) necessária para se recuperar a 
informação... 
E que fique claro : blocos com espaço em branco e/ou não usados podem 
resultar tanto das opções de controle de armazenamento da tabela (exemplo, o 
porcentual de espaço que o RDBMS reserva para futuros UPDATEs) quanto de DMLs , 
como DELETEs que removeram os dados mas o espaço não foi reusado, ou de 
operações de APPEND de dados ...

 d) vc VAI se assegurar, dentro do possível, que a rotina será agendada para 
uma data/hora em que não estão sendo feitos grandes DMLs na tal tabela grande : 
a questão é que, para se assegurar que não há leitura suja, de dados 
não-comitados, durante DMLs a informação consistente é armazenada em undo 
blocks, que significam mais I/Os extras 

 []s

   Chiappa

Re: [oracle_br] Re: Select … for update … nowait

2013-03-19 Por tôpico JLSilva
Chiappa, gosto muito do nível de detalhes que vc responde, colocando bons 
exemplos e sempre muito úteis.
Mas, vejo que você apenas está repetindo o que eu disse na minha primeira 
mensagem.
Parafraseando seu modo de escrever:
Eu ***JÁ*** sei que é um select for update nowait. Ja identifiquei isto, por 
isso enviei o meu primeiro email, pois não tenho como evitar qua a aplicação 
faça o que está fazendo.
Eu ***JÁ*** sei que é a aplicação que ***DEVERIA encerrar a 
transação. Mas, com eu ***JÁ*** disse: a aplicação ***NÃO O FAZ***.
Eu achei que tinha deixado claro qual era a minha intenção ao perguntar se 
alguém conhece uma maneira de desativar um nowait: a aplicação está fazendo 
caca, e o cliente está sofrendo a consequencia, portanto será que existe uma 
forma de auxiliá-lo a melhorar a situação?.

O que eu gostaria de responder é:
Quem está bloqueando ***QUEM*** (não oque, ok?) O que está esperando eu já 
sei, é uma determinada tabela. O problema é descobrir a ordem dessa fila, para 
fazer o deadlock manualmente e adequadamente. Ok?

On Mar 18, 2013, at 9:16 PM, J. Laurindo Chiappa jlchia...@yahoo.com.br 
wrote:

 Nope, veja as minhas outras msgs com demonstrações (que provavelmente não te 
 chegaram antes de vc escrever esta), que :
 
  - é CLARO que as sessões estão SIM esperando por algo, sessão que não espera 
 por nadaé IMPOSSÍVEL 
 
  - é Claro que (ao menos desde a introdução do 10g) o banco Registra sim na 
 V$SESSION o SQL_ID sendo executado, a Espera, o objeto causando a espera, a 
 CLASSE da espera, então tanto DÁ SIM para vc identificar sessões acessando 
 sempre e sempre o mesmo objeto QUANTO dá para vc identificar que o SQL é com 
 NOWAIT, o que fecha o cenário que vc descreve - INCLUSIVE, ao menos por mim 
 essa foi uma das mais festejadas alterações no 10g, junto com a AUTOMAÇÂO das 
 estatísticas de execução de um SQL longo na V$SQL... Só quem teve o desprazer 
 de trabalhar com versões anteriores pode avaliar o quão útil isso é
 
  - é VERDADE que não há como vc identificar o REGISTRO já lockado e sendo 
 acessado constantemente via for update nowait em um loop, Mas como eu mostrei 
 vc consegue Sim identificar as sessões constantemente acessando o mesmo 
 OBJETO e aí pelo SQL dessas sessões vc Comprova ou não que é esse caso do 
 NOWAIT
 
 
  == e só para deixar Escrupulosamente Claro : quem TEM que fazer COMMIT ou 
 ROLLBACK é a sessão A, que obteve o lock e o está mantendo, SIM ???  A falha 
 da Aplicação é que ela NEM limita o tempo que A fica com a transação aberta e 
 mantendo o LOCK, e NEM (mesmo ela, Aplicação) sabendo que PODEM haver 
 transações erradamente abertas por muito muito tempo, nem mesmo assim ela 
 aplica algum LIMITE na qtdade de vezes e/ou no tempo que fica esperando A 
 liberar o lock com o encerramento da Transação 
 
[]s
   
 Chiappa
 
 
 --- Em oracle_br@yahoogrupos.com.br, JLSilva jljlsilva@... escreveu
 
 Chiappa,
 Agradeço o tempo que você despendeu para analisar o caso, mas devo discordar 
 totalmente de você, amigo.
 1. Veja, não há nenhuma sessão esperando nada.. o select for update está 
 usando NOWAIT, que é justamente para não esperar.. Ocorre o ORA-00054, e a 
 aplicação tenta bloquear o registro novamente, e ocorre novamente o 
 ORA-00054, e tenta novamente.. nesse processo, ela nunca faz 
 commit/rollback, entende..? A sessão nunca fica numa longa espera por lock...
 2. Não é possível identificar exatamente quem está bloqueando quem, já que 
 não tenho como saber qual registro uma sessão está bloqueando sem ter 
 antecipadamente ativado um trace. O máximo que consigo é verificar todas as 
 sessões que têm uma transação aberta em uma tabela.. mas não em qual 
 registro, correto?
 3. Absolutamente verdadeiro quando digo que nunca vai terminar esse loop: 
 veja que é como um deadlock, mas sem o mecanismo de deadlock do Oracle, uma 
 vez que a aplicação é que fica num loop eterno tentando bloquear um registro 
 que está blqueado por outra sessão, sendo que essa outra sessão nunca vai 
 fazer commit/rollback já que ela também está tentando bloquear registros que 
 estão bloqueados pela outra sessão.
 
 On Mar 18, 2013, at 7:39 PM, J. Laurindo Chiappa jlchiappa@... wrote:
 
 Hmmm, peraí : nunca vai sair é absolutamente Falso : o lock que A está 
 mantendo (e que impede B de lockar o mesmo recurso) *** NÃO *** é Eterno, 
 ele VAI SIM ser liberado assim que A encerrar a transação, seja com COMMIT 
 seja com ROLLBACK, yes ??? Da mesma maneira, dizer que é impossível 
 identificar quem está lockando registros de quem sorry, mas afaik é 
 Inverdade também : via script é Plenamente Possível vc consultar quem está 
 esperando pelo que, aí não é impossível não vc localizar quem está com o 
 lock para si, os outros TODOS estão em espera por essa sessão, dado o 
 cenário que vc descreve...
 
  O que é Questionável, podendo mesmo ser considerado uma FALHA no 
 aplicativo é esse comportamento de :
 
   1. deixar a 

[oracle_br] Re: Select … for update … nowait

2013-03-19 Por tôpico J. Laurindo Chiappa
 Então, achei que estava claro mas pelo jeito não ficou : 
 
 a) será que existe uma forma de auxiliá-lo a melhorar a situação?.
 
  A ÚNICA forma segura e adequada é o Fornecedor corrigir a aplicação, não 
ficando indefinidamente tentando lockar o objeto, PONTO. Enquanto isso não 
ocorre, o que vc pode fazer como Paliativo é o
  que eu indiquei em msgs anteriores, ie :
  
1. SE vc quer serializar completamente (ie, se quando já há alguém 
executando o processo vc quer que as outras sessões que tentem executar 
simultaneamente falhem, com aviso) , vc pode ter alguma tela/programa que o 
usuário executa antes de entrar na rotina e checa se a rotina já está em 
execução em outra sessão , abortando

2. SE não é serialização completa o que vc quer :

 - caso o processo chega a terminar depois de demorar muito, fazer algum 
TUNING no processo para que ele termine o mais rapidamente possível e assim a 
sessão A mantenha o lock o mínimo possível e libere o lock para a sessão B 
processar, e B terminando o mais rápido possível libera o quanto antes C, assim 
por diante
 
 e/ou
 
 - vc faz o que a aplicação não faz, ie, ENCERRA  a transação que está 
demorando muito : para isso (provavelmente num job que rode a cada x minutos), 
vc Identifica a sessão que obteve o lock , OU então coloca um PROFILE limitando 
o tempo de conexão
 
 e é ISSO o quew vc pode fazer, sim ?? E como identificar os envolvidos, 
vide abaixo...
 
 
 b)  quem está bloqueando ***QUEM***
 
  Esse é o ponto PRINCIPAL das minhas respostas, que pelo jeito não ficou Claro 
: as outras sessões que estão num loop aguardando para obter o lock *** NÂO 
ESTÃO BLOQUEADAS, elas estão acessando o objeto e tentando obter o lock, mas 
ainda NÃO o obtiveram, sim ??? Não há LOCK WAIT aí, captou ??? Então, para 
quem está bloqueando a resposta é, NINGUÉM, não há Bloqueio, não há LOCK... E 
IMPORTANTE : como não há locks, não há uma FILA de espera, as n sessões que 
estão acessando o objeto lockado para tentar obter o lock NÂO vão ser atendidas 
por ordem, eu mostrei isso ...
   O que há na verdade é ACESSO constante ao objeto que está lockado na 
Tentativa de obter um lock, sim ??? E como vc identifica um objeto lockado ? 
pelas views de lock, como mostrei Como vc identifica as sessões que estão 
CONSTANTEMENTE, pesadamente, tentando e tentando e tentando acessar esse objeto 
lockado ? Pelo evento de concorrência, como mostrei. E como vc SABE que esse 
acesso constante é para obter lock com FOR UPDATE NOWAIT ?? Vc consulta o SQL 
que está sendo enviado pelas sessões sofrendo de Concurrency E confere se é o 
SELECT FOR UPDATE NOWAIT, okdoc ???
   
   Então ESSA é a resposta : não há bloqueio, há Acesso Constante a um objeto 
bloqueado, e para Identificar esse cenário vc faz o que eu disse acima e 
mostrei no meu exemplo, tá bem ?? Afora isso não sei realmente o que mais 
dizer...
   
[]s

  Chiappa

--- Em oracle_br@yahoogrupos.com.br, JLSilva jljlsilva@... escreveu

 Chiappa, gosto muito do nível de detalhes que vc responde, colocando bons 
 exemplos e sempre muito úteis.
 Mas, vejo que você apenas está repetindo o que eu disse na minha primeira 
 mensagem.
 Parafraseando seu modo de escrever:
 Eu ***JÁ*** sei que é um select for update nowait. Ja identifiquei isto, por 
 isso enviei o meu primeiro email, pois não tenho como evitar qua a aplicação 
 faça o que está fazendo.
 Eu ***JÁ*** sei que é a aplicação que ***DEVERIA encerrar 
 a transação. Mas, com eu ***JÁ*** disse: a aplicação ***NÃO O FAZ***.
 Eu achei que tinha deixado claro qual era a minha intenção ao perguntar se 
 alguém conhece uma maneira de desativar um nowait: a aplicação está fazendo 
 caca, e o cliente está sofrendo a consequencia, portanto será que existe uma 
 forma de auxiliá-lo a melhorar a situação?.
 
 O que eu gostaria de responder é:
 Quem está bloqueando ***QUEM*** (não oque, ok?) O que está esperando eu 
 já sei, é uma determinada tabela. O problema é descobrir a ordem dessa fila, 
 para fazer o deadlock manualmente e adequadamente. Ok?
 
 On Mar 18, 2013, at 9:16 PM, J. Laurindo Chiappa jlchiappa@... wrote:
 
  Nope, veja as minhas outras msgs com demonstrações (que provavelmente não 
  te chegaram antes de vc escrever esta), que :
  
   - é CLARO que as sessões estão SIM esperando por algo, sessão que não 
  espera por nadaé IMPOSSÍVEL 
  
   - é Claro que (ao menos desde a introdução do 10g) o banco Registra sim na 
  V$SESSION o SQL_ID sendo executado, a Espera, o objeto causando a espera, a 
  CLASSE da espera, então tanto DÁ SIM para vc identificar sessões acessando 
  sempre e sempre o mesmo objeto QUANTO dá para vc identificar que o SQL é 
  com NOWAIT, o que fecha o cenário que vc descreve - INCLUSIVE, ao menos por 
  mim essa foi uma das mais festejadas alterações no 10g, junto com a 
  AUTOMAÇÂO das estatísticas de execução de um SQL longo na V$SQL... Só quem 
  teve o desprazer de 

Re: [oracle_br] Re: Select … for update … nowait

2013-03-19 Por tôpico JLSilva
Tá certo, chefe.
Obrigado.

On Mar 19, 2013, at 12:52 PM, J. Laurindo Chiappa jlchia...@yahoo.com.br 
wrote:

 Então, achei que estava claro mas pelo jeito não ficou : 
 
 a) será que existe uma forma de auxiliá-lo a melhorar a situação?.
 
  A ÚNICA forma segura e adequada é o Fornecedor corrigir a aplicação, não 
 ficando indefinidamente tentando lockar o objeto, PONTO. Enquanto isso não 
 ocorre, o que vc pode fazer como Paliativo é o
  que eu indiquei em msgs anteriores, ie :
 
1. SE vc quer serializar completamente (ie, se quando já há alguém 
 executando o processo vc quer que as outras sessões que tentem executar 
 simultaneamente falhem, com aviso) , vc pode ter alguma tela/programa que o 
 usuário executa antes de entrar na rotina e checa se a rotina já está em 
 execução em outra sessão , abortando
 
2. SE não é serialização completa o que vc quer :
 
 - caso o processo chega a terminar depois de demorar muito, fazer algum 
 TUNING no processo para que ele termine o mais rapidamente possível e assim a 
 sessão A mantenha o lock o mínimo possível e libere o lock para a sessão B 
 processar, e B terminando o mais rápido possível libera o quanto antes C, 
 assim por diante
 
 e/ou
 
 - vc faz o que a aplicação não faz, ie, ENCERRA  a transação que está 
 demorando muito : para isso (provavelmente num job que rode a cada x 
 minutos), vc Identifica a sessão que obteve o lock , OU então coloca um 
 PROFILE limitando o tempo de conexão
 
 e é ISSO o quew vc pode fazer, sim ?? E como identificar os envolvidos, 
 vide abaixo...
 
 
 b)  quem está bloqueando ***QUEM***
 
  Esse é o ponto PRINCIPAL das minhas respostas, que pelo jeito não ficou 
 Claro : as outras sessões que estão num loop aguardando para obter o lock *** 
 NÂO ESTÃO BLOQUEADAS, elas estão acessando o objeto e tentando obter o lock, 
 mas ainda NÃO o obtiveram, sim ??? Não há LOCK WAIT aí, captou ??? Então, 
 para quem está bloqueando a resposta é, NINGUÉM, não há Bloqueio, não há 
 LOCK... E IMPORTANTE : como não há locks, não há uma FILA de espera, as n 
 sessões que estão acessando o objeto lockado para tentar obter o lock NÂO vão 
 ser atendidas por ordem, eu mostrei isso ...
   O que há na verdade é ACESSO constante ao objeto que está lockado na 
 Tentativa de obter um lock, sim ??? E como vc identifica um objeto lockado ? 
 pelas views de lock, como mostrei Como vc identifica as sessões que estão 
 CONSTANTEMENTE, pesadamente, tentando e tentando e tentando acessar esse 
 objeto lockado ? Pelo evento de concorrência, como mostrei. E como vc SABE 
 que esse acesso constante é para obter lock com FOR UPDATE NOWAIT ?? Vc 
 consulta o SQL que está sendo enviado pelas sessões sofrendo de Concurrency E 
 confere se é o SELECT FOR UPDATE NOWAIT, okdoc ???
 
   Então ESSA é a resposta : não há bloqueio, há Acesso Constante a um objeto 
 bloqueado, e para Identificar esse cenário vc faz o que eu disse acima e 
 mostrei no meu exemplo, tá bem ?? Afora isso não sei realmente o que mais 
 dizer...
 
[]s
 
  Chiappa
 
 --- Em oracle_br@yahoogrupos.com.br, JLSilva jljlsilva@... escreveu
 
 Chiappa, gosto muito do nível de detalhes que vc responde, colocando bons 
 exemplos e sempre muito úteis.
 Mas, vejo que você apenas está repetindo o que eu disse na minha primeira 
 mensagem.
 Parafraseando seu modo de escrever:
 Eu ***JÁ*** sei que é um select for update nowait. Ja identifiquei isto, por 
 isso enviei o meu primeiro email, pois não tenho como evitar qua a aplicação 
 faça o que está fazendo.
 Eu ***JÁ*** sei que é a aplicação que ***DEVERIA 
 encerrar a transação. Mas, com eu ***JÁ*** disse: a aplicação ***NÃO O 
 FAZ***.
 Eu achei que tinha deixado claro qual era a minha intenção ao perguntar se 
 alguém conhece uma maneira de desativar um nowait: a aplicação está fazendo 
 caca, e o cliente está sofrendo a consequencia, portanto será que existe 
 uma forma de auxiliá-lo a melhorar a situação?.
 
 O que eu gostaria de responder é:
 Quem está bloqueando ***QUEM*** (não oque, ok?) O que está esperando eu 
 já sei, é uma determinada tabela. O problema é descobrir a ordem dessa fila, 
 para fazer o deadlock manualmente e adequadamente. Ok?
 
 On Mar 18, 2013, at 9:16 PM, J. Laurindo Chiappa jlchiappa@... wrote:
 
 Nope, veja as minhas outras msgs com demonstrações (que provavelmente não 
 te chegaram antes de vc escrever esta), que :
 
 - é CLARO que as sessões estão SIM esperando por algo, sessão que não 
 espera por nadaé IMPOSSÍVEL 
 
 - é Claro que (ao menos desde a introdução do 10g) o banco Registra sim na 
 V$SESSION o SQL_ID sendo executado, a Espera, o objeto causando a espera, a 
 CLASSE da espera, então tanto DÁ SIM para vc identificar sessões acessando 
 sempre e sempre o mesmo objeto QUANTO dá para vc identificar que o SQL é 
 com NOWAIT, o que fecha o cenário que vc descreve - INCLUSIVE, ao menos por 
 mim essa foi uma das mais festejadas alterações no 10g, junto com a 
 

[oracle_br] Re: Select … for update … nowait

2013-03-18 Por tôpico J. Laurindo Chiappa
  Bom, vamos começar respondendo à sua pergunta : Não, em princípio afaik 
(salvo alguma alteração PESADA, não-suportada e EXTREMAMENTE perigosa de 
interferir no banco como um todo, tipo via parâmetros internos, OU então 
jogando-se o parâmetro de compatibility lá embaixo pra alguma versão antiga, 
etc ) no caso não há como vc alterar o comportamento do comando SELECT FOR 
UPDATE NOWAIT, não... Aliás, de modo geral, Não Há como vc fazer um dado 
comando que está documentado agir assim ou assado agir de outro jeito, não...

 Isso respondido, observo que vc está espantado com a utilização, e nem 
imagino porque : veja vc, é ABSOLUTAMENTE normal e documentado (vide manual 
Oracle® Database Advanced Application Developer's Guide cap. 1 - SQL 
Processing for Application Developers , e algumas entradas sobre LOCKs no 
Concepts) que é EXATAMENTE ASSIM que vc pergunta se um registro está lockado 
ou não : vc tenta fazer um lock com NOWAIT e se der ORA-0054 ele tá lockado, se 
não der não está... Eu ABSOLUTAMENTE NÃO ENTENDI a sua admiração, os !!! 
que vc colocou na msg, sim  Também Não Entendi porque vc quer mudar isso - 
é Absolutamente Normal que um recurso (tabela/registro/whatever) possa ser 
acessado em modo exclusivo, corretamente o teu Aplicativo CHECA isso, e vc quer 
remover esse check ?? Não entendo porque - diga para nós EXATAMENTE o que vc 
quer que a gente tenta sugerir algo

 []s
 
   Chiappa
   

--- Em oracle_br@yahoogrupos.com.br, JLSilva jljlsilva@... escreveu

 Senhores, boa tarde.
 Temos uma aplicação de terceiros (CHB) que faz select ... for update ... 
 NOWAIT.
 Essa aplicação recebe o erro ORA-00054 e o tratamento que ela dá é: tenta o 
 select novamente!!!
 Com isso, não ocorre o deadlock, nem consigo saber exatamente quem é o 
 bloqueador, pois há dezenas de sessões atualizando a mesma tabela.
 Alguém aí sabe se é possível desativar o nowait através de algum 
 parâmetro/configuração do banco?
 Obrigado!





Re: [oracle_br] Re: Select … for update … nowait

2013-03-18 Por tôpico JLSilva
Chiappa, o meu espanto é devido à lógica utilizada na aplicação.
Se o registro está lockado, o processo entra em um loop e tenta novamente 
executar exatamente o mesmo select for update nowait para lockar o registro.
O efeito cascata disso é que, ao fazer isto, a sessão A não libera os registros 
anteriores e continua tentando lockar novos registros que estão lockados pela 
sessão B.
Enquanto isso, a sessão B que está lockando outros registros, e em um 
determinado momento, a sessão B vai tentar lockar o registro que está lockado 
pela sessão A.
Se não fosse utilizado o nowait nesse select, ocorreria um deadlock, pois A 
está locando o registro 1, B está locando o registro 2, A tenta locar o 
registro 2 e B tenta locar o registro 1.
Mas, devido à forma que a aplicação foi construída, o deadlock nunca ocorre, e 
a aplicação nunca vai sair desse loop.
Agora, imagine isto ocorrendo com muitas sessões (mais de 10 sessões).
Acaba que tem várias sessões lockando registros, elas não liberam esses 
registros, e ficam tentando locar novos registros que já estão lockados por 
outras, e ficam nesse loop. Fica impossível identificar quem está lockando 
registros de quem.
Infelizmente, o fornecedor é daquele tipo difícil, e diz que o sistema está 
funcionando em 200 outros locais. Ok, mas aqui está ocorrendo esse problema...
Mas, concordo com você. Desativar o nowait teria um resultado muito 
imprevisível para o funcionamento do rdbms como um todo.

On Mar 18, 2013, at 5:30 PM, J. Laurindo Chiappa jlchia...@yahoo.com.br 
wrote:

  Bom, vamos começar respondendo à sua pergunta : Não, em princípio afaik 
 (salvo alguma alteração PESADA, não-suportada e EXTREMAMENTE perigosa de 
 interferir no banco como um todo, tipo via parâmetros internos, OU então 
 jogando-se o parâmetro de compatibility lá embaixo pra alguma versão antiga, 
 etc ) no caso não há como vc alterar o comportamento do comando SELECT FOR 
 UPDATE NOWAIT, não... Aliás, de modo geral, Não Há como vc fazer um dado 
 comando que está documentado agir assim ou assado agir de outro jeito, não...
 
 Isso respondido, observo que vc está espantado com a utilização, e nem 
 imagino porque : veja vc, é ABSOLUTAMENTE normal e documentado (vide manual 
 Oracle® Database Advanced Application Developer's Guide cap. 1 - SQL 
 Processing for Application Developers , e algumas entradas sobre LOCKs no 
 Concepts) que é EXATAMENTE ASSIM que vc pergunta se um registro está 
 lockado ou não : vc tenta fazer um lock com NOWAIT e se der ORA-0054 ele tá 
 lockado, se não der não está... Eu ABSOLUTAMENTE NÃO ENTENDI a sua 
 admiração, os !!! que vc colocou na msg, sim  Também Não Entendi 
 porque vc quer mudar isso - é Absolutamente Normal que um recurso 
 (tabela/registro/whatever) possa ser acessado em modo exclusivo, corretamente 
 o teu Aplicativo CHECA isso, e vc quer remover esse check ?? Não entendo 
 porque - diga para nós EXATAMENTE o que vc quer que a gente tenta sugerir 
 algo
 
 []s
 
   Chiappa
 
 
 --- Em oracle_br@yahoogrupos.com.br, JLSilva jljlsilva@... escreveu
 
 Senhores, boa tarde.
 Temos uma aplicação de terceiros (CHB) que faz select ... for update ... 
 NOWAIT.
 Essa aplicação recebe o erro ORA-00054 e o tratamento que ela dá é: tenta o 
 select novamente!!!
 Com isso, não ocorre o deadlock, nem consigo saber exatamente quem é o 
 bloqueador, pois há dezenas de sessões atualizando a mesma tabela.
 Alguém aí sabe se é possível desativar o nowait através de algum 
 parâmetro/configuração do banco?
 Obrigado!
 
 
 
 
 
 
 
 --
 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
 
 



[oracle_br] Re: Select … for update … nowait

2013-03-18 Por tôpico J. Laurindo Chiappa
  Hmmm, peraí : nunca vai sair é absolutamente Falso : o lock que A está 
mantendo (e que impede B de lockar o mesmo recurso) *** NÃO *** é Eterno, ele 
VAI SIM ser liberado assim que A encerrar a transação, seja com COMMIT seja com 
ROLLBACK, yes ??? Da mesma maneira, dizer que é impossível identificar quem 
está lockando registros de quem sorry, mas afaik é Inverdade também : via 
script é Plenamente Possível vc consultar quem está esperando pelo que, aí não 
é impossível não vc localizar quem está com o lock para si, os outros TODOS 
estão em espera por essa sessão, dado o cenário que vc descreve...
  
   O que é Questionável, podendo mesmo ser considerado uma FALHA no aplicativo 
é esse comportamento de :
   
1. deixar a transação que obteve o lock ficar ILIMITADAMENTE aberta, sem 
nenhum tipo de timeout, nem de aviso ao Operador se a transação for controlada 
pelo Usuário da aplicação e não for encerrada o mais logo possível

e

2. dado o fato 1. acima (de poder existir Transação sem controle 
estrito de tempo), após a Aplicação corretamente usar o for update nowait para 
testar se um recurso está lockado, quando detectar que um registro/resource 
está lockado (recebendo o ORA-0054) a Aplicação ficar tentando e retentando o 
lock INDEFINIDAMENTE é falha - o correto ao invés seria LIMITAR a quantidade de 
vezes em que espera o lock ser liberado (via LOOP ** não-eterno **, repetido 
uma qtdade FIXA de vezes) E/OU limitar o período de tempo em que espera o lock 
já presente ser encerrado com o fim datransação que o criou...

 Agora entendi, é uma falha de Controle/Tratamento pela Aplicação no 
procedimento de LOCK NOWAIT, que em si está Corretíssimo e Não deveria causar 
espanto algum, ok... 
 
  Muito bem, o que vc vai poder fazer aí a nível de banco de dados, Enquanto a 
Aplicação não tem essa falha corrigida é fazer no banco de dados o que a 
Aplicação não faz, ie, LIMITAR a duração de uma transação (e portanto limitar o 
tempo que um lock pode existir), OU então eliminar esses casos, o que poderia 
ser feito via :

  a) implementação algum tipo de timeout nas sessões (via PROFILE, talvez), 
para que uma sessão A que obteve um lock num dado recurso NÂO fique com 
transações abertas por tempo irrazoavelmente longo, assim limitando o tempo que 
B fica esperando pelo lock

e/ou

  b) tendo um JOB no banco que a cada poucos x minutos consulta a V$SESSION 
e/ou a DBA_LOCKS e/ou views de WAIT, e se detectar espera muito longa por locks 
o JOB poderia mandar um e-mail para te avisar e/ou matar a sessão incial que 
implantou o lock (REGISTRANDO essa ação nalgum lugar, é Claro), coisa do tipo

  []s

Chiappa


--- Em oracle_br@yahoogrupos.com.br, JLSilva jljlsilva@... escreveu

 Chiappa, o meu espanto é devido à lógica utilizada na aplicação.
 Se o registro está lockado, o processo entra em um loop e tenta novamente 
 executar exatamente o mesmo select for update nowait para lockar o registro.
 O efeito cascata disso é que, ao fazer isto, a sessão A não libera os 
 registros anteriores e continua tentando lockar novos registros que estão 
 lockados pela sessão B.
 Enquanto isso, a sessão B que está lockando outros registros, e em um 
 determinado momento, a sessão B vai tentar lockar o registro que está lockado 
 pela sessão A.
 Se não fosse utilizado o nowait nesse select, ocorreria um deadlock, pois A 
 está locando o registro 1, B está locando o registro 2, A tenta locar o 
 registro 2 e B tenta locar o registro 1.
 Mas, devido à forma que a aplicação foi construída, o deadlock nunca ocorre, 
 e a aplicação nunca vai sair desse loop.
 Agora, imagine isto ocorrendo com muitas sessões (mais de 10 sessões).
 Acaba que tem várias sessões lockando registros, elas não liberam esses 
 registros, e ficam tentando locar novos registros que já estão lockados por 
 outras, e ficam nesse loop. Fica impossível identificar quem está lockando 
 registros de quem.
 Infelizmente, o fornecedor é daquele tipo difícil, e diz que o sistema está 
 funcionando em 200 outros locais. Ok, mas aqui está ocorrendo esse 
 problema...
 Mas, concordo com você. Desativar o nowait teria um resultado muito 
 imprevisível para o funcionamento do rdbms como um todo.
 
 On Mar 18, 2013, at 5:30 PM, J. Laurindo Chiappa jlchiappa@... wrote:
 
   Bom, vamos começar respondendo à sua pergunta : Não, em princípio afaik 
  (salvo alguma alteração PESADA, não-suportada e EXTREMAMENTE perigosa de 
  interferir no banco como um todo, tipo via parâmetros internos, OU então 
  jogando-se o parâmetro de compatibility lá embaixo pra alguma versão 
  antiga, etc ) no caso não há como vc alterar o comportamento do comando 
  SELECT FOR UPDATE NOWAIT, não... Aliás, de modo geral, Não Há como vc 
  fazer um dado comando que está documentado agir assim ou assado agir de 
  outro jeito, não...
  
  Isso respondido, observo que vc está espantado com a utilização, e nem 
  imagino porque : veja vc, é ABSOLUTAMENTE normal e 

[oracle_br] Re: Select … for update … nowait

2013-03-18 Por tôpico J. Laurindo Chiappa
 Só para mostrar que *** Não É Verdade *** que vc não possa identificar as 
sessões que estão Esperando para obter um lock, veja o Exemplo abaixo (em 11gr2 
EE, mas em princípio Independente de versão) : terei 3 janelas separadas (e 
portanto 3 sessões) que vão rodar a mesma rotina que não trata corretamente os 
locks, ficando em loop eterno E não limitando transações nem sessões, vamos 
botar a porimeira para executar :
 
 
 scott#1:SQLDECLARE
  2resource_busy exception;
  3pragma exception_init (resource_busy,-54);
  4v_num number;
  5  BEGIN
  6 loop
  7Begin
  8   select 1 into v_num from dept where deptno=10 FOR UPDATE NOWAIT;
  9  update dept set dname='TESTE' where deptno=10;
 10   exit;
 11Exception
 12   when resource_busy then
 13  null;
 14End;
 15 end loop;
 16  END;
 17  /

Procedimento PL/SQL concluÝdo com sucesso.

 == ok, essa seria a sessão A no seu cenário, como ela foi casualmente a 
primeira ela obtém o lock... Vamos botar pra rodar a mesma rotina com loop 
eterno em outras múltiplas janelas :
 
 SCOTT#2:SQLDECLARE
  2resource_busy exception;
  3pragma exception_init (resource_busy,-54);
  4v_num number;
  5  BEGIN
  6 loop
  7Begin
  8   select 1 into v_num from dept where deptno=10 FOR UPDATE NOWAIT;
  9  update dept set dname='TESTE' where deptno=10;
 10   exit;
 11Exception
 12   when resource_busy then
 13  null;
 14End;
 15 end loop;
 16  END;
 17  /

 
 = Imediatamente a sessão 'congela' dado o loop eterno, vamos abrir ainda 
outra :
 
 scott#3:SQLDECLARE
  2resource_busy exception;
  3pragma exception_init (resource_busy,-54);
  4v_num number;
  5  BEGIN
  6 loop
  7Begin
  8   select 1 into v_num from dept where deptno=10 FOR UPDATE NOWAIT;
  9  update dept set dname='TESTE' where deptno=10;
 10   exit;
 11Exception
 12   when resource_busy then
 13  null;
 14End;
 15 end loop;
 16  END;
 17  /

okdoc, as janelas 2 e 3 estão em freeze aqui, vamos consultar o status geral 
consultando as views adequadas em uma sessão privilegiada (no caso consultando 
só o usuário SCOTT só por Brevidade de exemplo, claro que em Prod seriam Outras 
as consições de filtro quye vc colocaria na V$SESSION) :

SYSTEM@o11gr2:SQLselect sid, serial#, username, logon_time, event, 
blocking_instance, blocking_session, wait_class, p1, p2, p3, seconds_in_wait 
from v$session where username='SCOTT';

   SIDSERIAL# USERNAME   LOGON_TI EVENT 
   BLOCKING_INSTA
NCE BLOCKING_SESSION WAIT_CLASS 
   P1 P2 P3 SECONDS_IN_WAIT
-- -- --  
 --
---  
 -- 
-- -- --
-
14 12 SCOTT  18/03/13 SQL*Net message 
from client
  Idle  
   838976  1  0 416
20 17 SCOTT  18/03/13 buffer busy waits
  Concurrency   
4135  1   0
   141 12 SCOTT  18/03/13 buffer busy waits
  Concurrency   
4135  1   0

 espero um pouco ...
SYSTEM@o11gr2:SQL/

   SIDSERIAL# USERNAME   LOGON_TI EVENT 
   BLOCKING_INSTA
NCE BLOCKING_SESSION WAIT_CLASS 
   P1 P2 P3 SECONDS_IN_WAIT
-- -- --  
 --
---  
 -- 
-- -- --
-
14 12 SCOTT  18/03/13 SQL*Net message 
from client
  Idle  
   838976  1  0 428
20 17 SCOTT  18/03/13 buffer busy waits
  Concurrency   
4135  1   0
   141 12 SCOTT  18/03/13 buffer busy waits
  Concurrency   
4   

Re: [oracle_br] Re: Select … for update … nowait

2013-03-18 Por tôpico JLSilva
Chiappa,
Agradeço o tempo que você despendeu para analisar o caso, mas devo discordar 
totalmente de você, amigo.
1. Veja, não há nenhuma sessão esperando nada.. o select for update está usando 
NOWAIT, que é justamente para não esperar.. Ocorre o ORA-00054, e a aplicação 
tenta bloquear o registro novamente, e ocorre novamente o ORA-00054, e tenta 
novamente.. nesse processo, ela nunca faz commit/rollback, entende..? A sessão 
nunca fica numa longa espera por lock...
2. Não é possível identificar exatamente quem está bloqueando quem, já que não 
tenho como saber qual registro uma sessão está bloqueando sem ter 
antecipadamente ativado um trace. O máximo que consigo é verificar todas as 
sessões que têm uma transação aberta em uma tabela.. mas não em qual registro, 
correto?
3. Absolutamente verdadeiro quando digo que nunca vai terminar esse loop: veja 
que é como um deadlock, mas sem o mecanismo de deadlock do Oracle, uma vez que 
a aplicação é que fica num loop eterno tentando bloquear um registro que está 
blqueado por outra sessão, sendo que essa outra sessão nunca vai fazer 
commit/rollback já que ela também está tentando bloquear registros que estão 
bloqueados pela outra sessão.

On Mar 18, 2013, at 7:39 PM, J. Laurindo Chiappa jlchia...@yahoo.com.br 
wrote:

  Hmmm, peraí : nunca vai sair é absolutamente Falso : o lock que A está 
 mantendo (e que impede B de lockar o mesmo recurso) *** NÃO *** é Eterno, ele 
 VAI SIM ser liberado assim que A encerrar a transação, seja com COMMIT seja 
 com ROLLBACK, yes ??? Da mesma maneira, dizer que é impossível identificar 
 quem está lockando registros de quem sorry, mas afaik é Inverdade também : 
 via script é Plenamente Possível vc consultar quem está esperando pelo que, 
 aí não é impossível não vc localizar quem está com o lock para si, os outros 
 TODOS estão em espera por essa sessão, dado o cenário que vc descreve...
 
   O que é Questionável, podendo mesmo ser considerado uma FALHA no aplicativo 
 é esse comportamento de :
 
1. deixar a transação que obteve o lock ficar ILIMITADAMENTE aberta, sem 
 nenhum tipo de timeout, nem de aviso ao Operador se a transação for 
 controlada pelo Usuário da aplicação e não for encerrada o mais logo possível
   
   e
   
   2. dado o fato 1. acima (de poder existir Transação sem controle 
 estrito de tempo), após a Aplicação corretamente usar o for update nowait 
 para testar se um recurso está lockado, quando detectar que um 
 registro/resource está lockado (recebendo o ORA-0054) a Aplicação ficar 
 tentando e retentando o lock INDEFINIDAMENTE é falha - o correto ao invés 
 seria LIMITAR a quantidade de vezes em que espera o lock ser liberado (via 
 LOOP ** não-eterno **, repetido uma qtdade FIXA de vezes) E/OU limitar o 
 período de tempo em que espera o lock já presente ser encerrado com o fim 
 datransação que o criou...
 
 Agora entendi, é uma falha de Controle/Tratamento pela Aplicação no 
 procedimento de LOCK NOWAIT, que em si está Corretíssimo e Não deveria causar 
 espanto algum, ok... 
 
  Muito bem, o que vc vai poder fazer aí a nível de banco de dados, Enquanto a 
 Aplicação não tem essa falha corrigida é fazer no banco de dados o que a 
 Aplicação não faz, ie, LIMITAR a duração de uma transação (e portanto limitar 
 o tempo que um lock pode existir), OU então eliminar esses casos, o que 
 poderia ser feito via :
 
  a) implementação algum tipo de timeout nas sessões (via PROFILE, talvez), 
 para que uma sessão A que obteve um lock num dado recurso NÂO fique com 
 transações abertas por tempo irrazoavelmente longo, assim limitando o tempo 
 que B fica esperando pelo lock
 
 e/ou
 
  b) tendo um JOB no banco que a cada poucos x minutos consulta a V$SESSION 
 e/ou a DBA_LOCKS e/ou views de WAIT, e se detectar espera muito longa por 
 locks o JOB poderia mandar um e-mail para te avisar e/ou matar a sessão 
 incial que implantou o lock (REGISTRANDO essa ação nalgum lugar, é Claro), 
 coisa do tipo
 
  []s
 
Chiappa
 
 
 --- Em oracle_br@yahoogrupos.com.br, JLSilva jljlsilva@... escreveu
 
 Chiappa, o meu espanto é devido à lógica utilizada na aplicação.
 Se o registro está lockado, o processo entra em um loop e tenta novamente 
 executar exatamente o mesmo select for update nowait para lockar o registro.
 O efeito cascata disso é que, ao fazer isto, a sessão A não libera os 
 registros anteriores e continua tentando lockar novos registros que estão 
 lockados pela sessão B.
 Enquanto isso, a sessão B que está lockando outros registros, e em um 
 determinado momento, a sessão B vai tentar lockar o registro que está 
 lockado pela sessão A.
 Se não fosse utilizado o nowait nesse select, ocorreria um deadlock, pois 
 A está locando o registro 1, B está locando o registro 2, A tenta locar o 
 registro 2 e B tenta locar o registro 1.
 Mas, devido à forma que a aplicação foi construída, o deadlock nunca ocorre, 
 e a aplicação nunca vai sair desse loop.
 Agora, imagine isto ocorrendo com 

[oracle_br] Re: Select … for update … nowait

2013-03-18 Por tôpico J. Laurindo Chiappa
  E uma curiosidade : como as sessões 2 e 3 estão Constantemente enviando 
pedidos de lock não satisfeitos, paralelemante, quando a Transação que obteve o 
lock encerrar, NÂO É NECESSARIAMENTE a segunda sessão que vai receber o lock , 
é aleatório, já que ambas estão enviando constantemente requestes, sabe-se lá 
qual o request mais recente no instante que a Transação que deveolve o lock é 
fechada... NO meu exemplo, não foi a 2 mas sim a 3 , que entrou por último :
  
scott#1:SQLrollback;

Rollback concluÝdo.

= veja lá o que aqcontece nas outras :

scott#3:SQLDECLARE
  2resource_busy exception;
  3pragma exception_init (resource_busy,-54);
  4v_num number;
  5  BEGIN
  6 loop
  7Begin
  8   select 1 into v_num from dept where deptno=10 FOR UPDATE NOWAIT;
  9  update dept set dname='TESTE' where deptno=10;
 10   exit;
 11Exception
 12   when resource_busy then
 13  null;
 14End;
 15 end loop;
 16  END;
 17  /

Procedimento PL/SQL concluÝdo com sucesso.

scott#3:SQL
 
 e na dois continua o mesmo freeze, a v$session CONTINUA mostrando que há 
Concorrência, nesse mesmo objeto, é isso aí 
 
  []s
  
Chiappa

--- Em oracle_br@yahoogrupos.com.br, J. Laurindo Chiappa jlchiappa@... 
escreveu

  Só para mostrar que *** Não É Verdade *** que vc não possa identificar as 
 sessões que estão Esperando para obter um lock, veja o Exemplo abaixo (em 
 11gr2 EE, mas em princípio Independente de versão) : terei 3 janelas 
 separadas (e portanto 3 sessões) que vão rodar a mesma rotina que não trata 
 corretamente os locks, ficando em loop eterno E não limitando transações nem 
 sessões, vamos botar a porimeira para executar :
  
  
  scott#1:SQLDECLARE
   2resource_busy exception;
   3pragma exception_init (resource_busy,-54);
   4v_num number;
   5  BEGIN
   6 loop
   7Begin
   8   select 1 into v_num from dept where deptno=10 FOR UPDATE NOWAIT;
   9  update dept set dname='TESTE' where deptno=10;
  10   exit;
  11Exception
  12   when resource_busy then
  13  null;
  14End;
  15 end loop;
  16  END;
  17  /
 
 Procedimento PL/SQL concluÝdo com sucesso.
 
  == ok, essa seria a sessão A no seu cenário, como ela foi casualmente a 
 primeira ela obtém o lock... Vamos botar pra rodar a mesma rotina com loop 
 eterno em outras múltiplas janelas :
  
  SCOTT#2:SQLDECLARE
   2resource_busy exception;
   3pragma exception_init (resource_busy,-54);
   4v_num number;
   5  BEGIN
   6 loop
   7Begin
   8   select 1 into v_num from dept where deptno=10 FOR UPDATE NOWAIT;
   9  update dept set dname='TESTE' where deptno=10;
  10   exit;
  11Exception
  12   when resource_busy then
  13  null;
  14End;
  15 end loop;
  16  END;
  17  /
 
  
  = Imediatamente a sessão 'congela' dado o loop eterno, vamos abrir ainda 
 outra :
  
  scott#3:SQLDECLARE
   2resource_busy exception;
   3pragma exception_init (resource_busy,-54);
   4v_num number;
   5  BEGIN
   6 loop
   7Begin
   8   select 1 into v_num from dept where deptno=10 FOR UPDATE NOWAIT;
   9  update dept set dname='TESTE' where deptno=10;
  10   exit;
  11Exception
  12   when resource_busy then
  13  null;
  14End;
  15 end loop;
  16  END;
  17  /
 
 okdoc, as janelas 2 e 3 estão em freeze aqui, vamos consultar o status 
 geral consultando as views adequadas em uma sessão privilegiada (no caso 
 consultando só o usuário SCOTT só por Brevidade de exemplo, claro que em Prod 
 seriam Outras as consições de filtro quye vc colocaria na V$SESSION) :
 
 SYSTEM@o11gr2:SQLselect sid, serial#, username, logon_time, event, 
 blocking_instance, blocking_session, wait_class, p1, p2, p3, seconds_in_wait 
 from v$session where username='SCOTT';
 
SIDSERIAL# USERNAME   LOGON_TI EVENT   
  BLOCKING_INSTA
 NCE BLOCKING_SESSION WAIT_CLASS   
  P1 P2 P3 SECONDS_IN_WAIT
 -- -- --  
  --
 ---  
  -- 
 -- -- --
 -
 14 12 SCOTT  18/03/13 SQL*Net message 
 from client
   Idle
  838976  1  0 416
 20 17 SCOTT  18/03/13 buffer busy 
 waits
   Concurrency 
   4135  1   0
141 12 

[oracle_br] Re: Select … for update … nowait

2013-03-18 Por tôpico J. Laurindo Chiappa
 Nope, veja as minhas outras msgs com demonstrações (que provavelmente não te 
chegaram antes de vc escrever esta), que :
 
  - é CLARO que as sessões estão SIM esperando por algo, sessão que não espera 
por nadaé IMPOSSÍVEL 
  
  - é Claro que (ao menos desde a introdução do 10g) o banco Registra sim na 
V$SESSION o SQL_ID sendo executado, a Espera, o objeto causando a espera, a 
CLASSE da espera, então tanto DÁ SIM para vc identificar sessões acessando 
sempre e sempre o mesmo objeto QUANTO dá para vc identificar que o SQL é com 
NOWAIT, o que fecha o cenário que vc descreve - INCLUSIVE, ao menos por mim 
essa foi uma das mais festejadas alterações no 10g, junto com a AUTOMAÇÂO das 
estatísticas de execução de um SQL longo na V$SQL... Só quem teve o desprazer 
de trabalhar com versões anteriores pode avaliar o quão útil isso é

  - é VERDADE que não há como vc identificar o REGISTRO já lockado e sendo 
acessado constantemente via for update nowait em um loop, Mas como eu mostrei 
vc consegue Sim identificar as sessões constantemente acessando o mesmo OBJETO 
e aí pelo SQL dessas sessões vc Comprova ou não que é esse caso do NOWAIT
  
  
  == e só para deixar Escrupulosamente Claro : quem TEM que fazer COMMIT ou 
ROLLBACK é a sessão A, que obteve o lock e o está mantendo, SIM ???  A falha da 
Aplicação é que ela NEM limita o tempo que A fica com a transação aberta e 
mantendo o LOCK, e NEM (mesmo ela, Aplicação) sabendo que PODEM haver 
transações erradamente abertas por muito muito tempo, nem mesmo assim ela 
aplica algum LIMITE na qtdade de vezes e/ou no tempo que fica esperando A 
liberar o lock com o encerramento da Transação 
  
[]s

  Chiappa
  

--- Em oracle_br@yahoogrupos.com.br, JLSilva jljlsilva@... escreveu

 Chiappa,
 Agradeço o tempo que você despendeu para analisar o caso, mas devo discordar 
 totalmente de você, amigo.
 1. Veja, não há nenhuma sessão esperando nada.. o select for update está 
 usando NOWAIT, que é justamente para não esperar.. Ocorre o ORA-00054, e a 
 aplicação tenta bloquear o registro novamente, e ocorre novamente o 
 ORA-00054, e tenta novamente.. nesse processo, ela nunca faz commit/rollback, 
 entende..? A sessão nunca fica numa longa espera por lock...
 2. Não é possível identificar exatamente quem está bloqueando quem, já que 
 não tenho como saber qual registro uma sessão está bloqueando sem ter 
 antecipadamente ativado um trace. O máximo que consigo é verificar todas as 
 sessões que têm uma transação aberta em uma tabela.. mas não em qual 
 registro, correto?
 3. Absolutamente verdadeiro quando digo que nunca vai terminar esse loop: 
 veja que é como um deadlock, mas sem o mecanismo de deadlock do Oracle, uma 
 vez que a aplicação é que fica num loop eterno tentando bloquear um registro 
 que está blqueado por outra sessão, sendo que essa outra sessão nunca vai 
 fazer commit/rollback já que ela também está tentando bloquear registros que 
 estão bloqueados pela outra sessão.
 
 On Mar 18, 2013, at 7:39 PM, J. Laurindo Chiappa jlchiappa@... wrote:
 
   Hmmm, peraí : nunca vai sair é absolutamente Falso : o lock que A está 
  mantendo (e que impede B de lockar o mesmo recurso) *** NÃO *** é Eterno, 
  ele VAI SIM ser liberado assim que A encerrar a transação, seja com COMMIT 
  seja com ROLLBACK, yes ??? Da mesma maneira, dizer que é impossível 
  identificar quem está lockando registros de quem sorry, mas afaik é 
  Inverdade também : via script é Plenamente Possível vc consultar quem está 
  esperando pelo que, aí não é impossível não vc localizar quem está com o 
  lock para si, os outros TODOS estão em espera por essa sessão, dado o 
  cenário que vc descreve...
  
O que é Questionável, podendo mesmo ser considerado uma FALHA no 
  aplicativo é esse comportamento de :
  
 1. deixar a transação que obteve o lock ficar ILIMITADAMENTE aberta, sem 
  nenhum tipo de timeout, nem de aviso ao Operador se a transação for 
  controlada pelo Usuário da aplicação e não for encerrada o mais logo 
  possível
  
  e
  
  2. dado o fato 1. acima (de poder existir Transação sem controle 
  estrito de tempo), após a Aplicação corretamente usar o for update nowait 
  para testar se um recurso está lockado, quando detectar que um 
  registro/resource está lockado (recebendo o ORA-0054) a Aplicação ficar 
  tentando e retentando o lock INDEFINIDAMENTE é falha - o correto ao invés 
  seria LIMITAR a quantidade de vezes em que espera o lock ser liberado (via 
  LOOP ** não-eterno **, repetido uma qtdade FIXA de vezes) E/OU limitar o 
  período de tempo em que espera o lock já presente ser encerrado com o fim 
  datransação que o criou...
  
  Agora entendi, é uma falha de Controle/Tratamento pela Aplicação no 
  procedimento de LOCK NOWAIT, que em si está Corretíssimo e Não deveria 
  causar espanto algum, ok... 
  
   Muito bem, o que vc vai poder fazer aí a nível de banco de dados, Enquanto 
  a Aplicação não tem essa 

[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 
milton.bastos@... 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]





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.brmailto:oracle_br%40yahoogrupos.com.br, 
Milton Bastos Henriquis Junior milton.bastos@... 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]




Clique 
aquihttps://www.mailcontrol.com/sr/Vlh7PKLuTJ

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 
milton.bastos@... 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.brmailto:oracle_br%40yahoogrupos.com.br, 
 Milton Bastos Henriquis Junior milton.bastos@ 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

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 
 milton.bastos@... 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.brmailto:oracle_br%40yahoogrupos.com.br, 
 Milton Bastos Henriquis Junior milton.bastos@ 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

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.brmailto:oracle_br%40yahoogrupos.com.br, 
 Milton Bastos Henriquis Junior milton.bastos@... 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.brmailto:oracle_br%40yahoogrupos.com.br 
 [mailto:oracle_br@yahoogrupos.com.brmailto:oracle_br%40yahoogrupos.com.br] 
 Em nome de José Laurindo
 Enviada em: quinta-feira, 17 de novembro de 2011 11:15
 Para: oracle_br@yahoogrupos.com.brmailto:oracle_br%40yahoogrupos.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.brmailto:oracle_br%40yahoogrupos.com.brmailto:oracle_br%40yahoogrupos.com.br,
  Milton Bastos Henriquis Junior milton.bastos@ 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

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 
milton.bastos@... 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.brmailto:oracle_br%40yahoogrupos.com.br, 
  Milton Bastos Henriquis Junior milton.bastos@ 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.brmailto:oracle_br%40yahoogrupos.com.br 
  [mailto:oracle_br@yahoogrupos.com.brmailto:oracle_br%40yahoogrupos.com.br]
   Em nome de José Laurindo
  Enviada em: quinta-feira, 17 de novembro de 2011 11:15
  Para: oracle_br@yahoogrupos.com.brmailto:oracle_br%40yahoogrupos.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

[oracle_br] Re: Select

2011-08-09 Por tôpico Ricardo
Bom dia!

tente usar:
-
select max(data) as data, valor

from alt3

where tar = '14000' and key = '21' and nat = 'AD' group by max(data),valor
--

fiz o teste aq e funcionou assim.
boa sorte!

--- Em oracle_br@yahoogrupos.com.br, Carlos Pinto carlos.pintoo@... escreveu

 Ola a Todos, mais uma ajuda.
 
  
 
 select data, valor 
 
 from alt3 
 
 where tar = '14000' and key = '21' and nat = 'AD'
 
  
 
 Estou a executar este select e a informação que dá é a seguinte:
 
  
 
 Data  -  Valor
 
 12-07-2004 -  8,5
 
 12-07-2004 -  8,5
 
 01-03-2011 -  2,5
 
 01-03-2011 -  2,5
 
  
 
  
 
 A informação que necessitava era o MAX data e o valor respectivo dessa data.
 
  
 
  
 
  
 
 Carlos Pinto
 
  
 
 
 
 [As partes desta mensagem que não continham texto foram removidas]





RE: [oracle_br] Re: Select

2011-08-09 Por tôpico Carlos Pinto
Agora da-me este erro 

 

ORA-00934: group function is not allowed here

 

Estas tambem a selecionar o group by max(data),valor….Funciona?



 

 

 

Carlos Pinto

 

De: oracle_br@yahoogrupos.com.br [mailto:oracle_br@yahoogrupos.com.br] Em
nome de Ricardo
Enviada: terça-feira, 9 de Agosto de 2011 11:19
Para: oracle_br@yahoogrupos.com.br
Assunto: [oracle_br] Re: Select

 

  

Bom dia!

tente usar:
-
select max(data) as data, valor

from alt3

where tar = '14000' and key = '21' and nat = 'AD' group by max(data),valor
--

fiz o teste aq e funcionou assim.
boa sorte!

--- Em oracle_br@yahoogrupos.com.br mailto:oracle_br%40yahoogrupos.com.br
, Carlos Pinto carlos.pintoo@... escreveu

 Ola a Todos, mais uma ajuda.
 
 
 
 select data, valor 
 
 from alt3 
 
 where tar = '14000' and key = '21' and nat = 'AD'
 
 
 
 Estou a executar este select e a informação que dá é a seguinte:
 
 
 
 Data - Valor
 
 12-07-2004 - 8,5
 
 12-07-2004 - 8,5
 
 01-03-2011 - 2,5
 
 01-03-2011 - 2,5
 
 
 
 
 
 A informação que necessitava era o MAX data e o valor respectivo dessa
data.
 
 
 
 
 
 
 
 Carlos Pinto
 
 
 
 
 
 [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

2011-08-09 Por tôpico Alisson Luz
Carlos...

 

Esse erro por ter algumas funções que não são permitida no group by ou where
exemplos AVG, MAX, MIN, etc...

 

Retire essas funções da sua qry e caso precise filtrar use o HAVING.

 

 

 

 

 

De: oracle_br@yahoogrupos.com.br [mailto:oracle_br@yahoogrupos.com.br] Em
nome de Carlos Pinto
Enviada em: terça-feira, 9 de agosto de 2011 07:40
Para: oracle_br@yahoogrupos.com.br
Assunto: RE: [oracle_br] Re: Select

 

  

Agora da-me este erro 

ORA-00934: group function is not allowed here

Estas tambem a selecionar o group by max(data),valor….Funciona?

Carlos Pinto

De: oracle_br@yahoogrupos.com.br mailto:oracle_br%40yahoogrupos.com.br
[mailto:oracle_br@yahoogrupos.com.br mailto:oracle_br%40yahoogrupos.com.br
] Em
nome de Ricardo
Enviada: terça-feira, 9 de Agosto de 2011 11:19
Para: oracle_br@yahoogrupos.com.br mailto:oracle_br%40yahoogrupos.com.br 
Assunto: [oracle_br] Re: Select

Bom dia!

tente usar:
-
select max(data) as data, valor

from alt3

where tar = '14000' and key = '21' and nat = 'AD' group by max(data),valor
--

fiz o teste aq e funcionou assim.
boa sorte!

--- Em oracle_br@yahoogrupos.com.br mailto:oracle_br%40yahoogrupos.com.br
mailto:oracle_br%40yahoogrupos.com.br
, Carlos Pinto carlos.pintoo@... escreveu

 Ola a Todos, mais uma ajuda.
 
 
 
 select data, valor 
 
 from alt3 
 
 where tar = '14000' and key = '21' and nat = 'AD'
 
 
 
 Estou a executar este select e a informação que dá é a seguinte:
 
 
 
 Data - Valor
 
 12-07-2004 - 8,5
 
 12-07-2004 - 8,5
 
 01-03-2011 - 2,5
 
 01-03-2011 - 2,5
 
 
 
 
 
 A informação que necessitava era o MAX data e o valor respectivo dessa
data.
 
 
 
 
 
 
 
 Carlos Pinto
 
 
 
 
 
 [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]



RES: [oracle_br] Re: Select

2011-08-09 Por tôpico Alisson Luz
Ops correção retire as funções do where ou do group by...

 

De: oracle_br@yahoogrupos.com.br [mailto:oracle_br@yahoogrupos.com.br] Em
nome de Alisson Luz
Enviada em: terça-feira, 9 de agosto de 2011 08:33
Para: oracle_br@yahoogrupos.com.br
Assunto: RES: [oracle_br] Re: Select

 

  

Carlos...

Esse erro por ter algumas funções que não são permitida no group by ou where
exemplos AVG, MAX, MIN, etc...

Retire essas funções da sua qry e caso precise filtrar use o HAVING.

De: oracle_br@yahoogrupos.com.br mailto:oracle_br%40yahoogrupos.com.br
[mailto:oracle_br@yahoogrupos.com.br mailto:oracle_br%40yahoogrupos.com.br
] Em
nome de Carlos Pinto
Enviada em: terça-feira, 9 de agosto de 2011 07:40
Para: oracle_br@yahoogrupos.com.br mailto:oracle_br%40yahoogrupos.com.br 
Assunto: RE: [oracle_br] Re: Select

Agora da-me este erro 

ORA-00934: group function is not allowed here

Estas tambem a selecionar o group by max(data),valor….Funciona?

Carlos Pinto

De: oracle_br@yahoogrupos.com.br mailto:oracle_br%40yahoogrupos.com.br
mailto:oracle_br%40yahoogrupos.com.br
[mailto:oracle_br@yahoogrupos.com.br mailto:oracle_br%40yahoogrupos.com.br
mailto:oracle_br%40yahoogrupos.com.br
] Em
nome de Ricardo
Enviada: terça-feira, 9 de Agosto de 2011 11:19
Para: oracle_br@yahoogrupos.com.br mailto:oracle_br%40yahoogrupos.com.br
mailto:oracle_br%40yahoogrupos.com.br 
Assunto: [oracle_br] Re: Select

Bom dia!

tente usar:
-
select max(data) as data, valor

from alt3

where tar = '14000' and key = '21' and nat = 'AD' group by max(data),valor
--

fiz o teste aq e funcionou assim.
boa sorte!

--- Em oracle_br@yahoogrupos.com.br mailto:oracle_br%40yahoogrupos.com.br
mailto:oracle_br%40yahoogrupos.com.br
mailto:oracle_br%40yahoogrupos.com.br
, Carlos Pinto carlos.pintoo@... escreveu

 Ola a Todos, mais uma ajuda.
 
 
 
 select data, valor 
 
 from alt3 
 
 where tar = '14000' and key = '21' and nat = 'AD'
 
 
 
 Estou a executar este select e a informação que dá é a seguinte:
 
 
 
 Data - Valor
 
 12-07-2004 - 8,5
 
 12-07-2004 - 8,5
 
 01-03-2011 - 2,5
 
 01-03-2011 - 2,5
 
 
 
 
 
 A informação que necessitava era o MAX data e o valor respectivo dessa
data.
 
 
 
 
 
 
 
 Carlos Pinto
 
 
 
 
 
 [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]





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



RE: [Bulk] RES: [oracle_br] Re: Select

2011-08-09 Por tôpico Carlos Pinto
Alisson neste momento tenho este SELECT

 

select max(data) as data, valor

from alt3

where tar = '14000' and key = '21' and nat= 'AD'

group by valor

 

 

E o resultado é este

 

DATA-  VALOR

12-07-2004 -  8,5

01-03-2011 -  2,5

 

 

O que pretendia é que fosse buscar era 01-03-2011 – 2,5

Ou seja deveria buscar a data maxima e o respectivo valor da data maxima

 

 

Carlos Pinto

 

De: oracle_br@yahoogrupos.com.br [mailto:oracle_br@yahoogrupos.com.br] Em
nome de Alisson Luz
Enviada: terça-feira, 9 de Agosto de 2011 12:42
Para: oracle_br@yahoogrupos.com.br
Assunto: [Bulk] RES: [oracle_br] Re: Select

 

  

Ops correção retire as funções do where ou do group by...

De: oracle_br@yahoogrupos.com.br mailto:oracle_br%40yahoogrupos.com.br
[mailto:oracle_br@yahoogrupos.com.br mailto:oracle_br%40yahoogrupos.com.br
] Em
nome de Alisson Luz
Enviada em: terça-feira, 9 de agosto de 2011 08:33
Para: oracle_br@yahoogrupos.com.br mailto:oracle_br%40yahoogrupos.com.br 
Assunto: RES: [oracle_br] Re: Select

Carlos...

Esse erro por ter algumas funções que não são permitida no group by ou where
exemplos AVG, MAX, MIN, etc...

Retire essas funções da sua qry e caso precise filtrar use o HAVING.

De: oracle_br@yahoogrupos.com.br mailto:oracle_br%40yahoogrupos.com.br
mailto:oracle_br%40yahoogrupos.com.br
[mailto:oracle_br@yahoogrupos.com.br mailto:oracle_br%40yahoogrupos.com.br
mailto:oracle_br%40yahoogrupos.com.br
] Em
nome de Carlos Pinto
Enviada em: terça-feira, 9 de agosto de 2011 07:40
Para: oracle_br@yahoogrupos.com.br mailto:oracle_br%40yahoogrupos.com.br
mailto:oracle_br%40yahoogrupos.com.br 
Assunto: RE: [oracle_br] Re: Select

Agora da-me este erro 

ORA-00934: group function is not allowed here

Estas tambem a selecionar o group by max(data),valor….Funciona?

Carlos Pinto

De: oracle_br@yahoogrupos.com.br mailto:oracle_br%40yahoogrupos.com.br
mailto:oracle_br%40yahoogrupos.com.br
mailto:oracle_br%40yahoogrupos.com.br
[mailto:oracle_br@yahoogrupos.com.br mailto:oracle_br%40yahoogrupos.com.br
mailto:oracle_br%40yahoogrupos.com.br
mailto:oracle_br%40yahoogrupos.com.br
] Em
nome de Ricardo
Enviada: terça-feira, 9 de Agosto de 2011 11:19
Para: oracle_br@yahoogrupos.com.br mailto:oracle_br%40yahoogrupos.com.br
mailto:oracle_br%40yahoogrupos.com.br
mailto:oracle_br%40yahoogrupos.com.br 
Assunto: [oracle_br] Re: Select

Bom dia!

tente usar:
-
select max(data) as data, valor

from alt3

where tar = '14000' and key = '21' and nat = 'AD' group by max(data),valor
--

fiz o teste aq e funcionou assim.
boa sorte!

--- Em oracle_br@yahoogrupos.com.br mailto:oracle_br%40yahoogrupos.com.br
mailto:oracle_br%40yahoogrupos.com.br
mailto:oracle_br%40yahoogrupos.com.br
mailto:oracle_br%40yahoogrupos.com.br
, Carlos Pinto carlos.pintoo@... escreveu

 Ola a Todos, mais uma ajuda.
 
 
 
 select data, valor 
 
 from alt3 
 
 where tar = '14000' and key = '21' and nat = 'AD'
 
 
 
 Estou a executar este select e a informação que dá é a seguinte:
 
 
 
 Data - Valor
 
 12-07-2004 - 8,5
 
 12-07-2004 - 8,5
 
 01-03-2011 - 2,5
 
 01-03-2011 - 2,5
 
 
 
 
 
 A informação que necessitava era o MAX data e o valor respectivo dessa
data.
 
 
 
 
 
 
 
 Carlos Pinto
 
 
 
 
 
 [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]

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





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



RES: [Bulk] RES: [oracle_br] Re: Select

2011-08-09 Por tôpico Alisson Luz
Use no group by  having max(data) = [Valor que deseja]

 

Lembrando de fazer a formatação caso o valor que passe seja uma string...

 

 

De: oracle_br@yahoogrupos.com.br [mailto:oracle_br@yahoogrupos.com.br] Em
nome de Carlos Pinto
Enviada em: terça-feira, 9 de agosto de 2011 08:44
Para: oracle_br@yahoogrupos.com.br
Assunto: RE: [Bulk] RES: [oracle_br] Re: Select

 

  

Alisson neste momento tenho este SELECT

select max(data) as data, valor

from alt3

where tar = '14000' and key = '21' and nat= 'AD'

group by valor

E o resultado é este

DATA - VALOR

12-07-2004 - 8,5

01-03-2011 - 2,5

O que pretendia é que fosse buscar era 01-03-2011 – 2,5

Ou seja deveria buscar a data maxima e o respectivo valor da data maxima

Carlos Pinto

De: oracle_br@yahoogrupos.com.br mailto:oracle_br%40yahoogrupos.com.br
[mailto:oracle_br@yahoogrupos.com.br mailto:oracle_br%40yahoogrupos.com.br
] Em
nome de Alisson Luz
Enviada: terça-feira, 9 de Agosto de 2011 12:42
Para: oracle_br@yahoogrupos.com.br mailto:oracle_br%40yahoogrupos.com.br 
Assunto: [Bulk] RES: [oracle_br] Re: Select

Ops correção retire as funções do where ou do group by...

De: oracle_br@yahoogrupos.com.br mailto:oracle_br%40yahoogrupos.com.br
mailto:oracle_br%40yahoogrupos.com.br
[mailto:oracle_br@yahoogrupos.com.br mailto:oracle_br%40yahoogrupos.com.br
mailto:oracle_br%40yahoogrupos.com.br
] Em
nome de Alisson Luz
Enviada em: terça-feira, 9 de agosto de 2011 08:33
Para: oracle_br@yahoogrupos.com.br mailto:oracle_br%40yahoogrupos.com.br
mailto:oracle_br%40yahoogrupos.com.br 
Assunto: RES: [oracle_br] Re: Select

Carlos...

Esse erro por ter algumas funções que não são permitida no group by ou where
exemplos AVG, MAX, MIN, etc...

Retire essas funções da sua qry e caso precise filtrar use o HAVING.

De: oracle_br@yahoogrupos.com.br mailto:oracle_br%40yahoogrupos.com.br
mailto:oracle_br%40yahoogrupos.com.br
mailto:oracle_br%40yahoogrupos.com.br
[mailto:oracle_br@yahoogrupos.com.br mailto:oracle_br%40yahoogrupos.com.br
mailto:oracle_br%40yahoogrupos.com.br
mailto:oracle_br%40yahoogrupos.com.br
] Em
nome de Carlos Pinto
Enviada em: terça-feira, 9 de agosto de 2011 07:40
Para: oracle_br@yahoogrupos.com.br mailto:oracle_br%40yahoogrupos.com.br
mailto:oracle_br%40yahoogrupos.com.br
mailto:oracle_br%40yahoogrupos.com.br 
Assunto: RE: [oracle_br] Re: Select

Agora da-me este erro 

ORA-00934: group function is not allowed here

Estas tambem a selecionar o group by max(data),valor….Funciona?

Carlos Pinto

De: oracle_br@yahoogrupos.com.br mailto:oracle_br%40yahoogrupos.com.br
mailto:oracle_br%40yahoogrupos.com.br
mailto:oracle_br%40yahoogrupos.com.br
mailto:oracle_br%40yahoogrupos.com.br
[mailto:oracle_br@yahoogrupos.com.br mailto:oracle_br%40yahoogrupos.com.br
mailto:oracle_br%40yahoogrupos.com.br
mailto:oracle_br%40yahoogrupos.com.br
mailto:oracle_br%40yahoogrupos.com.br
] Em
nome de Ricardo
Enviada: terça-feira, 9 de Agosto de 2011 11:19
Para: oracle_br@yahoogrupos.com.br mailto:oracle_br%40yahoogrupos.com.br
mailto:oracle_br%40yahoogrupos.com.br
mailto:oracle_br%40yahoogrupos.com.br
mailto:oracle_br%40yahoogrupos.com.br 
Assunto: [oracle_br] Re: Select

Bom dia!

tente usar:
-
select max(data) as data, valor

from alt3

where tar = '14000' and key = '21' and nat = 'AD' group by max(data),valor
--

fiz o teste aq e funcionou assim.
boa sorte!

--- Em oracle_br@yahoogrupos.com.br mailto:oracle_br%40yahoogrupos.com.br
mailto:oracle_br%40yahoogrupos.com.br
mailto:oracle_br%40yahoogrupos.com.br
mailto:oracle_br%40yahoogrupos.com.br
mailto:oracle_br%40yahoogrupos.com.br
, Carlos Pinto carlos.pintoo@... escreveu

 Ola a Todos, mais uma ajuda.
 
 
 
 select data, valor 
 
 from alt3 
 
 where tar = '14000' and key = '21' and nat = 'AD'
 
 
 
 Estou a executar este select e a informação que dá é a seguinte:
 
 
 
 Data - Valor
 
 12-07-2004 - 8,5
 
 12-07-2004 - 8,5
 
 01-03-2011 - 2,5
 
 01-03-2011 - 2,5
 
 
 
 
 
 A informação que necessitava era o MAX data e o valor respectivo dessa
data.
 
 
 
 
 
 
 
 Carlos Pinto
 
 
 
 
 
 [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]

[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]



RES: [Bulk] RES: [oracle_br] Re: Select

2011-08-09 Por tôpico Ricardo
utilize 

ORDER BY data DESC
e depois limite a quantidade de registros exibidas usando rownum =1

ficando desta forma

select max(data) as data, valor
 
 from alt3
 
 where rownum = '1' tar = '14000' and key = '21' and nat= 'AD'
 
 group by valor ORDER BY data DESC


--- Em oracle_br@yahoogrupos.com.br, Alisson Luz alissonluz@... escreveu

 Use no group by  having max(data) = [Valor que deseja]
 
  
 
 Lembrando de fazer a formatação caso o valor que passe seja uma string...
 
  
 
  
 
 De: oracle_br@yahoogrupos.com.br [mailto:oracle_br@yahoogrupos.com.br] Em
 nome de Carlos Pinto
 Enviada em: terça-feira, 9 de agosto de 2011 08:44
 Para: oracle_br@yahoogrupos.com.br
 Assunto: RE: [Bulk] RES: [oracle_br] Re: Select
 
  
 
   
 
 Alisson neste momento tenho este SELECT
 
 select max(data) as data, valor
 
 from alt3
 
 where tar = '14000' and key = '21' and nat= 'AD'
 
 group by valor
 
 E o resultado é este
 
 DATA - VALOR
 
 12-07-2004 - 8,5
 
 01-03-2011 - 2,5
 
 O que pretendia é que fosse buscar era 01-03-2011 – 2,5
 
 Ou seja deveria buscar a data maxima e o respectivo valor da data maxima
 
 Carlos Pinto
 
 De: oracle_br@yahoogrupos.com.br mailto:oracle_br%40yahoogrupos.com.br
 [mailto:oracle_br@yahoogrupos.com.br mailto:oracle_br%40yahoogrupos.com.br
 ] Em
 nome de Alisson Luz
 Enviada: terça-feira, 9 de Agosto de 2011 12:42
 Para: oracle_br@yahoogrupos.com.br mailto:oracle_br%40yahoogrupos.com.br 
 Assunto: [Bulk] RES: [oracle_br] Re: Select
 
 Ops correção retire as funções do where ou do group by...
 
 De: oracle_br@yahoogrupos.com.br mailto:oracle_br%40yahoogrupos.com.br
 mailto:oracle_br%40yahoogrupos.com.br
 [mailto:oracle_br@yahoogrupos.com.br mailto:oracle_br%40yahoogrupos.com.br
 mailto:oracle_br%40yahoogrupos.com.br
 ] Em
 nome de Alisson Luz
 Enviada em: terça-feira, 9 de agosto de 2011 08:33
 Para: oracle_br@yahoogrupos.com.br mailto:oracle_br%40yahoogrupos.com.br
 mailto:oracle_br%40yahoogrupos.com.br 
 Assunto: RES: [oracle_br] Re: Select
 
 Carlos...
 
 Esse erro por ter algumas funções que não são permitida no group by ou where
 exemplos AVG, MAX, MIN, etc...
 
 Retire essas funções da sua qry e caso precise filtrar use o HAVING.
 
 De: oracle_br@yahoogrupos.com.br mailto:oracle_br%40yahoogrupos.com.br
 mailto:oracle_br%40yahoogrupos.com.br
 mailto:oracle_br%40yahoogrupos.com.br
 [mailto:oracle_br@yahoogrupos.com.br mailto:oracle_br%40yahoogrupos.com.br
 mailto:oracle_br%40yahoogrupos.com.br
 mailto:oracle_br%40yahoogrupos.com.br
 ] Em
 nome de Carlos Pinto
 Enviada em: terça-feira, 9 de agosto de 2011 07:40
 Para: oracle_br@yahoogrupos.com.br mailto:oracle_br%40yahoogrupos.com.br
 mailto:oracle_br%40yahoogrupos.com.br
 mailto:oracle_br%40yahoogrupos.com.br 
 Assunto: RE: [oracle_br] Re: Select
 
 Agora da-me este erro 
 
 ORA-00934: group function is not allowed here
 
 Estas tambem a selecionar o group by max(data),valor….Funciona?
 
 Carlos Pinto
 
 De: oracle_br@yahoogrupos.com.br mailto:oracle_br%40yahoogrupos.com.br
 mailto:oracle_br%40yahoogrupos.com.br
 mailto:oracle_br%40yahoogrupos.com.br
 mailto:oracle_br%40yahoogrupos.com.br
 [mailto:oracle_br@yahoogrupos.com.br mailto:oracle_br%40yahoogrupos.com.br
 mailto:oracle_br%40yahoogrupos.com.br
 mailto:oracle_br%40yahoogrupos.com.br
 mailto:oracle_br%40yahoogrupos.com.br
 ] Em
 nome de Ricardo
 Enviada: terça-feira, 9 de Agosto de 2011 11:19
 Para: oracle_br@yahoogrupos.com.br mailto:oracle_br%40yahoogrupos.com.br
 mailto:oracle_br%40yahoogrupos.com.br
 mailto:oracle_br%40yahoogrupos.com.br
 mailto:oracle_br%40yahoogrupos.com.br 
 Assunto: [oracle_br] Re: Select
 
 Bom dia!
 
 tente usar:
 -
 select max(data) as data, valor
 
 from alt3
 
 where tar = '14000' and key = '21' and nat = 'AD' group by max(data),valor
 --
 
 fiz o teste aq e funcionou assim.
 boa sorte!
 
 --- Em oracle_br@yahoogrupos.com.br mailto:oracle_br%40yahoogrupos.com.br
 mailto:oracle_br%40yahoogrupos.com.br
 mailto:oracle_br%40yahoogrupos.com.br
 mailto:oracle_br%40yahoogrupos.com.br
 mailto:oracle_br%40yahoogrupos.com.br
 , Carlos Pinto carlos.pintoo@ escreveu
 
  Ola a Todos, mais uma ajuda.
  
  
  
  select data, valor 
  
  from alt3 
  
  where tar = '14000' and key = '21' and nat = 'AD'
  
  
  
  Estou a executar este select e a informação que dá é a seguinte:
  
  
  
  Data - Valor
  
  12-07-2004 - 8,5
  
  12-07-2004 - 8,5
  
  01-03-2011 - 2,5
  
  01-03-2011 - 2,5
  
  
  
  
  
  A informação que necessitava era o MAX data e o valor respectivo dessa
 data.
  
  
  
  
  
  
  
  Carlos Pinto
  
  
  
  
  
  [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]
 
 [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

RES: [Bulk] RES: [oracle_br] Re: Select

2011-08-09 Por tôpico Ricardo

Desculpa, faltou um AND após o Where


select max(data) as data, valor

from alt3

where rownum = '1' AND tar = '14000' and key = '21' and nat= 'AD'

group by valor ORDER BY data DESC



--- Em oracle_br@yahoogrupos.com.br, Alisson Luz alissonluz@... escreveu

 Use no group by  having max(data) = [Valor que deseja]
 
  
 
 Lembrando de fazer a formatação caso o valor que passe seja uma string...
 
  
 
  
 
 De: oracle_br@yahoogrupos.com.br [mailto:oracle_br@yahoogrupos.com.br] Em
 nome de Carlos Pinto
 Enviada em: terça-feira, 9 de agosto de 2011 08:44
 Para: oracle_br@yahoogrupos.com.br
 Assunto: RE: [Bulk] RES: [oracle_br] Re: Select
 
  
 
   
 
 Alisson neste momento tenho este SELECT
 
 select max(data) as data, valor
 
 from alt3
 
 where tar = '14000' and key = '21' and nat= 'AD'
 
 group by valor
 
 E o resultado é este
 
 DATA - VALOR
 
 12-07-2004 - 8,5
 
 01-03-2011 - 2,5
 
 O que pretendia é que fosse buscar era 01-03-2011 – 2,5
 
 Ou seja deveria buscar a data maxima e o respectivo valor da data maxima
 
 Carlos Pinto
 
 De: oracle_br@yahoogrupos.com.br mailto:oracle_br%40yahoogrupos.com.br
 [mailto:oracle_br@yahoogrupos.com.br mailto:oracle_br%40yahoogrupos.com.br
 ] Em
 nome de Alisson Luz
 Enviada: terça-feira, 9 de Agosto de 2011 12:42
 Para: oracle_br@yahoogrupos.com.br mailto:oracle_br%40yahoogrupos.com.br 
 Assunto: [Bulk] RES: [oracle_br] Re: Select
 
 Ops correção retire as funções do where ou do group by...
 
 De: oracle_br@yahoogrupos.com.br mailto:oracle_br%40yahoogrupos.com.br
 mailto:oracle_br%40yahoogrupos.com.br
 [mailto:oracle_br@yahoogrupos.com.br mailto:oracle_br%40yahoogrupos.com.br
 mailto:oracle_br%40yahoogrupos.com.br
 ] Em
 nome de Alisson Luz
 Enviada em: terça-feira, 9 de agosto de 2011 08:33
 Para: oracle_br@yahoogrupos.com.br mailto:oracle_br%40yahoogrupos.com.br
 mailto:oracle_br%40yahoogrupos.com.br 
 Assunto: RES: [oracle_br] Re: Select
 
 Carlos...
 
 Esse erro por ter algumas funções que não são permitida no group by ou where
 exemplos AVG, MAX, MIN, etc...
 
 Retire essas funções da sua qry e caso precise filtrar use o HAVING.
 
 De: oracle_br@yahoogrupos.com.br mailto:oracle_br%40yahoogrupos.com.br
 mailto:oracle_br%40yahoogrupos.com.br
 mailto:oracle_br%40yahoogrupos.com.br
 [mailto:oracle_br@yahoogrupos.com.br mailto:oracle_br%40yahoogrupos.com.br
 mailto:oracle_br%40yahoogrupos.com.br
 mailto:oracle_br%40yahoogrupos.com.br
 ] Em
 nome de Carlos Pinto
 Enviada em: terça-feira, 9 de agosto de 2011 07:40
 Para: oracle_br@yahoogrupos.com.br mailto:oracle_br%40yahoogrupos.com.br
 mailto:oracle_br%40yahoogrupos.com.br
 mailto:oracle_br%40yahoogrupos.com.br 
 Assunto: RE: [oracle_br] Re: Select
 
 Agora da-me este erro 
 
 ORA-00934: group function is not allowed here
 
 Estas tambem a selecionar o group by max(data),valor….Funciona?
 
 Carlos Pinto
 
 De: oracle_br@yahoogrupos.com.br mailto:oracle_br%40yahoogrupos.com.br
 mailto:oracle_br%40yahoogrupos.com.br
 mailto:oracle_br%40yahoogrupos.com.br
 mailto:oracle_br%40yahoogrupos.com.br
 [mailto:oracle_br@yahoogrupos.com.br mailto:oracle_br%40yahoogrupos.com.br
 mailto:oracle_br%40yahoogrupos.com.br
 mailto:oracle_br%40yahoogrupos.com.br
 mailto:oracle_br%40yahoogrupos.com.br
 ] Em
 nome de Ricardo
 Enviada: terça-feira, 9 de Agosto de 2011 11:19
 Para: oracle_br@yahoogrupos.com.br mailto:oracle_br%40yahoogrupos.com.br
 mailto:oracle_br%40yahoogrupos.com.br
 mailto:oracle_br%40yahoogrupos.com.br
 mailto:oracle_br%40yahoogrupos.com.br 
 Assunto: [oracle_br] Re: Select
 
 Bom dia!
 
 tente usar:
 -
 select max(data) as data, valor
 
 from alt3
 
 where tar = '14000' and key = '21' and nat = 'AD' group by max(data),valor
 --
 
 fiz o teste aq e funcionou assim.
 boa sorte!
 
 --- Em oracle_br@yahoogrupos.com.br mailto:oracle_br%40yahoogrupos.com.br
 mailto:oracle_br%40yahoogrupos.com.br
 mailto:oracle_br%40yahoogrupos.com.br
 mailto:oracle_br%40yahoogrupos.com.br
 mailto:oracle_br%40yahoogrupos.com.br
 , Carlos Pinto carlos.pintoo@ escreveu
 
  Ola a Todos, mais uma ajuda.
  
  
  
  select data, valor 
  
  from alt3 
  
  where tar = '14000' and key = '21' and nat = 'AD'
  
  
  
  Estou a executar este select e a informação que dá é a seguinte:
  
  
  
  Data - Valor
  
  12-07-2004 - 8,5
  
  12-07-2004 - 8,5
  
  01-03-2011 - 2,5
  
  01-03-2011 - 2,5
  
  
  
  
  
  A informação que necessitava era o MAX data e o valor respectivo dessa
 data.
  
  
  
  
  
  
  
  Carlos Pinto
  
  
  
  
  
  [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]
 
 [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]





RE: [Bulk] RES: [oracle_br] Re: Select

2011-08-09 Por tôpico Carlos Pinto
Ok, vou testar.. Obrigado mais uma vez.

 

 

Carlos Pinto

 

De: oracle_br@yahoogrupos.com.br [mailto:oracle_br@yahoogrupos.com.br] Em
nome de Ricardo
Enviada: terça-feira, 9 de Agosto de 2011 13:12
Para: oracle_br@yahoogrupos.com.br
Assunto: RES: [Bulk] RES: [oracle_br] Re: Select

 

  


Desculpa, faltou um AND após o Where

select max(data) as data, valor

from alt3

where rownum = '1' AND tar = '14000' and key = '21' and nat= 'AD'

group by valor ORDER BY data DESC

--- Em oracle_br@yahoogrupos.com.br mailto:oracle_br%40yahoogrupos.com.br
, Alisson Luz alissonluz@... escreveu

 Use no group by having max(data) = [Valor que deseja]
 
 
 
 Lembrando de fazer a formatação caso o valor que passe seja uma string...
 
 
 
 
 
 De: oracle_br@yahoogrupos.com.br mailto:oracle_br%40yahoogrupos.com.br
[mailto:oracle_br@yahoogrupos.com.br mailto:oracle_br%40yahoogrupos.com.br
] Em
 nome de Carlos Pinto
 Enviada em: terça-feira, 9 de agosto de 2011 08:44
 Para: oracle_br@yahoogrupos.com.br mailto:oracle_br%40yahoogrupos.com.br

 Assunto: RE: [Bulk] RES: [oracle_br] Re: Select
 
 
 
 
 
 Alisson neste momento tenho este SELECT
 
 select max(data) as data, valor
 
 from alt3
 
 where tar = '14000' and key = '21' and nat= 'AD'
 
 group by valor
 
 E o resultado é este
 
 DATA - VALOR
 
 12-07-2004 - 8,5
 
 01-03-2011 - 2,5
 
 O que pretendia é que fosse buscar era 01-03-2011 – 2,5
 
 Ou seja deveria buscar a data maxima e o respectivo valor da data maxima
 
 Carlos Pinto
 
 De: oracle_br@yahoogrupos.com.br mailto:oracle_br%40yahoogrupos.com.br
mailto:oracle_br%40yahoogrupos.com.br
 [mailto:oracle_br@yahoogrupos.com.br
mailto:oracle_br%40yahoogrupos.com.br
mailto:oracle_br%40yahoogrupos.com.br
 ] Em
 nome de Alisson Luz
 Enviada: terça-feira, 9 de Agosto de 2011 12:42
 Para: oracle_br@yahoogrupos.com.br mailto:oracle_br%40yahoogrupos.com.br
mailto:oracle_br%40yahoogrupos.com.br 
 Assunto: [Bulk] RES: [oracle_br] Re: Select
 
 Ops correção retire as funções do where ou do group by...
 
 De: oracle_br@yahoogrupos.com.br mailto:oracle_br%40yahoogrupos.com.br
mailto:oracle_br%40yahoogrupos.com.br
 mailto:oracle_br%40yahoogrupos.com.br
 [mailto:oracle_br@yahoogrupos.com.br
mailto:oracle_br%40yahoogrupos.com.br
mailto:oracle_br%40yahoogrupos.com.br
 mailto:oracle_br%40yahoogrupos.com.br
 ] Em
 nome de Alisson Luz
 Enviada em: terça-feira, 9 de agosto de 2011 08:33
 Para: oracle_br@yahoogrupos.com.br mailto:oracle_br%40yahoogrupos.com.br
mailto:oracle_br%40yahoogrupos.com.br
 mailto:oracle_br%40yahoogrupos.com.br 
 Assunto: RES: [oracle_br] Re: Select
 
 Carlos...
 
 Esse erro por ter algumas funções que não são permitida no group by ou
where
 exemplos AVG, MAX, MIN, etc...
 
 Retire essas funções da sua qry e caso precise filtrar use o HAVING.
 
 De: oracle_br@yahoogrupos.com.br mailto:oracle_br%40yahoogrupos.com.br
mailto:oracle_br%40yahoogrupos.com.br
 mailto:oracle_br%40yahoogrupos.com.br
 mailto:oracle_br%40yahoogrupos.com.br
 [mailto:oracle_br@yahoogrupos.com.br
mailto:oracle_br%40yahoogrupos.com.br
mailto:oracle_br%40yahoogrupos.com.br
 mailto:oracle_br%40yahoogrupos.com.br
 mailto:oracle_br%40yahoogrupos.com.br
 ] Em
 nome de Carlos Pinto
 Enviada em: terça-feira, 9 de agosto de 2011 07:40
 Para: oracle_br@yahoogrupos.com.br mailto:oracle_br%40yahoogrupos.com.br
mailto:oracle_br%40yahoogrupos.com.br
 mailto:oracle_br%40yahoogrupos.com.br
 mailto:oracle_br%40yahoogrupos.com.br 
 Assunto: RE: [oracle_br] Re: Select
 
 Agora da-me este erro 
 
 ORA-00934: group function is not allowed here
 
 Estas tambem a selecionar o group by max(data),valor….Funciona?
 
 Carlos Pinto
 
 De: oracle_br@yahoogrupos.com.br mailto:oracle_br%40yahoogrupos.com.br
mailto:oracle_br%40yahoogrupos.com.br
 mailto:oracle_br%40yahoogrupos.com.br
 mailto:oracle_br%40yahoogrupos.com.br
 mailto:oracle_br%40yahoogrupos.com.br
 [mailto:oracle_br@yahoogrupos.com.br
mailto:oracle_br%40yahoogrupos.com.br
mailto:oracle_br%40yahoogrupos.com.br
 mailto:oracle_br%40yahoogrupos.com.br
 mailto:oracle_br%40yahoogrupos.com.br
 mailto:oracle_br%40yahoogrupos.com.br
 ] Em
 nome de Ricardo
 Enviada: terça-feira, 9 de Agosto de 2011 11:19
 Para: oracle_br@yahoogrupos.com.br mailto:oracle_br%40yahoogrupos.com.br
mailto:oracle_br%40yahoogrupos.com.br
 mailto:oracle_br%40yahoogrupos.com.br
 mailto:oracle_br%40yahoogrupos.com.br
 mailto:oracle_br%40yahoogrupos.com.br 
 Assunto: [oracle_br] Re: Select
 
 Bom dia!
 
 tente usar:
 -
 select max(data) as data, valor
 
 from alt3
 
 where tar = '14000' and key = '21' and nat = 'AD' group by max(data),valor
 --
 
 fiz o teste aq e funcionou assim.
 boa sorte!
 
 --- Em oracle_br@yahoogrupos.com.br
mailto:oracle_br%40yahoogrupos.com.br
mailto:oracle_br%40yahoogrupos.com.br
 mailto:oracle_br%40yahoogrupos.com.br
 mailto:oracle_br%40yahoogrupos.com.br
 mailto:oracle_br%40yahoogrupos.com.br
 mailto:oracle_br%40yahoogrupos.com.br
 , Carlos Pinto carlos.pintoo

Re: [Bulk] RES: [oracle_br] Re: Select

2011-08-09 Por tôpico Anderson Araujo de Oliveira
Parece gambiarra, mas eu faria assim:
 
select * from (
select data, valor 
  from alt3 
 where tar = '14000' and key = '21' and nat = 'AD' order by data desc)
where rownum  2;

De: Carlos Pinto carlos.pin...@yahoo.com.br
Para: oracle_br@yahoogrupos.com.br
Enviadas: Terça-feira, 9 de Agosto de 2011 13:12
Assunto: RE: [Bulk] RES: [oracle_br] Re: Select


  
Ok, vou testar.. Obrigado mais uma vez.

Carlos Pinto

De: oracle_br@yahoogrupos.com.br [mailto:oracle_br@yahoogrupos.com.br] Em
nome de Ricardo
Enviada: terça-feira, 9 de Agosto de 2011 13:12
Para: oracle_br@yahoogrupos.com.br
Assunto: RES: [Bulk] RES: [oracle_br] Re: Select

Desculpa, faltou um AND após o Where

select max(data) as data, valor

from alt3

where rownum = '1' AND tar = '14000' and key = '21' and nat= 'AD'

group by valor ORDER BY data DESC

--- Em oracle_br@yahoogrupos.com.br mailto:oracle_br%40yahoogrupos.com.br
, Alisson Luz alissonluz@... escreveu

 Use no group by having max(data) = [Valor que deseja]
 
 
 
 Lembrando de fazer a formatação caso o valor que passe seja uma string...
 
 
 
 
 
 De: oracle_br@yahoogrupos.com.br mailto:oracle_br%40yahoogrupos.com.br
[mailto:oracle_br@yahoogrupos.com.br mailto:oracle_br%40yahoogrupos.com.br
] Em
 nome de Carlos Pinto
 Enviada em: terça-feira, 9 de agosto de 2011 08:44
 Para: oracle_br@yahoogrupos.com.br mailto:oracle_br%40yahoogrupos.com.br

 Assunto: RE: [Bulk] RES: [oracle_br] Re: Select
 
 
 
 
 
 Alisson neste momento tenho este SELECT
 
 select max(data) as data, valor
 
 from alt3
 
 where tar = '14000' and key = '21' and nat= 'AD'
 
 group by valor
 
 E o resultado é este
 
 DATA - VALOR
 
 12-07-2004 - 8,5
 
 01-03-2011 - 2,5
 
 O que pretendia é que fosse buscar era 01-03-2011 – 2,5
 
 Ou seja deveria buscar a data maxima e o respectivo valor da data maxima
 
 Carlos Pinto
 
 De: oracle_br@yahoogrupos.com.br mailto:oracle_br%40yahoogrupos.com.br
mailto:oracle_br%40yahoogrupos.com.br
 [mailto:oracle_br@yahoogrupos.com.br
mailto:oracle_br%40yahoogrupos.com.br
mailto:oracle_br%40yahoogrupos.com.br
 ] Em
 nome de Alisson Luz
 Enviada: terça-feira, 9 de Agosto de 2011 12:42
 Para: oracle_br@yahoogrupos.com.br mailto:oracle_br%40yahoogrupos.com.br
mailto:oracle_br%40yahoogrupos.com.br 
 Assunto: [Bulk] RES: [oracle_br] Re: Select
 
 Ops correção retire as funções do where ou do group by...
 
 De: oracle_br@yahoogrupos.com.br mailto:oracle_br%40yahoogrupos.com.br
mailto:oracle_br%40yahoogrupos.com.br
 mailto:oracle_br%40yahoogrupos.com.br
 [mailto:oracle_br@yahoogrupos.com.br
mailto:oracle_br%40yahoogrupos.com.br
mailto:oracle_br%40yahoogrupos.com.br
 mailto:oracle_br%40yahoogrupos.com.br
 ] Em
 nome de Alisson Luz
 Enviada em: terça-feira, 9 de agosto de 2011 08:33
 Para: oracle_br@yahoogrupos.com.br mailto:oracle_br%40yahoogrupos.com.br
mailto:oracle_br%40yahoogrupos.com.br
 mailto:oracle_br%40yahoogrupos.com.br 
 Assunto: RES: [oracle_br] Re: Select
 
 Carlos...
 
 Esse erro por ter algumas funções que não são permitida no group by ou
where
 exemplos AVG, MAX, MIN, etc...
 
 Retire essas funções da sua qry e caso precise filtrar use o HAVING.
 
 De: oracle_br@yahoogrupos.com.br mailto:oracle_br%40yahoogrupos.com.br
mailto:oracle_br%40yahoogrupos.com.br
 mailto:oracle_br%40yahoogrupos.com.br
 mailto:oracle_br%40yahoogrupos.com.br
 [mailto:oracle_br@yahoogrupos.com.br
mailto:oracle_br%40yahoogrupos.com.br
mailto:oracle_br%40yahoogrupos.com.br
 mailto:oracle_br%40yahoogrupos.com.br
 mailto:oracle_br%40yahoogrupos.com.br
 ] Em
 nome de Carlos Pinto
 Enviada em: terça-feira, 9 de agosto de 2011 07:40
 Para: oracle_br@yahoogrupos.com.br mailto:oracle_br%40yahoogrupos.com.br
mailto:oracle_br%40yahoogrupos.com.br
 mailto:oracle_br%40yahoogrupos.com.br
 mailto:oracle_br%40yahoogrupos.com.br 
 Assunto: RE: [oracle_br] Re: Select
 
 Agora da-me este erro 
 
 ORA-00934: group function is not allowed here
 
 Estas tambem a selecionar o group by max(data),valor….Funciona?
 
 Carlos Pinto
 
 De: oracle_br@yahoogrupos.com.br mailto:oracle_br%40yahoogrupos.com.br
mailto:oracle_br%40yahoogrupos.com.br
 mailto:oracle_br%40yahoogrupos.com.br
 mailto:oracle_br%40yahoogrupos.com.br
 mailto:oracle_br%40yahoogrupos.com.br
 [mailto:oracle_br@yahoogrupos.com.br
mailto:oracle_br%40yahoogrupos.com.br
mailto:oracle_br%40yahoogrupos.com.br
 mailto:oracle_br%40yahoogrupos.com.br
 mailto:oracle_br%40yahoogrupos.com.br
 mailto:oracle_br%40yahoogrupos.com.br
 ] Em
 nome de Ricardo
 Enviada: terça-feira, 9 de Agosto de 2011 11:19
 Para: oracle_br@yahoogrupos.com.br mailto:oracle_br%40yahoogrupos.com.br
mailto:oracle_br%40yahoogrupos.com.br
 mailto:oracle_br%40yahoogrupos.com.br
 mailto:oracle_br%40yahoogrupos.com.br
 mailto:oracle_br%40yahoogrupos.com.br 
 Assunto: [oracle_br] Re: Select
 
 Bom dia!
 
 tente usar:
 -
 select max(data) as data, valor
 
 from alt3
 
 where tar = '14000' and key = '21' and nat = 'AD' group by max(data),valor
 --
 
 fiz o teste

[oracle_br] Re: select color

2009-11-07 Por tôpico jlchiappa
Então, por definição não, a linguagem SQL em si *** NÃO *** prevê absolutamente 
NENHUM recurso de formatação, fica TOTALMENTE por conta do cliente que está 
conectado no banco e executando a pesquisa ter capacidades do tipo : assim, se 
o 'cliente' conectando no banco for um programa em .NET (digamos), haverá 
comandos .NET pra isso, se for um report gerado por uma tool de report 
provavelmente havera também (por exemplo, no Oracle Reports vc usaria a FORMAT 
TRIGGER dele), por aí vai O sqlplus, que é o programa/tool cliente padrão, 
desde MUUUITO tempo atrás possui essa capacidade, via html, um exemplinho com 
ele :

= primeiro vou criar uma tabela e preencher com dados...

h...@o10gr2:SQLcreate table TBL_TICKETS (ID number,
  2  DESCRIPTION varchar2(80), ASSIGNED_TO varchar2(30), OPEN_DATE date, STATUS 
varchar2(10));

Tabela criada.

h...@o10gr2:SQLinsert into TBL_TICKETS values(1, 'Não consigo acessar 
database', 'Chiappa', sysdate -10, 'Open');

1 linha criada.

h...@o10gr2:SQLinsert into TBL_TICKETS values(2, 'sql*plus não é amigável', 
'Zezinho', sysdate -40, 'Open');

1 linha criada.

h...@o10gr2:SQLinsert into TBL_TICKETS values(3, 'Não sei programar em HTML', 
'Lalau', sysdate, 'Closed');

1 linha criada.

h...@o10gr2:SQLinsert into TBL_TICKETS values(4, 'Pecinha atrás do teclado não 
Funciona', 'Chiappa', sysdate -15, 'Open');

1 linha criada.

h...@o10gr2:SQLcommit;

== agora vou usar os recursos DO SQLPLUS para gerar formatação, o bom e velho 
MARKUP - velho mesmo , o MUUUITO tempo   que eu citei é coisa lá do 8i, velho 
pera burro Pra referência, os comandos  que vou colocar no MARKUP não são 
'inventados' pela Oracle, são um padrão, chamado CSS (cascade Style Sheets, 
http://pt-br.html.net/tutorials/css/ fala sobre ele) ... Pra facilitar a 
repetição do exemplo eu botei os comandos num script :

C:\Documents and Settings\chiappatype c:\run_report.sql
set sqlprompt ''
set markup HTML ON HEAD style type='text/css' -
body { -
font:10pt Arial,Helvetica,sans-serif; -
color:blue; background:white; } -
p { -
font:8pt Arial,sans-serif; -
color:grey; background:white; } -
table,tr,td { -
font:10pt Arial,Helvetica,sans-serif; -
text-align:right; -
color:Black; background:white; -
padding:0px 0px 0px 0px; margin:0px 0px 0px 0px; } -
th { -
font:bold 10pt Arial,Helvetica,sans-serif; -
color:#336699; -
background:#99; -
padding:0px 0px 0px 0px;} -
h1 { -
font:16pt Arial,Helvetica,Geneva,sans-serif; -
color:#336699; -
background-color:White; -
border-bottom:1px solid #99; -
margin-top:0pt; margin-bottom:0pt; padding:0px 0px 0px 0px;} -
h2 { -
font:bold 10pt Arial,Helvetica,Geneva,sans-serif; -
color:#336699; -
background-color:White; -
margin-top:4pt; margin-bottom:0pt;} -
a { -
font:9pt Arial,Helvetica,sans-serif; -
color:#663300; -
background:#ff; -
margin-top:0pt; margin-bottom:0pt; vertical-align:top;} -
.threshold-critical { -
font:bold 10pt Arial,Helvetica,sans-serif; -
color:red; } -
.threshold-warning { -
font:bold 10pt Arial,Helvetica,sans-serif; -
color:orange; } -
.threshold-ok { -
font:bold 10pt Arial,Helvetica,sans-serif; -
color:green; } -
/style -
titleSQL*Plus Report/title -
BODY img src=http://www.acme.com/company_logo..gif/ -
TABLE border='1' width='90%' align='center' -
ENTMAP OFF SPOOL ON
SPOOL C:\REPORT.htm
select 'a href=http://linkdedrilldowm.com:'||ID||''||ID||'/a' ID,
 DESCRIPTION, ASSIGNED_TO, OPEN_DATE,
 CASE
 when SYSDATE-OPEN_DATE  30 then
 'span class=threshold-critical'||to_char(trunc(SYSDATE-OPEN_DATE))||'/span
'
 when SYSDATE-OPEN_DATE  10 then
 'span class=threshold-warning'||to_char(trunc(SYSDATE-OPEN_DATE))||'/span
'
 ELSE
 'span class=threshold-ok'||to_char(trunc(SYSDATE-OPEN_DATE))||'/span'
 END BACKLOG
 from TBL_TICKETS
 where STATUS='Open';
SPOOL OFF
EXIT
/

C:\Documents and Settings\chiappah...@o10gr2:SQL

== agora executo o dito :

C:\Documents and Settings\chiappasqlplus hr/h...@o10gr2 @c:\run_report.sql

== PRONTO, abro num browser de internet (ou no Office, ou em qquer programa 
que entenda html) o arquivo C:\REPORT.HTM tá lá a query com os resultados, a 
coluna BACKLOG está pintada com cores diferentes cfrme os valores, que é o que 
vc queria...

[]s

  Chiappa
  
OBS : quase que com certeza absoluta o software do yahoo!groups vai zoar mas 
vou colar abaixo o html gerado E o resultado...

C:\Documents and Settings\chiappatype c:\report.htm
html
head
meta http-equiv=Content-Type content=text/html; charset=WINDOWS-1252
meta name=generator content=SQL*Plus 9.2.0
style type='text/css'  body {  font:10pt Arial,Helvetica,sans-serif;  color:bl
ue; background:white; }  p {  font:8pt Arial,sans-serif;  color:grey; background
:white; }  table,tr,td {  font:10pt Arial,Helvetica,sans-serif;  text-align:righ
t;  color:Black; background:white;  padding:0px 0px 0px 0px; margin:0px 0px 0px
0px; }  th {  font:bold 10pt Arial,Helvetica,sans-serif;  color:#336699;  backgr
ound:#99;  padding:0px 0px 0px 0px;}  h1 {  font:16pt Arial,Helvetica,Geneva

[oracle_br] Re: select muito lento.

2008-09-11 Por tôpico jota_lvaz
EVITE USAR O TRUNC NESTE SEU CAMPO DATA, NESTE CASO VC MATARIA O 
ÍNDICE.
O ÍNDICE SERIA UTILIZADO SE VC O TIVESSE CRIADO, BASEADO EM FUNÇÃO

VC PODE FAZER O SEGUINTE :

SELECT NOME_DOS_CAMPOS) FROM TABELA
   WHERE DATA BETWEEN TRUNC(SYSDATE) AND TRUNC(SYSDATE) + .99

NESTE CASO ACIMA O TRUNC(SYSDATE), TRARÁ A DATA ARREDONDADA PARA MEIA-
NOITE E O TRUNC(SYSDATE) + .99 TRARÁ A DATA E A HORA ATÉ 23:59.

EX: NA DATA DE HOJE 11/09/08 TERÍAMOS :

11/09/08 00:00 A 11/09/08 23:59


NÃO SEI SE FUI CLARO.

--- Em oracle_br@yahoogrupos.com.br, Jean Carlo [EMAIL PROTECTED] 
escreveu

 Bom dia, pessoal.
 
 Tenho um select da seguinte forma:
 select * from tabela
 where trunc(data) = trunc(sysdate);
 
 onde tabela tem quase 6 milhões de registros, tenho um index no 
campo data, sei que usando o trunc é usado o mesmo não utiliza o 
index gostaria de saber se tem como melhorar a performece usando 
trunc.
 Pois usando where data  sysdate-1 o mesmo me traz as ultimas 24hrs 
e só qro do dia corrente, e dessa forma sei que o index é utilizado.
 
 Versão do meu BD: 9.2.0.5.0.
 
 [As partes desta mensagem que não continham texto foram removidas]





[oracle_br] Re: Select usando datas *****Ajuda******

2008-02-18 Por tôpico rei_do_delphi
delete from nome_tabela where dt_inicio=to_date
('18/02/2007','dd/mm/');

Espero ter ajudado,

Vallew
--- Em oracle_br@yahoogrupos.com.br, gugueera [EMAIL PROTECTED] 
escreveu

 Fala pessoal , sou novo no grupo tb
 eu queria uma ajudinha.
 preciso gerar uma consulta onde preciso colocar
 uma restricao ( se o registro tiver menos de um ano
 nao deleto, apenas os registros q tiverem mais 
 de ano eu vou deletar), alguem poderia me dar uma ajudinha?
 obs na tabela existe um campo dt_inicio.
 
 vlw galera!! ate





[oracle_br] Re: Select com o conteúdo de uma procedure

2007-05-02 Por tôpico Aleksandro
Valeu, ajudou muito.
--- Em oracle_br@yahoogrupos.com.br, Tadeu Camargo da Silva
[EMAIL PROTECTED] escreveu

 Tenta isso:
 
 SELECT TEXT FROM USER_SOURCE where name = 'NOME'
 
 
 Aleksandro [EMAIL PROTECTED] escreveu: 
Boa tarde,
  
  Estou precisando de saber o conteúdo de tudo que tem dentro de minhas
  procedures da mesma forma que faço quando utilizo o select * from
v$sql.
  O conteúdo das procedures iriam aparecer em um select criado.
  Isso existe ?
  
  
  

 
  __
 Fale com seus amigos  de graça com o novo Yahoo! Messenger 
 http://br.messenger.yahoo.com/ 
 
 [As partes desta mensagem que não continham texto foram removidas]





[oracle_br] Re: Select Google like

2007-03-22 Por tôpico Anderson
Marcio, só um complemento:

 SELECT * FROM t WHERE REGEXP_LIKE(nome,upper('m?nica'));

Com este seu comando, se tiver alguma mánica/manica, ménica/menica,
etc, estes dados tb serão retornados.

Para este caso (mônica) talvez não tenha problema, mas se for para um
'márcio' da vida, serão retornadas linhas com marcio, márcio e
COMÉRCIO, por exemplo, que é onde pode dar problema.

Anderson.


--- Em oracle_br@yahoogrupos.com.br, Marcio Portes
[EMAIL PROTECTED] escreveu

 O exemplo que fiz está em
 http://mportes.blogspot.com/2006/04/ignore-cases-e-acentos.html
 
 e outra opção seria com expressão regular, (10g)
 
 ops$marcio:LX10G SELECT * FROM t WHERE
REGEXP_LIKE(nome,upper('m?nica'));
 
 NOME
 
 M??NICA ALMEIDA
 MONICA LIMA
 CARLA M??NICA ALMEIDA
 PATRICIA DE M??NICA
 
 4 rows selected.
 
 
 
 On 3/22/07, rflribeiro [EMAIL PROTECTED] wrote:
 
Dá uma olhada no blog do Márcio Portes. Têm um post bem interessante
  sobre pesquisa case-insensitive. Acho que também fala de
  accent-insensitive.
 
  Reginaldo Ribeiro
  Administrador de Bancos de Dados
  Oracle Certified Associated 10g
  
  DBcom IT Experts
  skype: dbcom_it_experts
  mobile: 551102344290
  e-mail: [EMAIL PROTECTED] rflribeiro%40dbcom.com.br
  site: www.dbcom.com.br
 
  Marco wrote:
  
   Boa tarde pessoal!
  
   Gostaria de saber como implementar uma consulta que retornasse um
   resultado ignorando a acentuação, desta forma a consulta do tipo:
  
   SELECT *
   FROM FUNCIONARIO
   WHERE UPPER(SOUNDEX(NOME)) LIKE UPPER(SOUNDEX('%monica%'))
  
   No entanto, me parece que a função like nao funciona como esperado,
   porque apenas nomes iniciados pelo argumento são retornados:
  
   MÔNICA ALMEIDA
   MONICA LIMA
  
   Enquanto:
  
   CARLA MÔNICA ALMEIDA
   PATRICIA DE MÔNICA
  
   Não são retornados.
  
   Alguma sugestão?
  
   Agradeço antecipadamente.
  
   Marco Antonio
  
   eof
  
   
 
 
 
 
 -- 
 Marcio Portes
 Material Tecnico em Portugues - http://mportes.blogspot.com
 Practical Learning Oracle -
 http://mportes.blogspot.com/2006/02/practical-learning-oracle.html
 
 
 [As partes desta mensagem que não continham texto foram removidas]





[oracle_br] Re: select

2007-02-28 Por tôpico Josinei Barbosa da Silva
Se você executar a select abaixo, acredito que resolva seu problema:

SELECT DISTINCT MENSAGEM
FROM TESTE
WHERE GRUPO IN ('4.3.01.07','4.3.01.08')

Atenciosamente,
Josinei

--- Em oracle_br@yahoogrupos.com.br, rzzanatta [EMAIL PROTECTED] escreveu

 Olá estou com problema e nao consigo pensar direito, parece simples, 
 acho.
 
 tenho uma tabela no oracle nela tenho mensagens pra aparecer na nota 
 fiscal apartir dos codigos dos produtos, ex:
 
 codigo |  grupo  | mensagem
   01  4.3.07   ICMS RETIDO
   02  4.3.08   ICMS RETIDO
   03  4.3.01.08ISENTO
   ...
 SE EU FATURAR OS PRODUTOS 4.3.07 E 4.3.08 NA MESMA NOTA EU QUERIA QUE 
 APARECESSE SOMENTE UMA MENSAGEM NA NOTA, NAO DUAS.
 COMO FAÇO ISSO?
 
 MINHA SELECT É ESSA.
 SELECT GRUPO FROM TESTE WHERE GRUPO IN ('4.3.01.07','4.3.01.08')
 
 (ASSIM ELE TRAZ DOIS RESULTADOS NESSA NOTA E EU SÓ QUERO UM)





[oracle_br] Re: Select UNION

2006-10-25 Por tôpico wilsonteixeira2000

Verifique se as tabelas possuem o mesmo numero de colunas e se elas 
são do mesmo tipo de dados. Ou tem substituir o *, pelo nome dos 
campos

--- Em oracle_br@yahoogrupos.com.br, Andre Campos 
[EMAIL PROTECTED] escreveu

 Boa tarde Pessoal,
 
 
 Tenho um script que quando executo recebo o seguinte erro:
 
 select * from [EMAIL PROTECTED];
 union
 select * from [EMAIL PROTECTED];
 union
 select * from [EMAIL PROTECTED];
 
 SP2-0042: unknown command UNION - rest of line ignored.
 
 Alguem saberia me dizer como resolver isso?
 
 Obrigado
 
 
 André Campos
 
 
 [As partes desta mensagem que não continham texto foram removidas]







Vem aí: ENPO-BR 2006 - Encontro Nacional de Profissionais Oracle
VISITE: http://www.enpo-br.org/ - Dia 11/11 Vagas Limitadas

Este Grupo recebe o apoio da SQL Magazine - www.devmedia.com.br/sqlmagazine 
--
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/ 
--
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:
[EMAIL PROTECTED]

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

 



[oracle_br] Re: SELECT em colunas pouco seletivas

2006-10-10 Por tôpico jlchiappa
Fabiana, a CHAVE pra gente poder sugerir algo é : exatamente QUAL é o 
tamanho da tabela, e EXATAMENTE quantos registros serão recuperados ? 
Desse conjunto a recuperar, há alguma maneira de marcar esses 
registros (ie, há algum campo/conjunto de campos  que os 
identifica) ? Se sim e se o sub-conjunto a recuperar é relativamente 
pequeno, coisa de uns poucos porcento da tabela, a técnica PREFERIDA 
seria vc criar não um índice bitmap, mas sim um índice de função 
restrito, onde vc indexa APENAS esses poucos registros...

[]s

 Chiappa

===
Participe do ENPO - Encontro de Profissionais Oracle 2006 ! 
Informações e inscrições em www.enpo-br.org
José Laurindo Chiappa, Palestrante ENPO-2006
===

--- Em oracle_br@yahoogrupos.com.br, Fabiana Amorim 
[EMAIL PROTECTED] escreveu

 Olá, senhores.

   Tenho uma tabela com milhões de registros  e minha aplicação 
precisa fazer um SELECT em colunas pouco seletivas. A query demora 3 
min para executar ou mais, dependendo do horário... Chega a dar timed 
out. É um SELECT simples, só que as cláusulas do WHERE são pouco 
seletivas.
   O que fazer numa situação destas? 
   Pensei em criar um índice bitmap.. Mas o número de INSERT/UPDATE 
é alto e me parece que não é indicado...
   Alguém tem alguma idéia? 
   : /

   Obrigada,
   Fabiana

 
   
 -
  Você quer respostas para suas perguntas? Ou você sabe muito e quer 
compartilhar seu conhecimento? Experimente o Yahoo! Respostas!
 
 [As partes desta mensagem que não continham texto foram removidas]







--
Atenção! As mensagens deste grupo são de acesso público e de inteira 
responsabilidade de seus remetentes.
Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/ 
--__
Vem aí: ENPO-BR 2006 - Encontro Nacional de Profissionais Oracle
VISITE: http://www.enpo-br.org/ - Dia 11/11 Vagas Limitadas
__
Este Grupo recebe o apoio da SQL Magazine - www.devmedia.com.br/sqlmagazine  
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:
[EMAIL PROTECTED]

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

 




[oracle_br] Re: Select independente da acentuação com like.

2006-07-21 Por tôpico hiroshi_kobata

Estou tentando utilizar o like com '%' mas, quando utilizo-as, o
resultado fica sensível à acentuação, diferentemente quanto utilizo o
'=', exemplos:

SELECT * FROM TESTE WHERE DESCR LIKE NLS_UPPER('%ção%');

COD   DESCR
- --
444   ATENÇÃO

SELECT * FROM TESTE WHERE DESCR LIKE '%' || NLS_UPPER('ção') || '%'; 

COD   DESCR
- --
444   ATENÇÃO

SELECT * FROM TESTE WHERE NLS_UPPER(DESCR) LIKE '%ÇÃO%'; 

COD   DESCR
- --
111   Atenção
444   ATENÇÃO



--- Em oracle_br@yahoogrupos.com.br, Anderson [EMAIL PROTECTED] escreveu

 No 10g é só substituir o '=' pelo 'like'.
 
 É retornada alguma mensagem de erro ou simplesmente não retorna 
 nenhum resultado?
 
 Que 'combinações' vc tentou?
 
 
 
 --- Em oracle_br@yahoogrupos.com.br, hiroshi_kobata 
 [EMAIL PROTECTED] escreveu
 
  Através dos comandos abaixo, consigo fazer a pesquisa independente 
 da
  acentuação:
  
  ===
  
  ALTER SESSION SET NLS_COMP=ANSI; 
  ALTER SESSION SET NLS_SORT=GENERIC_BASELETTER; 
  
  SELECT * FROM TESTE 
  WHERE DESCR = NLS_UPPER('atenção');
  
  COD   DESCR
  - --
  111   Atenção
  555   Atencão
  777   Atencao
  888   ATENÇÃO
  
  ===
  
  Como fazer o SELECT utilizando o LIKE invés do = ? 
  
  Tentei várias combinações ou formas mas não deu certo.
  
  Obs.: Oracle versão 9.2
 








--
Atenção! As mensagens deste grupo são de acesso público e de inteira 
responsabilidade de seus remetentes.
Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/ 
--__

Este Grupo recebe o apoio da SQL Magazine - www.devmedia.com.br/sqlmagazine 
__
O grupo Oracle_br não aceita anexos. Quando oferecer algum arquivo, tenha o 
link do mesmo para evitar trafego(pedidos) desnecessário. 
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:
[EMAIL PROTECTED]

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

 





[oracle_br] Re: Select independente da acentuação com like.

2006-07-21 Por tôpico Anderson
Então espero q alguém q trabalhe com a versão 9i possa te ajudar.

No 10g, os dois comandos, '='(1) e 'like' (2) retornam o mesmo 
resultado.

1 - SELECT * FROM TESTE
WHERE DESCR = NLS_UPPER('atenção');

DESCR
---
ATENÇÃO


2 - SELECT * FROM TESTE
WHERE DESCR LIKE NLS_UPPER('atenção');

DESCR
---
ATENÇÃO



--- Em oracle_br@yahoogrupos.com.br, hiroshi_kobata 
[EMAIL PROTECTED] escreveu

 
 Estou tentando utilizar o like com '%' mas, quando utilizo-as, o
 resultado fica sensível à acentuação, diferentemente quanto utilizo 
o
 '=', exemplos:
 
 SELECT * FROM TESTE WHERE DESCR LIKE NLS_UPPER('%ção%');
 
 COD   DESCR
 - --
 444   ATENÇÃO
 
 SELECT * FROM TESTE WHERE DESCR LIKE '%' || NLS_UPPER('ção') 
|| '%'; 
 
 COD   DESCR
 - --
 444   ATENÇÃO
 
 SELECT * FROM TESTE WHERE NLS_UPPER(DESCR) LIKE '%ÇÃO%'; 
 
 COD   DESCR
 - --
 111   Atenção
 444   ATENÇÃO
 
 
 
 --- Em oracle_br@yahoogrupos.com.br, Anderson [EMAIL PROTECTED] 
escreveu
 
  No 10g é só substituir o '=' pelo 'like'.
  
  É retornada alguma mensagem de erro ou simplesmente não retorna 
  nenhum resultado?
  
  Que 'combinações' vc tentou?
  
  
  
  --- Em oracle_br@yahoogrupos.com.br, hiroshi_kobata 
  [EMAIL PROTECTED] escreveu
  
   Através dos comandos abaixo, consigo fazer a pesquisa 
independente 
  da
   acentuação:
   
   ===
   
   ALTER SESSION SET NLS_COMP=ANSI; 
   ALTER SESSION SET NLS_SORT=GENERIC_BASELETTER; 
   
   SELECT * FROM TESTE 
   WHERE DESCR = NLS_UPPER('atenção');
   
   COD   DESCR
   - --
   111   Atenção
   555   Atencão
   777   Atencao
   888   ATENÇÃO
   
   ===
   
   Como fazer o SELECT utilizando o LIKE invés do = ? 
   
   Tentei várias combinações ou formas mas não deu certo.
   
   Obs.: Oracle versão 9.2
  
 








--
Atenção! As mensagens deste grupo são de acesso público e de inteira 
responsabilidade de seus remetentes.
Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/ 
--__

Este Grupo recebe o apoio da SQL Magazine - www.devmedia.com.br/sqlmagazine 
__
O grupo Oracle_br não aceita anexos. Quando oferecer algum arquivo, tenha o 
link do mesmo para evitar trafego(pedidos) desnecessário. 
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:
[EMAIL PROTECTED]

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

 




[oracle_br] Re: Select independente da acentuação com like.

2006-07-19 Por tôpico Anderson
No 10g é só substituir o '=' pelo 'like'.

É retornada alguma mensagem de erro ou simplesmente não retorna 
nenhum resultado?

Que 'combinações' vc tentou?



--- Em oracle_br@yahoogrupos.com.br, hiroshi_kobata 
[EMAIL PROTECTED] escreveu

 Através dos comandos abaixo, consigo fazer a pesquisa independente 
da
 acentuação:
 
 ===
 
 ALTER SESSION SET NLS_COMP=ANSI; 
 ALTER SESSION SET NLS_SORT=GENERIC_BASELETTER; 
 
 SELECT * FROM TESTE 
 WHERE DESCR = NLS_UPPER('atenção');
 
 COD   DESCR
 - --
 111   Atenção
 555   Atencão
 777   Atencao
 888   ATENÇÃO
 
 ===
 
 Como fazer o SELECT utilizando o LIKE invés do = ? 
 
 Tentei várias combinações ou formas mas não deu certo.
 
 Obs.: Oracle versão 9.2








--
Atenção! As mensagens deste grupo são de acesso público e de inteira 
responsabilidade de seus remetentes.
Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/ 
--__

Este Grupo recebe o apoio da SQL Magazine - www.devmedia.com.br/sqlmagazine 
__
O grupo Oracle_br não aceita anexos. Quando oferecer algum arquivo, tenha o 
link do mesmo para evitar trafego(pedidos) desnecessário. 
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:
[EMAIL PROTECTED]

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

 




RES: [oracle_br] Re: Select independente da ac entuação com like.

2006-07-19 Por tôpico Anderson Haertel Rodrigues - FLN
A solução completa vem apenas no 10g, no 9i substitua o like pelo operador 
 e faça um teste.
 
SELECT * FROM TESTE 
WHERE DESCR  'aten';

Atenciosamente,

Anderson Haertel Rodrigues
Administrador de Banco de Dados
Florianópolis/SC - [EMAIL PROTECTED] 

-Mensagem original-
De: oracle_br@yahoogrupos.com.br [mailto:[EMAIL PROTECTED] nome de Anderson
Enviada em: quarta-feira, 19 de julho de 2006 15:25
Para: oracle_br@yahoogrupos.com.br
Assunto: [oracle_br] Re: Select independente da acentuação com like.


No 10g é só substituir o '=' pelo 'like'.

É retornada alguma mensagem de erro ou simplesmente não retorna 
nenhum resultado?

Que 'combinações' vc tentou?



--- Em oracle_br@yahoogrupos.com.br, hiroshi_kobata 
[EMAIL PROTECTED] escreveu

 Através dos comandos abaixo, consigo fazer a pesquisa independente 
da
 acentuação:
 
 ===
 
 ALTER SESSION SET NLS_COMP=ANSI; 
 ALTER SESSION SET NLS_SORT=GENERIC_BASELETTER; 
 
 SELECT * FROM TESTE 
 WHERE DESCR = NLS_UPPER('atenção');
 
 COD   DESCR
 - --
 111   Atenção
 555   Atencão
 777   Atencao
 888   ATENÇÃO
 
 ===
 
 Como fazer o SELECT utilizando o LIKE invés do = ? 
 
 Tentei várias combinações ou formas mas não deu certo.
 
 Obs.: Oracle versão 9.2






 



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



--
Atenção! As mensagens deste grupo são de acesso público e de inteira 
responsabilidade de seus remetentes.
Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/ 
--__

Este Grupo recebe o apoio da SQL Magazine - www.devmedia.com.br/sqlmagazine 
__
O grupo Oracle_br não aceita anexos. Quando oferecer algum arquivo, tenha o 
link do mesmo para evitar trafego(pedidos) desnecessário. 
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:
[EMAIL PROTECTED]

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

 




[oracle_br] Re: Select em campo long

2006-06-30 Por tôpico Anderson
Até onde eu sei, não é possível fazer operações 
como 'like', 'substr', 'length', etc em colunas do tipo long.

Essa é uma das razões pela qual se orienta o uso das colunas do tipo 
LOB em substituição às do tipo long.


Anderson.



--- Em oracle_br@yahoogrupos.com.br, Eude Ferreira 
[EMAIL PROTECTED] escreveu

 Olá amigos

   Estou tentando usar o operador like para selecionar dados em um 
campo long e está ocorrendo o erro abaixo:

   Instrução:

   SELECT * FROM SYSADM.PSSQLTEXTDEFN
   WHERE SQLTEXT LIKE '%INSERTSELECT%'

   Erro:

   ERRO na linha 2:
 ORA-00932: tipos de dados inconsistentes: esperava NUMBER obteve 
LONG

   Alguém poderia me ajudar?

   Grato

   Eude

 
   
 -
  Novidade no Yahoo! Mail: receba alertas de novas mensagens no seu 
celular. Registre seu aparelho agora!
 
 [As partes desta mensagem que não continham texto foram removidas]







--
Atenção! As mensagens deste grupo são de acesso público e de inteira 
responsabilidade de seus remetentes.
Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/ 
--__

Este Grupo recebe o apoio da SQL Magazine - www.devmedia.com.br/sqlmagazine 
__
O grupo Oracle_br não aceita anexos. Quando oferecer algum arquivo, tenha o 
link do mesmo para evitar trafego(pedidos) desnecessário. 
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:
[EMAIL PROTECTED]

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

 




Re: [oracle_br] Re: select if ..

2006-05-25 Por tôpico GILBERTO MEDEIROS DE SOUZA



Tente usar no seu select a instrução DECODE que simula um comando IF dentro do seu select:
 
 DECODE(col|expr, compara1, resultado1
 [, compara2, resultado2, ...],
 valor_omissao)
 
 select decode (tipcli, 'F', to_char(cgcent,'999.999.999-99'), 'J',
to_char(cgcent,'99.999.999/-99')) tipcli, codcli, nomcli 
 from e085cli
 
 Espero ter ajudado.
 
 

jlchiappa [EMAIL PROTECTED] escreveu:
 Eduardo, na verdade isto não se aplica em lugar NENHUM do Oracle, não
existe uma função chamada IF(), no dialeto SQL do bd Oracle a função
de decisão se chama CASE, consulte o manual oracle SQL Reference que
vc acha a sintaxe completa dela, e alguns exemplos.

[]s

Chiappa

--- Em oracle_br@yahoogrupos.com.br, Eduardo - Wat Alimentos Ltda
escreveu

 Galera, onde está errado nesta condição, ou isto não aplica-se
exatamente aki ...
 
 select if(tipcli='F', to_char(cgcent,'999.999.999-99'),
to_char(cgcent,'99.999.999/-99')), codcli, nomcli 
 from e085cli
 
 [As partes desta mensagem que não continham texto foram removidas]







--
Atenção! As mensagens deste grupo são de acesso público e de inteira responsabilidade de seus remetentes.
Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/ 
--__

Este Grupo recebe o apoio da SQL Magazine - www.devmedia.com.br/sqlmagazine 
__
O grupo Oracle_br não aceita anexos. Quando oferecer algum arquivo, tenha o link do mesmo para evitar trafego(pedidos) desnecessário. 
Links do Yahoo! Grupos









  
-
 Abra sua conta no Yahoo! Mail - 1GB de espaço, alertas de e-mail no celular e anti-spam realmente eficaz. 

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







--
Atenção! As mensagens deste grupo são de acesso público e de inteira responsabilidade de seus remetentes.
Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/ 
--__

Este Grupo recebe o apoio da SQL Magazine - www.devmedia.com.br/sqlmagazine 
__
O grupo Oracle_br não aceita anexos. Quando oferecer algum arquivo, tenha o link do mesmo para evitar trafego(pedidos) desnecessário.





  




  
Yahoo! Grupos, um serviço oferecido por:
  
  
PUBLICIDADE




  
  



  




  
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:[EMAIL PROTECTED]
O uso que você faz do Yahoo! Grupos está sujeito aos Termos do Serviço do Yahoo!.











[oracle_br] Re: select if ..

2006-05-23 Por tôpico jlchiappa



Eduardo, na verdade isto não se aplica em lugar NENHUM do Oracle, não
existe uma função chamada IF(), no dialeto SQL do bd Oracle a função
de decisão se chama CASE, consulte o manual oracle SQL Reference que
vc acha a sintaxe completa dela, e alguns exemplos.

[]s

 Chiappa

--- Em oracle_br@yahoogrupos.com.br, Eduardo - Wat Alimentos Ltda
[EMAIL PROTECTED] escreveu

 Galera, onde está errado nesta condição, ou isto não aplica-se
exatamente aki ...
 
 select if(tipcli='F', to_char(cgcent,'999.999.999-99'),
to_char(cgcent,'99.999.999/-99')), codcli, nomcli 
 from e085cli
 
 [As partes desta mensagem que não continham texto foram removidas]











--
Atenção! As mensagens deste grupo são de acesso público e de inteira responsabilidade de seus remetentes.
Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/ 
--__

Este Grupo recebe o apoio da SQL Magazine - www.devmedia.com.br/sqlmagazine 
__
O grupo Oracle_br não aceita anexos. Quando oferecer algum arquivo, tenha o link do mesmo para evitar trafego(pedidos) desnecessário.





  




  
Yahoo! Grupos, um serviço oferecido por:
  
  
PUBLICIDADE




  
  



  




  
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:[EMAIL PROTECTED]
O uso que você faz do Yahoo! Grupos está sujeito aos Termos do Serviço do Yahoo!.











Re: [oracle_br] Re: Select into

2006-05-16 Por tôpico Aline Rios



Boa tarde!
Já consegui resolver.
 De qualquer forma, muito obrigada pela ajuda e atenção!
 Sds.

nabilna10 [EMAIL PROTECTED] escreveu:
 Oi Aline,
Me diz uma coisa, onde voce esta preenchendo o parametro de saida, 
o p_retorno ?

[]s
Nabil

--- Em oracle_br@yahoogrupos.com.br, Aline Rios 
escreveu

 Pessoal, boa tarde!
 Tenho uma procedure que faz um select-into, mas que não está 
funcionando.
 No ambiente de teste ela funciona, mas no de homologação não.
 Ela não dá erro oracle algum, mas não insere os registros.
 Fazendo o select sem o into, os registros são selecionados 
normalmente.
 Segue abaixo o código.
 Agradeço se alguém tiver alguma sugestão.
 Sds.
 
 procedure insEndereco(p_matricula in 
siape.cadastropessoal.matricula%type,
 p_seq_pessoa in pessoa.seq_pessoa%type,
 p_retorno out number)
 is
 v_rua endereco.rua%type;
 v_numero endereco.numero%type;
 v_complemento endereco.complemento%type;
 v_bairro endereco.bairro%type;
 v_cidade endereco.cidade%type;
 v_cep endereco.cep%type;
 v_cod_estado estados.codestado%type; 
 begin
 SELECT E.LOGRADOURO,
 E.NUMERO,
 E.COMPLEMENTO,
 E.BAIRRO,
 E.CIDADE,
 E.CEP,
 (select codEstado from estados where estados.siglaestado 
= e.uf)
 INTO v_rua,
 v_numero,
 v_complemento,
 v_bairro,
 v_cidade,
 v_cep,
 v_cod_estado 
 FROM SIAPE.CADASTROPESSOAL C,
 SIAPE.ENDERECO E
 WHERE C.MATRICULA = p_matricula
 AND C.MATRICULA = E.MATRICULA
 AND E.TIPO = 'S';
 
 
 -
 Novidade no Yahoo! Mail: receba alertas de novas mensagens no seu 
celular. Registre seu aparelho agora!
 
 [As partes desta mensagem que não continham texto foram removidas]








--
Atenção! As mensagens deste grupo são de acesso público e de inteira responsabilidade de seus remetentes.
Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/ 
--__

Este Grupo recebe o apoio da SQL Magazine - www.devmedia.com.br/sqlmagazine 
__
O grupo Oracle_br não aceita anexos. Quando oferecer algum arquivo, tenha o link do mesmo para evitar trafego(pedidos) desnecessário. 
Links do Yahoo! Grupos







 


  
-
 Yahoo! doce lar. Faça do Yahoo! sua homepage.

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







--
Atenção! As mensagens deste grupo são de acesso público e de inteira responsabilidade de seus remetentes.
Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/ 
--__

Este Grupo recebe o apoio da SQL Magazine - www.devmedia.com.br/sqlmagazine 
__
O grupo Oracle_br não aceita anexos. Quando oferecer algum arquivo, tenha o link do mesmo para evitar trafego(pedidos) desnecessário.





  




  
Yahoo! Grupos, um serviço oferecido por:
  
  
PUBLICIDADE




  
  



  




  
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:[EMAIL PROTECTED]
O uso que você faz do Yahoo! Grupos está sujeito aos Termos do Serviço do Yahoo!.












[oracle_br] Re: Select reduzido

2006-04-06 Por tôpico Marcio Portes
Totalizar o que? Agrupado pelo o que? 
Exemplo da tabela e o que está tentando fazer são bem-vindos.


--- Em oracle_br@yahoogrupos.com.br, André_Oracle 
[EMAIL PROTECTED] escreveu

 Caros amigos...
 Montei um select na minha tabela de movimentação de estoque que me 
dá o 
 seguinte resultado.
 
 *Cod   qtdevalor   total*
 1  1   5,00  5,00
 1  2   5,00 10,00
 
 O que eu precisava era  mostrar apenas uma linha totalizada da 
seguinte 
 forma:
 
 *Cod   qtdevalor   total*
 1  35,0015,00
 
 Vcs poderiam me ajudar?
 
 Obrigado.
 
 André








--
Atenção! As mensagens deste grupo são de acesso público e de inteira 
responsabilidade de seus remetentes.
Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/ 
--__

Este Grupo recebe o apoio da SQL Magazine - www.devmedia.com.br/sqlmagazine 
__
O grupo Oracle_br não aceita anexos. Quando oferecer algum arquivo, tenha o 
link do mesmo para evitar trafego(pedidos) desnecessário. 
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:
[EMAIL PROTECTED]

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

 




Re: [oracle_br] Re: Select reduzido

2006-04-06 Por tôpico Cristiano Becker

André,

Acho que é isso que você quer:

select cod,nvl(sum(qtde),0) qtde,valor,nvl(sum(total),0) total
from tabela
group by cod,valor

Cristiano

- Original Message -
  From: Marcio Portes
  To: oracle_br@yahoogrupos.com.br
  Sent: Thursday, April 06, 2006 2:25 PM
  Subject: [oracle_br] Re: Select reduzido


  Totalizar o que? Agrupado pelo o que?
  Exemplo da tabela e o que está tentando fazer são bem-vindos.


  --- Em oracle_br@yahoogrupos.com.br, André_Oracle
  [EMAIL PROTECTED] escreveu
  
   Caros amigos...
   Montei um select na minha tabela de movimentação de estoque que me
  dá o
   seguinte resultado.
  
   *Cod   qtdevalor   total*
   1  1   5,00  5,00
   1  2   5,00 10,00
  
   O que eu precisava era  mostrar apenas uma linha totalizada da
  seguinte
   forma:
  
   *Cod   qtdevalor   total*
   1  35,0015,00
  
   Vcs poderiam me ajudar?
  
   Obrigado.
  
   André
  







  
--
  Atenção! As mensagens deste grupo são de acesso público e de inteira 
responsabilidade de seus remetentes.
  Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/
  
--__

  Este Grupo recebe o apoio da SQL Magazine - www.devmedia.com.br/sqlmagazine
  __
  O grupo Oracle_br não aceita anexos. Quando oferecer algum arquivo, tenha o 
link do mesmo para evitar trafego(pedidos) desnecessário.



--
  Links do Yahoo! Grupos

a.. Para visitar o site do seu grupo na web, acesse:
http://br.groups.yahoo.com/group/oracle_br/
 
b.. Para sair deste grupo, envie um e-mail para:
[EMAIL PROTECTED]
 
c.. O uso que você faz do Yahoo! Grupos está sujeito aos Termos do Serviço 
do Yahoo!.



---
Esta mensagem pode conter informacoes confidenciais ou privilegiadas.
Se voce recebeu esta mensagem por engano, voce nao deve usar, copiar,
divulgar ou tomar qualquer atitude com base nestas informacoes.

Solicitamos que voce  apague a mensagem e avise imediatamente pelo endereco
[EMAIL PROTECTED]
Opinioes, conclusoes ou informacoes nesta mensagem nao necessariamente refletem
a posicao oficial da Empresa.
---

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



--
Atenção! As mensagens deste grupo são de acesso público e de inteira 
responsabilidade de seus remetentes.
Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/ 
--__

Este Grupo recebe o apoio da SQL Magazine - www.devmedia.com.br/sqlmagazine 
__
O grupo Oracle_br não aceita anexos. Quando oferecer algum arquivo, tenha o 
link do mesmo para evitar trafego(pedidos) desnecessário. 
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:
[EMAIL PROTECTED]

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

 





Re: [oracle_br] Re: Select reduzido

2006-04-06 Por tôpico André_Oracle
Marcio Portes escreveu:
 Totalizar o que? Agrupado pelo o que?
 Exemplo da tabela e o que está tentando fazer são bem-vindos.


 --- Em oracle_br@yahoogrupos.com.br, André_Oracle
 [EMAIL PROTECTED] escreveu
 
  Caros amigos...
  Montei um select na minha tabela de movimentação de estoque que me
 dá o
  seguinte resultado.
 
  *Cod   qtdevalor   total*
  1  1   5,00  5,00
  1  2   5,00 10,00
 
  O que eu precisava era  mostrar apenas uma linha totalizada da
 seguinte
  forma:
 
  *Cod   qtdevalor   total*
  1  35,0015,00
 
  Vcs poderiam me ajudar?
 
  Obrigado.
 
  André
 







 --
 Atenção! As mensagens deste grupo são de acesso público e de inteira 
 responsabilidade de seus remetentes.
 Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/
 --__

 Este Grupo recebe o apoio da SQL Magazine - 
 www.devmedia.com.br/sqlmagazine
 __
 O grupo Oracle_br não aceita anexos. Quando oferecer algum arquivo, 
 tenha o link do mesmo para evitar trafego(pedidos) desnecessário.


 
 *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:
   [EMAIL PROTECTED]
   mailto:[EMAIL PROTECTED]

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


Caro Márcio, obrigado pela atenção...

Acabo de resolver o problema.
Segue o código certo :

Select mo.cdmaterial CODIGO,
   m.nomaterial  DESCRICAO, 
   sum(round(mo.qtmovimento,2))   
QTDE_VENDIDA,
   sum(round(mo.vlunitario,2))
VL_VENDIDO,
  -- sum(round(mo.vlunitario * mo.qtmovimento ,2))  
SUBTOTAL,
   sum(round(mo.vlunitario * mo.qtmovimento ,2))* 
sum(round(mo.qtmovimento,2)) SUBTOTAL2,
   sum(nvl(mo.vlcustomedio,me.vlcustomedio))  CUSTO_MEDIO_SEM_ICMS,
   
roundsum(mo.vlunitario)/sum(nvl(mo.vlcustomedio,me.vlcustomedio)))*100)-100),2)
  
MARGEM

from movimento mo,
 material_empresa me,
 material m
 
where mo.cdmaterial = me.cdmaterial
and   mo.cdempresa  = me.cdempresa
and   mo.cdunidademedida = me.cdunidademedida
and   mo.cdmaterial = m.cdmaterial
and   mo.cdhistorico = 40.01 -- vendas
and  mo.dtmovimento between '01/03/2006' and '31/03/2006'
--and mo.cdmaterial = 1
group by
   mo.cdmaterial ,
   m.nomaterial 
order by mo.cdmaterial ,
   m.nomaterial

O que estava faltando era o group by dessa forma que está agora...


Mais uma vez obrigado pela atenção.


André



--
Atenção! As mensagens deste grupo são de acesso público e de inteira 
responsabilidade de seus remetentes.
Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/ 
--__

Este Grupo recebe o apoio da SQL Magazine - www.devmedia.com.br/sqlmagazine 
__
O grupo Oracle_br não aceita anexos. Quando oferecer algum arquivo, tenha o 
link do mesmo para evitar trafego(pedidos) desnecessário. 
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:
[EMAIL PROTECTED]

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

 





[oracle_br] Re: select null

2005-07-27 Por tôpico mhbonfa
esta retornando null  ou esta no_data_found ?

se for null o nvl deveria funcionar

não existe outro caracter(especial) no campo ?





--- Em oracle_br@yahoogrupos.com.br, fabiopassanha 
[EMAIL PROTECTED] escreveu
 Pessoal...
 
 tenho o seguinte SELECT...
 SELECT PEC_TIPO_SEQUENCIAL PECA
 FROM PECA_TIPO
 WHERE SET_CODIGO = 3
 AND ITE_CODIGO = 1
 AND UPPER(PEC_TIPO_DESCRICAO) LIKE UPPER('PORTA LARGA')
 
 ele me retorna NULL...como faco para se retornar NULL , jogar 0  por 
 exemplo.
 ja usei NVL, DECODE, mas nao consegui.
 
 desde ja agradeco
 
 Fabio




__

Histórico: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/
Falar com os Moderadores:([EMAIL PROTECTED])
Dorian Anderson Soutto - Fernanda Damous - Alisson Aguiar 
__ 
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:
[EMAIL PROTECTED]

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

 




[oracle_br] Re: select null

2005-07-27 Por tôpico jlchiappa
Ou então o campo está com espaço em branco, e na verdade o que está 
retornando é um branco e o colega lá pensa que é um nulo A 
maneira de se testar isso é fazer a consulta no sql*plus mandando o 
plus trocar o nulo por outra coisa, tipo :

scott:SQLset null NULO
scott:SQLselect empno, ename, comm from emp;

 EMPNO ENAMECOMM
-- -- --
  7369 SMITH  NULO
  7499 ALLEN 300
  7521 WARD  500
  7566 JONES  NULO
  7654 MARTIN   1400
  7698 BLAKE  NULO
  7782 CLARK  NULO
  7788 SCOTT  NULO
  7839 KING   NULO
  7844 TURNER  0
  7876 ADAMS  NULO
  7900 JAMES  NULO
  7902 FORD   NULO
  7934 MILLER NULO
   ALLEN X   300
   777 Zé NULO

16 linhas selecionadas.


[]s

 Chiappa
 
--- Em oracle_br@yahoogrupos.com.br, mhbonfa [EMAIL PROTECTED] 
escreveu
 esta retornando null  ou esta no_data_found ?
 
 se for null o nvl deveria funcionar
 
 não existe outro caracter(especial) no campo ?
 
 
 
 
 
 --- Em oracle_br@yahoogrupos.com.br, fabiopassanha 
 [EMAIL PROTECTED] escreveu
  Pessoal...
  
  tenho o seguinte SELECT...
  SELECT PEC_TIPO_SEQUENCIAL PECA
  FROM PECA_TIPO
  WHERE SET_CODIGO = 3
  AND ITE_CODIGO = 1
  AND UPPER(PEC_TIPO_DESCRICAO) LIKE UPPER('PORTA LARGA')
  
  ele me retorna NULL...como faco para se retornar NULL , jogar 0  
por 
  exemplo.
  ja usei NVL, DECODE, mas nao consegui.
  
  desde ja agradeco
  
  Fabio




__

Histórico: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/
Falar com os Moderadores:([EMAIL PROTECTED])
Dorian Anderson Soutto - Fernanda Damous - Alisson Aguiar 
__ 
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:
[EMAIL PROTECTED]

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

 




Re:[oracle_br] Re: Select Tabela Particionada

2005-06-22 Por tôpico Ronaldo Sales
uh, realmente os conceitos me pegaram mesmo então.

To me matando achando que ta errado o acesso.

refiz meu teste com uma sugestão de partição do Márcio Portes. Fazendo 
PARTITION BY RANGE (ANOMES,PLATAFORMA)
( PARTITION P2004 VALUES LESS THAN (200411,12)
 ,PARTITION P20041112 VALUES LESS THAN (200411,13)
 ,PARTITION P20041211 VALUES LESS THAN (200412,12)
 ,PARTITION P20041212 VALUES LESS THAN (200412,13))

Aí sim todos os valores caem na partição certo ( não sei porque ele não faz o 
values less than para o anomes, só para a plataforma).

E olhando o plano ainda estava vendo o FULL table scan.

Vou reproduzir o mesmo caminho que vc fez.

Muito obrigado a vc e a todos que contribuiram com idéiais.






De:oracle_br@yahoogrupos.com.br

Para:oracle_br@yahoogrupos.com.br

Cópia:

Data:Wed, 22 Jun 2005 19:02:48 -

Assunto:Re:[oracle_br] Re: Select Tabela Particionada

Dois conceitos te pegaram aqui :

a) a operação de ler uma partição inteira AINDA se chama FULL TABLE 
SCAN, pra vc ver que o SCAN está sendo feito por partição vc tem que 
ver o partition start/stop

b) o AUTOTRACE (que deve ter sido o que vc usou) ** não mostra ** o 
início/fim de leitura de partição , mas o EXPLAIN PLAN mostra, e o 
TKPROF também, como mais abaixo mostrado.


== Agora, a obs sobre os seus params e sobre o seu teste : vc diz 
que está testando COM  partições, mas testar CBO sem que as configs 
dele estejam OK, ou estejam default sem ser feita análise, é inútil. 
Por exemplo : optimizer_index_caching 0 e optimizer_index_cost_adj 
100 ??? Isso é o default !!hash_multiblock_io_count=0, vc REALMENTE 
não quer ter hash joins ??? Outra coisa, vc setou multiblock_read 
como 8192 * 128 = 1 Mb, ** mas se ** os extents das tabelas maiores 
(que se beneficiam de scan) forem menores que isso vc NÂO VAI se 
aproveitar disso, como eu mostrei lá na demonstração da ENPO.

E só pra constar : no caso presente tudo bem, mas vc nos casos que 
for preciso, ** VAI ** analizar índices E computar histogramas, né ???


Segue a demonstração, mostrando que li via scan apenas a partição 1 
das 4 que tenho :


SQL*Plus: Release 8.1.7.0.0 - Production on Qua Jun 22 14:50:53 2005

(c) Copyright 2000 Oracle Corporation. All rights reserved.


Conectado a:
Personal Oracle8i Release 8.1.7.0.0 - Production
With the Partitioning option
JServer Release 8.1.7.0.0 - Production

[EMAIL PROTECTED]:SQLCREATE TABLE part_ronaldo
2 (ANOMES NUMBER(6) NOT NULL,
3 PLATAFORMA NUMBER(2) NOT NULL,
4 COD_CLIENTE NUMBER(7) ,
5 COD_CELULAR NUMBER(7) )
6 PARTITION BY RANGE (ANOMES,PLATAFORMA)
7 ( PARTITION P2004 VALUES LESS THAN (200412,12)
8 ,PARTITION P20041112 VALUES LESS THAN (200412,13)
9 ,PARTITION P20041211 VALUES LESS THAN (200501,12)
10 ,PARTITION P20041212 VALUES LESS THAN (200501,13))
11 ;

Tabela criada.

[EMAIL PROTECTED]:SQLinsert into PART_RONALDO
2 select 200411, decode(mod(rownum,2),0,12,11), rownum, 23
3 from ALL_OBJECTS
4 where rownum = 10;

21802 linhas criadas.

[EMAIL PROTECTED]:SQLcommit;

Validação completa.

[EMAIL PROTECTED]:SQLanalyze table PART_RONALDO compute statistics;

Tabela analisada.

[EMAIL PROTECTED]:SQLselect ANOMES,PLATAFORMA, count(*) from PART_RONALDO 
group by ANOMES,PLATAFORMA;

ANOMES PLATAFORMA COUNT(*)
-- -- --
200411 11 10901
200411 12 10901

[EMAIL PROTECTED]:SQLselect table_name, partition_name, PARTITION_POSITION 
from user_tab_partitions;

TABLE_NAME PARTITION_NAME 
PARTITION_POSITION
-- -- 
--
PART_RONALDO 
P2004 1
PART_RONALDO 
P20041112 2
PART_RONALDO 
P20041211 3
PART_RONALDO 
P20041212 4

[EMAIL PROTECTED]:SQLset autotrace on

[EMAIL PROTECTED]:SQLselect * from PART_RONALDO where ANOMES=200411 and 
PLATAFORMA=11;

...
ANOMES PLATAFORMA COD_CLIENTE 
COD_CELULAR
-- -- -- -
-
200411 11 
21737 23
200411 11 
21739 23
200411 11 
21741 23
200411 11 
21743 23
200411 11 
21745 23
200411 11 
21747 23
200411 11 
21749 23
200411 11 
21751 23
200411 11 
21753 23
200411 11 
21755 23
200411 11 
21757 23
200411 11 
21759 23
200411 11 
21761 23
200411 11 
21763 23
200411 11 
21765 23
200411 11 
21767 23
200411 11 
21769 23
200411 11 
21771 23
200411 11 
21773 23
200411 11 
21775 23
200411 11 
21777 23
200411 11 
21779 23
200411 11 
21801 23

10901 linhas selecionadas.


Execution Plan
--
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=10 Card=10901 
Bytes=130812)
1 0 TABLE ACCESS (FULL) OF 'PART_RONALDO' (Cost=10 Card=10901 
Bytes=130812)




Statistics
--
0 recursive calls
4 db block gets
787 consistent gets
21 physical reads
0 redo size
524450 bytes sent via SQL*Net to client
81011 bytes received via SQL*Net from client
728 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
10901 rows processed


[EMAIL

Re:[oracle_br] Re: Select Tabela Particionada

2005-06-22 Por tôpico Ronaldo Sales
Novamente muito obrigado a vc e a todos.

O livro eu quero comprar pois não tenho mesmo. Docs eu to lendo cada vez pois 
estou sentindo a necessidade de saber cada vez para criar processos bons.

Em relação aos params do banco ainda não parei pra conversar com os DBAs, cada 
vez que eu vou lá eu compro uma briga com eles. Eles tavam me falando que a 
clausula PARTITION é obrigatória no FROM TABELA, por isso que eu comecei a 
fazer teste, além é claro de visar a performance da consulta. A tabela atual 
está particionada por RANGE e subparticionada por HASH. E eu li que por HASH 
não garantia que cada plataforma caisse no seu devido lugar.

Abraços a todos.

Ronaldo.





De:oracle_br@yahoogrupos.com.br

Para:oracle_br@yahoogrupos.com.br

Cópia:

Data:Wed, 22 Jun 2005 20:05:01 -

Assunto:Re:[oracle_br] Re: Select Tabela Particionada

Legal. Pra vc não tropeçar mais quando fazendo testes de performance, 
recomendaria uma revisada nas docs correspondentes e no capítulo de 
tools de performance do livro Expert One in One do Tom Kyte - se vc 
não o tem, adquira o seu, vc não vai se arrepender!!
E insisto no aviso, se os params do CBO (como os que citei no e-
mail) não estão bons, esses testes que vc está fazendo nessa máquina 
não vão servir pra absolutamente NADA em termos de performance...
[]s
Chiappa
--- Em oracle_br@yahoogrupos.com.br, Ronaldo Sales 
escreveu
 uh, realmente os conceitos me pegaram mesmo então.
 
 To me matando achando que ta errado o acesso.
 
 refiz meu teste com uma sugestão de partição do Márcio Portes. 
Fazendo 
 PARTITION BY RANGE (ANOMES,PLATAFORMA)
 ( PARTITION P2004 VALUES LESS THAN (200411,12)
 ,PARTITION P20041112 VALUES LESS THAN (200411,13)
 ,PARTITION P20041211 VALUES LESS THAN (200412,12)
 ,PARTITION P20041212 VALUES LESS THAN (200412,13))
 
 Aí sim todos os valores caem na partição certo ( não sei porque ele 
não faz o values less than para o anomes, só para a plataforma).
 
 E olhando o plano ainda estava vendo o FULL table scan.
 
 Vou reproduzir o mesmo caminho que vc fez.
 
 Muito obrigado a vc e a todos que contribuiram com idéiais.
 
 
 
 
 
 
 De:oracle_br@yahoogrupos.com.br
 
 Para:oracle_br@yahoogrupos.com.br
 
 Cópia:
 
 Data:Wed, 22 Jun 2005 19:02:48 -
 
 Assunto:Re:[oracle_br] Re: Select Tabela Particionada
 
 Dois conceitos te pegaram aqui :
 
 a) a operação de ler uma partição inteira AINDA se chama FULL TABLE 
 SCAN, pra vc ver que o SCAN está sendo feito por partição vc tem 
que 
 ver o partition start/stop
 
 b) o AUTOTRACE (que deve ter sido o que vc usou) ** não mostra ** o 
 início/fim de leitura de partição , mas o EXPLAIN PLAN mostra, e o 
 TKPROF também, como mais abaixo mostrado.
 
 
 == Agora, a obs sobre os seus params e sobre o seu teste : vc diz 
 que está testando COM  partições, mas testar CBO sem que as 
configs 
 dele estejam OK, ou estejam default sem ser feita análise, é 
inútil. 
 Por exemplo : optimizer_index_caching 0 e optimizer_index_cost_adj 
 100 ??? Isso é o default !!hash_multiblock_io_count=0, vc REALMENTE 
 não quer ter hash joins ??? Outra coisa, vc setou multiblock_read 
 como 8192 * 128 = 1 Mb, ** mas se ** os extents das tabelas maiores 
 (que se beneficiam de scan) forem menores que isso vc NÂO VAI se 
 aproveitar disso, como eu mostrei lá na demonstração da ENPO.
 
 E só pra constar : no caso presente tudo bem, mas vc nos casos que 
 for preciso, ** VAI ** analizar índices E computar histogramas, 
né ???
 
 
 Segue a demonstração, mostrando que li via scan apenas a partição 1 
 das 4 que tenho :
 
 
 SQL*Plus: Release 8.1.7.0.0 - Production on Qua Jun 22 14:50:53 2005
 
 (c) Copyright 2000 Oracle Corporation. All rights reserved.
 
 
 Conectado a:
 Personal Oracle8i Release 8.1.7.0.0 - Production
 With the Partitioning option
 JServer Release 8.1.7.0.0 - Production
 
 [EMAIL PROTECTED]:SQLCREATE TABLE part_ronaldo
 2 (ANOMES NUMBER(6) NOT NULL,
 3 PLATAFORMA NUMBER(2) NOT NULL,
 4 COD_CLIENTE NUMBER(7) ,
 5 COD_CELULAR NUMBER(7) )
 6 PARTITION BY RANGE (ANOMES,PLATAFORMA)
 7 ( PARTITION P2004 VALUES LESS THAN (200412,12)
 8 ,PARTITION P20041112 VALUES LESS THAN (200412,13)
 9 ,PARTITION P20041211 VALUES LESS THAN (200501,12)
 10 ,PARTITION P20041212 VALUES LESS THAN (200501,13))
 11 ;
 
 Tabela criada.
 
 [EMAIL PROTECTED]:SQLinsert into PART_RONALDO
 2 select 200411, decode(mod(rownum,2),0,12,11), rownum, 23
 3 from ALL_OBJECTS
 4 where rownum = 10;
 
 21802 linhas criadas.
 
 [EMAIL PROTECTED]:SQLcommit;
 
 Validação completa.
 
 [EMAIL PROTECTED]:SQLanalyze table PART_RONALDO compute statistics;
 
 Tabela analisada.
 
 [EMAIL PROTECTED]:SQLselect ANOMES,PLATAFORMA, count(*) from 
PART_RONALDO 
 group by ANOMES,PLATAFORMA;
 
 ANOMES PLATAFORMA COUNT(*)
 -- -- --
 200411 11 10901
 200411 12 10901
 
 [EMAIL PROTECTED]:SQLselect table_name, partition_name, 
PARTITION_POSITION 
 from user_tab_partitions;
 
 TABLE_NAME PARTITION_NAME 
 PARTITION_POSITION