[firebase-br] Deveria retornar NULL mas não

Gladiston Santana gladiston em vidy.com.br
Seg Jan 21 09:50:01 -03 2013


O padrão SQL atual diz que qualquer operação envolvendo nulo retorna nulo,
mesmo usando agregadores, então muito cuidado com o SUM.
No caso do firebird, em select com atribuição de valores (select var1, var2
from tabela into :lvar1,:lvar2) se não houver dados não haverá atribuição
de valor e as variaveis :var1 ficarão com o valor que foram inicializados,
nem mesmo nulo recebem. Assim, tome a cautela :
1- inicializar o valor das variáveis sempre, eu já declaro assim : declare
variable lvar integer=0 para não esquece-la. Dentro de loops é interessante
inicializa-las novamente antes de iniciar um sub-loop .
2- no select usar coalesce() para prevenir-se dum nulo em meio aos
registros, geralmente atribuindo zero em operações com agregadores (sum).
e opcionalmente, apos o select, algum tratamento para valores nulos pode
ser indicado : if (:var 1 is null) then ... Para ser sincero resolvo isso
com domains fazendo um tipo numerico não receber nulo e ao declarar uma
variavel numa sp essa variavel tambem tem o mesmo tipo da domain, assim
ocorrem exception se ocorrerem nulos na expressão, erros são ruins, mas
previne somas erradas.

Se o que você quer fazer é uma leitura sequencial semelhante ao
que fazíamos com o cobol com quebras, essa é minha recomendação, até porque
os cursores no firebird só andam para frente.


Gladiston Santana
Departamento de TI
Grupo Vidy
Tel (11) 4787-3122 ramal 228
Rod. Régis Bittencourt 3360 - Km 272,5
Taboão da Serra - SP - CEP: 06793-000
Visite nosso site: www.vidy.com.br
Visite também : www.expolabor.com.br




Em 20 de janeiro de 2013 11:35, Mário Reis <mariodosreyx em gmail.com>escreveu:

> Boas,
>
> Estou a usar o FB2.5+WIN7(+Delphi7), mas para o que me tras chega falar do
> FB2.5 segundo penso. É assim:
>
> Numa "Store Procedure" estou a ler um ficheiro ordenado por TipoRegisto +
> NoSocio, através de um cursor (While !Eof) e dentro deste tenho um segundo
> While coluna "Socio"=Variavel "WSocio" e !Eof durante o qual analiso:
> Se coluna "StErro"='00'(S/Erro) carrego um ficheiro temporário senão
> actualizo
> o meu ficheiro de "Cobranças" assinalando apenas a coluna com o Status do
> erro
> (de 01-a-30).
>
> Porém, quando rebenta este 2.º ciclo(interno) faço
>
> bloco-1.
>   WTotVlr=NULL;
>   WStErro=NULL;
>
> bloco-2.
>  Select Sum(TmpCb.Vlr), TmpCb.StErro From TmpCb Into :WTotVlr, :WStErro,
> seguido de:
>
> bloco-3.
>    If (:WTotVlr>0) Then
>     begin
>       GeraRecibo...
>       If (Sucesso) Then
>        For Select TmpCb...
>         begin
>          UpDate Cobrancas Set...
>
>         end
>     end /* WTotVlr>0 */
>
> Ora, caso apanhe um único registo em Erro não chego a carregar qualquer
> registo no ficheiro Tmp. Então, ao executar o comando do bloco 2, pela
> lógica,
> acreditava que a variaveis  :WTotVlr e :WStErro fossem afectadas com NULL,
> mas
> não.
> Depois de alguma luta percebi que o bloco 1 é obrigatório, porque se o
> ficheiro estiver vazio as variáveis não são reinicializadas.
>
> A minha questão é saber se isto é só assim no FB2.5 porque tanto quando me
> recordo no MS-Sql Server e PostgreSql, nestes casos, as variáveis são
> sempre
> reafectadas.
>
> Agradeço qualquer esclarecimento.
>
> Obrigado
>
> Mário
>
>
> ______________________________________________
> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
> Para saber como gerenciar/excluir seu cadastro na lista, use:
> http://www.firebase.com.br/fb/artigo.php?id=1107
> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>



Mais detalhes sobre a lista de discussão lista