FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
|||
|
|||
Actualizar un valor en un generador desde un Sp
Necesito actualizar el valor de un generador desde un Sp, con un valor que se encuentra en ese generador, algo
CREATE PROCEDURE Actualizar_Codigo DECLARE VARIABLE ValorNuevoGenerador INTEGER; BEGIN ValorNuevoGenerador =GEN_ID(CODIGO, 0)+1; // Que instruccion utilizo para agregar en el Generador Codigo el nuevo valor END;
__________________
SI UN PROBLEMA TIENE SOLUCION, YA NO ES UN PROBLEMA, Y SI NO LA TIENE PARA QUE PREOCUPARSE. |
#2
|
||||
|
||||
Hola,
Código:
SET TERM !! ; CREATE PROCEDURE Establecer_GENERADOR_X ( ParNuevoValor INTEGER) AS DECLARE VARIABLE ValorActual INTEGER; BEGIN /* 1 .. recuperamos el valor actual del generador */ ValorActual = GEN_ID(GENERADOR_X, 0); /* 2 .. fijamos el nuevo valor del generador */ ValorActual = GEN_ID(GENERADOR_X, (:ParNuevoValor) - :ValorActual); END !! SET TERM ; !! Hay una pega, Si DESPUES de recuperar el valor actual del generador (/* 1 .. */) y ANTES de fijar el nuevo valor (/* 2 .. */), otro usuario hiciese "saltar" el generador (hacia delante, o hacia atrás), ya no se podría garantizar que el generador quedará fijado al valor que pasamos como parámetro al procedimiento. Esto es debido a que los generadores (y por extensión la función GEN_ID) no están sujetos al control de la transacción que los modifica. En entornos de un sólo usuario (o que garanticemos que cuando se utilice el procedimiento sólo hay un usuario conectado a la base de datos), el procedimiento funcionará correctamente, en entornos multiusuario no es posible garantizarlo. Saludos. |
#3
|
|||
|
|||
muli, lo que quieres hacer lo puedes hacer de una forma más sencilla así:
CREATE PROCEDURE Actualizar_Codigo BEGIN ValorNuevoGenerador =GEN_ID(CODIGO, 1); END para lo que dice kinobi, en Firebird puedes hacerlo así, de una forma también má sencilla: CREATE PROCEDURE Establecer_GENERADOR_X ( ParNuevoValor INTEGER) AS BEGIN set generator codigo to :parnuevovalor ; END Pero en IB 5.6 la forma de hacerlo es la que dice kinobi. En IB 6.x y posteriores no lo conozco. Un saludo |
#4
|
||||
|
||||
Hola,
Cita:
Saludos. Actualización: he estado revisando el changelog de la versión 1.5 y no hacen mención a que se pueda introducir una sentencia DDL como "SET GENERATOR ..." dentro del código de un procedimiento almacenado. Así que me temo que, salvo que se me haya pasado en el changelog o tú puedas demostrarlo, no es posible fijar el valor de un generador dentro de un procedimiento con "SET GENERATOR ..." tampoco con la versión 1.5 de Firebird. Última edición por kinobi fecha: 11-09-2003 a las 17:49:57. |
#5
|
|||
|
|||
Efectivamente, tienes toda la razón, eso solo va desde una consulta, pero no desde un procedure o un trigger, y siempre en Firebird 1.5
|
#6
|
|||
|
|||
Hago como lo dice Kinobi pero me dice que da error de parsing por SET,
alguien sabe que puede ser |
#7
|
||||
|
||||
ja
es el mismo problema que tengo voy a probar de hacerlo desde un tquery .... Última edición por peccatum fecha: 10-12-2007 a las 04:34:41. |
#9
|
||||
|
||||
genial, si que funciona
gracias! |
|
|
|