[firebase-br] Deveria retornar NULL mas não
Carlos H. Cantu
listas em warmboot.com.br
Seg Jan 21 14:40:38 -03 2013
Corrigindo e completando minha resposta anterior:
Por algum motivo, eu achava que se o select não retornasse nenhum
registro, então o valor anterior da variável não seria "tocado", mas a
coisa não é bem assim.
O uso de funções de agregação (SUM, AVG, etc) faz com que o select
retorne pelo menos um registro (mesmo que seja um registro "null"). [*]
Sendo assim:
val1 = 1;
select sum(coalesce(numero,0)) from tabela where 1 = 0 into :val1;
Resulta em val1 = null
mas
val1 = 1;
select sum(coalesce(numero,0)) from tabela where 1 = 0 into :val1;
Resulta em val1 = 0
[*] Se o select usar group by, em ambos os casos a variável não seria
alterada, ex:
val1 = 1;
select campo, sum(coalesce(numero,0)) from tabela where 1 = 0 group by campo
into :xcampo, :val1;
Resulta em val1 = 1
[]s
Carlos H. Cantu
www.FireBase.com.br - www.firebirdnews.org
www.warmboot.com.br - blog.firebase.com.br
CHC> Se o select em TmpCb não retornar qualquer registro, então o "into" do
CHC> select não será executado, afinal, não houve registros recuperados.
CHC> Portanto, é sempre bom inicializar as variáveis antes.
CHC> []s
CHC> Carlos H. Cantu
CHC> www.FireBase.com.br - www.firebirdnews.org
CHC> www.warmboot.com.br - blog.firebase.com.br
MR>> Boas,
MR>> Estou a usar o FB2.5+WIN7(+Delphi7), mas para o que me tras chega falar do
MR>> FB2.5 segundo penso. É assim:
MR>> Numa "Store Procedure" estou a ler um ficheiro ordenado por TipoRegisto +
MR>> NoSocio, através de um cursor (While !Eof) e dentro deste tenho um segundo
MR>> While coluna "Socio"=Variavel "WSocio" e !Eof durante o qual analiso:
MR>> Se coluna "StErro"='00'(S/Erro) carrego um ficheiro temporário senão actualizo
MR>> o meu ficheiro de "Cobranças" assinalando apenas a coluna com o Status do erro
MR>> (de 01-a-30).
MR>> Porém, quando rebenta este 2.º ciclo(interno) faço
MR>> bloco-1.
MR>> WTotVlr=NULL;
MR>> WStErro=NULL;
MR>> bloco-2.
MR>> Select Sum(TmpCb.Vlr), TmpCb.StErro From TmpCb Into :WTotVlr, :WStErro,
MR>> seguido de:
MR>>
MR>> bloco-3.
MR>> If (:WTotVlr>0) Then
MR>> begin
MR>> GeraRecibo...
MR>> If (Sucesso) Then
MR>> For Select TmpCb...
MR>> begin
MR>> UpDate Cobrancas Set...
MR>>
MR>> end
MR>> end /* WTotVlr>0 */
MR>> Ora, caso apanhe um único registo em Erro não chego a carregar qualquer
MR>> registo no ficheiro Tmp. Então, ao executar o comando do bloco 2, pela lógica,
MR>> acreditava que a variaveis :WTotVlr e :WStErro fossem afectadas com NULL, mas
MR>> não.
MR>> Depois de alguma luta percebi que o bloco 1 é obrigatório, porque se o
MR>> ficheiro estiver vazio as variáveis não são reinicializadas.
MR>> A minha questão é saber se isto é só assim no FB2.5 porque tanto quando me
MR>> recordo no MS-Sql Server e PostgreSql, nestes casos, as variáveis são sempre
MR>> reafectadas.
MR>> Agradeço qualquer esclarecimento.
MR>> Obrigado
MR>> Mário
Mais detalhes sobre a lista de discussão lista