sábado, 23 de maio de 2009

Cursor com parâmetros em PL/SQL

View this post in English

Aqui vou mostrar outra técnica para trabalhar com cursores em PL/SQL. Eu tive que fazer um trabalho recentemente onde isso foi muito útil: Cursores que aceitam argumentos.

As maiores vantagem de usar queries parametrizadas no banco de dados é que o servidor não precisa fazer o parse e traçar um plano de execução (ele só faz isso na primeira vez que a query é executada) e ela fica certa em tempo de compilação (ao contrário das queries em string que nós só sabemos se há um erro de sintaxe em tempo de execução).

Dito isso vamos a um exemplo:

cursor ProdutoCursor(pnome in varchar2) is
    select *
    from produto
    where nome like pnome;


Legal, não? A sintaxe fica muito parecida com uma procedure. E o método de abrir o cursor também é legal:

open ProdutoCursor('A%');


Aqui vai abrir o cursor trazendo todos os produtos onde o nome começa com a letra 'A'.

Podemos ainda criar um rowtype a partir deste cursor:

prod ProdutoCursor%rowtype;


Agora vou criar um script para juntar tudo:

declare
    -- Cursor
    cursor ProdutoCursor(pnome in varchar2) is
        select *
        from produto
        where nome like pnome;

    -- Para loop simples
    prod ProdutoCursor%rowtype;

    -- Para loop com bulk collect
    type Tprods is table of ProdutoCursor%rowtype;
    prods Tprods;
    i integer;

begin
    -- Loop simples
    open ProdutoCursor('A%');
    loop
        fetch ProdutoCursor into prod;
        exit when ProdutoCursor%notfound;
        -- comandos a serem executados com o registro prod
        DBMS_OUTPUT.put_line(prod.nome);
    end loop;
    close ProdutoCursor;

    -- Loop com bulk collect
    open ProdutoCursor('A%');
    fetch ProdutoCursor bulk collect into prods;
    for i in prods.first .. prods.last loop
        -- comandos a serem executaos com o registro prods(i)
        DBMS_OUTPUT.put_line(prods(i).nome);
    end loop;
    close ProdutoCursor;
end;


Muito legal, né? Até a próxima.

Nenhum comentário:

Postar um comentário

 
BlogBlogs.Com.Br