Creo que esto se puede solucionar con una tabla temporal (temp_id) y la sentencia execute statement.
Lo que hago es insertar el max(campoID) en la tabla temporal y luego hacer un select de ese campo.
Finalmente, lo borro.
Código SQL
[-]CREATE PROCEDURE OBTENER_MAXIMO(
TABLA VARCHAR(50) CHARACTER SET NONE COLLATE NONE,
CAMPOID VARCHAR(50) CHARACTER SET NONE COLLATE NONE)
RETURNS(NUMREG INTEGER)
AS
DECLARE VARIABLE CONTADOR INTEGER;
declare variable sql varchar(1024);
BEGIN
sql = 'insert into temp_id (id) (select max('||:CAMPOID||') from '||:TABLA||')';
delete from temp_id;
execute statement sql;
contador=0;
select id from temp_id
into :contador;
delete from temp_id;
IF (:CONTADOR=0) THEN NUMREG=1;
ELSE NUMREG=CONTADOR+1;
SUSPEND;
END