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;
create database 'c:\Datos\TEST.FDB' user 'SYSDBA' password '';
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;
create table CONTADORES(
TIPO TIPO_CONT collate ISO8859_1,
SERIE SERIE_FAC collate ISO8859_1,
CONTADOR CONTADOR);
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 ;^