Baixe o app para aproveitar ainda mais
Prévia do material em texto
1 Base de Dados II CC-FCUAN - 2010 Dr. Vicente Base de Dados II Curso: Ciências da Computação vicente@inforalpha.com 2 CC-FCUAN - 2010 Dr. Vicente Base de Dados II Tecnologia de Bases de Dados SGBD Conceitos e Arquiteturas 3 CC-FCUAN - 2010 Dr. Vicente Base de Dados II •O que é um SGBD ? • Modelos de dados dos SGBDs • SGBDs para informação de gestão • SGBDs para outras aplicações • Arquitectura de SGBDs • Componentes de um SGBD Sumário 4 CC-FCUAN - 2010 Dr. Vicente Base de Dados II • Raghu Ramakrishnan, Database Management Systems Elementos de Estudo 5 CC-FCUAN - 2010 Dr. Vicente Base de Dados II Colecção de dados, integrados, de grandes dimensões. Modela uma empresa, organização, “universo” Entidades (alunos, professores, disciplinas) Associações (Professor lecciona Disciplina) Base de Dados 6 CC-FCUAN - 2010 Dr. Vicente Base de Dados II Pacote de software concebido com o objectivo de armazenar e gerir bases de dados. Sistema de Gestão de Bases de Dados - SGBD 7 CC-FCUAN - 2010 Dr. Vicente Base de Dados II • O Sistema de Gestão de Base de Dados é o conjunto de software destinado a gerir todo o sistema de armazenamento e manipulação de dados, fazendo o interface entre o nível aplicacional e a base de dados propriamente dita; • Esconde do nível aplicacional os detalhes do armazenamento físico dos dados e permite às aplicações um elevado grau de abstracção. Sistema de Gestão de Bases de Dados - SGBD 8 CC-FCUAN - 2010 Dr. Vicente Base de Dados II •Controlo da redundância • Restrição de acessos • Armazenamento persistente (dados e programas) • Inferências • Múltiplas interfaces (para tipos diversos de utilizadores) • Representação de relações complexas • Forçar constrangimentos de integridade • Backup e recuperação de faltas Para que serve um SGBD? 9 CC-FCUAN - 2010 Dr. Vicente Base de Dados II • Auto-descrição da informação (catálogo) • Isolamento entre programas e dados (abstracção dos dados) • Suporte de vistas múltiplas • Partilha de dados e processamento transaccional Programação com Ficheiros vs. SGBD 10 CC-FCUAN - 2010 Dr. Vicente Base de Dados II • Em geral, numa organização, SIM! • A médio/longo prazo a não adopção do SGBD tem custos superiores: – A informação tende a crescer indefinidamente e a sua composição evolui. – O número de utilizadores cresce – A dependência da organização em relação à disponibilidade da informação é cada vez mais crítica. Vale a pena usar um SGBD? 11 CC-FCUAN - 2010 Dr. Vicente Base de Dados II • Overhead demasiado elevado: – overhead do investimento em hw, sw, formação – SGBD demasiado geral no tratamento de dados – no processamento da segurança, controlo de concorrência, recuperação de faltas e controlo de integridade • Base de dados/aplicações simples/imutáveis • Requisitos de tempo-real incontornáveis • Ausência de acesso concorrente Quando não usar um SGBD? 12 CC-FCUAN - 2010 Dr. Vicente Base de Dados II • Da Computação à Informação – aplicações “científicas” vs. a web • Dados aumentam em diversidade e volume – Bibliotecas Digitais, vídeo interactivo, genoma humano – o número de aplicações está em explosão! • SGBD aplica conceitos que cobrem a quase totalidade das bases da informática – Sistemas Operativos, Linguagens, Teoria, IA, Multimédia, Lógica Porquê aprender BDs? 13 CC-FCUAN - 2010 Dr. Vicente Base de Dados II • Um modelo de dados (data model) é uma colecção de conceitos para descrever dados. • Um esquema é uma descrição de uma colecção específica de dados, usando um dado modelo de dados. • O modelo de dados relacional é o mais usado presentemente. – Conceito fundamental é a relação, uma tabela com linhas e colunas. – Toda a relação tem um esquema, que descreve quais as colunas ou campos. Modelo de Dados? O American National Standards Institute (ANSI) através do Standards Planning and Requirements Committee (SPARC) estabeleceu um padrão para o desenvolvimento de tecnologias de base de dados, definindo uma arquitectura de 3 níveis independentes: Interno, Conceptual e Externo 14 CC-FCUAN - 2010 Dr. Vicente Base de Dados II • Modelo Conceptual (externo) • Modelo Lógico (conceptual) • Modelo Interno (físico) (físico - estruturas de dados armazenadas em disco) Modelos de um Sistema de Informação 15 CC-FCUAN - 2010 Dr. Vicente Base de Dados II Arquitectura ANSI/SPARC Dados Interno Conceptual Externo SGBD Aplicações 16 CC-FCUAN - 2010 Dr. Vicente Base de Dados II Nível Interno • Refere-se ao armazenamento físico dos dados, organização de ficheiros, métodos de acesso e organização das estruturas físicas; • Deve ser organizado para permitir um melhor desempenho nas operações que previsivelmente se realizem com maior frequência Nível Conceptual • É também designado por esquema conceptual; • Refere-se ao modelo conceptual dos dados, independente dos utilizadores e das aplicações; • Constitui a estrutura da base de dados; • É o nível que permite esconder os detalhes do armazenamento físico dos dados, do nível aplicacional Nível Externo • Refere-se à independência programa/dados; • Como cada utilizador não necessita de trabalhar com a totalidade do esquema conceptual, o SGBD permite definir para cada um, uma view, que determina a janela de dados com que necessita de trabalhar; Este conceito aplica-se também às aplicações Arquitectura ANSI/SPARC 17 CC-FCUAN - 2010 Dr. Vicente Base de Dados II Arquitetura ANSI/SPARC 18 CC-FCUAN - 2010 Dr. Vicente Base de Dados II SGBD em Detalhe 19 CC-FCUAN - 2010 Dr. Vicente Base de Dados II SGBD em Detalhe 20 CC-FCUAN - 2010 Dr. Vicente Base de Dados II Meios de Armazenamento 21 CC-FCUAN - 2010 Dr. Vicente Base de Dados II Meios de Armazenamento 22 CC-FCUAN - 2010 Dr. Vicente Base de Dados II Meios de Armazenamento 23 CC-FCUAN - 2010 Dr. Vicente Base de Dados II Meios de Armazenamento 24 CC-FCUAN - 2010 Dr. Vicente Base de Dados II Meios de Armazenamento 25 CC-FCUAN - 2010 Dr. Vicente Base de Dados II Meios de Armazenamento 26 CC-FCUAN - 2010 Dr. Vicente Base de Dados II Utilizadores do SGBD 27 CC-FCUAN - 2010 Dr. Vicente Base de Dados II Data Base Administrator - DBA 28 CC-FCUAN - 2010 Dr. Vicente Base de Dados II Data Base Administrator - DBA 29 CC-FCUAN - 2010 Dr. Vicente Base de Dados II Data Base Administrator - DBA 30 CC-FCUAN - 2010 Dr. Vicente Base de Dados II Data Base Administrator - DBA 31 CC-FCUAN - 2010 Dr. Vicente Base de Dados II Aplicação (Desenvolvida no SGBD) 32CC-FCUAN - 2010 Dr. Vicente Base de Dados II Aplicação (Desenvolvida no SGBD) 33 CC-FCUAN - 2010 Dr. Vicente Base de Dados II Utilizador ad hoc 34 CC-FCUAN - 2010 Dr. Vicente Base de Dados II Utilizador ad hoc 35 CC-FCUAN - 2010 Dr. Vicente Base de Dados II Programador 36 CC-FCUAN - 2010 Dr. Vicente Base de Dados II Programador 37 CC-FCUAN - 2010 Dr. Vicente Base de Dados II Oracle, Progress, DB2, MySQL, PostgreSQL, Interbase, SQL Server. Paradox*, Access*, dbase* * Desktop Database Management Systems Exemplos: 38 CC-FCUAN - 2010 Dr. Vicente Base de Dados II • 1ª Geração: – Modelo Hierárquico, Modelo Rede • 2ª Geração: – Modelo Relacional • 3ª Geração: – Modelos Centrados em Objectos – Modelo Relacional por Objectos 39 CC-FCUAN - 2010 Dr. Vicente Base de Dados II Transações • SGBDs são em geral multi-user – processam simultaneamente operações disparadas por vários utilizadores • deseja-se alta disponibilidade e tempo de resposta pequeno – execução intercalada de conjuntos de operações • exemplo: enquanto um processo i faz I/O, outro processo j é selecionado para execução • SGBD – sistema de processamento de operações de acesso ao BD • Surge assim o conceito de transacção pois todas as tarefas de gestão da base de dados vivem à custa deste conceito 40 CC-FCUAN - 2010 Dr. Vicente Base de Dados II Transação • Unidade lógica de processamento em um SGBD • Composta de uma ou mais operações – seus limites podem ser determinados em SQL • De forma abstrata e simplificada, uma transação pode ser encarada como um conjunto de operações de leitura e escrita de dados 41 CC-FCUAN - 2010 Dr. Vicente Base de Dados II • Atomicidade - as operações que constituem uma transacção formam um conjunto indivisível (atómico): – Ou terminam com sucesso - COMMIT – Ou são todas desfeitas – ROLLBACK • Integridade - caso envolva actualização de dados, uma transacção deverá levar a Base de Dados de um estado de integridade para outro estado de integridade Conjunto bem definido de operações sobre a Base de Dados, com as seguintes características: Propriedades de umaTransação 42 CC-FCUAN - 2010 Dr. Vicente Base de Dados II Cod_Func = 1234 Nome = Luis Mota Salário = 120 Cod_Func = 1234 Nome = Luis Mota Salário = 130 Mudança de Estado Sucedida Cod_Func = 1234 Nome = Luis Mota Salário = 120 Cod_Func = 1234 Nome = Luis Mota Salário = 110 Mudança de Estado não Sucedida Propriedades de umaTransação 43 CC-FCUAN - 2010 Dr. Vicente Base de Dados II • Isolamento - se várias transacções ocorrerem em simultâneo, não devem as mesmas interferir entre si, tendo cada uma a ilusão de ser a única a ser executada; • Persistência - todos os efeitos de uma transacão bem sucedida tornam-se persistentes e visíveis para as outras transacções Propriedades de umaTransação 44 CC-FCUAN - 2010 Dr. Vicente Base de Dados II • Uma transação é sempre monitorada pelo SGBD quanto ao seu estado – que operações já fez? concluiu suas operações? deve abortar? • Estados de uma transação – Ativa, Em processo de efetivação, Efetivada, Em processo de aborto, Concluída Respeita um Grafo de Transição de Estados Estados de uma Transação 45 CC-FCUAN - 2010 Dr. Vicente Base de Dados II Transição de Estados de uma Transação 46 CC-FCUAN - 2010 Dr. Vicente Base de Dados II Transição de Estados de uma Transação 47 CC-FCUAN - 2010 Dr. Vicente Base de Dados II Transição de Estados de uma Transação 48 CC-FCUAN - 2010 Dr. Vicente Base de Dados II Transição de Estados de uma Transação 49 CC-FCUAN - 2010 Dr. Vicente Base de Dados II Transição de Estados de uma Transação 50 CC-FCUAN - 2010 Dr. Vicente Base de Dados II Transição de Estados de uma Transação 51 CC-FCUAN - 2010 Dr. Vicente Base de Dados II Flat Transaction (tudo ou nada) Mais simples e mais comuns, consistem em delimitar o conjunto de operações que as constituem (via nível aplicacional) Ex: BEGIN TRANSATION …. <OPERAÇÕES SOBRE A BD> … END TRANSACTION /* Faz o COMMIT */ BEGIN TRANSACTION Para cada cliente Ler TOTAL_COMPRAS Ler PREMIOS PREMIOS=PREMIOS+0,1 *TOT_COMPRAS Escrever PREMIOS END TRANSACTION Tipos de Transação 52 CC-FCUAN - 2010 Dr. Vicente Base de Dados II SAVEPOINTS TRANSACTION BEGIN TRANSACTION … <OPERAÇÕES SOBRE A BD> … SAVEPOINT <X> … <OPERAÇÕES SOBRE A BD> … SAVEPOINT <Y> … <OPERAÇÕES SOBRE A BD> … END TRANSACTION /* FAZ COMMIT*/ Torna-se assim mais fácil reiniciar (rollforward) ou desfazer (rollback) a partir de um SAVEPOINT Tipos de Transação 53 CC-FCUAN - 2010 Dr. Vicente Base de Dados II CHAINED TRANSACTIONS BEGIN TRANSACTION … <OPERAÇÕES SOBRE A BD> … COMMITPOINT … <OPERAÇÕES SOBRE A BD> … COMMITPOINT … <OPERAÇÕES SOBRE A BD> … END TRANSACTION /* FAZ COMMIT*/ Torna-se mais fácil reiniciar (rollforward) ou desfazer (rollback) a partir de um COMMITPOINT, reduzindo-se a amplitude das operações de rollforwars e rollback. Tipos de Transação 54 CC-FCUAN - 2010 Dr. Vicente Base de Dados II NESTED TRANSACTIONS • São as mais flexíveis e definem uma hierarquia de subtransacções, que podem ser flat ou nested transactions; • Cada subtransacção pode desfazer-se ou finalizar; • O commit de cada subtransacção só é efectivo após a transacção-pai ter finalizado; • Os resultados de uma subtransacção só são visíveis para a sua transacção-pai; • Quando uma subtransacção é desfeita, todas as suas subtransacções são desfeitas também. Tipos de Transação 55 CC-FCUAN - 2010 Dr. Vicente Base de Dados II BEGIN TRANSACTION … START SUBTRANSACTION … STARTSUBTRANSACTION … STARTSUBTRANSACTION … END TRANSACTION BEGIN TRANSACTION … END TRANSACTION BEGIN TRANSACTION … END TRANSACTION BEGIN TRANSACTION … END TRANSACTION Esquema representativo de NESTED TRANSACTIONS BEGIN TRANSACTION … START SUBTRANSACTION … STARTSUBTRANSACTION … END TRANSACTION BEGIN TRANSACTION … START SUBTRANSACTION … END TRANSACTION BEGIN TRANSACTION … END TRANSACTION 56 CC-FCUAN - 2010 Dr. Vicente Base de Dados II Linguagens de Bases de Dados A interacção do nível aplicacional com o SGBD faz-se à custa de linguagens específicas. Basicamente, podem-se identificar dois tipos de linguagens: Data Definition Language – DDL Data Manipulation Language – DML 57 CC-FCUAN - 2010 Dr. Vicente Base de Dados II Data Manipulation Language–DML (Linguagens de Manipulação de Dados) Linguagem disponibilizadaao nível aplicacional para a manipulação dos dados. Operações possíveis: inserção, remoção, alteração e consulta de dados. A DML é vulgarmente, confundida com as linguagens de interrogação (query languages). Data Definition Language – DDL (Linguagens de Definição de Dados) Não é uma linguagem de programação pois não possui qualquer instrução específica de processamento. É uma notação para descrever a estrutura dos dados a armazenar ⇒ é uma linguagem de definição dos metadados. O resultado da execução das instruções LDD é armazenado no dicionário de dados. Linguagens de Bases de Dados 58 CC-FCUAN - 2010 Dr. Vicente Base de Dados II SQL - Revisão 59 CC-FCUAN - 2010 Dr. Vicente Base de Dados II é um conjunto de instruções com as quais os programas e utilizadores acedem as informações das bases de dados relacionais, como é o caso do Oracle. As aplicações permitem aos usuários manipulação nos dados sem o efetivo uso de instruções SQL, no entanto essas aplicações seguramente usam SQL para executar as requisições dos usuários. Structured Query Language (SQL) 60 CC-FCUAN - 2010 Dr. Vicente Base de Dados II Para extrairmos e consultarmos dados das tabelas de um banco relacional, usamos a instrução SELECT, que faz uma pesquisa nas estruturas relacionais da base de dados e retorna valores na forma de linhas e colunas. Uma consulta SQL pode também ser nominada simplesmente como query. Implementando consultas SQL simples SELECT {*|coluna1 [apelido], coluna2 [apelido]} FROM tabela Construção Básica Diretrizes: • SQL não fazem distinção entre maiúsculas e minúsculas; • SQL podem estar em uma ou mais linhas; • As palavras reservadas não podem ser abreviadas; • Normalmente as clausulas são colocadas em linhas diferentes (boa prática); • Guias e identações são usadas para aumentar a legibilidade. 61 CC-FCUAN - 2010 Dr. Vicente Base de Dados II Quanto às colunas temos duas alternativas a primeira é selecionar todas as colunas em uma única consulta SQL, a outra mais elegante é selecionar apenas as colunas interessantes, cada coluna pode ter um alias associado. Alias são muito úteis para cálculos matemáticos. Colunas 62 CC-FCUAN - 2010 Dr. Vicente Base de Dados II Expressões Aritméticas (Operadores aritméticos) É possível criar expressões com colunas do tipo NUMBER e DATE usando operadores aritméticos, na seguinte procedência ( *, /, +, - ). Para adicionarmos 1(um) dia ao valor de um coluna do tipo DATE devemos utilizar o operador + da seguinte forma valor_data+1, e para adicionar uma hora a seguinte sintaxe valor_data+(1/24) Obs.: Um valor nulo não é o mesmo que zero ou um espaço em branco. **QUALQUER VALOR OPERACIONADO COM NULO RESULTA NULO**. Este problema é remediado pela função NVL 63 CC-FCUAN - 2010 Dr. Vicente Base de Dados II Operador de Concatenação No Oracle o operador || executa contatenação de dois strings de caracteres, e poderá ser usado nas cláusulas SELECT, WHER e ORDER BY. Utilizada na cláusula SELECT de uma consulta SQL, resultará em um campo do tipo caracter. 64 CC-FCUAN - 2010 Dr. Vicente Base de Dados II Restringindo e ordenando dados É possível restringir as linhas retornadas da consulta SQL utilizando a cláusula WHERE. As linhas da tabela só estarão no retorno da consulta SQL se a condição da cláusula WHERE aplicada à linha for atendida com sucesso. A cláusula WHERE é seguida de uma expressão condicional. O Oracle aplica condição às linhas da(s) tabela(s) de cláusula FROM. Cada aplicação de linha gera um valor boolean. As linhas que geram valores TRUE formarão o dataset de retorno Cláusula WHERE 65 CC-FCUAN - 2010 Dr. Vicente Base de Dados II Operadores de comparação comparam dois valores ou expressões e retornando um resultado de valor Boolean. A tabela ilustra os operadores de comparação mais recorrentes. Geralmente os operadores são usados na cláusula WHERE. Operadores de comparação 66 CC-FCUAN - 2010 Dr. Vicente Base de Dados II Operadores lógicos são usados para combinar ou alterar o resultado de uma ou mais comparações . O produto desta operação será um valor booleano e no escopo deste curso será utilizado para determinar quais linhas estarão no resultado da consulta. Operadores Lógicos 67 CC-FCUAN - 2010 Dr. Vicente Base de Dados II Múltiplos operadores podem formar uma expressão válida. Os operadores com maior precedência serão avaliados antes dos operadores de menor precedência, seguindo a tabela Precedência 68 CC-FCUAN - 2010 Dr. Vicente Base de Dados II A ordem das linhas retornadas em um resultado de consulta é indefinida. A cláusula ORDER BY pode ser utilizada para classificar as linhas. A cláusula ORDER BY deve ser colocada após a cláusula WHERE. Por definição o resultado será exibido de forma crescente e através da palavra-chave DESC a ordem é invertida. O resultado pode também ser ordenado por várias colunas Order By 69 CC-FCUAN - 2010 Dr. Vicente Base de Dados II Funções de uma linha Em instruções SQL as funções de uma linha são usadas principalmente para manipular os valores que serão apresentados. Estas aceitam um ou mais argumentos e retornam um ou único valor para cada linha do dataset gerado pela consulta. Um argumento pode ser um dos seguintes itens, constantes, valor variável, nome de coluna, expressão. 70 CC-FCUAN - 2010 Dr. Vicente Base de Dados II Funções de Caracter Quanto aos recursos de funções de uma linha • Actua em cada linha retornada da consulta. • Retorna um resultado por linha. • Podem receber zero, um ou mais argumentos. • Podem ser usados em cláusulas SELECT, WHERE, ORDER BY 71 CC-FCUAN - 2010 Dr. Vicente Base de Dados II Obs.: Funções de Linha podem ser usadas em instruções DML´s Funções de Caracter 72 CC-FCUAN - 2010 Dr. Vicente Base de Dados II Funções Numéricas Tabela Dual Em todas as bases de dados Oracle existe uma tabela chamada DUAL, aparentemente irrelevante. No entento, ela é útil quando se deseja retornar um valor pontual, sendo principalmente usada para a execução de instruções SQL que não necessitam de tabela base. 73 CC-FCUAN - 2010 Dr. Vicente Base de Dados II Funções de Data Para manipular valores do tipo DATE em um formato diferente do padrão estabelecido pelo ambiente de trabalho, se faz necessário o uso da função TO_CHAR com os elementos de Format Model corretos. Para o nosso curso será utilizado o Format Model ‘DD-MON-YYYY’ 74 CC-FCUAN - 2010 Dr. Vicente Base de Dados II Funções de Conversão TO_CHAR(X*,’format_model’+) Onde X é um valor do tipo DATE ou NUMBER e ‘format_model’ é uma string que descreve o formato de como o argumento X será apresentado. Existem formatações específicas para o tipo DATE e outras para o tipo NUMBER. 75 CC-FCUAN - 2010 Dr. Vicente Base de Dados II Funções de Conversão 76 CC-FCUAN - 2010 Dr. Vicente Base de Dados II TO_DATE(‘string’,’formatação’) Onde ‘string’ é a informação que se deseja transformar paravalor do tipo DATE e ’formatação’ é o FORMAT MODEL que indica com como o Oracle deverá reconhecer a string apresentada no primeiro parâmetro Funções de Conversão 77 CC-FCUAN - 2010 Dr. Vicente Base de Dados II Mostrando dados de várias tabelas Existem momentos em que faz necessário o uso de dados a partir de mais de uma tabela, neste caso usaremos condições especiais chamadas de JOIN’s. As linhas de uma tabela podem ser relacionadas às linhas de outra tabela de acordo com os valores comuns existentes nas colunas correspondentes, que em geral são colunas de chave primária e estrangeira. Diretrizes para Joins: • Ao se escrever uma instrução SELECT que combine mais de uma tabela, é interessante deixar claro a que tabela o campo pertence, posicionando o nome da tabela antes do nome do campo. • Não é obrigatório o posicionamento o nome da tabela antes do nome do campo, porém, se uma mesma coluna pertence a mais de uma tabela, deve-se prefixar a coluna com o nome da tabela. • Para combinar n tabelas se fez necessário no mínimo n-1 condições de JOIN 78 CC-FCUAN - 2010 Dr. Vicente Base de Dados II É possível também adicionar condições de filtros às condições de JOIN para restringe mais ainda as linhas obtidas. No exemplo abaixo, serão apresentados o nome e o departamento do funcionário “Matos”. 79 CC-FCUAN - 2010 Dr. Vicente Base de Dados II Quando um JOIN for completamente inválido ou omitido, o resultado da consulta SQL será um produto cartesiano no qual serão exibidas todas combinações de linhas de todas as tabelas envolvidas na consulta. O Produto cartesiano tende a gerar um grande número de linhas e seu resultado raramente é útil. Apresentamos o produto cartesiano aqui por finalidades didáticas. Produto Cartesiano 80 CC-FCUAN - 2010 Dr. Vicente Base de Dados II Alias de Tabela Para qualificar as colunas é possível utilizar alias de tabela ao invés do nome da tabela. Assim como os alias de coluna dão outro nome à coluna, os alias de tabela tem a mesma função. Os alias de tabela são definidos na cláusula FROM. O nome da tabela é especificado totalmente seguido do seu alias. Na instrução SQL do exemplo 5.4 foram definidos os alias “e” para a tabela employees e alias “d” para a tabela departments. 81 CC-FCUAN - 2010 Dr. Vicente Base de Dados II Diretrizes para Joins: • Os alias de tabela não ultrapassam 30 posições; • Um alias de tabela poderá substituir o nome da tabela em todas as cláusulas do SQL. • Os alias devem ser sugestivos. Não utilizem algo com T1, T2, T3,... • Palavras reservadas não podem ser utilizadas como alias nenhum. Algo como DESC alusivo a descrição 82 CC-FCUAN - 2010 Dr. Vicente Base de Dados II Funções de grupo De modo diferente das funções de uma única linha, as funções de grupo operam em conjunto de linhas para fornecer um resultado por grupo. Esses conjuntos podem ser uma tabela inteira ou a mesma dividida em grupos menores. 83 CC-FCUAN - 2010 Dr. Vicente Base de Dados II 84 CC-FCUAN - 2010 Dr. Vicente Base de Dados II É através da cláusula GROUP BY que dividimos as linhas de uma tabela em grupo menores. Em seguida, poderá ser aplicado a esses grupos formados as funções de grupo, gerando assim informações sumárias para cada grupo. Primeiramente deve ser determinada a identificação do grupo. A identificação do grupo pode ser uma coluna, várias colunas, uma expressão usando colunas ou várias expressões usando colunas. O Oracle considerará no grupo todas as linhas que atenderem a cláusula WHERE caso esta exista, e então será aplicada a função de grupo ao grupo caso exista. Diretrizes para Joins: Usando a cláusula WHERE, linhas serão eliminadas antes de serem organizadas em grupo. Não é permitido o uso de alias na cláusula GROUP BY . Quando se deseja um campo esteja no retorno do SQL este deverá estar na cláusula GROUP BY. É possível criar agrupamentos de mais de um campo. Funções de grupo não devem ser utilizadas na cláusula WHERE e sim na cláusula HAVING. 85 CC-FCUAN - 2010 Dr. Vicente Base de Dados II Para se excluir um grupo inteiro criado pela cláusula GROUP BY, deveremos usar a cláusula HAVING, que executa um trabalho parecido com a cláusula WHERE que elimina as linhas, este, no entanto, elimina grupos. 86 CC-FCUAN - 2010 Dr. Vicente Base de Dados II Subconsultas Uma subconsulta é uma instrução SELECT incorporada a outra instrução SELECT. O uso de subconsultas torna possível a construção de sofisticadas instruções e são úteis quando precisamos selecionar linhas de uma tabela com uma condição que dependa dos dados na própria tabela. Também podem ser chamadas de subqueries ou consulta interna. 87 CC-FCUAN - 2010 Dr. Vicente Base de Dados II 88 CC-FCUAN - 2010 Dr. Vicente Base de Dados II Operador IN Operador ANY Operador ALL 89 CC-FCUAN - 2010 Dr. Vicente Base de Dados II Manipulando dados (DML) INSERT 90 CC-FCUAN - 2010 Dr. Vicente Base de Dados II A instrução INSERT serve para adicionar linhas em uma determinada tabela. Como você pode observar a lista de campos da tabela não é obrigatória, no entanto, se você optar por supri-la deverá ter em mente a sua estrutura da tabela, pois deverá fornecê-los na mesma ordem. 91 CC-FCUAN - 2010 Dr. Vicente Base de Dados II UPDATE 92 CC-FCUAN - 2010 Dr. Vicente Base de Dados II A instrução UPDATE altera valores de campos de uma tabela, de acordo com uma condição fornecida, se esta condição for suprida, toda a tabela será actualizada. As regras que governam a restrição de linhas nas consultas são também aplicáveis nas instruções UPDATE 93 CC-FCUAN - 2010 Dr. Vicente Base de Dados II DELETE 94 CC-FCUAN - 2010 Dr. Vicente Base de Dados II A instrução DELETE exclui um ou mais registros de acordo com a condição fornecida, similarmente ao UPDATE se esta condição for suprida todos os dados de sua tabela serão apagados!!!. As regras que governam a restrição de linhas nas consultas são também aplicáveis nas instruções DELETE 95 CC-FCUAN - 2010 Dr. Vicente Base de Dados II Controle de transação O conjunto de inserções, alterações e exclusões efetivadas pelas instruções SQL pertencentes a uma transação pode ser confirmadas (COMMIT) ou desconsideradas (ROLLBACK). Uma transação se inicia com o primeiro comando DML executado. A transação termina quando é confirmada ou desconsiderada. 96 CC-FCUAN - 2010 Dr. Vicente Base de Dados II savepoint 97 CC-FCUAN - 2010 Dr. Vicente Base de Dados II • Estudo de Caso: Supermercado Simples • SQL Básico: DDL e DML • Comandos Especiais 98 CC-FCUAN - 2010 Dr. Vicente Base de Dados II Supermercado Cod_Pessoa (PK) Nome Endereco Fone Tipo Cod_Pessoa (PK e FK) Cod_Cargo (FK) Salario Cod_Venda (PK e FK) Cod_Prod (FK) Qtd Sub_Total Pessoa Funcionario Cod_Cargo (PK) Descricao Cargo Cod_Produto (PK) Descricao Preco Produto Cod_Venda (PK) Cod_Cliente (FK) Data Total Venda VendaxProd Cod_Pessoa(PK e FK) Pontos Cliente 99 CC-FCUAN - 2010 Dr. Vicente Base de Dados II DDL (Data Definition Language) • Comando Create Create Table <nome> ( <campo> <tipo>(<tamanho>) [NOT NULL], ... [CONSTRAINT "PK_<tableName>“] primary key (<campo1>,[<campo2>,...,<campon>]), [CONSTRAINT “FK_<tableName>“][foreign key] (<campo>) REFERENCES <table>(campo) ); 100 CC-FCUAN - 2010 Dr. Vicente Base de Dados II DDL • Exemplo: Create table pessoa ( cod_pessoa number(5) NOT NULL, nome varchar2(150) NOT NULL, endereco varchar2(150) , fone varchar2(11) , tipo char(1) NOT NULL, CONSTRAINT “PK_PESSOA” primary key (cod_pessoa) ); 101 CC-FCUAN - 2010 Dr. Vicente Base de Dados II DDL • Exemplo: Create table funcionario ( cod_pessoa number(5) NOT NULL, cod_cargo number(5) NOT NULL, salario number(5,2) , CONSTRAINT “PK_FUNC” primary key (cod_pessoa), CONSTRAINT “FK_PESSOA” foreign key (cod_pessoa) references pessoa(cod_pessoa), CONSTRAINT “FK_CARGO” foreign key (cod_cargo) references cargo(cod_cargo) ); 102 CC-FCUAN - 2010 Dr. Vicente Base de Dados II DDL • Comando Alter – Modificando uma coluna Alter Table <nome> MODIFY ( <campo> <tipo>(<tamanho>) [NOT NULL] ); • Ex: Alter Table pessoa MODIFY ( nome varchar2(200) NOT NULL ); 103 CC-FCUAN - 2010 Dr. Vicente Base de Dados II DDL • Comando Alter – Adicionando uma coluna Alter table <nome> add ( <campo> <tipo>(<tamanho>) [NOT NULL] ); • Ex: Alter table funcionario add ( data date NOT NULL ); 104 CC-FCUAN - 2010 Dr. Vicente Base de Dados II DDL • Comando Alter – Eliminando uma coluna Alter Table <nome> DROP ( <campo> ); • Ex: Alter Table funcionario DROP ( data ); 105 CC-FCUAN - 2010 Dr. Vicente Base de Dados II DDL • Comando Drop – Excluindo uma tabela DROP TABLE [<esquema>.]<tabela> [CASCADE CONSTRAINTS]; • Ex: DROP TABLE pessoa [CASCADE CONSTRAINTS]; 106 CC-FCUAN - 2010 Dr. Vicente Base de Dados II DDL • Visões – Tabelas virtuais que não ocupam espaço físico – create view <nome> [<atributos>] as select <consultas> /*Criar uma visão dos funcionários que ganham mais de 1000 USD */ Create view func_1000 as select * from funcionario where salario > 1000 107 CC-FCUAN - 2010 Dr. Vicente Base de Dados II DML (Data Manipulation Language) • Comando Insert Insert into [<esquema.>]<tabela> [(campo1,...,campon)] values (valor1,...,valorn); Ex.: Insert into cargo (cod_cargo,descricao) values (1,‟Caixa‟); Insert into pessoa (cod_pessoa,nome,endereco,fone,tipo) values (1,‟Bruno‟,‟meu_endereco‟,‟99999999‟,‟F‟); Insert into funcionario (cod_pessoa,cod_cargo,salario) values (1,1,‟250.33‟); 108 CC-FCUAN - 2010 Dr. Vicente Base de Dados II DML • Comando Update update [<esquema.>]<tabela> set campo1 = valor1,...,campon = valorn WHERE condição Ex.: Update pessoa set endereco = „novo_endereco‟, fone = null where cod_pessoa = 1; Update funcionario set salario = „650.60‟ where cod_pessoa = 1 109 CC-FCUAN - 2010 Dr. Vicente Base de Dados II DML • Comando Delete Delete from [<esquema.>]<tabela> WHERE condição Ex.: Delete from funcionario where cod_pessoa = 1; Delete from pessoa where cod_pessoa = 1; 110 CC-FCUAN - 2010 Dr. Vicente Base de Dados II DML • Comando Select Select {* | <campo1,...,campon>} from <tabela> [where condição] Ex.: /* Listando todos os atributos de todas as pessoas */ Select * from pessoa; /* Listando nome e endereco de todas as pessoas */ Select nome,endereco from pessoa; /* Listando nome e cargo de todos os funcionários */ Select pessoa.nome, cargo.descricao from pessoa, cargo, funcionario where pessoa.cod_pessoa = funcionario.cod_pessoa and funcionario.cod_cargo=cargo.cod_cargo; 111 CC-FCUAN - 2010 Dr. Vicente Base de Dados II DML • Comando Select – Consultas encadeadas /* Listar o cliente que possui mais pontos*/ Select pessoa.nome from pessoa, cliente where cliente.pontos = (select MAX(cliente.pontos) from cliente) and pessoa.cod_pessoa = cliente.cod_pessoa; 112 CC-FCUAN - 2010 Dr. Vicente Base de Dados II DML • Comando Select – Cláusula Distinct /* Listando todos os cargos que possuem ao menos um funcionário*/ Select distinct cargo.descricao from funcionario, cargo where funcionario.cod_cargo = cargo.cod_cargo; 113 CC-FCUAN - 2010 Dr. Vicente Base de Dados II Comandos Especiais • DESCRIBE: Exibe a estrutura de uma tabela. Ex.: DESC <tabela>; • COMMIT: Grava uma transação no banco de dados. Ex.: COMMIT; • ROLLBACK: Recupera o banco de dados para a última posição que estava após o último comando commit ser executado. Ex.: ROLLBACK; 114 CC-FCUAN - 2010 Dr. Vicente Base de Dados II Exercícios Propostos • Terminar a criação do restante das tabelas • Selecionar o cliente que mais gastou ontem • Selecionar o cargo e o salário do funcionário que recebe menos • Selecionar quantos clientes com mais de 200 pontos gastaram no supermercado, hoje, mais de 500 USD • Listando os cargos e a quantidade de funcionários em cada cargo agrupados por cargo • Listando os cargos e a quantidade de funcionários em cada cargo agrupados por cargo, porém só para aqueles cargos que possuem mais de dois funcionários atrelados a ele. • Listando o nome dos clientes em ordem alfabética • Listando os salários em ordem decrescente. • Mostrar o valor do maior salário dos funcionários • Mostrar qual o a média de pontos dos clientes. • Mostrar quantos clientes possuem mais de 1000 pontos 115 CC-FCUAN - 2010 Dr. Vicente Base de Dados II • Terminar a criação do restante das tabelas • Selecionar o cliente que mais gastou ontem • Selecionar o cargo e o salário do funcionário que recebe menos • Selecionar quantos clientes com mais de 200 pontos gastaram no supermercado, hoje, mais de 500 USD • Listando os cargos e a quantidade de funcionários em cada cargo agrupados por cargo • Listando os cargos e a quantidade de funcionários em cada cargo agrupados por cargo, porém só para aqueles cargos que possuem mais de dois funcionários atrelados a ele. • Listando o nome dos clientes em ordem alfabética • Listando os salários em ordem decrescente. • Mostrar o valor do maior salário dos funcionários • Mostrar qual o a média de pontos dos clientes. • Mostrar quantos clientes possuem mais de 1000 pontos Cod_Pessoa (PK) Nome Endereco Fone Tipo Cod_Pessoa (PK e FK) Cod_Cargo (FK) Salario Cod_Venda (PK e FK) Cod_Prod (FK) Qtd Sub_Total Pessoa Funcionario Cod_Cargo (PK) DescricaoCargo Cod_Produto (PK) Descricao Preco Produto Cod_Venda (PK) Cod_Cliente (FK) Data Total Venda VendaxProd Cod_Pessoa (PK e FK) Pontos Cliente 116 CC-FCUAN - 2010 Dr. Vicente Base de Dados II PL/SQL DECLARE -- declarações BEGIN -- instruções END; 117 CC-FCUAN - 2010 Dr. Vicente Base de Dados II Programar em Oracle Com PL/SQL Procedural Language Extension to SQL 118 CC-FCUAN - 2010 Dr. Vicente Base de Dados II PL/SQL(Procedural Language/SQL) é a linguagem procedural desenvolvida pela Oracle que é utilizada para montar os blocos PL/SQL. Um bloco PL/SQL consiste de um conjunto de instruções SQL (SELECT, INSERT, UPDATE, DELETE) ou comandos PL/SQL, e desempenha uma função lógica única, afim de resolver um problema específico ou executar um conjunto de tarefas afins. O Bloco PL/SQL também pode ser referenciado com Unidade de Programa PL/SQL Os blocos PL/SQL são qualificados em bloco anônimo e Stored Procedure 119 CC-FCUAN - 2010 Dr. Vicente Base de Dados II O bloco anônimo • Não tem nome • Não está armazenado no SGDB • Geralmente está armazenada na aplicação. Stored SubProgramas • Utiliza a estrutura do bloco anônimo com base. • Estão armazenados no SGDB, • A eles é atribuído um nome que poderá ser utilizado nas aplicações ou por outros objetos do banco de dados blocos PL/SQL 120 CC-FCUAN - 2010 Dr. Vicente Base de Dados II A estrutura de um bloco PL/SQL é constituida de três seções: a) SEÇÃO DE DECLAÇÃO (DECLARE) - Nesta seção são definidos os objetos PL/SQL como variáveis, constantes, cursores e exceções definidas pelo usuário que poderão ser utilizadas dentro do bloco. b) SEÇÃO DE EXECUÇÕES (BEGIN..END;) - Nesta seção contemplará a sequência de comandos PL/SQL e instruções SQL do bloco. c) SEÇÃO DE TRATAMENTO DE ERRO (EXCEPTION) - Nesta seção serão tratados os erros definidos e levantados pelo próprio bloco e os erros gerados pela execução do bloco . estrutura de um bloco PL/SQL 121 CC-FCUAN - 2010 Dr. Vicente Base de Dados II DECLARE -- declarações BEGIN -- instruções e comnados EXCEPTION -- tratamentos de erro END; 122 CC-FCUAN - 2010 Dr. Vicente Base de Dados II Diretrizes: • Apenas a secção de execução é obrigatória. • As palavras chaves, DECLARE, BEGIN, EXCEOPTION não são seguidas por ponto-evírgula, mas END e todas as outras instruções PL/SQL requerem ponto-e-vírgula. • Não existe bloco sem algum comando válido. • Pode existir aninhamento de bloco, no entanto, esta funcionalidade é restrita à secção de Execução e à SeCção de Tratamento de Erro. • As lnhas da seção de execução devem ser finalizadas com ; (ponto-e-vígula) 123 CC-FCUAN - 2010 Dr. Vicente Base de Dados II Os comentários em PL/SQL são de dois tipos a) Uma Linha: utiliza-se o delimitador --. A partir de dois hífens tudo o que for escrito até o final da linha é considerado comentário. b) Múltiplas linhas: utiliza-se o delimitador /* para abrir e */ para fechar. Tudo e todas as linhas que estiverem entre os dois delimitadores serão ignorados na execuçãor. Comentários 1 BEGIN 2 -- comentando apenas uma linha 3 COMANDO1; 4 /* comentando 5 várias 6 linhas */ 7 COMANDO2; 8 COMANDO3; -- o resto será ignorado 9 END; 10 / 124 CC-FCUAN - 2010 Dr. Vicente Base de Dados II Para utilizar variáveis e constantes no seu programa, você deve declará-las anteriormente. É na seção DECLARE que são declaradas as variáveis e constantes. Declarações (seção de declaração) DECLARE nVIVenda NUMBER(16,2); cNmVendedor VARCHAR2(40); dDtVenda DATE:=SYSDATE; mMultiplic CONSTANT NUMBER:=100; --constante BEGIN 7 NULL; END; / 125 CC-FCUAN - 2010 Dr. Vicente Base de Dados II Tipos de dados 126 CC-FCUAN - 2010 Dr. Vicente Base de Dados II Tipos de dados e declaração de variáveis 127 CC-FCUAN - 2010 Dr. Vicente Base de Dados II O comando %TYPE dá-nos a possibilidade de associarmos ao tipo de uma variável o tipo de uma coluna de uma tabela, desta forma, automaticamente a variável assumirá o tipo de dado da coluna. O comando %ROWTYPE criará uma estrutura de registro idêntica à estrutura de uma tabela. Tipos de dados e declaração de variáveis DECLARE Nome_variável nome_tabela.nome_coluna%TYPE; -- variável Nome_registro nome_tabela%ROWTYPE; -- registro BEGIN -- instruções e comnados END; 128 CC-FCUAN - 2010 Dr. Vicente Base de Dados II %TYPE e %ROWTYPE facilitam a manutenção do código 129 CC-FCUAN - 2010 Dr. Vicente Base de Dados II Na programação PL/SQL não existe nenhuma funcionalidade de entrada ou saída. Para remediar isso, usaremos no aplicativo SQL*Plus o Supplied Package DBMS_OUTPUT que fornecerá apenas a capacidade de dar saídas para mensagens na tela. Isso é feito por meio de dois passos: I/O - Pacote DBMS_OUTPUT 1.Permitir a saída no SQL*Plus com o comando set serveroutput SET SERVEROUTPUT {ON | OFF} 2.Dentro do programa PL/SQL, utilize o procedure DBMS_OUTPUT.PUT_LINE. Essa procedure adicionará o argumento informado ao buffer de saída. 130 CC-FCUAN - 2010 Dr. Vicente Base de Dados II Com esses passos completos, a saída é impressa na tela do SQL*Plus depois do bloco ser completamente executado. Durante a execução, o buffer é preenchido pelas chamadas de DBMS_OUTPUT.PUT_LINE. O SQL*Plus não recupera o conteúdo do buffer e não o imprime até que o controle retorne para o SQL*Plus, depois que o bloco terminou a execução. SQL> SET SERVEROUTPUT ON SQL> BEGIN 2 DBMS_OUTPUT.PUT_LINE(‘Olá mundo PL/SQL’); 3 END; 4 / Olá mundo PL/SQL PL/SQL procedure successfully completed. SQL> 131 CC-FCUAN - 2010 Dr. Vicente Base de Dados II Assinalar Valores Pode-se assinalar valores a uma variável de duas formas. A primeira forma utiliza o operador := (sinal de dois pontos seguido do sinal de igual). Assim a variável posicionada à esquerda do operador receberá o valor da expressão posicionada à direita. 1 DECLARE 2 nSalario NUMBER; 3 nSalarioAtual NUMBER; 4 aRegionName regions.region_name%TYPE; 5 dHoje DATE; 6 nAnoBi BOOLEAN:=TRUE; 7 BEGIN 8 nSalario := 400; 9 nSalarioAtual := F_SALARY(103) * 0.10; 10 aRegionName := 'ASIA'; 11 dHoje := SYSDATE; 12 END; 13 / 132 CC-FCUAN - 2010 Dr. Vicente Base de Dados II A Segunda forma de assinalar valor a uma variável é através de um resultado de SELECT que será transferido assinalado à variável. Um SELECT que assinala valor a uma variável obrigatoriamente deverá retornar uma e somente uma linha, caso contrário, um erro de execução será disparado, NO_DATA_FOUND se não for retornada nenhuma linha e TOO_MANY_ROWS se mais de uma linha for retornada Assinalar Valores 133 CC-FCUAN - 2010 Dr. Vicente Base de Dados II 1 DECLARE 2 bonus10 NUMBER; 3 bonus20 NUMBER; 4 emp_id NUMBER:=206; 5 BEGIN 6 SELECT salary * 0.10 7 INTO bonus10 8 FROM employees 9 WHERE employee_id = emp_id; 10 11 SELECT salary * 0.10, salary * 0.20 12 INTO bonus10, bonus20 13 FROM employees 14 WHERE employee_id =emp_id; 15 16 DBMS_OUTPUT.PUT_LINE('SALARIO COM 10% DE BONUS :'|| bonus10); 17 DBMS_OUTPUT.PUT_LINE('SALARIO COM 20% DE BONUS :'|| bonus20); 18 END; 19 / 134 CC-FCUAN - 2010 Dr. Vicente Base de Dados II Controle de Fluxo Este conjunto de comandos permite testar uma condição e, dependendo se a condição é falsa ou verdadeira, será tomada uma determinada direção de fluxo. O controle de fluco se dá em três formas: IF-THEN, IF-THEN-ELSE,IF-THEN-ELSIF. 135 CC-FCUAN - 2010 Dr. Vicente Base de Dados II 1 DECLARE 2 v_first_name employees.first_name%TYPE; 3 v_salary employees.salary%TYPE; 4 BEGIN 5 SELECT first_name, salary 6 INTO v_first_name, v_salary 7 FROM employees 8 WHERE employee_id = 142; 9 10 IF v_salary > 3000 THEN 11 DBMS_OUTPUT.put_line ('Salario acima de U$D 3,000'); 12 DBMS_OUTPUT.put_line ('Teste IF-THEN'); 13 END IF; 14 END; 15 / IF-THEN É a forma mais simples. Testa a condição especificada após o IF e, caso seja verdadeira, executa o comando além do THEN. Caso não seja, executa as acções após o END IF (note que devem ser escritos separados). 136 CC-FCUAN - 2010 Dr. Vicente Base de Dados II IF-THEN-ELSE Aqui, acrescenta-se a palavra-chave ELSE para determinar o que deve ser feito caso a condição seja falsa. Dessa forma, o fluxo seguirá para os comandos após o THEN caso a condição seja verdadeira, e após o ELSE caso seja falsa. 137 CC-FCUAN - 2010 Dr. Vicente Base de Dados II 1 DECLARE 2 v_first_name employees.first_name%TYPE; 3 v_commission_pct employees.commission_pct%TYPE; 4 BEGIN 5 SELECT first_name, commission_pct 6 INTO v_first_name, v_commission_pct 7 FROM employees 8 WHERE employee_id = 174; 9 10 IF v_commission_pct IS NULL THEN 11 DBMS_OUTPUT.put_line ('Sem comissão'); 12 DBMS_OUTPUT.put_line ('outra acção'); 13 ELSE 14 DBMS_OUTPUT.put_line('Comissão de '||v_commission_pct*100||'%'); 15 DBMS_OUTPUT.put_line(' outra acção '); 16 END IF; 17 END; 18 / IF-THEN-ELSE 138 CC-FCUAN - 2010 Dr. Vicente Base de Dados II IF-THEN-ELSIF Quando se deseja testar diversas condições utilizando um mesmo IF, utilizase ELSIF. Assim, pode-se após cada ELSIF, testar nova condição que, caso seja verdadeira, executará as respectivas acções 1 DECLARE 2 Vencimentos NUMBER; 3 BEGIN 4 vencimentos := F_SALARY(101); -- deduções 5 IF vencimentos <= 10000 THEN 6 DBMS_OUTPUT.PUT_LINE ('Primeira faixa'); 7 ELSIF vencimentos > 10000 AND vencimentos <= 15000 THEN 8 DBMS_OUTPUT.PUT_LINE ('Segunda faixa'); 9 ELSIF vencimentos > 15000 AND vencimentos <= 20000 THEN 10 DBMS_OUTPUT.PUT_LINE ('Terceira faixa'); 11 ELSE 12 DBMS_OUTPUT.PUT_LINE('Ultima faixa'); 13 END IF; 14 END; 15 / IF (está_na_hora) THEN soa_alarme; END IF; _________________________________ IF (está_na_hora) THEN soa_alarme; ELSE está_atento; END IF; _________________________________ IF (hora > 20) THEN cumprimento := ‘Boa noite’; ELSIF (hora > 12) THEN cumprimento := ‘Boa tarde’; ELSE cumprimento := ‘Bom dia’; END IF; 139 CC-FCUAN - 2010 Dr. Vicente Base de Dados II Outros exemplos Mesmo utilizando diversos ELSIF’s pode-se acrescentar um ELSE no final para o caso de nenhuma das condições anteriores serem satisfeitas. Mais uma vez, somente após o END IF e a cada linha de ação é que se deve colocar o ponto-e-vírgula. 140 CC-FCUAN - 2010 Dr. Vicente Base de Dados II O LOOP permite que você realize repetições de determinadas ações. Na programação PL/SQL encontramos 3(três) tipo: LOOP Simples, WHILE-LOOP, FOR-LOOP. Controle de Repetição 141 CC-FCUAN - 2010 Dr. Vicente Base de Dados II LOOP Simples Com este comando você pode realizar repetições de uma seqüência de comandos. O comando LOOP indica o inicio da área de repetição, enquanto que o END LOOP indica que o fluxo deve retornar do LOOP. 1 BEGIN 2 LOOP 3 DBMS_OUTPUT.PUT_LINE ('Primeira ação do laço'); 4 DBMS_OUTPUT.PUT_LINE ('Segunca ação do laço'); 5 END LOOP; 6 END; 7 / Neste exemplo, como não está definida nenhuma condição de paragem do laço, você já deve ter concluído que este LOOP não terá fim. Logo, para resolver este problema é necessário utilizar o comando EXIT ou EXIT WHEN. O EXIT causa uma saída incondicional do LOOP, e o EXIT WHEN permite testar uma condição e, apenas se ela for verdadeira, provocará a saida do LOOP. 142 CC-FCUAN - 2010 Dr. Vicente Base de Dados II 1 DECLARE 2 x NUMBER; 3 BEGIN 4 X := 1; 5 LOOP 6 DBMS_OUTPUT.PUT_LINE('O valor de x eh '||X); 7 X := X + 1; 8 EXIT WHEN X>=5; 9 END LOOP; 10 END; 11 / EXIT ou EXIT WHEN 143 CC-FCUAN - 2010 Dr. Vicente Base de Dados II WHILE-LOOP Este comando permite testar uma condição antes de iniciar a seqüência de acções de repetição. Ao final de LOOP, é testada a condição novamente e, caso verdadeira, continua a seqüência de acções dentro do LOOP ou sai, caso seja falsa, executando o que estiver após o END LOOP. 1 DECLARE 2 x NUMBER; 3 BEGIN 4 X := 1; 5 WHILE X < 5 LOOP 6 X := X + 1; 7 END LOOP; 8 END; 9 / 144 CC-FCUAN - 2010 Dr. Vicente Base de Dados II FOR - LOOP Utilize este comando sempre que você souber preveamente o número de vezes que um LOOP deve ser executado. A cada comando FOR-LOOP existe uma variável controladora que em cada interação assumirá todos os valores interiros (variando de 1 em 1) contidos entre o limite inicial e o limite final. FOR contador IN [REVERSE] inicio.. Fim LOOP comando1; comando2; END LOOP; contador Variável que terá seu valor incrementado. [REVERSE] Indica que se deve diminuir ao invés de aumentar o contador. O valor de inicio deve ser maior que o fim, pois o valor será decrescido a cada repetição inicio intervalo inicial de repetição Fim intervalor final da repetição 145 CC-FCUAN - 2010 Dr. Vicente Base de Dados II 1 DECLARE 2 Y NUMBER := 1; 3 BEGIN 4 FOR X IN 1..5 LOOP 5 Y := Y + X ; 6 DBMS_OUTPUT.PUT_LINE (x); 7 END LOOP; 8 END; 9 / FOR - LOOP Não necessidade de declarar a variável controladora, isso é feito implicitamente pelo comando FOR-LOOP. Podemos utilizar a variável controladora como uma variável normal, no entanto, não podemos assinalar valores à variável controladora. O escopo de visibilidade na variável controladora é apenas dentro do laço. Caso o número de vezes que deva ser repetida a seqüência de ações seja fruto de um cálculo, você poderá substituir tanto o intervalo superior quanto o superior por variáveis, mas não se esqueça que esses valores devem ser sempre números inteiros. FOR … IN … LOOP … END LOOP FOR X IN 1 .. 2 LOOP NULL; END LOOP; X é so visível dentro do ciclo For 146 CC-FCUAN - 2010 Dr. Vicente Base de Dados II Se o salário de um funcionário for menor do que U$D 500, ele deverá ter um aumento de 10% Cod_Pessoa (PK) Nome Endereco Fone Tipo Cod_Pessoa (PK e FK) Cod_Cargo (FK) Salario Cod_Venda (PK e FK) Cod_Prod (FK) Qtd Sub_Total Pessoa Funcionario Cod_Cargo (PK) Descricao Cargo Cod_Produto(PK) Descricao Preco Produto Cod_Venda (PK) Cod_Cliente (FK) Data Total Venda VendaxProd Cod_Pessoa (PK e FK) Pontos Cliente Exercício 147 CC-FCUAN - 2010 Dr. Vicente Base de Dados II DECLARE salfuncionario.salario%type; BEGIN select salario into sal from funcionario where cod_pessoa = 1 FOR UPDATE OF salario; IF sal < 500 THEN sal := sal * 1.1; update funcionario set salario = sal where od_pessoa = 1; END IF; COMMIT; END; 148 CC-FCUAN - 2010 Dr. Vicente joaovicentelopes@hotmail.com Base de Dados II Curso: Ciências de Computação Base de Dados II
Compartilhar