terça-feira, 29 de setembro de 2009

SEQUENCE: Auto Incremento no Oracle

Agora que você já sabe como fazer auto incremento no SQL Server e MySQL, vamos explicar como isso funciona no Oracle.
O Oracle é um pouco diferente pois ele utiliza um objeto chamado Sequence, a sintaxe para criação deste objeto é a seguinte:
CREATE SEQUENCE EXEMPLO_SEQUENCE
START WITH 1
INCREMENT BY 1
MAXVALUE 99999
CYCLE
CACHE 10
ORDER;


Vejamos o que este comando faz, em primeiro lugar você especifica o nome da seqüência (EXEMPLO_SEQUENCE), em seguida você deve informar alguns parâmetros:
START WITH
Aqui você informará qual será o valor inicial da sequência, no caso estamos iniciando em 1.
INCREMENT BY
Define qual será o incremento da sequência, nesse caso estamos incrementando de 1 unidade.
MAXVALUE
Este será o valor máximo que a sequência alcancará, se você não definir nenhum valor, ele assumirá o valor padrão NOMAXVALUE que na verdade indica um valor máximo de 999999999999999999999999999. Caso você esteja usando decremento use MINVALUE.
CYCLE
Determina que a sequencia será reiniciada ao chegar no valor máximo (o padrão é NOCICLE).
CACHE
Especifica a quantidade de valores que será carregada no buffer (o padrão é 20), serve para melhorar a performance de acesso, caso você não queira usar esta propriedade mude para NOCACHE.
ORDER

Garante que a sequência será gerada em ordem de requisição, em algumas situações esta opção é muito útil, se você não especificar esta opção, a sequencia assumirá o padrão NOORDER.

Você deve ter notado que o objeto foi criado sem estar vinculado a uma tabela em particular, pois esta é a maior diferença em relação aos outros bancos de dados. Cada SEQUENCE é um objeto independente dentro do banco de dados, isso pode ser muito vantajoso pois um único objeto SEQUENCE pode ser reutilizado em várias tabelas do banco de dados, economizando tempo e trabalho. Assim para inserir dados usando SEQUENCE, você deve incluir o objeto no seu comando INSERT, exemplo:
INSERT INTO EXEMPLO_TABELA (CODIGO, NOME, EMAIL)

VALUES (EXEMPLO_SEQUENCE. NEXTVAL,’José da Silva’, ‘jose@mail.com’);

Como você deve ter notado, é preciso usar a função NEXTVAL para obter o próximo valor da sequencia. Veja um exemplo de UPDATE usando esta função:
UPDATE EXEMPLO_TABELA
SET CODIGO = EXEMPLO_SEQUENCE.NEXTVAL
WHERE CODIGO = 1017;


Se no entanto você quisesse saber qual é o valor atual da sequencia, você deveria usar a função CURRVAL, que retornaria o valor atual da sequencia:
SELECT EXEMPLO_SEQUENCE.CURRVAL FROM DUAL;

No entanto existem algumas restrições, CURRVAL e NEXTVAL não podem ser usados nas seguintes situações:
• Em uma subquery.
• Em uma query de uma view.
• Em um comando SELECT com o operador DISTINCT.
• Em um comando SELECT com uma clausula GROUP BY ou ORDER BY.
• Em um comando SELECT que esteja sendo combinado com outro SELECT através dos operadores UNION, INTERSECT, ou MINUS.
• Na clausula WHERE de um comando SELECT.
• Como o valor DEFAULT de uma coluna em um commando CREATE TABLE ou ALTER TABLE.
• Como condição de uma restrição CHECK.

Para verificar os parâmetros de uma sequência use o comando:
SELECT SEQUENCE_NAME, INCREMENT_BY, MAX_VALUE, LAST_NUMBER FROM USER_SEQUENCES;
Como você pôde notar, a tabela USER_SEQUENCES guarda informações sobre todas as sequências.


Para alterar os parâmetros de uma sequência, use o comando:
ALTER SEQUENCE EXEMPLO_SEQUENCE
START WITH 2
INCREMENT BY 2
CACHE 5;


Para excluir uma sequencia, use o comando:
DROP SEQUENCE EXEMPLO_SEQUENCE;

Uma dica: para alterar o valor final de uma sequencia você pode alterar o ultimo valor executando o comando ALTER SEQUENCE. Por exemplo, se o ultimo valor usado pelo Oracle for 50 e quisermos alterar para 105, devemos usar a seguinte sequencia de comandos:
ALTER SEQUENCE EXEMPLO_SEQUENCE
INCREMENT BY 54;
SELECT EXEMPLO_SEQUENCE.NEXTVAL FROM DUAL;
ALTER SEQUENCE EXEMPLO_SEQUENCE
INCREMENT BY 1;

O próximo valor usado pela sequência será então o 105.

Outra dica: para reiniciar uma sequencia para um valor predeterminado, por exemplo de 100 para 50:
ALTER SEQUENCE EXEMPLO_SEQUENCE
INCREMENT BY -50;
SELECT EXEMPLO_SEQUENCE.NEXTVAL FROM DUAL;
ALTER SEQUENCE EXEMPLO_SEQUENCE
INCREMENT BY 1;

0 comentários:

Postar um comentário