Una secuencia es un objeto que permite la generación de valores secuenciales. Dichos valores suelen ser utilizados en claves primarias o claves únicas. Para hacer referencia a los valores de una secuencia Oracle nos provee dos seudocolumnas: CURRVAL y NEXTVAL . Si consultamos la documentación oficial de Oracle, encontramos la siguiente definición: "CURRVAL retorna el valor actual de una secuencia" Pues bien, basándonos en dicha definición, consultemos el valor de una secuencia. SQL> select prueba_currval.currval from dual 2 / select prueba_currval.currval from dual * ERROR at line 1: ORA-08002: sequence PRUEBA_CURRVAL.CURRVAL is not yet defined in this session Error! O la definición es errónea, o estoy haciendo algo mal yo, u Oracle no está funcionando correctamente. Veamos... Al leer el texto del error ORA-08002, veo que Oracle me advierte acerca de la no definición de la seudocolumna dentro de la sesión. Parece ser que la cosa viene por el lado de las sesiones. A continuación incrementaré la secuencia dentro de la misma sesión y luego volveré a consultar la seudocolumna CURRVAL: SQL> select prueba_currval.nextval from dual 2 / NEXTVAL ---------- 1 SQL> select prueba_currval.currval from dual 2 / CURRVAL ---------- 1 Esta vez, todo funcionó correctamente. Veamos ahora qué ocurre cuando trabajo con sesiones concurrentes: Sesion 1 Sesion 2 SQL> select prueba_currval.nextval from dual 2 / NEXTVAL ---------- 2 SQL> select prueba_currval.nextval from dual 2 / NEXTVAL ---------- 3 SQL> select prueba_currval.currval from dual 2 / CURRVAL ---------- 3 SQL> select prueba_currval.currval from dual 2 / select prueba_currval.currval from dual * ERROR at line 1: ORA-08002: sequence PRUEBA_CURRVAL.CURRVAL is not yet defined in this session SQL> select prueba_currval.nextval from dual 2 / NEXTVAL ---------- 4 SQL> select prueba_currval.currval from dual 2 / CURRVAL ---------- 3 SQL> select prueba_currval.currval from dual 2 / CURRVAL ---------- 4 La última fila, nos permite ver que CURRVAL retorna valores distintos en cada sesión. Es decir que CURRVAL no retorna el último valor de la secuencia, sino que retorna el último valor que se obtuvo para la secuencia dentro de la sesión. Luego de hacer estas pruebas con sesiones concurrentes podemos concluir que la documentación de Oracle no es del todo clara a la hora de definir la seudocolumna CURRVAL. Probablemente una mejor definición para CURRVAL habría sido la siguiente: "CURRVAL retorna el último valor obtenido al incrementar una secuencia dentro de una sesión" Nos vemos!
↧