 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
Tor Master


Registrado: 22 Mar 2005Mensajes: 269Ubicación: obera, misiones, argentina
|
Publicado: Vie 03 Dic, 2010 3:11 am Asunto: procedure |
|
|
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 |
|
 |
Tor Master


Registrado: 22 Mar 2005Mensajes: 269Ubicación: obera, misiones, argentina
|
Publicado: Vie 03 Dic, 2010 3:46 pm Asunto: |
|
|
Ya lo resolví , 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
El procedure
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 |
|
 |
|
|
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
|
© 2002–2026 Club Builder · Funciona con phpBB.
|