362-1039-2-pb

Upload: ernandesdecarvalho

Post on 21-Feb-2018

217 views

Category:

Documents


0 download

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.