[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