[firebase-br] Como prevenir o erro "Arithmetic exception, numeric overflow, or string truncation. string right truncation."

Gladiston Santana gladiston em vidy.com.br
Qua Ago 10 17:45:38 -03 2016


Há varias maneiras de se criar uma variavel para ser usada numa procedure,
o que eu disse anteriormente era usar parametros de tamanhos generosos
então digamos que minha tabela FOO o campo codigo seja 30 caracteres,
descricao 40 e cep 8:

create or alter procedure sp_foo (
  p_codigo varchar(255) = '',
  p_descricao varchar(255) = '',
  p_cep varchar(255))
returns (
    result_value smallint)
as
begin
  result_value=0;
  p_codigo=left(:p_codigo,30); -- pode usar cast em outras ocasiões
  p_descricao=left(iif(:p_descricao<>'',:p_descricao,'(parmetro
esquecido)'), 60); -- pode mudar um valor que ficaria vazio
  p_cep=left(replace (:p_cep ,  '-', ''),8); -- pode remover characteres
indesejados
  (...)
  insert into FOO(codigo, descricao, cep) values (:p_codigo, :p_descricao,
:p_cep);
  (...)
end;

Digamos que queira dar uma exception quando estrapolar o tamanho:

create or alter procedure sp_foo (
  p_codigo varchar(255) = '',
  p_descricao varchar(255) = '',
  p_cep varchar(255))
returns (
    result_value smallint)
as
begin
  result_value=0;
  if (octet_length(p_codigo) > 30) then
  begin
     exception ERR 'O campo codigo aguardava tamanho de 30, mas recebeu
'||octet_length(p_codigo) ||' caracteres.';
     suspend;
     exit;
  end
  (...)

end;


É isso.

Agora, ao fazer isso, você perderá a versatilidade que esse modelo te traz,
claro que quando ocorre o famoso "Arithmetic exception, numeric overflow,
or string truncation. string right truncation." pensamos nisso como um erro
a ser corrigido, mas eu penso nele como 'o que foi que eu deixei passar'.
Se eu desligo isso, estou abrindo mão de saber onde estãos os erros no lado
cliente, já que os estou consertando na procedure.

inte+




Em 9 de agosto de 2016 16:01, Luciano franca <luapfirebird em yahoo.com.br>
escreveu:

> E como seria essa SP  você poderia me mostar uma SP simples apenas
> disparando um Exception caso o tamanho da String seja maior que o campo
> pois em meus testes aqui a SP funciona igual a Trigger e não consegue ser
> disparado antés de dar o erro "Arithmetic Exception"
>
>
> Em Terça-feira, 9 de Agosto de 2016 8:57, Gladiston Santana <
> gladiston em vidy.com.br> escreveu:
>
>
> Do mesmo jeito que já vem fazendo, veja um exemplo:
>
>   m:=TFDQuery.Create(Self);
>   m.Connection:=q1.Connection;
>   m.SQL.Clear;
>   m.SQL.Add('SELECT result_value FROM SP_CLASSIFICACAO_CV(');
>   m.SQL.Add(QuotedStr(Operacao)+',');  // INCLUIR,ALTERAR,EXCLUIR,
> CONSULTAR
>   m.SQL.Add(QuotedStr(CLASSIFICACAO.Text)+',');
>   m.SQL.Add(QuotedStr(tipo_cv.Text)+',');
>   m.SQL.Add(QuotedStr(Trim(DESCRICAO.text))+',');
>   m.SQL.Add(QuotedStr(TEXTO_EXPLICATIVO.Lines.Text)+',');
>   m.SQL.Add(FBSQLNUMBER(PERC_PIS_COFINS.Value,2)+',');
>   m.SQL.Add(FBSQLNUMBER(PERC_LUCRO.Value,2)+',');
>   m.SQL.Add(QuotedStr(SimNao(se_servicos.Checked,'-','S','N'))+',');
>   m.SQL.Add(QuotedStr(SimNao(SE_RT.Checked,'-','S','N'))+',');
>   m.SQL.Add(QuotedStr(SimNao(SE_RT_ENGENHARIA.Checked,'S','S','N'))+',');
>   m.SQL.Add(QuotedStr(SimNao(STATUS.Checked,'-','C','A'))+');');
>   try
>     m.open;
>     sResult:=m.FieldbyName('result_value').AsString;
>     Result:=(sResult<>'');
>     if not Aplicado
>       then Aplicado:=Result;
>     if Assigned(q1.Connection) then
>     begin
>       if q1.Connection.InTransaction
>         then q1.Connection.CommitRetaining;
>     end;
>   except
>   on e:exception do
>      begin
>         ExibeErro('Erro ao executar o procedimento:',e.message,m.
> SQL.Text);
>      end;
>   end;
>   m.Close;
>   FreeAndNil(m);
>
> Se puder ser parametrizada do jeito que você faz melhor ainda.
> Outra vantagem que não mencionei são as permissões, você dá permissão do
> usuário à procedure, e não precisa se preocupar com as permissões do
> usuários às tabelas envolvidas. Claro que dará permissão às tabelas à
> procedure, mas isso se faz uma única vez e tais grant podem ficar em forma
> de comentário dentro da procedure caso precise aplicá-las novamente.
>
>
>


-- 
--
B em B@BU     iB em M@B.  B em MBBO   MBBMMB em B@BZLr    E@@@@i      r@@@BU
vB em M@O     E em B@Bu   BBBM em 0   G em MMM@N8MBB em ZP5r  B em B@k      8B@@O
 OB em B@q   2 em BBBM    B em B@BO   BB em B@B,.:,7B em B@@L uB em B@,    OB em B@.
 ,@@@B@   @BBB@,    @BBB em 8   M em M@@@     PB em B@B  @@@BN   iB em B@L
  U em B@B2 LB em B@X     B em MBBO   MBBM em B     i em BBB@. 7 em B@Bi  B em B@E
   B@@@BiM em M@B.     @BBM em G   M em MMB@     v@@M em B,  G em B@Z v em B@B.
   7B em B@O em B@B5      B em B@B8   BBBM em B     Z@@@B@   iB@@@2 em B@Br
    NB em M@B em B8       @B em B@8   M em B@B em i:i75 em B@B em r    E@@B em B@Bq
    . em B@@@B@:       B em B@B@   @B@@@B em B@B@@@ME;     .BB em MBB@
     55.ANOS        OMOGBS   PBZGGOOMOO117,        7 em BBB@r
     ==============================================r@@@@F=====
     Gladiston Santana                             8 em B@B,
     Supervisor de TI                             G em B@B7
     Tel.:+551147873122 R:228                    :@B em B0
     Grupo VIDY - SGQ ISO9001 - 55 ANOS          @B em B@.
     Visite nosso site: www·vidy·com·br         BB@@@u
     Visite também : www·expolabor·com·br      GB em B@N



Mais detalhes sobre a lista de discussão lista