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