[oracle_br] Re: bulk collect

2009-09-11 Por tôpico zaballa_grupos
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

2009-03-12 Por tôpico Anderson
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

2009-03-12 Por tôpico sergio_oracle
--- 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

2009-03-12 Por tôpico Anderson
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;