oracle:index
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revisionNext revisionBoth sides next revision | ||
oracle:index [2010/06/02 10:35] – rlunaro | oracle:index [2011/09/29 13:20] – rlunaro | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== Oracle ====== | ||
- | |||
- | Pues sí, inicio esta página dedicada a truquillos de oracle porque acabo de hacer uno que es lo que mi tío llamaría un "mirlo blanco" | ||
- | |||
- | ====== Poner el valor siguiente (nextval) en un número de secuencia ====== | ||
- | |||
- | Si sois lo suficientemente osados para consultar la [[http:// | ||
- | |||
- | Para más recochineo, el manual dice explicitamente: | ||
- | |||
- | To restart the sequence at a different number, you must drop and re-create it. | ||
- | |||
- | Vamos, que no se les ha olvidado: los muy... lo han hecho aposta. La gente ha ido dándole vueltas al coco y ha dado con una solución a este problema: | ||
- | |||
- | * obtenemos el siguiente valor mediante un select ... into X | ||
- | * ponemos que el incremento de la secuencia es -X | ||
- | * ...y hacemos secuencia.nextval, | ||
- | * ponemos el incremento de la secuencia de nuevo en 1 | ||
- | * y ya está, la secuencia inicializada | ||
- | |||
- | Yo le he dado una vuelta de tuerca a este asunto y he mejorado el script reset_seq que ponían [[http:// | ||
- | |||
- | Sin más, ahí va el script: | ||
- | |||
- | <code plsql> | ||
- | |||
- | |||
- | create or replace procedure reset_seq( p_seq_name in varchar2, p_newnumber in number ) | ||
- | is | ||
- | l_nextval number; | ||
- | l_minus number; | ||
- | l_newnumber number; | ||
- | begin | ||
- | execute immediate | ||
- | ' | ||
- | |||
- | l_newnumber := p_newnumber - 1; | ||
- | l_minus := l_nextval - l_newnumber; | ||
- | |||
- | l_minus := l_minus * -1; | ||
- | |||
- | --dbms_output.put_line( ' | ||
- | --dbms_output.put_line( ' | ||
- | --dbms_output.put_line( ' | ||
- | |||
- | if l_minus <> 0 then | ||
- | |||
- | execute immediate | ||
- | 'alter sequence ' || p_seq_name || ' increment by ' || l_minus || | ||
- | ' minvalue 0'; | ||
- | | ||
- | execute immediate | ||
- | ' | ||
- | | ||
- | execute immediate | ||
- | 'alter sequence ' || p_seq_name || ' increment by 1 minvalue 0'; | ||
- | | ||
- | end if; | ||
- | end; | ||
- | </ | ||
- | |||
- | |||
- | Como veis, tampoco me he matado. Un consejo: si quisieramos ser puristas, no hay porqué suponer que las secuencias se autoincrementan en uno, podrían hacerlo en otro valor. Entonces habría que recuperar el valor de autoincremento antes de cambiarlo y luego restablecerlo por el que hemos almacenado. Pero bueno, con esto era suficiente para mi gestión. | ||
- | |||
- | Espero que os sirva. | ||
- | |||
oracle/index.txt · Last modified: 2022/12/02 22:02 by 127.0.0.1