Uma Sequence é um objeto de banco de dados encontrado nos bancos de dados Oracle e IBM DB2, que permite a geração automática de valores, tais como números de identificação. Sequências são ideais para a tarefa de gerar valores de chaves únicas. Os aplicativos podem usar sequências para evitar possíveis problemas de simultaneidade e de desempenho resultantes de valores de coluna. A vantagem que tem sobre as sequências de números criados fora do banco de dados é que o servidor de banco de dados mantém o registro dos números gerados e nenhum tipo de acidente no banco de dados causará números duplicados.
Identity é encontrado no banco de dados Micosoft SQL Server e é muito similar ao Sequence e possui o mesmo objetivo que é de criar números sequenciais, porem não é um objeto do banco de dados e sim uma propriedade de uma coluna pertencente a uma tabela. Quando você insere um valor em uma tabela que possui uma propriedade Identity você deve excluir o campo referente a esta coluna da clausula SQL, sendo assim o MSSQL Server é o único banco de dados que permite que a quantidade de colunas na linha Values da instrução Insert seja diferente da quantidade de colunas na tabela do banco de dados.
Para saber mais detalhes sobre os recursos dos objetos Sequences ou da propriedade Identity recomendamos que você utilize os links oficiais de cada banco de dados:
Oracle: Sequence
IBM DB2: Sequence
MSSQL Server: Identity
Algo extremamente útil sobre Sequence ou Identity
Utilizar um objeto ou uma propriedade auto incremento é o método correto para criar IDs automáticos no banco de dados, nunca utilize uma Trigger para executar este procedimento, pois deste modo você esta reduzindo sensivelmente a performance do banco de dados, visto que você precisa de acessos e objetos extras para executar a mesma função.
Para valores de Sequence ou Identity que são utilizados fora do banco de dados, por exemplo, números de sequência usados para identificadores externos (números de cheques bancários ou outros), se o banco de dados é recuperado para um ponto no tempo antes de uma falha, então isso poderia causar a geração de valores duplicados para algumas sequências. Para evitar possíveis valores duplicados, bancos de dados que usam valores de sequência fora do banco de dados não deve ser recuperado para um ponto anterior no tempo.
Conectando ao Oracle, DB2 e MSSQL
Para criar a conexão com os três bancos de dados você precisa configurar seu projeto com os Providers externos de cada um dos fabricantes, você encontra um tutorial de como criar as conexões em nossas categorias SQL e Java
Exemplo:
Neste exemplo utilizamos uma Sequence para os bancos de dados Oracle e IBM DB2 e uma propriedade Identity para o banco de dados MSSQL para criar identificadores automáticos para a coluna chave de uma tabela.
SQL
Oracle
-- Cria sequencia CREATE SEQUENCE Sequencia_seq START WITH 1 INCREMENT BY 1 NOCACHE NOCYCLE; -- Cria tabela CREATE TABLE SEQUENCIA ( Identificador NUMBER(10), Nome VARCHAR(30), Sobrenome VARCHAR(70), Cargo VARCHAR(30), Salario Decimal(9,2)); -- Testa sequencia insert into SEQUENCIA VALUES (Sequencia_seq.NEXTVAL ,'Teste','Teste Sobrenome','Programador',2234.56); -- verifica resultado SELECT * FROM SEQUENCIA
IBM DB2
-- Cria Sequencia CREATE SEQUENCE Sequencia_seq START WITH 1 INCREMENT BY 1 NOCACHE NOCYCLE; -- Cria tabela CREATE TABLE SEQUENCIA ( Identificador INTEGER, Nome VARCHAR(30), Sobrenome VARCHAR(70), Cargo VARCHAR(30), Salario Decimal(9,2)); -- Testa Sequencia insert into SEQUENCIA VALUES (Sequencia_seq.NEXTVAL ,'Teste','Teste Sobrenome','Programador',2234.56); -- Verifica resultado Select * from SEQUENCIA;
MSSQL
-- Cria tabela / Identity CREATE TABLE SEQUENCIA( Identificador int IDENTITY(1,1) NOT NULL, Nome nvarchar(30) NULL, Sobrenome nvarchar(70) NULL, Cargo nvarchar(30) NULL, Salario decimal(9, 2) NULL); -- Testa identação insert into SEQUENCIA VALUES ('Teste','Teste Sobrenome','Programador',2234.56); -- Verifica tabela select * from SEQUENCIA;
Java
import java.awt.Container; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.sql.Statement; import java.util.Vector; import javax.swing.BorderFactory; import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.ButtonGroup; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JRadioButton; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.table.DefaultTableModel; public class Sequence implements ActionListener, ItemListener { // Cria componentes private JTable tabela; private JRadioButton banco1; private JRadioButton banco2; private JRadioButton banco3; private JButton botao; // Declara objetos de conexão private static Connection conn; private static Statement query; private static String bancodedados; public void conectar(String login, String senha) { // Verifica strings de conexão // ORACLE if (bancodedados == "oracle") { try { // Define Driver de conexão JDBC thin Class.forName("oracle.jdbc.driver.OracleDriver"); conn = DriverManager.getConnection( "jdbc:oracle:thin:@localhost:1521:xe", login, senha); // Executa pedido SQL query = conn.createStatement(); } catch (ClassNotFoundException ex) { ex.printStackTrace(); } catch (SQLException ex) { ex.printStackTrace(); } } // DB2 if (bancodedados == "db2") { try { // Define Driver de conexão JDBC Class.forName("com.ibm.db2.jcc.DB2Driver"); conn = DriverManager.getConnection( "jdbc:derby:net://localhost:50000/deva", login, senha); // Executa pedido SQL query = conn.createStatement(); } catch (ClassNotFoundException ex) { ex.printStackTrace(); } catch (SQLException ex) { ex.printStackTrace(); } } // MICROSOFT SQL SERVER if (bancodedados == "mssql") { try { // Define Driver de conexão JDBC String URL = "jdbc:sqlserver://localhost\\SQLEXPRESS:1433;databaseName=devaberto" + ";user=" + login + ";password=" + senha; Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); conn = DriverManager.getConnection(URL); // Executa pedido SQL query = conn.createStatement(); } catch (ClassNotFoundException ex) { ex.printStackTrace(); } catch (SQLException ex) { ex.printStackTrace(); } } } public void executaSQL(String sql) { // Cria nova instrução SQL Statement trigger; ; try { trigger = conn.createStatement(); trigger.execute(sql); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public ResultSet retornaTabela() throws SQLException { // Cria nova instrução SQL Statement query; query = conn.createStatement(); String sql; // Verfica banco de dados e passa script SQL sql = "SELECT * FROM SEQUENCIA"; // Executa Script ResultSet dados = query.executeQuery(sql); // Retorna set de dados return dados; } // Modelo public static DefaultTableModel criaTableModel(ResultSet rs) throws SQLException { // Cria um modelo de tabela ResultSetMetaData metaData = rs.getMetaData(); // Retorna as colunas Vector<String> colunas = new Vector<String>(); int columnCount = metaData.getColumnCount(); for (int column = 1; column <= columnCount; column++) { colunas.add(metaData.getColumnName(column)); } // Retorna dados Vector<Vector<Object>> dados = new Vector<Vector<Object>>(); while (rs.next()) { Vector<Object> vector = new Vector<Object>(); for (int columnIndex = 1; columnIndex <= columnCount; columnIndex++) { vector.add(rs.getObject(columnIndex)); } dados.add(vector); } return new DefaultTableModel(dados, colunas); } public void itemStateChanged(ItemEvent arg0) { // Verifica item banco de dados selecionado Object fonte = arg0.getItemSelectable(); int estado = arg0.getStateChange(); if (estado == arg0.SELECTED) { if (fonte == banco1) { bancodedados = "oracle"; } if (fonte == banco2) { bancodedados = "db2"; } if (fonte == banco3) { bancodedados = "mssql"; } } } public void actionPerformed(ActionEvent arg0) { // Efetua login no banco de dados Sequence acesso = new Sequence(); if (bancodedados == "oracle") { acesso.conectar("user", "p@55w0rd"); } if (bancodedados == "db2") { acesso.conectar("user", "p@55w0rd"); } if (bancodedados == "mssql") { acesso.conectar("user", "p@55w0rd"); } try { // DB2 e Oracle utilizam sequence // SQL Server utiliza o Identity // Como é um objeto atrelado ao campo // Necessita ser suprimido da clausula SQL if (bancodedados != "mssql") { acesso.executaSQL("insert into SEQUENCIA VALUES (Sequencia_seq.NEXTVAL ,\'Teste\',\'Teste Sobrenome\',\'Programador\',2234.56)"); } else { acesso.executaSQL("insert into SEQUENCIA VALUES (\'Teste\',\'Teste Sobrenome\',\'Programador\',2234.56)"); } // Executa Intrução SQL tabela.setModel(criaTableModel(acesso.retornaTabela())); } catch (SQLException e) { e.printStackTrace(); } } public Container criaPainel() throws SQLException { // Cria painel principal JPanel painel = new JPanel(); // Seleciona layout painel.setLayout(new BoxLayout(painel, BoxLayout.PAGE_AXIS)); painel.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20)); // Cria painel de escolha de conexão JPanel pescolha = new JPanel(); pescolha.setLayout(new BoxLayout(pescolha, BoxLayout.LINE_AXIS)); pescolha.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); ButtonGroup grupo = new ButtonGroup(); // Cria componentes de radio banco1 = new JRadioButton("Oracle"); banco2 = new JRadioButton("IBM DB2"); banco3 = new JRadioButton("Microsoft SQL"); // Agrupa botões de radio grupo.add(banco1); grupo.add(banco2); grupo.add(banco3); // Cria ouvinte dos botões banco1.addItemListener(this); banco2.addItemListener(this); banco3.addItemListener(this); // Seleciona primeira conexão banco1.setSelected(true); // Adiciona botões ao painel pescolha.add(banco1); pescolha.add(banco2); pescolha.add(banco3); // Efetua primeira conexão ao banco (ORACLE) // caso queira mudar a conexão // mude o indice dos componentes de radio Sequence acesso = new Sequence(); acesso.conectar("user", "p@55w0rd"); // Cria modelo de tabela tabela = new JTable(criaTableModel(acesso.retornaTabela())); // Adiciona um painel de rolagem JScrollPane rolar = new JScrollPane(tabela); // Cria painel do botão JPanel pbotao = new JPanel(new GridLayout(0, 3, 10, 10)); botao = new JButton("Cria Sequence/Identity"); botao.addActionListener(this); // Adiciona botão ao painel pbotao.add(Box.createHorizontalStrut(10)); pbotao.add(Box.createHorizontalStrut(10)); pbotao.add(botao); // componentes ao painel principal painel.add(pescolha); painel.add(rolar); painel.add(Box.createVerticalStrut(10)); painel.add(pbotao); return painel; } public static void criaGUI() { // Cria formulario JFrame formulario = new JFrame("Desenvolvimento Aberto - Sequence / Identity"); formulario.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // cria painel de conteudo Sequence acesso = new Sequence(); try { formulario.setContentPane(acesso.criaPainel()); } catch (SQLException e) { e.printStackTrace(); } // Exibe o formulario formulario.setSize(700, 300); formulario.setVisible(true); } public static void main(String[] args) { javax.swing.SwingUtilities.invokeLater(new Runnable() { @Override public void run() { // Cria e mostra a GUI criaGUI(); } }); } }
Nice blog youu have