362-1039-2-pb
TRANSCRIPT
-
7/24/2019 362-1039-2-PB
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
proceduresatravs 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.
-
7/24/2019 362-1039-2-PB
2/8
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, aferramenta 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 (StructuredQueryLanguage), 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 oufechado. 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
-
7/24/2019 362-1039-2-PB
3/8
(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
loopinfinito, 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 Procedureconstitui 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
-
7/24/2019 362-1039-2-PB
4/8
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 PLANOCONTASPLANOCONTAS
IDPLANO SMALLINT NOT NULLDESCPLANO VARCHAR(80) NOT NULLTIPO CHAR(1) NOT NULLPAI SMALLINT NOT NULLFonte: 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 DESCPLANO TIPO PAI
1 CRDITOS C 12 DBITOS D 23 Recebimento de servios prestados C 14 Pagamento de fornecedores D 25 Pagamento de impostos D 26 Venda de mercadorias C 17 Impostos Federais D 5
8 Impostos Estaduais D 510 Imposto de Renda D 711 ICMS D 812 COFINS D 713 IPI D 714 Despesas Operacionais D 215 Servios bancrios D 1416 Impostos municipais D 517 ISSQN D 1618 IPVA D 819 IPTU D 16
Fonte: Elaborado pelo autor
-
7/24/2019 362-1039-2-PB
5/8
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 CREATE OR ALTER PROCEDURE LISTA_PLANO (
02 PAI SMALLINT)
03 RETURNS (
04 IDPLANO SMALLINT,
05 DESCPLANO VARCHAR(80),
06 TIPO CHAR(1),
07 IDPAI SMALLINT,
08 RECUO VARCHAR(80))
09 AS
10DECLARE VARIABLE QTDFILHOS SMALLINT;
11 BEGIN
12 IF (:RECUO IS NULL) THEN RECUO = '';
13 SELECT COUNT(*) FROM PLANOCONTAS P
14 WHERE P.PAI = :PAI AND P.IDPLANO :PAI
15 INTO :QTDFILHOS;
16 SELECT P.IDPLANO,P.DESCPLANO,P.TIPO,P.PAI FROM PLANOCONTAS P
17 WHERE P.IDPLANO = :PAI
18 INTO :IDPLANO,:DESCPLANO,:TIPO,:IDPAI;
19 SUSPEND;
20 RECUO = :RECUO || '...';
21 IF (:QTDFILHOS > 0) THEN
22 FOR SELECT P.IDPLANO,P.DESCPLANO,P.TIPO,P.PAI23 FROM PLANOCONTAS P
24 WHERE P.PAI = :PAI AND P.IDPLANO :IDPLANO
25 ORDER BY 1
26 INTO :IDPLANO,:DESCPLANO,:TIPO,:IDPAI DO
27 BEGIN
28 FOR SELECT IDPLANO,DESCPLANO,TIPO,IDPAI,RECUO || '...'
29 FROM LISTA_PLANO (:IDPLANO)
30 INTO :IDPLANO,:DESCPLANO,:TIPO,:IDPAI,:RECUO DO SUSPEND;
31 END
32 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 itemfilho.
-
7/24/2019 362-1039-2-PB
6/8
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 SELECT01 SELECT P1.IDPLANO, P1.RECUO || P1.DESCPLANO DESCPLANO, P1.TIPO, P1.IDPAI,
02 (SELECT SUM(P.VALORPAGO) FROM PAGAMENTOS P
03 WHERE P.IDPLANO = P1.IDPLANO) PAGO
04 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 PAGO2 DBITOS D 24 ...Pagamento de fornecedores D 2 500
5 ...Pagamento de impostos D 27 ......Impostos Federais D 510 .........Imposto de Renda D 712 .........COFINS D 7 12313 .........IPI D 78 ......Impostos Estaduais D 511 .........ICMS D 8 30014 ...Despesas Operacionais D 215 ......Servios bancrios D 14
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
-
7/24/2019 362-1039-2-PB
7/8
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 deveutilizar 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 soluobvia 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.
ConclusoA utilizao de Stored Procedurerecursivas, embora no seja muito comum, no pode
ser esquecida como soluo elegante e prtica para solucionar problemas de processamento em
-
7/24/2019 362-1039-2-PB
8/8
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 resultadosesperados, 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.
RefernciasBORRIE, 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 pequenasempresas. 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 ManagementSystems. 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 deDados. 3. ed. So Paulo: Makron Books, 1998.
PEREIRA, S. D. L. Estruturas de dados fundamentais:conceitos e aplicaes. 4. ed. SoPaulo: rika, 2000.
SOUZA, M. D. O.; MATIOSKI, M. E.; NEVES, A. P. Anlise de desempenho dos bancos dedados mysql, postgresql e firebird: um estudo de caso. Revista Cientfica de Administrao eSistemas de Informao, Curitiba, v. 11, 2008. ISSN 1679-236X.
WIRTH, N. Algoritmos e estruturas de dados. Rio de Janeiro: LTC, 1999.