borrame.com - Colección particular de recortes de código y documentación para programación web

Canales RSS

Lo más fresco

  1. Bookmarklets Nuevo
  2. Recetario básico para CakePHP/2 Nuevo
  3. Certificado auto-firmado Nuevo

Sugerencias del chef

Lo más visitado

  1. Fecha y hora
  2. Dar formato a un número
  3. Reiniciar secuencia
  4. Vaciar un esquema
  5. Certificado auto-firmado
Compartir esta página

Reiniciar secuencia

Este procedimiento permite establecer el próximo número de una secuencia al valor que se desee. Es práctico si queremos limpiar una tabla tras haber estado cacharreando y es imprescindible si hemos insertamos valores con el ID fijado a mano.

CREATE OR REPLACE PROCEDURE RESET_SEQUENCE (     SEQ_NAME IN VARCHAR2,     STARTVALUE IN PLS_INTEGER ) AS     CVAL INTEGER;     INC_BY VARCHAR2(25); BEGIN     /*      * Procedimiento para resetear una secuencia - v2013-03-15      *      * Basado en http://www.psoug.org/reference/sequences.html      *      * Limitaciones:      * - Deja la secuencia como "MINVALUE 0" y "INCREMENT BY 1" aunque no sean los valores originales      */     EXECUTE IMMEDIATE 'ALTER SEQUENCE ' || SEQ_NAME || ' MINVALUE 0';     EXECUTE IMMEDIATE 'SELECT ' || SEQ_NAME || '.NEXTVAL FROM DUAL'     INTO CVAL;     CVAL := CVAL - STARTVALUE + 1;     IF CVAL < 0 THEN         INC_BY := ' INCREMENT BY ';         CVAL:= ABS(CVAL);     ELSE         INC_BY := ' INCREMENT BY -';     END IF;     IF CVAL <> 0 THEN         EXECUTE IMMEDIATE 'ALTER SEQUENCE ' || SEQ_NAME || INC_BY || CVAL;         EXECUTE IMMEDIATE 'SELECT ' || SEQ_NAME || '.NEXTVAL FROM DUAL'         INTO CVAL; /* Si no almacenamos el valor la secuencia no se incrementa :-? */         EXECUTE IMMEDIATE 'ALTER SEQUENCE ' || SEQ_NAME || ' INCREMENT BY 1';     END IF; END RESET_SEQUENCE; /

El 99% del código proviene de PSOUG.org.

Ejemplos de uso

Con el comando EXECUTE (SQL*Plus y compatibles):

-- Limpiar los pedidos de prueba DELETE FROM PEDIDO; EXECUTE RESET_SEQUENCE('PEDIDO_ID_SEQ', 1); -- Crear los roles predeterminados INSERT INTO ROL (ROL_ID, NOMBRE_ROL) VALUES (1, 'admin'); INSERT INTO ROL (ROL_ID, NOMBRE_ROL) VALUES (2, 'editor'); EXECUTE RESET_SEQUENCE('ROL_ID_SEQ', 3);

Con un bloque PL/SQL anónimo (cualquier cliente):

BEGIN     RESET_SEQUENCE('NUMEROS_ID_SEQ', :proximo_valor_secuencia); END;

Historial

v2013-03-15
Corregido un error al fijar a n una secuencia con valuar actual n-1.
v2011-02-09
Primera versión.

Esta página ha sido impresa el sábado 23 de septiembre de 2017 (02:22:25 +0200) desde http://borrame.com/recortes/oracle/reiniciar-secuencia.html. La última vez que miré contenía HTML válido con CSS fresquito y si tiene flatas de ortografía ha sido sin querer.

borrame.com es el sitio anteriormente conocido como bits.demogracia.com (no confundir con Demogracia, que sólo pasaba por ahí).

© 2005-2017 by Álvaro González (alvaro.es) • Burgos (España) • borrame.com