No era necesaria la tabla. Veamos el siguiente SP:
Código:
ALTER PROCEDURE "EvalExpr"
RETURNS(
out_expr VARCHAR(256))
AS
DECLARE VARIABLE i DECIMAL(18, 4);
DECLARE VARIABLE expr VARCHAR(256);
DECLARE VARIABLE segexpr VARCHAR(32);
BEGIN
expr = '';
i = 0;
WHILE (i < 34) DO BEGIN
segexpr = CAST(i AS VARCHAR(32));
expr = expr || segexpr;
segexpr = '+';
expr = expr || segexpr;
i = i+1;
END
out_expr = expr;
SUSPEND;
END
En este procedimiento se produce el mismo error cuando se cuenta hasta i < 34. Si se suenta hasta i < 33 no hay error.
Claro, la variable i es decimal(18, 4) y tiene como mínimo 6 caracteres al ser convertida a varchar, así si i = 0 tenemos que cast(i as varchar(32)) = '0.0000'. cuando se cuenta hasta i < 33 se tienen exactamente 254 caracteres, valor justo por debajo del
tamaño de la variable expr.
Sucede que cuando un procedimiento tiene mucho más código, como InterBase no retorna el punto exacto donde está el error, pues la depuración es ardua y engorrosa, pero ahí vamos.