Por gentileza, alguém pode me ajudar com a seguinte situação ?
Preciso fazer um select em uma tabela que contém milhões de registros, este SELECT deve ser executado "parceladamente" a cada 50 mil linhas em ordem decrescente ao valor de uma coluna. Ou seja.. roda o select e pega as última 50 milhas, depois as outras 50 mil, e 50 mil, até o final, do valor mais alto para o mais baixo.
Pensei em usar o "ROWNUM", mas o rownum não resolve meu problema, pois a cada vez que executo o SELECT, o banco está sofrendo inserções ao mesmo tempo então o resultado pode variar a cada SELECT.
O que preciso é considerar o estado da tabela no momento do primeiro SELECT, assim os select's na sequência considerarão sempre este valor inicial. Então, pesquisando na web vi alguns exemplos com cursores e tentei algo criando este abaixo.
Ah, a tabela é muito grande, então não posso ficar pegando "tudo"(*) a cada SELECT. Aí trava o processo.
Também preciso de um help para exibir o resultado na tela.
Estou utilizando o SQL Plus
declare
vCOLUNA1 TB_TABELA.COLUNA1%type;
vCOLUNA2 TB_TABELA.COLUNA2%type;
vCOLUNA3 TB_TABELA.COLUNA3%type;
vCOLUNA4 TB_TABELA.COLUNA4%type;
vCOLUNA5 TB_TABELA.COLUNA5%type;
vCOLUNA6 TB_TABELA.COLUNA6%type;
vCOLUNA7 TB_TABELA.COLUNA7%type;
vCOLUNA8 TB_TABELA.COLUNA8%type;
vCOLUNA9 TB_TABELA.COLUNA9%type;
vCOLUNA10 TB_TABELA.COLUNA10%type;
vCOLUNA11 TB_TABELA.COLUNA10%type;
vCOLUNA12 TB_TABELA.COLUNA12%type;
vCOLUNA13 TB_TABELA.COLUNA13%type;
vCOLUNA14 TB_TABELA.COLUNA14%type;
vCOLUNA15 TB_TABELA.COLUNA15%type;
vCOLUNA16 TB_TABELA.COLUNA16%type;
vCOLUNA17 TB_TABELA.COLUNA17%type;
vCOLUNA18 TB_TABELA.COLUNA18%type;
vCOLUNA_UNIQUE_ID TB_TABELA.COLUNA_UNIQUE_ID%type;
vCOLUNA20 TB_TABELA.COLUNA20%type;
vCOLUNA21 TB_TABELA.COLUNA21%type;
vCOLUNA22 TB_TABELA.COLUNA22%type;
vCOLUNA23 TB_TABELA.COLUNA23%type;
vCOLUNA24 TB_TABELA.COLUNA24%type;
vCOLUNA25 TB_TABELA.COLUNA25%type;
vCOLUNA26 TB_TABELA.COLUNA26%type;
CURSOR cTABELA IS SELECT * FROM TB_TABELA
WHERE vCOLUNA_UNIQUE_ID >= (SELECT max(vCOLUNA_UNIQUE_ID)FROM TB_TABELA)
ORDER BY vCOLUNA_UNIQUE_ID DESC;
type t_tb_TABELA_list is table of cTABELA%rowtype;
t_Tb_TABELA_rec t_tb_TABELA_list;
Begin
Open CTABELA;
Loop
Fetch CTABELA BULK COLLECT into t_tb_TABELA_rec Limit 50000;
Exit When CTABELA%NOTFOUND;
for I in t_Tb_TABELA_rec.first .. t_Tb_TABELA_rec.last loop
SELECT *
INTO vCOLUNA1, vCOLUNA2, vCOLUNA3, vCOLUNA4, vCOLUNA5, vCOLUNA6, vCOLUNA7, vCOLUNA8, vCOLUNA9, vCOLUNA10, vCOLUNA11, vCOLUNA12,
vCOLUNA13, vCOLUNA14, vCOLUNA15, vCOLUNA16, vCOLUNA17, vCOLUNA18, vCOLUNA_UNIQUE_ID, vCOLUNA20, vCOLUNA21,
vCOLUNA22, vCOLUNA23, vCOLUNA24, vCOLUNA25, vCOLUNA26
FROM TB_TABELA
WHERE COLUNA_UNIQUE_ID = vCOLUNA_UNIQUE_ID;
commit; End Loop;
End loop;
Close CTABELA;
END;
/
Desde já agradeço a ajuda dos prezados.
Abraços.
VaSilva