[oracle_br] Re: bulk collect
Dê uma olhada na cláusula LIMIT Mais informações em: http://www.oracle.com/technology/oramag/oracle/08-mar/o28plsql.html Alex Zaballa --- Em oracle_br@yahoogrupos.com.br, Eduardo eduardo.pa...@... escreveu Boa tarde turma! Minha dúvida é sobre bulk collect em pl/sql. Tem como controlar o tamanho do tabela utilizada? Pois eu rodei o código abaixo e simplesmente sentei o servidor de desenvolvimento. A tabela tem mais 200 milhões de registros. Ou seria melhor fazer usando cursor? CREATE OR REPLACE PROCEDURE PF2.geranomefonetizado2 IS TYPE cpf_aat is table of pf2.pessoa_fisica.cpf%TYPE INDEX BY PLS_INTEGER; TYPE nome_aat is table of pf2.pessoa_fisica.nome%TYPE INDEX BY PLS_INTEGER; cpf_data cpf_aat; nome_data nome_aat; procedure retrieve_info is begin select cpf, nome bulk collect into cpf_data, nome_data from pf2.pessoa_fisica; end; procedure add_fonetizado is begin forall i IN cpf_data.FIRST..cpf_data.LAST insert into pf2.nome_fonetizado (cpf,NOME_FONETIZADO) values (cpf_data(i),fonetizar(nome_data(i))); end; begin retrieve_info; add_fonetizado; end; / Obrigado por alguma dica aí.
[oracle_br] Re: BULK COLLECT com DBLINK
O que tive de problemas com insert + select + dblink, é o caso de ter que especificar as colunas, tanto no insert como no select. Em alguns casos, se deixar com insert... select * from ..., o banco se perde com o uso deste '*' e 'troca' a ordem das colunas no insert. Talvez seja este o seu caso. Anderson. --- Em oracle_br@yahoogrupos.com.br, Júlio César Corrêa juliotubi...@... escreveu O seu erro mostra outra coisa.Que você está tentando inserir um valor null em uma coluna not null. Verifique se está correto este insert nas colunas corretas e coisa e tal.Se persistir ae pode ser outra coisa(bug) não sei. Mas por enquanto o erro é outro. 2009/3/11 sergio_oracle mandaproser...@... Estou tendo dificuldade ao usar o FORALL para inserir registros em uma tabela em outro banco Oracle, ligados por dblink O erro sempre apresentado é ORA-01400 cannot insert NULL Como preciso enviar dados de uma tabela para outra em grandes quantidades, estava pensando em usar o bulk collet, mas parece que não funciona bem quando se usa em conjunto com dblink. Fiz um teste em uma tabela local do banco e funcionou perfeitamente. Antes estava usando o INSERT com SELECT e funciona de forma bem rápida, cerca de 50.000 em 7 segundos. Mas como a quantidade de registros pode chegar a 2.000.000, comecei a usar CURSOR e, inserindo linha a linha, os mesmos 50.000 demorou 2 minutos. Alguma sugestão ou exemplo de como posso fazer essa transmissão de registros de forma rápida? -- Júlio César Corrêa IS Technologist - Oracle DBA http://jccorrea.blogspot.com To stay competitive in the tech industry, never stop learning. Always be on the lookout for better ways of doing things and new technologies. Our industry does not reward people who let themselves stagnate John Hall, Senior Vice President, Oracle University [As partes desta mensagem que não continham texto foram removidas]
[oracle_br] Re: BULK COLLECT com DBLINK
--- Em oracle_br@yahoogrupos.com.br, Júlio César Corrêa juliotubi...@... escreveu O seu erro mostra outra coisa.Que você está tentando inserir um valor null em uma coluna not null. Verifique se está correto este insert nas colunas corretas e coisa e tal.Se persistir ae pode ser outra coisa(bug) não sei. Mas por enquanto o erro é outro. 2009/3/11 sergio_oracle mandaproser...@... Estou tendo dificuldade ao usar o FORALL para inserir registros em uma tabela em outro banco Oracle, ligados por dblink O erro sempre apresentado é ORA-01400 cannot insert NULL Como preciso enviar dados de uma tabela para outra em grandes quantidades, estava pensando em usar o bulk collet, mas parece que não funciona bem quando se usa em conjunto com dblink. Fiz um teste em uma tabela local do banco e funcionou perfeitamente. Antes estava usando o INSERT com SELECT e funciona de forma bem rápida, cerca de 50.000 em 7 segundos. Mas como a quantidade de registros pode chegar a 2.000.000, comecei a usar CURSOR e, inserindo linha a linha, os mesmos 50.000 demorou 2 minutos. Alguma sugestão ou exemplo de como posso fazer essa transmissão de registros de forma rápida? -- Júlio César Corrêa IS Technologist - Oracle DBA http://jccorrea.blogspot.com To stay competitive in the tech industry, never stop learning. Always be on the lookout for better ways of doing things and new technologies. Our industry does not reward people who let themselves stagnate John Hall, Senior Vice President, Oracle University [As partes desta mensagem que não continham texto foram removidas] Pois é Júlio, o erro é estranho, pois acho que estou fazendo tudo certo. Eu crio um tipo tabela index by de acordo com um cursor que possui os mesmos campos e na ordem da tabela destino. Uso o bulk collect para carregar esta tabela. Até aí ocorre tudo bem e depois uso : FORALL i IN 1..t_movimentos.count INSERT INTO movimen...@dbl_homolog VALUES t_movimentos(i); Acontece que se ao invés do forall, eu usar o for normal os registros são inseridos perfeitamente, assim: FOR i IN 1..t_movimentos.count LOOP INSERT INTO movimen...@dbl_homolog ( campo_1..campo_n) VALUES ( t_movimentos(i).campo_1 .. t_movimentos(i).campo_n) END LOOP;
[oracle_br] Re: BULK COLLECT com DBLINK
Continuo achando que é 'problema' interno, quando o banco se 'perde' com a ordem das colunas. Isso é o que acontece com inserts simples, e deve ser a causa do uso de cursor, deixando o banco chutar a ordem das colunas. Anderson. --- Em oracle_br@yahoogrupos.com.br, sergio_oracle mandaproser...@... escreveu --- Em oracle_br@yahoogrupos.com.br, Júlio César Corrêa juliotubista@ escreveu O seu erro mostra outra coisa.Que você está tentando inserir um valor null em uma coluna not null. Verifique se está correto este insert nas colunas corretas e coisa e tal.Se persistir ae pode ser outra coisa(bug) não sei. Mas por enquanto o erro é outro. 2009/3/11 sergio_oracle mandaprosergio@ Estou tendo dificuldade ao usar o FORALL para inserir registros em uma tabela em outro banco Oracle, ligados por dblink O erro sempre apresentado é ORA-01400 cannot insert NULL Como preciso enviar dados de uma tabela para outra em grandes quantidades, estava pensando em usar o bulk collet, mas parece que não funciona bem quando se usa em conjunto com dblink. Fiz um teste em uma tabela local do banco e funcionou perfeitamente. Antes estava usando o INSERT com SELECT e funciona de forma bem rápida, cerca de 50.000 em 7 segundos. Mas como a quantidade de registros pode chegar a 2.000.000, comecei a usar CURSOR e, inserindo linha a linha, os mesmos 50.000 demorou 2 minutos. Alguma sugestão ou exemplo de como posso fazer essa transmissão de registros de forma rápida? -- Júlio César Corrêa IS Technologist - Oracle DBA http://jccorrea.blogspot.com To stay competitive in the tech industry, never stop learning. Always be on the lookout for better ways of doing things and new technologies. Our industry does not reward people who let themselves stagnate John Hall, Senior Vice President, Oracle University [As partes desta mensagem que não continham texto foram removidas] Pois é Júlio, o erro é estranho, pois acho que estou fazendo tudo certo. Eu crio um tipo tabela index by de acordo com um cursor que possui os mesmos campos e na ordem da tabela destino. Uso o bulk collect para carregar esta tabela. Até aí ocorre tudo bem e depois uso : FORALL i IN 1..t_movimentos.count INSERT INTO movimen...@dbl_homolog VALUES t_movimentos(i); Acontece que se ao invés do forall, eu usar o for normal os registros são inseridos perfeitamente, assim: FOR i IN 1..t_movimentos.count LOOP INSERT INTO movimen...@dbl_homolog ( campo_1..campo_n) VALUES ( t_movimentos(i).campo_1 .. t_movimentos(i).campo_n) END LOOP;