[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