Ver Mensaje Individual
  #2  
Antiguo 30-12-2008
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Reputación: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
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
   /* Genero el insert */
   sql = 'insert into temp_id (id) (select max('||:CAMPOID||') from '||:TABLA||')';

   /* Borro antes de insertar. */
   /* Si no lo hago podria haber dos valores y dar un error luego (singelton select) */
   delete from temp_id;

   /* Ejecuto el insert */
   execute statement sql;
   
   /* Inicializo contador. Si no se inserta nada, quiero que sea 0 */
   /* De lo contrario, el select siguiente podria tener basura */
   contador=0;

   /* Recupero lo que se ha insertado. El max id de la tabla */
   select id from temp_id 
   into :contador;

   /* Borro el contenido */
   delete from temp_id;

   /* Calculo lo que voy a devolver */
   IF (:CONTADOR=0) THEN NUMREG=1;
      ELSE NUMREG=CONTADOR+1;

   /* Devuelvo valor */
   SUSPEND;
END
Responder Con Cita