hice este script como no he encontrado un script de línea fija que dinámicamente todos mis secuencias a la corriente más alta de identificación. Probado en Oracle 11.2.0.4.
DECLARE
difference INTEGER;
sqlstmt VARCHAR2(255) ;
sqlstmt2 VARCHAR2(255) ;
sqlstmt3 VARCHAR2(255) ;
sequenceValue NUMBER;
sequencename VARCHAR2(30) ;
sequencelastnumber INTEGER;
CURSOR allseq
IS
SELECT sequence_name, last_number FROM user_sequences ORDER BY sequence_name;
BEGIN
DBMS_OUTPUT.enable(32000) ;
OPEN allseq;
LOOP
FETCH allseq INTO sequencename, sequencelastnumber;
EXIT
WHEN allseq%NOTFOUND;
sqlstmt := 'ALTER SEQUENCE ' || sequencename || ' INCREMENT BY ';
--Assuming: <tablename>_id is <sequencename>
sqlstmt2 := 'select (nvl(Max(ID),0) - :1)+1 from ' || SUBSTR(sequencename, 1, LENGTH(sequencename) - 3) ;
--DBMS_OUTPUT.PUT_LINE(sqlstmt2);
--Attention: makes use of user_sequences.last_number --> possible cache problems!
EXECUTE IMMEDIATE sqlstmt2 INTO difference USING sequencelastnumber;
IF difference > 0 THEN
DBMS_OUTPUT.PUT_LINE('EXECUTE IMMEDIATE ' || sqlstmt || difference) ;
EXECUTE IMMEDIATE sqlstmt || difference;
sqlstmt3 := 'SELECT ' || sequencename ||'.NEXTVAL from dual';
DBMS_OUTPUT.PUT_LINE('EXECUTE IMMEDIATE ' || sqlstmt3 || ' INTO sequenceValue') ;
EXECUTE IMMEDIATE sqlstmt3 INTO sequenceValue;
DBMS_OUTPUT.PUT_LINE('EXECUTE IMMEDIATE ' || sqlstmt || 1) ;
EXECUTE IMMEDIATE sqlstmt || 1;
DBMS_OUTPUT.PUT_LINE('') ;
END IF;
END LOOP;
CLOSE allseq;
END;
Estoy luchando con la forma de hacer el paso 3, he probado varias sintaxis diferentes pero no puedo hacer que funcione – AJM
La intención del paso 3 es simplemente comparar el valor de PK más grande con el siguiente valor de secuencia. Entonces, por ejemplo, si el SELECT del paso 1 resultó en un resultado de 100, y el SELECT del paso 2 resultó en un resultado de 90, lo que significa que tiene 11 secuencias de "jump". Cuando modifique la secuencia en el paso 4, SELECCIONAR en el paso 5 moverá los valores de la secuencia 10 a 100. Después de reiniciar el incremento en el paso 6, el siguiente "SELECCIONAR PK_SEQ.NEXTVAL DE DUAL" le dará 101. – dpbradley
In paso 4 No puedo obtener la sintaxis para hacer una resta en la cláusula Incrementar por. Probé [a-b] a-b y selecr a-b desde dual, pero no con éxito. – AJM