Re: [oracle_br] Re: Recuperação em modo noarchivelog sem backup
Muito obrigado pela resposta Chiappa, tirou as minhas duvidas. -- Em qua, 28 de mai de 2014 22:55 BRT jlchia...@yahoo.com.br [oracle_br] escreveu: >Tudo jóia ? Então, no RDBMS Oracle o conceito é simples : recuperação se faz >aplicando-se nos datafiles em disco os redo logs (os logs de transação, que >registram as alterações havidas) sequencialmente - ora, se vc está em modo >noarchive significa que quando o log file sendo usado encheu, vc ** não tem ** >uma cópia dele, ele é reusado portanto vc PERDE os logs todos que houveram no >passado, só tem os logs mais recentes, online... > Sendo assim, vc só poderá fazer o recover ** SE ** , por uma sorte incrível, > as alterações necessárias para trazer o(s) datafile(s) a recuperar ainda > estão presentes no redo log file online, é isso Na prática num ambiente > produtivo isso é muito, muito, MUITO DiFÍCIL de acontecer (tranquilamente vc > pode precisar aplicar alterações/logs de horas atrás em caso de falha e > muitas vezes o redo log online enche em poucos minutos), então eu nem conto > com isso, ok ? > Na real a regra é : quem coloca o database em noarchivelog tá indicando que > o database pode ser perdido (digamos, é um armazém de dados, que em tese pode > ter os dados recuperados dos databases online), e QUANDO isso acontecer (não > é SE, é QUANDO), ou se assumirá o ônus de trazer os dados dos databases > online OU se recuperará o último backup e os dados daí pra frente são > descartados >SE não tiver backup E não há de onde trazer os dados E está em modo > noarchive, basicamente vc VAi ter perda de dados : nem mais, nem menos > >[]s > > Chiappa > >OBS : > > a) estamos falando aqui de recuperação de crash/atualização de > datafiles/prevenção de perda de dados : é Claro, se o banco está OK e vc só > quer ter os dados como estavam nalgum ponto do passado, outros recursos de > recuperação (como FLASHBACK QUERY) normalmente dependem de UNDO e não de redo > log, então há chances disso ser possível > > b) outras opções de recuperação de uma falha voltando o database no tempo até > antes da falha (como o FLASHBACK DATABASE, por exemplo) dependem de setup > extra (FLASHBACK LOGs no caso) : Dificilmente isso é o caso de estar > presente...
[oracle_br] Re: Recuperação em modo noarchivelog sem backup
Tudo jóia ? Então, no RDBMS Oracle o conceito é simples : recuperação se faz aplicando-se nos datafiles em disco os redo logs (os logs de transação, que registram as alterações havidas) sequencialmente - ora, se vc está em modo noarchive significa que quando o log file sendo usado encheu, vc ** não tem ** uma cópia dele, ele é reusado portanto vc PERDE os logs todos que houveram no passado, só tem os logs mais recentes, online... Sendo assim, vc só poderá fazer o recover ** SE ** , por uma sorte incrível, as alterações necessárias para trazer o(s) datafile(s) a recuperar ainda estão presentes no redo log file online, é isso Na prática num ambiente produtivo isso é muito, muito, MUITO DiFÍCIL de acontecer (tranquilamente vc pode precisar aplicar alterações/logs de horas atrás em caso de falha e muitas vezes o redo log online enche em poucos minutos), então eu nem conto com isso, ok ? Na real a regra é : quem coloca o database em noarchivelog tá indicando que o database pode ser perdido (digamos, é um armazém de dados, que em tese pode ter os dados recuperados dos databases online), e QUANDO isso acontecer (não é SE, é QUANDO), ou se assumirá o ônus de trazer os dados dos databases online OU se recuperará o último backup e os dados daí pra frente são descartados SE não tiver backup E não há de onde trazer os dados E está em modo noarchive, basicamente vc VAi ter perda de dados : nem mais, nem menos []s Chiappa OBS : a) estamos falando aqui de recuperação de crash/atualização de datafiles/prevenção de perda de dados : é Claro, se o banco está OK e vc só quer ter os dados como estavam nalgum ponto do passado, outros recursos de recuperação (como FLASHBACK QUERY) normalmente dependem de UNDO e não de redo log, então há chances disso ser possível b) outras opções de recuperação de uma falha voltando o database no tempo até antes da falha (como o FLASHBACK DATABASE, por exemplo) dependem de setup extra (FLASHBACK LOGs no caso) : Dificilmente isso é o caso de estar presente...
[oracle_br] Recuperação em modo noarchivelog sem backup
Boa noite pessoal, Sou iniciante em Oracle e gostaria de saber se é possível fazer a recuperação de um banco de dados funcionando em modo noarchivelog e sem backup. Isso é possível? Como? Att, Carlos
Re: [oracle_br] Re: Desafio SQL
Olha o que achei... para todos os gostos, vale como estudo. ORACLE-BASE - String Aggregation Techniques http://www.oracle-base.com/articles/misc/string-aggregation-techniques.php http://www.oracle-base.com/articles/misc/string-aggregation-techniques.php ORACLE-BASE - String Aggregation Techniques http://www.oracle-base.com/articles/misc/string-aggregation-techniques.php ORACLE-BASE - String Aggregation Techniques Visualizar em www.oracle-bas... http://www.oracle-base.com/articles/misc/string-aggregation-techniques.php Visualização pelo Yahoo
Re: [oracle_br] Re: Desafio SQL
O Thiagão ainda comentou: [14:00:14] Thiago dos santos leite: acho que no 10g tem um WM_CONCAT e STRAGG, só tem que testar. Att,/Regards, Vitor Jr. Infraestrutura / Infrastructure Team Oracle 11g DBA Certified Professional - OCP Oracle Certified Expert, Oracle Real Application Clusters 11g and Grid Infrastructure Administrator - OCE Oracle Database 11g Performance Tuning Certified Expert - OCE Oracle Exadata 11g Certified Implementation Specialist Oracle Certified Associate, MySQL 5 mail, gtalk e msn: vitorj...@gmail.com http://certificacaobd.com.br/ skype: vjunior1981 https://mybizcard.co/vitor.jr.385628 Em 28 de maio de 2014 14:39, flavio_brune...@yahoo.com [oracle_br] < oracle_br@yahoogrupos.com.br> escreveu: > > > Usando a dica do Thiago dos Santos Leite (colega do Vitor Junior), segue > outra solução, que funcionou bem no Oracle 10. O exemplo do Thiago funciona > no Oracle 11 em diante. > > select e.id, e.produto, e.situacao, wm_concat(s.descricao) lista > from estoque e > join situacao s on bitand(e.situacao, s.id) > 0 > group by e.id, e.produto, e.situacao > order by e.id; > > Abs > > >
Re: [oracle_br] Re: Desafio SQL
Usando a dica do Thiago dos Santos Leite (colega do Vitor Junior), segue outra solução, que funcionou bem no Oracle 10. O exemplo do Thiago funciona no Oracle 11 em diante. select e.id, e.produto, e.situacao, wm_concat(s.descricao) lista from estoque e join situacao s on bitand(e.situacao, s.id) > 0 group by e.id, e.produto, e.situacao order by e.id; Abs
Re: [oracle_br] Re: Desafio SQL
O Thiago usou exatamente a função BITAND, que o André já tinha dado a dica em um e-mail anterior! Ótima solução, código limpo e bem curto! Em 28 de maio de 2014 14:02, Vitor Junior vitorj...@gmail.com [oracle_br] < oracle_br@yahoogrupos.com.br> escreveu: > > > Dica do colega Thiago dos Santos Leite, aqui da empresa. Segundo o Milton > funcionou e simplificou: > > 1 select distinct e.id, e.produto, e.situacao, LISTAGG(s.descricao, ' > | ') WITHIN GROUP (order by s.id) over (partition by e.id) lista > 2 from estoque e > 3 join situacao s on bitand(e.situacao, > s.id) > 0 > 4* order by e.id > 13:56:16 dsv11g>/ > > ID PRODUTO >SITUACAO > -- > > -- > LISTA > > > 1 Cerveja > 2 > Produto bloqueado manualmente > > 2 Picanha > 5 > Produto vencido | Produto bloqueado para inventário > > 3 Alcatra > 9 > Produto vencido | Produto bloqueado por avaria > > 4 Maminha > 7 > Produto vencido | Produto bloqueado manualmente | Produto bloqueado para > inventário > > > 4 linhas selecionadas. > > > > Att,/Regards, > > > Vitor Jr. > Infraestrutura / Infrastructure Team > Oracle 11g DBA Certified Professional - OCP > Oracle Certified Expert, Oracle Real Application Clusters 11g and Grid > Infrastructure Administrator - OCE > Oracle Database 11g Performance Tuning Certified Expert - OCE > Oracle Exadata 11g Certified Implementation Specialist > Oracle Certified Associate, MySQL 5 > mail, gtalk e msn: vitorj...@gmail.com > http://certificacaobd.com.br/ > skype: vjunior1981 > https://mybizcard.co/vitor.jr.385628 > > > Em 28 de maio de 2014 11:02, flavio_brune...@yahoo.com [oracle_br] < > oracle_br@yahoogrupos.com.br> escreveu: > > >> >> Legal, que bom que gostou. >> Particularmente eu utilizaria a solução com função por ser mais simples e >> de fácil manutenção. Mas, sempre é bom ter uma outra forma na manga. >> Abraços >> >> > >
Re: [oracle_br] Re: Desafio SQL
Dica do colega Thiago dos Santos Leite, aqui da empresa. Segundo o Milton funcionou e simplificou: 1 select distinct e.id, e.produto, e.situacao, LISTAGG(s.descricao, ' | ') WITHIN GROUP (order by s.id) over (partition by e.id) lista 2 from estoque e 3 join situacao s on bitand(e.situacao, s.id) > 0 4* order by e.id 13:56:16 dsv11g>/ ID PRODUTO SITUACAO -- -- LISTA 1 Cerveja 2 Produto bloqueado manualmente 2 Picanha 5 Produto vencido | Produto bloqueado para inventário 3 Alcatra 9 Produto vencido | Produto bloqueado por avaria 4 Maminha 7 Produto vencido | Produto bloqueado manualmente | Produto bloqueado para inventário 4 linhas selecionadas. Att,/Regards, Vitor Jr. Infraestrutura / Infrastructure Team Oracle 11g DBA Certified Professional - OCP Oracle Certified Expert, Oracle Real Application Clusters 11g and Grid Infrastructure Administrator - OCE Oracle Database 11g Performance Tuning Certified Expert - OCE Oracle Exadata 11g Certified Implementation Specialist Oracle Certified Associate, MySQL 5 mail, gtalk e msn: vitorj...@gmail.com http://certificacaobd.com.br/ skype: vjunior1981 https://mybizcard.co/vitor.jr.385628 Em 28 de maio de 2014 11:02, flavio_brune...@yahoo.com [oracle_br] < oracle_br@yahoogrupos.com.br> escreveu: > > > Legal, que bom que gostou. > Particularmente eu utilizaria a solução com função por ser mais simples e > de fácil manutenção. Mas, sempre é bom ter uma outra forma na manga. > Abraços > > >
Re: [oracle_br] Re: Exportar dados de um banco com o datafile sysaux01.dbf corrompido
Olha, eu confesso que peguei o bonde andando e não lí o primeiro e-mail da thread.. mas pelo que pude entender, seu banco está com a sysaux zuada e, aparentemente o banco não está em modo archive. Minha pergunta é. Datapump está funcionando? Eu tive um problema parecido, mas a sysaux não estava "corrompida". Apenas não era possível modificar a tablespace que era pre-requisito para upgrade de 10g para 11g. O banco era muito grande (cerca de 10Tera) então, a solução que usei nessa ocasião foi: Criar um banco 11g "From scratch" (com uma sysaux integra). Exportar apenas os objetos PL/SQL do banco de origem, 10g. "Instalar" todos os recursos que seu banco 10g utilizava, como por exemplo, Java ou XML. Criar todos os usuários no banco 11g e importar os objetos PL/SQL (mesmo que todos fiquem inválidos neste momento) Em seguida, coloquei todas as outras tablespaces do banco 10g, excluindo a sysaux, system, temp e undo, em read-only e as exportei como Transportable Tablespace. Baixei o banco 10g e importei essas transportable tablespace no novo banco 11g. Tanto o export como o import foram bem rápidos pois o datapump vai, simplesmente, "Plugar" meus datafiles do banco 10g no meu novo banco 11g. Não vai exportar dados. Em seguida, no banco 11g, vc muda as tablespaces para read-write e roda o utlrp para recompilar seus objetos inválidos. Obviamente, falei bem por cima os passos que segui naquela ocasião. Vale uma leitura pelo google afora para maiores detalhes sobre este processo. Se não for possível rodar o datapump por causa de sua sysaux, me perdoe, mas o que escreví alí acima pode ser útil para mais alguém. Forte abraço Evandro Giachetto Oracle DBA evandrogiache...@gmail.com Em 28 de maio de 2014 13:26, jlchia...@yahoo.com.br [oracle_br] < oracle_br@yahoogrupos.com.br> escreveu: > > > Sim, veja lá na minha resposta que eu cito : existem N maneiras de se > recuperar uma tablespace corrupta/incompleta/não-atualizada (entre elas, > FLASHBACK DATABASE, Block recover do RMAN, o RECOVER da tablespace (ie, > aplicação dos logs de alteração em cima de último backup reconhecidamente > íntegro, entre outras) , mas TODAS exigem que ou o banco esteja em modo de > archive e vc tenha os archived redo logs todos e/ou que existam backups > próprios e/ou que vc tenha flashback logs/FRA ativos... Pelo que vc > descreve , se nem dump de dados neguim tinha aí nesse coiso, quanto mais > esperar por coisas como essas que cito... Dá uma pesquisada aí pra ver se > causalmente vc tem algo assim mas eu sinceramente duvido... > > []s > >Chiappa > >
Re: [oracle_br] Re: Exportar dados de um banco com o datafile sysaux01.dbf corrompido
Sim, veja lá na minha resposta que eu cito : existem N maneiras de se recuperar uma tablespace corrupta/incompleta/não-atualizada (entre elas, FLASHBACK DATABASE, Block recover do RMAN, o RECOVER da tablespace (ie, aplicação dos logs de alteração em cima de último backup reconhecidamente íntegro, entre outras) , mas TODAS exigem que ou o banco esteja em modo de archive e vc tenha os archived redo logs todos e/ou que existam backups próprios e/ou que vc tenha flashback logs/FRA ativos... Pelo que vc descreve , se nem dump de dados neguim tinha aí nesse coiso, quanto mais esperar por coisas como essas que cito... Dá uma pesquisada aí pra ver se causalmente vc tem algo assim mas eu sinceramente duvido... []s Chiappa
Re: [oracle_br] Re: Exportar dados de um banco com o datafile sysaux01.dbf corrompido
Bem, ** sempre ** que se fala em Automatizar uma tarefa de DBA longa e complexa, aonde Não Há a menor possibilidade de fazer click-click numa GUI devido ao tamanho da coisa, a primeira coisa em que se deve pensar é a técnica que é a sua/minha/nossa melhor amiga, basicamente é o cachorro do DBA - o SQL gerando SQL No caso, vc tanto poderia gerar os n exports necessários (um para cada tabela) quanto poderia gerar uma LISTA das tabelas a exportar : testa aí se a opção de gerar uma lista (o chamado PARFILE do exp, veja a sintaxe dele na documentação Oracle) é aceito aí nesse seu ambiente baleado... No meu exemplo abaixo, vou gerar um shell script que já terá os n comandos de export, um pra cada tabela... Seria criar num editor de texto o script sqlplus tipo o abaixo (** ALTERANDO ** os detalhes de spool e caracteres de fim de linha se for o caso) : set term off feedback off verify off pages 0 lines 500 trimspool on head off spool roda_exports.sh select 'exp system/oracle file=exp_' || owner || '_' || table_name || '.dmp indexes=n direct=y log=' || owner || '_' || table_name || '.exp' ||'recordlength=65535 record=n triggers=n statistics=none constraints=n' 3from dba_tables where owner in ('SCOTT', 'DMCOMUM') order by owner, table_name; spool off exit e aí executá-lo com : sqlplus system/oracle @nomedoscript.sql e kaput, magicamente vai ser gerado o shell script roda_exports.sh que faz o que vc precisa, yes ?? Executa no prompt do SO o roda_exports.sh... para importar a mesma coisa, gera um shell script que faça o import... []s Chiappa OBS : óbvio#1, para vc poder importar os dados lá no servidor destino o database-destino TEM que já existir e estar ativo, as tablespaces/usuários/privilégios já devem estar ok... Vc pode gerar os DDLs necessários pra isso com um scriptzinho tipo o acima que execute DBMS_METADATA para cada obj necessário... óbvio#2, o export acima está exportando DADOS apenas : após o import dos dados, vc Terá que criar os índices e constraints... testa aí no seu ambiente se com a sysaux baleada vc consegue fazer um export com rows=n indexes=y constraints=n e um outro com constraints=y indexes=n ignore=y , se conseguir blz usa isso num import, se não conseguir é gerar o DDL dos índices e conestraints, via DBMS_METADATA ou similares óbvio#3, se vc não quiser gerar arquivos vc sempre tem a opção de SQL dinâmico dentro do script sqlplus : eu não gosto muito dessa derivação, acho melhor ter mesmo um log do que faço, mas fyi é possível
Re: [oracle_br] Re: Exportar dados de um banco com o datafile sysaux01.dbf corrompido
Chiappa, existe uma maneira de corregir esse tablespace sysaux? Em Quarta-feira, 28 de Maio de 2014 12:01, "Amilcar de Jesus Moreti ajmor...@yahoo.com.br [oracle_br]" escreveu: entendi a solução seria entao, levar somente os dados para o outro servidor, o unico problema que vejo agora,vou ter que pensar numa solução seria como fazer isso de uma maneira mais pratica, pois o banco tem 22 mil tabelas, é grande. obrigado pela dica. Em Terça-feira, 27 de Maio de 2014 23:07, "jlchia...@yahoo.com.br [oracle_br]" escreveu: Tudo jóia, colega ? Então, a primeira coisa que pega aí é que a sua versão é 11g, e a nota metalink 'SYSAUX New Mandatory Tablespace in Oracle 10g and higher' (Doc ID 243246.1) demanda CLARAMENTE que no 10g e posteriores a tablespace SYSAUX não é mais * Opcional, ela é uma extensão da tablespace SYSTEM, então um banco com SYSAUX corrompida/offline em tese deveria ser considerado tão inapropriado, baleado e corrompido quase tanto quanto se fosse a tablespace SYSTEM O ** CORRETO ** seria vc recuperar a tablespace, seja com BLOCK RECOVER do RMAN, seja voltando backup, mas pelo que vc diz o tal banco estava ao deus-dará, sem backup de nenhum tipo, sem archives (provavelmente rodando em modo noarchive), então estamos numa situação anômala e não recomendada... Neste cenário : a) com ABSOLUTA certeza datapump/expdp vc não deve conseguir mesmo, pois afaik o expdp tenta gravar/ler objetos na SYSAUX seja qual for o modo de export usado b) na SYSAUX residem complementos aos metadados de tablespaces e de usuários, então mesmo que não grave nada lá o exp (a ferramenta de exportação tradicional) precisaria ler dados na SYSAUX se o exp se refere à esse nível de objetos ==> Um work-around possível seria executar o exp em modo de tabelas - essa informação está na SYSTEM (mais exatamente na OBJ$ e quetais) , então em tese deve funcionar , mas vai ser sacal pra automatizar Um exemplo demonstrando a possibilidade : => vou por a tablespace SYSAUX offline, como vc está : [oracle@localhost ~]$ sqlplus / as sysdba SQL*Plus: Release 11.2.0.2.0 Production on Tue May 27 22:45:32 2014 Copyright (c) 1982, 2010, Oracle. All rights reserved. Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - Production With the Partitioning, OLAP, Data Mining and Real Application Testing options SYS:AS SYSDBA@orcl:SQL>alter tablespace sysaux offline; Tablespace altered. SYS:AS SYSDBA@orcl:SQL>exit Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - Production With the Partitioning, OLAP, Data Mining and Real Application Testing options => faço o export tradicional, a nível de TABELAs e ** NECESSARIAMENTE ** não pedindo para compactar extents, não registrar nada, só exp dos dados mesmo : [oracle@localhost ~]$ exp system/oracle buffer=10485760 file=exp_hr.dmp compress=n indexes=n direct=y log=exp_hr.exp tables=HR.REGIONS,HR.LOCATIONS recordlength=65535 record=n triggers=n statistics=none constraints=n Export: Release 11.2.0.2.0 - Production on Tue May 27 22:45:51 2014 Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved. Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - Production With the Partitioning, OLAP, Data Mining and Real Application Testing options Export done in US7ASCII character set and AL16UTF16 NCHAR character set server uses AL32UTF8 character set (possible charset conversion) Note: indexes on tables will not be exported Note: constraints on tables will not be exported About to export specified tables via Direct Path ... Current user changed to HR . . exporting table REGIONS 4 rows exported . . exporting table LOCATIONS 23 rows exported Export terminated successfully without warnings. [oracle@localhost ~]$ c.q.d. []s Chiappa OBS : torno a insistir que isso é um WORk-AROUND, um QUEBRA-GALHO, TOTALMENTE NÃO SUPORTADO e NÃO RECOMENDADO, e que PODE ou NÃO funcionar no seu ambiente, okdoc ? O certo, correto e que funciona SEMPRE seria corrigir a corrupção...
Re: [oracle_br] Re: Exportar dados de um banco com o datafile sysaux01.dbf corrompido
entendi a solução seria entao, levar somente os dados para o outro servidor, o unico problema que vejo agora,vou ter que pensar numa solução seria como fazer isso de uma maneira mais pratica, pois o banco tem 22 mil tabelas, é grande. obrigado pela dica. Em Terça-feira, 27 de Maio de 2014 23:07, "jlchia...@yahoo.com.br [oracle_br]" escreveu: Tudo jóia, colega ? Então, a primeira coisa que pega aí é que a sua versão é 11g, e a nota metalink 'SYSAUX New Mandatory Tablespace in Oracle 10g and higher' (Doc ID 243246.1) demanda CLARAMENTE que no 10g e posteriores a tablespace SYSAUX não é mais * Opcional, ela é uma extensão da tablespace SYSTEM, então um banco com SYSAUX corrompida/offline em tese deveria ser considerado tão inapropriado, baleado e corrompido quase tanto quanto se fosse a tablespace SYSTEM O ** CORRETO ** seria vc recuperar a tablespace, seja com BLOCK RECOVER do RMAN, seja voltando backup, mas pelo que vc diz o tal banco estava ao deus-dará, sem backup de nenhum tipo, sem archives (provavelmente rodando em modo noarchive), então estamos numa situação anômala e não recomendada... Neste cenário : a) com ABSOLUTA certeza datapump/expdp vc não deve conseguir mesmo, pois afaik o expdp tenta gravar/ler objetos na SYSAUX seja qual for o modo de export usado b) na SYSAUX residem complementos aos metadados de tablespaces e de usuários, então mesmo que não grave nada lá o exp (a ferramenta de exportação tradicional) precisaria ler dados na SYSAUX se o exp se refere à esse nível de objetos ==> Um work-around possível seria executar o exp em modo de tabelas - essa informação está na SYSTEM (mais exatamente na OBJ$ e quetais) , então em tese deve funcionar , mas vai ser sacal pra automatizar Um exemplo demonstrando a possibilidade : => vou por a tablespace SYSAUX offline, como vc está : [oracle@localhost ~]$ sqlplus / as sysdba SQL*Plus: Release 11.2.0.2.0 Production on Tue May 27 22:45:32 2014 Copyright (c) 1982, 2010, Oracle. All rights reserved. Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - Production With the Partitioning, OLAP, Data Mining and Real Application Testing options SYS:AS SYSDBA@orcl:SQL>alter tablespace sysaux offline; Tablespace altered. SYS:AS SYSDBA@orcl:SQL>exit Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - Production With the Partitioning, OLAP, Data Mining and Real Application Testing options => faço o export tradicional, a nível de TABELAs e ** NECESSARIAMENTE ** não pedindo para compactar extents, não registrar nada, só exp dos dados mesmo : [oracle@localhost ~]$ exp system/oracle buffer=10485760 file=exp_hr.dmp compress=n indexes=n direct=y log=exp_hr.exp tables=HR.REGIONS,HR.LOCATIONS recordlength=65535 record=n triggers=n statistics=none constraints=n Export: Release 11.2.0.2.0 - Production on Tue May 27 22:45:51 2014 Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved. Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - Production With the Partitioning, OLAP, Data Mining and Real Application Testing options Export done in US7ASCII character set and AL16UTF16 NCHAR character set server uses AL32UTF8 character set (possible charset conversion) Note: indexes on tables will not be exported Note: constraints on tables will not be exported About to export specified tables via Direct Path ... Current user changed to HR . . exporting table REGIONS 4 rows exported . . exporting table LOCATIONS 23 rows exported Export terminated successfully without warnings. [oracle@localhost ~]$ c.q.d. []s Chiappa OBS : torno a insistir que isso é um WORk-AROUND, um QUEBRA-GALHO, TOTALMENTE NÃO SUPORTADO e NÃO RECOMENDADO, e que PODE ou NÃO funcionar no seu ambiente, okdoc ? O certo, correto e que funciona SEMPRE seria corrigir a corrupção...
Re: [oracle_br] Re: Desafio SQL
Legal, que bom que gostou. Particularmente eu utilizaria a solução com função por ser mais simples e de fácil manutenção. Mas, sempre é bom ter uma outra forma na manga. Abraços
Re: [oracle_br] Re: Desafio SQL
Flavio, SENSACIONAL cara! Eu imaginava que nem fosse possível fazer isso apenas com SELECT, mas você arrebentou na função analítica, parabéns! Mandou bem demais! Vou levar um bom tempo pra conseguir entender teu código, mas o fato é que realmente funcionou. Obrigado! 2014-05-27 19:15 GMT-03:00 flavio_brune...@yahoo.com [oracle_br] < oracle_br@yahoogrupos.com.br>: > > > Pessoal > > De qualquer forma, segue duas soluçõezinhas que poderiam ser utilizadas > para resolver o problema, uma utilizando função e outra somente com SELECT. > A segunda é mais complexa porém resolve caso não seja possível criar uma > function (por motivos de grant mesmo). > > Criação das tabelas: > drop table situacao; > create table situacao > ( >idnumber(10) constraint pk_situacao primary key, >descricao varchar2(50) not null > ); > > drop table estoque; > create table estoque > ( >id number(10)constraint pk_estoque primary key, >produto varchar2(100) not null, >situacao number(10)not null > ); > > insert into situacao (id,descricao) values (1,'Produto vencido'); > insert into situacao (id,descricao) values (2,'Produto bloqueado > manualmente'); > insert into situacao (id,descricao) values (4,'Produto bloqueado para > inventário'); > insert into situacao (id,descricao) values (8,'Produto bloqueado por > avaria'); > > insert into estoque (id,produto,situacao) values (1,'Cerveja',2); > insert into estoque (id,produto,situacao) values (2,'Picanha',5); > insert into estoque (id,produto,situacao) values (3,'Alcatra',9); > insert into estoque (id,produto,situacao) values (4,'Maminha',7); > > commit; > > Solução 1: Com Function > create or replace function traz_situacao (psituacao in number) return > varchar2 is >vret varchar2(2000); > begin >for r in (select s.descricao from situacao s where bitand(s.id,psituacao) > > 0 order by s.id) loop > vret := vret || r.descricao || '|'; >end loop; >if length(vret) > 1 then > vret := substr(vret,1,length(vret)-1); >end if; >return vret; > end; > / > > select e.id, e.produto, e.situacao, traz_situacao(e.situacao) > todas_situacoes > from estoque e; > > > Solução 2: Sem Function > select v3.id, v3.produto, v3.situacao, substr(v3.todas_situacoes,2) > todas_situacoes > from ( > select v2.id, v2.produto, v2.situacao, v2.todas_situacoes, v2.lv, > max(v2.lv) over (partition by v2.id) max_lv > from ( > select v1.id, v1.produto, v1.situacao, > sys_connect_by_path(v1.descricao, '|') > todas_situacoes, > level lv > from ( >select e.id, e.produto, e.situacao, > s.descricao, rownum rn, > lead(rownum) over (partition by e.idorder by > s.id) lead_rn >from estoque e >join situacao s on bitand(e.situacao, s.id) > > 0 > ) v1 > connect by prior v1.lead_rn = v1.rn > ) v2 >) v3 > where v3.lv = v3.max_lv; > > Abraços > > > > > >