RES: RES: [oracle_br] UPDATE COM JOIN. EXISTE?

2012-01-17 Por tôpico Giovanni Ferreira de Sousa

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?

2012-01-17 Por tôpico Giovanni Ferreira de Sousa
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

2012-01-13 Por tôpico Giovanni Ferreira de Sousa
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

2012-01-11 Por tôpico Giovanni Ferreira de Sousa
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

2012-01-02 Por tôpico Giovanni Ferreira de Sousa
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

2011-12-29 Por tôpico Giovanni Ferreira de Sousa
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

2011-12-09 Por tôpico Giovanni Ferreira de Sousa
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

2011-12-09 Por tôpico Giovanni Ferreira de Sousa
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

2011-11-23 Por tôpico Giovanni Ferreira de Sousa
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

2011-08-12 Por tôpico Giovanni Ferreira de Sousa
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

2011-08-11 Por tôpico Giovanni Ferreira de Sousa
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

2011-08-11 Por tôpico 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  <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

2011-08-11 Por tôpico Giovanni Ferreira de Sousa
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

2011-08-11 Por tôpico 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]