[oracle_br] Re: SELECT travando o BD
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
Ops, corrige meu typo aí : troca o "= between" por apenas "between", claro... []s Chiappa
[oracle_br] Re: SELECT com COUNT(*) demorando para retornar
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
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?
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?
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?
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?
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
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
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
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
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
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
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
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
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
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
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
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
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
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!
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!
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!
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!
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!
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!
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
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
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
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
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
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
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
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
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
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
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
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.
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******
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
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
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
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
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
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.
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.
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.
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.
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
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 ..
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 ..
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
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
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
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
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
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
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
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
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