Pode parecer ingenuidade minha, mas, porque não usar o sequence?

Gabriel Herdt escreveu:
> Pessoal to com um problema. Fiz essa função no meu oracle 10g
> enteprise. em que ele faz um sequence do campo x e da tabela x.
> A função atende muito bem ate um certo numero de dados na tabela
> depois fica muito lento(20.000 registros +).
>
> O que posso fazer para otimizar a rotina?
> Objetivo dela é fazer seqüencia, e no caso de algum código for
> detetado. o próximo cadastrado assuma seu lugar.
>
> FUNCTION FN_NVAGO
>   ( pn_nomeCAM IN VARCHAR2,-- parametro Nome do campo
>     pn_nomeTab IN VARCHAR2,-- parametro Nome da Tabela
>     pr_texto OUT varchar2) -- Paramentro de saida msg de erro
>   RETURN  NUMBER IS
>     ln_cont NUMBER;-- variavel de retorno informando o menor "buraco"
> na sequencia
>     ln_tam NUMBER; -- variavel informando o maior numero da sequencia
>     i NUMBER; -- contador do loop
> BEGIN 
>     pr_texto := '';
>     
> --SQL PARA vereficar maior numero da sequencia do campo e tabela
> infomado por parametro
>     EXECUTE IMMEDIATE 'Select Max('||pn_nomeCAM||') FROM '||pn_nomeTAB
> into ln_tam; 
>     if ln_tam is null then
>         Return 1;
>     end if;
> --For de 1 ate numero maximo de sequencia
>     FOR i IN 1..ln_tam LOOP
>         -- select para localizar "buracos" na sequencia e informar
> menor numero faltando na seq
>         EXECUTE IMMEDIATE 'Select count('||i||') From '||pn_nomeTab||'
> Where '||pn_nomeCAM||' = '||i into ln_cont;
>         IF ln_cont = 0 THEN
>            RETURN i;
>            EXIT;
>         END IF;
>     END LOOP;
>     If ln_cont = 1 THEN -- se nao achar nada pega o maior numero de
> sequencia e somar mais 1
>         return ln_tam+1;
>     end if;
> EXCEPTION
>   WHEN OTHERS THEN
>     ROLLBACK;
>     pr_texto := 'Erro -3000 : Erro ao gerar sequencia';
>     DBMS_OUTPUT.put_line (SUBSTR ('Error ' || TO_CHAR (SQLCODE) || ':
> ' || SQLERRM, 1, 255));
> END;
>
>
>
>   
>> Apostilas » Dicas e Exemplos » Funções » Mundo Oracle » Package » Procedure 
>> » Scripts » Tutoriais acesse: 
>> http://www.oraclebr.com.br/codigo/ListaCodigo.php 
>>     
> --------------------------------------------------------------------------------------------------------------------------
>   
>> Atenção! As mensagens do grupo ORACLE_BR são de acesso público e de inteira 
>> responsabilidade de seus remetentes.
>>     
> Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/ 
> --------------------------------------------------------------------------------------------------------------------------
>   
>> O GRUPO ORACLE_BR TEM SEU PROPRIO ESPAÇO! VISITE: 
>> http://www.oraclebr.com.br/  
>>     
> ------------------------------------------------------------------------------------------------------------------------
>   
> Links do Yahoo! Grupos
>
>  
>
>
>   

Responder a