80
PRÁTICA DE BANCO DE DADOS

PojetoBanco de Dados

Embed Size (px)

DESCRIPTION

Banco de Dados, SQL

Citation preview

  • PRTICA DE BANCO DE DADOS

  • MINISTRIO DA EDUCAO

    PR-REITORIA DE ENSINO

    DEPARTAMENTO DE EDUCAAO DISTNCIA

    ESCOLA TCNICA ABERTA DO PIAU - ETAPI

    CAMPUS TERESINA CENTRAL

    PRTICA DE BANCO DE DADOS

  • PRESIDENTE DA REPBLICA Luiz Incio Lula da Silva MINISTRO DA EDUCAO Fernando Haddad GOVERNADOR DO ESTADO Wellington Dias REITOR DO INSTITUTO FEDERAL DE EDUCAO, CINCIA E TECNOLOGIA Francisco da Chagas Santana SECRETRIO DE EDUCAO A DISTNCIA DO MEC Carlos Eduardo Bielschowsky COORDENADORIA GERAL DA UNIVERSIDADE ABERTA DO BRASIL Celso Costa SECRETRIO DE EDUCAO DO ESTADO DO PIAU Antonio Jos Medeiros COORDENADOR GERAL DO CENTRO DE EDUCAO ABERTA A DISTNCIA DO INSTITUTO FEDERAL DE EDUCAO, CINCIA E TECNOLOGIA Elanne Cristina Oliveira dos Santos SUPERITENDNTE DE EDUCAO SUPERIOR NO ESTADO Eliane Mendona ORGANIZAO DO MATERIAL DIDTICO Claudete de Jesus Ferreira da Silva AUTORES Thiago Alves Elias da Silva Ndia Mendes dos Santos Wilson de Oliveira Jnior

  • 7

    Caro (a) Cursista

    Bem vindo (a) disciplina PRTICA DE BANCO DE

    DADOS.

    Esta a nossa Apostila, material elaborado com o

    objetivo de contribuir para o desenvolvimento de seus estudos e

    para a ampliao de seus conhecimentos acerca da citada

    disciplina.

    Este texto destinado aos estudantes aprendizes que

    participam do programa Escola Tcnica Aberta do Brasil (e-Tec

    Brasil), vinculado Escola Tcnica Aberta do Piau (ETAPI) do

    Instituto Federal de Educao, Cincias e Tecnologia do Piau

    (IFPI), com apoio da Prefeitura Municipal dos respectivos plos:

    Alegrete do Piau, Batalha, Monsenhor Gil e Valena do Piau.

    O texto composto de quatro (04) Captulos assim

    distribudos:

    Na Aula 1 Banco de Dados, conceitos, definio de

    SGBD, projeto de banco de dados passando pelos modelos

    conceitual e lgico.

    Na Aula 2 A linguagem SQL, tipos de dados, instrues

    DDL e instrues DML.

    Na Aula 3 apresentado uma viso geral acerca dos

    comandos em SQL para se programar no MySQL. Um introduo

    aos procedimentos (store procedure) e as funes (functions) e

    como se implement-los no MySQL.

    Na Aula 4 apresentado viso sobre gatilhos (triggers) e

    controle de acesso no MySQL. E como implementar os gatilhos,

    criar usurios e atribuir privilgios a esses usurios.

    Boas Vindas!

  • 8

    Quem sou?

    1. PRTICA DE BANCO DE DADOS.................................

    1.1 Introduo.......................................................

    1.2 Dados e Objetos de Banco de Dados..............

    1.3 Projeto de Banco de Dados.................

    1.3.1 Modelo Conceitual...................

    1.3.2 Modelo Lgico...............................

    2. A LINGUAGEM SQL................................................

    2.1 Introduo a SQL..............

    2.2 Tipos de Dados Bsicos...................

    2.3 O Comando Create Database..............

    2.4 O Comando Create Table...............

    ndice Geral

    THIAGO ALVES ELIAS DA SILVA

    Sou Tecnlogo em Processamento de Dados pela Faculdade Piauiense de

    Processamento de Dados e Engenharia Civil pela Universidade Federal do

    Piau. Tenho Especializao em Anlise de Sistemas pela Universidade

    Estadual do Piau e Mestrado pela Universidade Federal do Rio Grande do

    Norte.

    Iniciei minha atividade como docente muito jovem. Em 2001, aos 22 anos,

    comecei como professor substituto do, ento, CEFET-PI e, menos de dois

    anos depois, fui aprovado para o quadro de professores efetivos da mesma

    instituio onde trabalho desde ento.

    Em 2009, exerci a funo de coordenador do curso tcnico presencial em

    Informtica do IFPI. Atualmente, sou professor das disciplinas de Banco de

    Dados dos cursos tcnico e superior desta instituio e de disciplinas na

    rea de IHC (Interao Humano-computador), esta ltima, foco do meu

    trabalho de mestrado.

    NDIA MENDES DOS SANTOS

    Curriculum Lattes: http:// lattes.cnpq.br/7392557956968627

    Bacharel em Cincias Contbeis pela Universidade Federal do Piau,

    Campus Ministro Reis Velloso, em Parnaba, e Tecnlogo em

    Processamento de Dados pela Universidade Estadual do Piau, Campus de

    Parnaba. Ps-graduao Lato Sensu em Banco de Dados, pelo Centro

    Federal de Educao do Piau. E atualmente faz Mestrado em Engenharia

    Eltrica pela Universidade Federal do Cear, linha de pesquisa em

    Inteligncia Artificial. Desde 2006, ela professora do quadro efetivo do

    Instituto Federal de Cincia e Tecnologia do Piau, Campus Angical do Piau,

    na categoria de Dedicao Exclusiva. Seus principais interesses de pesquisa

    e atuao so inteligncia artificial, estrutura de dados, eletrnica digital,

    microprocessadores digitais e linguagens de programao. E faz parte da

    Equipe de Educao Distncia do Instituto Federal de Educao, Cincia e

    Tecnologia do Piau, atuando como tutora distncia do plo de Valena.

  • 9

    WILSON DE OLIVEIRA JUNIOR.

    Graduado em Processamento de Dados pela Associao Piauiense

    de Ensino Superior do Piau, com especializao em redes de

    computadores. Atua h mais de dez anos na rea, desenvolvdendo

    trabalhos e prestando consultoria. Possui vasta experincia

    acadmica atuando como professor do ensino superior h mais de

    oito anos. Atualmente desenvolve pesquisas em redes PLC e redes

    Wireless.

  • 10

    PRTICA DE BANCO DE DADOS ................................................... 14

    1.1) INTRODUO: ...................................................................... 14 1.2) DADOS E OBJETOS DO BANCO DE DADOS: ................. 15 1.3) PROJETO DE BANCO DE DADOS: ................................... 16

    1.3.1) Modelo Conceitual: ........................................................... 18 A LINGUAGEM SQL ......................................................................... 24

    2.1) INTRODUO A SQL: .......................................................... 24 2.2) TIPOS DE DADOS BSICOS .............................................. 25 2.3) O COMANDO CREATE DATABASE:.................................. 26 2.4) O COMANDO CREATE TABLE: .......................................... 26 2.5) O COMANDO ALTER TABLE: ............................................. 30

    2.5.1) Apagando uma coluna de uma tabela: ................................. 31 2.5.2) Adicionando uma coluna em uma tabela: ............................ 31 2.5.3) Modificando uma coluna de uma tabela: ............................. 32

    2.6) O COMANDO DROP TABLE: .............................................. 33 2.7) CONSULTAS SIMPLES: ....................................................... 33

    2.7.1) Subconsultas:...................................................................... 35 2.8) MANIPULANDO DADOS DE UMA TABELA (INSERT, UPDATE, DELETE): ...................................................................... 36

    2.8.1) Inserindo dados em uma tabela: .......................................... 36 2.8.2) Alterando dados de uma tabela: .......................................... 38 2.8.3) Excluindo dados de uma tabela: .......................................... 39

    2.9) FUNES AGREGADAS: .................................................... 40 2.9.1) Funo Count( ): ................................................................. 40 2.9.2) Funo Avg( ): ................................................................... 41 2.9.3) Funo Sum( ): ................................................................... 41 2.9.4) Funo Min( ): .................................................................... 41 2.9.5) Funo Max( ): ................................................................... 41

    2.10) A CLUSULA GROUP BY: ................................................ 42 2.11) JUNES (JOIN): ............................................................... 43

    2.11.1) Juno Interna (Inner Join): .............................................. 44 2.11.2) Junes Externas (Outer Join): .......................................... 46 2.11.2.1) Juno Externa Esquerda (Left Outer Join):................. 46 2.11.2.2) Juno Externa Direita (Right Outer Join): .................. 47

    Procedimento e Funo ........................................................................ 49 3.1 INTRODUO PROGRAMAO EM SQL.................. 49

    3.1.1 Comando: BEGIN ... END ................................................... 50 3.1.2 Comando: DECLARE ......................................................... 50 3.1.3 - Comando: SET .................................................................. 51 3.1.4 Comando: OPEN, FETCH, CLOSE ..................................... 52 3.1.5 - Comando: SELECT.... INTO ............................................. 53 3.1.6 - Comando: IF...................................................................... 54 3.1.7 Comando: CASE...WHEN ................................................... 54 3.1.8 Comando: LOOP e ITERATE.............................................. 55 3.1.9 Comando: REPEAT ............................................................. 56

    ndice Geral

  • 11

    3.1.10 Comando: WHILE...DO .................................................... 56 3.1.11 Comando: LEAVE ............................................................. 57 3.1.12 Comando: CALL ............................................................... 57 3.1.13 Comandos: RETURN e RETURNS ................................... 57

    3.2 PROCEDIMENTOS (STORE PROCEDURE) ..................... 58 3.3 FUNES (Function) ............................................................. 63

    Gatilho e Controle de Aceso ................................................................. 70 4.1 GATILHO (TRIGGER) ....................................................... 70 4.2 CONTROLE DE ACESSO................................................. 74 4.3 PRIVILGIOS ..................................................................... 76

  • 12

    Figura 1 - Exemplos de SGBDs ........................................................... 14 Figura 2 - Organizao de um SGBD .................................................. 15 Figura 3 -Notao para Diagramas Entidade-relacionamento ................ 19 Figura 4 - Diagrama Entidade Relacionamento ..................................... 20 Figura 5 - Bloco de Comandos ............................................................. 49

    ndice de Figuras

  • 13

    1 Aula Prtica de Banco de Dados introduo e projeto de banco de dados. Meta da Aula

    Fazer uma introduo da

    disciplina e modelar um banco de

    dados.

    Ao final desta aula, voc dever ser

    capaz de:

    1. conhecer os conceitos de Banco de

    Dados e SGBDs;

    2. Modelar um Banco de Dados;

    Ob

    jeti

    vo

    s

  • 14

    PRTICA DE BANCO DE DADOS

    1.1) INTRODUO: Convido voc para embarcarmos neste maravilho

    mundo de banco de dados que nos espera de braos

    abertos. Se estivermos prontos, vamos l!

    Nesta disciplina de Prtica de Banco de Dados, como

    o prprio nome sugere, aplicaremos, na prtica, alguns

    conceitos de banco de dados.

    Daremos nfase implementao do banco de

    dados, estudando desde a modelagem, passando pela

    criao de uma base de dados at a sua manipulao

    atravs de consultas simples e complexas em tabelas,

    criao de procedimentos armazenados dentre outros

    objetos de banco de dados.

    Tentaremos, ao mximo, utilizar uma linguagem

    simples e de baixa complexidade. Vale lembrar que o

    objetivo da disciplina no aprendermos a utilizar um SGBD

    em especfico, focaremos no aprendizado da linguagem

    SQL. Porm, como no poderemos seguir na disciplina sem

    utilizarmos um determinado SGBD, indicamos o MYSQL

    como referncia. Lembro-lhe tambm que existem outros

    SGBDs, alguns gratuitos, outros pagos. Listamos alguns

    exemplos a seguir: Postgresql, SQL Server, Oracle, Access,

    Firebird, dentre outros.

    Figura 1 - Exemplos de SGBDs

  • 15

    Para aqueles que esto esquecidos, SGBD significa

    Sistema Gerenciador de Banco de Dados e nada mais do

    que um conjunto de software que tem por objetivo

    administrar uma base dados, gerenciando o acesso, a

    manipulao e a organizao dos dados. O SGBD prov

    uma interface amigvel para o usurio de tal forma que ele

    possa incluir, alterar ou consultar os dados.

    Figura 2 - Organizao de um SGBD

    Bem, antes de colocarmos a mo na massa e

    comearmos a codificar a nossa base de dados e as nossas

    tabelas, precisamos conhecer alguns conceitos. Vamos l?

    1.2) DADOS E OBJETOS DO BANCO DE DADOS: Segundo COSTA (2006), os SGBDs foram projetados

    para armazenar dados. Nos SGBDs relacionais e objeto-

    relacionais, os dados so armazenados em tabelas. As

    tabelas so um dos tipos de objetos do banco de dados.

    Existem outros tipos de objetos, tais como vises, gatilhos,

    procedimentos, dentre outros. Note que, embora os SGBDs

    objeto-relacional e orientados a objetos possam armazenar

    objetos como os definidos na orientao a objetos, os

    objetos do banco de dados a que nos referimos no so os

  • 16

    objetos da orientao a objetos e, sim, estruturas internas de

    Sistemas Gerenciadores.

    Em outras palavras, a partir de agora, quando

    falarmos de objetos de banco de dados em SGBDs

    relacionais, no estaremos nos referindo a objetos

    estudados na disciplina de Introduo a Programao

    Orientada a Objetos e, sim, a estruturas internas do Sistema

    Gerenciador, tais como tabelas, procedimentos

    armazenados, gatilhos e tantas outras estruturas que ainda

    iremos estudar.

    1.3) PROJETO DE BANCO DE DADOS: Ao construirmos uma aplicao para controlar, por

    exemplo, o mercadinho do Seu Raimundo, devemos criar

    um banco de dados para armazenar as informaes. Porm

    algumas perguntas nos vm cabea: como os dados sero

    armazenados? Se pensarmos em armazenar em tabelas,

    quantas precisaremos criar, quais as informaes sero

    armazenadas em cada uma delas e quais os tipos de dados

    de cada informao? Para respondermos a estas perguntas,

    devemos projetar o banco de dados a partir de modelos que

    se divide em trs etapas: modelagem conceitual,

    modelagem lgica e modelagem fsica.

    Na modelagem conceitual, h a representao dos

    conceitos e caractersticas observadas no ambiente

    para o qual se deseja projetar o banco de dados, ou

    seja, a empresa para o qual o sistema est sendo

    desenvolvido. Nesta etapa, devemos ignorar as

    particularidades de implementao.

  • 17

    Como forma de exemplificao, utilizaremos um

    estudo de caso de um sistema que controlar uma empresa

    de desenvolvimento de projetos. Este mesmo banco de

    dados ser utilizado no decorrer de todo o material. Logo

    abaixo, iniciaremos a explicao do estudo de caso e, em

    seguida, projetaremos o nosso banco de dados.

    Uma empresa de desenvolvimento de projetos deseja

    informatizar-se. Aps uma conversa com os proprietrios e

    funcionrios da empresa levantamos as seguintes

    informaes:

    Cada funcionrio est lotado em um departamento e

    em um determinado departamento poder existir vrios

    funcionrios trabalhando nele. Os departamentos so

    cadastrados a partir de seu cdigo, descrio e sua

    localizao no prdio. O sistema precisa manter tambm os

    dados de todos os funcionrios, tais como: nome e data de

    nascimento. No cadastro dos projetos, deve existir seu

    cdigo, que o seu identificador nico, o nome do projeto, o

    oramento, a data de incio e a data prevista para a sua

    concluso.

    Um projeto poder ser desenvolvido por uma equipe

    ou por apenas um funcionrio. Da mesma forma, um

    funcionrio poder desenvolver mais de um projeto, ao

    mesmo tempo ou no.

    Na modelagem lgica, buscamos transformar o

    esquema conceitual para informaes tcnicas que

    possam ser compreendidas e utilizadas por

    desenvolvedores e administradores de banco de

    dados.

    J na modelagem fsica, so consideradas

    caractersticas especficas do SGBD onde est sendo

    implementada a base de dados.

  • 18

    No ato da vinculao do funcionrio ao projeto, o

    sistema deve controlar a data da vinculao, a data de

    desvinculao e a funo desempenhada pelo funcionrio

    naquele projeto. A escolha da funo NO est relacionada

    ao departamento que o funcionrio est lotado. Para cada

    funo, existe um valor de salrio mensal que poder ser

    pago de forma integral ou proporcional, caso o funcionrio

    no trabalhe um ms inteiro.

    Quando um funcionrio se vincula a um projeto e,

    aps a concluso da sua participao, este se desvincula,

    ele no poder mais participar novamente do mesmo

    projeto, mesmo que desempenhando uma outra funo, ou

    seja, cada funcionrio s poder associar-se apenas uma

    vez em cada projeto.

    1.3.1) Modelo Conceitual:

    Para a modelagem conceitual, utilizaremos o modelo

    Entidade-relacionamento que j foi estudado na disciplina de

    Introduo a Banco de Dados.

    Segundo COSTA (2006), uma entidade representa

    um conjunto de objetos da realidade que est sendo

    modelada. No mundo real, os objetos representados pelas

    entidades podem interagir entre si de diferentes formas.

    Para modelar tais interaes, utilizamos os relacionamentos.

    As entidade que possuem vnculos entre si estaro ligadas

    por relacionamentos. Alm disso, no mundo real, cada

    entidade poder ter uma srie de propriedades, as quais so

    modeladas atravs de atributos. Algumas vezes, os

    relacionamentos tambm possuem atributos prprios.

    Entidades, relacionamentos e atributos possuem um nome.

    Para enriquecer o modelo, utilizamos as cardinalidades.

    Estas representam o nmero de interaes que uma dada

    instncia de uma entidade poder ter com instncias de

    outra entidade a ela relacionada.

  • 19

    Existem diferentes representaes para modelarmos

    um banco de dados a partir do modelo entidade-

    relacionamento. Abaixo, seguem as representaes que

    utiliza neste material.

    Entidade

    Atributo NOME_ATRIBUTO

    Relacionamento

    Atributo Identificador NOME_ATRIBUTO

    Figura 3 -Notao para Diagramas Entidade-relacionamento

    Seguindo com a anlise do nosso estudo de caso,

    descobrimos a existncia de quatro entidades: Funcionrio,

    Projeto, Departamento e Funo.

    Observamos tambm que a entidade Funcionrio

    interage com as entidades Projeto e Departamento. Quanto

    s cardinalidades, a partir da anlise do texto que descreve

    o estudo de caso, um funcionrio poder se relacionar a

    apenas um departamento, mas um departamento poder ter

    um ou vrios funcionrios associados a ele. Por sua vez, um

    funcionrio poder desenvolver mais de um projeto e um

    projeto poder ser desenvolvido por um ou por vrios

    funcionrios. J a entidade Funo se relaciona ao

    Funcionrio e ao Projeto, j que a funo do funcionrio

    determinada na hora em que este se associa a um

    determinado projeto.

    Projeto Funcionrio

    Departamento Funo

    NOME_ENTIDADE

    NOME

  • 20

    Assim, temos o diagrama abaixo, representando o

    modelo conceitual do banco de dados do sistema que

    gerencia a nossa empresa de desenvolvimento de projetos:

    Figura 4 - Diagrama Entidade Relacionamento

    1.3.2) Modelo Lgico:

    Segundo Costa (2006), muitas vezes, uma entidade

    ou relacionamento do diagrama entidade-relacionamento se

    tornar uma tabela no projeto lgico. Existem algumas

    situaes onde isso no verdade. Essas situaes so

    especificadas, principalmente, a partir das cardinalidades

    existentes.

    A partir da aplicao das regras de cardinalidade no

    modelo conceitual apresentado na figura anterior,

    especificamos, abaixo, as suas respectivas tabelas. Os

    nomes em negritos representam as tabelas. Os itens

    delimitados por parnteses so as colunas de cada tabela.

    As colunas que tm o seu nome sublinhado formam as

    chaves primrias das tabelas. J aquelas com o nome em

    itlico representam chaves estrangeiras.

    Departamento (cod_dep, descr, localiz)

    Funcionrio (Cod_func, nome, dt_nasc, cod_dep)

    Projeto (cod_proj, nome, oramento, dt_ini, dt_prev_term)

  • 21

    Funo (cod_funcao, nome, sal)

    Trabalha (cod_func, cod_proj, cod_funcao, dt_ent, dt_sai)

    A partir da especificao das tabelas, poderemos

    definir, no projeto lgico, as restries adicionais para cada

    coluna, indicando, por exemplo, se seu preenchimento

    obrigatrio ou no. Poderemos tambm especificar o tipo de

    informao que ser armazenada em uma coluna, definindo

    o domnio utilizado para os dados.

    TABELA COLUNA DESCRIO TIPO DE

    DADOS REQUERIDO

    Departamento

    Cod_dep Cdigo do

    departamento

    Numrico

    inteiro. Sim.

    Desc Descrio do

    departamento

    Cadeia de

    caracteres. Sim

    Localiz Localizao do

    departamento

    Cadeia de

    caracteres.

    Sim

    Funcionrio

    Cod_func

    Cdigo do

    funcionrio

    Numrico

    inteiro. Sim

    Nome

    Nome do

    funcionrio

    Cadeia de

    caracteres. Sim

    Dt_nasc

    Data de

    nascimento do

    funcionrio

    Data. No

    Cod_dep

    Cdigo do

    departamento que

    o funcionrio

    trabalha

    Numrico

    inteiro. No

    Projeto

    Cod_proj Cdigo do

    projeto

    Numrico

    inteiro. Sim

    Nome Nome do projeto Cadeia de

    caracteres. Sim

    Oramento Oramento do

    projeto

    Nmero

    Real. Sim

    Dt_ini Data de incio do

    projeto Data. Sim

    Dt_prev_term

    Data prevista

    para o trmino do

    projeto

    Data. Sim

  • 22

    Funo

    Cod_funcao Cdigo da funo Numrico

    inteiro. Sim

    Nome Nome da funo Cadeia de

    caracteres. Sim

    Sal

    Salrio pago para

    quem

    desempenhar a

    funo

    Nmero

    Real. Sim

    Trabalha

    Cod_func Cdigo do

    funcionrio

    Numrico

    inteiro. Sim

    Cod_proj Cdigo do

    projeto

    Numrico

    inteiro. Sim

    Cod_funcao

    Cdigo da funo

    desempenhada

    pelo funcionrio

    no projeto

    Numrico

    inteiro. Sim

    Dt_ent

    Data de entrada

    do funcionrio no

    projeto

    Data. Sim

    Dt_sai

    Data de sada do

    funcionrio do

    projeto

    Data. No

    EXERCCIO AULA 1

    1) Defina SGBD, explique qual a sua principal funo e cite, pelo menos, 3 exemplos. 2) Quando falamos em objetos de banco de dados, estamos nos referindo aos mesmos objetos definidos na orientao a objetos? Explique. 3) Defina a modelagem conceitual, modelagem lgica e modelagem fsica. 4) Modele, a partir do modelo entidade-relacionamento, o banco de dados de um sistema que controlar uma clnica mdica. Nesta clnica, devero ser cadastrados todos os mdicos, alm de suas especialidades. Mesmo que o mdico possua mais de uma especialidade, ele dever escolher apenas uma delas para trabalhar na clnica. Todos os pacientes tambm devero ser cadastrados com todos os seus dados. Os dados das consultas devero ser armazenados tambm no banco de dados: a data em que a consulta aconteceu, o mdico que atendeu o paciente, bem como o diagnstico feito pelo mdico.

  • 23

    2 Aula A Linguagem SQL Principais Comandos Meta da Aula

    Conhecer as principais instrues

    DDL e DML da linguagem SQL.

    Ao final desta aula, voc dever ser

    capaz de:

    1. Construir e alterar tabelas em um

    banco de dados;

    2. Realizar consultas simples e

    complexas em um banco de dados.

    Ob

    jeti

    vo

    s

  • 24

    A LINGUAGEM SQL

    2.1) INTRODUO A SQL: Structured Query Language, ou Linguagem de

    Consulta Estruturada ou SQL, uma linguagem de pesquisa

    declarativa para banco de dados.

    A linguagem SQL um grande padro de banco de

    dados. Isto decorre da sua simplicidade e facilidade de uso.

    Ela se diferencia de outras linguagens de consulta a banco

    de dados no sentido em que uma consulta SQL especifica a

    forma do resultado e no o caminho para chegar a ele. Ela

    uma linguagem declarativa em oposio a outras linguagens

    procedurais. Isto reduz o ciclo de aprendizado daqueles que

    se iniciam na linguagem.

    Embora o SQL tenha sido originalmente criado pela

    IBM, rapidamente surgiram vrios "dialectos" desenvolvidos

    por outros produtores. Essa expanso levou necessidade

    de ser criado e adaptado um padro para a linguagem. Esta

    tarefa foi realizada pela American National Standards

    Institute (ANSI) em 1986 e ISO em 1987.

    O SQL foi revisto em 1992 e a esta verso foi dado o

    nome de SQL-92. Foi revisto novamente em 1999 e 2003

    para se tornar SQL:1999 (SQL3) e SQL:2003,

    respectivamente. O SQL:1999 usa expresses regulares de

    emparelhamento, queries recursivas e gatilhos (triggers).

    Tambm foi feita uma adio controversa de tipos no-

    escalados e algumas caractersticas de orientao a objeto.

    O SQL:2003 introduz caractersticas relacionadas ao XML,

    seqncias padronizadas e colunas com valores de auto-

    generalizao (inclusive colunas-identidade).

    Tal como dito anteriormente, o SQL, embora

    padronizado pela ANSI e ISO, possui muitas variaes e

    extenses produzidos pelos diferentes fabricantes de

    sistemas gerenciadores de bases de dados. Tipicamente a

    Voc Sabia que...

    O SQL foi desenvolvido originalmente no incio dos anos 70 nos laboratrios da IBM em San Jose, dentro do projeto System R, que tinha por objetivo demonstrar a viabilidade da implementao do modelo relacional proposto por E. F. Codd. O nome original da linguagem era SEQUEL, acrnimo para "Structured English Query Language" (Linguagem de Consulta Estruturada em Ingls), vindo da o fato de, at hoje, a sigla, em ingls, ser comumente pronunciada "squel" ao invs de "s-ki-l", letra a letra. No entanto, em portugus, a pronncia mais corrente a letra a letra: "se-qu-le".

    Fonte: Wikipdia

  • 25

    linguagem pode ser migrada de plataforma para plataforma

    sem mudanas estruturais principais.

    As instrues da linguagem SQL podem ser divididas

    em dois grandes grupos: Linguagem de Manipulao de

    Dados (LMD ou Data Manipulation Language DML) e a

    Linguagem de definio de dados (LDD ou Data Definition

    Language DDL). A DML trata dos comandos de

    manipulao de dados, definindo os comandos para a

    seleo, incluso, alterao e excluso de dados de tabelas.

    J a DDL rene os comandos para criao e manipulao

    de estruturas e objetos do banco de dados.

    2.2) TIPOS DE DADOS BSICOS Em banco de dados relacionais, cada tabela pode

    conter diversas colunas, as quais armazenaro os dados.

    Para cada coluna, existir um tipo de dado associado. Os

    tipos de dados so definidos durante a criao da tabela.

    Apresentamos, a seguir, os principais tipos de dados

    simples definidos pela SQL:2003.

    Tipos de Dados Descrio

    CHARACTER Caractere de tamanho fixo usualmente conhecido como CHAR

    CHARACTER VARYING

    Caractere de tamanho variante usualmente conhecido como VARCHAR

    CHARACTER LARGE OBJECT

    Caractere longo usualmente conhecido como CLOB

    BINARY LARGE OBJECT

    String binria para objetos longos usualmente conhecido como BLOB

    NUMERIC Numrico exato DECIMAL Numrico exato SMALLINT Numrico exato

    INTERGER Numrico exato

    BIGINT Numrico exato

    FLOAT Numrico aproximado REAL Numrico aproximado DOUBLE PRECISION

    Numrico aproximado

    BOOLEAN Booleano

    DATE Data com informaes de dia, ms e ano TIME Hora com informaes de hora, minuto e segundo

    TIMESTAMP Determina um momento, com informaes de ano, ms, dia, hora, minuto e segundo

    Voc Sabia que...

    Os vrios fornecedores de Sistemas Gerenciadores de Banco de Dados utilizam variaes prprias dos tipos de dados definidos na SQL:2003. No Oracle, o tipo de dados mais utilizado para tratamento de informaes numricas o tipo NUMBER. J no SQL SERVER 2005 e no DB2 verso 9, so utilizados vrios tipos de dados para armazenamento de informaes numricas, com denominaes bem prximas do padro SQL. No que se refere a tipos de dados referentes a cadeias de caracteres, os principais gerenciadores de banco de dados comerciais se aproximam bastante do padro da linguagem. Fonte: Costa (2006)

  • 26

    2.3) O COMANDO CREATE DATABASE: A instruo Create Database, como o prprio nome

    sugere, serve para criarmos a base de dados na qual as

    tabelas ser criadas.

    Sua sintaxe bastante simples. Vejamos, atravs de

    exemplo, a criao de uma base de dados chamada

    PraticaBD.

    2.4) O COMANDO CREATE TABLE: Aps criarmos a nossa base de dados, criaremos as

    nossas tabelas. Para isso, faremos uso do comando Create

    Table.

    O comando Create Table permite criarmos e

    definirmos a estrutura de uma tabela, definindo suas colunas

    (campos), suas respectivas restries, alm de suas chaves

    primrias e estrangeiras. Sua sintaxe :

    Obs: Os campos entre colchetes [] so opcionais.

    Onde:

    nome-tabela representa o nome da tabela que ser

    criada.

    nome-coluna representa o nome da coluna que ser

    criada. A definio das colunas de uma tabela feita

    relacionando-as uma aps a outra.

    tipo-do-dado define o tipo e tamanho dos campos

    definidos para a tabela.

  • 27

    NOT NULL exige o preenchimento do campo, ou seja,

    no momento da incluso obrigatrio que possua um

    contedo.

    NOT NULL WITH DEFAULT preenche o campo com

    valores pr-definidos, de acordo com o tipo do campo, caso

    no seja especificado o seu contedo no momento da

    incluso do registro.

    CONSTRAINT nome PRIMARY KEY (nome-coluna-

    chave) defini para o banco de dados a coluna que ser a

    chave primria da tabela. Caso ela tenha mais de uma

    coluna como chave, elas devero ser relacionadas entre os

    parnteses e separadas por vrgulas.

    CONSTRAINT nome FOREIGN KEY (nome-coluna-

    chave-estrangeira) REFERENCES nome-tabela-pai (nome-

    campo-pai) defini para o banco de dados as colunas que so

    chaves estrangeiras, ou seja, os campos que so chaves

    primrias de outras tabelas. Na opo REFERENCES deve

    ser especificado a tabela na qual a coluna a chave

    primria.

    ON DELETE especifica os procedimentos que devem

    ser feitos pelo SGBD quando houver uma excluso de um

    registro na tabela pai quando existe um registro

    correspondente nas tabelas filhas. As opes disponveis

    so:

    RESTRICT - Opo default. Esta opo no permite a

    excluso na tabela pai de um registro cuja chave primria

    exista em alguma tabela filha.

    CASCADE - Esta opo realiza a excluso em todas

    as tabelas filhas que possua o valor da chave que ser

    excluda na tabela pai.

    SET NULL - Esta opo atribui o valor NULO nas

    colunas das tabelas filhas que contenha o valor da chave

    que ser excluda na tabela pai.

  • 28

    Antes de iniciarmos a criao das tabelas do nosso

    estudo de caso, vale ressaltar que a ordem de criao

    dessas tabelas de suma importncia. Isso se deve ao fato

    das tabelas estarem conectadas atravs de suas chaves

    primrias e estrangeiras. Vamos explicar de uma maneira

    diferente. Sabemos, por exemplo, que a tabela Funcionrio

    recebe, como chave estrangeira, a chave primria da

    tabela departamento. Assim, caso tentssemos criar

    primeiro a tabela funcionrio, durante a sua declarao

    diramos que ela possui um atributo chave estrangeira e que

    este se conecta com a chave primria da tabela

    departamento. Como a tabela departamento ainda no

    existiria na base de dados, o SGBD acusaria uma

    mensagem de erro informando que no conhece a tabela

    Departamento.

    Dito isso, iniciaremos a criao das tabelas.

    Abaixo, apresentamos o cdigo SQL que cria a tabela

    departamento. Conforme observamos, a tabela

    departamento possui 3 atributos, sendo o cdigo do

    departamento (cod_dep) do tipo inteiro e chave primria da

    tabela.

    Observamos tambm que foi inserido um valor default

    para o atributo descrio (descr). Caso no seja informado

    um valor para o atributo descrio, o prprio SGBD incluir o

    valor No informado.

    Como no especificamos a clusula ON DELETE, o

    SGBD no permitir a excluso na tabela pai de um registro

    cuja chave primria exista em alguma tabela filha.

  • 29

    A prxima tabela que criaremos ser a tabela

    Funcionrio.

    Observamos que a tabela funcionrio possui duas

    restries (constraint). A primeira determina o cdigo do

    funcionrio (cod_func) como a chave primria da tabela e a

    segunda restrio determina o atributo cod_dep como chave

    estrangeira que veio da tabela departamento.

    Abaixo, seguem as criaes das tabelas Funo e

    Projeto:

    A clusula CHECK serve para implementarmos

    restries de domnio. Durante a criao da tabela Projeto,

    inserimos uma restrio que garante que a data de incio do

    projeto (dt_ini) seja menor que a data prevista de trmino

    (dt_prev_term). O clusula check tambm poderia ser usada

    para comparar um atributo com um valor absoluto e no

    apenas para comparar um atributo com outro atributo,

    conforme exemplo anterior.

    Ateno Perceba que, de acordo com a sintaxe de criao das tabelas, no obrigatrio que as chaves primrias e estrangeiras tenham o mesmo nome. Usando como exemplo as tabelas Funcionrio e Departamento, observe que o atributo cod_dep da tabela funcionrio no precisaria ter o mesmo nome do atributo cod_dep da tabela Departamento. Isso s possvel por que, durante a declarao da chave estrangeira, dizemos explicitamente com qual atributo devemos conectar o atributo cod_dep da tabela Funcionrio.

  • 30

    Por fim, apresentamos a criao da tabela Trabalha.

    Esta tabela, obrigatoriamente, deveria ser a ltima tabela a

    ser criada no nosso banco de dados. Isso se deve ao fato

    desta tabela receber, como chaves estrangeiras, atributos

    oriundos das tabelas Funcionrio, Projeto e Funo.

    Na tabela Trabalha, inserimos uma restrio chamada

    checa_datas para garantir que a data de entrada do

    funcionrio no projeto (dt_ent) seja sempre menor que a sua

    data de sada (dt_sai).

    2.5) O COMANDO ALTER TABLE: Segundo Pazin (2003), o comando ALTER TABLE

    permite alterar a estrutura de uma tabela acrescentando,

    alterando, retirando e alterando nomes, formatos das

    colunas e a integridade referencial definidas em uma

    determinada tabela. A sintaxe para esse comando :

    Onde:

    nome-tabela representa o nome da tabela que ser

    atualizada.

  • 31

    nome-coluna representa o nome da coluna que ser

    criada.

    tipo-do-dado a clusula que define o tipo e tamanho

    dos campos definidos para a tabela.

    DROP nome-coluna realiza a retirada da coluna

    especificada na estrutura da tabela.

    ADD nome-coluna tipo-do-dado realiza a incluso da

    coluna especificada na estrutura da tabela. Na coluna

    correspondente a este campo nos registros j existentes

    ser preenchido o valor NULL (Nulo). As definies NOT

    NULL e NOT NULL WITH DEFAULT so semelhantes do

    comando CREATE TABLE.

    MODIFY nome-coluna tipo-do-dado permite a

    alterao na caracterstica da coluna especificada.

    Apresentaremos exemplos utilizando as clusulas

    anteriormente citadas.

    2.5.1) Apagando uma coluna de uma tabela:

    Imagine que voc deseja, por alguma razo, apagar a

    coluna que armazena a data de sada (dt_sai) da tabela

    trabalha. Como faramos isso? O quadro abaixo apresenta a

    soluo:

    2.5.2) Adicionando uma coluna em uma tabela:

    Imagine que, aps criarmos a tabela funcionrio e j

    termos cadastrados alguns registros, percebemos que

    esquecemos de criar a coluna telefone na tabela. Como

    resolveramos este problema?

  • 32

    Perceba que criamos a coluna telefone com um valor

    default No Informado. O que tentamos fazer utilizando

    este artifcio? Voc teria alguma explicao?

    Bem, caso a incluso desta coluna ocorra aps

    alguns funcionrios j terem sido cadastrados e caso

    tivssemos criado a nova coluna telefone aceitando valores

    nulos (NULL), no teramos nenhum problema, pois seria

    atribudo valor nulo aos telefones de todos os funcionrios

    que j estivessem cadastrados na tabela. Porm, como

    queremos criar a coluna telefone no aceitando valores

    nulos (NOT NULL), fomos obrigados a criar este valor

    default No Informado para ser inserido na coluna telefone

    de todos os funcionrios que j se encontravam cadastrados

    na tabela. Fomos claros na explicao?

    2.5.3) Modificando uma coluna de uma tabela:

    E se precisssemos mudar as caractersticas de uma

    coluna da tabela aps a sua criao? Como exemplo,

    imagine que desejamos aceitar valores nulos no atributo

    salrio (sal) da tabela Funo. Alm disso, desejamos

    tambm alterar o domnio do atributo, passado de real para

    integer. Para isso, observe o cdigo abaixo:

  • 33

    2.6) O COMANDO DROP TABLE: O comando Drop Table serve para destruirmos uma

    tabela. Se, por exemplo, precisssemos destruir a tabela

    trabalha, usaramos o comando abaixo.

    Perceba que a sintaxe do comando bastante

    simples. Basta escrevermos, aps Drop Table, o nome da

    tabela que desejamos destruir. Lembre-se que algumas

    tabelas podem ser dependentes da tabela que desejamos

    destruir. Por exemplo, caso fssemos destruir a tabela

    departamento, teramos que lembrar que a tabela

    funcionrio dependente de departamento, pois ela recebe

    o atributo cod_dep como chave estrangeira. Para

    resolvermos este problema, teramos que destruirmos a

    referncia de chave estrangeira da tabela funcionrio, ou

    mesmo, chegarmos ao ponto de destruirmos primeiro a

    tabela funcionrio, para s depois eliminarmos a tabela

    departamento. Caso optssemos pela segunda soluo,

    teramos que lembrar que a tabela trabalha tambm

    dependente de funcionrio e o mesmo procedimento deveria

    ser tomado.

    2.7) CONSULTAS SIMPLES: Consultar dados em um banco de dados,

    normalmente, a operao mais utilizada pelos usurios.

    Para isso, precisamos fazer uso da instruo Select. Ela

    considerada por muitos, como a instruo mais poderosa da

    linguagem SQL. Nesta seo, apresentaremos a sua

    estrutura bsica. Nas pginas seguintes, apresentaremos

    formas avanadas de utilizao dessa instruo.

  • 34

    A sintaxe bsica da instruo Select a seguinte:

    Onde:

    lista_atributos representa, como o nome sugere, a

    lista dos atributos que se deseja apresentar no resultado da

    consulta.

    nome-tabela representa o nome da(s) tabela(s) que

    contem as colunas que sero selecionadas ou que sero

    utilizadas para a execuo da consulta.

    Apelido representa os nomes que sero usados como

    nomes de tabelas em vez dos nomes originais. A vantagem

    desse recurso que, em casos de consultas muito grandes,

    com a utilizao de apelidos, digitamos menos.

    condio representa a condio para a seleo dos

    registros. Esta seleo poder resultar em um ou vrios

    registros.

    Para melhor entendermos esta instruo,

    apresentaremos alguns exemplos:

    I Obter todas as informaes de todos os

    funcionrios;

    Neste exemplo, percebemos que no fizemos uso da

    clusula where. Isso se deve ao fato da questo no colocar

    uma condio de busca. Assim, conclumos que o where s

    necessrio em consultas que possuem uma condio para

    a seleo.

  • 35

    II Obter o nome e a data de nascimento do

    funcionrio de cdigo 2:

    Nesta consulta, como a questo apresentava uma

    condio para a seleo (cdigo do funcionrio igual a 2),

    utilizamos a clusula where.

    2.7.1) Subconsultas:

    Realizar subconsultas uma forma de combinar mais

    de uma consulta (select) obtendo apenas um resultado.

    Vamos apresentar exemplos como forma de explicar

    o assunto:

    Imagine que precisamos obter o nome de todos os

    funcionrios que esto lotados no departamento de

    contabilidade. Perceba que o nome do departamento est na

    tabela Departamento, enquanto que o nome do funcionrio

    est na tabela Funcionrio. Assim, precisaramos utilizar as

    duas tabelas para obtermos o nosso resultado. A instruo

    que atende nossa necessidade encontra-se logo abaixo:

    Observe que utilizamos o cdigo do departamento

    como ponte para pularmos da tabela funcionrio para a

    tabela departamento. Isso aconteceu, pois a chave primria

    de departamento (cod_dep) a chave estrangeira da tabela

    Funcionrio.

  • 36

    2.8) MANIPULANDO DADOS DE UMA TABELA (INSERT, UPDATE, DELETE): Como dissemos anteriormente, na linguagem SQL

    existem instrues para definio de dados (DDL), e

    instrues para manipulao de dados (DML). Conhecemos,

    at agora, alguns comandos DDL e, nas prximas pginas,

    conheceremos instrues de manipulao. So elas;

    INSERT INTO, UPDATE e DELETE.

    2.8.1) Inserindo dados em uma tabela:

    Para incluirmos dados em uma tabela, utilizamos a

    instruo Insert Into. Este comando permite inserirmos um

    ou vrios registros em uma tabela do banco de dados. A

    sintaxe a seguinte:

    Onde:

    nome-tabela representa o nome da tabela onde ser

    includa o registro.

    nome-coluna representa o nome da(s) coluna(s) que

    tero contedo no momento da operao de incluso. Obs:

    esta relao opcional.

    Relao dos valores representa os valores a serem

    includos na tabela.

    Existem trs observaes importantes para fazermos

    sobre este comando. Vamos coment-las a partir de

    exemplos.

    Vejamos o primeiro exemplo:

    No exemplo anterior, cadastramos o departamento 1,

    chamado Anlise e que se localiza na sala B2-30. Perceba

  • 37

    que, aps o nome da tabela departamento, no colocamos a

    lista com o nome das colunas que seriam povoadas. Isso

    possvel, porm temos que, obrigatoriamente, inserirmos as

    informaes das colunas da tabela na mesma ordem em que

    elas foram criadas. No nosso caso, primeiro o cdigo do

    departamento, depois a descrio e, por fim, a sua

    localizao.

    Vejamos um segundo exemplo:

    Neste segundo exemplo, cadastramos a funcionria

    de cdigo 1 chamada Maria e que trabalha no departamento

    de cdigo 1. Perceba que, aps o nome da tabela

    Funcionrio, colocamos a lista com os nomes das colunas

    que deveriam ser preenchidas na tabela. Perceba tambm

    que a ordem no a mesma utilizada na criao da tabela.

    E mais, no colocamos, na lista, o atributo referente data

    de nascimento da funcionria. Ento voc poderia estar se

    perguntando: O que acontecer com o atributo data de

    nascimento quando executarmos esta instruo. A

    explicao para sua pergunta que o prprio SGBD atribuir

    valor nulo para a data de nascimento da Maria. Isso s

    possvel porque, quando criamos a tabela funcionrio,

    dissemos que o atributo data de nascimento aceitaria

    valores nulos. Caso voc ainda tenha alguma dvida, volte

    algumas pginas e veja o cdigo de criao da referida

    tabela.

    Agora, antes de comentarmos o nosso terceiro

    exemplo, imagine que possumos, no banco de dados, a

    tabela Pessoa com a seguinte estrutura:

    Codigo Apelido Data_nasc Cod_setor Nome_me

    100 Joozinho 01/01/1980 1 Francisca

  • 38

    200 Maricota 02/02/1979 1 Raimunda

    300 Franz 03/03/1978 1 Joanete

    Bem, agora imagine que precisamos cadastrar, na

    tabela funcionrio, todos os registros da tabela Pessoa.

    Como faramos isso de maneira rpida? Como forma de

    agilizarmos o nosso trabalho, poderamos executar o

    seguinte comando:

    Perceba que conseguimos, atravs de uma nica

    instruo, inserirmos vrios registros na tabela funcionrio.

    Isso s foi possvel por que a instruo Insert into permite

    que cadastremos o resultado de um select, desde que este

    select produza uma tabela compatvel com a tabela na qual

    estamos inserindo.

    2.8.2) Alterando dados de uma tabela:

    Para alterarmos uma informao contida numa tabela

    do banco de dados, utilizamos o comando UPDATE. Ele

    atualiza dados de um registro ou de um conjunto de registro.

    A sua sintaxe a seguinte:

    Onde:

    nome-tabela representa o nome da tabela cujo

    contedo ser alterado.

    nome-coluna representa o nome da(s) coluna(s) tero

    seus contedos alterados com o novo valor especificado.

  • 39

    condio representa a condio para a seleo dos

    registros que sero atualizados. Este seleo poder

    resultar em um ou vrios registros. Neste caso a alterao

    ir ocorrer em todos os registros selecionados.

    Vejamos os exemplos abaixo:

    No exemplo acima, estamos alterando para 1000 os

    oramentos dos projetos que possuem cdigo igual a 1 ou

    igual a 5.

    J neste ltimo exemplo, alteramos para 2000 os

    oramentos de TODOS os projetos. Isso aconteceu por que

    no utilizamos a clusula where para delimitar as linhas que

    seriam selecionadas para serem alteradas.

    2.8.3) Excluindo dados de uma tabela: O comando delete utilizado para excluir linhas de

    uma tabela. Abaixo, apresentamos a sua sintaxe:

    Caso desejssemos deletar os projetos que custam

    mais de 2000, usaramos o seguinte comando:

    Quando vamos deletar qualquer registro, devemos

    nos lembrar da Integridade Referencial. Este conceito

    determina que um registro no pode fazer referncia a um

    outro registro do banco de dados que no existe. Por

    exemplo, ns no poderamos simplesmente deletar

  • 40

    projetos, caso estes ainda estivessem sendo referenciados

    pela tabela Trabalha.

    2.9) FUNES AGREGADAS: Muitas vezes, precisamos de informaes que

    resultado de alguma operao aritmtica ou de conjunto

    sobre os dados contidos nas tabelas de um banco de dados.

    Para isso, utilizamos as funes agregadas. Abaixo,

    apresentaremos algumas delas:

    2.9.1) Funo Count( ):

    A funo count, como o prprio nome sugere, conta a

    quantidade de linhas de uma tabela que satisfazem uma

    determinada condio. Vejamos alguns exemplos:

    Caso precisssemos saber quantas projetos existem

    cadastrados na tabela Projeto.

    Perceba que dentro dos parnteses da funo count

    colocamos o atributo que ser utilizado para a contagem.

    E se precisssemos contar a quantidade de projetos

    que custam mais de 2000?

    Perceba que, neste ltimo exemplo, inserimos a

    clusula WHERE. Isso aconteceu porque precisvamos

    contar apenas as linhas da tabela que atendiam condio

    especificada.

  • 41

    2.9.2) Funo Avg( ):

    A funo AVG responsvel por extrair a mdia

    aritmtica dos valores de uma coluna.

    Por exemplo, se precisssemos calcular a mdia dos

    oramentos de todos os projetos, executaramos o seguinte

    comando:

    2.9.3) Funo Sum( ):

    A funo sum responsvel por realizar a soma dos

    valores de uma coluna.

    Exemplo:

    No exemplo acima, o SGBD realizar a soma dos

    oramentos dos projetos cujo cdigo seja menor que 10.

    2.9.4) Funo Min( ):

    A funo Min obtm o valor mnimo dentre os

    elementos de uma coluna.

    O exemplo abaixo obtm o menor cdigo de

    funcionrio dentre aqueles que nasceram no ano de 1980.

    2.9.5) Funo Max( ):

    A funo Max obtm o maior valor dentre os

    elementos de uma coluna.

    O exemplo abaixo obtm o maior cdigo de

    funcionrio dentre aqueles que nasceram no ano de 1980.

  • 42

    2.10) A CLUSULA GROUP BY: Os dados resultantes de uma seleo podem ser

    agrupados de acordo com um critrio especfico. Este

    procedimento realizado usando a clusula GROUP BY.

    Para melhor entendermos como funciona o GROUP

    BY, analisaremos o seguinte exemplo:

    Desejamos obter, para cada cdigo de projeto, a

    quantidade de funcionrios que trabalharam nele. Lembre-se

    que, para sabermos qual funcionrio trabalha em qual

    projeto, teremos que observar a tabela Trabalha, pois nela

    que acontecem as associaes entre funcionrios e projetos.

    Para respondermos a pergunta anterior, vamos considerar

    as seguintes informaes na tabela Trabalha:

    Cod_func Cod_proj Cod_funcao Dt_ent Dt_sai

    1 1 1 2010-02-02 2010-03-03

    2 1 2 2010-02-02 2010-03-03

    1 2 1 2010-04-04 2010-05-05

    4 2 2 2010-04-04 2010-05-05

    3 1 3 2010-02-02 2010-03-03

    Perceba que o funcionrio 1 trabalhou no projeto 1 e

    no projeto 2. Perceba tambm que 3 funcionrios

    trabalharam no projeto 1 e apenas 2 funcionrios

    trabalharam no projeto 2. No projeto 1, trabalharam os

    funcionrios de cdigo 1, 2 e 3. J no projeto 2, trabalharam

    os funcionrios de cdigo 1 e 4.

    Bem, agora voltando para a questo inicial, como

    escreveramos um comando SQL que mostre, para cada

    cdigo de projeto, a quantidade de funcionrios que

  • 43

    trabalharam nele? Na realidade, o que estamos buscando

    est representado na tabela abaixo:

    Cod_proj Quantidade_funcionrios

    1 3

    2 2

    A soluo para o nosso problema a seguinte:

    Observe que agrupamos os cdigos dos projetos

    iguais, ou seja, foram criados dois grupos: um grupo para os

    projetos de cdigo 1 e outro grupo para os projetos de

    cdigo 2. Se existissem, na tabela Trabalha, outros cdigos

    de projetos diferentes, outros grupos tambm seriam

    criados. Alm de criar os grupos, atravs da funo

    agregada Count( ), foi feita a contagem de elementos de

    cada grupo. Aqui, vale chamar a ateno no seguinte: toda

    vez que utilizamos uma funo agregada junto com o

    GROUP BY, esta funo ser operada sobre cada um dos

    grupos gerados pela clusula GROUP BY.

    Outra observao que destacamos o novo nome

    que demos para a coluna Count(). Logo aps a funo

    agregada, entre aspas simples, escrevemos o novo nome

    que desejamos que possua a coluna Count( ).

    2.11) JUNES (JOIN): Quando precisamos realizar consultas que envolvam

    mais de uma tabela, uma das solues seria a utilizao de

    junes. As junes permitem que acessemos mais de uma

    tabela utilizando apenas um Select.

    Na utilizao de junes, normalmente, deve existir a

    chave primaria de uma tabela fazendo relao com a chave

  • 44

    estrangeira da outra tabela que compe a juno. Esta ser

    a condio de ligao entre as tabelas.

    Existem vrios tipos de junes, cada uma delas

    variando a forma que cada tabela se relaciona com as

    demais.

    Antes de iniciarmos o estudo dos diferentes tipos de

    junes, consideremos as tabelas Funcionrio e

    Departamento. Elas serviro de base para os tpicos

    seguintes.

    Cod_func Nome Dt_nasc Cod_dep

    1 Joo 1980-01-02 1

    2 Jos 1981-02-03 2

    3 Maria 1982-05-04 1

    4 Antnio 1983-07-06 3

    FUNCIONRIO

    Cod_dep Descr Localiz

    1 Desenvolvimento Sala C3-10

    2 Anlise Sala B2-30

    3 Testes Sala C1-10

    4 Contabilidade Sala A1-20

    DEPARTAMENTO

    2.11.1) Juno Interna (Inner Join):

    A juno interna entre tabelas a modalidade de

    juno que faz com que somente participem da relao

    resultante as linhas das tabelas de origem que atenderem

    clusula de juno.

    Por exemplo, caso quisssemos saber o nome de

    todos os funcionrios com seus respectivos nomes de

    departamentos, teramos a seguinte instruo:

  • 45

    O comando anterior apresentaria como resultado, a

    partir das tabelas propostas anteriormente, a seguinte

    relao resultante:

    Nome Descr

    Joo Desenvolvimento

    Jos Anlise

    Maria Desenvolvimento

    Antnio Testes

    Observe, no comando apresentado, que

    selecionamos o nome do funcionrio a partir da tabela

    Funcionrio e a descrio do departamento a partir da tabela

    Departamento. Isso foi possvel, pois realizamos uma juno

    interna, onde se juntou todas as colunas da tabela

    Funcionrio com todas as colunas da tabela Departamento.

    Os registros que foram selecionados desta juno foram

    somente aqueles que satisfizeram a condio expressa aps

    a clusula ON.

    Perceba tambm que, aps o nome de cada tabela

    inserimos um apelido para elas. Demos, para a tabela

    Funcionrio, o apelido f, j para a tabela Departamento,

    demos o apelido d, ou seja, poderemos substituir a palavra

    funcionrio por f e a palavra departamento por d.

    Logo aps a clusula ON, inserimos a condio para

    a juno. Observe que a condio, normalmente, acontece

    entre as chaves primrias e chaves estrangeiras das tabelas

    que, no caso especfico, o cdigo do departamento. Antes

    do nome de cada atributo, colocamos o nome da tabela da

    qual ele se origina, ou seja, f.cod_dep quer dizer que o

    atributo cdigo do departamento que existe na tabela

    Funcionrio, j d.cod_dep quer dizer que o cdigo do

    departamento da tabela Departamento.

  • 46

    2.11.2) Junes Externas (Outer Join):

    Na juno externa, os registros que participam do

    resultado da juno no obrigatoriamente obedecem

    condio de juno, ou seja, a no inexistncia de valores

    correspondentes no limita a participao de linhas no

    resultado de uma consulta.

    Existem tipos diferentes de juno externa.

    Apresentaremos alguns deles:

    2.11.2.1) Juno Externa Esquerda (Left Outer Join):

    Suponha que desejemos uma listagem com os nomes

    de todos os departamentos cadastrados no nosso banco de

    dados e, para aqueles que possuam funcionrios lotados

    nele, apresente os respectivos nomes. Para isso, teremos

    que utilizar a juno externa esquerda. A instruo para

    resolver esta questo apresentada abaixo:

    A instruo anterior produzir o seguinte resultado, a

    partir das tabelas propostas anteriormente:

    Descr Nome

    Desenvolvimento Joo

    Desenvolvimento Maria

    Anlise Jos

    Testes Antnio

    Contabilidade

    Perceba que, como a tabela Departamento foi

    colocada esquerda da juno, foi apresentada a listagem

    completa de todas as descries de departamento e, quando

    havia alguma associao de uma descrio com um

  • 47

    funcionrio, este era apresentado. Observe que ningum

    est lotado no departamento de contabilidade, logo ningum

    aparece associado a este departamento na tabela anterior.

    2.11.2.2) Juno Externa Direita (Right Outer Join):

    A juno externa direita muito parecida com a

    juno externa esquerda. A nica diferena est no fato de

    que a tabela da qual todas as linhas constaro no resultado

    est posicionada direita do termo Right Outer Join no

    comando.

    Assim, para realizarmos a mesma consulta do item

    anterior, porm, utilizando a juno externa direita,

    teramos que executar a seguinte instruo:

    EXERCCIO AULA 2 1) A partir da linguagem SQL, construa uma base de dados chamada Clnica e, dentro dela, crie as tabelas da quarta questo da aula anterior, com suas respectivas chaves primrias e chaves estrangeiras. 2) A partir do banco de dados da questo anterior e utilizando a linguagem SQL, responda as questes abaixo: a) Altere a tabela mdico, adicionando a coluna nome_cnjuge. b) Insira, pelo menos, dois registros em cada uma das tabelas. c) Delete um registro da tabela especialidade. Obs: mantenha a integridade referencial. d) Obtenha o nome do paciente mais velho.

    e) Para cada CRM de mdico, obtenha a quantidade de consultas relacionadas a ele.

    f) Obter o nome do(s) mdico(s) que atendeu o paciente de nome Joo.

    g) Para cada nome de mdico, obtenha a quantidade de consultas relacionadas a ele.

  • 48

    3 Aula Procedimentos e Funes Meta da Aula

    Apresentar os procedimentos e funes na

    linguagem SQL. E sua implementao no

    MySQL

    Ao final desta aula, voc dever ser

    capaz de:

    1. Conhecer a linguagem SQL para utilizao no MySQL;

    2. Saber o que um procedimento (store procedure);

    3. Conhecer a sintaxe de um procedimento no MySQL;

    4. Implementar de procedimentos no MySQL;

    5. Saber o que uma funo (function); 6. Conhecer a sintaxe de uma funo no

    MySQL; 7. Implementar de funo no MySQL.

    Ob

    jeti

    vo

    s

  • 49

    Procedimento e Funo 3.1 INTRODUO PROGRAMAO EM SQL

    A linguagem SQL foi estruturada como uma linguagem

    de programao comum, assumindo estrutura de controle, deciso, repetio, de forma que possa executar funes (functions), procedimentos (store procedures) e gatilhos (triggers) de maneira eficiente e efetiva.

    Este tipo de programao com SQL diretamente no SGBD trs as seguintes vantagens:

    Reduz a diferena entre o SQL e a linguagem de programao;

    Por ser armazenada no SGBD permite que possa ser invocado por diferentes aplicaes evitando assim a duplicao de cdigo;

    Reduz custos de comunicao, por ser executada no SGBD;

    Pode ser utilizado diretamente na elaborao de functions, store procedures e triggers;

    O MySQL utiliza o SQL/PSM (SQL/Persistent Stored Modules) que uma extenso ao SQL. Ele define para a escrita de procedimentos e funes em SQL que juntamente com a utilizao de estruturas de controle aumentam consideravelmente o poder expressivo do SQL.

    Figura 5 - Bloco de Comandos

    Para se programar em SQL/PSM, ou seja, criar

    programas em SQL, se faz necessrio familiaridade com as declaraes de variveis, cursores, atribuies de valores, operadores lgicos, condies, loops, rotinas de controle, comentrios. Acumulado esse conhecimento, pode-se criar blocos de comandos para preparar funes (function), procedimentos (store procedure) e gatilhos (triggers), que sero compilados, executados e armazenados diretamente no SGBD. Fazendo com que dessa forma as regras de

  • 50

    negcio sejam disponibilizadas para todas as aplicaes que acessam o SGBD.

    Iniciaremos nosso estudo em SQL/PSM no MySQL, desde os blocos de comando at a elaborao das funes (function), procedimentos (store procedure), gatilhos (triggers) e ainda controle de acesso de usurio.

    Vamos aprender a sintaxe, dos comandos para que possamos programar no MySQL.

    3.1.1 COMANDO: BEGIN ... END

    As palavras-reservas BEGIN e END atuam como delimitadoras de um bloco de comandos, na criao de programas SQL. Os blocos de comandos so programas compostos por uma ou mais instrues escritas em SQL. Essas mesmas instrues BEGIN... ENG tambm podem aparecer aninhadas. Temos a estrutura de um bloco de comandos em SQL, a seguir:

    3.1.2 COMANDO: DECLARE

    Para que se possa usar uma varivel em um programa no MySQL, necessrio fazer a declarao de varivel antes. A declarao de variveis simplesmente informa ao MySQL quais so os nomes dados as variveis e quais so os tipos usados. No MySQL o nome da varivel consiste, basicamente, de caracteres alfanumricos, podendo ainda ser utilizados os caracteres _, $ e o ..

    O comando DECLARE, serve para fazer a declarao de variveis locais, condies, cursores e handlers.

    Introduzindo o conceito de cursor at ento desconhecidos nas linguagens comuns de programao, o MySQL utiliza esse termo para armazenar resultados de algum tipo de processamento realizado no SGBD. No exemplo a seguir temos a declarao de dois cursores, o cur1 e o cur2, observemos que os dois acessam colunas e tabelas diferentes, portanto geram resultados diferentes.

    Quando necessrio o cursor est presente em funes (function), procedimentos (store procedure) e gatilhos (triggers).

    Temos tambm o termo novo handler. Um handler funciona como um artifcio que existem em torno de funes de acesso ao banco de dados MySQL. Ele procura estabelecer conexes persistentes ou no persistentes com o MySQL, executar consultas SQL, recuperar o nmero de

    BEGIN [DECLARAO DE VARIVEIS]; [DECLARAO DE CURSORES]; COMANDOS SQL; COMANDOS SQL; END

  • 51

    linhas entre um conjunto de resultados e alm de obter o nmero de linhas afetadas por um INSERT, UPDATE ou DELETE numa consulta no MySQL. E ainda recupera mensagens de erros associadas ltima consulta no MySQL que no chegou a ser finalizada devido a uma falha interna qualquer.

    O comando DECLARE segue a precedncia, assumida pelo MySQL, que determinar que os cursores devem ser declarados antes dos handlers, e as variveis e condies, antes dos cursores.

    Sintaxe do comando DECLARE para declarar varivel:

    Sintaxe do comando DECLARE para declarar condio:

    Sintaxe do comando DECLARE para declarar cursor:

    Sintaxe do comando DECLARE para declarar handler:

    Exemplificao do comando DECLARE, a seguir:

    3.1.3 - COMANDO: SET

    Uma vez que j se tenha declarado uma varivel no MySQL, deve-se atribuir a mesma algum valor. A operao de atribuio uma operao muito simples, consiste de atribuir um valor de uma expresso a uma varivel, utilizando para isso o comando SET.

    DECLARE ;

    DECLARE CONDITION FOR ;

    DECLARE CURSOR FOR ;

    DECLARE HANDLER FOR ; pode ser: CONTINUE, EXIT ou UNDO.

  • 52

    O smbolo de atribuio o = (igual) que no MySQL,

    tambm pode ser usado como o operador que representa a igualdade de valores.

    As variveis no precisam ser inicializadas. Elas contm o valor NULL por padro e podem armazenar valores numricos (inteiro ou real), string (seqncia de caracteres) ou data e hora.

    Sintaxe do comando SET:

    O comando SET demonstrado, abaixo:

    3.1.4 COMANDO: OPEN, FETCH, CLOSE

    J vimos como declarar um cursor, portanto, vamos agora aprender a utiliz-lo.

    O curso age como um mecanismo para manipulao de linhas de uma tabela do MySQL, muitas vezes discriminadas linha por linha. E atuam ainda como ponteiros, uma vez que apontam para a(s) linha(s) do resultado dado pela consulta solicitada no MySQL.

    Aps a declarao do cursor, ele deve ser inicializado atravs do comando open.

    Sintaxe do comando OPEN:

    Posteriormente, a execuo do comando OPEN, o MySQL est pronto para manipular o resultado dos comandos SQL. Ento, o comando FETCH executado para que o ponteiro seja posicionado numa linha e as informaes atribudas apontadas pra um conjunto de variveis (o nmero de coluna do resultado apontado pelo cursor deve ser igual ao nmero de variveis). Portanto, terminado a execuo do FETCH, j se pode manipular as variveis que receberam o valor do cursor.

    O comando FETCH usualmente encontrado nos comandos de iterao, como o REPEAT e o WHILE, que sero vistos em sees posteriores.

    Sintaxe do comando FETCH:

    SET = ;

    OPEN ;

  • 53

    E para finalizar o uso do cursor, deve-se fechar o

    mesmo, atravs do comando CLOSE. A ao de no fechar o cursor pode causar problemas graves no MySQL.

    Sintaxe do comando CLOSE:

    Os comandos OPEN, FETCH e CLOSE

    demonstrados, abaixo:

    3.1.5 - COMANDO: SELECT.... INTO

    Esse comando usado para armazenar, no MySQL, o resultado de uma consulta em uma varivel. O resultado da consulta deve ter sempre como retorno somente uma linha, caso o resultado tenha mais de uma linha, deve ter o mesmo nmero de variveis para receber esses valores.

    Se a consulta tiver mais de uma linha como resultado, e no existir varivel suficiente receber os valores da consulta, ocorrer o erro 1172, e aparecer no MySQL, a seguinte mensagem Result consisted of more than one row, caso a consulta retorne nenhum resultado, ocorrer o erro 1329, e aparecer no MySQL a mensagem No data.

    Sintaxe do comando SELECT .... INTO:

    FETCH INTO

  • 54

    O comando SELECT.... INTO est demonstrado,

    abaixo:

    3.1.6 - COMANDO: IF

    A estrutura de deciso permite executar um entre dois ou mais blocos de instrues. No MySQL, temos a estrutura de deciso IF, ele testa se uma condio verdadeira ou falsa, se for verdadeira executa um conjunto de comandos.

    Sintaxe do comando IF: Exemplificao, do comando IF, abaixo:

    3.1.7 COMANDO: CASE...WHEN

    A estrutura CASE...WHEN uma estrutura de deciso que permite a execuo de um conjunto de instrues SQL, conforme a pesquisa e posterior encontro de um determinado valor.

    Sintaxe do comando CASE...WHEN:

    IF THEN ; ; [ELSE IF THEN ; ;]... [ELSE ;; END IF;

    CASE WHEN THEN ; WHEN THEN ;]... [ELSE ;] END CASE;

  • 55

    A Sintaxe do comando CASE...WHEN, tambm pode

    ser a seguinte:

    O comando CASE..WHEN est demonstrado,

    abaixo:

    3.1.8 COMANDO: LOOP e ITERATE

    O comando LOOP no tem uma condio a ser testada. Para que a repetio termine, o MySQL determina que o comando LEAVE finalize o lao. O comando ITERATE usado dentro da construo LOOP... END LOOP, serve para reiniciar a repetio, ou seja, o loop.

    Sintaxe do comando LOOP:

    Quadro 12 Sintaxe LOOP.. ITERATE

    Os comandos LOOP..END LOOP e ITERATE

    est demonstrado, abaixo:

    CASE WHEN THEN ; WHEN THEN ;]... [ELSE ;] END CASE;

    : LOOP ; ; ITERATE ; ; END LOOP ;

  • 56

    3.1.9 COMANDO: REPEAT

    Esse comando permite a repetio na execuo de um conjunto de comandos. Os comandos sero executados ao menos uma vez, independente da condio testada. A execuo do comando REPEAT ser mantida enquanto a condio testada for falsa.

    Sintaxe do comando REPEAT: O comando REPEAT est demonstrado, abaixo:

    Para melhor exemplificao, temos um exemplo comando REPEAT:

    3.1.10 COMANDO: WHILE...DO

    Esta estrutura faz com que a condio seja avaliada em primeiro lugar. Se a condio verdadeira os comandos SQL so executados uma vez e a condio avaliada novamente. Caso a condio seja falsa a repetio terminada sem a execuo dos comandos SQL.

    Sintaxe do comando WHILE..DO:

    O comando WHILE...DO est demonstrado,

    abaixo:

    REPEAT ; ; UNTIL END REPEAT;

    WHILE DO ; ; ; END WHILE;

  • 57

    3.1.11 COMANDO: LEAVE

    Esse comando utilizando para sair de uma estrutura de controle, seja de repetio (REPEAT, WHILE, LOOP, ITERATE) ou deciso (IF, CASE).

    Sintaxe do comando LEAVE: O comando LEAVE est demonstrado, abaixo:

    3.1.12 COMANDO: CALL

    Esse comando utilizando para chamar um procedimento (store procedure) no MySQL. Posteriormente, veremos como criar um procedimento (store procedure).

    Sintaxe do comando CALL: O comando CALL est demonstrado, abaixo:

    3.1.13 COMANDOS: RETURN e RETURNS

    Esse comando utilizando para retornar um valor

    de uma varivel armazenada no MySQL. O comando RETURN no utilizado em procedimentos (store procedure).

    LEAVE ;

    OBSERVAO: o label pode ser o nome de uma funo,

    procedimento ou gatilho, ou simplesmente o nome de um

    rtulo presente nas estrutura de controle.

    CALL (parmetros do

    procedimento);

    ou

    CALL ();

  • 58

    Sintaxe do comando RETURN:

    O comando RETURN est demonstrado, abaixo:

    O comando RETURN diferente do comando

    RETURNS. Os dois so usados numa funo, o 1 (RETURNS) serve para definir qual tipo de dados ir retornar na funo, e o 2 (RETURN) diz o valor de qual varivel ser definida como retorno. No exemplo, acima, temos a funo Aumenta_Sal (...) que ir retornar um valor do tipo DOUBLE, que est armazenado na varivel maior_sal.

    Sintaxe do comando RETURNS:

    3.2 PROCEDIMENTOS (STORE PROCEDURE)

    Agora que j aprendemos a sintaxe, para que possamos construir as primeiras rotinas que sero executadas no MySQL. Temos que entender, que nossas rotinas podero ser simples, com poucas linhas de cdigo ou bastante complexas e de cdigo extenso, vai depender muito do que se programa, como numa linguagem de programao comum. A diferena bsica e essencial, que esses nossos programas estaro armazenados no servidor e podero ser chamados a partir da prpria linguagem SQL.

    Assim, teremos que utilizar os procedimentos (store procedure) e as funes (function), cujos conceitos esto definidos no SQL e ficam armazenados no servidor, podendo ser invocados, de acordo com a necessidade do SGBD.

    Vamos a um assunto muito interessante referente banco de dados, mais precisamente procedimentos armazenados (store procedure).

    Um procedimento um cdigo procedural, semelhante ao utilizado em linguagens estruturadas, s que ao invs de ter que escrever seus prprios comandos SQL na aplicao, voc cria o procedimento (store procedure) no

    RETURN ;

    RETURNS ;

    O MySQL reconhece store procedure (procedimentos armazenados), na nossa apostila, vamos nos referir a eles somente como procedimentos.

  • 59

    banco de dados e pode ser executado por qualquer aplicao cliente, o que melhor e muito sua performance de execuo.

    J que entendemos o que um procedimento (store procedure). Saberemos, a partir de agora, os motivos para se utilizar um procedimento (store procedure):

    Modularizao: os procedimentos (store procedures) utilizam a programao modular. Eles encapsulam conjuntos de operaes sobre os dados, ou seja, qualquer possvel alterao no SGBD fica escondida da aplicao que fazem o acesso o banco por meio de procedimento (store procedure). E ainda permite que aplicaes possam acessar o SGBD de maneira uniforme;

    Performance: quando um procedimento (store procedure) executado no banco de dados, um modelo daquele procedimento continua na memria para se aproveitada posteriormente, o que melhorar a velocidade de execuo;

    Segurana: utilizando procedimento (store procedure), o acesso no feito diretamente nas tabelas, portanto a probabilidade de um desenvolvedor da aplicao fazer algo de errado que possa comprometer a base do banco de dados diminui, o que aumenta a segurana da aplicao desenvolvida utilizando procedimento. Ou podem ter atributos de segurana, portanto os usurios podem ter permisses de executar procedimento (store procedure) , sem ter permisses sobre os objetos referenciados dentro do procedimento;

    Trfego de rede: pode reduzir o trfego na rede gerado pela aplicao, porque quando cdigo SQL fica na aplicao, necessrio que o mesmo seja enviado ao banco (compilado e otimizado) a cada nova consulta, se tivermos muitas linhas de SQL isso ir gerar um trfego maior, portanto mais vantajoso ter uma linha de cdigo para executar um procedimento (store procedure).

    Os procedimentos (store procedure), podem ser de 03 (trs) tipos:

    retornam registros do banco de dados: um simples SELECT em uma tabela;

    Ateno!! Agora a hora de usar o comando CALL, toda vez que quiser executar um procedimento precisamos utilizar esse comando.

  • 60

    retornam um simples valor: pode ser o total

    de registros de uma tabela; no retorna valor (realiza uma ao): pode

    ser a insero J que entendemos, o que um procedimento, sua

    sintaxe :

    Onde: nome-do-procedimento representa o nome do

    procedimento que ser criado. Os trs tipos de parmetros que pode ser utilizados

    nos procedimentos so: IN: um parmetro de entrada, ou seja, um

    parmetro cujo seu valor seu valor ser utilizado no interior do procedimento para produzir algum;

    OUT: um parmetro de sada, retorna algo de dentro do procedimento, colocando os valores manipulados disponveis na memria ou no conjunto de resultados;

    INOUT: faz o processamento dos IN ou OUT simultaneamente.

    A caracterstica DETERMINISTIC diz que o procedimento sempre retorna o mesmo resultado para os mesmos parmetros de entrada, e a caracterstica NOT DETERMINISTIC determina o contrrio da caracterstica deterministc. Atualmente, essas caractersticas so aceitas, pela MySQL, mas ainda no usada.

    Temos a caracterstica que informa o modo de tratamentos dos dados durante a execuo do

    CREATE PROCEDURE nome-do-procedimento ([parmetros[,...]]) BEGIN [caractersticas ...] corpo da funo

    parmetros: [ IN | OUT| INOUT ] nome do tipo do parmetro

    tipo: Qualquer tipo de dado vlido no MySQL

    caractersticas: Linguagem SQL

    | [NOT] DETERMINISTIC | {CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA } | SQL SECURITY {DEFINER | INVOKER} | COMMENT string

    corpo do procedimento: comandos vlido no SQL

    END

  • 61

    procedimento. Para CONTAINS SQL o default, determina que os dados no podem ser lidos ou escritos, pois ele j devem ser determinados, no bloco de comandos. O NO SQL diz que o procedimento contm dados a serem lidos ou escritos. O READS SQL DATA indica que teremos somente leitura de dados, por meio do SELECT. E o MODIFIES SQL DATA determina que tem-se escrita ou remoo de dados, utilizando o INSERT ou DELETE.

    A caracterstica SQL SECURITY pode ser usada para especificar se o procedimento pode ser executado para usar as permisses do usurio que criou os procedimentos, ou do usurio que o invocou. O DEFINER o valor padro, foi um recurso novo introduzido no SQL:2003.

    A clusula COMMENT uma extenso do MySQL, e pode ser usada para descrever o procedimento (stored procedure).

    Depois que, aprendemos a sintaxe dos procedimentos, vamos ver alguns exemplos implementadas no MySQL, do nosso banco de dados da empresa de desenvolvimento de projetos utilizado desde o incio da nossa apostila:

    Antes de elaborar os procedimentos, temos que ter como objetivos, cri-los de forma que eles possam trazer algum tipo utilizao, realmente prtica, para empresa ou organizao, na qual forem implementados.

    Poderia ser interessante, para cada departamento, saber relacionar os projetos e seus oramentos, o usurio pode determinar solicitar um relatrio de todos os projetos cujo oramento for maior do R$ 10.000,00 e a data de incio desse projeto. Abaixo, esse exemplo bem simples de procedimento:

    A gerncia de pessoal, pode solicitar os nomes dos funcionrios que esto lotados em mais de um projeto, ou solicitar em qual ou quais projeto(s) seu funcionrio est lotado, a partir do cdigo desse funcionrio. Observem que so dois procedimentos diferentes um sem e outro com parmetros de entrada.

    Ateno!! A clusula IF EXISTS, do comando DROP PROCEDURE OU FUNCTION uma extenso do MySQL. Ela previne que um erro ocorra se a funo ou o procedimento no existe mais no SGBD. Um aviso produzido e pode ser visualizado

    SHOW

  • 62

    Para resolver estes problemas, vamos utilizao dos

    procedimentos abaixo.

    A chamada para a execuo de um procedimento

    diferente da chamada para funo. No procedimento, utilizamos o comando (CALL). Daqui pouco, aprenderemos como utilizar funo.

    Vamos invocar os procedimentos criados, e verificar se eles realmente funcionam, no MySQL

    Algumas caractersticas de um procedimento podem

    ser alteradas, para isso, vamos ver a sintaxe da alterao de um procedimento, a seguir:

    ALTER PROCEDURE nome-do-procedimento[caractersticas ...]

    caractersticas:

    NAME novo-nome | {CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }

    | SQL SECURITY {DEFINER | INVOKER} | COMMENT string

  • 63

    Onde: nome-do-procedimento representa o nome do

    procedimento que ter sua(s) caracterstica(s) alterada(s). O comando ALTER PROCEDURE no muito

    utilizado no MySQL, uma vez que no se pode alterar nem os parmetros nem o corpo do procedimento. Caso, se queira fazer muitas modificaes no procedimento, recomenda-se apagar o procedimento e criar um novo.

    A seguir, vamos aprender como remover uma funo:

    Onde: nome-do-procedimento representa o nome do

    procedimento que ter removido do servidor de banco de dados.

    Veremos, a seguir, como remover os trs procedimentos que foram criados no MySQL:

    3.3 FUNES (Function)

    Vamos agora, aprender sobre funes (functions). Funes (tambm chamadas de rotinas, ou sub-

    programas) so segmentos de programa que executam uma determinada tarefa especfica. possvel ao administrador do SGBD, escrever suas prprias rotinas, no MySQL. So as chamadas de funes definidas pelo usurio ou rotinas definidas pelo usurio (UDFS User Defined Functions).

    Criando nossas prprias funes, temos a vantagem de adequ-las a nosso ambiente de trabalho, de acordo com as nossas necessidades dirias. Isso tudo, sem ter que modificar a aplicao, uma vez a funo est implementada direto na aplicao.

    Temos como exemplo, um Banco Comercial, onde um de seus maiores patrimnio so os dados dos correntistas, nesse tipo de organizao a mudana de SGBD remota, procura-se dessa forma obter o mximo possvel do servidor de banco de dados, utilizando os recursos que lhes so oferecidos, como a utilizao de funes. Outras organizaes por utilizar tudo centralizado no SGBD, centralizam tambm s regras de negcios, tornando-as iguais para qualquer aplicao que venha a acessar o

    DROP PROCEDURE nome-do-procedimento [IF EXISTS] nome_warning

    Curiosidade!! Para saber todas as informaes sobre as funes do SGBD, podemos usar o comando SHOW FUNCTION STATUS e SHOW PROCEDURE STATUS, para os procedimentos.

  • 64

    servidor do banco de dados. Dessa maneira, uma funo que venha a ser padronizada no banco de dados, por ser executada por aplicaes diferente, seja desenvolvida em Delphi, Java, C.

    Ento, funo so programas armazenados no SGBD, pr-compilados, invocados de forma explcita para executar alguma lgica de manipulao de dados, e que sempre retorna algum valor.

    A diferena bsica entre o procedimento e uma funo que a funo sempre retorna algum valor.

    J que entendemos, o que uma funo, sua sintaxe :

    Quadro 24 Comando Create Function Onde: nome-da-funo representa o nome da funo que ser

    criada. A lista de parmetros entre parnteses deve estar

    sempre presente. Se no houver parmetros, uma lista de parmetros vazia de ( ) deve ser usada.

    A funo tambm apresenta as caractersticas DETERMINISTIC e NOT DETERMINISTIC. As caractersticas CONTAINS SQL, NO SQL, READS SQL DATA e MODIFIES SQL DATA, possuem as mesmas funcionalidades utilizadas nos procedimentos.

    E na questo de segurana, a caracterstica SQL SECURITY pode ser usada para especificar se a funo possa ser executada usando as permisses do usurio que criou as funes, ou do usurio que a invocou. O DEFINER o valor padro, foi um recurso novo introduzido no SQL:2003.

    A clusula COMMENT uma extenso do MySQL, e pode ser usada para descrever a funo (function).

    A clusula RETURNS pode ser especificada apenas por uma FUNCTION. usada para indicar o tipo de retorno

    CREATE FUNCTION nome-da-funo ([parmetros[,...]]) [RETURNS tipo] BEGIN [caractersticas ...] corpo da funo

    parmetros:nome do tipo do parmetro

    tipo: Qualquer tipo de dado vlido no MySQL

    caractersticas: Linguagem SQL

    | [NOT] DETERMINISTIC | {CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA } | SQL SECURITY {DEFINER | INVOKER} | COMMENT string

    corpo da funo: comandos vlido no SQL

    RETURN END

  • 65

    da funo, e o corpo da funo deve conter uma instruo RETURN e o valor de retorno.

    Depois que, aprendemos a sintaxe da funo, vamos ver alguns exemplos de funes, implementadas no MySQL, do nosso banco de dados praticabd, utilizado desde o incio da nossa apostila.

    Antes de elaborar as funes, temos que ter como objetivos, cri-las de forma que elas possam trazer algum tipo utilizao, realmente prtica, para empresa ou organizao, na qual forem implementadas.

    Caso cada departamento, queira saber a classificao dos projetos de acordo com o seu oramento, a funo est exemplificada a seguir:

    A gerncia de pessoal poderia solicitar ao SGBD, um

    aumento salarial a todos os funcionrios e ter como retorno o valor do maior salrio, aps o aumento. Vamos a elaborao dessa funo no MySQL:

    Para verificarmos, se as funes acima funcionaro e se retornaram o que se esperava dele, podemos usar os SELECT abaixo:

    Vamos invocar as funes criadas para saber a classificao do oramento, e verificar se elas realmente funcionam.

  • 66

    Agora, vamos invocar a Aumenta_Sal(aumento INT) e

    v sua funcionalidade, para um aumento de 10%.

    Lembrando que uma funo sempre retorna algum

    valor, por isso podemos utilizar o valor do retorno da funo. E para utilizar esse valor, preciso que seja criada uma varivel do mesmo tipo do retorno da funo, e o nome da funo deve aparecer ao lado direito de um comando de atribuio de valores (SET). As funes armazenadas no MySQL podem ser utilizadas em comandos SQL da mesma forma que as outras funes j criadas na prpria linguagem.

    Algumas caractersticas de uma funo podem ser alteradas, para isso usamos a sintaxe, a seguir:

    Onde: nome-da-funo representa o nome da funo que ter

    sua(s) caracterstica(s) alterada(s). Esse comando no muito utilizando, uma vez que

    no se pode alterar os parmetros ou o corpo da funo. Caso se queira alterar, o cdigo de uma funo o ideal remov-la e criar uma nova funo. A seguir, vamos aprender como remover uma funo.

    Portanto, para finalizar o nosso estudo sobre funo, podemos deletar essa rotina do SGBD, para isso usamos a sintaxe, abaixo:

    Onde: nome-da-funo representa o nome da funo que ter

    removida do servidor de banco de dados. Teremos, a seguir, a remoo das funes criadas no

    MySQL.

    ALTER FUNCTION nome-da-funo [caractersticas ...]

    caractersticas:

    | {CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA } | SQL SECURITY {DEFINER | INVOKER}

    DROP FUNCTION nome-da-funo [IF EXISTS] nome_warning

  • 67

    Para listarmos todos os procedimentos (store procedure) e as funes (functions) armazenados no MySQL, temos que utilizar a sintaxe a seguir:

    Esse ltimo comando lista somente os procedimentos e funes, gravadas na tabela ROUTINES do banco de dados INFORMATION_SCHEMA.

    SELECT * FROM INFORMATION_SCHEMA.ROUTINES;

  • 68

    RESUMO DO CAPTULO

    Comeamos uma introduo na linguagem SQL/PSM (SQL/Persistent Stored Modules), voltada para utilizao no MySQL. Depois, utilizamos o estudo de caso de uma empresa de desenvolvimento de projeto, para verificar como modelar o banco de dados do sistema dessa empresa, utilizando procedimentos e funes. Portanto, a Aula 3, procurar fazer uma iniciao no estudo de procedimentos (store procedure) e funes (functions) no MySQL, buscando ensinar o manejo destes recursos que de grande proveito, principalmente no sistemas que necessitam de modularidade e otimizao quanto performance.

    Informaes para a prxima aula

    Na Aula 4, teremos a oportunidade de conhecer e

    implementar um gatilho (trigger) o controle de acesso de

    usurios.

    Bibliografia consultada

    DESCOBRE. Tipos de Linguagem de Programao. Disponvel em . Acesso em 23. mar. 2010

    Manual MySQL 5.1< http:// dev.mysql.com/doc/refman/5.1/en/index.html>. Acesso em 24.mar. 2010

  • 69

    4 Aula Gatilho e Controle de Acesso Meta da Aula

    Apresentar os gatilhos e controle de acesso

    na linguagem SQL. E implementas gatilhos e

    controle de acesso no MySQL.

    Ao final desta aula, voc dever ser

    capaz de:

    1. Saber o que um gatilho (trigger); 2. Conhecer a sintaxe de um gatilho (trigger)

    no MySQL; 3. Implementar de gatilho (trigger) no MySQL; 4. Saber o que um usurio no MySQL; 5. Criar, renomear, deletar, alterar senha de

    usurio no MySQL; 6. Saber quais so os privilgios do usurio

    no MySQL; 7. Atribuir e Remover privilgios no MySQL;

    Ob

    jeti

    vo

    s

  • 70

    Gatilho e Controle de Aceso 4.1 GATILHO (TRIGGER)

    A linguagem SQL alm de tratar os procedimentos e funes, tambm permite a criao de gatilhos (triggers).

    considerado uma lgica de processamento procedural, armazenada no SGBD e disparada automaticamente pelo servidor sob condies especficas. Gatilhos (triggers) representam regras do mundo (negcio) que definem a integridade ou consistncia do BD.

    Passaram a ser padro SQL em 1999. Seu principal objetivo monitorar o SGBD e realizar alguma ao quando uma condio ocorre.

    Os gatilhos (triggers) devem ser armazenados na base de dados como objetos independentes e no podem ser locais a um bloco ou pacote. So na verdade, procedimentos disparados automaticamente pelo SGBD em resposta a um evento especfico do banco de dados. Portanto, so bastante semelhantes aos procedimentos (store procedure) s que tem sua execuo disparada pelo SGBD quando ocorre um acontecimento/evento desencadeador de trigerring suceder e no aceita argumentos. O ato de executar um gatilho (trigger) conhecido como disparar o gatilho (trigger). O evento desencadeador pode ser uma operao DML (INSERT, UPDATE, ou DELETE) em uma tabela da base de dados.

    Os gatilhos (triggers) podem usados para: Segurana sobre a base de dados, e ao de

    usurios, verificando quando uma operao realizada sobre uma entidade, o gatilho (trigger) disparado para verificar as permisses do usurio;

    Melhorar a segurana no acesso aos dados; Assegurar as restries de integridade; Fazer a auditoria das informaes de uma tabela,

    registrando as alteraes efetuadas e quem as efetuou;

    Sinalizar automaticamente a outros programas que necessrio efetuar uma ao, quando so efetuadas alteraes numa tabela.

    A seguir so enumeradas algumas vantagens no uso de gatilhos (triggers):

    Um gatilho (trigger) sempre disparado quando o evento ocorre, evitando assim esquecimentos ou falta de conhecimento sobre o banco de dados;