Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Modificar auto_increment desde Procedimiento Almac

Estas en el tema de Modificar auto_increment desde Procedimiento Almac en el foro de Mysql en Foros del Web. Buenas noches y muchas gracias de antemano a todos. He empezado en el tema de los procedimientos almacenados y quedría saber si es posible utilizar ...
  #1 (permalink)  
Antiguo 01/07/2009, 16:01
 
Fecha de Ingreso: julio-2009
Mensajes: 6
Antigüedad: 14 años, 9 meses
Puntos: 0
Modificar auto_increment desde Procedimiento Almac

Buenas noches y muchas gracias de antemano a todos. He empezado en el tema de los procedimientos almacenados y quedría saber si es posible utilizar esto:

FETCH cursor1 INTO a;

alter table nombre_tabla auto_increment = a+1;

dentro de un procedimiento almacenado. Lo he probado y me dá error.

Nota: La tabla nombre_tabla contiene datos

También me gustaría saber como se pueden deshabilitar los triggers desde un procedimiento almancenado. Y me imagino que desde un procedimiento almanenado no habrá forma de acceder a las carpetas de un PC, no?

Me puede ayudar alguien? Gracias por vuestro tiempo.
  #2 (permalink)  
Antiguo 01/07/2009, 16:03
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Modificar auto_increment desde Procedimiento Almac

Para usar FETCH tienes que estar usando un CURSOR declarado al inicio, y estar leyendo secuencialmente la tabla con el mismo.
¿Podrías postear el código completo?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 02/07/2009, 00:50
 
Fecha de Ingreso: julio-2009
Mensajes: 6
Antigüedad: 14 años, 9 meses
Puntos: 0
Respuesta: Modificar auto_increment desde Procedimiento Almac

Sí, claro. Primero de todo darte las gracias por tu tiempo e interés.

Te adjunto el código completo:

DELIMITER $$

CREATE PROCEDURE ReOrdenar()
BEGIN


DECLARE done INTEGER DEFAULT 0;
DECLARE a CHAR(10);
DECLARE b INTEGER;
DECLARE c CHAR(255);
DECLARE cur1 CURSOR FOR SELECT id, Identificador FROM tabla_auxiliar;
DECLARE cur2 CURSOR FOR SELECT id FROM tabla_auxiliar;
DECLARE cur3 CURSOR FOR SELECT Max(id) FROM peticiones;


DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;

OPEN cur1;
OPEN cur2;
OPEN cur3;


FETCH cur1 INTO b,a;

REPEAT

UPDATE peticiones SET peticiones.identificador = Concat(Left(peticiones.identificador,4),RTRIM(SUBS TRING(peticiones.identificador,5))-1)
WHERE peticiones.id > b and Left(peticiones.identificador,3)=Left(a,3);

DELETE FROM historico_descripcion WHERE historico_descripcion.id_peticion=b;

FETCH cur1 INTO b,a;

UNTIL done END REPEAT;


FETCH cur2 INTO b;

REPEAT

UPDATE peticiones SET peticiones.id = peticiones.id - 1
WHERE peticiones.id >= b;

UPDATE historico_descripcion SET historico_descripcion.id_peticion = historico_descripcion.id_peticion - 1
WHERE historico_descripcion.id_peticion >= b;

FETCH cur2 INTO b;

UNTIL done END REPEAT;


FETCH cur3 INTO b;

ALTER TABLE peticiones AUTO_INCREMENT=b+1;

DELETE FROM tabla_auxiliar;


CLOSE cur1;
CLOSE cur2;
CLOSE cur3;

END $$

DELIMITER;
  #4 (permalink)  
Antiguo 02/07/2009, 09:07
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Modificar auto_increment desde Procedimiento Almac

Tienes un problema sencillo:
1. Si trabajas cursores en ciclos REPEAT con un flag de sobre un HANDLER, una de dos: O defines un flag para cada REPEAT si están anidados, o bien reinicias el FLAG si son secuenciales.
El problema se da en que cuando completó el primer ciclo el flag vale 1 (uno), y cuando se inicia el segundo REPEAT como entra valiendo 1, solamente ejecuta la primera secuencia y sale.
2. Crear un cursos para que haga
Código sql:
Ver original
  1. SELECT MAX(id) FROM peticiones
no tiene ningun sentido, porque hubiera dado lo mismo que pusieras directamente la sentencia. A fin de cuentas, lo invocas una sola vez.
3. Es bastante posible (no me puse a hacer un análisis detallado) que una importante parte de este procedimiento se pudiese realizar sin cursores. Si se preparan las consultas de modo que hagan un volcado de los datos a tablas temporales, la actualización, los borrados o inserciones se pueden realizar en forma masiva, y no secuenciales, como está planteado.
Luego me fijo con más detalle.

Respecto de los triggers, no conozco forma de desactivarlos, solamente eliminándolos.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 03/07/2009, 00:56
 
Fecha de Ingreso: julio-2009
Mensajes: 6
Antigüedad: 14 años, 9 meses
Puntos: 0
Respuesta: Modificar auto_increment desde Procedimiento Almac

Muchas gracias de nuevo. He modificado el código según tus premisas, pero sigo teniendo problemas en esta parte:

FETCH cur3 INTO b;

ALTER TABLE peticiones AUTO_INCREMENT=b+1;

Que crees que puede pasar?

Te adjunto el código completo. No sé si ya tendré solucionado todos los problemas:


DELIMITER $$

CREATE PROCEDURE ReOrdenar()
BEGIN


DECLARE done1 INTEGER DEFAULT 0;
DECLARE done2 INTEGER DEFAULT 0;
DECLARE done3 INTEGER DEFAULT 0;
DECLARE a CHAR(10);
DECLARE b INTEGER;
DECLARE c CHAR(255);
DECLARE cur1 CURSOR FOR SELECT id, Identificador FROM tabla_auxiliar;
DECLARE cur2 CURSOR FOR SELECT id FROM tabla_auxiliar;
DECLARE cur3 CURSOR FOR SELECT Max(id) FROM peticiones;


DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done1 = 1;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done2 = 1;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done3 = 1;

OPEN cur1;
OPEN cur2;
OPEN cur3;


SET DISABLE_TRIGGERS=1;


WHILE (done1 = 0)

FETCH cur1 INTO b,a;

UPDATE peticiones SET peticiones.identificador = Concat(Left(peticiones.identificador,4),RTRIM(SUBS TRING(peticiones.identificador,5))-1) WHERE peticiones.id > b and Left(peticiones.identificador,3)=Left(a,3);

DELETE FROM historico_descripcion WHERE historico_descripcion.id_peticion=b;

END WHILE;



WHILE (done2 = 0)

FETCH cur2 INTO b;

UPDATE peticiones SET peticiones.id = peticiones.id - 1 WHERE peticiones.id >= b;

UPDATE historico_descripcion SET historico_descripcion.id_peticion = historico_descripcion.id_peticion - 1 WHERE historico_descripcion.id_peticion >= b;


END WHILE;



FETCH cur3 INTO b;

ALTER TABLE peticiones AUTO_INCREMENT=b+1;


DELETE FROM tabla_auxiliar;


CLOSE cur1;
CLOSE cur2;
CLOSE cur3;

SET DISABLE_TRIGGERS=NULL;

END $$

DELIMITER;


Saludos
  #6 (permalink)  
Antiguo 03/07/2009, 02:02
 
Fecha de Ingreso: julio-2009
Mensajes: 6
Antigüedad: 14 años, 9 meses
Puntos: 0
Respuesta: Modificar auto_increment desde Procedimiento Almac

Perdona, con las prisas, el código anterior no era la última versión. Te adjunto el bueno:

DELIMITER $$

CREATE PROCEDURE ReOrdenar()
BEGIN


DECLARE done INTEGER DEFAULT 0;
DECLARE a CHAR(10);
DECLARE b INTEGER;
DECLARE c CHAR(255);
DECLARE cur1 CURSOR FOR SELECT id, Identificador FROM tabla_auxiliar;
DECLARE cur2 CURSOR FOR SELECT id FROM tabla_auxiliar;
DECLARE cur3 CURSOR FOR SELECT Max(id) FROM peticiones;


DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;

OPEN cur1;
OPEN cur2;
OPEN cur3;


SET @DISABLE_TRIGGERS=1;


WHILE (done = 0) DO

FETCH cur1 INTO b,a;

UPDATE peticiones SET peticiones.identificador = Concat(Left(peticiones.identificador,4),RTRIM(SUBS TRING(peticiones.identificador,5))-1) WHERE peticiones.id > b and Left(peticiones.identificador,3)=Left(a,3);

DELETE FROM historico_descripcion WHERE historico_descripcion.id_peticion=b;

END WHILE;


SET @done = 0;


WHILE (done = 0) DO

FETCH cur2 INTO b;

UPDATE peticiones SET peticiones.id = peticiones.id - 1 WHERE peticiones.id >= b;

UPDATE historico_descripcion SET historico_descripcion.id_peticion = historico_descripcion.id_peticion - 1 WHERE historico_descripcion.id_peticion >= b;


END WHILE;



FETCH cur3 INTO b;

ALTER TABLE peticiones AUTO_INCREMENT=b+1;


DELETE FROM tabla_auxiliar;


CLOSE cur1;
CLOSE cur2;
CLOSE cur3;

SET @DISABLE_TRIGGERS=NULL;

END $$

DELIMITER;

Gracias
  #7 (permalink)  
Antiguo 03/07/2009, 02:49
 
Fecha de Ingreso: julio-2009
Mensajes: 6
Antigüedad: 14 años, 9 meses
Puntos: 0
Respuesta: Modificar auto_increment desde Procedimiento Almac

Buenas de nuevo. Siento ser tan pesado. Para el tema de deshabilitar los triggers he leido un artículo en el que comenta que con las variables globales se puede conseguir. Por eso en el códido anterior he metido lo siguiente:

SET @DISABLE_TRIGGERS=1;

y

SET @DISABLE_TRIGGERS=NULL;

y en el trigger que te adjunto abajo he metido lo siguiente:

IF (@DISABLE_TRIGGERS IS NULL) THEN


END IF

pero no logro que funcione. No se muy bien como va el tema de las varibles globales



DROP TRIGGER `peticiones ps`.`Actualizar`//# MySQL ha devuelto un valor vacío (i.e., cero columnas).

CREATE TRIGGER `peticiones ps`.`Actualizar` BEFORE DELETE ON `peticiones ps`.`peticiones`
FOR EACH ROW BEGIN

IF (@DISABLE_TRIGGERS IS NULL) THEN

UPDATE tipos_de_peticiones SET tipos_de_peticiones.cantidad = tipos_de_peticiones.cantidad - 1
WHERE Left(tipos_de_peticiones.identificador,3) = Left(OLD.identificador,3);

INSERT INTO tabla_auxiliar (id, Identificador) VALUES (OLD.id, OLD.Identificador);

END IF;

END
//# MySQL ha devuelto un valor vacío (i.e., cero columnas).

Muchísmas gracias por aguantarme y ayudarme. Saludos
  #8 (permalink)  
Antiguo 03/07/2009, 05:36
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Modificar auto_increment desde Procedimiento Almac

Según entiendo, no te funciona porque @DISABLE_TRIGGERS en tu SP pasa a ser una variable de usuario y no una variable de sistema, la que comienzan con @@.
En esencia, el ejemplo que estás poniendo de esa variable puede ser de Sybase o MS SQL Server, pero no es de MySQL.
Lo que sí existe es la proposición en los grupos de desarrollo de implementarla para la versión del Server 7.0 (MySQL Cluster), pero no hay datos de que esté en desarrollo o implementación de prueba (ver detalle en: http://forge.mysql.com/worklog/task.php?id=2825#).
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 22:39.