terça-feira, 29 de setembro de 2009
SEQUENCE: Auto Incremento 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
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
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
