RES: RES: [oracle_br] UPDATE COM JOIN. EXISTE?
De: oracle_br@yahoogrupos.com.br em nome de Ricardo Tajiri Enviada: ter 17/1/2012 14:06 Para: oracle_br@yahoogrupos.com.br Assunto: Re: RES: [oracle_br] UPDATE COM JOIN. EXISTE? E aí Giovanni, Acredito que seja possível fazer usando o comando MERGE. Sei que você já conhece o comando pelo seu outro e-mail, então deve montar a solução sem muito problema... Ricardo Hideyuki Tajiri LaRCom - FEEC - UNICAMP Em 17 de janeiro de 2012 10:33, Paulo Petruzalek escreveu: > ** > > > O problema com a sua abordagem é que você está tentando dar um alias a uma > subquery na clausula where e usar isso como referencia para o seu update na > clausula SET, o que não vai funcionar. > > Neste caso você tem 3 opções: 1) reescrever esta query em uma view > inline que possa ser atualizada; 2) usar um bloco pl/sql para fazer o > update ou 3) criar uma tabela temporária com os valores novos na qual você > consiga estabelecer um relacionamento 1:1 na tabela que você quer > atualizar e então usar a estratégia de update da view inline (o que não > deixa de ser uma variação da opção 1). > > --- Em ter, 17/1/12, Giovanni Ferreira de Sousa < > giovanni.so...@funasa.gov.br> escreveu: > > > De: Giovanni Ferreira de Sousa > Assunto: RES: [oracle_br] UPDATE COM JOIN. EXISTE? > Para: oracle_br@yahoogrupos.com.br > Data: Terça-feira, 17 de Janeiro de 2012, 10:27 > > > Então Paulo, > > As tabelas não têm nenhuma relação, na verdade o update é numa tabela > temporária que servirá pra aplicação gerar relatórios. tente fazer o > seguinte > > UPDATE DBSISMAC.tm_quadro_01 > SET tm_quadro_01.VL_AJUSTE=novos_valores.NOVO_AJUSTE, > tm_quadro_01.VL_TOTAL_PPI_ASSISTENCIAL=novos_valores.NOVO_TOTAL, > tm_quadro_01.CO_USUARIO=co_usuario, >tm_quadro_01.DT_ALTERACAO=SYSDATE > where > (SELECT > tm_quadro_01.CO_MUNICIPIO_IBGE, > (tm_quadro_01.VL_AJUSTE+somar_portaria.VL_ALTERADO) AS NOVO_AJUSTE, > (tm_quadro_01.VL_TOTAL_PPI_ASSISTENCIAL+somar_portaria.VL_ALTERADO) AS > NOVO_TOTAL > FROM DBSISMAC.tm_quadro_01 > INNER JOIN > ( > SELECT > PL.CO_MUNICIPIO_IBGE, > SUM(PL.VL_ALTERADO) AS VL_ALTERADO, > PL.NU_COMPETENCIA_INICIAL, > PL.CO_ASSUNTO > FROM DBSISMAC.tb_portaria_limite PL > WHERE PL.CO_PORTARIA=1030100654 > AND substr(PL.CO_MUNICIPIO_IBGE,4)<> > GROUP BY > PL.CO_MUNICIPIO_IBGE,NU_COMPETENCIA_INICIAL,PL.CO_ASSUNTO > )somar_portaria > ON tm_quadro_01.CO_MUNICIPIO_IBGE=somar_portaria.CO_MUNICIPIO_IBGE > WHERE substr(tm_quadro_01.CO_MUNICIPIO_IBGE,2)=12)novos_valores -> > Aqui acontece o o ERRO - ORA-00936: missing expression > and novos_valores.CO_MUNICIPIO_IBGE=tm_quadro_01.CO_MUNICIPIO_IBGE > > Não estou conseguindo identificar onde está o problema > > Giovanni. > > > > De: oracle_br@yahoogrupos.com.br em nome de Paulo Petruzalek > Enviada: ter 17/1/2012 09:00 > Para: oracle_br@yahoogrupos.com.br > Assunto: Re: [oracle_br] UPDATE COM JOIN. EXISTE? > > > > Existe, mas não é bem assim que funciona com Oracle. No Oracle você só > pode fazer update com join se as n tabelas envolvidas forem ligadas por > chaves únicas. A sintaxe é assim: > > update (select a.x, b.y from x, y where a.z = b.z) set x = y; > > Note que na verdade o que foi feito é um update de uma view inline, logo > todas as restrições sobre updates em views valem aqui. Você também vai > precisar trazer na query tanto o campo "novo" como o campo "antigo" e fazer > a atribuição de um no outro na clausula SET. > > Paulo > > --- Em ter, 17/1/12, Giovanni Ferreira de Sousa < > giovanni.so...@funasa.gov.br <mailto:giovanni.sousa%40funasa.gov.br> > > escreveu: > > De: Giovanni Ferreira de Sousa giovanni.sousa%40funasa.gov.br> > > Assunto: [oracle_br] UPDATE COM JOIN. EXISTE? > Para: oracle_br@yahoogrupos.com.br <mailto:oracle_br%40yahoogrupos.com.br> > > Data: Terça-feira, 17 de Janeiro de 2012, 9:51 > > Prezados, > > Um cliente está migrando uma aplicação do MYSQL para o ORACLE 11.2. Essa > aplicação possui uma procedure com inserts e updates. Dessa forma me > deparei com a instrução abaixo e não estou conseguindo executá-la. Alguem > pode me ajudar? > > UPDATE DBSISMAC.tm_quadro_01 > inner join > (SELECT > tm_quadro_01.CO_MUNICIPIO_IBGE, > (tm_quadro_01.VL_AJUSTE+somar_portaria.VL_ALTERADO) AS NOVO_AJUSTE, > (tm_quadro_01.VL_TOTAL_PPI_ASSISTENCIAL+somar_portaria.VL_ALTERADO) AS > NOVO_TOTAL > FROM DBSISMAC.tm_quadro_01 > INNER JOIN > ( >
RES: [oracle_br] UPDATE COM JOIN. EXISTE?
Então Paulo, As tabelas não têm nenhuma relação, na verdade o update é numa tabela temporária que servirá pra aplicação gerar relatórios. tente fazer o seguinte UPDATE DBSISMAC.tm_quadro_01 SET tm_quadro_01.VL_AJUSTE=novos_valores.NOVO_AJUSTE, tm_quadro_01.VL_TOTAL_PPI_ASSISTENCIAL=novos_valores.NOVO_TOTAL, tm_quadro_01.CO_USUARIO=co_usuario, tm_quadro_01.DT_ALTERACAO=SYSDATE where (SELECT tm_quadro_01.CO_MUNICIPIO_IBGE, (tm_quadro_01.VL_AJUSTE+somar_portaria.VL_ALTERADO) AS NOVO_AJUSTE, (tm_quadro_01.VL_TOTAL_PPI_ASSISTENCIAL+somar_portaria.VL_ALTERADO) AS NOVO_TOTAL FROM DBSISMAC.tm_quadro_01 INNER JOIN ( SELECT PL.CO_MUNICIPIO_IBGE, SUM(PL.VL_ALTERADO) AS VL_ALTERADO, PL.NU_COMPETENCIA_INICIAL, PL.CO_ASSUNTO FROM DBSISMAC.tb_portaria_limite PL WHERE PL.CO_PORTARIA=1030100654 AND substr(PL.CO_MUNICIPIO_IBGE,4)<> GROUP BY PL.CO_MUNICIPIO_IBGE,NU_COMPETENCIA_INICIAL,PL.CO_ASSUNTO )somar_portaria ON tm_quadro_01.CO_MUNICIPIO_IBGE=somar_portaria.CO_MUNICIPIO_IBGE WHERE substr(tm_quadro_01.CO_MUNICIPIO_IBGE,2)=12)novos_valores -> Aqui acontece o o ERRO - ORA-00936: missing expression and novos_valores.CO_MUNICIPIO_IBGE=tm_quadro_01.CO_MUNICIPIO_IBGE Não estou conseguindo identificar onde está o problema Giovanni. De: oracle_br@yahoogrupos.com.br em nome de Paulo Petruzalek Enviada: ter 17/1/2012 09:00 Para: oracle_br@yahoogrupos.com.br Assunto: Re: [oracle_br] UPDATE COM JOIN. EXISTE? Existe, mas não é bem assim que funciona com Oracle. No Oracle você só pode fazer update com join se as n tabelas envolvidas forem ligadas por chaves únicas. A sintaxe é assim: update (select a.x, b.y from x, y where a.z = b.z) set x = y; Note que na verdade o que foi feito é um update de uma view inline, logo todas as restrições sobre updates em views valem aqui. Você também vai precisar trazer na query tanto o campo "novo" como o campo "antigo" e fazer a atribuição de um no outro na clausula SET. Paulo --- Em ter, 17/1/12, Giovanni Ferreira de Sousa mailto:giovanni.sousa%40funasa.gov.br> > escreveu: De: Giovanni Ferreira de Sousa mailto:giovanni.sousa%40funasa.gov.br> > Assunto: [oracle_br] UPDATE COM JOIN. EXISTE? Para: oracle_br@yahoogrupos.com.br <mailto:oracle_br%40yahoogrupos.com.br> Data: Terça-feira, 17 de Janeiro de 2012, 9:51 Prezados, Um cliente está migrando uma aplicação do MYSQL para o ORACLE 11.2. Essa aplicação possui uma procedure com inserts e updates. Dessa forma me deparei com a instrução abaixo e não estou conseguindo executá-la. Alguem pode me ajudar? UPDATE DBSISMAC.tm_quadro_01 inner join (SELECT tm_quadro_01.CO_MUNICIPIO_IBGE, (tm_quadro_01.VL_AJUSTE+somar_portaria.VL_ALTERADO) AS NOVO_AJUSTE, (tm_quadro_01.VL_TOTAL_PPI_ASSISTENCIAL+somar_portaria.VL_ALTERADO) AS NOVO_TOTAL FROM DBSISMAC.tm_quadro_01 INNER JOIN ( SELECT PL.CO_MUNICIPIO_IBGE, SUM(PL.VL_ALTERADO) AS VL_ALTERADO, PL.NU_COMPETENCIA_INICIAL, PL.CO_ASSUNTO FROM DBSISMAC.tb_portaria_limite PL WHERE PL.CO_PORTARIA=co_portaria AND substr(PL.CO_MUNICIPIO_IBGE,4)<> GROUP BY PL.CO_MUNICIPIO_IBGE,NU_COMPETENCIA_INICIAL,PL.CO_ASSUNTO )somar_portaria ON tm_quadro_01.CO_MUNICIPIO_IBGE=somar_portaria.CO_MUNICIPIO_IBGE WHERE substr(tm_quadro_01.CO_MUNICIPIO_IBGE,2)=12) novos_valores on novos_valores.CO_MUNICIPIO_IBGE=tm_quadro_01.CO_MUNICIPIO_IBGE SET tm_quadro_01.VL_AJUSTE=novos_valores.NOVO_AJUSTE, tm_quadro_01.VL_TOTAL_PPI_ASSISTENCIAL=novos_valores.NOVO_TOTAL, tm_quadro_01.CO_USUARIO=co_usuario, tm_quadro_01.DT_ALTERACAO=SYSDATE Atenciosamente, Giovanni [As partes desta mensagem que não continham texto foram removidas] -- >Atenção! As mensagens do grupo ORACLE_BR são de acesso público e de inteira >responsabilidade de seus remetentes. Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/ -- >Apostilas » Dicas e Exemplos » Função » Mundo Oracle » Package » Procedure » >Scripts » Tutoriais - O GRUPO ORACLE_BR TEM SEU PROPRIO ESPAÇO! VISITE: >http://www.oraclebr.com.br/ -- Links do Yahoo! Grupos [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: AJUDA COM MERGE
Bom dia, Chiappa e Ricardo, É o seguinte, os dados de origem estão em um arquivo XML, e o programador não tem privilégios para criar as tabelas, inserir os dados nessas tabelas, para depois executar o MERGE. Sendo assim, gostaria de saber qual a melhor forma carregar os dados do XML para a tabela de destino, tendo em vista que essa tabela já possui dados. Atenciosamente, Giovanni. De: oracle_br@yahoogrupos.com.br em nome de José Laurindo Enviada: qui 12/1/2012 15:43 Para: oracle_br@yahoogrupos.com.br Assunto: [oracle_br] Re: AJUDA COM MERGE É isso mesmo... O Colega vai explicar melhor, mas pelo jeito ele quer fazer um UPSERT (UPdate se o dado existe, inSERT se o dado não existe), e realmente pra se fazer isso via MERGE a origem e o destino tem que ser diferentes O que ele poderia fazer talvez é ** copiar ** os dados que servirão de origem (até pra uma GTT, talvez) e aí sim fazer o MERGE, aí especificando a GTT como fonte de dados para o MERGE e a tabela real tanto pra MATCH quanto pra NON-MATCH ... []s Chiappa --- Em oracle_br@yahoogrupos.com.br <mailto:oracle_br%40yahoogrupos.com.br> , Ricardo Tajiri escreveu > > Oi Giovanni, > > A idéia do MERGE é que você tem dados que estão em uma origem e quer > modificar um destino de acordo com estes dados. > > Se o dado não existe na origem então você não vai conseguir inserir na mão > usando o MERGE... Agora, pra poder opinar melhor > em alguma outra solução é necessário que você nos dê mais informações sobre > o seu problema de verdade... > > > Ricardo Hideyuki Tajiri > LaRCom - FEEC - UNICAMP > > > Em 11 de janeiro de 2012 16:44, Giovanni Ferreira de Sousa < > giovanni.sousa@...> escreveu: > > > ** > > > > > > Ricardo, > > > > É verdade, não estava atento a isso...vacilei ... > > > > > > Para este caso, se não existir, quero especificar (inserir) o dado na mão > > mesmo. > > Tem como fazer isso, utilizando o merge. O que você sugere? > > > > Desde já agradeço a sua colaboração... > > > > Atenciosamente > > > > Giovanni. > > > > > > > > > > De: oracle_br@yahoogrupos.com.br <mailto:oracle_br%40yahoogrupos.com.br> > > em nome de Ricardo Tajiri > > Enviada: qua 11/1/2012 15:28 > > Para: oracle_br@yahoogrupos.com.br <mailto:oracle_br%40yahoogrupos.com.br> > > Assunto: Re: [oracle_br] AJUDA COM MERGE > > > > > > Oi Giovanni, > > > > A sua compreensão do comando MERGE que está incompleta... > > > > Como você mesmo disse, ele não existe na tabela > > dbfunasasiasiprod.tb_carga_siasi_new. > > > > O MERGE executa as modificações na tabela em que está sendo feito o MERGE > > de acordo com > > dados provenientes de outro local. A idéia do WHEN NOT MATCHED seria a > > seguinte: > > > > Se não existe na tabela com o álias "carga" do seu comando e *EXISTE* na > > > > tabela (subconsulta) com álias "x" > > ele executa o INSERT. Porém, como você está usando a mesma tabela, tanto > > para "carga" quanto para "x" > > o dado não vai retornar em "x" e tb não executar o insert. > > > > Ricardo Hideyuki Tajiri > > LaRCom - FEEC - UNICAMP > > > > Em 11 de janeiro de 2012 16:04, Giovanni Ferreira de Sousa < > > giovanni.sousa@...> escreveu: > > > > > ** > > > > > > > > > > > Prezados, > > > > > > Boa Tarde, > > > > > > Estou preparando o seguinte comando: > > > > > > merge into dbfunasasiasiprod.tb_carga_siasi_new carga > > > using > > > ( > > > select * from dbfunasasiasiprod.tb_carga_siasi_new > > > where dbfunasasiasiprod.tb_carga_siasi_new.comando = 'teste7' > > > )x > > > on(carga.comando = x.comando) > > > WHEN MATCHED THEN > > > UPDATE SET > > > carga.lote = 'atualizou' > > > WHEN NOT MATCHED THEN > > > INSERT (carga.comando,carga.lote,carga.dt_atualizacao) > > > values(x.COMANDO,'inseriu',sysdate). > > > > > > Quando o dado existe o update é feito corretamente. > > > > > > Neste caso, o registro 'teste7' não existe na tabela, então, deveria ser > > > feito o insert. O que há de errado? Gostaria que me ajudassem. > > > > > > Atenciosamente > > > > > > Giovanni > > > > > > [As partes desta mensagem que não continham texto foram removidas] > > > > >
RES: [oracle_br] AJUDA COM MERGE
Ricardo, É verdade, não estava atento a isso...vacilei ... Para este caso, se não existir, quero especificar (inserir) o dado na mão mesmo. Tem como fazer isso, utilizando o merge. O que você sugere? Desde já agradeço a sua colaboração... Atenciosamente Giovanni. De: oracle_br@yahoogrupos.com.br em nome de Ricardo Tajiri Enviada: qua 11/1/2012 15:28 Para: oracle_br@yahoogrupos.com.br Assunto: Re: [oracle_br] AJUDA COM MERGE Oi Giovanni, A sua compreensão do comando MERGE que está incompleta... Como você mesmo disse, ele não existe na tabela dbfunasasiasiprod.tb_carga_siasi_new. O MERGE executa as modificações na tabela em que está sendo feito o MERGE de acordo com dados provenientes de outro local. A idéia do WHEN NOT MATCHED seria a seguinte: Se não existe na tabela com o álias "carga" do seu comando e *EXISTE* na tabela (subconsulta) com álias "x" ele executa o INSERT. Porém, como você está usando a mesma tabela, tanto para "carga" quanto para "x" o dado não vai retornar em "x" e tb não executar o insert. Ricardo Hideyuki Tajiri LaRCom - FEEC - UNICAMP Em 11 de janeiro de 2012 16:04, Giovanni Ferreira de Sousa < giovanni.so...@funasa.gov.br> escreveu: > ** > > > Prezados, > > Boa Tarde, > > Estou preparando o seguinte comando: > > merge into dbfunasasiasiprod.tb_carga_siasi_new carga > using > ( > select * from dbfunasasiasiprod.tb_carga_siasi_new > where dbfunasasiasiprod.tb_carga_siasi_new.comando = 'teste7' > )x > on(carga.comando = x.comando) > WHEN MATCHED THEN > UPDATE SET > carga.lote = 'atualizou' > WHEN NOT MATCHED THEN > INSERT (carga.comando,carga.lote,carga.dt_atualizacao) > values(x.COMANDO,'inseriu',sysdate). > > Quando o dado existe o update é feito corretamente. > > Neste caso, o registro 'teste7' não existe na tabela, então, deveria ser > feito o insert. O que há de errado? Gostaria que me ajudassem. > > Atenciosamente > > Giovanni > > [As partes desta mensagem que não continham texto foram removidas] > > > [As partes desta mensagem que não continham texto foram removidas] -- >Atenção! As mensagens do grupo ORACLE_BR são de acesso público e de inteira >responsabilidade de seus remetentes. Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/ -- >Apostilas » Dicas e Exemplos » Função » Mundo Oracle » Package » Procedure » >Scripts » Tutoriais - O GRUPO ORACLE_BR TEM SEU PROPRIO ESPAÇO! VISITE: >http://www.oraclebr.com.br/ Links do Yahoo! Grupos [As partes desta mensagem que não continham texto foram removidas]
RES: [oracle_br] Re: Tratamento de logs
ntro da sp) pode ser obtida com savepoints: > > > > begin > > savepoint A; > > insert into ... > > delete from ... > > if sql%rowcount = 0 then > > rollback to A; > > end if; > > end; > > / > > > > Neste caso o controle da transação ficará por conta do código chamador, sem > > o risco de commitar algo que não devia. > > > > Paulo > > > > --- Em qua, 28/12/11, Paulo Petruzalek escreveu: > > > > De: Paulo Petruzalek > > Assunto: Re: [oracle_br] Tratamento de logs > > Para: oracle_br@yahoogrupos.com.br <mailto:oracle_br%40yahoogrupos.com.br> > > Data: Quarta-feira, 28 de Dezembro de 2011, 22:27 > > > > Se for para tratar o caso de onde o delete não ocorre, basta fazer um: > > > > if sql%rowcount = 0 then > > rollback; > > end if; > > > > Agora no caso de "dar pau", você vai ter que instrumentar o código com um > > bloco exception. Exemplo simplificado: > > > > begin > > insert into log values (...) ; > > delete from tabela where x = ...; > > if sql%rowcount = 0 then rollback; > > end if; > > commit; > > > > exeception > > when others then rollback; > > end; > > / > > > > Talvez seja mais elegante declarar uma exceção e lançar ela no caso do > > sql%rowcount ser igual a 0... mas enfim, o estilo de código fica por sua > > conta e/ou pelas regras do seu projeto. > > > > Também note que deixar controle de transações (commit / rollback) dentro de > > uma sp pode causar muitos problemas se esta for chamada por outras sps. Eu > > não necessariamente usaria esta abordagem, só fiz o exemplo assim para > > ficar compatível com o seu código. > > > > Paulo > > > > --- Em qua, 28/12/11, Giovanni Ferreira de Sousa escreveu: > > > > De: Giovanni Ferreira de Sousa > > Assunto: [oracle_br] Tratamento de logs > > Para: oracle_br@yahoogrupos.com.br <mailto:oracle_br%40yahoogrupos.com.br> > > Data: Quarta-feira, 28 de Dezembro de 2011, 10:56 > > > > Bom Dia galera, > > > > > > Estou com a seguinte situação aqui no trabalho: > > > > Um usuário solicitou que para as deleções físicas no banco, esses registros > > deletado deveriam ser armazendos em uma tabela de log. No schema da > > aplicação existe uma procedure que faz o delete nas tabelas. Para atender a > > demanda do usuário foi adicionado na procedure o insert na tabela de log, > > baseado no registro que será deletado, como segue no exemplo abaixo. Sendo > > assim gostaria da ajuda de vocês para o seguinte: > > > > Após o INSERT é feito o DELETE. > > > > SE o DELETE der PAU ou não for feito. Como faço pra dar ROLLBACK(no INSERT > > anterior)? > > > > > > > > CREATE OR REPLACE PROCEDURE DBSISMAC.sp_solicitacao_remanej_final ( > >estadoIN NUMBER, > >usuario IN NUMBER, > >competencia IN NUMBER, > >DS_USERNAME IN VARCHAR2) > > IS > > BEGIN > > INSERT INTO DBSISMAC.TL_TMQUADRO_06 > > SELECT competencia AS NU_COMPETENCIA_SOLICITACAO, > > CO_GESTAO, > > CO_MUNICIPIO_IBGE, > > CO_CNES, > > NO_UNIDADE, > > NU_CONTRATO, > > DT_PUBLIC_EXT_CONTRATO, > > VL_TOTAL_FNS, > > CO_PROTOCOLO, > > CO_USUARIO, > > DT_ALTERACAO, > > DS_USERNAME AS DS_USERNAME, > > 'EXCLUÍDO' AS DS_OPERACAO, > > SYSDATE AS DT_OPERACAO > > FROM DBSISMAC.TM_QUADRO_06 > >WHERE SUBSTR (CO_MUNICIPIO_IBGE, 0, 2) = estado; > > > >DELETE FROM DBSISMAC.TM_QUADRO_06 > > WHERE SUBSTR (CO_MUNICIPIO_IBGE, 0, 2) = estado; > >COMMIT; > > END; > > / > > > > Atenciosamente, > > > > Giovanni > > > > > > [As partes desta mensagem que não continham texto foram removidas] > > > > > > > > > > > > -- > > >Atenção! As mensagens do grupo ORACLE_BR são de acesso público e de > > >inteira responsabilidade de seus remetentes. > > Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/ > > -- > > &
RES: [oracle_br] Re: Tratamento de logs
acle_br] Re: Tratamento de logs Paulo, é absolutamente verdade que a maneira de desfazer apenas parte dos comandos da transação é o SAVEPOINT - no caso em questão, porém, uma solução procedural, além de ser mais longa, só vai ser disparada (óbvio) quando da execução do PL/SQL, se outras rotinas/programas fizerem DELETEs na tabela esses DELETEs passam SEM LOGS, e uma Auditoria em princípio deve pegar TODOS os DMLs, independente de onde venham... Outra coisa é que o %rowcount pega os casos de delete que não encontrou dados, MAS casos de erro efetivo no DELETE (por exemplo, tentativa de eliminar PK com filhos presentes) ele não pega, faltaria adicionar os EXCEPTIONS... Juntando isso com a necessidade (estranha, mas é um dado do problema) de só auditar DELETEs bem-sucedidos, eu optaria por um TRIGGER DE DML, assim : create or replace trigger TRG_AUD_DEL after DELETE on nomedatabela FOR EACH ROW BEGIN insert into tabeladelog(coluna1, coluna2, ... colunaN) values(:old.coluna1, :old.coluna2, ... :old.colunaN); END; ==> aí, além do código ser menor, a "auditoria" vai pegar QUALQUER DELETE na tabela, seja ou não vindo do PL/SQL, como a trigger é AFTER (depois, em inglês), ela automagicamente só dispara ** DEPOIS ** de um DELETE bem sucedido, aí vc não precisa se preocupar no seu código de auditoria com COMMITs/ROLLBACKs e ainda é transacional, ie, se depois do delete feito OK alguém pedir ROLLBACK do DELETE a inserção na tabela de log não é registrada - o colega não diz se isso é preciso mas pelo jeitão parece que sim ... Aliás, Giovani, coisas do tipo (ah, o que deve ser logado / o que deve ocorrer ocorre se neguinho pedir ROLLBACK de um DELETE bem-sucedido, o que deve ocorrer se alguém fazer DELETE fora do seu programa, o que deve ocorrer se duas sessões pedirem DELETE do mesmo registro , etc, etc) é nossa parte, enquanto técnicos especialistas em banco de dados, ter bem claro : o seu Cliente com quase 100% de certeza não faz a MENOR IDÉIA dessas coisas, nem imagina que o banco é MULTI-USUÁRIO, que podem haver erros de DELETE , etc, então quando ele te pede "ah, me faz um log", é um des-serviço vc não o avisar dessas coisas , não esclarecer bem a necessidade, o que ele quer que aconteça em cada caso ... []s Chiappa --- Em oracle_br@yahoogrupos.com.br <mailto:oracle_br%40yahoogrupos.com.br> , Paulo Petruzalek escreveu > > Complementando: acabei deixando na pressa o commit fora do if: > > If sql%rowcount = 0 then > rollback; > else > commit; > end if; > > Mas uma solução sem commits (dentro da sp) pode ser obtida com savepoints: > > begin > savepoint A; > insert into ... > delete from ... > if sql%rowcount = 0 then > rollback to A; > end if; > end; > / > > Neste caso o controle da transação ficará por conta do código chamador, sem o > risco de commitar algo que não devia. > > Paulo > > --- Em qua, 28/12/11, Paulo Petruzalek escreveu: > > De: Paulo Petruzalek > Assunto: Re: [oracle_br] Tratamento de logs > Para: oracle_br@yahoogrupos.com.br <mailto:oracle_br%40yahoogrupos.com.br> > Data: Quarta-feira, 28 de Dezembro de 2011, 22:27 > > Se for para tratar o caso de onde o delete não ocorre, basta fazer um: > > if sql%rowcount = 0 then > rollback; > end if; > > Agora no caso de "dar pau", você vai ter que instrumentar o código com um > bloco exception. Exemplo simplificado: > > begin > insert into log values (...) ; > delete from tabela where x = ...; > if sql%rowcount = 0 then rollback; > end if; > commit; > > exeception > when others then rollback; > end; > / > > Talvez seja mais elegante declarar uma exceção e lançar ela no caso do > sql%rowcount ser igual a 0... mas enfim, o estilo de código fica por sua > conta e/ou pelas regras do seu projeto. > > Também note que deixar controle de transações (commit / rollback) dentro de > uma sp pode causar muitos problemas se esta for chamada por outras sps. Eu > não necessariamente usaria esta abordagem, só fiz o exemplo assim para ficar > compatível com o seu código. > > Paulo > > --- Em qua, 28/12/11, Giovanni Ferreira de Sousa > escreveu: > > De: Giovanni Ferreira de Sousa > Assunto: [oracle_br] Tratamento de logs > Para: oracle_br@yahoogrupos.com.br <mailto:oracle_br%40yahoogrupos.com.br> > Data: Quarta-feira, 28 de Dezembro de 2011, 10:56 > > Bom Dia galera, > > > Estou com a seguinte situação aqui no trabalho: > > Um usuário solicitou que para as deleções físicas no banco, esses registros > deletado deveriam ser armazendos em uma tabela de log. No schema da aplicação > existe uma procedure que faz o delete nas tabelas. Para atender a demanda do > usuário foi adicionado na procedure o insert na tabela de
[oracle_br] PROCEDURE
PessoALL, Gostaria de saber se a sintaxe desta procedure esta correta... CREATE OR REPLACE PROCEDURE DBCPA.sp_consulta(inicio in number, fim in number) IS QT_TABELA NUMBER; begin SELECT COUNT(*) INTO QT_TABELA FROM USER_TABLES WHERE TABLE_NAME = 'TB_SISGERF_EXPORTACAO'; IF QT_TABELA = 1 THEN execute immediate 'DROP TABLE dbcpa.TB_sisgerf_exportacao'; END IF; execute immediate 'CREATE TABLE dbcpa.TB_sisgerf_exportacao ( NU_PORT number(20) NOT NULL, DT_PUBLIC DATE NOT NULL, CO_ACAO_PORT number(3)NOT NULL, CO_IBGE number(10) NOT NULL, DS_DESCRICAO varchar2(255), VL_ANUAL number(11,2) , VL_TCEP number(11,2) NOT NULL, NU_COMPETENCIA_INICIAL number(10) NOT NULL, NU_COMPETENCIA_FINAL number(10) NOT NULL, DS_OBS_PORTARIA CLOB )'; execute immediate 'INSERT INTO dbcpa.TB_sisgerf_exportacao SELECT TP.CO_PORTARIA AS NU_PORT, TO_CHAR(TP.DT_PUBLICACAO_PORTARIA,''DD/MM/'') AS DT_PUBLIC, RL.CO_TIPO AS CO_ACAO_PORT, PL.CO_MUNICIPIO_IBGE AS CO_IBGE, Null AS DS_DESCRICAO, PL.VL_ALTERADO AS VL_ANUAL, Null AS VL_TCEP, PL.NU_COMPETENCIA_INICIAL AS NU_COMPETENCIA_INICIAL, PL.NU_COMPETENCIA_FINAL AS NU_COMPETENCIA_FINAL, TP.DS_OBS_PORTARIA FROM dbcpa.tb_Portaria TP INNER JOIN dbcpa.tb_portaria_limite PL ON( TP.CO_PORTARIA = PL.CO_PORTARIA) INNER JOIN dbpublico.TB_MUNICIPIO MUN ON (PL.CO_MUNICIPIO_IBGE = MUN.CO_MUNICIPIO_IBGE) INNER JOIN dbcpa.tb_orgao TOR ON (TP.CO_ORGAO = TOR.CO_ORGAO) INNER JOIN dbcpa.RL_PORTARIA_TPPORTAR_ASSUNPORT RL ON( PL.CO_PORTARIA = RL.CO_PORTARIA) WHERE ((PL.NU_COMPETENCIA_INICIAL BETWEEN '||inicio||' AND '||fim||') AND (substr(PL.CO_MUNICIPIO_IBGE,0,2)<>99)) AND (((TP.CO_ORGAO)=1)) ORDER BY TP.DT_PUBLICACAO_PORTARIA'; SELECT COUNT(*) INTO QT_TABELA FROM USER_TABLES WHERE TABLE_NAME = 'TB_SISGERF_TMP_SOMA_ALTERACOES'; IF QT_TABELA = 1 THEN execute immediate 'DROP TABLE dbcpa.TB_SISGERF_TMP_SOMA_ALTERACOES'; END IF; execute immediate 'CREATE TABLE dbcpa.TB_SISGERF_TMP_SOMA_ALTERACOES ( CO_MUNICIPIO_IBGE VARCHAR2(6) NOT NULL, CO_PORTARIA NUMBER(12) NOT NULL, NU_COMPETENCIA_INICIAL NUMBER(6) NOT NULL, NU_COMPETENCIA_FINAL NUMBER(6) NOT NULL, VL_TOTAL NUMBER(11,2) not null )' ; execute immediate 'INSERT INTO TB_SISGERF_TMP_SOMA_ALTERACOES SELECT PL.CO_MUNICIPIO_IBGE, PL.CO_PORTARIA, PL.NU_COMPETENCIA_INICIAL, PL.NU_COMPETENCIA_FINAL, Sum(PL.VL_ALTERADO) AS VLR_TOTAL FROM dbcpa.tb_portaria_limite PL INNER JOIN dbpublico.TB_MUNICIPIO MUN ON (PL.CO_MUNICIPIO_IBGE = MUN.CO_MUNICIPIO_IBGE) WHERE (((PL.NU_COMPETENCIA_INICIAL)<''||fim||'')) GROUP BY PL.CO_MUNICIPIO_IBGE, PL.CO_PORTARIA, PL.NU_COMPETENCIA_INICIAL, PL.NU_COMPETENCIA_FINAL, MUN.ds_gestao_est_mun HAVING (((MUN.ds_gestao_est_mun)=''pleno'')) ORDER BY PL.CO_MUNICIPIO_IBGE'; SELECT COUNT(*) INTO QT_TABELA FROM USER_TABLES WHERE TABLE_NAME = 'TB_SISGERF_TMP_TETOTAL'; IF QT_TABELA = 1 THEN execute immediate 'DROP TABLE dbcpa.TB_SISGERF_TMP_TETOTAL'; END IF; execute immediate 'CREATE TABLE dbcpa.TB_SISGERF_TMP_TETOTAL ( CO_MUNICIPIO_IBGE VARCHAR2(6) NOT NULL, CO_PORTARIA NUMBER(12) NOT NULL, NU_COMPETENCIA_INICIAL NUMBER(6) NOT NULL, NU_COMPETENCIA_FINAL NUMBER(6) NOT NULL, VL_TETOTAL NUMBER(11,2) not null )' ; execute immediate 'SELECT STSA.CO_MUNICIPIO_IBGE, STSA.CO_PORTARIA, STSA.NU_COMPETENCIA_INICIAL, STSA.NU_COMPETENCIA_FINAL, STSA.VL_TOTAL+MUN.VL_MAC_HABILITACAO AS TETOTAL FROM dbcpa.TB_SISGERF_TMP_SOMA_ALTERACOES STSA INNER JOIN dbpublico.tb_municipio MUN ON (STSA.CO_MUNICIPIO_IBGE = MUN.CO_MUNICIPIO_IBGE) ORDER BY STSA.CO_EST_MUN, STSA.NU_COMPETENCIA_INICIAL'; execute immediate' INSERT INTO dbcpa.TB_SISGERF_EXPORTACAO(NU_PORT,DT_PUBLIC,CO_ACAO_PORT,CO_IBGE,DS_DESCRICAO,VL_ANUAL,VL_TCEP,NU_COMPETENCIA_INICIAL,NU_COMPETENCIA_FINAL,DS_OBS_PORTARIA) SELECT TP.CO_PORTARIA, TP.DT_PUBLICACAO_PORTARIA, RL.CO_TIPO, TSTT.CO_MUNICIPIO_IBGE, Null, Sum(TSTT.TETOTAL), Null, TSTT.NU_COMPETENCIA_INICIAL, TSTT.NU_COMPETENCIA_final, TP.obs_portaria FROM dbcpa.tb_portaria TP INNER JOIN dbcpa.tb_orgao TOR ON (TP.CO_ORGAO = TOR.CO_ORGAO) INNER JOIN dbcpa.TB_SISGERF_TMP_TETOTAL TSTT ON (TP.CO_PORTARIA = TSTT.CO_PORTARIA) INNER JOIN dbpublico.tb_municipio MUN ON (TSTT.CO_MUNICIPIO_IBGE = MUN.CO_MUNICIPIO_IBGE) INNER JOIN dbcpa.RL_PORTARIA_TPPORTAR_ASSUNPORT ON (TSTT.CO_PORTARIA = RL.CO_PORTARIA) WHERE TP.CO_ORGAO=2 GROUP BY TP.CO_PORTARIA, TP.DT_PUBLICACAO_PORTARIA, RL.CO_TIPO, TSTT.CO_MUNICIPIO_IBGE, Null, Null, TSTT.NU_COMPETENCIA_INICIAl, TSTT.NU_COMPETENCIA_FINAL, TP.DS_obs_portaria ORDER BY TP.DT_PUBLICACAO_PORTARIA'; end; / GRATO GIOVANNI [As partes desta mensagem que não cont
[oracle_br] PROCEDURE
PessoALL, Gostaria de saber se a sintaxe desta procedure esta correta... CREATE OR REPLACE PROCEDURE DBCPA.sp_consulta(inicio in number, fim in number) IS QT_TABELA NUMBER; begin SELECT COUNT(*) INTO QT_TABELA FROM USER_TABLES WHERE TABLE_NAME = 'TB_SISGERF_EXPORTACAO'; IF QT_TABELA = 1 THEN execute immediate 'DROP TABLE dbcpa.TB_sisgerf_exportacao'; END IF; execute immediate 'CREATE TABLE dbcpa.TB_sisgerf_exportacao ( NU_PORT number(20) NOT NULL, DT_PUBLIC DATE NOT NULL, CO_ACAO_PORT number(3)NOT NULL, CO_IBGE number(10) NOT NULL, DS_DESCRICAO varchar2(255), VL_ANUAL number(11,2) , VL_TCEP number(11,2) NOT NULL, NU_COMPETENCIA_INICIAL number(10) NOT NULL, NU_COMPETENCIA_FINAL number(10) NOT NULL, DS_OBS_PORTARIA CLOB )'; execute immediate 'INSERT INTO dbcpa.TB_sisgerf_exportacao SELECT TP.CO_PORTARIA AS NU_PORT, TO_CHAR(TP.DT_PUBLICACAO_PORTARIA,''DD/MM/'') AS DT_PUBLIC, RL.CO_TIPO AS CO_ACAO_PORT, PL.CO_MUNICIPIO_IBGE AS CO_IBGE, Null AS DS_DESCRICAO, PL.VL_ALTERADO AS VL_ANUAL, Null AS VL_TCEP, PL.NU_COMPETENCIA_INICIAL AS NU_COMPETENCIA_INICIAL, PL.NU_COMPETENCIA_FINAL AS NU_COMPETENCIA_FINAL, TP.DS_OBS_PORTARIA FROM dbcpa.tb_Portaria TP INNER JOIN dbcpa.tb_portaria_limite PL ON( TP.CO_PORTARIA = PL.CO_PORTARIA) INNER JOIN dbpublico.TB_MUNICIPIO MUN ON (PL.CO_MUNICIPIO_IBGE = MUN.CO_MUNICIPIO_IBGE) INNER JOIN dbcpa.tb_orgao TOR ON (TP.CO_ORGAO = TOR.CO_ORGAO) INNER JOIN dbcpa.RL_PORTARIA_TPPORTAR_ASSUNPORT RL ON( PL.CO_PORTARIA = RL.CO_PORTARIA) WHERE ((PL.NU_COMPETENCIA_INICIAL BETWEEN '||inicio||' AND '||fim||') AND (substr(PL.CO_MUNICIPIO_IBGE,0,2)<>99)) AND (((TP.CO_ORGAO)=1)) ORDER BY TP.DT_PUBLICACAO_PORTARIA'; SELECT COUNT(*) INTO QT_TABELA FROM USER_TABLES WHERE TABLE_NAME = 'TB_SISGERF_TMP_SOMA_ALTERACOES'; IF QT_TABELA = 1 THEN execute immediate 'DROP TABLE dbcpa.TB_SISGERF_TMP_SOMA_ALTERACOES'; END IF; execute immediate 'CREATE TABLE dbcpa.TB_SISGERF_TMP_SOMA_ALTERACOES ( CO_MUNICIPIO_IBGE VARCHAR2(6) NOT NULL, CO_PORTARIA NUMBER(12) NOT NULL, NU_COMPETENCIA_INICIAL NUMBER(6) NOT NULL, NU_COMPETENCIA_FINAL NUMBER(6) NOT NULL, VL_TOTAL NUMBER(11,2) not null )' ; execute immediate 'INSERT INTO TB_SISGERF_TMP_SOMA_ALTERACOES SELECT PL.CO_MUNICIPIO_IBGE, PL.CO_PORTARIA, PL.NU_COMPETENCIA_INICIAL, PL.NU_COMPETENCIA_FINAL, Sum(PL.VL_ALTERADO) AS VLR_TOTAL FROM dbcpa.tb_portaria_limite PL INNER JOIN dbpublico.TB_MUNICIPIO MUN ON (PL.CO_MUNICIPIO_IBGE = MUN.CO_MUNICIPIO_IBGE) WHERE (((PL.NU_COMPETENCIA_INICIAL)<''||fim||'')) GROUP BY PL.CO_MUNICIPIO_IBGE, PL.CO_PORTARIA, PL.NU_COMPETENCIA_INICIAL, PL.NU_COMPETENCIA_FINAL, MUN.ds_gestao_est_mun HAVING (((MUN.ds_gestao_est_mun)=''pleno'')) ORDER BY PL.CO_MUNICIPIO_IBGE'; SELECT COUNT(*) INTO QT_TABELA FROM USER_TABLES WHERE TABLE_NAME = 'TB_SISGERF_TMP_TETOTAL'; IF QT_TABELA = 1 THEN execute immediate 'DROP TABLE dbcpa.TB_SISGERF_TMP_TETOTAL'; END IF; execute immediate 'CREATE TABLE dbcpa.TB_SISGERF_TMP_TETOTAL ( CO_MUNICIPIO_IBGE VARCHAR2(6) NOT NULL, CO_PORTARIA NUMBER(12) NOT NULL, NU_COMPETENCIA_INICIAL NUMBER(6) NOT NULL, NU_COMPETENCIA_FINAL NUMBER(6) NOT NULL, VL_TETOTAL NUMBER(11,2) not null )' ; execute immediate 'SELECT STSA.CO_MUNICIPIO_IBGE, STSA.CO_PORTARIA, STSA.NU_COMPETENCIA_INICIAL, STSA.NU_COMPETENCIA_FINAL, STSA.VL_TOTAL+MUN.VL_MAC_HABILITACAO AS TETOTAL FROM dbcpa.TB_SISGERF_TMP_SOMA_ALTERACOES STSA INNER JOIN dbpublico.tb_municipio MUN ON (STSA.CO_MUNICIPIO_IBGE = MUN.CO_MUNICIPIO_IBGE) ORDER BY STSA.CO_EST_MUN, STSA.NU_COMPETENCIA_INICIAL'; execute immediate' INSERT INTO dbcpa.TB_SISGERF_EXPORTACAO(NU_PORT,DT_PUBLIC,CO_ACAO_PORT,CO_IBGE,DS_DESCRICAO,VL_ANUAL,VL_TCEP,NU_COMPETENCIA_INICIAL,NU_COMPETENCIA_FINAL,DS_OBS_PORTARIA) SELECT TP.CO_PORTARIA, TP.DT_PUBLICACAO_PORTARIA, RL.CO_TIPO, TSTT.CO_MUNICIPIO_IBGE, Null, Sum(TSTT.TETOTAL), Null, TSTT.NU_COMPETENCIA_INICIAL, TSTT.NU_COMPETENCIA_final, TP.obs_portaria FROM dbcpa.tb_portaria TP INNER JOIN dbcpa.tb_orgao TOR ON (TP.CO_ORGAO = TOR.CO_ORGAO) INNER JOIN dbcpa.TB_SISGERF_TMP_TETOTAL TSTT ON (TP.CO_PORTARIA = TSTT.CO_PORTARIA) INNER JOIN dbpublico.tb_municipio MUN ON (TSTT.CO_MUNICIPIO_IBGE = MUN.CO_MUNICIPIO_IBGE) INNER JOIN dbcpa.RL_PORTARIA_TPPORTAR_ASSUNPORT ON (TSTT.CO_PORTARIA = RL.CO_PORTARIA) WHERE TP.CO_ORGAO=2 GROUP BY TP.CO_PORTARIA, TP.DT_PUBLICACAO_PORTARIA, RL.CO_TIPO, TSTT.CO_MUNICIPIO_IBGE, Null, Null, TSTT.NU_COMPETENCIA_INICIAl, TSTT.NU_COMPETENCIA_FINAL, TP.DS_obs_portaria ORDER BY TP.DT_PUBLICACAO_PORTARIA'; end; / GRATO GIOVANNI [As partes desta mensagem que não cont
RES: [oracle_br] Migração Mysql - Oracle
Anderson, Onde posso baixá-lo? De: oracle_br@yahoogrupos.com.br em nome de Anderson Campelo Enviada: qua 23/11/2011 10:25 Para: oracle_br@yahoogrupos.com.br Assunto: Re: [oracle_br] Migração Mysql - Oracle Giovanni, Tive a oportunidade de testar uma ferramenta chamada "ESF.Database.Migration.Toolkit.Professional.v6.1.21" e obtive sucesso na migração de bancos como mysql, postgree e sql server para oracle, assim como é possível executar a ação inversa. Em 23 de novembro de 2011 10:02, Giovanni Ferreira de Sousa < giovanni.so...@funasa.gov.br> escreveu: > ** > > > Prezados, > > Tenho um cliente que possui uma aplicação utilizando banco de dados Mysql. > Tive uma reunião com ele, e ele me disse que quer migrar a estrutura e os > dados pra Oracle 10.2. Já criei a estrutura conforme orientações do > cliente. Agora estou com a missão realizar a migração dados. Gostaria de > pedir a ajuda de vocês. Gostaria de saber qual a melhor ferramenta, ou > melhores práticas, a melhor forma de realizar essa migração. Tendo em vista > que há diferença entre os tipos de dados entre os bancos, constrainsts, > integridade dos dados, dentre outros objetos. > > Desde já agradeço. > > Atenciosamente, > > Giovanni Sousa. > > > [As partes desta mensagem que não continham texto foram removidas] > > > [As partes desta mensagem que não continham texto foram removidas] -- >Atenção! As mensagens do grupo ORACLE_BR são de acesso público e de inteira >responsabilidade de seus remetentes. Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/ -- >Apostilas » Dicas e Exemplos » Função » Mundo Oracle » Package » Procedure » >Scripts » Tutoriais - O GRUPO ORACLE_BR TEM SEU PROPRIO ESPAÇO! VISITE: >http://www.oraclebr.com.br/ Links do Yahoo! Grupos [As partes desta mensagem que não continham texto foram removidas]
RES: [oracle_br] Tabelas iguais em schemas distintos
Bom dia David, Tenho o TOAD sim, o select vai ajudar a montar um relatório pra apontar os schemas que tem tabelas com nomes iguais e até idênticas. A idéia de levantar essas informações é, para as tabelas idêtnticas, sugerir usá-las em um modelo de dados corporativo, tendo em vista que a empresa não tem. E aproveitando gostaria de saber se a galera tem alguma documentação ou algo do tipo sobre como criar um modelo de dados corporativo, melhores práticas e afins. Agradeço a atenção e toda dica é sempre bem vinda. Abraços, Giovanni. De: oracle_br@yahoogrupos.com.br em nome de David Ricardo Enviada: qui 11/8/2011 17:10 Para: oracle_br@yahoogrupos.com.br Assunto: Re: [oracle_br] Tabelas iguais em schemas distintos Desculpa me intrometer no assunto , Mais se tu tiver um TOAD ou SQL NAVIGATOR por ai, ele tem uma ferramenta de COMPARE SCHEMAS que ajuda muito brother, até pra gerar report's para as pessoas que você precisa passar essa informação. Fica só a Dica... Abraço Em 11 de agosto de 2011 16:48, Giovanni Ferreira de Sousa < giovanni.so...@funasa.gov.br <mailto:giovanni.sousa%40funasa.gov.br> > escreveu: > ** > > > Valeu Sandro, > > Agora vou avaliar qual a melhor forma de avaliar... > > Abraço. > > > > De: oracle_br@yahoogrupos.com.br <mailto:oracle_br%40yahoogrupos.com.br> em > nome de Sandro Niederauer Curte > Enviada: qui 11/8/2011 15:51 > > Para: oracle_br@yahoogrupos.com.br <mailto:oracle_br%40yahoogrupos.com.br> > Assunto: Re: [oracle_br] Tabelas iguais em schemas distintos > > Vai depender do grau de precisão que tu necessita > > no select que mandei apenas leva em consideração o nome da tabela. Mas se > ao > invés disso é preciso considerar a estrutura, então é como o colega David > sugeriu. > > O select abaixo tem um grau bem maior, inclusive tu podes alterar essa > precisão apenas excluindo colunas, como por exemplo se a ordem não é > importante, então é só tirar o COLUMN_ID do select. > > SELECT DISTINCT B.OWNER, B.TABLE_NAME > FROM ( > SELECT TABLE_NAME, COLUMN_NAME, DATA_TYPE, DATA_LENGTH, DATA_PRECISION, > DATA_SCALE, NULLABLE, COLUMN_ID > FROM DBA_TAB_COLUMNS > GROUP BY TABLE_NAME, COLUMN_NAME, DATA_TYPE, DATA_LENGTH, DATA_PRECISION, > DATA_SCALE, NULLABLE, COLUMN_ID > HAVING COUNT(*)>1 ) A, DBA_TABLES B > WHERE A.TABLE_NAME = B.TABLE_NAME > ORDER BY 2,1; > > 2011/8/11 Giovanni Ferreira de Sousa <mailto:giovanni.sousa%40funasa.gov.br> > > > > ** > > > > > > Sandro, > > > > O que você sugeriu é como está nesse select? > > > > select column_name, owner, TABLE_NAME > > from dba_tab_columns > > where column_name in ( > > select column_name > > from dba_tab_columns > > group by column_name > > having count(*)>1 > > ) > > and owner like 'DB\_%' ESCAPE '\' > > ORDER BY 1 > > > > Abraço... > > > > > > > > De: oracle_br@yahoogrupos.com.br <mailto:oracle_br%40yahoogrupos.com.br> > > em nome de David Ricardo > > Enviada: qui 11/8/2011 14:56 > > > > Para: oracle_br@yahoogrupos.com.br <mailto:oracle_br%40yahoogrupos.com.br> > > Assunto: Re: [oracle_br] Tabelas iguais em schemas distintos > > > > Sandro , > > > > Acredito que se ele usar a ALL_TAB_COLUMNS seria melhor não acha?..Pois > > pode > > ser que o nome seja igual, mas a compição dos campos sejam diferentes. > > > > O que acha?.. > > > > Abraço > > > > Em 11 de agosto de 2011 14:49, Sandro Niederauer Curte > > mailto:sandronc%40gmail.com> > > <mailto:sandronc%40gmail.com> >escreveu: > > > > > > > select distinct owner > > > from dba_tables > > > where table_name in ( > > > select table_name > > > from dba_tables > > > group by table_name > > > having count(*)>1 > > > ); > > > > > > > > > 2011/8/11 Giovanni Ferreira de Sousa > > <mailto:giovanni.sousa%40funasa.gov.br> > > giovanni.sousa%40funasa.gov.br> > > > > > > > > > > ** > > > > > > > > > > > > Boa tarde Galera, > > > > > > > > Fiz um levantamento do dicionário de dados aqui da empresa e me > deparei > > > com > > > > a seguinte situação. > > > > > > > > - Existem vários schemas com os mesmos nomes de tabela. Sendo assim, > > > > gostaria de saber como faço um select, que me retorne os schemas que > > > contém
RES: [oracle_br] Tabelas iguais em schemas distintos
Valeu Sandro, Agora vou avaliar qual a melhor forma de avaliar... Abraço. De: oracle_br@yahoogrupos.com.br em nome de Sandro Niederauer Curte Enviada: qui 11/8/2011 15:51 Para: oracle_br@yahoogrupos.com.br Assunto: Re: [oracle_br] Tabelas iguais em schemas distintos Vai depender do grau de precisão que tu necessita no select que mandei apenas leva em consideração o nome da tabela. Mas se ao invés disso é preciso considerar a estrutura, então é como o colega David sugeriu. O select abaixo tem um grau bem maior, inclusive tu podes alterar essa precisão apenas excluindo colunas, como por exemplo se a ordem não é importante, então é só tirar o COLUMN_ID do select. SELECT DISTINCT B.OWNER, B.TABLE_NAME FROM ( SELECT TABLE_NAME, COLUMN_NAME, DATA_TYPE, DATA_LENGTH, DATA_PRECISION, DATA_SCALE, NULLABLE, COLUMN_ID FROM DBA_TAB_COLUMNS GROUP BY TABLE_NAME, COLUMN_NAME, DATA_TYPE, DATA_LENGTH, DATA_PRECISION, DATA_SCALE, NULLABLE, COLUMN_ID HAVING COUNT(*)>1 ) A, DBA_TABLES B WHERE A.TABLE_NAME = B.TABLE_NAME ORDER BY 2,1; 2011/8/11 Giovanni Ferreira de Sousa > ** > > > Sandro, > > O que você sugeriu é como está nesse select? > > select column_name, owner, TABLE_NAME > from dba_tab_columns > where column_name in ( > select column_name > from dba_tab_columns > group by column_name > having count(*)>1 > ) > and owner like 'DB\_%' ESCAPE '\' > ORDER BY 1 > > Abraço... > > > > De: oracle_br@yahoogrupos.com.br em nome de David Ricardo > Enviada: qui 11/8/2011 14:56 > > Para: oracle_br@yahoogrupos.com.br > Assunto: Re: [oracle_br] Tabelas iguais em schemas distintos > > Sandro , > > Acredito que se ele usar a ALL_TAB_COLUMNS seria melhor não acha?..Pois > pode > ser que o nome seja igual, mas a compição dos campos sejam diferentes. > > O que acha?.. > > Abraço > > Em 11 de agosto de 2011 14:49, Sandro Niederauer Curte > mailto:sandronc%40gmail.com> >escreveu: > > > > select distinct owner > > from dba_tables > > where table_name in ( > > select table_name > > from dba_tables > > group by table_name > > having count(*)>1 > > ); > > > > > > 2011/8/11 Giovanni Ferreira de Sousa giovanni.sousa%40funasa.gov.br> > > > > > > > ** > > > > > > > > > Boa tarde Galera, > > > > > > Fiz um levantamento do dicionário de dados aqui da empresa e me deparei > > com > > > a seguinte situação. > > > > > > - Existem vários schemas com os mesmos nomes de tabela. Sendo assim, > > > gostaria de saber como faço um select, que me retorne os schemas que > > contém > > > tabelas idênticas. > > > > > > Desde já agradeço. > > > > > > Atenciosamente, > > > > > > Giovanni > > > > > > > > > > > > [As partes desta mensagem que não continham texto foram removidas] > > > > > > > > > > > > > > > [As partes desta mensagem que não continham texto foram removidas] > > > > > > > > > > > > > > -- > > >Atenção! As mensagens do grupo ORACLE_BR são de acesso público e de > > inteira responsabilidade de seus remetentes. > > Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/ > > > > -- > > >Apostilas » Dicas e Exemplos » Função » Mundo Oracle » Package » > Procedure > > » Scripts » Tutoriais - O GRUPO ORACLE_BR TEM SEU PROPRIO ESPAÇO! VISITE: > > http://www.oraclebr.com.br/ > > -- > > Links do Yahoo! Grupos > > > > > > > > -- > -- > David Ricardo B. de Siqueira > IT Brazil - Database Administrator > DBANet > BLOG .: http://databaseguard.blogspot.com > <http://databaseguard.blogspot.com/> < > http://databaseguard.blogspot.com/> > > "O mistério da vida me causa a mais forte emoção. É o sentimento que > suscita > a beleza e a verdade, cria a arte e a ciência. Se alguém não conhece essa > sensação ou não pode mais exprimir espanto ou surpresa, já é um morto-vivo > e > seus olhos se cegaram.".(Albert Einstein - 1879 - 1955)" > > [As partes desta mensagem que não continham texto foram removidas] > > [As partes desta mensagem que não continham texto foram removidas] > > > [As
RES: [oracle_br] Tabelas iguais em schemas distintos
Sandro, O que você sugeriu é como está nesse select? select column_name, owner, TABLE_NAME from dba_tab_columns where column_name in ( select column_name from dba_tab_columns group by column_name having count(*)>1 ) and owner like 'DB\_%' ESCAPE '\' ORDER BY 1 Abraço... De: oracle_br@yahoogrupos.com.br em nome de David Ricardo Enviada: qui 11/8/2011 14:56 Para: oracle_br@yahoogrupos.com.br Assunto: Re: [oracle_br] Tabelas iguais em schemas distintos Sandro , Acredito que se ele usar a ALL_TAB_COLUMNS seria melhor não acha?..Pois pode ser que o nome seja igual, mas a compição dos campos sejam diferentes. O que acha?.. Abraço Em 11 de agosto de 2011 14:49, Sandro Niederauer Curte mailto:sandronc%40gmail.com> >escreveu: > select distinct owner > from dba_tables > where table_name in ( > select table_name > from dba_tables > group by table_name > having count(*)>1 > ); > > > 2011/8/11 Giovanni Ferreira de Sousa <mailto:giovanni.sousa%40funasa.gov.br> > > > > ** > > > > > > Boa tarde Galera, > > > > Fiz um levantamento do dicionário de dados aqui da empresa e me deparei > com > > a seguinte situação. > > > > - Existem vários schemas com os mesmos nomes de tabela. Sendo assim, > > gostaria de saber como faço um select, que me retorne os schemas que > contém > > tabelas idênticas. > > > > Desde já agradeço. > > > > Atenciosamente, > > > > Giovanni > > > > > > > > [As partes desta mensagem que não continham texto foram removidas] > > > > > > > > > [As partes desta mensagem que não continham texto foram removidas] > > > > > > > -- > >Atenção! As mensagens do grupo ORACLE_BR são de acesso público e de > inteira responsabilidade de seus remetentes. > Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/ > > -- > >Apostilas » Dicas e Exemplos » Função » Mundo Oracle » Package » Procedure > » Scripts » Tutoriais - O GRUPO ORACLE_BR TEM SEU PROPRIO ESPAÇO! VISITE: > http://www.oraclebr.com.br/ > -- > Links do Yahoo! Grupos > > > -- -- David Ricardo B. de Siqueira IT Brazil - Database Administrator DBANet BLOG .: http://databaseguard.blogspot.com <http://databaseguard.blogspot.com/> "O mistério da vida me causa a mais forte emoção. É o sentimento que suscita a beleza e a verdade, cria a arte e a ciência. Se alguém não conhece essa sensação ou não pode mais exprimir espanto ou surpresa, já é um morto-vivo e seus olhos se cegaram.".(Albert Einstein - 1879 - 1955)" [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] Tabelas iguais em schemas distintos
Era isso mesmo que eu queria...enquanto a saber se a estrutura das tabelas é mesma, é interessante também, assim passo uma informação mais concreta. Teria como me ajudar? Desde já agradeço... Giovanni De: oracle_br@yahoogrupos.com.br em nome de Sandro Niederauer Curte Enviada: qui 11/8/2011 14:49 Para: oracle_br@yahoogrupos.com.br Assunto: Re: [oracle_br] Tabelas iguais em schemas distintos select distinct owner from dba_tables where table_name in ( select table_name from dba_tables group by table_name having count(*)>1 ); 2011/8/11 Giovanni Ferreira de Sousa > ** > > > Boa tarde Galera, > > Fiz um levantamento do dicionário de dados aqui da empresa e me deparei com > a seguinte situação. > > - Existem vários schemas com os mesmos nomes de tabela. Sendo assim, > gostaria de saber como faço um select, que me retorne os schemas que contém > tabelas idênticas. > > Desde já agradeço. > > Atenciosamente, > > Giovanni > > > > [As partes desta mensagem que não continham texto foram removidas] > > > [As partes desta mensagem que não continham texto foram removidas] -- >Atenção! As mensagens do grupo ORACLE_BR são de acesso público e de inteira >responsabilidade de seus remetentes. Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/ -- >Apostilas » Dicas e Exemplos » Função » Mundo Oracle » Package » Procedure » >Scripts » Tutoriais - O GRUPO ORACLE_BR TEM SEU PROPRIO ESPAÇO! VISITE: >http://www.oraclebr.com.br/ Links do Yahoo! Grupos [As partes desta mensagem que não continham texto foram removidas]
[oracle_br] Tabelas iguais em schemas distintos
Boa tarde Galera, Fiz um levantamento do dicionário de dados aqui da empresa e me deparei com a seguinte situação. - Existem vários schemas com os mesmos nomes de tabela. Sendo assim, gostaria de saber como faço um select, que me retorne os schemas que contém tabelas idênticas. Desde já agradeço. Atenciosamente, Giovanni [As partes desta mensagem que não continham texto foram removidas]