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 > > > > >