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;

sábado, 12 de setembro de 2009

Auto Incremento no SQL Server e MySQL

Usar campos com auto incremento no banco de dados tem várias vantagens, você previne erros de chaves primárias duplicadas e pode se abstrair deste controle nos programas que acessam o banco. Ele funciona da seguinte forma: para cada inserção de registro o banco se encarrega de sempre incrementar um campo de chave primária com um valor seqüencial.

SQL Server

No SQL Server você pode fazer isso através da propriedade IDENTITY, ela recebe dois valores: o primeiro é o valor inicial e o segundo é o valor de incremento, exemplo:

CREATE TABLE DBO.TABELA (
ID INT IDENTITY (1,1) NOT NULL, / inicia em 1 e incrementa de 1 em 1
NOME VARCHAR(50) NULL,
EMAIL VARCHAR(50) NULL,
PRIMARY KEY (ID)
);


Se a tabela já foi criada você pode alterá-la assim:
ALTER TABLE DBO.TABELA ALTER COLUMN ID INT IDENTITY(1,1);

No comando de inserção você não precisará mais referenciar o campo com auto incremento:
INSERT INTO TABELA (NOME, EMAIL) VALUES (‘JOSE DA SILVA’, ‘jose@mail.com’);

Se por alguma razão você precisar reiniciar o auto incremento, os campos Indentity Increment do SQL Server possuem um contador mantido nas tabelas do sistema, para alterar as mesmas deve-se utilizar o comando DBCC. Para reiniciar completamente o contador, iniciando do zero novamente, use:
DBCC CHECKIDENT ('TABELA', RESEED, 0)

Para colocar o ultimo numero utilizado:
DBCC CHECKIDENT (TABELA, RESEED, (SELECT MAX(ID) FROM TABELA))

Para saber qual o valor atual do campo use o comando IDENT_CURRENT():
SELECT IDENT_CURRENT(TABELA) IDENT_INCR (TABELA)

Para saber qual o valor de incremento use IDENT_INCR():
SELECT TABELA, IDENT_INCR(TABELA) AS IDENT_INCR
FROM INFORMATION_SCHEMA.TABLES
WHERE IDENT_INCR(TABELA) IS NOT NULL


Para saber qual foi o valor inicial use IDENT_SEED ():
SELECT TABELA, IDENT_SEED(TABELA) AS IDENT_SEED
FROM INFORMATION_SCHEMA.TABLES
WHERE IDENT_SEED(TABELA) IS NOT NULL


MySQL

O processo é parecido no MySQL, a chave primária recebe a propriedade AUTO_INCREMENT:

CREATE TABLE TABELA (
ID INTEGER NOT NULL AUTO_INCREMENT,
NOME VARCHAR(50) NOT NULL ,
EMAIL VARCHAR(50) NOT NULL ,
PRIMARY KEY (ID)
) TYPE = InnoDB ROW_FORMAT = Default;


Para alterar uma tabela que já existe:
ALTER TABLE TABELA CHANGE ID ID INT AUTO_INCREMENT PRIMARY KEY;

Como você notou, a propriedade tem o valor inicial padrão de auto incremento como 1, e o incremento padrão de 1. Como o MySQL não tem uma função específica para isso, nesse caso para alterar o valor inicial de auto incremento você poderia usar o comando:
ALTER TABLE TABELA AUTO_INCREMENT = 100; / Iniciaria a partir de 100

Para saber qual o último valor do campo use:
SELECT MAX(ID) FROM TABELA;

Mas você deve estar se perguntando: E quanto ao Oracle? O Oracle tem um mecanismo muito eficiente para fazer auto incremento chamado Sequence. Breve estaremos falando deste mecanismo em um post especial.

terça-feira, 8 de setembro de 2009

Inicialização do Oracle

Como primeiro assunto, quero abordar as diferentes formas de se iniciar o Oracle, e para quais situações você deve usar cada uma delas:

Para iniciar a instância (entenda instância como a parte do banco de dados onde os usuários se conectam, ela é composta pela System Global Area e pelos processos SMON, PMON, DBWn, LGWR, CKPT), em primeiro lugar você deve estar conectado ao SQL Plus como um usuário privilegiado (usuário SYS):

C:\> sqlplus "/as sysdba"

O primeiro comando que analisaremos é:

SQL> STARTUP NOMOUNT

Neste estado, a instância é inicializada, os arquivos de parâmetros são lidos (SPFILE.ora ou SPFILE.ora ou init.ora), a SGA e os processos são inciados, porém o banco de dados ainda não esta montado. Somente usuários privilegiados conseguem conctar-se ao banco, este estado é ideal para criar um banco de dados manualmente ou para recuperar os control files.

SQL> STARTUP MOUNT

Usando este comando, a instância é iniciada e os control files (falaremos mais deles em outra ocasião) são validados. Nesse estado a estrutura do banco de dados foi "montada" e já esta disponível, pode-se acessar os datafiles e o redo-online, nesse momento pode-se executar tarefas de manutenção como renomear arquivos de dados, ativar e desativar opções de arquivamento de redo log e recuperar o banco de dados.

SQL> STARTUP OPEN ou apenas STARTUP

Nesse estado, a estrutura do banco de dados já foi verificada e validada, os datafiles e o redo-online são abertos e o banco já pode receber conexões de usuários comuns.

ATENÇÃO: Se você usou um dos comandos acima, para passar para o próximo estágio de incialização você deve usar o comando ALTER DATABASE, exemplo:

Se você entrou no estado NOMOUNT, para passar para o estado MOUNT use:

SQL> ALTER DATABASE MOUNT