Novo valor para SEQUENCE

segunda-feira, 18 de janeiro de 2010

Após criar uma sequence e a utilizar por um bom tempo (Nome_SQ.nextval), tive a necessidade de deixar o valor atual da sequence idêntico ao da base de produção.

De cara tentei um ALTER na sequence:



ALTER SEQUENCE Nome_SQ MINVALUE 1 MAXVALUE 9999999999 START WITH 45562;



Mas isso não funcionou. O ALTER pode ser usado para alterar outros parâmetros de uma sequence. O valor inicial não é permitido. Então o jeito seria dropar e recriar o objeto ajustando o parâmetro START WITH.

Então, no mundo ideal com permissão DML, faria o seguinte:



DROP SEQUENCE Nome_SQ;

CREATE SEQUENCE Nome_SQ MINVALUE 1 MAXVALUE 9999999999 INCREMENT BY 1 START WITH 45562 NOCYCLE ;



Masssss, o fato é que eu não tinha permissão DML. Então, o que fazer?

Resolvi criar um bloco anônimo com um processo de looping para atingir o valor necessário e incrementá-lo à sequence via NEXTVAL:



DECLARE
x NUMBER;
y NUMBER := 45562;

BEGIN
SELECT Nome_SQ.currval into x from dual;
WHILE x < y LOOP
SELECT Nome_SQ.nextval into x from dual;
END LOOP;
END;





SELECT Nome_SQ.currval from dual;

CURRVAL
----------------------

455632



Isso só funcionou porque precisava posicionar o valor da sequence para um valor maior que o atual. Se precisasse diminuir o valor, não teria jeito, eu ou o DBA de plantão teria que dropar e recriar o objeto.


Uma boa referência está no próprio site da Oracle: http://download.oracle.com/docs/cd/B13789_01/server.101/b10759/statements_6014.htm

0 comentários: