A Idéia
No MySQL há dois recursos muito interessantes que são o AUTO_INCREMENT e o ZEROFILL.
O AUTO_INCREMENT que como o próprio nome sugere, incrementa automaticamente a cada INSERT. Esse recurso também está disponível no PostgreSQL (serial) e no MS SQL Server (identity).
Já o ZEROFILL, preenche com zeros à esquerda. Algo do tipo: 27 -> 00027.
No Oracle
No Oracle essas coisas, lógico, também são possíveis. Mas darão um pouco mais de trabalho.
Vamos construir um exemplo em que, numa tabela de funcionarios há um campo chamado id_funcionario, o qual é a matrícula de um colaborador contendo 5 dígitos, e, em casos que o número de dígitos seja inferior a 5, será preenchido com zeros, por exemplo: 00352. E também esse número será incrementado a cada
INSERT para fazermos o “AUTO_INCREMENT”.
Criação da tabela
CREATE TABLE tb_funcionarios(
id_funcionario CHAR(5),
nome_funcionario VARCHAR(30),
CONSTRAINT pk_funcionario PRIMARY KEY (id_funcionario)
);
Até então nada de muito especial, talvez o fato do campo de identificação ser CHAR e não INT… A resposta pra isso é muito simples; ninguém soma matrículas
SEQUENCES – Criando uma sequência
São Objetos que armazenam sequências numéricas:
CREATE SEQUENCE sq_funcionario START WITH 1 INCREMENT BY 1 NOMAXVALUE;
Relacionando a Sequência com a Tabela através de um Gatilho
CREATE OR REPLACE TRIGGER tg_id_funcionario BEFORE INSERT ON tb_funcionarios
FOR EACH ROW
BEGIN
SELECT lpad(sq_funcionario.nextval,5,’0′) INTO :NEW.id_funcionario FROM DUAL;
END;
A Função lpad
No Oracle, qualquer consulta necessita de um “FROM” para poder funcionar, então foi usada a tabela DUAL (para maiores informações procure no SQL Reference por “Selecting from the DUAL Table”).
A função “lpad” no caso teve três parâmetros respectivamente: o número, quantidade de dígitos e caractere para preencher à esquerda. Veja um exemplo prático:
SELECT lpad(352,5,’0′) FROM DUAL;
Retornou: 00352
E por fim, vamos inserir algumas coisas na tabela para testar
INSERT INTO tb_funcionarios (nome_funcionario) VALUES (‘Chiquinho da Silva’);
INSERT INTO tb_funcionarios (nome_funcionario) VALUES (‘Astrogilda Santos’);
INSERT INTO tb_funcionarios (nome_funcionario) VALUES (‘Estroncio Veiga’);
INSERT INTO tb_funcionarios (nome_funcionario) VALUES (‘Wolframia Costa’);
INSERT INTO tb_funcionarios (nome_funcionario) VALUES (‘Teobaldo Castro’);
INSERT INTO tb_funcionarios (nome_funcionario) VALUES (‘Equinocia Tavares’);
INSERT INTO tb_funcionarios (nome_funcionario) VALUES (‘Gisevalda Almeida’);
INSERT INTO tb_funcionarios (nome_funcionario) VALUES (‘Gioconda Ramires’);
INSERT INTO tb_funcionarios (nome_funcionario) VALUES (‘Berília Rocha’);
INSERT INTO tb_funcionarios (nome_funcionario) VALUES (‘Adergildo Sales’);
INSERT INTO tb_funcionarios (nome_funcionario) VALUES (‘Criptonio Dias’);
INSERT INTO tb_funcionarios (nome_funcionario) VALUES (‘Rubidio Jose’);
Obs.: Nomes fictícios, qualquer semelhança com a realidade é mera coincidência
O resultado
SELECT * FROM tb_funcionarios;
Conclusão
O resultado final foi obtido através de relacionamento entre objetos, no qual um gatilho (TRIGGER) é acionado quando um INSERT é feito na tabela e
faz com que o valor inserido para o campo “id_funcionario” seja automaticamente incrementado, pegando o próximo número da sequência e o preenchendo com zeros à esquerda.