terça-feira, 10 de julho de 2007

Verificando se um registro existe (EXISTS function)


Se você precisar saber se um registro existe, a maneira mais comum é a execução do comando abaixo. Se a variável :idexists for maior que zero, o registro existe. (Este é um exemplo de Stored Procedure):

SELECT count(*) FROM company WHERE companyid = :id INTO :idexists;

Mas, o jeito certo de fazer isso é usar a função EXISTS(). Se você usar COUNT(*) o Firebird vai olhar todos os itens para validar a condição (i.e.
companyid = :id).

Se você usar a função EXISTS() o Firebird vai parar de procurar assim que achar um registro que atenda a condição. Isso é muito mais rápido.
idexists = 0;
SELECT 1 FROM rdb$database WHERE EXISTS(SELECT * FROM company WHERE companyid = :id) INTO :idexists;


2 comentários:

Unknown disse...

Muito bom, isso vai dinamizar minhas consultas, Valeu.
Gotaria q me ajudasse nesta questao.


To numa guerra sem fim com Campos Blob's quanto tento grava esse campo, coisa que não acontecia no delphi-7, migrei para o Delphi-2007 ai o bixo pegou - sempre retorna messagem de erro ao gravar texto em campo blob. Mensagem: Project Pris2007.Exe raised execption class TDBXError with message 'Incorrect values within SQLDA structure'.

OBS.:Tabela Cliente Campo Observacao Tipo Blob Sub-Tipo Text
Uso DBExpress q acompanha D2007
+ FireBirde 2.1.0.....

To com o projeto parado neste aspecto preciso de ajuda o + breve Possivel

Codigo:

If Dm_cReceber.SQL_CadCliente.State = dsInsert Then
TextoSQL:='Insert Into CadCliente('+
' OBSERVACAO Values :OBSERVACAO )'
Else
TextoSQL:='Update CadCliente Set '+
' OBSERVACAO=:OBSERVACAO '+
' Where REGISTRO=:REGISTRO ';

With Dm_Conexao.SQLQuery_ALT do
Begin
Close;
SQL.Text:=TextoSQL;
ParamByName('REGISTRO').Asstring := AllTrim(Pad(Dm_cReceber.SQL_CadClienteREGISTRO.Value,6));
ParamByName('OBSERVACAO').AsBlob := Dm_cReceber.SQL_CadCliente.FieldByName('OBSERVACAO').AsString;
Prepared:=True;
ExecSQL;
End;



Everaldo Torres
etsnewsoft@hotmail.com
Feira de Santana -Ba

Unknown disse...

CORREÇÂO:

Gotaria q me ajudassem nesta questao.


To numa guerra sem fim com Campos Blob's quanto tento grava esse campo, coisa que não acontecia no delphi-7, migrei para o Delphi-2007 ai o bixo pegou - sempre retorna messagem de erro ao gravar texto em campo blob. Mensagem: Project Pris2007.Exe raised execption class TDBXError with message 'Incorrect values within SQLDA structure'.

OBS.:Tabela Cliente Campo Observacao Tipo Blob Sub-Tipo Text
Uso DBExpress q acompanha D2007
+ FireBirde 2.1.0.....

To com o projeto parado neste aspecto preciso de ajuda o + breve Possivel

Codigo:

If Dm_cReceber.SQL_CadCliente.State = dsInsert Then
TextoSQL:='Insert Into CadCliente('+
' OBSERVACAO Values :OBSERVACAO )'
Else
TextoSQL:='Update CadCliente Set '+
' OBSERVACAO=:OBSERVACAO '+
' Where REGISTRO=:REGISTRO ';

With Dm_Conexao.SQLQuery_ALT do
Begin
Close;
SQL.Text:=TextoSQL;
ParamByName('REGISTRO').Asstring :=AllTrim(Pad(Dm_cReceber.SQL_CadClienteREGISTRO.Value,6));

ParamByName('OBSERVACAO').AsBlob:=
Dm_cReceber.SQL_CadCliente.FieldByName('OBSERVACAO').AsString;
Prepared:=True;
ExecSQL;
End;



Everaldo Torres
etsnewsoft@hotmail.com
Feira de Santana -Ba

Neobux