Вы находитесь на странице: 1из 8

_____________________________________________________________________________________

IMPLEMENTANDO PROCEDIMENTOS ARMAZENADOS COM RECURSIVIDADE


EM BANCO DE DADOS FIREBIRD
Autor: Mrcio Henrique Silva
Resumo
Este artigo apresenta um estudo bibliogrfico sobre a utilizao de algoritmos
recursivos em banco de dados e aponta uma proposta de utilizao de recursividade em Stored
procedures atravs do SGDB Firebird, um banco de dados Open Source. A partir de um cenrio
prtico com uma tabela de plano de contas uma Stored procedure foi testada e utilizada para
facilitar a extrao de dados agrupados pelo plano de contas hierarquizado. As vantagens e as
desvantagens desde tipo de recursividade so discutidas para auxiliar na deciso sobre sua
utilizao na prtica.
Palavras chave: Recursividade, Stored Procedure, Firebird, SGDB
Abstract
This paper presents a study of the literature on the use of recursive algorithms in
database systems and shows the proposed use of recursion in Stored procedures through the
Firebird DBMS, a database of Open Source. From a practical scenario with a table plan accounts
Stored procedure has been tested and used to facilitate the extraction of data grouped by
hierarchical chart of accounts. The advantages and disadvantages from type recursion are
discussed to help decide on its use in practice.
Key Words: Recursion, Stored Procedure, Firebird, SGDB

Introduo
Aplicaes de banco de dados que dependem de algoritmos complexos e bem
elaborados, geralmente, executam estes algoritmos fora da camada do servidor de banco de
dados. A justificativa pode ser a consonncia com a grande oferta de recursos que as linguagens
de programao oferecem ou mesmo porque o desenvolvedor no se atenta para esta
possibilidade.
A recursividade um algoritmo que segundo (WIRTH, 1999) consiste parcialmente ou
definido em termos de si prprio. Ou ainda conforme (PEREIRA, 2000) que atribui este
conceito ao algoritmo que para resolver um problema divide-o em subproblemas mais simples,
cujas solues requerem a aplicao dele mesmo.

Em termos matemticos, a recurso uma tcnica que, atravs de substituies


sucessivas, reduz o problema a ser resolvido a um caso de soluo trivial (PEREIRA, 2000, p.
147).
Nas palavras de (BORRIE, 2006, p. 563), se um procedimento chama a si prprio, ele
recursivo.
Este trabalho tem como objetivo despertar para a utilizao de recursividade atravs de
procedimentos armazenados no sistema de gerenciamento de banco de dados Firebird.
Antes de tratar dos recursos especficos sero abordados alguns conceitos importantes
sobre banco de dados.
Para (DATE, 2003) os Sistemas de Gerenciamento de Banco de Dados (SGDB) so
uma coleo de ferramentas que permitem criar e manter um banco de dados, ou seja, a
ferramenta que trata todo e qualquer acesso ao banco de dados.
Um dos modelos de banco de dados de maior sucesso o relacional. Segundo
(ELMASRI e S., 2010, p. 39), este modelo representa o banco de dados como uma coleo de
relaes, semelhantes a tabelas. Cada linha representa um conjunto de dados relacionados e
denominada tupla. Cada coluna armazena um determinado tipo de dado e conhecida como
atributo.
Ainda segundo (ELMASRI e S., 2010, p. 57), o banco de dados relacional ganhou
mercado graas criao da linguagem SQL (Structured Query Language), ou seja, linguagem
de consulta estruturada. SQL tornou-se a linguagem padro para os bancos de dados relacionais
comerciais. Esta linguagem resultou de um esforo comum da International Standards
Organization (ISO) e a Amerizan National Standards Institute (ANSI).
Atualmente existem diversas tecnologias de banco de dados disponveis no mercado,
algumas necessitam de licenas pagas outras so de uso livre, com cdigo fonte aberto ou
fechado. Dentre estas tecnologias uma que tem se destacado no Brasil o Firebird, um SGSD
Open Source. Este SGDB segundo (BORRIE, 2006) foi a primeira nova gerao descendente do
Interbase 6.0 da Borland Corporation liberado no ano de 2000 sob licena Pblica do Interbase
(IPL). O Firebird mantido pela FirebirdSQL Foundation (Inc), uma fundao sem fins
lucrativos, com sede na Inglaterra, que vive de patrocnios pblicos e privados, donativos e taxas
de associados.
Dentre as principais caractersticas do Firebird (BORRIE, 2006) destaca: Arquitetura
multi-geracional, transaes, procedimentos armazenados (storage procedures), gatilhos

(triggers), integridade referencial, cpias de dados em tempo real (database shadowing),


segurana conforme padro ANSI SQL para os objetos do banco de dados dentre outros.
Procedimentos armazenados (Procedures)
Os procedimentos armazenados, so conceituados por (BORRIE, 2006) como um
programa auto-contido, escrito em PSQL do Firebird, uma linguagem prpria do Firebird,
compilado pelo interpretador interno de linguagem binria e armazenado como cdigo
executvel dentro do banco de dados, compondo seu metadata. Depois de compilado, o cdigo
pode ser chamado diretamente de uma aplicao ou outro mdulo PSQL, usando uma declarao
EXECUTE PROCEDURE ou SELECT.
O Firebird fornece como uma linguagem de procedimentos (s vezes chamada de
PSQL), um conjunto de extenses da SQL que os programadores usam junto com uma variao
do conjunto da linguagem ESQL, para escrever o cdigo fonte de procedimentos armazenados e
gatilhos. A PSQL estendida para incluir controle de fluxo, expresses condicionais e
manipulao de erros. Ela possui a habilidade nica de gerar conjuntos de sada de mltiplas
linhas que podem ser acessadas usando declaraes SELECT. (BORRIE, 2006, p. 326)
Em outras palavras, pode-se dizer que um procedimento armazenado do Firebird um
conjunto de cdigo que poder ser acionado pelo usurio utilizando-se o comando SELECT,
definido pelo padro ANSI SQL para consultar dados ou utilizando uma sintaxe exclusiva
composta pela expresso EXECUTE PROCEDURE.
De acordo com (CANTU, 2006, p. 194) as procedures podem chamar a si mesmas 1000
vezes caso o servidor Firebird esteja rodando no sistema operacional Linux ou 750 vezes se o
sistema operacional for Microsoft Windows. Esta limitao visa evitar situaes que gerem um
loop infinito, e que poderiam prejudicar o funcionamento do servidor.
Dentre as vantagens de se utilizar procedimentos armazenados podem-se destacar duas
em especial: facilidade de gerenciamento do cdigo de processamento e melhoria de
desempenho da aplicao.
Em aplicaes no modelo cliente/servidor em que geralmente h um computador
responsvel pelo processamento dos dados remoto e a estao de trabalho do usurio que
manipula os dados acessando o ncleo do servidor importante regrar a distribuio de carga
entre o servidor e a estao de trabalho. A utilizao de Stored Procedure constitui um recurso
extremamente til para concentrar o processamento no servidor e reduzir o nmero de
requisies da estao de trabalho. Esta escolha poder resultar em uma demanda de estaes de

trabalho com recursos minimizados e consequentemente com melhor aproveitamento dos


recursos do servidor.
Procedimentos metodolgicos
Este trabalho resultou de uma pesquisa bibliogrfica exploratria em livros e revistas
especializados em banco de dados e algoritmos. Tambm foram realizados testes em laboratrio
utilizando as seguintes ferramentas de software: Banco de dados Firebird verso 2.5, ferramenta
de gerenciamento de banco de dados IBExpert verso 2011.01.11, Notebook com processador
Intel i5 com 06 GB de memria RAM e sistema operacional Microsoft Windows 7 Professional.
O banco de dados utilizado foi criado utilizando o aplicativo IBExpert e contm apenas
uma tabela conforme estrutura abaixo:
QUADRO 1 - Estrutura da tabela PLANOCONTAS
PLANOCONTAS
IDPLANO
SMALLINT NOT NULL
DESCPLANO VARCHAR(80) NOT NULL
TIPO
CHAR(1) NOT NULL
PAI
SMALLINT NOT NULL

Fonte: Elaborado pelo autor


Para construir o cenrio de testes, observa-se no QUADRO 2 os dados que foram
cadastrados na tabela PLANOCONTAS:
QUADRO 2 - Registros da tabela PLANOCONTAS
IDPLANO
1
2
3
4
5
6
7
8
10
11
12
13
14
15
16
17
18
19

DESCPLANO
CRDITOS
DBITOS
Recebimento de servios prestados
Pagamento de fornecedores
Pagamento de impostos
Venda de mercadorias
Impostos Federais
Impostos Estaduais
Imposto de Renda
ICMS
COFINS
IPI
Despesas Operacionais
Servios bancrios
Impostos municipais
ISSQN
IPVA
IPTU

Fonte: Elaborado pelo autor

TIPO
C
D
C
D
D
C
D
D
D
D
D
D
D
D
D
D
D
D

PAI
1
2
1
2
2
1
5
5
7
8
7
7
2
14
5
16
8
16

Nota-se que o campo PAI tem o identificador do registro hierarquicamente superior


ao registro atual. No caso da conta CRDITO e da conta DBITO este valor o mesmo do
prprio registro, indicando que se trata de um registro raiz.
Resultados

QUADRO 3 - Cdigo fonte do procedimento


01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32

CREATE OR ALTER PROCEDURE LISTA_PLANO (


PAI SMALLINT)
RETURNS (
IDPLANO SMALLINT,
DESCPLANO VARCHAR(80),
TIPO CHAR(1),
IDPAI SMALLINT,
RECUO VARCHAR(80))
AS
DECLARE VARIABLE QTDFILHOS SMALLINT;
BEGIN
IF (:RECUO IS NULL) THEN RECUO = '';
SELECT COUNT(*) FROM PLANOCONTAS P
WHERE P.PAI = :PAI AND P.IDPLANO <> :PAI
INTO :QTDFILHOS;
SELECT P.IDPLANO,P.DESCPLANO,P.TIPO,P.PAI FROM PLANOCONTAS P
WHERE P.IDPLANO = :PAI
INTO :IDPLANO,:DESCPLANO,:TIPO,:IDPAI;
SUSPEND;
RECUO = :RECUO || '...';
IF (:QTDFILHOS > 0) THEN
FOR SELECT P.IDPLANO,P.DESCPLANO,P.TIPO,P.PAI
FROM PLANOCONTAS P
WHERE P.PAI = :PAI AND P.IDPLANO <> :IDPLANO
ORDER BY 1
INTO :IDPLANO,:DESCPLANO,:TIPO,:IDPAI DO
BEGIN
FOR SELECT IDPLANO,DESCPLANO,TIPO,IDPAI,RECUO || '...'
FROM LISTA_PLANO (:IDPLANO)
INTO :IDPLANO,:DESCPLANO,:TIPO,:IDPAI,:RECUO DO SUSPEND;
END
END

Fonte: Elaborado pelo autor


Observa-se no QUADRO 3 que a procedure possui um parmetro de entrada, linha 02,
denominado PAI cujo domnio Smallint. O propsito deste parmetro informar o item do
plano de contas que ter seus itens filhos listados. Este parmetro representa o elo entre as
diversas execues da procedure.
Os parmetros de retorno foram definidos entre as linhas 04 e 08. Na linha 21 h uma
verificao no cdigo para processar apenas o item do plano de contas com pelo menos um item
filho.

Na linha 29 encontra-se a chamada recursiva para a procedure LISTA_PLANO.


Nota-se que a utilizao da recursividade bastante simples e resulta em um cdigo de
fcil entendimento alm de maior facilidade para ser consumido em uma aplicao cliente.
Conforme citado por (PEREIRA, 2000), a recurso pode tornar um algoritmo muito
elegante, desde que bem utilizada. Cada chamada recursiva implica em um custo tanto de tempo
quanto de espao, pois cada vez que a rotina chamada, todas as variveis so recriadas.
Portanto, a elaborao cuidadosa do cdigo poder resultar em ganho de performance, bem
como, economia de recursos de processamento.
Uma procedure retornvel, capaz de retornar um conjunto de registros, pode ser
executada a partir de um comando SQL SELECT conforme exemplo do QUADRO 4.
QUADRO 4 - Execuo da procedure atravs de SELECT
01
02
03
04

SELECT P1.IDPLANO, P1.RECUO || P1.DESCPLANO DESCPLANO, P1.TIPO, P1.IDPAI,


(SELECT SUM(P.VALORPAGO) FROM PAGAMENTOS P
WHERE P.IDPLANO = P1.IDPLANO) PAGO
FROM LISTA_PLANO(2) P1

Fonte: Elaborado pelo autor


Como resultado do processamento do comando listado no QUADRO 4 so
apresentados os registros do QUADRO 5. Nota-se que a procedure organizou os dados
conforme a hierarquia das contas e utilizou uma sequncia de ... para cada nvel de detalhe.
Este comando SQL SELECT ainda permitiu vincular o resultado da procedure recursiva com a
tabela de pagamentos, possibilitando o uso de funes de agregao para somar os valores pagos
conforme o item do plano de contas.
QUADRO 5 - Resultado do comando SQL
IDPLANO

DESCPLANO

TIPO

IDPAI

2
4
5
7
10
12
13
8
11
14
15

DBITOS
...Pagamento de fornecedores
...Pagamento de impostos
......Impostos Federais
.........Imposto de Renda
.........COFINS
.........IPI
......Impostos Estaduais
.........ICMS
...Despesas Operacionais
......Servios bancrios

D
D
D
D
D
D
D
D
D
D
D

2
2
2
5
7
7
7
5
8
2
14

PAGO
500

123

300

Fonte: Elaborado pelo autor

Outra forma para executar uma procedure utilizando o comando EXECUTE


PROCEDURE que no tem a mesma flexibilidade do comando SELECT, j que este ltimo
permite relacionar os dados resultantes da procedure com outros dados do banco de dados. Para

executar a procedure LISTA_PLANO sem o uso de SELECT segue o exemplo: EXECUTE


PROCEDURE LISTA_PLANO(2).
Discusso

Pode-se dizer que utilizao de Stored Procedures recursivas apresenta tanto pontos
positivos quanto negativos. Segundo (WIRTH, 1999, p. 112) h situaes onde no se deve
utilizar recurso, o que pode levar a resultados ineficientes. O principal ponto a ser considerado
a necessidade de utilizao da recurso para resolver o problema ou obter os dados necessrios.
Neste exemplo, a recursividade tem sua importncia para garantir que os itens do plano de contas
sejam hierarquizados independentes do nmero de nveis encontrados.
De acordo com (BORRIE, 2006, p. 558), rotinas e regras de negcio complexas so
centralizadas no servidor. A autora justifica que como vantagem tem-se a economia em horas
de programao e testes e a execuo no lado servidor elimina os riscos de integridade inerentes
repetio e manuteno das mesmas operaes complexas em mltiplos ambientes de
linguagem cliente. Portanto, a utilizao de procedures recursivas que necessitam realizar a
leitura repetitiva dos dados poder resultar em um ganho ainda mais significativo por no
depender de diversas requisies de dados pelo sistema cliente.
Para (WIRTH, 1999, p. 114) existem situaes onde a recurso deve ser evitada.
Assim, conclui-se que se deve evitar o uso de recurso sempre que for conhecida uma soluo
bvia que utilize a tcnica de iterao.
Pereira (2000) afirma que Um algoritmo claro, simples e conciso vale mais que
qualquer algoritmo envenenado que rode um pouquinho mais rpido! Conclui-se, portanto
que a utilizao de recurso, embora no seja a melhor soluo em todos os casos, poder tornar
o cdigo mais agradvel a ponto de ser mais interessante que utilizar estruturas de repetio e
comandos de desvio de fluxo para obter um resultado mais apurado de processamento.
A utilizao de Stored Procedores recursivas no Firebird no muito diferente da
recurso em qualquer linguagem de programa. De acordo com (BORRIE, 2006), cada chamada
de um procedimento referida como uma instncia, como se fosse chamada vrias vezes de uma
aplicao, reservando espao de memria e para pilha conforme necessrio. Portanto,
recomenda-se que o algoritmo da Procedure recursiva seja bem elaborado e econmico quanto
ao uso de variveis e leitura dos dados.
Concluso

A utilizao de Stored Procedure recursivas, embora no seja muito comum, no pode


ser esquecida como soluo elegante e prtica para solucionar problemas de processamento em

ambiente cliente/servidor. Como principal motivao pode-se considerar a reduo do nmero de


requisies que a estao cliente precisa executar para realizar um processamento complexo e
repetitivo.
importante destacar que nem todos os algoritmos so eficientes se construdos para
funcionar de modo recursivo, mas quando esta tcnica por conveniente para obter os resultados
esperados, sua utilizao poder facilitar o entendimento do cdigo e organizar melhor as rotinas
de processamento.
Como sugesto para estudos futuros recomenda-se um teste de desempenho em
laboratrio entre aplicaes com Stored Procedures recursivas e sem recurso. Pode-se ainda
verificar o consumo de recursos por parte do servidor em ambos os cenrios para nortear a
utilizao mais eficiente deste recurso.

Referncias
BORRIE, H. Dominando Firebird: Uma referncia para desenvolvedores de banco de dados.
Rio de janeiro: Cincia Moderna, 2006.
CANTU, C. H. Firebird o banco de dados do novo milnio. So Paulo: Cincia Moderna,
2006.
CHAGAS, O. B. et al. Sistemas gerenciadores de banco de dados para micro e pequenas
empresas. In: Seminrio de Iniciao Cientfica e Tecnolgica da UTFPR, Pato Branco,
2009. Disponvel em. Acesso em: 01 abr. 2012.
CUERVO, M. C. Performance assesment of MySQL and Firebird Database Management
Systems. Revista Universidad EAFIT, Medellin, 43, n. 48, 25 out. 2007. 78-90.
DATE, C. J. Introduo a sistemas de banco de dados. 4. ed. So Paulo: Campus, 2003.
ELMASRI, R. E.; S., N. Sistemas de Banco de Dados. 6. ed. So Paulo: Pearson, 2010.
KORTH, H. F.; SILBERSCHATZ, A.; SUDARSHAN, S. Sistemas de Banco de Banco de
Dados. 3. ed. So Paulo: Makron Books, 1998.
PEREIRA, S. D. L. Estruturas de dados fundamentais: conceitos e aplicaes. 4. ed. So
Paulo: rika, 2000.
SOUZA, M. D. O.; MATIOSKI, M. E.; NEVES, A. P. Anlise de desempenho dos bancos de
dados mysql, postgresql e firebird: um estudo de caso. Revista Cientfica de Administrao e
Sistemas de Informao, Curitiba, v. 11, 2008. ISSN 1679-236X.
WIRTH, N. Algoritmos e estruturas de dados. Rio de Janeiro: LTC, 1999.

Вам также может понравиться