Saber utilizar una SEQUENCE (Secuencia en español) de Base de Datos en PL-SQL Procedures en Oracle te permitirá obtener valores correlativos únicos, los que puedes utilizar en tus aplicaciones para resolver rápidamente situaciones donde necesites manejar números secuenciales que sean únicos.
Una SEQUENCE en tus PL-SQL Procedures en Oracle generalmente se utiliza para crear el valor del campo ID o llave primaria de una tabla el que debe ser un valor único que nunca debe estar repetido, también una secuencia se usa para asignar el número de folio o número de orden para algún documento en particular que se desee crear en tus PL-SQL Procedures en Oracle.
Una secuencia se crea de la siguiente forma:
/* PL-SQL Procedures en Oracle */
CREATE SEQUENCE SQ_EMPLEADO
START WITH 1
MAXVALUE 9999999999
MINVALUE 1
NOCYCLE
NOCACHE
NOORDER;
Con este comando se está creando una secuencia para la tabla T_EMPLEADO, la que comienza con el valor 1 (START WITH) y puede llegar hasta 9999999999 (MAXVALUE), una vez que llega al máximo vuelve a iniciarse en 1. Revisemos algunos ejemplos para ver como se utiliza una SEQUENCE en tus PL-SQL Procedures en Oracle:
Ejemplo #1: Supone que debes asignar un valor único para el campo ID de una tabla cada vez que se inserte un nuevo registro, veamos cómo se hace:
/* PL-SQL Procedures en Oracle */
Insert into t_empleado ( id_empleado, rut, dv, nombre, direccion, id_departamento)
values( sq_empleado.nextval, pin_rut, pst_dv, pst_nombre, pst_direccion, pin_id_depto);
En este ejemplo se inserta un registro a la tabla t_empleado y se obtiene el valor del campo id_empleado desde la secuencia sq_empleado con el atributo nextval, el que permite en tus PL-SQL Procedures en Oracle obtener el siguiente número de una secuencia.
TÚ REPORTE: “Cómo Construir un SELECT Eficiente en ORACLE en Solo 7 Pasos”
Ejemplo #2: Supone que debes crear un número de folio único para un tipo de documento que debes crear, veamos cómo se hace:
/* PL-SQL Procedures en Oracle */
Select sq_folio.nextval into lin_num_folio from dual;
Update t_documento
Set num_folio = lin_num_folio
Where id_empleado = pin_id_empleado;
En este ejemplo de PL-SQL Procedures en Oracle se obtiene el número del folio desde la secuencia sq_folio con el atributo nextval para obtener el valor siguiente y finalmente se graba en el campo num_folio de la tabla t_documento.
Te propongo que pruebes de inmediato este ejemplo en tu Base de Datos con tus propios PL-SQL Procedures en Oracle y PL-SQL Function en Oracle, para que comiences a ejercitar la mano y aprendas a dominar esta nueva técnica en tus PL-SQL Packages en Oracle.
Estoy muy interesado en conocer tu opinión y/o comentario sobre este artículo, también cuéntame sobre qué es lo que quieres saber de PL-SQL Procedures en Oracle y/o dime cuál es tu principal frustración a la hora de trabajar con PL-SQL Procedures en Oracle. Estaré muy atento respondiendo tus preguntas y/o comentarios, gracias.
Saludos
Roberto Vicencio – Escritor del Reporte:
“Cómo Construir un SELECT Eficiente en ORACLE en Solo 7 Pasos”
Gracias
De nada Walter, gracias por comunicarte.
Saludos
Roberto Vicencio – Para Tu Éxito con Oracle.
Como solucionas el problema, al momento de una caída en el insert el cual incrementara la secuencia, pero al no hacer el insert me aumentara en 1 el valor secuencial, haciendo que queden números saltados, el cual afectaría en el caso que este campo se ocupe como un numero de folio tenga que ser correlativo sin saltos entre números.
Hola Pablo, gracias por comunicarte, una Sequence se recomienda ser usada para generar los ID de una tabla, pero para asignar un número de folio lo mejor es tener una tabla de parámetros con un campo folio el que debes incrementar solo si el insert se ejecuto correctamente, de esa forma tu folio quedará correlativo.
PD: Si por algun motivo te perdiste el seminario sobre ‘SELECT de Múltiples Tablas’, ahora puedes ver la grabación en diferido la que estará disponible SOLO por unos días, tengo una oferta especial para ti, puedes acceder GRATIS desde aquí:
https://dominatuspackagesen0racle.com/v/seminario-smt
Saludos
Roberto Vicencio – Para Tu Éxito con Oracle.
Deseo hacer un procedimiento en donde se ingrese el nombre de la secuencia y me devuelva el valor que se incremento para ese utilizarlo luego en un java, hice algo asi pero no me funciona, se te ocurre algo??
create or replace
PACKAGE BODY PKG_NUEVA_SECUENCIA AS
PROCEDURE PRO_SEC_MAS(nombreSecuencia IN VARCHAR2, numeroSecuencia OUT NUMBER)
–RETURN NUMBER
Is
sqlSecuencia VARCHAR2(1000);
BEGIN
sqlSecuencia := ‘Select ‘||nombreSecuencia||’.NextVal’||’ into :numeroSecuencia from dual’;
–SELECT miSecuencia.nextval FROM dual
–Select decode(sqlSecuencia,null,’*’, not null, ||sqlSecuencia) into numSecuencia from dual;
— esto es lo que se debe hacer
–Select SEQ_PROVEEDOR_JDE.NextVal into numSecuencia from dual;
EXECUTE IMMEDIATE sqlSecuencia;
commit;
END;
END PKG_NUEVA_SECUENCIA;
Hola Anthenoge, gracias por comunicarte, para que te funcione correctamente debes dejar en Into fuera del Excecute Inmediate de esta forma:
sqlSecuencia := ‘Select ‘||nombreSecuencia||’.NextVal’||’ from dual’;
EXECUTE IMMEDIATE sqlSecuencia into numeroSecuencia ;
Te aconsejo sacar el commit ya que no es necesario para obtener una secuencia.
PD: Ya obtuviste el libro Gratis sobre ‘Cómo Construir un SELECT Eficiente en Oracle en Solo 7 Pasos’, si aun no lo has hecho puedes obtenerlo desde aquí: https://dominatuspackagesen0racle.com/
Saludos
Roberto Vicencio – Para Tu Éxito con Oracle.
Estimado
Necesito manipular la secuencia de oracle para que esta se reinicie cada dia. Debito a que este numero lo concateno con la fecha por que de nos ser asi mi secuencia me crece de manera indefinida.
Necesito el comando que me permita hacer eso?
Gracias por tu pronta ayuda
Hola Sinedinilo, gracias por comunicarte, no existe un comando que reinicie una secuencia, para reiniciarla cada día primero debes borrarla y crearla nuevamente, puedes agendar un job que haga esa tarea. Pero puedes hacerlo mas fácil sin usar una secuencia, te recomiendo que ocupes la fecha mas la hora, así obtendrás un numero único.
Saludos
Roberto Vicencio – Para Tu Éxito con Oracle.
Buenos días presento un inconveniente o no se si es un comportamiento normal en mi base de datos estoy utilizando SEQUENCE y la tengo estructurada tal como en el ejemplo, pero se me están generando saltos en los números del campo ID es decir el correlativo, es normal este comportamiento? a que pude deberse el comportamiento? Gracias por todo el apoyo que me puedan dar, saludos.
Hola Humberto, gracias por comunicarte, una secuencia se incrementa en 1 cada vez que se ejecuta nextval, es decir, que si se producen saltos de números puedes tener por ahí otro nextval; Los comportamientos extraños no existen en Oracle, siempre hay algo que los produce y se debe encontrar ese algo, gracias.
PD: Ya pudiste ver mi libro reporte sobre ‘Cómo Crear un SELECT Eficiente en ORACLE en Solo 7 Pasos’, si aun no lo tienes en tus manos puedes obtenerlo desde aquí: https://dominatuspackagesen0racle.com/
Saludos
Roberto Vicencio – Para Tu Éxito con Oracle.
Pregunta:
Uso un SEQUENCE en el Insert de una tabla en 2 procedures diferentes pero de pronto me di cuenta que ya no está insertando y me di a la tarea de revisar el tema y me encontré con esto:
SELECT MAX(llave_primaria) = 8002
Es decir, el max de mi llave primaria que es asignada con el sequence es 8008
pero al revisar el codigo del SEQUENCE me da esto:
next value = 846
Esta situacion se da cuando otro usuario en otro proceso usa un procedure e inserta en la misma tabla a la cual está asignado el SEQUNCE.
Sugerencia?
Gracias.
Hola Jorge, gracias por comunicarte, puede que sea un problema en la creación de la secuencia, te sugiero que borres la secuencia y la crees nuevamente con el formato que muestro en el artículo y lo pruebas.
PD: Si te ha gustado lo que has visto del blog te invito a compartir el enlace https://dominatuspackagesen0racle.com/ con tus amigos o personas que también les pueda interesar ver esta información, gracias.
Saludos
Roberto Vicencio – Para Tu Éxito con Oracle.
Buen día …
Requiero foliar pero el folio debe ser construido por 2 dígitos iguales para todos el siguiente difiere de acuerdo a la especialidad y 4 consecutivos ejemplo
0920001 el 2 se refiere a la especialidad
0920002
0930001 el 3 se refiere a otra especialidad
pero todos deben ir en el mismo campo de nombre folio o por lo menos dentro de la misma tabla.
espero se entienda mi ejemplo…
Hola Miriam, gracias por comunicarte, en este caso la secuencia puedes usarla para el número correlativo y los demás números deben ir fijos y/o variables según corresponda:
lst_esp:= 2;
Select ’09’||lst_esp||sq_folio.nextval into lin_num_folio from dual;
PD: Ya pudiste ver mi libro reporte sobre ‘Cómo Crear un SELECT Eficiente en ORACLE en Solo 7 Pasos’, si aun no lo tienes en tus manos puedes obtenerlo gratis desde aquí: https://dominatuspackagesen0racle.com/
Saludos
Roberto Vicencio – Para Tu Éxito con Oracle.