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()


