[firebase-br] Procedure que Verifica se Existe o Registro na Tabela - Duvidas de Iniciante

Eduardo Resek eresek em yahoo.com.br
Seg Jul 18 21:38:19 -03 2005


Almir Fiorio wrote:

> Amigos
>
> Resolvi! Consegui com a juda do amigo Rafael Cabral
>
> A minha procedure ela exclui o produto da tabela
> e se nao existir o produto ele mostra uma exception!!
>
> ele me ajudou usando o count, mas gostaria de saber se tem soucao mais 
> simples
>
> ficou assim , exemplo  :
>
> CREATE PROCEDURE proc_del
>    (ID INTEGER)
> AS
> DECLARE VARIABLE QUANT INTEGER;
> BEGIN
>    SELECT COUNT(ID) FROM TABELA WHERE ID = :ID INTO :QUANT
>    IF (QUANT = 0) THEN
>        EXCEPTION <NOME DA EXCEPTION>
>    ELSE
>        DELETE FROM TABELA WHERE ID = :ID
>
>------------------------------------------------------------------------
>
>______________________________________________
>FireBase-BR (www.firebase.com.br) - Hospedado em www.bavs.com.br
>Para editar sua configuração na lista, use o endereço http://mail.firebase.com.br/mailman/listinfo/lista_firebase.com.br
>Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>
SELECT COUNT    não é uma boa idéia, pois o firebird vai varre todos os 
registros para efetuar a contagem. No seu caso basta verificar se existe 
UM registro, o que pode ser feito assim:

CREATE PROCEDURE proc_del
   (ID INTEGER)
AS
BEGIN
   IF (EXISTS (SELECT 1 FROM TABELA WHERE ID= :ID )) THEN
       DELETE FROM TABELA WHERE ID = :ID ;
   ELSE
       EXCEPTION <NOME DA EXCEPTION> ;
END

A diferença é que, desse modo, ao encontrar o primeiro registro que 
satisfaz à condição (e que deve ser o único, pois ID é chave primária, 
correto?), a busca já é encerrada e a próxima instrução é executada. Com 
o count, mesmo depois de encontrado o registro com a ID pretendida, a 
busca continua até que todos os registros da tabela tenham sido 
verificados. Numa tabela muito populada, isto pode fazer uma diferença 
considerável.

Eduardo Resek




Mais detalhes sobre a lista de discussão lista