Uma Sequence é um objeto de banco de dados encontrado no bancos de dados Oracle, 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.
Oracle: Sequence
Algo extremamente útil sobre Sequence
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 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.
Exemplo:
Neste exemplo utilizamos uma Sequence para os bancos de dados Oracle 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
Python
#!/usr/bin/env python # -*- coding: latin-1 -*- # Desenvolvimento Aberto # Sequence.py # importa modulos import wx import wx.grid import cx_Oracle # Cria classe generica de uma WX.Grid # A classe abaixo faz parte da documentação WXPython oficial # Este trecho de código é util para manipular a grade class GenericTable(wx.grid.PyGridTableBase): def __init__(self, data, rowLabels=None, colLabels=None): wx.grid.PyGridTableBase.__init__(self) self.data = data self.rowLabels = rowLabels self.colLabels = colLabels def GetNumberRows(self): return len(self.data) def GetNumberCols(self): return len(self.data[0]) def GetColLabelValue(self, col): if self.colLabels: return self.colLabels[col] def GetRowLabelValue(self, row): if self.rowLabels: return self.rowLabels[row] def IsEmptyCell(self, row, col): return False def GetValue(self, row, col): return self.data[row][col] def SetValue(self, row, col, value): pass # Inicializa Grade dados = [] colLabels = [] rowLabels = [] for linha in range(1, 150): rowLabels.append(str(linha)) # Cria conexão def conectarORA(): sconexao = "user/pass@localhost/XE" try: con = cx_Oracle.connect(sconexao) except ValueError: tkMessageBox.showinfo(title="Menssagem", message="Erro de Conexão", parent=janela) return con # Executa e retorna SQL def retornaTabelaORA(sql, con): cursor = con.cursor() cursor.execute(sql) return cursor def retornaDados(): # Cria conexão con = conectarORA() # Envia dados a grid sql = "Select * from SEQUENCIA WHERE IDENTIFICADOR = (SELECT MAX(IDENTIFICADOR) FROM SEQUENCIA)" # retorna set de dados tabela = retornaTabelaORA(sql, con) # Retorna metadados da tabela for i in range(0, len(tabela.description)): colLabels.append(tabela.description[i][0]) # Executa um fecth em todos os registros resultado = tabela.fetchall() # Popula dados for conteudo in resultado: dados.append(conteudo) # Cria classe da grid class SimpleGrid(wx.grid.Grid): def __init__(self, parent): wx.grid.Grid.__init__(self, parent, -1, pos=(5,50), size=(850,350)) # Cria formulario class TestFrame(wx.Frame): def __init__(self, parent): wx.Frame.__init__(self, parent, -1, "Desenvolvimento Aberto - SEQUENCE - ORACLE - Python", size=(900, 450)) panel = wx.Panel(self, wx.ID_ANY) label = wx.StaticText(panel, -1, label='Oracle Database - Sequence - Clique no botão para inserir um numero sequencial do Oracle', pos=(5,20)) botao = wx.Button(panel, label="Inserir", pos=(760,10)) botao.Bind(wx.EVT_BUTTON, self.botaoInserir) self.grid = SimpleGrid(panel) #Insere dados e dispara trigger def botaoInserir(self,event): # Conecta e cria um cursor con = conectarORA() cursor = con.cursor() # Insere clausula SQL sql = "insert into SEQUENCIA VALUES (Sequencia_seq.NEXTVAL ,\'Teste\',\'Teste Sobrenome\',\'Programador\',2234.56)" # Executa e comita a transação cursor.execute(sql) con.commit() # Limpa grade self.grid.ClearGrid() # Atualiza grade self.grid.ForceRefresh() # Retorna set de dados retornaDados() # Insere set de dados contidos em um tuplas tableBase = GenericTable(dados, rowLabels, colLabels) self.grid.SetTable(tableBase) # Inicializa a aplicação app = wx.App() frame = TestFrame(None) frame.Show(True) app.MainLoop()