Ver Mensaje Individual
  #2  
Antiguo 06-07-2003
Avatar de mlara
[mlara] mlara is offline
Miembro Premium
 
Registrado: jun 2003
Ubicación: Colombia
Posts: 667
Reputación: 24
mlara Va por buen camino
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';
__________________
...y mañana caminaré por las calles pasando inadvertido, como siempre.
Responder Con Cita