PDA

Ver la Versión Completa : Invalid request BLR al modificar un Procedimiento Almacenado


pepon386
23-04-2006, 11:35:14
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:





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
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.