UPDATE PL/SQL EM TABELA COM MUITOS DADOS?

VILMARBR 17/01/2012 11:31:19
#393432
Update PL/SQL em tabela com muitos dados?
Como eu faria, se possível, sem usar cursor, uma atualização(update) pegando de uma tabela X jogando numa tabela Y onde X.codigo = Y.codigo , sendo estarei mexendo com algo em torno de 600 milhões de registros, atualizando, por exemplo, de 1000 em 1000, que foi o que a analista me pediu para fazer ...
Alguma ideia, algum exemplo?
Grato.
KERPLUNK 17/01/2012 12:11:14
#393440
select top 1000 into tabela2 from tabela1 where tabela1.codigo = tabela2.codigo
VILMARBR 17/01/2012 13:42:14
#393455
me passaram este esquema aqui...
set serveroutput on

Declare

v_data date;

Begin

V_Data := To_Date([ô]01/06/2006[ô], [ô]dd/mm/yyyy[ô]);

Loop

For H In 0..23 Loop

Dbms_Output.Put_line(To_Char(V_Data, [ô]dd/mm/yyyy[ô]) || [ô] [ô] || H ||[ô]:00 até [ô] || H || [ô]:59[ô]);

--Update ....

--Where dt_emis_nfe > to_date(data || ’01:00’, ‘dd/mm/yyyy hh24:mi’) and dt_emis_nfe <= to_date(data || ’01:59’, ‘dd/mm/yyyy hh24:mi’);

--Commit;

End Loop;

V_Data := V_Data + 1;

Exit when v_data > to_date([ô]31/12/2011[ô], [ô]dd/mm/yyyy[ô]) ;

End Loop;

end;
q acham?
KERPLUNK 17/01/2012 13:46:01
#393457
Citação:

q acham?


Acho que é uma tremenda gambiarra. O que esse script está fazendo é exibir os registros, de uma determinada data, da meia noite até as 23 horas
VILMARBR 17/01/2012 15:07:54
#393470
eheh, quem me passou falou isto mesmo, uma gambiarra, mas usam nesta tabela de 600 milhoes de registro e rola de boa, acho que vou neste mesmo kkkkkkk
LLAIA 17/01/2012 15:21:26
#393472
O Oracle tem uma função semelhante ao LIMIT do MySQL ? Se sim, acho que poderia ser feito assim.
VILMARBR 17/01/2012 16:47:28
#393482
agora não sei por que esta tranqueira aqui dá pau toda hora qdo mando executar...
ja cacei no google e a sintaxe é esta do update from ....

UPDATE TABELA1

SET TABELA1.NOME = TABELA2.NOME

FROM TABELA2

WHERE TABELA1.COD= TABELA2.COD

[Ô]
Erro na Linha de Comando:390 Coluna:67
Relatório de Erro:
Erro de SQL: ORA-00933: SQL command not properly ended
00933. 00000 - [Ô]SQL command not properly ended[Ô]
*Cause:
*Action:
[Ô]
KERPLUNK 17/01/2012 17:56:34
#393486
UPDATE TABELA1

SET TABELA1.NOME = TABELA2.NOME

FROM TABELA2 [txt-color=#e80000]inner join tabela2 on tabela1.cod = tabela2.cod[/txt-color]

WHERE TABELA1.COD= TABELA2.COD
VILMARBR 17/01/2012 19:32:45
#393490
fiz com subselect mesmo... update from.. no pl/sql parece que não rola mesmo.....

UPDATE tabela1
SET tabela1.cpfcnpj = (SELECT tabela2.cpf FROM tabela2 WHERE tabela2.COD = tabela1.COD AND tabela1.COD_PESS IS NOT NULL)
where ROWNUM < 2


a tabela eh gigante, 600 bilhoes de registro, e a desgraça ta fazendo full scan no plano de execução, e a disgrama da tabela em indices..

tem como forçar usar o indice??
VILMARBR 18/01/2012 17:09:04
#393584
agora foi.. falta 2.a parte eheh


set serveroutput on
Declare
v_data date;

Begin
V_Data := To_Date([ô]01/06/2006[ô], [ô]dd/mm/yyyy[ô]);

Loop
For H In 0..23 Loop
Dbms_Output.Put_line(To_Char(V_Data, [ô]dd/mm/yyyy[ô]) || [ô] [ô] || H || [ô]:00 até [ô] || H || [ô]:59[ô]);

UPDATE tabela1 nf
SET (COD_TMDR_CPF_CNPJ,IND_TMDR_CPF_CNPJ) = (SELECT p.CPF_CNPJ_NF, p.IND_CPF_CNPJ_NF FROM tabela2 p WHERE p.PESS_NF = nf.PESS_TMDR_NF)
WHERE nf.PESS_TMDR_NF IS NOT NULL
AND nf.dt_emis_NF > to_date(v_data || [ô] [ô] || H || [ô]:00:00[ô], [ô]dd/mm/yyyy hh24:mi:ss[ô]) and dt_emis_NF <= to_date(v_data || [ô] [ô] || H || [ô]:59:59[ô], [ô]dd/mm/yyyy hh24:mi:ss[ô]);


--Commit;

End Loop;

V_Data := V_Data + 1;

Exit when v_data > to_date([ô]31/12/2011[ô], [ô]dd/mm/yyyy[ô]) ;

End Loop;
End;

Tópico encerrado , respostas não são mais permitidas