UPDATE PL/SQL EM TABELA COM MUITOS DADOS?
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.
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.
select top 1000 into tabela2 from tabela1 where tabela1.codigo = tabela2.codigo
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?
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?
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
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
O Oracle tem uma função semelhante ao LIMIT do MySQL ? Se sim, acho que poderia ser feito assim.
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:
[Ô]
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:
[Ô]
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
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
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??
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??
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;
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