oracle:index
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
oracle:index [2011/03/19 19:37] – editor externo 127.0.0.1 | oracle:index [2024/10/05 17:04] (current) – rlunaro | ||
---|---|---|---|
Line 1: | Line 1: | ||
+ | ====== Oracle ====== | ||
+ | |||
+ | Pues sí, inicio esta página dedicada a truquillos de oracle: poner el " | ||
+ | |||
+ | * [[fixhtml|Fix or sanitize HTML code from oracle]] | ||
+ | * [[dsnWithNoPasswordAsking|Configure an ODBC Data Source with no password request]] | ||
+ | * [[meaningOfFullJoin|How does full join work???]] | ||
+ | |||
+ | ====== 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. | ||
+ | |||