Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Invalid request BLR al modificar un Procedimiento Almacenado (https://www.clubdelphi.com/foros/showthread.php?t=30905)

pepon386 23-04-2006 11:35:14

Invalid request BLR al modificar un Procedimiento Almacenado
 
Hola a todos! No se si es muy normal, pero me he encontrado un problema bastante extraño que es fácil de reproducir: Tengo una base de datos de Firebird con un procedimiento almacenado que genera contadores. Pues bien, hasta hace poco funcionaba correctamente, sin ningún problema, hasta que he necesitado hacer un pequeño cambio en dicho procedimiento. Para ello realicé los cambios pertinentes, y al intentar hacer un commit me lanzó el siguiente error:
ISC ERROR CODE: 335544343
ISC ERROR MESSAGE: invalid request BLR at offset xxx bad parameter number

Ahora no me permite volver al código inicial del procedimiento almacenado, siempre me lanza la misma excepción.

La versión de Firebird que tengo instalada es la 1.5.3, aunque previamente tenía la 1.5.2 (ya me daba este error) y la actualicé para ver si se solucionaba.
Para editar la base de datos uso Marathon 3.0.0.50

Para poder reproducir el error os pongo el script para generar la base de datos:




Código SQL [-]
SET SQL DIALECT 3;
/*===========================================================================*/
/*Connect to Database */
/*===========================================================================*/
create database 'c:\Datos\TEST.FDB' user 'SYSDBA' password '';
 
/*===========================================================================*/
/*Domain Definitions */
/*===========================================================================*/
create domain CONTADOR as integer default 0 not null;
create domain DESCRIPCION as varchar(40) character set ISO8859_1 default '' collate ISO8859_1;
create domain FACTURA as integer default 0 not null;
create domain SERIE_FAC as varchar(5) character set ISO8859_1 default '' not null collate ISO8859_1;
create domain TIPO_CONT as varchar(5) character set ISO8859_1 default '' not null collate ISO8859_1;
 
/*===========================================================================*/
/*Table Definitions */
/*===========================================================================*/
/*Table: CONTADORES*/
create table CONTADORES(
  TIPO TIPO_CONT collate ISO8859_1,
  SERIE SERIE_FAC collate ISO8859_1,
  CONTADOR CONTADOR);
 
/*Table: SERIES*/
create table SERIES(
  SERIE_FAC SERIE_FAC collate ISO8859_1,
  DESCRIPCION DESCRIPCION collate ISO8859_1,
  PRIMERA_FAC FACTURA);
 
commit work;
set autoddl off;
set term ^;
create procedure PR_NUEVO_CONT (I_SERIE varchar(5) character set ISO8859_1, 
  I_TIPO varchar(5) character set ISO8859_1)
returns (O_CONTADOR integer)
as
begin exit; end
^
commit work^
alter procedure PR_NUEVO_CONT (I_SERIE varchar(5) character set ISO8859_1, 
  I_TIPO varchar(5) character set ISO8859_1)
returns (O_CONTADOR integer)
as
begin
  SELECT CONTADOR
    FROM CONTADORES
    WHERE SERIE = :I_SERIE AND TIPO = :I_TIPO
    INTO O_CONTADOR;
  IF (O_CONTADOR IS NULL) THEN
  BEGIN
    INSERT INTO CONTADORES
      (TIPO, SERIE, CONTADOR)
    VALUES
      (:I_TIPO, :I_SERIE, 0);
    O_CONTADOR = 0;
    IF (I_TIPO = 'FRA') THEN
    BEGIN
      SELECT PRIMERA_FAC
        FROM SERIES
        WHERE SERIE_FAC = :I_SERIE
        INTO O_CONTADOR;
      IF (O_CONTADOR > 0) THEN
        O_CONTADOR = (O_CONTADOR - 1);
    END
  END
  O_CONTADOR = ( O_CONTADOR + 1 ) ;
  UPDATE CONTADORES
    SET CONTADOR = :O_CONTADOR
    WHERE TIPO = :I_TIPO AND SERIE = :I_SERIE;
  suspend;
end
^
 
commit work^
set autoddl on^
set term ;^

Osorio 26-04-2006 00:32:09

Mira este post
 
Puede ser esto mismo.

Bueno es una posibilidad.


http://www.clubdelphi.com/foros/showthread.php?t=18277

Saludos,

pepon386 26-04-2006 08:52:48

Gracias por el enlace, ya lo había leído, pero no ivan por ahí los tiros. Digo "ivan" porque ayer por fin descubrí la causa del error: Estoy acostumbrado a generar las bases de datos de Firebird con la aplicación Marathon (disponible en SourceForge) y hasta ahora no me había dado ningún problema, pero después de darle vueltas y darme cuenta de que si generaba la base de datos directamente desde un script no me fallaba (esto lo hago con la aplicación IBOConsole), y después de hacer varias pruebas, descubrí que el fallo está en la aplicación Marathon, que por alguna razón no modifica correctamente el procedimiento almacenado.


La franja horaria es GMT +2. Ahora son las 00:35:05.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi