Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

procedure

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Bases de Datos
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: procedure Responder citando

Hola foro, hoy me trae por aquí un procedure, haber si alguien puede darme una pista, pues a mi se me esta liando-

Realice un procedure para generar id auto incrementales y que complete si existe algún hueco en la secuencia de id, el problema es que me esta devolviendo un null

Código:
SET TERM ^ ;
CREATE PROCEDURE P_TUSER_GEN_ID RETURNS (NEW_ID INTEGER) AS
DECLARE VARIABLE TMP_ID INTEGER;
DECLARE VARIABLE MAX_ID INTEGER;
BEGIN
   TMP_ID=1;
   SELECT MAX(ID) FROM TUSERS INTO :MAX_ID;
   MAX_ID = MAX_ID + 1;
   WHILE(TMP_ID < MAX_ID) DO
      BEGIN
         SELECT ID FROM TUSERS WHERE ID=:TMP_ID INTO :NEW_ID;
         IF(NEW_ID IS NULL) THEN
            BEGIN
               NEW_ID = TMP_ID;
               SUSPEND;
               EXIT;
            END
         ELSE TMP_ID = TMP_ID + 1;
      END
   END ^
SET TERM ; ^


Creo que mi error esta en sintaxis pero no puedo resolverlo.
Es probable que si existen una gran cantidad de tuplas en la tabla, este método se degrade por cuestiones de eficiencias, pero en este caso la tabla nunca tendrá mas de 100 registros, gracias.
saludos tor.
_________________
Un experto es aquel que ya ha cometido todos los errores posibles en una materia muy concreta.
(Niels Bohr)
Volver arriba
Ver perfil de usuario Enviar mensaje privado MSN Messenger
Mensaje    Asunto: Responder citando

Ya lo resolví Very Happy, pongo la solución en caso que alguien este interesado.
Código:
SET TERM ^ ;
CREATE PROCEDURE P_TUSERS_ID RETURNS (NEW_ID INTEGER) AS
DECLARE VARIABLE TMP_ID INTEGER;
DECLARE VARIABLE MAX_ID INTEGER;
BEGIN
   TMP_ID=0;
   SELECT MAX(ID) FROM TUSERS INTO :MAX_ID;
   MAX_ID = MAX_ID + 1;
   WHILE(TMP_ID < MAX_ID) DO
      BEGIN
         TMP_ID = TMP_ID + 1;
         SELECT ID FROM TUSERS WHERE ID=:TMP_ID INTO :NEW_ID;
         IF(NEW_ID <> TMP_ID) THEN
            BEGIN
               NEW_ID = TMP_ID;
               TMP_ID = MAX_ID;
            END
      END
      SUSPEND;
      EXIT;
   END ^
SET TERM ; ^

Y la forma de usar dentro de un trigger seria
Código:
SET TERM ^ ;
CREATE TRIGGER T_TUSERS_BIO FOR TUSERS
BEFORE INSERT AS
   BEGIN
      IF (NEW.ID = 0) THEN EXECUTE PROCEDURE P_TUSERS_ID RETURNING_VALUES NEW.ID;
      IF (NEW.ID IS NULL)   THEN EXECUTE PROCEDURE P_TUSERS_ID RETURNING_VALUES NEW.ID;
      IF (NEW.NOMBRE IS NULL) THEN
         EXCEPTION E_TUSER_NO_NOMBRE;
      NEW.NOMBRE = UPPER(NEW.NOMBRE);
    END ^
CREATE TRIGGER T_TUSER_BUO FOR TUSERS
BEFORE UPDATE AS
   BEGIN
      NEW.ID = OLD.ID;
      IF (NEW.NOMBRE IS NULL) THEN EXCEPTION E_TUSERS_NO_NOMBRE;            
   END ^
SET TERM ; ^


Como aclaración:
La tabla se llama
Cita:
TUSERS

El procedure
Cita:
P_TUSERS_ID

Hay dos trigger uno para la inserción y otro para la actualización
Cita:
T_TUSER_BIO
T_TUSER_BUO

Hay una excepción que se dispara si intentan cargar un registro sin nombre, me faltaría agregarle TRIM a este campo.

saludos tor.
_________________
Un experto es aquel que ya ha cometido todos los errores posibles en una materia muy concreta.
(Niels Bohr)
Volver arriba
Ver perfil de usuario Enviar mensaje privado MSN Messenger
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.