É o melhor, eu acho também. Agora, como eu disse, NÃO deixe de usar sempre que possível o APPEND-mode, de ter lá no bd origem o multiblock_read no talo do máximo do teu hardware (já que é FTS que vc fará lá), o teu dba pode te ajudar nas configs necessárias pra isso...
[]s Chiappa --- Em oracle_br@yahoogrupos.com.br, José Resende Neto <[EMAIL PROTECTED]> escreveu > > Valeu, Chiappa. > Vou fazer mesmo com INSERT INTO.... SELECT * FROM... como vc sugeriu. > Já falei com o meu DBA e ele disse que a área de rollback "aguenta". > Essa programação toda já me desanimou só de planejar... > > Abraço. > Neto. > > > ----- Original Message ----- > From: "jlchiappa" <[EMAIL PROTECTED]> > To: <oracle_br@yahoogrupos.com.br> > Sent: Tuesday, April 04, 2006 9:55 AM > Subject: [oracle_br] Re: HELP!!! Migração de dados - SQL Dinamico. > > > Verdade, um INSERT é atômico, é uma coisa só que será feita duma vez > só, mas pra solucionar erros de rollback, comitar várias vezes NÃO É, > e NUNCA FOI, a solução 100% correta e funcional, é tranquilo vc > montar um caso onde mesmo comitando a cada X registros vc cai nesse > erro, SE a tablespace de undo não for de tamanho adequando E os > segmentos não estiverem em quantidade/tamanhos/storage adequado à > transação que vc vai fazer. Além disso, NO SEU CASO, já que vc está > populando o bd destino, claro que ele está "inativo", ninguém o está > usando, então NADA impede de vc ajustar a área de rollback > corretamente, confere ??? > E ** mais ainda **, já que vc está inserindo dados só agora, E os > dados estão ok no bd origem, vc VAI desabilitar as constraints, > desativar índices e fazer INSERT em APPEND, a qtdade de undo/rollback > gerada assim vai ser MINÚSCULA, cfrme : > > [EMAIL PROTECTED]:SQL>select count(*) from fco.TMP_CRIT_RELATS; > > COUNT(*) > ------------------ > 2517056 > > ==> ok, 2 milhões e pouquinho, já dá pra brincar. Vamos a criar > primeiro no bd destino (onde já há dblink pro bd origem) : > > [EMAIL PROTECTED]:SQL>create table TAB_TESTE tablespace USERS as (select * > from [EMAIL PROTECTED] where 1=2); > > Tabela criada. > > ==> vamos botar uns índices & constraints, que mais tarde vou > desabilitar, só pra mostrar que SE desabilitados o APPEND-mode > funciona : > > [EMAIL PROTECTED]:SQL>create index IDX_TEST on TAB_TESTE(tmp_id) tablespace > users; > > Índice criado. > > [EMAIL PROTECTED]:SQL>create index IDX_TEST2 on TAB_TESTE > (MUNICIPIO_ORIGEN_ID,MUNICIPIO_DESTINO_ID,MOTIVO_EVENTO) tablespace > users; > > Índice criado. > > [EMAIL PROTECTED]:SQL>alter table TAB_TESTE add constraint TAB_TESTE_PK > primary key (tmp_id); > > Tabela alterada. > > [EMAIL PROTECTED]:SQL>alter table TAB_TESTE add constraint TAB_TESTE_UK > unique (MUNICIPIO_ORIGEN_ID,MUNICIPIO_DESTINO_ID,MOTIVO_EVENTO); > > Tabela alterada. > > ==> vamos botar tabela em nolog & desligar índices e constraints : > > [EMAIL PROTECTED]:SQL>alter table TAB_TESTE nologging; > > Tabela alterada. > > [EMAIL PROTECTED]:SQL>alter table TAB_TESTE disable constraint TAB_TESTE_UK ; > > Tabela alterada. > > [EMAIL PROTECTED]:SQL>alter table TAB_TESTE disable constraint TAB_TESTE_PK; > > Tabela alterada. > > [EMAIL PROTECTED]:SQL>alter index IDX_TEST unusable; > > Índice alterado. > > [EMAIL PROTECTED]:SQL>alter index IDX_TEST2 unusable; > > Índice alterado. > > [EMAIL PROTECTED]:SQL>select distinct status from user_constraints where > table_name='TAB_TESTE'; > > STATUS > -------- > DISABLED > > [EMAIL PROTECTED]:SQL>select distinct status from user_indexes where > table_name='TAB_TESTE'; > > STATUS > -------- > UNUSABLE > > ==>> Já que há índices unusable, vou pedir pro bd os ignorar : > > [EMAIL PROTECTED]:SQL>alter session set skip_unusable_indexes=TRUE; > > Sessão alterada. > > [EMAIL PROTECTED]:SQL>insert /*+ APPEND */ into TAB_TESTE (select * from > [EMAIL PROTECTED]); > > 2517056 linhas criadas. > > [EMAIL PROTECTED]:SQL> > > ==>> legal, quanto de rollback eu usei ?? > > > [EMAIL PROTECTED]:SQL>@used_rollback_blocks > > SEGMENT_NAME USERNAME SID SERIAL# > USED_UBLK USED_UREC START_UBAFIL > START_UBABLK START_UBAREC STATUS > TABLESPACE_NAME SEGMENT_ID > FILE_ID BLOCK_ID > --------------- ---------------- ---- ------- ------------------ --- -- > ------------- ------------------ ------------------ ---------------- -- > ---------------- ------------------------------ ------------------ -- > ---------------- ------------------ > _SYSSMU8$ SCOTT 49 647 > 1 1 4 > 1232 3 ONLINE > UNDO_TABLESPACE 8 > 2 121 > > [EMAIL PROTECTED]:SQL>get used_rollback_blocks > 1 # > 2 column sid format 999 > 3 column segment_name format a15 > 4 select b.segment_name, a.username, a.sid, a.serial#, > c.used_ublk, c.used_urec,c.START_UBAFIL, c.START_UBABLK, > c.START_UBAREC , b.status, > 5 b.TABLESPACE_NAME, b.SEGMENT_ID, b.FILE_ID, b.BLOCK_ID > 6 from v$session a, dba_rollback_segs b, v$transaction c > 7 where b.segment_id = c.xidusn > 8 and a.taddr = c.addr > 9 / > > [EMAIL PROTECTED]:SQL> > > ==> cara, usei UM BLOCO de rollback, ie, 8 Kb no meu banco !!! > Lógico, o seu banco é seu, vc fará como quiser,mas ter o trabalhão > (que NÃO é brinquedo, longe de ser simples!!) de fazer programado em > vista da evidência acima IMHO simplesmente NÂO se justifica.... > > []s > > Chiappa > --- Em oracle_br@yahoogrupos.com.br, José Resende Neto > <[EMAIL PROTECTED]> escreveu > > > > Chiappa, > > > > eu pensei em fazer por código para não correr o risco de estourar a > área de > > rollback, uma vez que algumas tabelas têm uma quantidade bastante > grande de > > registros. Assim eu poderia dividir os registros por blocos e > commitar a > > cada 10000 registros, por exemplo. > > > > Agora se eu fizer como vc disse usando "select 'INSERT INTO ' || > TABLE_NAME > > ||'@nomedodblink (select * from ' > > || TABLE_NAME || ');'", como eu faria para commitar a cada X > registros e não > > estourar a área de rollback? > > > > Abraço. > > Neto. > > > > > > > > ----- Original Message ----- > > From: "jlchiappa" <[EMAIL PROTECTED]> > > To: <oracle_br@yahoogrupos.com.br> > > Sent: Monday, April 03, 2006 4:08 PM > > Subject: [oracle_br] Re: HELP!!! Migração de dados - SQL Dinamico. > > > > > > Friend, vamos por partes aí : primeiro de tudo, já que vc > > diz "migração de dados de tabelas idênticas", eu entendo que os > nomes > > das tabelas E os nomes das colunas são os mesmos tanto no bd origem > > quanto no destino, confere ??? Sendo assim, por mais divertido que > > seja vc brincar com código, administrativamente a maneira rápida de > > se fazer esta tarefa é montar e rodar um script tipo : > > > > set term off feedback off verify off pages 0 lines 500 trimspool on > > head off > > spool tabs_a_inserir.sql > > select 'INSERT INTO ' || TABLE_NAME ||'@nomedodblink (select * > from ' > > || TABLE_NAME || ');' > > from dba_tables > > where ... condiçõesqueidentificamastabs....; > > exit > > > > > > ==> e daí vc roda o script tabs_a_inserir.sql, cabou, morreu, fim de > > papo - no máximo, se desejado quebre o script em n partes para as > > rodar em sessões simultâneas de plus, faça INSERT /*+ APPEND */ se > as > > tabelas estão em nologging, PARALLEL se for mas a base é essa aí de > > cima.... > > > > Caso vc REALMENTE queira fazer via programação, como sempre quando > se > > fala em SQL dinâmico vc VAI ter que codificar PRACAS, não é muito > > simples, E ainda além disso vc VAI ter que conviver com um monte de > > parses extras. O primeiro ponto é que vc não sabe o número de > colunas > > pra cada SQL gerado, então ao invés de EXECUTE IMMEDIATE vc vai ter > > que usar DBMS_SQL, procure em http://asktom.oracle.com por DYNAMIC > > DYNAMIC SQL que vc acha alguns textos. Depois, vc vai ter o problema > > de que vais ter colunas de diversos datatypes, ou vc usa ANYDATA > > (procure no asktom que vc acha algo), ou abre uma série de IFs, > > provavelmente recuperando o datatype de cada coluna na > > DBA_TAB_COLUMNS. > > > > []s > > > > Chiappa > > > > --- Em oracle_br@yahoogrupos.com.br, José Resende Neto > > <[EMAIL PROTECTED]> escreveu > > > > > > Pessoal, > > > > > > alguém pode me ajudar com esse problema da minha migração de dados > > descrita > > > no email abaixo? > > > > > > Obrigado. > > > Neto. > > > > > > ----- Original Message ----- > > > From: "ze_neto2002" <[EMAIL PROTECTED]> > > > To: <oracle_br@yahoogrupos.com.br> > > > Sent: Monday, April 03, 2006 11:33 AM > > > Subject: [oracle_br] Migração de dados - SQL Dinamico. > > > > > > > > > BANCO: Oracle9i Enterprise Edition Release 9.2.0.6.0 - 64bit > > > Production > > > > > > Pessoal, > > > > > > estou precisando fazer uma migração de dados de tabelas idênticas > de > > > uma instância para outra, usando um DB link. > > > > > > Eu quero fazer um código genérico. Ou seja, sem usar nomes ou > tipos > > > relacionados a nomes fixos de tabelas, eu poderia migrar os dados > de > > > todas as tabelas. Elas primeiramente serão carregadas em uma > tabela > > > temporária. Então eu abro um cursor (ou carrego um array) com o > nome > > > de cada uma e daí começo a ler os dados na outra instância e > > carregar > > > na tabela final. > > > > > > Tenho tabelas com muitos dados. Por isso não posso usar > > > simplesmente "INSERT INTO <nome da tabela> SELECT * FROM <nome da > > > tabela>@<DB_LINK>". Mesmo se eu fizesse "INSERT INTO <nome da > > tabela> > > > SELECT * FROM <nome da tabela>@<DB_LINK> WHERE ROWNUM BETWEEN > > > <valor_ini> AND <valor_fim>", neste caso separando o insert em > > blocos > > > de 10000, por exemplo, ficaria muito lento porque teria que ler a > > > tabela a cada 10000 registros. Então Pensei em fazer usando o > BULK e > > > FORALL. > > > > > > Agora vamos aos problemas: > > > > > > 1) Eu teria que jogar o que eu leio em um tipo record genérico. Eu > > > não quero passar o nome da tabela fixo e nem um tipo fixo usando o > > > ROWTYPE. Eu não quero algo do tipo: > > > TYPE cust_rec IS TABLE OF <tabela customer>%ROWTYPE; > > > > > > Qual seria a solução para o tipo genérico, onde eu poderia jogar o > > > registro de qualquer tabela? > > > > > > > > > 2) Tendo o tipo genérico em mãos, eu poderia começar a pensar no > > > FORALL. Mas estou parado no problema de fazer um FORALL usando SQL > > > dinamico, porque o nome da minha tabela de destino não é fixo. > Então > > > tentei: > > > > > > v_sql := 'FORALL indx IN id_first..id_last '|| > > > 'INSERT INTO '||mig_table.table_name(i)||' > > > VALUES '||mig_table.table_name(i)||'_type(indx)'; > > > EXECUTE IMMEDIATE v_sql; > > > > > > onde mig_table.table_name(i)||'_type seria o tipo genérico do item > > 1. > > > Mas não funciona. Dá o erro "ORA-00900: invalid SQL statement". > > > Imagino que seja porque não posso fazer o FORALL dinamicamente. > > > > > > E aí, pessoal? Alguém já passou por este tipo de migração de dados > > > antes? Alguma luz? > > > > > > Estou no aguardo... > > > Neto. > > > > > > > > > > > > > > > > > > ---------------------------------------------------------------- -- > -- > > -------- > > > ---------------------------------------------- > > > Atenção! As mensagens deste grupo são de acesso público e de > inteira > > > responsabilidade de seus remetentes. > > > Acesse: http://www.mail- archive.com/oracle_br@yahoogrupos.com.br/ > > > ---------------------------------------------------------------- -- > -- > > -------- > > > ---------------------------------------------- > > ______________________________ > > > ____________________________________ > > > > > > Este Grupo recebe o apoio da SQL Magazine - > > www.devmedia.com.br/sqlmagazine > > > __________________________________________________________________ > > > O grupo Oracle_br não aceita anexos. Quando oferecer algum > arquivo, > > tenha o > > > link do mesmo para evitar trafego(pedidos) desnecessário. > > > Links do Yahoo! Grupos > > > > > > > > > > > > > > > > > ------------------------------------------------------------------ -- > -------- > > ---------------------------------------------- > > Atenção! As mensagens deste grupo são de acesso público e de inteira > > responsabilidade de seus remetentes. > > Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/ > > ------------------------------------------------------------------ -- > -------- > > ---------------------------------------------- > ______________________________ > > ____________________________________ > > > > Este Grupo recebe o apoio da SQL Magazine - > www.devmedia.com.br/sqlmagazine > > __________________________________________________________________ > > O grupo Oracle_br não aceita anexos. Quando oferecer algum arquivo, > tenha o > > link do mesmo para evitar trafego(pedidos) desnecessário. > > Links do Yahoo! Grupos > > > > > > > > > -------------------------------------------------------------------- -------- > ---------------------------------------------- > Atenção! As mensagens deste grupo são de acesso público e de inteira > responsabilidade de seus remetentes. > Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/ > -------------------------------------------------------------------- -------- > ---------------------------------------------- ______________________________ > ____________________________________ > > Este Grupo recebe o apoio da SQL Magazine - www.devmedia.com.br/sqlmagazine > __________________________________________________________________ > O grupo Oracle_br não aceita anexos. Quando oferecer algum arquivo, tenha o > link do mesmo para evitar trafego(pedidos) desnecessário. > Links do Yahoo! Grupos > -------------------------------------------------------------------------------------------------------------------------- Atenção! As mensagens deste grupo são de acesso público e de inteira responsabilidade de seus remetentes. Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/ --------------------------------------------------------------------------------------------------------------------------__________________________________________________________________ Este Grupo recebe o apoio da SQL Magazine - www.devmedia.com.br/sqlmagazine __________________________________________________________________ O grupo Oracle_br não aceita anexos. Quando oferecer algum arquivo, tenha o link do mesmo para evitar trafego(pedidos) desnecessário. Links do Yahoo! Grupos <*> Para visitar o site do seu grupo na web, acesse: http://br.groups.yahoo.com/group/oracle_br/ <*> Para sair deste grupo, envie um e-mail para: [EMAIL PROTECTED] <*> O uso que você faz do Yahoo! Grupos está sujeito aos: http://br.yahoo.com/info/utos.html