Ha sido un poco difícil llegar a esto, pero tuve que quitar todo el código posible para saber dónde estaba el error. Si alguien está dispuesto, esta es una invitación para que creen la siguiente table y el siguiente procedimiento almacenado:
Código:
CREATE TABLE "Tempo"(
"Auto" INTEGER NOT NULL PRIMARY KEY,
"Value" VARCHAR(6)
);
CREATE GENERATOR "Tempo_Auto";
SET GENERATOR "Tempo_Auto" TO 0;
CREATE TRIGGER "TAutoInc_Tempo" FOR "Tempo"
BEFORE INSERT
POSITION 0
AS BEGIN
NEW."Auto" = GEN_ID("Tempo_Auto", 1);
END;
Código:
CREATE PROCEDURE "EvalExpr" (
in_value VARCHAR(6))
RETURNS(
out_result DECIMAL(18, 4))
AS
DECLARE VARIABLE expr VARCHAR(256);
DECLARE VARIABLE segexpr VARCHAR(32);
DECLARE VARIABLE autoinc INTEGER;
BEGIN
FOR
SELECT "Auto"
FROM "Tempo"
WHERE "Value" = :in_value
ORDER BY "Auto"
INTO :autoinc
DO BEGIN
segexpr = CAST(autoinc AS VARCHAR(32));
expr = STRCAT(expr, segexpr);
END
out_result = 1;
SUSPEND;
END
Ahora, hay que hacer algunos registros en la tabla "Tempo", digamos unos 30 o más (yo hice cerca de 200 registros).
Luego, los eliminamos:
DELETE FROM "Tempo";
Volvemos a registrar unos cuantos que tengan el mismo valor, por ejemplo '000000'. Así la tabla podría verse más o menos así:
Código:
Auto Value
---- ----
35 000000
36 000000
37 000000
38 000000
39 000000
40 000000
41 000000
42 000000
43 000000
44 000000
45 000000
46 000000
...
Ahora, se ejecuta el SP:
select out_result from "EvalExpr"('000000');
y voy a hablar de la línea:
expr = STRCAT(expr, segexpr);
Cuando hay menos de 27 registros en la tabla con el valor '000000' no hay problema. Si hay 27 registros o más...
Se causa el error del que pensaba era causado por una referencia circular.
Si se cambia la línea mencionada, digamos por:
expr = STRCAT(expr, '**');
El problema desaparece, pero debe ser claro que esta línea es sumamente importante, casi el objeto del procedimiento almacenado, ya que en ella se construye una expresión que luego debe ser evaluada (en el ejemplo no se ve esto con claridad).
¿ Lo que estoy haciendo es muy importante... y me encontré con esto!
¿ ES UN BUG DE INTERBASE ?
He hecho muchas pruebas, de muchas formas, y la verdad lo único que me falta es probar con otra función para concatenar. La función STRCAT que estoy usando es la proporcionada junto a InterBase, librería udflib.dll.
Hubiese probado otra función pero no la he encontrado. Si alguien me pudiera ayudar agradecería mucho su colaboración.
por si acaso, la función externa está declarada tal y como se especifica en la documentación, así:
DECLARE EXTERNAL FUNCTION STRCAT
VARCHAR(255) CHARACTER SET NONE, VARCHAR(255) CHARACTER SET NONE
RETURNS CSTRING(80) CHARACTER SET NONE FREE_IT
ENTRY_POINT 'fn_strcat' MODULE_NAME 'udflib';