Olá, pessoal!
Neste artigo vamos simular a utilização dos diversos tipos de cursores no Oracle, por final vamos comparar a velocidade destes. Utilizaremos a extração de uma tabela com uma massa de dados de 50 mil registros para que possamos fazer um teste considerável.
01. Criar tabela
Crie a estrutura da tabela
create table TB_PESSOA
(
IDPESSOA INTEGER not null,
NOME VARCHAR2(40) not null,
DATANASCIMENTO DATE not null,
ALTURA NUMBER(5,2),
PESO NUMBER(5,2)
)02. Inserir registros
Vamos inserir 50 mil registros na tabela para criarmos um volume de dados considerável para nossos testes.
declare
v_id_pessoa tb_pessoa.idpessoa%type;
v_nome tb_pessoa.nome%type;
v_dt_nascimento tb_pessoa.datanascimento%type;
begin
v_nome := 'Joao da Silva';
v_dt_nascimento := to_date('01/01/1900');
for dd in 1..50000 loop
select nvl(max(p.idpessoa),0)+1
into v_id_pessoa
from tb_pessoa p;
insert into tb_pessoa(idpessoa,nome,datanascimento) values(v_id_pessoa,v_nome,v_dt_nascimento);
end loop;
end;
commit;
03. Criação dos objetos
Vamos criar as procedures com as seguintes formas de cursores. Vejam que em todas temos as variáveis v_dt_inicio e v_dt_fim, que farão o controle do tempo de processamento da procedure.
3.1. O cursor contido nesta procedure é o mais usual. O cursor de tipo pré-declarado
Procedure PRC_TST_CURSOR
create or replace procedure prc_tst_cursor is
v_dt_inicio timestamp;
v_dt_fim timestamp;
cursor cr_pessoa is select * from tb_pessoa;
v_pessoa cr_pessoa%rowtype;
begin
v_dt_inicio := systimestamp;
open cr_pessoa;
loop
fetch cr_pessoa into v_pessoa;
exit when cr_pessoa%notfound;
null;
end loop;
close cr_pessoa;
v_dt_fim := systimestamp;
dbms_output.put_line('Tempo processamento: '||to_char(v_dt_fim -v_dt_inicio,'dd/mm/yyyy hh24:mi:ss.ff'));
end;3.2. Esta procedure abaixo contém uma forma de cursor bastante utilizada também. O cursor do tipo for é um dos de mais fácil de utilização.
Procedure PRC_TST_FOR
create or replace procedure prc_tst_for is
v_dt_inicio timestamp;
v_dt_fim timestamp;
begin
v_dt_inicio := systimestamp;
for dd in (select p.idpessoa from tb_pessoa p) loop
null;
end loop;
v_dt_fim := systimestamp;
dbms_output.put_line('Tempo processamento: '||to_char(v_dt_fim - v_dt_inicio,'dd/mm/yyyy hh24:mi:ss.ff'));
end;3.3. Nesta procedure abaixo, temos a extração da informação através de um bulk collection. Forma menos usual, alguns front end não suportam este tipo de cursor, que é o caso do FORMS.
Procedure PRC_TST_BULK_COUNT
create or replace procedure prc_tst_bulk_count is
v_dt_inicio timestamp;
v_dt_fim timestamp;
type typ_pessoa is table of tb_pessoa%rowtype;
v_tb_pessoa typ_pessoa;
begin
v_dt_inicio := systimestamp;
select *
bulk collect into v_tb_pessoa
from tb_pessoa;
for dd in 1..v_tb_pessoa.count loop
null;
end loop;
v_dt_fim := systimestamp;
dbms_output.put_line('Tempo processamento: '||to_char(v_dt_fim -v_dt_inicio,'dd/mm/yyyy hh24:mi:ss.ff'));
end;3.4. Nesta procedure abaixo, temos a variação do cursor de bulk collection, onde a diferença está apenas na execução do loop.
Procedure PRC_TST_BULK_FIRST_LAST
create or replace procedure prc_tst_bulk_first_last is
v_dt_inicio timestamp;
v_dt_fim timestamp;
type typ_pessoa is table of tb_pessoa%rowtype;
v_tb_pessoa typ_pessoa;
begin
v_dt_inicio := systimestamp;
select *
bulk collect into v_tb_pessoa
from tb_pessoa;
for dd in v_tb_pessoa.first.. v_tb_pessoa.last loop
null;
end loop;
v_dt_fim := systimestamp;
dbms_output.put_line('Tempo processamento: '||to_char(v_dt_fim - v_dt_inicio,'dd/mm/yyyy hh24:mi:ss.ff'));
end;Fonte: http://imasters.com.br/artigo/12960/oracle/utilizando-cursores-no-oracle
Nenhum comentário :
Postar um comentário