Stored Procedures são procedimentos de código SQL armazenados no banco de dados, as stored procedures são mais rápidas do que o código tradicional, o que significa que elas estão se tornando cada vez mais populares. Com código da aplicação se mudando dos programas externos para o motor de banco de dados, Os DBAs precisam entender os requisitos de memória relacionados para procedimentos armazenados e saber como gerenciar estes procedimentos para o ideal desempenho do banco de dados. Isto muda de banco para banco, cada um deles possui suas recomendações de melhores praticas para atingir um melhor desempenho.
Neste site existe uma versão deste mesmo programa utilizando código SQL direto dentro da aplicação e podemos comparar a diferença com o código SQL sendo executado dentro do motor do banco de dados e o resultado é visivelmente notado, sem duvida o código executado utilizando procedures é mais rápido.
Ainda existe um outro modo de utilizar o banco de dados que é utilizando um set de dados persistente, onde uma camada de classes ou componentes geram o código SQL para o banco de dados através de instruções definidas pelas classes, mas este método por possuir uma camada que cria o código para o banco pode se tornar menos atrativo em termos de desempenho, apesar de ser muito mais fácil e rápido para se desenvolver, sendo assim vale avaliar a quantidade de dados que sua aplicação pretende manipular.
Para adquirir o script SQL para criar a tabela deste exemplo ou visualizar o método utilizando SQL direto da aplicação: clique aqui.
Exemplo:
Neste exemplo utilizamos Stored Procedures que retornam parâmetros para criar um método dentro do banco de dados ao invés de criar o método dentro da aplicação utilizando a linguagem de programação nativa.
Oracle
create or replace PROCEDURE buscaFuncionario - Cria parametros (pid_funcionario IN FUNCIONARIOS.ID_FUNCIONARIO%TYPE, p_nome OUT FUNCIONARIOS.NOME%TYPE, p_sobrenome OUT FUNCIONARIOS.SOBRENOME%TYPE, p_cargo OUT FUNCIONARIOS.CARGO%TYPE, p_salario OUT FUNCIONARIOS.SALARIO%TYPE ) AS BEGIN -- Insere dados da query dentro dos parametros de saida SELECT NOME, SOBRENOME, CARGO, SALARIO INTO p_nome, p_sobrenome, p_cargo, p_salario FROM FUNCIONARIOS WHERE ID_FUNCIONARIO = pid_funcionario; END;
Python
#!/usr/bin/env python
# -*- coding: latin-1 -*-
# Desenvolvimento Aberto
# StoredOra.py
# importa modulos
from Tkinter import *
import tkMessageBox
import cx_Oracle
# Cria formulario
formulario = Tk(className='Desenvolvimento Aberto')
formulario.geometry("350x280+300+300")
# Cria janela para menssagem
janela = Tk()
janela.wm_withdraw()
# Define banco de dados
# oracle = Oracle Database
DBconexao = "oracle"
# Cria conexão com o banco de dados
def conectar(banco):
# Cria string de conexão Oracle
if (banco == "oracle"):
sconexao = "user/p@55w0rd@localhost/XE"
try:
con = cx_Oracle.connect(sconexao)
except ValueError:
tkMessageBox.showinfo(title="Menssagem", message="Erro de Conexão", parent=janela)
return con
# Limpa campo
def limpar():
tcodigo.delete(0, END)
tpnome.delete(0, END)
tsnome.delete(0, END)
tcargo.delete(0, END)
tsalario.delete(0, END)
# Evento do botão
def on_Pesquisar():
# Exibe banco de dados
titulo['text'] = "Database: " + DBconexao
# Cria conexão
con = conectar(DBconexao)
# Define e executa Stored Procedure
if (DBconexao == "oracle"):
cursor = con.cursor()
#Declara parametros
pnome = cursor.var(cx_Oracle.STRING)
psobrenome = cursor.var(cx_Oracle.STRING)
pcargo = cursor.var(cx_Oracle.STRING)
psalario = cursor.var(cx_Oracle.NUMBER)
# Chama stored procedure utilizando um tupple
cursor.callproc('buscaFuncionario', (tpesquisa.get(), pnome, psobrenome, pcargo, psalario))
# Prepara campos
limpar()
# Exibe dados
tcodigo.insert(0, tpesquisa.get())
tpnome.insert(0, pnome.getvalue())
tsnome.insert(0, psobrenome.getvalue())
tcargo.insert(0, pcargo.getvalue())
tsalario.insert(0, str(psalario.getvalue()))
# Cria componentes widgets
titulo = Label(formulario, text="Database: Nenhum")
# labels
lcodigo = Label(formulario, text="Codigo:")
lpnome = Label(formulario, text="Nome:")
lsnome = Label(formulario, text="Sobrenome:")
lcargo = Label(formulario, text="Cargo:")
lsalario = Label(formulario, text="Salario:")
# Entry
tcodigo = Entry(formulario)
tpnome = Entry(formulario)
tsnome = Entry(formulario)
tcargo = Entry(formulario)
tsalario = Entry(formulario)
# Pesquisa
lpesquisa = Label(formulario, text="Pesquisa:")
tpesquisa = Entry(formulario)
botao = Button(formulario, text = "Pesquisar", command=on_Pesquisar)
# Define Layout
titulo.grid(row=0, sticky=W+E+N+S, pady=20)
lcodigo.grid(row=1, sticky=W, padx=20)
tcodigo.grid(row=1, column=1, pady=5)
lpnome.grid(row=2,sticky=W, padx=20)
tpnome.grid(row=2, column=1, pady=5)
lsnome.grid(row=3,sticky=W, padx=20)
tsnome.grid(row=3, column=1, pady=5)
lcargo.grid(row=4, sticky=W, padx=20)
tcargo.grid(row=4, column=1, pady=5)
lsalario.grid(row=5, sticky=W, padx=20)
tsalario.grid(row=5, column=1, pady=5)
# Layout pesquisa
lpesquisa.grid(row=6, column=0, pady=20)
tpesquisa.grid(row=6, column=1, pady=20)
botao.grid(row=6, column=2,pady=20)
# loop do tcl
mainloop()


