PL/SQL - Cursor e Loop

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
phscuritiba
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 5
Registrado em: Qui, 21 Fev 2008 8:52 pm
Localização: Paraná

Boa noite a todos,

estou iniciando no fórum, em PL/SQL e administração de base de dados Oracle. Tenho a seguinte situação:

Estou precisando copiar dados de algumas tabelas em uma instância para outras tabelas de outra instância.
Primeiro criei um db link (BLK_PROD_BKP) para se conectar com a outra instância, até aí tudo bem. Acessou normal, testei um select:

Selecionar tudo

select * from GVTPRD.S_CFG_CLASS@DBLK_PROD_BKP
e tudo funcionou, o problema é que, quando vou inserir na outra base, tenho problema com table space. Então, não posso fazer o seguinte comando:

Selecionar tudo

insert into GVTPRD.S_CFG_CLASS(select * from GVTPRD.S_CFG_CLASS@DBLK_PROD_BKP)
Uma opção, eu acho, seria fazer por partes, já que não posso mudar o table space, fazendo a inserção por grupos, por exemplo: de 500 em 500 registros e fazendo um commit a cada vez que chegar a este número. O problema é como fazer isso??? Será que alguém pode me ajudar criando um exemplo, em um bloco PL, fazendo select em uma base e inserido em outra??? Por que a solução que elaborei, só funciona para um número que não ultrapasse o table space. Será que estou certo???

Desde já agradeço pela ajuda!!!

[]´s
ruevers
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 324
Registrado em: Sex, 02 Jun 2006 1:48 pm
Localização: sp
Contato:

Tem vários jeitos, mas vamos a uma GAMBIARRA MASTER.

está assim...

Selecionar tudo

insert into GVTPRD.S_CFG_CLASS(select * from GVTPRD.S_CFG_CLASS@DBLK_PROD_BKP) 
essa tabela deve ter uma chave primaria, vou chamar o campo de CHAVE ok.

ficaria assim.

Selecionar tudo

insert into GVTPRD.S_CFG_CLASS(
select * 
from GVTPRD.S_CFG_CLASS@DBLK_PROD_BKP 
where chave not in (select chave from gvtprd.s_cfg_class) 
and rownum <1000)
onde rownum<1000 seria o numero de linhas que vai inserir por vez.
no caso seriam 999 por vez

Att

Anderson
DBA Sr.
http://www.ruevers.webs.com
victorhugomuniz
Moderador
Moderador
Mensagens: 1396
Registrado em: Sex, 01 Fev 2008 2:06 pm
Localização: Rio de Janeiro - RJ
Contato:
:D

so tem macgyver 8)
phscuritiba
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 5
Registrado em: Qui, 21 Fev 2008 8:52 pm
Localização: Paraná

Caro Anderson,

em primeiro lugar, me desculpe pela demora em agradecer, é que tinham bloqueado esse site aqui na empresa. Um amigo me ajudou com um script aqui, olhando a sua solução utilizando a coluna ROWNUM eu precisarei executar para cada 999 registros??? Por exemplo, se tenho 900.000 registros terei que executar tantas vezes quanto for necessário até chegar neste número, ou posso fazer um contador para cada vez que ele chegar a este número reiniciar a execução até chegar ao fim??? Como eu poderia fazer??? Desculpe-me se forem uma perguntas idiotas, mas como mencionei sou iniciante na área de banco de dados. Desde já agradeço.

[]´s

Paulo Henrique.
Julian Campagnoli
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 82
Registrado em: Ter, 26 Fev 2008 11:33 am
Localização: MG e SP

Pelo que entendi você quer um exemplo em PL para fazer a inserção de uma base a outra ?????

Em PL-SQL os passos seriam basicamente assim:

Criar uma procedure que:
- Armazene os dados da tabela em um cursor
- Depois armazene os dados do cursor na tabela.
- De o commit quando quiser

Observação: não ficou muito claro se é exatamente isso que quer fazer.


Mas você deve também verificar a base dados original com a que vai ser gerada. Pois o exemplo do Anderson, acho que esta de acordo com o que você precisaria fazer.


Abraço
phscuritiba
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 5
Registrado em: Qui, 21 Fev 2008 8:52 pm
Localização: Paraná

Obrigado Julian,

é exatamente isso. Por gentileza, poderia passar um exemplo??? Desde já agradeço.

[]´s

Paulo Henrique.
rafasch
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 23
Registrado em: Qui, 18 Out 2007 8:05 pm
Localização: Blumenau

Veja:

Selecionar tudo

create or replace procedure YYY is

  cursor c is
    select blalala from lalala;

  contador number;

begin
  
   for c1 in c loop

    begin

       insert into tabela(campos) values(c1.campo...);
       contador := contador + 1;
       if(contador = valor_que_você_quer)then
          commit;
          contador := 0;
       end if;
         
     exception
        when...
    end;


   end loop;

end;
phscuritiba
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 5
Registrado em: Qui, 21 Fev 2008 8:52 pm
Localização: Paraná

Muito obrigado pela ajuda pessoal!!!
Por gentileza, alguém me indicar um bom livro de Oracle???

[]´s

Paulo Henrique.
Julian Campagnoli
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 82
Registrado em: Ter, 26 Fev 2008 11:33 am
Localização: MG e SP

Brother, eu gostei bastante do Oracle 9i Programação PL-SQL.
Mas de uma olhada aqui no forum ... há bastante materiais disponiveis.
Abração
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP
Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Brothers,

Não sei te falar muito sobre os livros.
Talvez os da própria Oracle Press o ajude.

Mas, aqui no fórum temos diversas apostilas, como esta:
http://www.glufke.net/oracle/download/Apostila_Completa_Oracle_9i.zip..

E também as video-aulas, neste tópico:
http://www.glufke.net/oracle/viewtopic.php?t=1440.
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 14 visitantes