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:
Postar um comentário