Banco de Dados Relacional e Objeto Relacional Uma Comparacao Usando Postgresql
Banco de Dados Relacional e Objeto Relacional Uma Comparacao Usando Postgresql
Banco de Dados Relacional e Objeto Relacional Uma Comparacao Usando Postgresql
Monografia de graduao apresentada ao Departamento de Cincia da Computao da Universidade Federal de Lavras como parte das exigncias do curso de Cincia da Computao para a obteno do ttulo de Bacharel em Cincia da Computao
Monografia de graduao apresentada ao Departamento de Cincia da Computao da Universidade Federal de Lavras como parte das exigncias do curso de Cincia da Computao para a obteno do ttulo de Bacharel em Cincia da Computao
Ficha Catalogrfica preparada pela Diviso de Processos Tcnico da Biblioteca Central da UFLA Bonfioli, Guilherme Ferreira Banco de Dados Relacional e Bancos de Dados Objeto-relacional: Uma comparao usando PostgreSQL / Guilherme Ferreira Bonfioli. Lavras Minas Gerais, 2006. 50p : il. Monografia de Graduao Universidade Federal de Lavras Departamento de Cincia da Computao 1. Informtica 2. Banco de Dados 3. Orientao a Objeto
Monografia de graduao apresentada ao Departamento de Cincia da Computao da Universidade Federal de Lavras como parte das exigncias do curso de Cincia da Computao para a obteno do ttulo de Bacharel em Cincia da Computao
_________________________________ Prof. Rmulo Maia Alves __________________________________ Prof. Guilherme Bastos Alvarenga
AGRADECIMENTOS
Agradeo a Deus, a meus pais e meus irmos que de tudo fizeram para que eu pudesse estar aqui hoje e a todos que estiveram presentes comigo e que companheiros de repblica, colegas de sala, colegas de trabalho, professores e amigos um grande abrao. Sou grato a todos. de alguma forma me apoiaram nesta caminhada. Deixo aos meus
RESUMO
A maioria dos sistemas de bancos de dados desenvolvidos atualmente baseada no modelo relacional. No entanto, novos modelos de Sistemas Gerenciadores de Banco de Dados (SGBD) tm surgido devido demanda de novas aplicaes e ao crescimento do paradigma de orientao a objetos, no cenrio de desenvolvimento destas. Assim, surge a necessidade de se utilizar um SGBD que suporte estes conceitos e atenda a estas demandas das novas aplicaes. O presente trabalho apresenta um estudo sobre banco de Object Data Management Group (ODMG). Com base nessas tecnologias foi dados relacional, orientao a objetos, SGBD objeto-relacional e o padro elaborado um estudo comparativo de duas implementaes distintas de uma mesma aplicao, utilizando diferentes modelagens no SGBD objetorelacional, PostgreSQL. Palavras-chaves: banco de dados, orientao a objetos, objeto-relacional, SGBD PostgreSQL.
ABSTRACT
Most of the database systems developed actually is based on the relational model. However, new models of Database Management Systems (DBMS) have been appearing due to the demand of new applications and to the growth of the object orientated paradigm. Like this, the need appears of using a DBMS that supports these concepts and assist these new applications demands. The present work presents a study on relational database model, object oriented concepts, object-relational DBMS and the pattern ODMG. Based on those technologies a comparative study of two different implementations from the same application was elaborated, using different models in the object-relational DBMS, PostgreSQL. Keywords: database, object oriented, object-relational, DBMS PostgreSQL.
iii
SUMRIO
Lista de Figuras ............................................................................................................... vi 1. Introduo......................................................................................................................1 1.1. Objetivos .................................................................................................................2 1.2. Estrutura do Trabalho...............................................................................................3 2. Referencial Terico........................................................................................................4 2.1. Modelo Relacional ...................................................................................................4 2.1.1. Chaves Primrias e Chaves Estrangeiras ............................................................6 2.1.2. Integridade de Entidade e Integridade Referencial..............................................7 2.2. Conceitos de Orientao a Objetos ...........................................................................8 2.2.1. Identidade de Objeto ........................................................................................10 2.2.2. Estrutura do Objeto..........................................................................................12 2.2.3. Objetos Complexos..........................................................................................13 2.2.4. Encapsulamento, Nomeao e Acessibilidade ..................................................14 2.2.5. Hierarquias de Tipo e Herana .........................................................................16 2.2.6 Polimorfismo ....................................................................................................17 2.3. O Padro ODMG ...................................................................................................17 2.4. SGBDs Objeto-Relacionais ....................................................................................19 2.5 PostgreSQL ............................................................................................................20 2.5.1. Breve Histrico................................................................................................21 2.5.2. O Postgres95....................................................................................................22 2.5.3. O PostgreSQL..................................................................................................22 3. Metodologia.................................................................................................................25 3.1. Tipo de Pesquisa ....................................................................................................25 3.2. Procedimentos Metodolgicos ...............................................................................25 4. Resultados e Discusses...............................................................................................27 4.1 Descrio da Aplicao...........................................................................................27 4.2. Modelo de Dados Relacional..................................................................................28 4.3. Modelo de Dados Objeto-relacional .......................................................................29 2.1.3. Limitaes do modelo relacional........................................................................7
iv
4.4. Anlise Comparativa..............................................................................................31 5. Concluso ....................................................................................................................37 6. Referncias Bibliogrficas............................................................................................38 Anexo A ..........................................................................................................................39 Anexo B ..........................................................................................................................42 Anexo C ..........................................................................................................................45 Anexo D ..........................................................................................................................47
LISTA DE FIGURAS
Figura 1: Representao dos conceitos do modelo relacional..............................................5 Figura 2: Exemplo de Chave Estrangeira............................................................................7 Figura 3: Modelo de Dados Relacional.............................................................................28 Figura 4: Modelo de Dados Objeto-relacional. .................................................................30 Figura 5: Script de criao das tabelas Cliente e Telefones no modelo relacional. ............32 Figura 6: Script de criao da tabela Cliente e do tipo Endereo no modelo OR. ..............32 Figura 7: Script de criao da tabela Pedido com uso de OID...........................................33 Figura 8: Exemplo de stored procedure............................................................................34 Figura 9: Exemplo de trigger............................................................................................35 Figura 10: Exemplos de criao de funes polimorfismo. ............................................36
vi
vii
1. INTRODUO
desenvolvimento de sistemas de informaes modernos, de qualquer porte ou segmento. Atualmente, a maior parte dos bancos de dados desenvolvidos nos SGBDs baseiam-se no modelo relacional, que vem sendo muito bem sucedido no que se diz respeito ao desenvolvimento da tecnologia de banco de dados necessria para muitas aplicaes aplicaes de banco de dados mais complexas precisam ser projetadas e implementadas. convencionais. Entretanto o modelo relacional apresenta algumas limitaes quando Aplicaes como banco de dados para engenharia e arquitetura, experincias O papel de um Sistema Gerenciador de Banco de Dados (SGBD) fundamental no
cientficas, telecomunicaes, sistemas de informaes geogrficas e multimdia, dentre convencionais, demandam estruturas de dados mais complexas que as tabelas relacionais e melhores tcnicas de acesso a estes dados.
de desenvolvimento de aplicaes. Assim, surge a necessidade de se utilizar um sistema de banco de dados que tambm comporte os conceitos desta tecnologia. Neste contexto novos modelos de banco de dados baseados no paradigma de orientao a objetos esto em ascendncia visando atender demanda dessas novas
A programao orientada a objetos vem ganhando cada vez mais espao no cenrio
aplicaes (Rodrigues Jnior, 2005). Dentre eles pode-se citar os Sistemas Gerenciadores de Banco de Dados Orientado a Objetos (SGBDOO) e os Sistemas Gerenciadores de Banco de Dados Objeto-Relacional (SGBDOR). Os SGBDORs combinam as caractersticas da programao orientada a objetos com as estruturas utilizadas no modelo relacional. Num passado recente a escolha de qual SGBD utilizar em uma aplicao geralmente dependia de questes tcnicas e do custo das licenas destes sistemas. Atualmente isso no mais uma realidade devido ao surgimento de diversos SGBDs de qualidade e que so gratuitos e open source.
Software livre uma realidade cada vez mais constante no mundo da informtica. O
mesmo fato ocorreu com banco de dados. Com um mercado de sistemas proprietrios bastante consolidado, incluindo as grandes empresas como IBM, Microsoft e Oracle, os bancos de dados livres, tais como o MySQL e o PostgreSQL, comeam a se destacar
solucionando assim o problema dos altos custos com a minimizao destes (Oliveira, 2005). O PostgreSQL foi escolhido para o desenvolvimento deste trabalho por ser um Sistema Gerenciador de Banco de Dados Objeto-Relacional (SGBDOR), ou seja, d suporte tanto ao modelo de banco de dados relacional, quanto ao modelo objeto-relacional e por ser um sistema livre. desenvolvimento de aplicaes mais avanadas natural. Porm surge o problema em decidir qual o modelo da tecnologia de banco de dados a ser adotado no caso da implementao de aplicaes convencionais. Atualmente a presena dos SGBDORs freqente e a sua escolha como opo para
1.1. Objetivos
implementaes distintas de um mesmo sistema de banco de dados, utilizando dois Este trabalho tem como objetivo geral fazer uma comparao entre duas
modelos bancos de dados: o relacional e o objeto-relacional. Para tanto, foi modelado um sistema de banco de dados de uma empresa de prestao de servios de transporte de mudanas e de transporte de cargas. Os objetivos especficos so: construir o modelo relacional do banco de dados e
implement-lo; construir o modelo objeto-relacional do banco de dados e implement-lo; construir funes de manipulao de dados que explorem caractersticas orientadas a objeto no banco de dados e test-las; comparar as duas implementaes e analisar a partir das comparaes se a adoo do modelo objeto-relacional para implementao de aplicaes convencionais apresenta vantagens sobre o modelo relacional.
relacional e outro usando os conceitos de modelo objeto-relacional. Ambos os bancos de dados foram implementados no SGBD PostgresSQL, que um SGBDOR e portanto suporta os dois modelos, para posteriormente serem comparados e analisados. Para fins de estudos os mdulos de Cadastro de Cliente e de Cadastro de Pedido foram suficientes para apresentar os conceitos dos dois modelos.
No presente trabalho procura-se contribuir com uma pesquisa abrangente sobre a recente introduo da tecnologia de orientao a objetos na rea de bancos de dados, em especial quando aplicada juntamente com a consolidada tecnologia de banco de dados relacional. Sendo assim, este trabalho apresenta a base terica fundamental para a compreenso desta tecnologia de banco de dados e sua viabilidade no desenvolvimento de determinadas aplicaes. de implementao de cada um dos modelos. Com isto, obtm-se informaes necessrias para orientar quem procura implantar a tecnologia de banco de dados objeto-relacional, iniciando um novo projeto ou migrando de um modelo relacional j existente. Aps o estudo terico, realizada uma avaliao detalhada e cuidadosa das formas
2. REFERENCIAL TERICO
bancos de dados sejam concorrentemente compartilhados por muitos usurios e aplicaes utilizando manuseio de armazenamento e estratgias de otimizao. Segundo Neves (2002) precisa-se manter os dados para executar as tarefas de leitura a partir de banco de dados, de atualizao e de insero dos dados no banco de dados, preservando a integridade dos mesmos. So exemplos de SGBDs contemporneos: Oracle, Interbase, SQL Server, Firebird, Ingress, Sybase, PostgreSQL, MySQL, dentre muitos outros. O Sistema Gerenciador de Banco de Dados (SGBD), por essncia, permite que
incapacidade de representar parte da informao e perda de informao. Essas restries so: integridade referencial, chaves, integridade de junes de relaes. Segundo Elmasri e Navathe (2005), o modelo relacional representa o banco de dados como uma coleo de relaes. Informalmente cada relao se assemelha a uma tabela de valores, ou, at certo ponto, a um arquivo de registros plano (flat file). Um modelo de dados basicamente uma combinao de um conjunto de estruturas
de dados, a tabela (ou relao); um conjunto de operadores que formam a linguagem de banco de dados, e so aplicadas nas instncias do banco de dados.
manipulao do banco de dados; e regras de integridade que so definidas no esquema do Quando uma relao imaginada na forma de uma tabela de valores, cada linha na
tabela representa uma coleo de valores de dados relacionados. No modelo relacional, cada linha de uma tabela representa um fato que corresponde geralmente a uma entidade ou a um relacionamento do mundo real. O nome da tabela o os nomes das colunas so utilizados para auxiliar na interpretao do significado dos valores em cada linha. Na terminologia formal do modelo relacional, uma linha chamada de tupla, o
ttulo da coluna denominado de atributo e a tabela chamada de relao. O tipo de dado que descreve os tipos de valores que podem aparecer em cada coluna denominado de domnio. A Figura 1 representa a terminologia citada anteriormente.
Figura 1: Representao dos conceitos do modelo relacional. Fonte: Elaborado pelo autor.
as tabelas, utiliza-se um campo identificado como chave. Uma chave primria corresponde
a uma ou vrias colunas que no possuem valores duplicados dentro de uma tabela. Uma identificados necessariamente como chave primria de outra tabela. A chave estrangeira o mecanismo que define os relacionamentos em um banco de dados relacional (Date, 2000).
possveis para aquela entidade, da mesma forma que as chaves candidatas representam a identificao exclusiva das tuplas daquela entidade. bom lembrar que uma chave primria representa um valor nico e no nulo (Date, 2000) Uma chave estrangeira um conjunto de atributos de uma relao R1 cujos valores
devem corresponder a valores de alguma chave candidata de outra relao R2. Por
exemplo, clientes e pedidos quando o pedido est associado a um cliente, o atributo IDCliente da relao pedidos identifica a associao com o cliente. Este atributo ento considerado uma chave estrangeira para este relacionamento. As chaves estrangeiras so ferramentas poderosas para a manuteno da integridade referencial do banco de dados. A Figura 2 apresenta um exemplo de Chave estrangeira.
da chave primria sendo nula implica que no podermos identificar algumas tuplas (Elmasri e Navathe 2005). Por exemplo, no caso de duas ou mais tuplas tivessem valores nulos para suas chaves primrias, no seria possvel distinguir entre elas. A restrio de integridade referencial especificada entre duas relaes e utilizada
para manter a consistncia entre tuplas destas relaes. Informalmente, a restrio de integridade referencial declara que uma tupla em uma relao que se refere a uma outra relao deve se referir a uma tupla existente naquela relao (Elmasri e Navathe, 2005).
necessidades de se representar tipos de dados longos e complexos, expanso dos modelos de dados e linguagens de consulta para acomodar novos tipos de dados, suporte a transaes longas, suporte ao processamento de conhecimento com tratamento de
restries e gatilhos, contando tambm o aumento no grau de inter-relacionamentos entre os dados (Cardoso, 2003). Aplicaes Mdicas e Cientficas, Aplicaes de Geoprocessamento, Manufatura Industrial (CAM), Desenvolvimento de Software (CASE), Projetos de Circuitos Eletrnicos (CAD), Sistemas de Multimdia, Sistemas baseados em conhecimento e outras mais. Os bancos de dados relacionais funcionam bem com tipos simples de dados, envolvendo poucas associaes entre relaes, entretanto apresentam algumas deficincias quando aplicaes de banco de dados mais complexas precisam ser projetadas e implementadas. dificuldade em representar objetos do mundo real nas aplicaes; incompatibilidade com das entidades do modelo relacional; suporte a grandes bancos de dados; suporte a transaes longas; e suporte a processamento de conhecimento. Os bancos de dados complexas. O mtodo de orientao a objetos oferece flexibilidade para lidar com algumas dessas exigncias sem ser limitado pelos tipos de dados e linguagens de consulta disponveis em sistemas de banco de dados convencionais (Elmasri e Navathe, 2005). Para solucionar problemas gerados a partir de tais limitaes surgiram os SGBBOO. orientados a objetos foram propostos para fazer face s necessidades de aplicaes mais Vale destacar as limitaes quanto ausncia de tipos definidos pelo usurio: Alguns exemplos destas aplicaes so aplicaes para Automao de Escritrio,
real, visando realizar a modelagem e codificao de uma forma mais natural. Com ela, o sistema fica organizado como uma coleo de objetos que interagem entre si. A tcnica de OO prope uma maior reusabilidade, atravs da eliminao de
redundncia de cdigo, com conseqente aumento na produtividade; melhorias na manutenabilidade, pois as modificaes no cdigo so bem localizadas e no provoca descontrole em outras partes do software; e tambm maior confiabilidade, devido ao encapsulamento que impede o acesso direto aos dados (atributos) dos objetos (Larman, 2000). Para Larman (2000), o objeto o conceito central da abordagem orientada a objeto (OO). Ele pode ser entendido como algo do mundo real com limites bem definidos e identidade prpria. Um objeto possui atributos (dados) e operaes. Quando se define um objeto conceitual a partir de um objeto do mundo real, diz-se estar fazendo uma abstrao. Segundo Elmasri e Navathe (2005), objetos geralmente possuem dois componentes: estado (valor) e comportamento (operaes). Portanto, ele um tanto semelhante a uma varivel de programa numa linguagem de programao, exceto pelo fato de que geralmente
ter uma estrutura de dados complexa, bem como operaes especficas definidas pelo programador. Objetos numa linguagem de programao OO existem somente durante a execuo de um programa e so, por isso, chamados de objetos transientes. De acordo com Larman (2000), classe um conjunto de objetos que possuem
caractersticas e comportamento em comum. Por exemplo, para os objetos Maria, Jos, utilizado. O ato de criar um objeto denominado instanciao. Todo objeto instancia de
e Pedro pode-se definir a classe Pessoa. Cada objeto deve ser criado antes de ser uma classe. A instanciao de um objeto feita atravs de um mtodo especial denominado construtor. Todos os objetos instanciados tero a mesma estrutura de mtodos e atributos de sua classe (Larman, 2000). armazenam dados. Por exemplo, um objeto de uma classe Pessoa pode conter os atributos nome e pedidos, e os valores Maria, Lista de pedidos. As operaes so o que os objetos podem realizar. Para este mesmo objeto da classe Ainda segundo Larman (2000), os atributos de um objeto so como variveis que
Quando uma operao solicitada ao objeto, diz-se que este objeto recebeu uma
mensagem. Esta mensagem pode trazer consigo parmetros, que so valores passados ao
objeto que a recebe. Por exemplo, traduzindo a mensagem pessoa.faz_pedido(pedido), passando como parmetro o pedido.
significa-se estar solicitando ao objeto pessoa para executar a operao faz_pedido, Conforme Larman (2000), o fato de uma classe reunir tanto as caractersticas quanto o comportamento dos objetos chamado de encapsulamento. Assim, outros objetos s tero acesso s operaes ou atributos que estiverem declarados como pblicos. D-se o nome de polimorfismo o fato de objetos de classes diferentes reagirem de forma particular a uma mesma operao (Larman, 2000). Por exemplo, a operao de uma classe PessoaJuridica, embora os objetivos da operao sejam semelhantes. faz_pedido do objeto da classe PessoaFisica tem uma codificao diferente do objeto Um outro conceito muito importante da OO a herana. Com ela, uma classe pode
herdar todas as operaes e atributos de uma outra classe, acrescentando os seus prprios
atributos e operaes. A classe que herdou a estrutura chamada de subclasse, enquanto a herdada pela classe PessoFisica, acrescentando atributos como CPF,
que cedeu a estrutura chama-se superclasse. Por exemplo, a classe Pessoa pode ser DataNascimento. Uma classe pode ter um atributo que se refere a uma outra classe. A essa referncia, d-se o nome de associao. Por exemplo, o atributo End de uma classe Pessoa pode referir a classe Endereo, que tenha mais atributos como rua, numero, cidade, cep, estado. utilizados nos SGBDs.
do OID para um objeto no deve se alterar, com isso preserva-se a identidade do objeto do
10
mundo real, que est sendo representado. Para se garantir a imutabilidade do OID, sistemas de gerenciamento de banco de dados OO devem possuir algum mecanismo para gerar OIDs. Continuando com a descrio de Elmasri e Navathe (2005), desejvel que cada OID seja utilizada apenas uma vez, ou seja, mesmo que um objeto seja removido do banco de dados, seu OID no deve ser atribudo a outro objeto. Essas duas propriedades implicam que o OID no deve depender de qualquer valore de atributo do objeto e nem deve ser baseado no endereo fsico do objeto armazenado uma vez que esses valores, atributo e utilizam o endereo fsico como OID, com a finalidade de aumentar a eficincia da recuperao do objeto. Normalmente utiliza-se nmeros inteiros grandes como OIDs e tabela hash. mapeia-se o valor do OID para o endereo fsico do objeto utilizando alguma forma de Conforme Elmasri e Navathe (2005), alguns modelos antigos de dados OO exigiam que tudo, desde um valor simples at um objeto complexo fosse representado como um OID. Isso permite que dois valores bsicos possuam OIDs diferentes, o que pode ser til objeto; sendo assim todo valor bsico, tal como um inteiro (integer) ou uma string teria um em alguns casos. Por exemplo, o valor inteiro 50 pode ser utilizado para representar a idade de uma pessoa ou o peso de uma pessoa. Portanto dois objetos bsicos com OIDs diferentes poderiam ser criados, porem ambos os objetos criados representariam o valor inteiro 50. Embora seja til como modelo terico, no muito prtico, uma vez que pode levar a gerao de um nmero muito grande de OIDs. Dessa forma, a maioria dos sistemas objeto deve possuir um OID imutvel, enquanto um valor no possui nenhum OID e se mantm por si mesmo. O valor geralmente armazenado dentro de um objeto e no pode ser referenciado a partir de outros objetos. endereo fsico podem ser modificados ou corrigidos. No entanto, alguns sistemas de fato
11
bsicos, como nmeros inteiros, nmeros reais, strings de caracteres, booleanos e quaisquer outros tipos de dados que o sistema diretamente suporta (Elmasri e Navathe, 2005). c. O estado do objeto v de um objeto (i, c, v), interpretado com base o construtor
Para c=atom, o estado (valor) v um valor atmico do domnio de valores suportados pelo sistema. Para c=set, o estado v um conjunto de identificadores de objeto {i1, i2, i3..., in} Para c=tupla, o estado v uma tupla da forma <a1:i1, a2:i2 ... an:in> onde cada aj Para c=list(lista), o valor v uma lista ordenada {i1, i2,..., in} de OIDs de objetos do mesmo tipo e estes esto ordenados. um nome de atributo e cada ij um OID. que so os OIDs para um conjunto de objetos que so tipicamente do mesmo tipo.
12
Para c=array, o estado do objeto uma disposio (array) unidimensional de identificadores de objeto. A principal diferena entre uma array e uma lista que uma lista pode possuir um nmero arbitrrio de elementos, enquanto que um array
geralmente possui um tamanho mximo e a diferena entre set e o bag que todos os elementos num conjunto devem ser diferentes, enquanto que em uma bag pode possuir elementos duplicados.
armazenar, por exemplo, os dados referentes a uma imagem bitmap, um texto formatado, uma msica entre outros. Elmasri e Navathe (2005), afirmam que, por padro, os SGBDOOs no interpretam
os dados contidos nestes objetos, fornecendo apenas a funcionalidade de recuperar as informaes parciais ou totais deste objeto para a aplicao. No entanto, o SGBDOO operaes necessrias para definir o comportamento deste objeto. Assim, conclui-se que um SGBDOO um sistema de tipo extensvel, ou seja, pode-se criar bibliotecas de tipos de objetos abstratos, e reutilizar em outras aplicaes. impresses digitais em um banco de dados de investigaes policiais. necessrio utilizar um objeto complexo no-estruturado. Assim, implementam-se as operaes, por exemplo, a que faz o processamento de como localizar uma digital dentre as armazenadas no banco. J um objeto complexo estruturado difere do no-estruturado pelo fato do SGBDOO conhecer a estrutura interna deste objeto. Ele constitudo da aplicao dos diversos construtores, de forma repetida. Por exemplo, um objeto complexo da classe CEP pode Para exemplificar, supondo-se que se deseja armazenar dados referentes s permite a criao de um tipo abstrato para estes tipos de objetos, e implementar as
13
conter os objetos locais numero_cep e logradouro, objetos que referenciam a outros objetos, como cidade e estado, e objetos que so conjunto de objetos, como bairros.
operaes podem atualizar o estado do objeto, recuperar parte de um objeto ou aplicar clculos sobre o objeto. A combinao entre as operaes de recuperao, clculo e atualizao tambm so possveis. Os usurios externos do objeto se tornam cientes apenas da interface de tipo de
objeto, que define os nomes e argumentos (parmetros) de cada operao. A implementao fica oculta aos usurios externos; ela inclui a definio das estruturas de dados internas do objeto e a implementao das operaes que acessam essas estruturas. Na terminologia OO, a parte de interface de cada operao chamada de assinatura, a
implementao da operao chamada de mtodo. Geralmente, um mtodo invocado enviando-se uma mensagem para o objeto, para que seja executado o mtodo correspondente. De acordo com Elmasri e Navathe (2005), o requisito de que todos os objetos de uma aplicao de banco de dados sejam completamente encapsulados bastante rgido. Uma maneira de relaxar este requisito dividir a estrutura de um objeto entre atributos (variveis de instncia) visveis e ocultos. Atributos visveis podem ser diretamente acessados para a leitura por parte de operadores externos ou por uma linguagem de consulta de alto nvel. Os atributos ocultos de um objeto so completamente encapsulados e somente podem ser acessados atravs de operaes predefinidas. Continuando com as definies de Elmasri e Navathe (2005), o termo classe
geralmente utilizado para fazer referncia a uma definio de tipo de objeto, juntamente
com as definies das operaes para aquele tipo. Um nmero de operaes declarado
14
definio da classe. Um mtodo (implementao) para cada operao dever ser definido em outro lugar, utilizando uma linguagem de programao. Operaes tpicas incluem a operao object constructor (construtora de objeto), que utilizada para criar um novo objeto e a operao destructor (destruidora), que utilizada para destruir um objeto. Outras operaes tambm podem ser declaradas, como as operaes modificadoras de objeto que objeto. de ponto (.). Se d uma referencia a um objeto qualquer, podemos invocar uma operao op1 como d.op1. Essa notao tambm utilizada para fazer referncia a atributos de um objeto. Geralmente objetos so criados por um programa de aplicao em execuo, mas nem todos os objetos devem ser armazenados no banco de dados. Objetos transientes existem durante a execuo de um programa e desaparecem uma vez terminada a execuo do programa. Objetos persistentes so armazenados no banco de dados e persistem mesmo aps a execuo do programa. Segundo Elmasri e Navathe (2005), os SGBDOO possuem dois mecanismos para persistir um objeto: nomeao e persistncia. O mecanismo de nomeao envolve dar a um objeto um nome persistente nico, Uma operao geralmente aplicada a um objeto, atravs da utilizao da notao
atravs do qual ele possa ser recuperado por aquele e outros programas. Todos esses nomes dados a objetos devem ser nicos dentro de um determinado banco de dados. Dessa forma os objetos persistentes nomeados so utilizados como ponto de entrada para o banco de dados, atravs dos quais usurios e aplicaes possam acess-los no banco de dados. O mecanismo de acessibilidade opera tornando o objeto acessvel a partir de algum
exemplo, suponha numa aplicao de controle de pedidos de servio, um banco de dados que mantm os servios oferecidos por esta empresa. Assim, tm-se a classe Servios, com chamada TodosServios, que um conjunto (set) de objetos da classe Servios. Desta automaticamente persistentes devido acessibilidade. os atributos nome, origem, destino e preo de viagem. Pode-se ento criar uma nomeao forma, todos os produtos podem ser adicionados a este conjunto, e tornam-se
15
PESSOA JURIDICA: Nome, Endereo, Telefone, DataCadastro, CGC, InscricaoEstadual. Note que os atributos Nome, Endereo, Telefone e DataCadastro existem tanto na
classe PESSOA FSICA quanto PESSOA JURIDICA. Assim, deve-se utilizar uma hierarquia de tipo, fazendo com que PESSOA JURIDICA e PESSOA JURIDICA sejam subtipos da classe PESSOA, por exemplo: PESSOA: Nome, Endereo, Telefone, DataCadastro PESSOA FSICA: subtype-of PESSOA: DataDeNasc, Idade, CPF. PESSOA JURIDICA subtype-of PESSOA: CGC, InscricaoEstadual. Sistemas de Banco de Dados OO que seguem o padro ODMG (Object Data
Management Group), a ser apresentado na Seo 2.3, permitem criar extenses para os tipos. Uma extenso um objeto persistente que possui um conjunto de todos os objetos da classe. O Banco de Dados impe uma restrio extenso, onde os objetos da extenso de 2005).
uma classe devem ser um subconjunto da extenso de sua superclasse (Elmasri e Navathe,
16
2.2.6 Polimorfismo
Segundo Larman (2000), os bancos de dados OO tambm esto preparados para o conceito de polimorfismo, ou sobrecarga de operador. Este conceito permite que um mesmo nome de operao, aplicado a objetos de classes diferentes e que tenham uma superclasse em comum, possa ter implementaes diferentes. Quando uma mensagem do objeto. passada ao objeto, o SGBDOO seleciona a implementao adequada de acordo com o tipo
formado por representaes da maioria dos fabricantes no mercado de banco de dados objeto. Membros do grupo esto comprometidos a incorporar o padro em seus produtos. O termo Modelo Orientado Objetos usado para o documento padro que contm a descrio geral das facilidades de um conjunto de linguagens de programao orientadas a objetos e a biblioteca de classes que pode formar a base para o Sistema de banco de Dados. estabelecer um padro para esta nova tecnologia. Assim, os sistemas passariam a ser mais portveis, pois uma aplicao desenvolvida sobre a base de um BDOO poderia facilmente ser adaptada para um outro sistema de banco de dados. Alm disto, interessante haver a interoperabilidade, ou seja, acessar diversos sistemas de banco de dados orientado a objeto utilizando uma mesma linguagem, (Elmasri e Navathe, 2005). Para tanto, os fabricantes de sistemas de banco de dados orientados a objeto se reuniram e criaram o padro ODMG. Este padro foi criado em 1993 com a verso 1.0, e foi revisto novamente para estabelecer a verso 2.0, que a mais atual (Silberschatz, 1999). principal diferena entre eles que um objeto possui um identificador do objeto e um valor atual e o literal possui apenas um valor, (Elmasri e Navathe, 2005). Objetos e literais so blocos de construo bsicos do modelo de objetos. A Com a criao dos SGBDOOs de diversos fabricantes, surgiu a necessidade de
17
de coleo. Os literais atmicos so valores de tipos predefinidos no banco, tais como inteiro, caracter, ponto flutuante, cadeia de caracteres (string), enumerao, etc. Os literais estruturados armazenam uma estrutura de dados, tais como hora (por exemplo, que coleo permitem armazenar uma coleo de literais ou objetos. So eles o Set, Bag, estruturado em hora, minuto, segundo e milisegundo), data e timestamp. J os literais de Array, que j foram explanados na Seo 2.2.2., e o Dictionary, que mantm uma coleo de associaes do tipo chave - valor. Este literal de coleo geralmente utilizado para criar um ndice em uma coleo de valores. O objeto na ODMG possui quatro caractersticas: identificador, estrutura, tempo de
Para Silberschatz (1999), um literal pode ser de trs tipos: atmico, estruturado ou
vida e estado. O identificador o OID, ou um nome nico no banco que referencia esta tempo de vida diz respeito se o objeto transiente ou persistente. E o estado o valor contido neste objeto (Silberschatz, 1999). instanciveis, ou seja, no possvel criar objetos a partir delas. J as classes possuem de heranas na ODMG. A primeira ocorre quando uma classe ou interface herda de uma
construtores de objetos, que podem ser persistidos no banco de dados. Existem dois tipos outra interface. Esta herana declarada pela palavra-chave extents, e neste caso permite herda somente as assinaturas de operaes e atributos finais (constantes). Portanto, a implementao deve ser feita na sub-classe da herana. Outro tipo de herana ocorre herana mltipla. somente entre classes, e explicitada pela palavra extends. Neste caso, no permitida No modelo ODMG, todos os objetos herdam a interface Object. Esta possui 3
que seja feita herana mltipla (Silberschatz, 1999). Note que a herana de uma interface
operaes: same_as, que compara a identidade do objeto com outro; copy, que efetua a copia do objeto em outro, e delete, que elimina o objeto. Segundo Silberschatz (1999),
para objetos de coleo, a ODMG possui tambm uma hierarquia de interfaces. Todos os objetos de coleo herdam da interface Collection, que disponibiliza as operaes padres para todas as demais interfaces de coleo. So elas Set, Bag, List, Array e Dictionary. Outro recurso que a ODMG especifica a declarao de relacionamentos entre objetos. Estes s podem ser utilizados em relacionamentos binrios (Silberschatz,
18
1999). Para exemplificar, suponha duas classes: Produto e Categoria. Na classe Produto, tem-se um atributo chamado categoria, que ir armazenar o OID de um objeto da classe categoria. J este objeto da classe categoria ter um atributo denominado possui_produtos, que ir armazenar uma coleo (Set) dos produtos desta categoria. A integridade deste
das classes de objeto, a ODMG apresenta mais trs conceitos: Extenses, Chaves e Objetos Para Silberschatz (1999), extenses so declaradas atravs da palavra chave extent.
Ela faz com que o sistema crie um objeto com o nome especificado, que ser uma coleo de todos os objetos desta classe. Uma chave declarada atravs da palavra-chave key. Ela utilizada para especificar que um ou mais atributos na classe sero exclusivos dos demais
objetos criados por esta classe. Esta restrio ser controlada automaticamente pelo sistema de banco de dados (Silberschatz, 1999). Por fim, o conceito de Objetos de Fbrica diz chamada ObjectFactory, que possui a operao new. Assim, o usurio pode implementar a operao new diferentemente para cada tipo de objeto. respeito criao de construtores de objetos. A ODMG disponibiliza uma interface padro
soluo proposta a adio de facilidades para manusear tais dados utilizando-se das no contexto SQL; representaes para objetos complexos no contexto SQL; herana no
19
2.5 PostgreSQL
Development Group (Postgresql, 2006). Toda esta seo foi baseada em documentos extrados do The Postgresql Global O PostgreSQL um Sistema Gerenciador de Banco de Dados Objeto-Relacional
(SGBDOR) desenvolvido no Departamento de Cincia da Computao da Universidade da Califrnia em Berkeley. O PostgreSQL descende do POSTGRESS, cdigo original de Berkeley, possuindo o cdigo fonte aberto. Fornece suporte s linguagens SQL92/SQL99,
alm de outras funcionalidades avanadas. O POSTGRESS foi pioneiro em muitos conceitos orientado a objeto que agora esto se tornando disponveis em alguns bancos de dados comerciais. Os SGBDs tradicionais suportam um modelo de dados composto por uma coleo de relaes com nome, contendo atributos de um tipo especfico. Nos sistemas comerciais em uso, os tipos possveis incluem nmero de ponto flutuante, inteiro, cadeia de caracteres, valores monetrios e data. amplamente reconhecido que este modelo no adequado sucesso os modelos anteriores principalmente pela sua simplicidade. Entretanto, esta simplicidade tornou a implementao de certas aplicaes muito difcil. O PostgreSQL Dentre elas, podemos destacar: herana (especializao e generalizao) avanado sistema de tipos de dado funes restries gatilhos integridade da transao oferece recursos adicionais pela incorporao de vrios conceitos e funcionalidades.
Estas funcionalidades colocam o PostgreSQL dentro da categoria de banco de dados referida como objeto-relacional. Repare que diferente daqueles referidos como orientados a objetos que, em geral, no so muito adequados para apoiar as linguagens tradicionais de funcionalidades de orientao a objetos, est firmemente ligado ao mundo dos bancos de banco de dados relacional. Portanto, embora o PostgreSQL possua algumas
20
dados relacionais. Na verdade, alguns bancos de dados comerciais incorporaram recentemente funcionalidades nas quais o PostgreSQL foi pioneiro.
seu suporte estavam consumindo grande parte do tempo que deveria ser dedicado s
21
pesquisas sobre banco de dados. Em um esforo para reduzir esta sobrecarga de suporte, o projeto do POSTGRES terminou oficialmente com a verso 4.2.
2.5.2. O Postgres95
Andrew Yu e Jolly Chen em 1994 adicionaram um interpretador da linguagem SQL ao POSTGRES, tornando-se um SGBDOR. O Postgres95 foi em seguida liberado para a Web para encontrar seu caminho no mundo como descendente de cdigo aberto do cdigo original do POSTGRES. em 25%. Muitas mudanas internas melhoraram o desempenho e a facilidade de O cdigo do Postgres95 era totalmente escrito em ANSI C e reduzido em tamanho
manuteno. O Postgres95 verso 1.0.x era 30-50% mais rpido que o POSTGRES verso
foram a linguagem de consultas PostQUEL foi substituda pelo SQL (implementado no simuladas no Postgres95 por meio de funes SQL definidas pelo usurio; as agregaes foram re-implementadas; o suporte para a clusula GROUP BY das consultas tambm foi adicionado. consultas SQL interativas utilizando o Readline do GNU. Alm do programa monitor, um novo programa, psql, foi disponibilizado para Um breve tutorial introduzindo as funcionalidades regulares da linguagem SQL, assim como as do Postgres95, foi distribudo junto com o cdigo fonte. O utilitrio make do GNU (no lugar do make do BSD) foi utilizado para a gerao. Alm disso, o Postgres95 dupla foi corrigido).
podia ser compilado com o GCC sem correes (o alinhamento de dados para a preciso
2.5.3. O PostgreSQL
Em 1996, por questes de convenincia, foi escolhido um novo nome para substituir o nome Postgre95. O nome PostgreSQL foi escolhido para refletir o relacionamento entre o POSTGRES original e as verses mais recentes com funcionalidade SQL. Ao mesmo tempo, foi mudado o nmero da verso para comear em 6.0, colocando os nmeros na
22
problemas existentes no cdigo do servidor. Com o PostgreSQL, a nfase foi mudada para reas.
a melhoria das funcionalidades e dos recursos, embora o trabalho continuasse em todas as As principais melhorias no PostgreSQL incluem: o bloqueio no nvel de tabela foi
substitudo por um sistema de concorrncia multi-verso, permitindo os que esto lendo continuarem a ler dados consistentes durante a atividade de escrita, possibilitando efetuar cpias de segurana utilizando o pg_dump enquanto o banco de dados se mantm disponvel para consultas; a implementao de funcionalidades importantes no servidor, incluindo subconsultas, padres, restries e gatilhos, triggers. A incorporao de funcionalidades adicionais compatveis com a linguagem SQL92, incluindo chaves primrias, chaves estrangeiras, identificadores entre aspas, converso implcita de tipo de cadeias de caracteres literais, converso explcita de tipos e inteiros binrio e hexadecimal. matrizes, e suporte adicional para tipos geomtricos. essencial da transao englobar vrios passos em uma nica operao de tudo ou nada. Transao um conceito fundamental de todo sistema de banco de dados. O ponto
Os tipos nativos foram aperfeioados, incluindo vrios tipos para data, hora, vetores e
Os estados intermedirios entre os passos no so vistos pelas demais transaes nenhum dos passos intermedirios ir afetar o banco de dados de forma alguma.
simultneas e, se ocorrer alguma falha que impea a transao chegar at o fim, ento O gatilho, trigger, pode ser definido para executar antes ou depois de uma operao de
insert, update ou delete, tanto uma vez para cada linha modificada quanto uma vez por
instruo SQL. Quando ocorre o evento do gatilho, a funo de gatilho chamada no momento apropriado para tratar o evento. A funo trigger deve ser criada antes do trigger. A linguagem SQL a que o PostgreSQL, e a maioria dos bancos de dados
relacionais, utiliza como linguagem de comandos. Entretanto, todas as declaraes SQL devem ser executadas individualmente pelo servidor de banco de dados. Isto significa que o aplicativo cliente deve enviar o comando para o servidor de banco de dados, aguardar que seja processado, receber os resultados, realizar algum processamento, e enviar o prximo comando para o servidor. Tudo isto envolve comunicao entre processos e pode,
23
tambm, envolver trfego na rede se o cliente no estiver na mesma mquina onde se encontra o servidor de banco de dados. Usando a linguagem PL/pgSQL pode ser agrupado um bloco de processamento e uma srie de comandos dentro do servidor de banco de dados, juntando o poder da linguagem procedural com a facilidade de uso da linguagem SQL, e economizando muito tempo, porque no h necessidade da sobrecarga de comunicao entre o cliente e o servidor. Isto pode aumentar o desempenho consideravelmente. Surge da o conceito de procedimento armazenado, stored precedure. operadores e funes da linguagem SQL. Tambm podem ser utilizados na linguagem PL/pgSQL todos os tipos de dados,
24
3. METODOLOGIA
3.1. Tipo de Pesquisa
segundo interesses, condies, campos e objetivos. Cabe ao pesquisador a escolha do mtodo que melhor se aplique sua investigao. Nesse sentido, quanto a sua natureza a presente pesquisa de carter tecnolgica, A classificao dos tipos de pesquisas varia de acordo com o enfoque dado,
uma vez que utiliza conhecimentos bsicos e tecnologias existentes sobre bancos de dados desenvolvimento de aplicaes.
e tem como objeto um novo processo de utilizao desta tecnologia para o Quanto aos objetivos a pesquisa pode ser classificada como exploratria com
procedimento experimental de laboratrio com finalidade apresentar novos conceitos de implementao de banco de dados utilizando a tecnologia objeto-relacional. livros , revistas, teses e dissertaes. A pesquisa contou com apoio de base bibliogrfica e documental baseadas em
com as duas caractersticas de modelagem, por um sistema livre e tambm pioneiro neste conceito de banco de dados objeto-relacional.
facilidades e dificuldades na construo das tabelas, das funes da execuo de operaes bsicas de insero, atualizao, remoo e manuteno no banco de dados. Ao fim das comparaes uma avaliao foi feita para decidir sobre a viabilidade de
se utilizar a modelagem objeto-relacional em um novo projeto de banco de dados, ou ainda em migrar da tecnologia relacional para esta tecnologia hbrida.
26
4. RESULTADOS E DISCUSSES
4.1 Descrio da Aplicao
Transportadora. O sistema de gerenciamento de clientes e de pedidos de servios de transporte e possui as seguintes funcionalidades: Cadastrar Clientes, Cadastrar Pedido de Servio e alguns tipos de consultas. O processo de cadastro constitui das operaes de insero, modificao e excluso. O Cliente pode ser uma Pessoa Fsica ou uma Pessoa Jurdica, sendo que alguns O sistema utilizado como modelo neste trabalho uma aplicao de uma Empresa
atributos so comuns aos dois como outros so especficos para cada. Os atributos comuns entre eles so o Nome, Data de Cadastro, Rua, Nmero, Complemento, Bairro, Cidade, Estado, Telefones, e-mail e Referncia. O Cliente Pessoa Fsica possui CPF e Data de CGC e Inscrio Estadual.
nascimento como atributos especficos j os atributos especficos para Pessoa Jurdica so Os pedidos so classificados como Pedido de Mudana e Pedidos de Transporte de
Carga. Os atributos comuns aos pedidos so: Data de Apanha, Local de Apanha,
Responsvel, Data de Entrega, Local de Entrega, Valor do Transporte, Valor do Assegurado, Forma de Pagamento, Situao do Pagamento e Observao. O atributo especfico para Pedido de Mudana Lista de Nome dos Mveis que sero transportados e para Pedido de Transporte de Carga a Lista de Produtos contendo nome do produto, quantidade e peso. Para processar o cadastro de Clientes e Pedidos no banco de dados da aplicao foram construdas funes especficas para o modelo relacional e para o modelo objetorelacional, afim de serem posteriormente comparadas as duas implementaes. da aplicao em questo. As sees a seguir apresentam os modelos de dados relacional e objeto-relacional
28
O sistema baseado no modelo relacional possui oito entidades sendo elas denominadas Clientes, Telefones, Contatos, Pedidos (representa o relacionamento), Pedido de Mudana, Pedido de Transporte de Carga, Lista de Mveis e Lista de Produtos. A tabela Clientes utilizada tanto para armazenar Clientes Pessoa Fsica quanto
Clientes Pessoa Jurdica. Como um Cliente pode possuir mais de um telefone e a quantidade de telefones pode variar de cliente para cliente foi criada uma tabela chamada Telefones somente para armazenar os telefones referentes ao cliente. A tabela denominada Contatos tem a mesma funcionalidade da tabela de Telefones j que para um Cliente podemos ter vrios contatos referentes a ele. A tabela Pedidos faz o relacionamento entre os Clientes e os Pedidos de Mudana
ou Pedidos de Transporte de Carga. Houve a necessidade de criar tabela Lista de Mveis para associar ao pedido de mudana os mveis que sero transportados. Uma tabela de Lista de Produtos tambm foi criada para armazenar os produtos de um Pedido de Transporte de Carga. criao das funes esto disponveis no Anexo B. Os scripts de criao das tabelas esto disponveis no Anexo A e os scripts de
29
Figura 4: Modelo de Dados Objeto-relacional. Fonte: Elaborado pelo autor. Para a construo do modelo de dados da aplicao baseado no modelo objeto-
relacional foram criadas seis entidades. So elas: Pessoa, Pessoa Fsica, Pessoa Jurdica,
Pedidos, PedidoMudanca, PedidoTransCarga. As entidades PessoaFisica e PessoaJuridica herdam atributos da entidade pai denominada Pessoa, portanto sendo chamadas de entidades filhas, representando os conceitos de herana. As entidades PedidoMudanca e PedidoTransCarga herdam os atributos da entidade Pedido utilizando tambm dos conceitos de herana oriundos do modelo orientado a objeto.
30
um vetor do tipo texto declarado como text[], no qual usado para armazenar atributo multivalorado. O endereo considerado um atributo composto pde ser representado por um tipo de dado definido pelo usurio, este tipo foi denominado como tpEnd e possui os pagamento, denominado um atributo composto, foi criado o tipo de dado tpPagamento, com os atributos it_parcelas e it_valor representando respectivamente o nmero de parcelas e o valor da parcela. O tipo tpProduto armazena os atributos do atributo composto chamado produto da tabela PedidoTransCarga. criao das funes esto disponveis no Anexo D. Os scripts de criao das tabelas esto disponveis no Anexo C e os scripts de atributos rua, nmero, complemento, cidade, bairro e estado. Para o atributo forma de
Vale destacar o tipo de dado do atributo Telefone oferecido pelo PostgresSQL que
construdo um nmero menor de tabelas. Isto foi possvel devido a utilizao de vetores
para representar atributos multivalorados, que eliminou a necessidade da existncia de uma nova tabela para este fim. Por outro lado, no modelo relacional os telefones de um cliente precisaram ser armazenados em uma tabela especfica para isto. A definio de tipos de dados pelo usurio possibilitou que o atributo composto
endereo fosse representado diretamente na entidade, como um nico atributo. Diminuindo o nmero de colunas das tabelas e aumentando a familiaridade com as linguagens de programao OO.
31
CREATE TABLE bdrel clientes ( pkcpf_cgc int4 NOT NULL, inscestadual int4, nome varchar(200), datacadastro date, datanascimento date, rua varchar(200), cidade varchar(60), estado varchar(2), email varchar(200), referencia text, tipo varchar(20), CONSTRAINT clientes_pkey PRIMARY KEY (pkcpf_cgc) ) CREATE TABLE bdrel.telefones ( clientes_pkcpf_cgc int4 NOT NULL, sttelefone varchar(13), CONSTRAINT telefones_pkey PRIMARY KEY (clientes_pkcpf_cgc), CONSTRAINT telefones_clientes_pkcpf_cgc_fkey FOREIGN KEY (clientes_pkcpf_cgc) REFERENCES bdrel.clientes (pkcpf_cgc) ON UPDATE NO ACTION ON DELETE NO ACTION )
Figura 5: Script de criao das tabelas Cliente e Telefones no modelo relacional. Fonte: Elaborado pelo autor.
CREATE TYPE bdobjrel.tpend AS (rua varchar(100), num int4, bairro varchar(50), complemento varchar(50), cidade varchar(50), estado varchar(2)); CREATE TABLE bdobjrel.pessoa ( nome varchar(100), datacadastro date, endereco bdobjrel.tpend, telefone text[], email varchar(50), referencia text )
Figura 6: Script de criao da tabela Cliente e do tipo Endereo no modelo OR. Fonte: Elaborado pelo autor. mapeamento dos objetos das linguagens de programao para as relaes existentes no banco de dados, evitou a construo de duas relaes com atributos iguais entre si e otimizou o processo de consulta, insero, atualizao e remoo. O conceito de herana presente no modelo objeto-relacional eliminou o processo de
32
select, insert, update e delete ficaram prejudicadas, pois deve ser feito acesso a pelo menos um pedido preciso especificar o tipo do pedido na aplicao e mape-lo nas relaes Pedidos e PedMudanca ou PedTspCarga do modelo relacional. No modelo objeto-relacional as operaes de select, insert, update e delete foram
duas relaes do banco de dados para a execuo das mesmas. Por exemplo, para inserir
otimizadas, pois precisaram ser executadas em apenas uma das relaes, PedMudanca ou PedTspCarga. Alm disso, no caso do comando select, se for preciso fazer uma consulta que retorne todos os pedidos existentes no banco de dados basta fazer uma consulta em uma relao Pedido, enquanto que, no caso do modelo relacional, seria preciso fazer uma no banco de dados objeto-relacional: select * from bdobjrel.pedido unio de duas relaes. Exemplo de uma consulta que retorna todos os pedidos existentes O conceito de OID, onde cada objeto possui um identificador nico dentro do banco
de dados, diminuiu a necessidade da utilizao das restries de entidade e de integridade referencial (ou uso de chave primria e de chave estrangeira). Os identificadores de objetos permitem fazer referncias entre objetos. Por exemplo, no modelo objeto-relacional, o relacionamento entre o cliente pessoaFisica ou o cliente pessoaJuridica com a relao pedidos feito usando o OID do exemplo.
CREATE TABLE bdobjrel.pedido ( oid_cliente oid, datapedido date dataapanha date, localapanha bdobjrel.tpend, dataentrega date, localentrega bdobjrel.tpend, valortransporte float4, valorassegurado float4, formapagamento bdobjrel.tppagamento, situacaopagamento bool DEFAULT false, observacao text, ) WITH OIDS;
cliente como referencia na relao pedido. A Figura 7 apresenta o cdigo referente a este
Figura 7: Script de criao da tabela Pedido com uso de OID. Fonte: Elaborado pelo autor.
33
funes SQL dentro de um bloco, tirando da aplicao a responsabilidade sobre as funes j que estas esto armazenadas no servidor, alm do mais todo o processamento feito de uma vez s, diminuindo o fluxo de dados entre o cliente e o servidor de banco de dados. processamento, e um possvel aumento no desempenho do sistema. Isso pode acarretar uma economia no tempo de desenvolvimento da aplicao, no tempo de A Figura 8 apresenta um exemplo de uma funo que insere um pedido, mas antes
preciso fazer uma busca para saber qual o OID do cliente que est fazendo o pedido para depois inserir na tabela do pedido especificado.
CREATE OR REPLACE FUNCTION bdobjrel.f_inserepedidomudanca(text, date, bdobjrel.tpend, date, bdobjrel.tpend, _text, float8, float8, bdobjrel.tppagamento, bool, text) RETURNS bool AS $BODY$ declare oidcl oid; date,
begin select into oidcl oid from bdobjrel.pessoa where nome = $1; IF oidcl IS null THEN return false; ELSE insert into bdobjrel.ped_mudanca (oid_cliente, datapedido, dataapanha, localapanha, dataentrega, localentrega, listainstalacao, valortransporte, valorassegurado, formapagamento, situacaopagamento, observacao) values (oidcl, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12); return true; END IF ; end; $BODY$ LANGUAGE 'plpgsql' VOLATILE;
referencial de um banco de dados. Por exemplo, supondo que s permitido excluir alguma pessoa se esta no possui nenhum pedido recente, considerando que um pedido recente aquele feito a menos de 60 dias, portanto no deve-se apagar esse cliente, muito menos os pedidos referentes a ele. Quando um registro da relao pessoa vai ser excludo, um trigger associado a essa relao dispara e antes de excluir o registro ele verifica se essa
pessoa possui algum pedido recente. Se existir algum pedido recente nada feito, caso
34
contrrio apaga-se a pessoa e todos os pedidos antigos referentes a esta pessoa. A Figura 9 apresenta o trigger referente a este exemplo.
CREATE TRIGGER tg_excluircliente BEFORE DELETE ON bdobjrel.pessoa FOR EACH ROW EXECUTE PROCEDURE bdobjrel.f_excluir_cliente(); CREATE OR REPLACE FUNCTION bdobjrel.f_excluir_cliente() RETURNS "trigger" AS $BODY$ Declare ultimoPedido date; data date; n_dias float; oidCli oid; BEGIN select into n_dias date(now()) - (SELECT max(datapedido) from bdobjrel.ped_mudanca where oid_cliente = old.oid) AS dias; oidCli:= old.oid; if n_dias >= 60 or n_dias is null then DELETE FROM bdobjrel.ped_mudanca WHERE oid_cliente = oidCli ; RAISE NOTICE 'Cliente excludo com sucesso!'; else RAISE EXCEPTION 'Cliente com pedido recente!'; end if; return old; END; $BODY$ LANGUAGE 'plpgsql' VOLATILE;
Figura 9: Exemplo de trigger. Fonte: Elaborado pelo autor. O PostgreSQL d suporte ao polimorfismo, que contribui para a criao de funes de mesmo nome e que desempenham o mesmo papel para diferentes objetos dentro do banco de dados. Um exemplo pode ser visto com o caso da funo insereCliente que pode definir qual seu comportamento de acordo com os atributos passados pela aplicao, tirando a responsabilidade do programador de ter que decidir onde o cliente dever ser inserido. A Figura 10 apresenta a criao de funes que representam este exemplo. inserir um cliente pessoa fsica ou um cliente pessoa jurdica, ficando por parte do SGBD
35
CREATE OR REPLACE FUNCTION bdobjrel.f_insereCliente(int4, int4, text, date, bdobjrel.tpend, _text, text, text) RETURNS bool AS $BODY$ declare cgc alias for $1; insc_est alias for $2; nom alias for $3; dt_cad alias for $4; ender alias for $5; tel alias for $6; e_mail alias for $7; referen alias for $8; begin insert into bdobjrel.pessoajuridica (it_cgc, it_inscrestadual, nome, datacadastro, endereco, telefone, email, referencia ) values (cgc, insc_est, nom, dt_cad, ender, tel, e_mail, referen); RAISE NOTICE 'Cliente PF inserido com sucesso!'; return true; end; $BODY$ LANGUAGE 'plpgsql' VOLATILE; CREATE OR REPLACE FUNCTION bdobjrel.f_inserecliente(int4, date, text, date, bdobjrel.tpend, _text, text, text) RETURNS bool AS $BODY$ declare cpf alias for $1; dt_nasc alias for $2; nom alias for $3; dt_cad alias for $4; ender alias for $5; tel alias for $6; e_mail alias for $7; referen alias for $8; begin insert into bdobjrel.pessoafisica (it_cpf, dt_nascimento, nome, datacadastro, endereco, telefone, email, referencia ) values (cpf, dt_nasc, nom, dt_cad, ender, tel, e_mail, referen); RAISE NOTICE 'Cliente PF inserido com sucesso!'; return true; end; $BODY$ LANGUAGE 'plpgsql' VOLATILE;
Figura 10: Exemplos de criao de funes polimorfismo. Fonte: Elaborado pelo autor. pode-se afirmar que este SGBD bastante flexvel, pois compatvel com o modelo de bancos de dados relacional e compatvel com a teoria de programao orientada a objetos. Devido ao fato da possibilidade da utilizao de procedimentos armazenados e Analisando a implementao do banco de dados objeto-relacional no PostgreSQL
gatilhos, juntamente com a definio dos dados, a utilizao deste tipo de SGBD minimiza o tempo gasto no desenvolvimento de aplicaes, uma vez que o seu cdigo ser reduzido. Todas as funes de manipulao de dados estando armazenadas no prprio SGBD,
consequentemente reduz o gasto com processamento de comunicao entre o cliente e o servidor de banco de dados, principalmente quando estes esto em mquinas diferentes. Diante disto, a administrao e a manuteno do banco de dados facilitada.
36
5. CONCLUSO
implementaes distintas de um mesmo sistema de banco de dados, utilizando dois modelos bancos de dados: o relacional e o objeto-relacional e analisar, a partir das comparaes, se a adoo do modelo objeto-relacional para implementao de aplicaes convencionais apresenta vantagens sobre o modelo relacional foram alcanados. conceitos da tecnologia de orientao a objetos, tais como, identidade de objeto, herana, procedimentos armazenados. Os estudos realizados permitem concluir que, embora a ODMG defina um padro banco de dados orientado a objetos, ainda h carncia em relao sua padronizao, pois parcialmente este padro. PostgreSQL flexvel, compatvel com os bancos de dados relacionais, compatvel com as no desenvolvimento de aplicaes, reduz o gasto com processamento de comunicao, facilitando assim a administrao e a manuteno do banco de dados. O trabalho realizado contribuiu com a pesquisa sobre a recente introduo da Os resultados das implementaes e das anlises feitas mostraram que o muitos SGBDs possuem suas prprias linguagens de programao ou implementam apenas Pode-se observar que o PostgreSQL permite a implementao dos principias Os objetivos propostos neste trabalho de fazer uma comparao entre duas
tecnologia de orientao a objetos na rea de bancos de dados, em especial quando aplicada juntamente com a consolidada tecnologia de banco de dados relacional. Sendo assim, este trabalho apresenta a base terica fundamental para a compreenso destas tecnologias e sua viabilidade no desenvolvimento de determinadas aplicaes, dando de um sistema relacional existente para um sistema objeto-relacional. Como sugesto de trabalhos futuros sugere-se o desenvolvimento de uma aplicao que utilize o banco de dados objeto-relacional implementado, aproveitando todas as suas funcionalidades criadas. referentes ao uso de diferentes modelos de bancos de dados, no foi desenvolvida uma Devido ao fato deste trabalho estar comparando caractersticas de programao
suporte e orientao para quem a desconhece e deseja adot-la ou para quem deseja migrar
aplicao para o sistema, impossibilitando que testes mais consistentes sobre desempenho
fossem realizados no mesmo. Sendo assim, este trabalho no teve como objetivo fazer uma sugere-se que isto seja feito num trabalho futuro.
38
6. REFERNCIAS BIBLIOGRFICAS
CARDOSO, Olinda N. P. Banco de Dados. Lavras: UFLA/FAEPE, 2003. CODD, E. F. A Relational Model of Data for Large Shared Data Banks. Revista CACM. DATE, J. C. Introduo a Sistemas de Bancos de Dados, traduo da 7a. Edio Americana, Rio de Janeiro. Campus, 2000. ELMASRI, R. & NAVATHE, S. B. Sistemas de Banco de Dados 4 Edio, So Paulo: Addison Wesley, 2005. LARMAN, C. Utilizando UML e padres. Porto Alegre: Bookman, 2000. NEVES, Denise Lemes F. PostgreSQL: Conceitos e Aplicaes. So Paulo: rica, 2002. OLIVEIRA, C. H. P. Bancos de Dados Livre x Pago. Disponvel em: http://www.sqlmagazine.com.br/Artigos/Outros/01_Banco_FreeXPago.asp. Acessado em: 08.dez.2005. POSTGRESQL, The Postgresql Global Development Group. Documentao do PostgreSQL 8.0.0 Disponvel em: http://pgdocptbr.sourceforge.net/pg80/. Acessado em: 27.mar.06. RODRIGUES JNIOR, M. C. A Implementao Objeto-relacional no Oracle, SQL Magazine, Edio 15, Ano 2, pgina 8, 2005. SILBERSCHATZ, Abranham; KORTH, Henry F. e SUDARSHAN, S. Sistema de Banco de Dados. 3 ed. So Paulo: MAKRON Books, 1999. STONEBRAKER, M. ROWE, LAWRENCE A. e HIROHAMA, M. The implementation of POSTGRES. Transactions on Knowledge and Data Engineering, Vol. 2, NO. 1, March 1990.
ANEXO A
Script de criao das tabelas do modelo de dados relacional. CREATE TABLE bdrel.clientes ( pkcpf_cgc int4 NOT NULL, inscestadual int4, nome varchar(200), datacadastro date, datanascimento date, rua varchar(200), cidade varchar(60), estado varchar(2), email varchar(200), referencia text, tipo varchar(20), CONSTRAINT clientes_pkey PRIMARY KEY (pkcpf_cgc) ); CREATE TABLE bdrel.contatos ( idcontato serial NOT NULL, cliente_cpf_cgc int4 NOT NULL, nome varchar(100), cpf int4, cargo varchar(50), telefone varchar[], email varchar(50), CONSTRAINT contatos_pkey PRIMARY KEY (idcontato), CONSTRAINT contatos_cliente_cpf_cgc_fkey FOREIGN KEY (cliente_cpf_cgc) REFERENCES bdrel.clientes (pkcpf_cgc) ON UPDATE CASCADE ON DELETE CASCADE ); CREATE TABLE bdrel.telefones ( clientes_pkcpf_cgc int4 NOT NULL, sttelefone varchar(13), CONSTRAINT telefones_pkey PRIMARY KEY (clientes_pkcpf_cgc), CONSTRAINT telefones_clientes_pkcpf_cgc_fkey FOREIGN KEY (clientes_pkcpf_cgc) REFERENCES bdrel.clientes (pkcpf_cgc) ON UPDATE NO ACTION ON DELETE NO ACTION );
39
CREATE TABLE bdrel.pedidos ( pkcodpedido serial NOT NULL, fkcliente_cpf_cgc int4 NOT NULL, tiposervico varchar(40), datapedido date, CONSTRAINT pedidos_pkey PRIMARY KEY (pkcodpedido), CONSTRAINT pedidos_fkcliente_cpf_cgc_fkey FOREIGN KEY (fkcliente_cpf_cgc) REFERENCES bdrel.clientes (pkcpf_cgc) ON UPDATE CASCADE ON DELETE CASCADE ); CREATE TABLE bdrel.pedidomudancas ( pkcodmud int4 NOT NULL DEFAULT nextval('bdrel.mudancas_pkcodmud_seq'::text), fkcodpedido int4 NOT NULL, dataapanha date, localapanha varchar(255), dataentrega date, localentrega varchar(255), valortransporte float4, valorassegurado float4, formapagamento varchar(200), situacaopagamento varchar(200), observacao text, CONSTRAINT mudancas_pkey PRIMARY KEY (pkcodmud), CONSTRAINT mudancas_fkcodpedido_fkey FOREIGN KEY (fkcodpedido) REFERENCES bdrel.pedidos (pkcodpedido) ON UPDATE CASCADE ON DELETE CASCADE ); CREATE TABLE bdrel.listademoveis ( pkcodmovel serial NOT NULL, "fkCodmud" int4 NOT NULL, movel varchar(60) NOT NULL, quantidade int4 NOT NULL, CONSTRAINT listademoveis_pkey PRIMARY KEY (pkcodmovel), CONSTRAINT "listademoveis_fkCodmud_fkey" FOREIGN KEY ("fkCodmud") REFERENCES bdrel.pedidomudancas (pkcodmud) ON UPDATE RESTRICT ON DELETE RESTRICT );
40
CREATE TABLE bdrel.pedidotranscarga ( pkcodtran int4 NOT NULL DEFAULT nextval('bdrel.transcarga_pkcodtran_seq'::text), fkcodpedido numeric NOT NULL, dataapanha date, localapanha varchar(255), dataentrega date, localentrega varchar(255), valortransporte float4, valorassegurado float4, formapagamento varchar(200), situacaopagamento varchar(200), observacao text, CONSTRAINT transcarga_pkey PRIMARY KEY (pkcodtran), CONSTRAINT transcarga_fkcodpedido_fkey FOREIGN KEY (fkcodpedido) REFERENCES bdrel.pedidos (pkcodpedido) ON UPDATE CASCADE ON DELETE CASCADE ); CREATE TABLE bdrel.listadeprodutos ( produto varchar(60), quantidade int4, peso float8, fkcodtran int4 NOT NULL, "pkCodlistaprod" int4 NOT NULL DEFAULT nextval('bdrel."listadeprodutos_pkCodlistaprod_seq"'::text), CONSTRAINT listadeprodutos_pkey PRIMARY KEY ("pkCodlistaprod"), CONSTRAINT listadeprodutos_fkcodtran_fkey FOREIGN KEY (fkcodtran) REFERENCES bdrel.pedidotranscarga (pkcodtran) ON UPDATE RESTRICT ON DELETE RESTRICT );
41
ANEXO B
Script de criao das funes do modelo de dados relacional. CREATE OR REPLACE FUNCTION bdrel.inserepessoafisica(int4, text, date, date, text, text, text, text, text, text) RETURNS bool AS $BODY$ declare itcpf alias for $1; stnome alias for $2; dtnasc alias for $3; dtcad alias for $4; strua alias for $5; stcidade alias for $6; stestado alias for $7; stemail alias for $8; streferencia alias for $9; sttipo alias for $10; begin insert into bdrel.clientes (pkcpf_cgc,nome,datanascimento, dataCadastro,rua,cidade,estado,email,referencia) values(itcpf, stnome, dtnasc, dtcad, strua, stcidade, stestado, stemail, streferencia); return true; end; $BODY$ LANGUAGE 'plpgsql' VOLATILE; CREATE OR REPLACE FUNCTION bdrel.inserepessoajuridica(int4, text, int4, date, text, text, text, text, text, text) RETURNS bool AS $BODY$ declare itcgc alias for $1; stnom alias for $2; itinsc alias for $3; dtcad alias for $4; strua alias for $5; stcidade alias for $6; stestado alias for $7; stemail alias for $8; streferencia alias for $9; sttipo alias for $10; begin insert into bdrel.clientes (pkcpf_cgc, nome, inscestadual, dataCadastro, rua, cidade, estado, email, referencia, tipo) values(itcgc, stnom, itinsc, dtcad, strua, stcidade, stestado, stemail, streferencia,sttipo); return true; end; $BODY$ LANGUAGE 'plpgsql' VOLATILE;
42
CREATE OR REPLACE FUNCTION bdrel.inseremudanca(text, text, text, text, text) RETURNS bool AS $BODY$ declare cpf_cgc int; codPedido int; stnome alias for $1; dtpedido alias for $2; stservico alias for $3; dtapanha alias for $4; stlocalapanha alias for $5; Begin /*recupero cpf_cgc do cliente */ cpf_cgc = bdrel.recupera_cpfcgc(stnome); /*insere o pedido para o cliente */ insert into bdrel.Pedidos (fkcliente_cpf_cgc, datapedido, tiposervico) values (cpf_cgc, dtpedido::date, stservico); /*dtpedido::date (converte a string passada no tipo data)*/ /* recupera o codigo pedido do cliente referente a data */ codPedido = bdrel.recuperacodpedido(cpf_cgc, dtpedido::date); insert into bdrel.pedidomudancas (fkcodpedido, dataapanha, localapanha) values (codPedido, dtapanha::date, stlocalapanha); return true; end;$BODY$ LANGUAGE 'plpgsql' VOLATILE; CREATE OR REPLACE FUNCTION bdrel.inseretranspcarga(text, text, text, text, text) RETURNS bool AS $BODY$ declare cpf_cgc int; codPedido int; stnome alias for $1; dtpedido alias for $2; stservico alias for $3; dtapanha alias for $4; stlocalapanha alias for $5; Begin /*recupero cpf_cgc do cliente */ cpf_cgc = bdrel.recupera_cpfcgc($1); /*Insere o pedido*/ insert into bdrel.Pedidos (fkcliente_cpf_cgc, datapedido, tiposervico) values (cpf_cgc, dtpedido::date, stservico); /*dtpedido::date (converte a string passada no tipo data)*/ /* recupera o codigo pedido do cliente referente a data*/ codPedido = bdrel.recuperacodpedido(cpf_cgc, dtpedido::date); /*insere o servio de transporte de materiais*/ insert into bdrel.pedidotransCarga (fkcodpedido, dataapanha, localapanha) values (codPedido, dtapanha::date, stlocalapanha); return true; end;$BODY$ LANGUAGE 'plpgsql' VOLATILE;
43
CREATE OR REPLACE FUNCTION bdrel.recupera_cpfcgc(text) RETURNS SETOF int4 AS $BODY$ select pkcpf_cgc from bdrel.clientes where nome = $1; $BODY$ LANGUAGE 'sql' VOLATILE; CREATE OR REPLACE FUNCTION bdrel.recuperacodpedido(int4, text) RETURNS SETOF int4 AS $BODY$ select pkcodpedido from bdrel.pedidos where fkcliente_cpf_cgc = $1 and datapedido = $2::date; $BODY$ LANGUAGE 'sql' VOLATILE;
44
ANEXO C
Script de criao de tipos de dados do modelo de dados objeto-relacional. CREATE TYPE bdobjrel.tpend AS ( rua varchar(100), num int4, bairro varchar(50), complemento varchar(50), cidade varchar(50), estado varchar(2) ); create type bdobjrel.tpPagamento as( it_parcelas int, ft_valor float ) CREATE TYPE bdobjrel.tpproduto AS ( produto text, quantidade integer, peso float ) Script de criao de tabelas do modelo de dados relacional. CREATE TABLE bdobjrel.pessoa( nome varchar(100), datacadastro date, endereco bdobjrel.tpend, telefone text[], email varchar(50), referencia text ) WITH OIDS; create table bdobjrel.pessoafisica( it_cpf int unique, dt_nascimento date )inherits(bdobjrel.pessoa) WITH OIDS;
45
create table bdobjrel.pessoajuridica ( it_cgc int unique, it_inscrestadual int )inherits(bdobjrel.pessoa) WITH OIDS; CREATE TABLE bdobjrel.pedido ( dataapanha date, localapanha bdobjrel.tpend, dataentrega date, localentrega bdobjrel.tpend, valortransporte float4, valorassegurado float4, formapagamento bdobjrel.tppagamento, situacaopagamento bool DEFAULT false, observacao text, oid_cliente oid, datapedido date ) WITH OIDS; create table bdobjrel.ped_mudanca ( listainstalacao text[2] ) inherits(bdobjrel.pedido) create table bdobjrel.ped_tspcarga ( produto bdobjrel.tpproduto ) inherits(bdobjrel.pedido)
46
ANEXO D
Script de criao das funes do modelo de dados objeto-relacional. CREATE OR REPLACE FUNCTION bdobjrel.f_inserecliente(int4, date, text, date, bdobjrel.tpend, _text, text, text) RETURNS bool AS $BODY$ declare cpf alias for $1; dt_nasc alias for $2; nom alias for $3; dt_cad alias for $4; ender alias for $5; tel alias for $6; e_mail alias for $7; referen alias for $8; begin insert into bdobjrel.pessoafisica (it_cpf, dt_nascimento, nome, datacadastro, endereco, telefone, email, referencia ) values (cpf, dt_nasc, nom, dt_cad, ender, tel, e_mail, referen); RAISE NOTICE 'Cliente PF inserido com sucesso!'; return true; end; $BODY$ LANGUAGE 'plpgsql' VOLATILE; CREATE OR REPLACE FUNCTION bdobjrel.f_inserecliente(int4, int4, text, date, bdobjrel.tpend, _text, text, text) RETURNS bool AS $BODY$ declare cgc alias for $1; insc_est alias for $2; nom alias for $3; dt_cad alias for $4; ender alias for $5; tel alias for $6; e_mail alias for $7; referen alias for $8; begin insert into bdobjrel.pessoajuridica (it_cgc, it_inscrestadual, nome, datacadastro, endereco, telefone, email, referencia ) values (cgc, insc_est, nom, dt_cad, ender, tel, e_mail, referen); RAISE NOTICE 'Cliente PF inserido com sucesso!'; return true; end; $BODY$ LANGUAGE 'plpgsql' VOLATILE;
47
CREATE OR REPLACE FUNCTION bdobjrel.f_alterarpessoafisica(int4, date, text, date, bdobjrel.tpend, _text, text, text) RETURNS bool AS $BODY$ declare cpf alias for $1; dt_nasc alias for $2; nom alias for $3; dt_cad alias for $4; ender alias for $5; tel alias for $6; e_mail alias for $7; referen alias for $8; begin UPDATE bdobjrel.pessoafisica SET it_cpf = cpf, dt_nascimento = dt_nasc, nome = nom, datacadastro = dt_cad, endereco = ender, telefone = tel, email = e_mail, referencia = referen WHERE it_cpf = cpf ; IF NOT FOUND THEN RAISE EXCEPTION 'no foi encontrado o cliente !'; return false; ELSE return true; END IF; end; $BODY$ LANGUAGE 'plpgsql' VOLATILE; CREATE OR REPLACE FUNCTION bdobjrel.f_alterarpessoajuridica(int4, int4, text, date, bdobjrel.tpend, _text, text, text) RETURNS bool AS $BODY$ declare cgc alias for $1; insc_est alias for $2; nom alias for $3; dt_cad alias for $4; ender alias for $5; tel alias for $6; e_mail alias for $7; referen alias for $8; begin UPDATE bdobjrel.pessoajuridica SET it_cgc = cgc, it_inscrestadual = insc_est, nome = nom, datacadastro = dt_cad, endereco = ender, telefone = tel, email = e_mail, referencia = referen WHERE it_cgc = cgc ; IF NOT FOUND THEN RAISE EXCEPTION 'no foi encontrado o cliente !'; return false; ELSE return true; END IF; end; $BODY$ LANGUAGE 'plpgsql' VOLATILE;
48
CREATE OR REPLACE FUNCTION bdobjrel.f_inserepedidomudanca(text, date, date, bdobjrel.tpend, date, bdobjrel.tpend, _text, float8, float8, dobjrel.tppagamento, bool, text) RETURNS bool AS $BODY$ declare oidcl oid; begin select into oidcl oid from bdobjrel.pessoa where nome = $1; IF oidcl IS null THEN return false; ELSE insert into bdobjrel.ped_mudanca (oid_cliente, datapedido, dataapanha, localapanha, dataentrega, localentrega, listainstalacao, valortransporte, valorassegurado, formapagamento, situacaopagamento, observacao) values (oidcl, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12); return true; END IF ; end; $BODY$ LANGUAGE 'plpgsql' VOLATILE; CREATE OR REPLACE FUNCTION bdobjrel.f_inserepedidotspcarga(text, date, date, bdobjrel.tpend, date, bdobjrel.tpend, text, float8, float8, float8, bdobjrel.tppagamento, text, text) RETURNS bool AS $BODY$ declare oidcl oid; begin select into oidcl oid from bdobjrel.pessoa where nome = $1; IF oidcl IS null THEN return false; ELSE insert into bdobjrel.ped_tspcarga (oid_cliente, datapedido, dataapanha, localapanha, dataentrega, localentrega, produto, peso, valortransporte, valorassegurado, formapagamento, situacaopagamento, observacao) values (oidcl, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13); return true; END IF ; end; $BODY$ LANGUAGE 'plpgsql' VOLATILE;
49
CREATE OR REPLACE FUNCTION bdobjrel.f_listarclientesdevedores() RETURNS SETOF bdobjrel.pessoa AS $BODY$ select nome, datacadastro, endereco, telefone, email, referencia from bdobjrel.pessoa, bdobjrel.ped_mudanca where bdobjrel.pessoa.OID = bdobjrel.ped_mudanca.OID_cliente and bdobjrel.ped_mudanca.situacaopagamento = false; $BODY$ LANGUAGE 'sql' VOLATILE;
50