Uso de secuencias

Tengo un problema con el siguiente código:
SELECT NEXTVAL FOR nombre_secuencia INTO valor FROM sysibm.sysdummy1
Lo uso en un stored procedure para obtener un numero de folio de diferentes secuencias según se vayan ocupando, la variable nombre secuencia traería el nombre de la secuencia que quiero ocupar, pero al ejecutarlo toma esa variable como el nombre de una secuencia existente, no toma el valor que debe traer esa variable.
También lo intente de la siguiente manera pero sigo con el mismo error:
SET valor = NEXTVAL FOR nombre_secuencia;
¿Alguna sugerencia para este error?
Respuesta
1
No puedes hacer lo que quieres en SQL estático. En estático sólo puedes usar variables en los datos, ya que la sentencia se compila previamente. Para conseguir lo que quieres debes de usar SQL dinámico, ya sea por JDBC en un procedimiento Java, o usando PREPARE y EXECUTE en un procedimiento SQL. No tengo demasiada experiencia en procedimientos almacenados (me dedico más a la administración que al desarrollo), así que no te puedo ayudar más, pero en la documentación de SQL PL seguro que encuentras los detalles.
Otra vez. No conozco los detalles de lo que estas haciendo, pero me parece que te estas complicando un poco. Los objetos de la base de datos deberían ser lo más estáticos posible, y un nombre de objeto no debería ser un parámetro. Además el manejo de secuencias es un poco engorroso a la hora de hacer migraciones, cargas de datos, etc.
Una opción más adecuada para lo que quieres creo que es una tabla con campos nombre y valor (y con un indice en nombre, para que no haya problemas de concurrencia), y un procedimiento que haga:
Begin atomic
UPDATE TABLA SET VALOR=VALOR+1 WHERE NOMBRE=nombre_secuencia
SELECT VALOR-1 FROM TABLA INTO variable WHERE NOMBRE=nombre_secuencia
COMMIT
Así no se obtendrían números repetidos, porque el update bloquea el registro, y no te complicarías en el procedimiento almacenado.
Lo único importante es que las dos líneas han de ejecutarse dentro de una transacción, para que se bloquee la fila hasta el commit.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas