Você está na página 1de 194

UNIVERSIDADE METODISTA DE ANGOLA

FACULDADE DE ENGENHARIA
1

Administração de Base de Dados

3O ano Engenharia Informática 2015

Prof: Msc. Hugo Dias Dos Santos

Prof: Msc. Hugo Dias Dos Santos


Programa
2

Capítulo I: . Apresentação e Consolidação e revisão


de conceptual
Capítulo 2. DDL (Data Definition Language)
 2.1 - Criação e exclusão de bancos, esquemas, tabelas, views,
Constraints, etc
 2.2 - Alterações nos objetos dos bancos
 2.3 - Índices, Tipos de Dados e Integridade Referencial
Capítulo 3 - DML (Data Manipulation Language) .
 3.1 - Consultas (select,insert, update e delete)
 3.2 - Consultas JOIN
 3.3 - Sub Consultas
Capítulo 4 - Funções Internas
Prof: Msc. Hugo Dias Dos Santos
Programa
3

 4.1 – Strings
 4.2 – Matemáticas
 4.3 - Agrupamento (Agregação)
 4.4 - Data/Hora
 4.5 - Formatação de Tipos de Dados
 4.6 - Conversão de Tipos (CAST)
 Capítulo 5 - Funções Definidas pelo Usuário e Triggers
 5.1 - SQL
 5.2 - PlpgSQL
 5.3 – Triggers 
 Capítulo 6 - DCL (Data Control Language) - Administração
  6.1 - Administração de usuários, grupos e privilégios

Prof: Msc. Hugo Dias Dos Santos


Programa
4

 Capítulo  7- Controlo de Concorrencia


 7.1- Transações
  7.2- Comportamentos Indesejáveis nas Transacções
 7.3- Isolamento
 7.4- Bloqueio (Locks)
 7.5- Seriabilidade e Recuperabilidade
 Capítulo 8 – Administração
 8.1 - Backup e Restore
  8.2 - Importar e Exportar
  8.3 - Converter
  8.4 - Otimização e Desempenho
  Capítulo 9 - Replicação

Prof: Msc. Hugo Dias Dos Santos


Objetivos Administração de Base de Dados

1 Adquirir conhecimentos avançados sobre bases de dados,

2 Conhecer as tecnologias envolvidas e modelos de BD

Fornecer as competências necessárias para


3
Plano a análise critica de aplicações de BD

4 Fornecer as competências necessárias para o


desenvolvimento eficaz de novas BDs

Utilizar diferentes softwares para a dministração de


5 base de dados

6 Ganhar conhecimentos avançados na linguagem SQL

Prof: Santos
Prof: Msc. Hugo Dias Dos Santos 5
Modelo Entidade Relacionamento
1.Revisão de conceitos Gerais do MER
6

Dados: Valor de um campo armazenado ou


matéria-prima para obtenção de informação.
Informação: Dados obtidos após compilação e
processamento de acordo com a solicitação de
consultas e análises.
 Bancos de dados ou bases de dados: são
coleções organizadas de dados que se relacionam de
forma a criar algum sentido ou informação e dar
mais eficiência durante uma pesquisa ou estudo.

Prof: Msc. Hugo Dias Dos Santos


Modelo Entidade Relacionamento
1.Revisão de conceitos
7

Um Sistema Gerenciador de Base de Dados


(SGBD) ou DBMS: é uma coleção de programas que
permitem aos usuários criarem e manipularem uma base
de dados. Um SGBD é, assim, um sistema de software
(programa) que facilita o processo de definir, construir
e manipular bases de dados de diversas aplicações.
Abstração: processo mental pelo qual selecionamos
determinadas propriedades ou caracteristicas de um
objecto, sistemas ou tema e excluimos outras,
consideradas menos relevantes para o problema que esta
sendo analisado.

Prof: Msc. Hugo Dias Dos Santos


Modelo Entidade Relacionamento
1.Revisão de conceitos
8

Modelo: é uma abstração /representação simplificada


de uma parcela do mundo real composta por objectos.
Modelagem: Actividade atravez da qual se cria um
modelo
Modelo de Dados: é uma descrição das informações
que devem ser armazenadas em uma BD, ou seja, é a
definição formal da estrutura da base de dados.
Estrutura da BD: é a descrição dos dados, dos
relacionamentos entre os dados, da semântica e das
restrições impostas aos dados.

Prof: Msc. Hugo Dias Dos Santos


Exemplos de Modelos
9

No Modelo Cnceitual:


 Modelo Entidade Relacionamento,
 Modelos Orientados a Objectos,
 Modelo de Semântica de Dados,
 Modelo Infológico.
Modelo Lógico:
 Modelo Relacional,
 Modelo Hierárquico,
 Modelo em Rede.
Modelo Físico:
 Modelo de Dados

Prof: Msc. Hugo Dias Dos Santos


Fases de um projecto de construção de BD
10

1 construir o modelo Cenceitual:


 Etapa de alto nível,
 Modelo de alto nível,
 Independente da implementação,
 Uso de uma tecnica de modelagem de dados,
 Abstração do ambiente hardware/software.
1 construir o modelo Lógico:
 Etapa de normalização dos Dados,
 Modelo implementável, dependente do tipo de SGBD a ser usado,
 Considera as necessidades de processamento
 Considera as carecteristicas e restrições do SGBD
1 construir o modelo Físico:
 Modelo implementável, com metodos de acesso a estrutura física,

 Considera as necessidades de desempenho

 Considera as carecteristicas e restrições do SGBD


Prof: Msc. Hugo Dias Dos Santos
Modelo Entidade Relacionamento
1.Revisão de conceitos
11

Entidade: Conjunto de objectos da realidade


modelada sobre os quais deseja-se manter
informações na BD. Estes objectos podem ser
concretos (pessoa, viatura,) ou abstratos (programas,
disciplinas, profissões).
Relação: é toda associação entre as entidades sobre
as quais deseja-se manter informação na BD.
Cardinalidade: é o numero de instâncias de uma
determinada entidade que podem ser associadas a
uma intância de uma outra entidade.

Prof: Msc. Hugo Dias Dos Santos


Modelo Entidade Relacionamento
1.Revisão de conceitos(Atributo)
12

Atributo: é um dado que é associado a cada ocorrência de uma


entidade ou relacionamentos.
Domínio: é o conjunto de valores válidos que um atributo pode
assumir.
Tipos de Atributo:
 Opcional: O atributo pode ter o valor nulo. Ex: numero de telefone.
 Mandatório: O atributo deve possuir um valor válido não nulo. Ex: Nome do cliente
 Monovalorado: O atributo assume um unico valor dentro do domínio. Ex: Data
de Nascimento
 Multivalorado: O atributo pode ter um numero qualquer de valores dentro do
dominio. Ex : contactos
 Atómico: O atributo não pode ser decomposto em outros atributos. Ex: idade.
 Composto: é composto por mais de um atributo. Ex Endereço

Prof: Msc. Hugo Dias Dos Santos


Modelo Entidade Relacionamento
1.Revisão de conceitos(Atributo)
13

Identificador de entidades: é o atributo ou conjunto


de atributos que têm a capacidade de identificar
univocamente cada ocorrência de uma entidade.
O identificador deve ser único, monovalorado e
mandatório
Entidade Associativa (Agregação): é um
relacionamento que passa a ser tratado como
entidade devido a existência de um relacionamento
com uma entidade.

Prof: Msc. Hugo Dias Dos Santos


Modelo Relacional
2. Modelo Relacional (Revisão)
14

É um modelo que considera os dados organizados


como um conjunto de relações que representam a
base de dados como uma coleção de tabelas.

Prof: Msc. Hugo Dias Dos Santos


Modelo Relacional
Características do modelo relacional
15

a) cada linha em uma tabela é chamada de tupla;


b) cada coluna em uma tabela é chamada de atributo;
c) a intersecção de uma linha com uma coluna deve conter um valor;
d) no modelo relacional linhas podem estar em qualquer ordem;
e) no modelo relacional colunas podem estar em qualquer ordem;
f) por definição todas as linhas em uma tabela são distintas;
g) a relação precisa possuir uma chave a qual pode ser um conjunto de
atributos;
h) para cada coluna de uma tabela deve existir um conjunto de possíveis
valores chamado de domínio;
j) o grau de uma relação é o numero de atributos (colunas) contidos na
relação;
k) a cardinalidade de uma relação é o número de tuplas (linhas) existentes
na relação.

Prof: Msc. Hugo Dias Dos Santos


Modelo Relacional
Conceitos Básicos M.R
16

Chave Primária (Primary Key): é um atributo ou


combinação de atributos cujo valor destingue cada linha
de uma tabela.
Chave Estrangeira (Foreign Key): é um atributo ou
combinação de atributos cujos valores aparecem
necessáriamente na chave primária de uma outra Tabela.
A chave estrangeira é o mecanismo pelo qual implenta-se
a navegabilidade em um banco de dados relacional.
Chave Candidata: é um atributo que tem a capacidade de
identificar cada linha de uma relação mas que não faz
parte da chave primária.

Prof: Msc. Hugo Dias Dos Santos


Modelo Relacional
Dependência Funcional
17

O Atributo B é funcionalmente dependente do atributo A, se em


qualquer instante um valor em A determina de modo único o valor
correspondente em B na mesma Relação. Ex A=numEmp->B=nomeEmp
Dependência Funcional Total: Um atributo C é funcionalmente
dependente da chave primária composta pelos atributos A e B, se
for funcionalmente dependente de A e B.
Dependência Funcional Parcial: O atributo C é parcialmente
funcionalmente dependente da chave primária composta pelos
atributos A e B, se for funcionalmente dependente de A ou B e não
de Ambos.
Dependência Funcional Transitiva: O atributo C é funcionalmente
dependente Transitivo do atributo A, se C é dependente funcional
de B e B de A na mesma relação.

Prof: Msc. Hugo Dias Dos Santos


Modelo Relacional
Dependência Funcional
18

Solução Para D.F.P


Consiste na criação de uma nova relação que será
composta pelo atributo ou atributos que dependem de
parte da chave e a parte da chave que determine de
modo único cada um destes atributos.
Solução Para D.F.T
Consiste na criação de uma nova relação que será
composta pelo atributo ou atributos que são
dependentes funcionais transitivos tendo como chave
primária o atributo que determina a transitividade.

Prof: Msc. Hugo Dias Dos Santos


Modelo Relacional
Normalização
19

É o processo formal de exame e agrupamento de dados em


uma forma capaz de suportar melhor as mudanças futuras,
minimizando o impacto destas mudanças sobre a base de
dados.
Segundo Edward F. codd é m processo sistemático e
reversível que consiste em substituir um determinado conjunto
de relações por sucessivos conjuntos nos quais as relações
tenham uma estrutura mais simples e regular.
Objectivos
 Reduzir as redundâncias
 Reduzir a inconcistência
 Reduzir a necessidade de reestruturar as relações.

Prof: Msc. Hugo Dias Dos Santos


Modelo Relacional
Formas Normais.
20

1. Primeira FN: Uma relação estará na primeira FN se


não houver atributo representando agrupamento e
nem atributo repetitivo(multivalorado).
2. Segunda FN: Um relação estará na segunda FN se
estiver na primeira forma normal e seus atributos não
chaves forem dependentes total da chave primária.
3. Terceira FN: Um relação estará na terceira FN se e
somente se estiver na segunda FN e seus atributos
não chaves forem dependentes não transitivos da
chave primária.

Prof: Msc. Hugo Dias Dos Santos


Modelo Relacional
Álgebra Relacional
21

É um conjunto de operações que usa uma ou duas


relações como entrada e gera uma relação na saida.

Este conjunto de operações pode ser dividido em 2


grupos.

Operações Matemáticas: Operações de Manipulação


1. União de Dados:
2. Intersecção 1. Restrição
3. Diferença 2. Projeção
4. Produto Cartesiano 3. Junção

Prof: Msc. Hugo Dias Dos Santos


Modelo Relacional
União, interseção e diferença
22

A união entre duas relações R1 e R2 só é possível se


ambas tiverem o mesmo numero de atributos e se estes
atributos forem do mesmo tipo.

Prof: Msc. Hugo Dias Dos Santos


Modelo Relacional
Produto Cartesiano
23

Prof: Msc. Hugo Dias Dos Santos


Modelo Relacional
Restrição
24

A operação de Restrição é usada para selecionar um


subconjunto de tuplas de uma relação as quais
devem satisfazer uma condição de seleção.

Por exemplo, a seleção de um subconjunto de tuplas


da relação EMPREGADOS que trabalham para o
departamento 4 e que tenham salário superior a
3000 se apresenta:

Prof: Msc. Hugo Dias Dos Santos


Restrição
25

 As cláusulas podem ser utilizadas em conjunto com os


operadores lógicos {AND, OR NOT} para formar uma
condição de seleção composta.
 Por exemplo, suponha que se deseja selecionar as tuplas de
todos os empregados que ou trabalham no departamento 4
com salário superior a 2.500,00 ou trabalham no
departamento 5 e ganham mais que 3.000,00. Neste caso,
pode-se especificar a consulta da seguinte forma:

Prof: Msc. Hugo Dias Dos Santos


Modelo Relacional
Projeção
26
 Pensando na relação como uma tabela, o operador de restrição
SELECT seleciona algumas linhas da tabela enquanto descarta
outras.
 O operador de Projeção, por outro lado, seleciona certas colunas
da tabela e descarta outras. Se existir o interesse sobre certos
atributos da relação, pode-se usar o PROJECT para “projetar” a
relação sobre esses atributos.

 Por exemplo, suponha a necessidade de listar, para cada


empregado, os atributos PNOME, SNOME e SALÁRIO; então
pode-se usar o PROJECT como segue:

Prof: Msc. Hugo Dias Dos Santos


Projeção
27

Convém salientar que, caso a lista de atributos não contenha atributos chaves,
então é provável que tuplas duplicadas apareçam no resultado.
A operação de projeção remove implicitamente todas tuplas duplicadas, para que o
resultado da operação seja um conjunto de tuplas e assim, uma relação válida. Por
exemplo, considere a seguinte operação:


  π SEXO, SALÁRIO (EMPREGADO)

Dessa maneira, se duas ou mais tuplas idênticas aparecerem quando aplicada a


operação, apenas uma será mantida no resultado; isto é conhecido como
eliminação de duplicidade e é necessário para assegurar que o resultado da
operação também seja uma relação.

O número de tuplas na relação resultante sempre será igual ou menor que a


quantidade de tuplas na relação original.

Prof: Msc. Hugo Dias Dos Santos


Junção
28

A operação JOIN, denotada por ∞ , é usada para combinar tuplas
relacionadas de relações em uma única tupla. Esta operação é muito
importante para todas bases de dados relacionais, pois permite
processar relacionamentos entre relações.
 Para ilustrar a operação JOIN, suponha que se deseja recuperar os
nomes dos gerentes de cada departamento. Para obter-se o nome dos
gerentes, é necessário combinar cada tupla de departamento com
tuplas de empregados cujo valor NSS seja igual ao valor de NSSGER na
tupla departamento.
 Isto é feito usando a operação JOIN, então projeta-se o resultado sobre
aqueles atributos necessários:

Prof: Msc. Hugo Dias Dos Santos


Junção
29
A forma geral da operação JOIN sobre duas relações R(A 1, A 2, ..., An ) e S(B1 , B2 ,
..., Bm ) é: R ⌧<condição join>S.
 O resultado de JOIN é uma relação Q com n+m atributos Q(A1 , A2 , ..., An , B1 ,
B2, ..., Bm ) .
Nesta ordem; Q tem uma tupla para cada combinação de tuplas (de R e de S) onde
quer que a combinação satisfaça a condição join. Esta é a principal diferença entre
CARTESIAN PRODUCT e JOIN; em JOIN, apenas combinações de tuplas que
satisfazem a condição join é que aparecerá no resultado, já no CARTESIAN
PRODUCT, todas as combinações de tuplas são incluídas no resultado.  
 
É muito comum encontrar JOIN que envolva condições joins com apenas a
comparação de igualdade. Um JOIN, onde apenas o operador de comparação = é
utilizado é chamado EQUIJOIN. Os dois exemplos anteriores eram EQUIJOIN.
Note-se, que no resultado de uma EQUIJOIN sempre terá um ou mais pares de
atributos que tem valores idênticos em todas as tuplas. Devido a esta duplicação ser
desnecessária, uma nova operação chamada NATURAL JOIN foi criada. Denota-
se o join natural por *, que é basicamente um equijoin seguido da remoção de
atributos desnecessários.
Prof: Msc. Hugo Dias Dos Santos
30

Exercícios
de
Aplicação.
Prof: Msc. Hugo Dias Dos Santos
II:SQL,DDL, 31

DML & DQL

Prof: Msc. Hugo Dias Dos Santos


2.1.SQL: Linguagem de Consulta Estruturada
32

Structured Query Language, ou Linguagem de


Consulta Estruturada ou SQL, é uma linguagem de
pesquisa declarativa para banco de dados relacional.
Muitas das características originais do SQL foram inspiradas
na álgebra relacional
Foi desenvolvido originalmente no início dos anos 70 nos
laboratórios da IBM.
Tinha por objetivo demonstrar a viabilidade da
implementação do modelo relacional proposto por Edgar
Codd.
Seu nome original era SEQUEL, acrônimo para
"Structured English Query Language"

Prof: Msc. Hugo Dias Dos Santos


2.SQL: principais características
33

A linguagem SQL é um grande padrão de banco de


dados.
Apesar de ser originalmente criada pela IBM, muitos
desenvolvedores foram criando "dialetos" para ela. Essa
expansão levou à necessidade de ser criado e adaptado
um padrão para a linguagem.
Em 1986/87 a linguagem SQL foi padronizada pela ANSI
e ISO sendo revisada nos anos de 1992, 1999 e 2003.
Normalmente a linguagem pode ser aportada de
plataforma para plataforma sem mudanças significativas
em sua estrutura

Prof: Msc. Hugo Dias Dos Santos


2.SQL: Exemplos de SGBD que utilizam SQL
34

Oracle SyBase
Informix DB2
Ingress MySQL
SQL Server PostgreSQL
Interbase WampServer

Prof: Msc. Hugo Dias Dos Santos


Principais tipos de Dados SQL
35

Os tipos de Dados são os diferentes domínios que


uma coluna de uma tabela pode ter.
Pode ser visto ainda como os diferentes tipos de
atributos que podem ser afectados as colunas de uma
relação.
Os tipos de dados dependem em grande parte dos
SGBD porque são estes que primam sobre certos
tipos de dados em relação a outros

Prof: Msc. Hugo Dias Dos Santos


Principais tipos de Dados SQL
36
Entre os principais tipos de dados
Cadeias de caracteres
podemos citar:
Numéricos exatos Unicode
 bigint  nchar
 numeric
 bit  nvarchar
 smallint
 ntext
 decimal
 smallmoney   
 int Cadeias de caracteres
 tinyint
 Money binárias
 binary
Numéricos aproximados
 float  varbinary
 real  image
Prof: Msc. Hugo Dias Dos Santos
Principais tipos de Dados SQL
37
Data e hora Outros tipos de dados
 Date  cursor
 datetimeoffset  timestamp
 datetime2  hierarchyid
 smalldatetime  uniqueidentifier
 datetime  sql_variant
 time
 xml
Cadeias de caracteres  table
 char  Tipos espaciais
 varchar
 text
 

Prof: Msc. Hugo Dias Dos Santos


Os tipos de Mais Usuais
38

VARCHAR: é um tipo de letras,bastante utilizado para


nomes, ruas, entre outros;
FLOAT ou DOUBLE : Como nome já define, e utilizado
para valores numéricos quando vai se trabalhar com
divisões. Exemplo, peso, altura.
INTEGER: Bastante usando em números inteiros quando
não vai se trabalhar com casas decimais. o tipo Integer é
bastante utilizado em atributos de chave Primaria e
Estrangeiras.
DATETIME: é utilizado em atributos de data e hora!
 

Prof: Msc. Hugo Dias Dos Santos


2.SQL: principais divisões
39

A linguagem SQL é dividida em subconjuntos de acordo


com as operações que se deseja efetuar sobre um banco de
dados. Os principais subconjuntos são:
DDL - Data Definition Language ( Linguagem de
Definição de Dados ). Principais comandos: CREATE,
ALTER e DROP
DML - Data Manipulation Language ( Linguagem de
Manipulação de Dados ) Principais comandos: SELECT,
INSERT, UPDATE, DELETE, TRUNCATE e outros.
DCL - Data Control Language ( Linguagem de Controle
de Dados ) Principais comandos: GRANT, REVOKE e SET.

Prof: Msc. Hugo Dias Dos Santos


DDL: Linguagem de Definição de Dados
40

O conjunto de comandos da linguagem DDL é usado para a


definição das estruturas de dados, fornecendo as instruções que
permitem a criação, modificação e remoção de objetos de banco
de dados (base de dados, tabelas, índices etc.).
A maioria dos bancos de dados comerciais tem extensões
proprietárias no DDL.
Os comandos básicos da DDL são:
■ CREATE: cria um objeto (uma Tabela, por exemplo) dentro
da base de dados.
■ DROP: apaga um objeto do banco de dados.
■ ALTER: permite ao usuário alterar um objeto, por exemplo,
adicionando uma coluna a uma tabela existente.

Prof: Msc. Hugo Dias Dos Santos


DML:Linguagem de Manipulação de Dados
41

É o grupo de comandos dentro da linguagem SQL utilizado para a


recuperação, inclusão, remoção e modificação de informações em
bancos de dados.
Os comandos básicos da DML são:
 SELECT:permite ao usuário especificar uma consulta ("query") como uma
descrição do resultado desejado.
 INSERT é usada para inserir um registro (formalmente uma tupla) a uma tabela
existente.
 UPDATE para mudar os valores de dados em uma ou mais linhas da tabela
existente.
 DELETE permite remover linhas existentes de uma tabela.
 TRUNCATE: remove rapidamente todas as linhas da tabela.
 COMMIT: efetiva a transação atualmente executada.
 ROLLBACK:desfaz a transação corrente, fazendo com que todas as modificações
realizadas pela transação sejam rejeitadas.

Prof: Msc. Hugo Dias Dos Santos


DCL: Linguagem de Controle de Dados
42

É o grupo de comandos que permitem ao administrador de


banco de dados gerenciar os aspectos de autorização de
dados e licenças de usuários para controlar quem tem acesso
para ver ou manipular dados dentro do banco de dados.
Alguns exemplos de comandos DCL são:
 GRANT:concede privilégios a um ou mais usuários para acessar ou
realizar determinadas operações em um objetos de dados.
 REVOKE: revoga (remove) ou restringe a capacidade de um usuário de
executar operações.
 SET: Define parâmetros em tempo de execução, como por exemplo, o
tipo de codificação do cliente e o estilo de representação de data e hora.
 LOCK: Bloqueia explicitamente uma tabela fazendo o controle de
acessos concorrente.

Prof: Msc. Hugo Dias Dos Santos


DDL: Sintaxe Básica
43

Criação de banco de dados


CREATE DATABASE Nome_da_base;
Criação de Tabelas
CREATE TABLE [Nome tabela];
Criação de Vistas
Create VIEW Nome_vista AS SELECT [lista_de_colunas] FROM
nome_tabela;
Criação de Indices
CREATE INDEX nome_indice ON nome_tabela (tipo_index (tamanho));
Eliminar ou deletar
DROP DATABASE [Nome da base];
DROP TABLE [Nome tabela];
DROP VIEW [Nome_vista];
DROP INDEX nome_indice;

Prof: Msc. Hugo Dias Dos Santos


DDL: Sintaxe Básica
44

Modificar ou Alterar;
Tabelas
ALTER TABLE [Nome tabela];
 Vistas
 ALTER VIEW [Nome_vista] AS SELECT [lista_de_colunas]
FROM nome_tabela;

Prof: Msc. Hugo Dias Dos Santos


DML: Sintaxe Básica
45

Inserção:
 INSERT INTO nome_tabela [([col1],[col2],[coli],[coln] )]
VALUES [([val1],[val2],[vali],[valn] )] ;
Seleção:
 SELECT (Lista_de_atributos) FROM (Lista_de_tabelas);
Actualização:
 UPDATE nome_tabela SET coluna=valor WHERE (condição);
Deleção:
 DELETE FROM nome_tabela WHERE (condição);

Prof: Msc. Hugo Dias Dos Santos


Criação de Tabelas
46

Uma tabela define-se pelo seu nome, pelo nome das


suas colunas, pelo tipo de dados que comporta cada
coluna, pelas restrições de colunas e pelas restrições
de tabela.
Na realidade existem ainda outras opções avançadas
que se podem definir nas tabelas, que têm haver com
a forma como o servidor guarda a tabela e as ligações
em disco.

Prof: Msc. Hugo Dias Dos Santos


Criação de Tabelas
47

A seguir às palavras CREATE TABLE declara-se o nome da tabela


a criar. Entre parênteses define-se uma lista de colunas ou
restrições à tabela separadas por vírgulas.
Ao definir-se as colunas determina-se qual o nome da coluna, que
tipo de dados comporta, o tamanho, qual o valor por omissão dos
dados nessa coluna e que restrições se devem verificar sobre os
dados dessa coluna.
As restrições da tabela indicam normalmente restrições sobre
dados de mais do que uma coluna e usam uma sintaxe
ligeiramente diferente porque indicam explicitamente a que
coluna(s) se referem.
As restrições de coluna, por outro lado, indicam implicitamente a
que coluna se referem através da linha em que se localizam.

Prof: Msc. Hugo Dias Dos Santos


Criação de Tabelas
48

Criar uma base de dados com o nome de turma


U106[M,T,N].
CREATE DATABASE U106N;
Em seguida Criar uma tabela, Estudante, com duas
colunas, numero e nome. A primeira coluna é do tipo INT
com até 10 algarismos e a segunda é do tipo varchar
(cadeia de caracteres) com espaço até 50 caracteres por
nome. Não é indicada nenhuma restrição sobre nenhuma
coluna da tabela nem é definida nenhuma chave primária.
 CREATE TABLE Estudante
 (numero INT(10), nome VARCHAR(50) ) ;

Prof: Msc. Hugo Dias Dos Santos


Criação de Tabelas/ Restrição de Chave Primária
49

Restrição de Chave Primária (PRIMARY KEY): Como já visto


nas secções anteriores, a chave primária de uma tabela é a coluna ou
conjunto de colunas que servem para definir univocamente um
registo na tabela. Uma coluna de chave primária não pode conter
valores nulos nem pode conter valores repetidos.
Se quisermos modificar a relação estudante de formas a definir uma
chave primária, podemos proceder como segue:
 CREATE TABLE Estudante
 (numero INT(10) PRIMARY KEY,
 nome VARCHAR(40)) ;

Ou ainda dando um nome na restrição de chave primária (Restrição da coluna)


 CREATE TABLE Estudante

 (numero INT(10) CONSTRAINT pk_numero_estudante PRIMARY KEY,

 nome VARCHAR(40)) ;

Prof: Msc. Hugo Dias Dos Santos


Criação de Tabelas: Restrição de Chave Primária
50

Ou definindo restrição de chave primária a nivel da tabela(Restrição da Tabela)


 CREATE TABLE Estudante

 (numero INT(10),

 nome VARCHAR(40),

 CONSTRAINT pk_numero_estudante PRIMARY KEY(numero)

 );

OBS: antes de criar novamente esta tabela na base u106 deve ser
apagada a tabela criada anteriormente com o mesmo nome.
OBS: poderiamos apenas alterar a tabela com o comando Alter e
a cláusula Modify, mas estes items são tratados em sessões
posteriores.

Prof: Msc. Hugo Dias Dos Santos


Criação de Tabelas/ Chaves Primárias compostas:
51

Chaves Primárias compostas: Quando a chave


primária de uma relação é composta o método
recomendado é definir a restrição ao nível da tabela.
 Exemplo:
 CREATE TABLE Estudante1
 (ano_entrada INT(6),
 num_entr ada INT(4),
 nome VARCHAR(40),
 CONSTRAINTpk_ano_num_estudante PRIMARY
KEY(ano_entrada, num_entrada));

Prof: Msc. Hugo Dias Dos Santos


Criação de Tabelas / Restrição de Unicidade
52

Restrição de Unicidade (UNIQUE): Uma coluna que obedeça à


restrição de Unicidade não pode ter valores repetidos. Note no entanto
que uma coluna nestas condições PODE conter valores nulos.
Pode declarar-se a coluna com restrições de Unicidade nas restrições
desta coluna ou no conjunto de restrições da tabela. Exemplos:
 CREATE TABLE alunos
 (numero INT(10) PRIMARY KEY,
 Nome VARCHAR (40),
 bi INT(10) CONSTRAINT uni_bi_alunos UNIQUE ) ;
 Ou
 CREATE TABLE alunos
 (numero INT(10) PRIMARY KEY,
 Nome VARCHAR (40),
 bi INT(10),
 CONSTRAINT uni_bi_alunos UNIQUE (bi) ) ;

Prof: Msc. Hugo Dias Dos Santos


Criação de Tabelas / Restrição de Integridade Geral
53

Restrição de Integridade Geral (CHECK)


É possível obrigar a que na inserção de dados sejam verificadas
condições.
As condições a verificar apenas permitem a inserção de dados se o valor
devolvido for Verdade ou Desconhecido (no caso do valor ser Nulo).
As condições a verificar podem incluir expressões aritméticas e chamadas
de funções SQL.
As condições a verificar não podem incluir:
 chamadas às funções SYSDATE, UID, USER e USERENV
 referências às pseudo-colunas CURRVAL, NEXTVAL, LEVEL e ROWNUM
 subconsultas
 referências a colunas de outras tabelas ou a outras linhas da mesma tabela
Pode declarar-se a restrição de integridade na zona de restrições da
coluna ou na zona de restrições da tabela.

Prof: Msc. Hugo Dias Dos Santos


Criação de Tabelas / Restrição de Integridade Geral
54

A sintaxe para se definir uma coluna com restrição de integridade


geral é:
[CONSTRAINT nome_restrição] CHECK ( condicao )
Na coluna
 CREATE TABLE alunos1
 (numero INT(10) PRIMARY KEY,
 Nome VARCHAR(40),
 ano INT(4) CONSTRAINT ck_ano_alunos CHECK(ano>1980) ) ;
Na Tabela
 CREATE TABLE alunos1
 (numero INT(10) PRIMARY KEY,
 nome VARCHAR(40),
 anoINT(4),
 CONSTRAINT ck_ano_alunos CHECK(ano>1980) ) ;

Prof: Msc. Hugo Dias Dos Santos


Criação de Tabelas / Restrição de Integridade Geral
55

Outro exemplo: Criar uma tabela empregados com duas restrições CHECK.
A primeira restrição, ck_nome_empregados, obriga a que os nomes tenham
um espaço no meio, ou seja, que exista pelo menos um nome e um apelido
para cada empregado.
A outra restrição, ck_funcao_empregado, obriga a que a função do
empregado esteja em uma lista de valores proposto, no nosso exemplo, entre
‘Presidente’, ‘Analista’ e ‘Vendedor’.

 CREATE TABLE empregados


 (numero NUMBER(10) PRIMARY KEY,
 nome VARCHAR(40),
 funcao VARCHAR(20),
 CONSTRAINT ck_nome_empregados CHECK (nome LIKE '% %'),
 CONSTRAINT ck_funcao_empregados CHECK (funcao IN ( 'Presidente',
'Analista‘,'Vendedor')) ) ;

Prof: Msc. Hugo Dias Dos Santos


Criação de Tabelas / Restrição de Proibição de Valores Nulos
56

Restrição de Proibição de Valores Nulos(NOT


NULL) :Uma coluna sem valores nulos é aquela em
que é sempre obrigatório a entrada de um valor.
 CREATE TABLE Estudante2
 (numero INT(10) PRIMARY KEY,
 nome VARCHAR(40) NOT NULL ) ;

Prof: Msc. Hugo Dias Dos Santos


Criação de Tabelas / Restrições de Chave estrangeira
57

Restrições de Chave Estrangeira (FOREIGN KEY) Uma chave estrangeira


(FOREIGN KEY) é uma referência a um valor que existe em outra coluna de outra tabela.
A coluna referenciada tem que ser uma chave primária ou uma coluna UNIQUE.
[CONSTRAINT nome_restrição] REFERENCES tabela[(coluna)]
[ON DELETE CASCADE]

A opção ON indica que se o registo da chave referenciada for apagado


DELETE CASCADE
então geram-se apagamentos em cascata para todos os registos dependentes desse.
 CREATE TABLE alunos2 (numero INT(10) PRIMARY KEY, nome VARCHAR(40) NOT NULL,
 Bi INT(10) UNIQUE, morada VARCHAR(80),
 ndep INT(3) CONSTRAINT fk_ndep_alunos REFERENCES departamentos(ndep)
 ON DELETE CASCADE ) ;
 Ou no WampServer
 CREATE TABLE alunos2 (numero INT(10) PRIMARY KEY, nome VARCHAR(40) NOT NULL,
 Bi INT(10) UNIQUE, morada VARCHAR(80),
 departamento INT(3) REFERENCES departamento(ndep)
 ON DELETE CASCADE ) ;

Prof: Msc. Hugo Dias Dos Santos


Valores por Omissão (DEFAULT)
58
Quando se inserem registos numa tabela é possível não especificar todos os valores de todos os campos. Os
campos em falta serão inseridos com um valor por omissão, se este estiver definido, ou com o valor NULL.
A sintaxe para definir um valor por omissão para uma coluna é a seguinte:
 CREATE TABLE tabela
 (coluna1 tipo_coluna1 DEFAULT valor1 [ restrições_coluna1]...) ;
EXEMPLO
 CREATE TABLE empregados
 (numero INT(10) PRIMARY KEY,
 Nome VARCHAR(40) NOT NULL,
 data_entrada DATE DEFAULT SYSDATE,
 Funcao VARCHAR(20) DEFAULT ‘Programador’,
 Sal INT(6) DEFAULT NULL,
 Premios INT(6));
 data_pagamento DATE DEFAULT NEXT_DAY(ROUND(SYSDATE+14, ‘MONTH’), ‘TUE’));

Wamp
 CREATE TABLE empregados
 (numero INT(10) PRIMARY KEY,
 Nome VARCHAR(40) NOT NULL,
 data_entrada Varchar(20),
 Funcao VARCHAR(20) DEFAULT ‘Programador’,
 Sal INT(10) Default 200000 ,
 Premios INT(6));

Prof: Msc. Hugo Dias Dos Santos


Nomes de Restrições
59

Os nomes das restrições são usados por vários SGBDs para dar uma pista
ao utilizador do que é que correu mal durante uma instrução SQL.
É importante definir nomes de restrições que permitam saber exactamente
que tipo de restrição (em que tabela, em que coluna, chave primária, chave
forasteira, NOT NULL, etc.) impediu a execução normal do comando.
  
Cada programador ou equipa de programadores deve definir o seu próprio
esquema de nomeação de restrições.
Não existe nenhuma regra fixa mas uma sugestão é usar:
descrição_coluna_tabela
Onde descrição indica que tipo de restrição se está a usar (pk=PRIMARY
KEY, fk=FOREIGN KEY, ck = CHECK, nn=NOT NULL, uni =UNIQUE),
coluna é o nome sobre o qual a restrição actua e tabela é o nome da
tabela dessa coluna.

Prof: Msc. Hugo Dias Dos Santos


Criar Tabelas Com Subconsultas
60

Criar Tabelas Com Subconsultas: A subconsulta a usar


faz duas coisas:
 copia os dados de outras tabelas para a tabela a criar e
 determina os nomes e os tipos de dados das colunas da nova tabela.
A sintaxe para usar subconsultas no comando CREATE TABLE
é:
CREATE TABLE tabela AS subconsulta
Exemplo:
 CREATE TABLE emp2 AS SELECT * FROM empregado;
Exemplo: atribuição de novos nomes as colunas
Create table emp2 AS SELECT nomef ‘’nomef2 ’’,numf
‘’numf2 ’’ from empregado;

Prof: Msc. Hugo Dias Dos Santos


Alterar Tabelas (ALTER TABLE)
61

Depois de criar uma tabela é possível alterá-la. Embora não seja um


comando usado frequentemente pode ser particularmente importante
conseguir alterar a tabela sem ter que a destruir e voltar a criar
novamente com outro comando.
É particularmente importante se a tabela já contiver dados que não se
podem perder.
As alterações possíveis são:
 Acrescentar colunas
 Redefinir colunas no que diz respeito ao tipo de dados, comprimento e valor por omissão
 Acrescentar e retirar restrições
 Activar e desactivar restrições
Repare que na maioria dos SGBDs não é possível remover uma coluna.
Note ainda que só é possível diminuir o tamanho dos dados de uma
coluna se a tabela estiver vazia.

Prof: Msc. Hugo Dias Dos Santos


Alterar Tabelas / Acrescentar Colunas
62

Para acrescentar uma coluna a uma tabela já existente


usa-se a seguinte sintaxe:
 ALTER TABLE nome_tabela
 ADD (coluna tipo_coluna [restricoes] [ valor_omissao]);
Exemplo: Acrescentar uma coluna a empregados.
Definir restrições sobre a coluna bem como valores por
omissão.
 ALTER TABLE empregados
 ADD (sexo CHAR(1) DEFAULT 'F'
 CONSTRAINT ck_sexo_empregados CHECK (sexo IN ('M', 'F'))) ;

Prof: Msc. Hugo Dias Dos Santos


Alterar Tabelas / Alterar Colunas
63

Para alterar colunas (o tipo, comprimento dos dados, valores por


omissão) usa-se o comando:
 ALTER TABLE tabela
 MODIFY (coluna [tipo_coluna] [ valor_omissao]);
Note que não é possível com a cláusula MODIFY alterar ou remover
coluna
restrições sobre essas colunas. Para isso é preciso a cláusula DROP
restrição. Os parêntesis são opcionais porque a cláusula MODIFY refere-se
sempre a uma e uma só coluna.
 Alterar o tipo de dados
 ALTER TABLE empregados MODIFY (sexo CHAR(3));
Alterar o valor por omissão
 ALTER TABLE empregados MODIFY (sexo DEFAULT ‘Fem’);
Note que este valor por omissão entra em conflito com a restrição de
integridade, ck_sexo_empregados, definida na página anterior.

Prof: Msc. Hugo Dias Dos Santos


Alterar Tabelas / restrições
64

Remover Restrições : Para remover uma restrição usa-se:


 ALTER TABLE tabela

 DROP CONSTRAINT restrição;

 Exemplo: Remover a restrição da coluna sexo


 ALTER TABLE empregados
 DROP CONSTRAINT ck_sexo_empregados;
Acrescentar Restrições: Para acrescentar uma restrição usa-se:
 ALTER TABLE tabela

 ADD CONSTRAINT nome_restricao condicao [ DISABLE];

Se se usar a palavra DISABLE, a restrição é acrescentada mas não é activada.


Ou seja, existe mas ainda não está a funcionar.
Exemplo: Acrescentar uma restrição à coluna sexo
 ALTER TABLE empregados
 ADD CONSTRAINT ck_sexo_empregados CHECK (sexo IN (‘Fem’, ‘Mas’));
Exemplo2: restrição de chave estrangeira:
 ALTER TABLE bebe ADD CONSTRAINT fk_bid_mae_bebe foreign key (bid_mae) references
mae(id_mae);
Prof: Msc. Hugo Dias Dos Santos
Alterar Tabelas / restrições
65

Desactivar Restrições (DISABLE CONSTRAINT)


A sintaxe para desactivar restrições é:
 ALTER TABLE tabela
 DISABLE CONSTRAINT nome_condição;
 Exemplo: Desactiva a restrição ck_sexo_empregados
 ALTER TABLE empregados
 DISABLE CONSTRAINT ck_sexo_empregados;

Activar Restrições
Da mesma forma que é possível desactivar restrições também é possível
activá-las. A sintaxe para activar restrições é:
 ALTER TABLE tabela
 ENABLE CONSTRAINT nome_condição;
Exemplo: Activa a restrição ck_sexo_empregados
 ALTER TABLE empregados
 ENABLE CONSTRAINT ck_sexo_empregados;

Prof: Msc. Hugo Dias Dos Santos


Exercícios
66

de
avaliação
Prof: Msc. Hugo Dias Dos Santos
Os Índices
67

Os índices são mecanismos utilizados para melhorar o


tempo de resposta nas pesquisas dentro de uma BD.
As pesquisas acontecem nas seguintes situações:
 De forma explícita num comando SELECT;
 De forma implícita num INSERT, porque é preciso verificar a
não duplicação da PRIMARY KEY e das UNIQUE KEYs;
 De forma implícita num UPDATE ou num DELETE porque é
preciso encontrar a linha que vai ser alterada ou eliminada;
 De forma implícita quando o comando SQL inclui uma
suboperação que requer a pesquisa, por exemplo um JOIN entre
duas tabelas;

Prof: Msc. Hugo Dias Dos Santos


Os Índices / desvantagem
68

A aceleração provocada por um índice pode ser enorme, por


exemplo horas convertidas em segundos, mas a sua
utilização tem um custo. Esse custo manifesta-se nas
seguintes situações:
 As operações de INSERT, UPDATE e DELETE obrigam a uma
actualização do índice, o que as torna mais pesadas;
 O índice ocupa espaço em disco que em algumas situações ocupa tanto
quanto a tabela a que se refere;
 Os índices têm que ser reconstruídos com alguma frequência, e esta
operação consome recursos e demora tempo;
O uso de índices é uma decisão de compromisso entre a
degradação de algumas operações e a maior velocidade
noutras, devendo ser ponderada e reflectida.

Prof: Msc. Hugo Dias Dos Santos


Os Índices / Criação de um índice
69
Para criar um índice usamos a sintaxe genérica a seguir indicada:
 CREATE [UNIQUE] INDEX nomeIndice ON
 nomeTabela(coluna1 [, coluna2...])
 [TABLESPACE nomeTablespace];
O nome do índice é obrigatório.
Alguns comandos em Oracle criam índices de forma implícita como a
restrição Primary Key ou Unique.
A cláusula UNIQUE é opcional. Na sua ausência o índice suporta valores
repetidos.
Um índice está sempre associado a uma tabela e é removido de forma
automática quando a respectiva tabela é removida.
Um índice usa no mínimo uma coluna da tabela. Quando utiliza mais que
uma coluna é um índice concatenado ou composto.
 A palavra reservada TABLESPACE indica onde o índice será guardado.
Quando é omitida o índice é armazenado no TABLESPACE definido por
omissão para esse utilizador. Faz parte das boas práticas do SGBD Oracle
que as tabelas e os índices sejam guardados em TABLESPACES diferentes.
Prof: Msc. Hugo Dias Dos Santos
Os Índices / Exemplos
70

O comando listado abaixo permite criar um índice com o


nome nome_mae sobre a coluna NOME da tabela MAE.
Este índice aceita valores repetidos:
 CREATE INDEX nome_mae ON mae(nome);
O comando abaixo permite criar o índice com o nome
EMP_NAME_IX sobre a tabela EMPLOYEES e cujos
valores resultam da concatenação das colunas
FIRST_NAME e LAST_NAME. Este índice não aceita
valores repetidos e será armazenado no tablespace
USERS:
 CREATE UNIQUE INDEX nome_endereco_mae ON mae (nome,
endereco) TABLESPACE USERS;

Prof: Msc. Hugo Dias Dos Santos


Os Índices / A selectividade de um índice
71

Um índice é muito selectivo quando todos os seus valores são


diferentes, sendo pouco selectivo quando possui muitos valores
repetidos.
Se calcularmos o ratio entre número de valores diferentes do índice e
número total de linhas da tabela, o índice será muito selectivo se o
ratio der 1, enquanto pouco selectivo se der próximo de zero.
Um índice criado sobre a coluna NUMERO_CLIENTE
(identificador numérico e único) é mais selectivo que outro criado
sobre a coluna DATA_ANIVERSARIO, que por sua vez é mais
selectivo que outro criado sobre a coluna ESTADO_CIVIL.
A selectividade do índice é medida pela selectividade dos seus
valores, o que significa que, no caso de índices compostos, não conta
a coluna individual mas sim a concatenação de todas as colunas.

Prof: Msc. Hugo Dias Dos Santos


Vistas
72

Uma vista é uma a instrução SELECT que recebe um


nome e pode ser consultada como se fosse uma tabela.
Uma vista não contem dados, pois usa os da tabela que
lhe dá suporte.
As vistas permitem definir um nível de abstracção e
um nível superior de segurança.
Uma vista pode mostrar uma parte de uma tabela, a
soma de duas tabelas ou qualquer outro conjunto de
dados que se consiga obter com uma instrução
SELECT.

Prof: Msc. Hugo Dias Dos Santos


Vistas / Criação
73

Vamos criar uma vista (VIEW) que faz uma selecção vertical
e horizontal sobre uma tabela:
 CREATE OR REPLACE VIEW empregado_v1 AS SELECT
 nome, numero, funçao FROM empregado WHERE numero in (1,2,3);
 Ou CREATE OR REPLACE VIEW bebe_v1 AS SELECT bnome,
id_bebe, bid_mae, peso FROM bebe WHERE peso<4;
Esta VIEW pode ser consultada com o seguinte comando:
SELECT * FROM bebe_v1;
Se dermos GRANT SELECT desta VIEW a outro utilizador,
este só verá as linhas e colunas por ela filtradas, esta vista
mostra apenas um subconjunto da tabela original.

Prof: Msc. Hugo Dias Dos Santos


Vistas / exemplo com JOIN
74

Vamos criar uma VIEW que associa cada bebe com a


sua respectiva mae na BD bercario. Como queremos
mostrar informações existentes em mais de uma
tabela temos de fazer um JOIN.
 CREATE OR REPLACE VIEW BM AS SELECT * FROM
 bebe b INNER JOIN mae m ON (b.bId_mae=m.Id_mae);

Prof: Msc. Hugo Dias Dos Santos


Vistas /Com UNION entre duas tabelas
75

Vamos construir uma VIEW que faz a união de dois conjuntos:


 CREATE OR REPLACE VIEW nome_mae_bebe AS SELECT
 id_bebe, bnome FROM bebe UNION
 SELECT id_mae, nome FROM mae where id_mae>1;
Para visualizar os dados da VIEW:
 select * from nome_mae_bebe ;
Neste exemplo o query que consulta a VIEW leva uma cláusula
WHERE, que funciona como um filtro adicional ao query que define
a vista.
Podemos ainda modificar os nomes dos atributos na vista final como
segue:
 CREATE OR REPLACE VIEW nome_mae_bebe AS SELECT
 id_bebe “ID_BEBE_MAE”, bnome “NOME_BEBE_MAE” FROM bebe UNION
 SELECT id_mae, nome FROM mae where id_mae>1;

Prof: Msc. Hugo Dias Dos Santos


Vistas / Visualizar
76

Em regra geral an visualização de uma vista utiliza-


se os mesmos comandos utilizados na visualização de
tabelas como:
Select * from nome_vista;
Describe vista;

Prof: Msc. Hugo Dias Dos Santos


Exercícios
77

de
aplicação
Prof: Msc. Hugo Dias Dos Santos
DQL: Linguagem de Consultas de Dados
78

Embora tenha apenas um comando, a DQL (Data Query


Language ) é a parte da SQL mais utilizada. O comando SELECT
permite ao usuário especificar uma consulta ("query") como uma
descrição do resultado desejado.
Esse comando é composto de várias cláusulas e opções,
possibilitando elaborar consultas das mais simples às mais
elaboradas.
O comando SELECT é o mais importante e mais complexo de
todos os comandos de SQL. O seu objectivo é o de seleccionar
dados, podendo para tal, aplicar vários tipos de relação (restrição,
projecção, produto, junção, união, intersecção e diferença) às
tabelas existentes na base de dados e executar operações sobre os
valores retirados das tabelas antes de os mostrar.

Prof: Msc. Hugo Dias Dos Santos


DQL / cláusulas
79

As cláusulas são condições de modificação utilizadas para


definir os dados que deseja selecionar ou modificar em uma
consulta.
Entre as principais podemos citar:
FROM - Utilizada para especificar a tabela que se vai
selecionar os dados.
 Exemplo: SELECT id_mae, nome FROM mae;
DISTINCT – Utilizada para selecionar dados sem repetição.
 Exemplo: SELECT DISTINCT especialidade FROM medico;
A maioria dos SGBDs modernos realizam um distinct
implicito no resultado de uma operação de seleção.

Prof: Msc. Hugo Dias Dos Santos


DQL / cláusulas
80

ORDER BY – Utilizada para ordenar os dados selecionados com uma


ordem especifica.
 Exemplo: SELECT DISTINCT especialidade, nome FROM medico ORDER BY
especialidade, cartao_med;
 Ascedente: SELECT especialidade, nome FROM medico ORDER BY especialidade ASC,
nome DESC;
 Descendente: SELECT especialidade, nome FROM medico ORDER BY cartao_med
DESC;
 Ascedente e Descendente: SELECT especialidade, nome FROM medico ORDER BY
especialidade DESC, cartao_med ASC;
GROUP BY – Utilizada para separar os dados selecionados em grupos
específicos. Este comando realiza o mesmo que o order by quando todos
valores da coluna especificada são distintos. Porque em regra geral este
comando retorna as linhas em função dos diferentes valores na coluna
passada em parámetros.
 Exemplo: SELECT especialidade, nome FROM medico GROUP BY especialidade;

Prof: Msc. Hugo Dias Dos Santos


A cláusula WHERE
81

WHERE – Utilizada para especificar as condições


que devem reunir os dados que serão retornados na
seleção.
 Exemplo: SELECT id_mae, nome FROM mae WHERE
id_mae=2;

Prof: Msc. Hugo Dias Dos Santos


A cláusula WHERE
82

A cláusula WHERE permite restringir linhas através de


uma condição.
Apenas as linhas que satisfaçam a condição são devolvidas.
Podem usar-se no WHERE condições sobre uma ou mais
colunas de uma ou mais tabelas ou vistas desde que as
tabelas ou vistas apareçam na cláusula FROM.
Pode comparar-se valores de colunas, expressões
aritméticas e constantes.
Para além de fazer restrições simples sobre uma tabela, o
uso mais comum do WHERE é o de permitir relacionar
colunas de várias tabelas ou vistas.

Prof: Msc. Hugo Dias Dos Santos


A cláusula WHERE / Operadores lógicos
83

AND – E lógico. Avalia as condições e devolve um valor


verdadeiro caso ambos sejam corretos.
Exemplo: SELECT id_mae, nome FROM mae WHERE
id_mae>2 AND idade <22;
OR – OU lógico. Avalia as condições e devolve um valor
verdadeiro se algum for correto.
Exemplo: SELECT id_mae, nome FROM mae WHERE
id_mae>2 OR <22;
NOT – Negação lógica. Devolve o valor contrário da
expressão. SELECT id_mae, nome FROM mae WHERE
NOT(id_mae>2 OR idade <22);

Prof: Msc. Hugo Dias Dos Santos


A cláusula WHERE / Operadores Relacionais
84
O SQL possui operadores relacionais, que
são usados para realizar comparações entre
valores, em estruturas de controle.
BETWEEN – Utilizado para especificar um
intervalo de valores. EX: Select bnome,
data_nasc from bebe where id_bebe
BETWEEN 1 AND 4.
LIKE – Utilizado na comparação de um
modelo e para especificar registros de um
banco de dados. "Like" + extensão %
significa buscar todos resultados com o
mesmo início da extensão. EX: select * from
bebe where bcartao_med LIKE ‘%5’;
IN - Utilizado para verificar se o valor
procurado está dentro de uma lista. Ex.:
valor IN (1,2,3,4). Ex select * from mae
where idade in (20,22,24);
Prof: Msc. Hugo Dias Dos Santos
A cláusula HAVING
85

A cláusula HAVING define condições na cláusula


GROUP BY semelhante ao modo que WHERE
interage com SELECT. O critério de pesquisa
WHERE é aplicado antes da execução da operação de
agrupamento; o critério de pesquisa HAVING é
aplicado depois que a operação de agrupamento é
executada.
A sintaxe HAVING é semelhante à sintaxe WHERE,
exceto se HAVING contiver funções de agregação.
 Exemplo: SELECT especialidade, nome,cartao_med FROM
medico GROUP BY especialidade HAVING cartao_med>1500;

Prof: Msc. Hugo Dias Dos Santos


Exercícios
86

de
aplicação
Prof: Msc. Hugo Dias Dos Santos
87

III: Funções

Prof: Msc. Hugo Dias Dos Santos


O que são Funções?
88
São pedaços de código, definidos pelo utillizador ou pré-definidos pela
linguagem, utilizados para manipular dados.
Aceitam um ou mais argumentos, devolvendo um valor. O argumento é
uma constante, variável ou o nome de uma coluna. O valor devolvido
serve para classificar a função(numérica, char, Date).
As funções são utilizadas para manipular dados, tornando mais potentes
as consultas.
Dividem-se em três grandes grupos:
 Manipulação de linhas: neste grupo encontramos funções para manipular caracteres,
números, datas e funções que permitem converter dados de um tipo para outro;
 Manipulação de grupos de linhas: As funções de grupo permitem obter um valor que
depende do grupo de linhas, por exemplo uma média, variância ou um máximo;
 Funções analíticas: Estas misturam os dois tipos anteriores: devolvem um valor por cada
linha, mas esse valor depende do grupo.
Em Oracle o utilizador pode definir as suas próprias funções usando a
linguagem de programação PL/SQL ou JAVA.
Prof: Msc. Hugo Dias Dos Santos
3.2 Funções de linha
89

Actuam sobre cada uma das linhas resultantes da consulta.


 Para cada linha produzem um valor que depende dos
argumentos recebidos. Podem ser utilizadas com outras
funções.
Nas funções de linha destacam-se os seguintes grupos:
 Funções de manipulação de caracteres;
 Funções encadeadas;
 Funções numéricas;
 Funções para manipular datas;
 Funções para conversão de tipos;
 Funções especiais;

Prof: Msc. Hugo Dias Dos Santos


3.2.1 Funções de manipulação de caracteres;
90

Estas funções aceitam como argumento(s) caracteres e devolvem caracteres ou


valores numéricos:
LOWER(string):Converte 'string' para letras minúsculas. Ex: SELECT LOWER
(nome) FROM estudante;
UPPER(string):Converte 'string' para letras maiúsculas. Ex: SELECT UPPER
(nome) FROM estudante;
CONCAT(string1,string2); Devolve a concatenação de string1 com string2. Ex
SELECT CONCAT (nome, sobrenome), CONCAT (pais,provincia) FROM
estudante;
SUBSTR(string1,pos,n);
Esta função pressupõe que os caracteres numa cadeia são numerados da esquerda
para a direita, começando em 1. Devolve a substring de 'string1' que começa na
posição 'pos' e tem comprimento n. Se o parametro 'n' for omitido, devolve todos
os caracteres desde a posição 'pos' até ao fim. EX:
select SUBSTR(nome,2,4), SUBSTR(endereco,2), substr(telefone,3,5) FROM mae;

Prof: Msc. Hugo Dias Dos Santos


3.2.1 Funções de manipulação de caracteres;
91

INSTR(string1,string2); Devolve a posição da primeira


ocorrência de string2 dentro de string1. EX: select nome,
INSTR(nome,’ANA’), INSTR(nome,’INE’) FROM mae;
LENGTH(string1); Devolve o comprimento de
string1;Ex SELECT nome, LENGTH (nome) FROM mae;
TRANSLATE(string1,c1,c2); Substitúi um caracter por
outro. Converte todas as ocorrências do caracter c1 de
string1 para c2. Podem ser colocados vários caracteres. Se
c2 for omitido, c1 é convertido para espaço em branco. Ex
select nome, TRANSLATE(endereco,‘Viana',‘Luanda')
FROM mae;

Prof: Msc. Hugo Dias Dos Santos


3.2.2 Funções encadeadas
92

As funções de linha podem ser progressivamente


encadeadas, umas dentro das outras. A avaliação é feita
das funções interiores para as funções exteriores.
Como faria para saber quantas vezes aparece um
determinado caracter dentro de uma string? Uma
solução é encadear as funções LENGTH e TRANSLATE .
No exemplo a seguir é calculado o numero de s que existe
nos nomes como segue.
EX: select nome, especialidae LOWER(CONCAT(nome,
especialidae)) FROM medico;

Prof: Msc. Hugo Dias Dos Santos


3.2.3Funções numéricas
93
ABS( ) ROUND( )
MOD( ) TRUNC( )
LOG( ) CEIL( )
SIN( ) FLOOR( )
SINH( ) POWER( )
TAN( ) EXP( )
TANH( ) SQRT( )
COS( ) SIGN( )
COSH( )

Prof: Msc. Hugo Dias Dos Santos


3.2.4 Funções para manipular datas
94
Estas funções operam sobre datas Oracle. Todas devolvem um valor do tipo data, excepto
MONTHS_BETWEEN que produz um número.
Formato da data:
As datas podem ir de 1 e Janeiro de 4712 AC a 31 de Dezembro de 4712 DC. O ORACLE
armazena as datas num formato numérico, que contem 7 bytes. Cada byte armazena um
dos componentes abaixo e por esta ordem:
 Século;
 Ano;
 Mês;
 Dia;
 Horas;
 Minutos;
 Segundos;
A parte inteira do número corresponde ao ano+mês+dia, sendo a parte décimal as
horas+minutos+segundos. A unidade de "medida" é o dia.
O comando abaixo altera o formato de apresentação da data para todos os comandos que
sejam executados dentro da mesma sessão no ORACLE:
ALTER SESSION SET nls_date_format = 'yyyy-mm-dd hh24:mi:ss';

Prof: Msc. Hugo Dias Dos Santos


3.2.4 Funções para manipular datas
95

SYSDATE() ou Current_date(): Devolve a data do servidor onde corre a base de


dados. Não necessita argumentos:
EX: select sysdate(); EX2: select Current_date();
Ex3 select sysdate(), Current_date();
MONTHS_BETWEEN(data1,data2): Determina o número de meses entre data1 e
data2. O resultado pode ser positivo ou negativo.
OBS: A parte décimal do resultado representa o número de horas, minutos e segundos
em fracção de dia, que é a unidade usada na data.
ADD_MONTHS(data,n): Adiciona n meses de calendário à data. O número n tem
que ser inteiro e pode ser negativo.
DATE_ADD(Data,n): Função utilizada no MySql faz o mesmo que a função anterior
podendo adicionar dias e anos.
Ex1 select Date_add(current_date(), Interval 30 DAY);
EX2: select data , Date_add(data, Interval 30 MONTH) from pedido where
cod_pedido=1;
EX2: select data , Date_add(data, Interval 30 YEAR) from pedido where cod_pedido=1;

Prof: Msc. Hugo Dias Dos Santos


3.2.4 Funções para manipular datas
96

O comando ALTER SESSION SET NLS_LANGUAGE vai alterar o formato usado


pela base de dados para escrever a data. No primeiro caso aparece segundo a
norma dos Estados Unidos da America. No segundo caso aparece segundo a norma
Portuguesa.
O comando ALTER SESSION SET NLS_TERRITORY altera os nomes usados para
os dias da semana. No primeiro caso foi FRIDAY e no segundo caso foi SEXTA.
alter session set nls_language='AMERICAN';
alter session set nls_territory='AMERICA';
select sysdate, next_day(sysdate,'FRIDAY'), next_day(sysdate,6)
from dual;
 
alter session set nls_language='PORTUGUESE';
alter session set nls_territory='PORTUGAL';
select sysdate, next_day(sysdate,'SEXTA'), next_day(sysdate,6)
from dual;

Prof: Msc. Hugo Dias Dos Santos


3.2.4 Funções para manipular datas
97

LAST_DAY(data1):Devolve o último dia do mês de data1.


EX: Select data, LAST_DAY(data) from pedido where cod_pedido=1;
TRUNC(data1); Devolve a data1 com a hora convertida para as zero
horas (12:00 AM). Este comando é muito util quando pretendemos
comparar datas que têm horas/minutos/segundos diferentes e apenas nos
interessa o ano/mês/dia.
TRUNC(data1,'MONTH'); Devolve o primeiro dia do mês que contém
data1.
TRUNC(data1,'YEAR'): Devolve o primeiro dia do ano que contém
data1.

ROUND(data1,'MONTH'); Devolve o primeiro dia do mês que contém


data1 se esta estiver na primeira metade. Devolve o primeiro dia do mês
seguinte se data1 estiver na segunda metade do mês.

Prof: Msc. Hugo Dias Dos Santos


Funções para manipular datas (MySql)
98

DATE_FORMAT(<data_para_fomatar>,<formato_desejado): como o
nome indica nos permite mudar o formato da apresentação da data. Se a
letra Y fornecida em parametros for minúscula então a dota retornada
tera apenas dois digitos para o ano especificado.
 EX: Select date_format(current_date(),’%D/%M/%Y’);
DATEDIFF (data1,data2): Retorna a diferença em dias entre data1 e
data dois. O resultado pode ser negativo.
Ex: obter a diferença de dias entre o primeiro pedido e todos pedidos da
tabela pedido;
 R: SELECT data, DATEDIFF(data,(select data from pedido where
cod_pedido=1)) " diferença de dias" from pedido;
DAYOFYEAR(data): Retorna o numero do dia no ano da data em
paramentro.
Ex1: Select DAYOFYEAR(current_date());

Prof: Msc. Hugo Dias Dos Santos


3.2.5 Funções para de Extração de data
99
EXTRACT(YEAR|MONTH|WEEK|DAY|HOUR|MINUTE|TIMEZONE FROM
DATE|TIMESTAMP): A função EXTRACT surgiu na versão 9i e permite extrair as
componentes de uma data. A sua sintaxe genérica é:
EXTRACT ({ YEAR | MONTH | DAY | HOUR | MINUTE | SECOND }|
{ TIMEZONE_HOUR | TIMEZONE_MINUTE } | { TIMEZONE_REGION |
TIMEZONE_ABBR } FROM { date_value | interval_value } )
Tem as seguintes limitações:
 De um tipo DATE apenas podemos extrair o ano, o mês e o dia;
 Só podemos extrair TIMEZONE_HOUR e TIMEZONEMINUTE de um tipo TIMESTAMP que possua
TIMEZONE;
 Seguem alguns exemplos de utilização:
SELECT EXTRACT(YEAR FROM DATE '2012-05-01') ;
SELECT data, EXTRACT(YEAR FROM DATE (data)) from pedido where cod_pedido=1 ;
SELECT data, EXTRACT(MONTH FROM DATE (data)) from pedido where
cod_pedido=1 ;
SELECT EXTRACT(DAY FROM DATE '2012-05-01') ;
 SELECT EXTRACT(SECOND FROM SYSDATE()) ;
 SELECT EXTRACT(HOUR FROM SYSDATE()) ;

Prof: Msc. Hugo Dias Dos Santos


3.2.5 Funções para conversão de tipos
100

A linguagem SQL fornece várias funções para controlar a


conversão de tipos de dados. Estas funções convertem um valor
de um tipo para outro tipo. Entre elas as principais são:
TO_DATE(string, máscara de data): A função TO_DATE()
converte do formato cadeia de caracteres para data, seguindo o
formato de data escolhido pelo utilizador.
 A função TO_DATE() converte de cadeia de caracteres em data. À data
resultante adicionamos um dia;
 A data obtida pelo comando anterior é apresentada usando o formato
definido pelo comando ALTER SESSION SET NLS_DATE_FORMAT;
TO_CHAR(data, máscara_data, [nls_date_format] ): A
função TO_CHAR(data) converte do formato data para cadeia de
caracteres, seguindo a máscara escolhida pelo utilizador

Prof: Msc. Hugo Dias Dos Santos


3.2.5 Funções para conversão de tipos
101

DECODE: A sintaxe do comando DECODE é a seguinte:


DECODE (v, v1, r1, v2, r2, r_default);
Se a expressão v assumir o valor v1 então é colocado o resultado
r1, se v2 então r2. Se nenhum desses valores ocorrer então é
colocado r_default. Simula um comando if-then-else ou um
comando CASE com sinal de igual (=). O número de pares de
valores (v1,r1) pode variar. O valor r_default é facultativo.
 A expressão v pode ser o nome de uma coluna ou o resultado de uma função;
 O resultado da expressão v e os valores v1, v2, ... têm que ser do mesmo tipo;
 Se r_default for omitido é devolvido null nos casos em que a condição não
satisfaça nenhuma das alternativas v1, v2, ....
Exe: select grade, decode (grade, 1,'15%‘, 2,'10%‘, 3,'8%‘, '5%')
"Bonus“ from salgrade;

Prof: Msc. Hugo Dias Dos Santos


3.2.6 Funções especiais
102

 A lista abaixo possui funções especiais, que em alguns contextos


podem ser enquadradas como "pseudo-colunas" da tabela.
USER:Mostra o nome do utilizador Oracle que abriu sessão.
select user from dual;
UID: Mostra o número que a base de dados atribuiu ao
utilizador.
select user,uid from dual;
USERENV(arg): Devolve dados da sessão actual. Os valores de
arg podem ser: 'LANGUAGE' - lingua; 'LANG' - país;
'INSTANCE’,'TERMINAL' - nome do computador (quando o
cliente é JDBC aparece em branco); 'SESSIONID'- número da
sessão Oracle que está em execução;

Prof: Msc. Hugo Dias Dos Santos


3.3 Funções de grupo de linhas
103

Permitem obter informação resultante de


processamento sobre valores pertencentes a um
grupo de linhas, como a média, máximo ou mínimo.
 Neste módulo descreve-se a utilização destas
funções, assim como a divisão de linhas de uma
tabela em conjuntos mais pequenos e como
especificar critérios de pesquisa para grupos de
linhas.

Prof: Msc. Hugo Dias Dos Santos


3.3.1 Funções de estatística / agregação
104

Enquadram-se nas funções de grupo ou agregado


porque operam sobre um conjunto de linhas,
produzindo um único resultado para esse conjunto,
ao contrário das funções de linha que produzem um
resultado para cada linha.
Quando não é usada a clausula GROUP BY todas as
linhas da tabela são tratadas como um grupo.
As colunas que possuem valores null são ignoradas.
Todas as funções permitem a utilização da clausula
DISTINCT que elimina valores repetidos.

Prof: Msc. Hugo Dias Dos Santos


3.3.1 Funções de estatística / agregação
105

As funções de agregação, como ilustradas nos exemplos abaixo, são usadas dentro de
uma cláusula SELECT em grupos de dados para devolver um único valor que se aplica
a um grupo de dados.
AVG – Utilizada para calcular a média dos valores de um campo determinado;
Exemplo: SELECT AVG(credito) FROM cliente;
COUNT – Utilizada para devolver o número de registros da seleção;
Exemplo: SELECT COUNT(especialidae) FROM medico;
SUM – Utilizada para devolver a soma de todos os valores de um campo determinado;
Exemplo: SELECT SUM(Credito) ‘’ Soma Dos Creditos ‘’ FROM cliente;
MAX – Utilizada para devolver o valor mais alto de um campo especificado;
Exemplo: SELECT MAX(credito) FROM cliente;
Exemplo2 : SELECT nome,credito from cliente where credito like (select max(credito)
from cliente);
MIN – Utilizada para devolver o valor mais baixo de um campo especificado.
Exemplo: SELECT nome, credito FROM cliente HAVING MIN (credito);
VARIANCE :Determina a variância de n, ignorando valores nulos.

Prof: Msc. Hugo Dias Dos Santos


3.4 Funções analíticas
106

As funções analíticas calculam um valor para cada linha que


varia com os valores das outras linhas do grupo. Diferem das
funções de grupo pelas seguintes razões:
 Devolvem um valor para cada linha, em vez de um valor para todo o grupo;
 O grupo de linhas é escolhido por uma cláusula "order by" ou partição de
tabela;
 A função analítica usa as linhas do grupo para efectuar cálculos
"deslizantes" que têm em conta os valores das outras linhas do grupo e as
posições relativas das linhas entre si;
Na execução de um query, Primeiro são feitas as junções,
filtros horizontais (WHERE), agrupamento (GROUP BY) e
filtro de grupos (HAVING). Depois é feito o cálculo da função
analítica e só em último lugar a ordenção (ORDER BY).

Prof: Msc. Hugo Dias Dos Santos


3.4 Funções analíticas
107
Estas funções são muito úteis para os ambientes de data wharehouse.
 ROW_NUMBER( )
 RANK( )
 DENSE_RANK( )
 CUME_DIST( )
 PERCENT_RANK( )
 RATIO_TO_REPORT( )
 NTILE( )
 LEAD( )
 LAG( )
 FIRST_VALUE( )
 Funções estatísticas combinadas com cláusula OVER
As Funções Analiticas não fazem parte do programa desta cadeira
mas faz parte da cadeira de armazenamento de dados do quinto ano

Prof: Msc. Hugo Dias Dos Santos


Outras funções/ de Linha
108

GREATEST(v1,v2,v3): Devolve o maior dos


valores v1, v2 ou v3. A função pode receber mais que
3 argumentos.
Ex select GREATEST (12,45,17);
Ex2; Select
GREATEST(max(credito),max(cod_cliente)) from
cliente.

Prof: Msc. Hugo Dias Dos Santos


3.5 TRIGGER
109
Um TRIGGER ou gatilho é um objeto de banco de dados, associado a
uma tabela, definido para ser disparado, respondendo a um evento em
particular. Tais eventos são os comandos da DML (Data Manipulation
Language): INSERT, REPLACE, DELETE ou UPDATE.
Uma função de gatilho pode ser criada para executar antes (BEFORE) ou
após (AFTER) as consultas INSERT, UPDATE OU DELETE.
A função de gatilho deve ser declarada como uma função que não recebe
argumentos e que retorna o tipo TRIGGER.
Após criar a função de gatilho, estabelecemos o gatilho pelo comando
CREATE TRIGGER.
Uma função de gatilho pode ser utilizada por vários gatilhos.
As funções de gatilho chamadas por gatilhos-por-instrução devem
sempre retornar NULL.
As funções de gatilho chamadas por gatilhos-por-linha podem retornar
uma linha da tabela (um valor do tipo HeapTuple) para o executor da
chamada, se assim o decidirem.
Prof: Msc. Hugo Dias Dos Santos
3.5 TRIGGER
110

Sintaxe:
 CREATE TRIGGER nome {BEFORE|AFTER} {evento[OR...]} ON tabela [FOR[EACH]
{ROW|STATEMENT} ]EXECUTE PROCEDURE nome_da_função (argumentos)
O gatilho fica associado à tabela especificada e executa a função
especificada nome_da_função quando determinados eventos ocorrerem.
O gatilho pode ser especificado para disparar antes de tentar realizar a
operação na linha (antes das restrições serem verificadas e o comando
INSERT, UPDATE ou DELETE ser tentado), ou após a operação estar
completa (após as restrições serem verificadas e o INSERT, UPDATE ou
DELETE ter completado).
evento Um, entre INSERT, UPDATE ou DELETE; especifica o evento que
dispara o gatilho.
Vários eventos podem ser especificados utilizando OR.
Exempo:

Prof: Msc. Hugo Dias Dos Santos


Exemplo de Triggers;
111
Criação de uma tabela que fara a recepção de todos Status modificado.

CREATE TABLE cliente_auditoria (


 id INT(11) NOT NULL AUTO_INCREMENT,
N_asso int(11) not null, sobrenome varchar(50) not null, modificadoem datetime DEFAULT
NULL, acao VARCHAR(50) DEFAULT NULL,
 PRIMARY KEY (id) );

TRIGGER
DELIMITER $$
CREATE TRIGGER Cliente_aud BEFORE UPDATE ON cliente
FOR EACH ROW BEGIN
INSERT INTO cliente_auditoria
SET acao = 'update',
N_asso = OLD. N_asso,
sobrenome = OLD.sobrenome,
modificadoem = NOW(); END $$
DELIMITER ;

Prof: Msc. Hugo Dias Dos Santos


Exemplo2
112

Criação de uma tabela cujo o nome é quantidade_stock1. A mesma contem


informações da quantidade total em estoque de cada produto.
CREATE TABLE Quantidade_stock1
( id INT(11) NOT NULL AUTO_INCREMENT ,
cod_produto INT(10) references produto(cod_produto),
quantidades float (10) not null, PRIMARY KEY (id) );
TRIGGER
DELIMITER $$
CREATE TRIGGER reduz_quantidade BEFORE INSERT ON ped_produto
FOR EACH ROW BEGIN
Update Quantidade_stock1
SET quantidades =((quantidades) - (NEW.quantidade)) where
quantidade_stock1.cod_produto=new.cod_produto;
 END$$
DELIMITER ;

Prof: Msc. Hugo Dias Dos Santos


3.5 TRIGGER e PLpg/SQL /exemplo1
113

CREATE TABLE empregados


(codigo int(4) NOTNULL,
nome varchar (40),
salario int(4),
departamento_cod int(4),
ultima_data timestamp,
ultimo_usuario varchar(50),
CONSTRAINT empregados_pkey PRIMARY KEY
(codigo));

Prof: Msc. Hugo Dias Dos Santos


3.5 TRIGGER / exemplo1
114

CREATE FUNCTION empregados_gatilho() RETURNS trigger AS


$empregados_gatilho$
BEGIN
-- Verificar se foi fornecido o nome e o salário do empregado--
IF NEW.nome IS NULL THEN
RAISE EXCEPTION 'O nome do empregado não pode ser nulo'; END IF;
IF NEW.salario IS NULL THEN
RAISE EXCEPTION '% não pode ter um salário nulo', NEW.nome;
END IF;
-- -- Quem paga para trabalhar?--
IF NEW.salario<0 THEN
RAISE EXCEPTION '% não pode ter um salário negativo', NEW.nome; END IF;
-- ---- Registrar quem alterou a folha de pagamento e quando--
NEW.ultima_data:='now'; NEW.ultimo_usuario:=current_user; RETURN NEW; END;
$empregados_gatilho$ LANGUAGE plpgsql;

Prof: Msc. Hugo Dias Dos Santos


3.5 TRIGGER / exemplo1
115

CREATE TRIGGER empregados_gatilho BEFORE INSERT OR UPDATE


ON empregados FOR EACH ROW EXECUTE PROCEDURE
empregados_gatilho();

INSERT INTO empregados (codigo,nome,salario) VALUES (5,'João',1000);


INSERT INTO empregados (codigo,nome,salario) VALUES (6,'José',1500);
INSERT INTO empregados (codigo,nome,salario) VALUES
(7,'Maria',2500);
SELECT*FROM empregados;
INSERT INTO empregados (codigo,nome,salario) VALUES
(5,NULL,1000);
NEW–Para INSERT e UPDATE OLD–Para DELETE

Prof: Msc. Hugo Dias Dos Santos


3.5 TRIGGER / exemplo2
116

CREATE TABLE empregados


(nome varchar NOT NULL,
salario int(10)); 
CREATE TABLE empregados_audit
(operacao char(1) NOT NULL,
usuario varchar NOT NULL,
data timestamp NOT NULL,
nome varchar NOT NULL, salario int(10));

Prof: Msc. Hugo Dias Dos Santos


3.5 TRIGGER / exemplo2
117

CREATE OR REPLACE FUNCTION processa_emp_audit() RETURNS TRIGGER


AS $emp_audit$
BEGIN
-- Cria uma linha na tabela emp_audit para refletir a operação realizada na tabela
emp.Utiliza a variável especial TG_OP para descobrir a operação sendo realizada.—
IF (TG_OP='DELETE') THEN
INSERT INTO emp_audit SELECT 'E', user, now(), OLD.*;
RETURN OLD;
ELS IF(TG_OP='UPDATE') THEN
INSERT INTO emp_audit SELECT 'A', user, now(), NEW.*;
RETURN NEW;
ELSIF(TG_OP='INSERT') THEN
INSERT INTO emp_audit SELECT 'I', user, now(), NEW.*;
RETURN NEW; END IF; RETURN NULL;
-- o resultado é ignorado uma vez que este é um gatilho AFTEREND;
$emp_audit$languageplpgsql;
Prof: Msc. Hugo Dias Dos Santos
3.5 TRIGGER / exemplo2
118

CREATE TRIGGER emp_audit AFTER INSERT OR UPDATE OR


DELETE ON empregados FOR EACH ROW EXECUTE
PROCEDURE processa_emp_audit();   
INSERT INTO empregados (nome,salario) VALUES ('João',1000);
INSERT INTO empregados (nome,salario) VALUES ('José',1500);
INSERT INTO empregados (nome,salario) VALUES ('Maria',250);
UPDATE empregados SET salario=2500 WHERE nome='Maria';
DELETE FROM empregados WHERE nome='João';
SELECT*FROM empregados; SELECT*FROM empregados_audit;

Prof: Msc. Hugo Dias Dos Santos


119

IV: DCL
Administração
Prof: Msc. Hugo Dias Dos Santos
DCL: Linguagem de controlo de dados
120

É o grupo de comandos que permitem ao administrador de


banco de dados gerenciar os aspectos de autorização de
dados e licenças de usuários para controlar quem tem acesso
para ver ou manipular dados dentro do banco de dados.
Os comandos mais usuais da DCL são:
 GRANT:concede privilégios a um ou mais usuários para acessar ou
realizar determinadas operações em um objetos de dados.
 REVOKE: revoga (remove) ou restringe a capacidade de um usuário de
executar operações.
 SET: Define parâmetros em tempo de execução, como por exemplo, o
tipo de codificação do cliente e o estilo de representação de data e hora.
 LOCK: Bloqueia explicitamente uma tabela fazendo o controle de
acessos concorrente.

Prof: Msc. Hugo Dias Dos Santos


DCL: Sintaxe de Criação de Usuário
121
Sintaxe:
 CREATE USER nome_de_usuario IDENTIFIED BY sua_senha[DEFAULT TABLESPACE
nome_da_tablespace][TEMPORARY TABLESPACE tablespace_temporaria];
nome_de_usuario – É nome do usuário que será criado;
sua_senha – É a senha para o usuário que está sendo criado;
nome_da_tablespace – É a tablespace padrão onde os objetos do banco
de dados são armazenados. Se essa opção for omitida, o banco assume a
tablespace SYSTEM padrão;
tablespace_temporaria – É a tablespace padrão onde são armazenados
os objetos temporários, como tabelas temporárias por exemplo. Se essa
opção for omitida um tablespace temporário TEMP é assumida.
Exemplo:
 CREATE USER eliezio identified by 123; Ou
 CREATE USER devmedia identified by teste DEFAULT TABLESPACE users TEMPORARY
TABLESPACE temp;

Prof: Msc. Hugo Dias Dos Santos


DCL: Verificando as tablespaces
122

No exemplo1 anterior foi criado o usuário ELIEZIO


com a senha 123, esse usuário foi criado de forma
direta, ou seja, foi omitida a DEFAULT
TABLESPACE e TEMPORARY TABLESPACE, isso
faz com que o Oracle assuma o padrão do banco.
Para visualizar as tablespaces usadas na criação do
usuário, pode ser executado o seguinte comando:
 SELECT username, default_tablespace,
temporary_tablespace FROM dba_usersWHERE username
= 'ELIEZIO';

Prof: Msc. Hugo Dias Dos Santos


DCL: Alterando a senha, bloqueando/desbloqueando
123
Alterando a senha do usuário
 ALTER USER devmedia identified by 4321;
A senha do usuário DEVMEDIA foi alterada de teste para 4321.
Desbloqueando um usuário
 ALTER USER devmedia identified by 4321 account unlock;
Foram adicionados dois novos comandos, o ACCOUNT
UNLOCK que tem a função de desbloquear o usuário, nesse caso
não é necessário á troca da senha, a menos que seja necessário.
Bloqueando um usuário
 ALTER USER devmedia account lock;
Excluindo um usuário
 DROP USER eliezio;

Prof: Msc. Hugo Dias Dos Santos


DCL: Privilégios de Sistema
124

Como foi mencionado já anteriormente neste artigo, são os


privilégios que permitem executar instruções DDL, tais como
create session,create sequence, create synonym,create
table,create view dentre vários outros.
Conceder Privilégios de Sistema:
 GRANT create session,create table,create view TO eliezio;
Está sendo concedido três privilégios de sistema para o
usuário ELIEZIO, nesse momento esse usuário passa a ter
privilégio de criar uma sessão de conexão na BD, e ainda pode
criar tabelas e views.
Usando a cláusula WITH ADMIN OPTION, isso permite que o
usuário possa estender seus privilégios para outros usuários.

Prof: Msc. Hugo Dias Dos Santos


DCL: Privilégios de Sistema
125
WITH ADMIN OPTION
GRANT create session,create table,create view TO eliezio WITH ADMIN
OPTION;
estão sendo concedidos três privilégios de sistema para o usuário
ELIEZIO, como foi adicionada a cláusula WITH ADMIN OPTION significa
que o usuário ELIEZIO pode estender seus privilégios de sistema para
outros usuários.
Conceder Privilégios de Objeto
são os privilégios que permitem executar instruções DML, tais como
select, insert, update, delete dentre vários outros.
 GRANT select,update ON HR.employees TO eliezio;
estão sendo concedidos privilégios de SELECT e UPDATE na tabela
EMPLOYEES que é do esquema HR para o usuário ELIEZIO. Vale
ressaltar que sempre que se está liberando privilégios a objetos de outro
usuário deve-se sempre colocar o nome do usuário(esquema) antes do
nome do objeto.
Prof: Msc. Hugo Dias Dos Santos
DCL: Privilégios de Sistema
126
WITH GRANT OPTION
 GRANT select,update ON HR.employees TO eliezio WITH GRANT OPTION;
Estão sendo dados privilégios de SELECT e UPDATE na tabela
EMPLOYEES que é do esquema HR para o usuário ELIEZIO, no final
foi adicionada a cláusula WITH GRANT OPTION, significando que o
usuário ELIEZIO pode estender seus privilégios de objetos para
outros usuários.
Revogando(Removendo) de Sistema
REVOKE create view FROM eliezio;
No exemplo é apresentada a cláusula REVOKE que é responsável por
remover um privilégio de um usuário, seja ela um privilégio de
sistema ou objeto. Nesse caso está sendo removido o privilégio
CREATE VIEW do usuário ELIEZIO que é um privilégio de sistema.
Revogando(Removendo) de Objetos
REVOKE insert ON HR.employees FROM eliezio;
Prof: Msc. Hugo Dias Dos Santos
127

V:Controlo de
Concorrência
Prof: Msc. Hugo Dias Dos Santos
1. Transacção
128

Uma transacção é um conjunto de instruções SQL que devem funcionar


como um todo. Isto significa que uma transacção tem sucesso se todas as
suas instruções tiverem sucesso e fracassa se uma das suas instruções
falhar.
Como iniciar e terminar uma transacção?
Uma transacção pode ser constituída por um ou mais comandos SELECT,
INSERT, UPDATE ou DELETE. Em Oracle uma transacção começa logo
que termina a transacção anterior. Uma transacção termina numa das
seguintes situações:
 É executado o comando COMMIT;
 É executado o comando ROLLBACK;
 É executado um comando DDL (Data Definition Language);
 É executado um comando DCL (Data Control Language);
 Fim de sessão;
 Ocorre um erro num comando da transacção;

Prof: Msc. Hugo Dias Dos Santos


1. Transacção
129
Quando a transacção termina com confirmação as alterações feitas
aos dados tornam-se definitivas. Isto ocorre nestas situações:
 COMMIT;
 Comando DDL;
 Comando DCL;
Fim de sessão normal (EXIT);
Na realidade uma transacção termina apenas com COMMIT ou
ROLLBACK, mas os comandos DDL e DCL assim como o fim de
sessão normal (EXIT) têm COMMIT implícito, ou seja, a base de
dados confirma a sua execução de forma automática.
Quando a transacção termina sem confirmação as alterações feitas
aos dados são desfeitas. Isto ocorre nas seguintes situações:
 ROLLBACK;
 Erro num comando da transacção;
 Fim de sessão anormal, por exemplo por falha nas comunicações ou fim do "client
process";
Prof: Msc. Hugo Dias Dos Santos
Tempo
1. Transacção
Sessão 1
/ exemplo
Comentário
130 Fim da transacção anterior e inicio da
1 commit;
nova
Remover a tabela TESTE (caso
drop table teste; exista) e recriá-la. São dois
create table teste (
comandos DDL, sendo cada um
id number(10,0),
2 nome varchar2(100), deles uma transacção com COMMIT
constraint pk_teste primary key (id) implícito. Depois do COMMIT
); implícito do segundo comando
inicia-se uma nova transacção.
insert into teste (id,nome) values (1,'José');
insert into teste (id,nome) values (2,'João');
Dentro da transacção inserir várias linhas
3 insert into teste (id,nome) values (4,‘Abel');
na tabela TESTE e verificar que estão lá.
insert into teste (id,nome) values (5,'josé');
select * from teste;
4 rollback; Fazer rollback à transacção
Verificar que as alterações foram
5 select * from teste; desfeitas, ou seja, os dados voltaram ao
valor inicial

Prof: Msc. Hugo Dias Dos Santos


1. Transacção
131

No exemplo anterior, se no passo 4 tivessemos feito


COMMIT em vez de ROLLBACK as alterações
tornavam-se definitivas.
SAVEPOINT
O comando ROLLBACK na sua versão simples desfaz
todas as alterações feitas na transacção. É possível
adicionar SAVEPOINTs ao longo da transacção que
permitem o "desfazer" parcial. O exemplo a seguir
mostra como:

Prof: Msc. Hugo Dias Dos Santos


1. Transacção
Tempo Sessão 1 Comentário
132
1 drop table teste; Remover a tabela TESTE (caso
create table teste ( exista) e recriá-la. São dois
id number(10,0), comandos DDL, sendo cada um
nome varchar2(100), deles uma transacção com
constraint pk_teste primary key COMMIT implícito. Depois do
(id) COMMIT implícito do segundo
); comando inicia-se uma nova
transacção.

2 insert into teste (id,nome) values Dentro da transacção são inseridas


(1,'José'); várias linhas na tabela TESTE.
insert into teste (id,nome) values Depois verificamos que as linhas
(2,'João'); estão lá. Estas alterações ainda
insert into teste (id,nome) values não foram confirmadas.
(3,'joão');
insert into teste (id,nome) values
(4,'joaquim');
select * from teste;

Prof: Msc. Hugo Dias Dos Santos


1. Transacção
3 SAVEPOINT Joao_1; Criar o SAVEPOINT
133 Joao_1
4 update teste Alterar o nome 'joão' para
set nome='JOAO' 'JOAO'
where nome = 'joão';
5 SAVEPOINT Joao_2; Criar o SAVEPOINT
Joao_2

6 select * from teste; Verificar que o update


anterior foi bem sucedido.
A transacção ainda não
terminou, pelo que as
alterações ainda não são
definitivas

7 update teste Alterar o nome 'josé' para


set nome='JOSE' 'JOSE'
where nome = 'josé';

Prof: Msc. Hugo Dias Dos Santos


1. Transacção
8 select * from teste; Verificar que o update anterior foi bem
sucedido.
134 As duas alterações feitas na
transacção são visíveis, mas ainda não
definitivas.
9 rollback to savepoint Desfazer as alterações até ao SAVEPOINT
Joao_2; Joao_2
10 select * from teste; Verificar que o update JOSE foi desfeito,
mas ainda temos o update JOAO
11 rollback to savepoint Desfazer as alterações até ao SAVEPOINT
Joao_1; Joao_1
12 select * from teste; Verificar que o update JOAO foi desfeito

13 rollback; Desfazer as alterações até ao inicio da


transacção
14 select * from teste; Verificar que a tabela náo tem linhas. Os
comandos INSERT fazem parte da
transacção e foram desfeitos.
Um comando COMMIT executado no meio dos comandos anteriores tornaria
as alterações feitas até aí definitivas, e portanto um ROLLBACK posterior não
Prof: Msc. Hugo Dias Dos capaz
seria Santos de as desfazer.
1. Transacção / AUTOCOMMIT
135
Dentro do ambiente SQL*Plus e em alguns clientes Oracle (por exemplo o TOAD ou o
SQL Navigator) existe a opção AUTOCOMMIT que permite a confirmação implicita de
um comando logo que termina a sua execução.
Quando esta opção está activa cada comando é uma transacção.
Uma alteração a um dado implica o "esmagamento" de um novo valor sobre um valor
antigo.
Para possibilitar o ROLLBACK da alteração a base de dados necessita guardar o valor
antigo, o que ocorre nas seguintes circunstâncias:
 Quando é feito um UPDATE ou DELETE na própria transacção, sendo guardado enquanto esta estiver a
decorrer;
 Quando a nossa transacção está a fazer consultas (SELECT) e possui o nível de isolamento SERIALIZABLE
e existe outra transacção que ao mesmo tempo altera os dados que a nossa está a ler. A imagem anterior
dos dados é mantida por causa do nível de isolamento e enquanto a nossa transacção não terminar;
Do ponto de vista de desempenho ao activar a opção AUTOCOMMIT estamos a
beneficiar a base de dados. Isto porque o volume de dados necessário para fazer
ROLLBACK aumenta com o aumento do número de instruções que formam a transacção
e neste caso temos apenas uma.
No exemplo abaixo vemos como activar e desactivar a opção AUTOCOMMIT. Esta
sintaxe é válida no SQL*PLus:
set autocommit on;
Prof: Msc. Hugo Dias Dos Santos
2. Bloqueios
136

Numa base de dados, os dados são consultados e


alterados concorrentemente pelos vários utilizadores.
O que acontece se dois utilizadores tentarem alterar o
mesmo dado ao mesmo tempo?
Em regra geral o primeiro a chegar activa um bloqueio
(LOCK) que só é retirado quando a sua transacção
terminar.
A segunda transacção terá que esperar que o bloqueio
seja retirado, o que só acontece quando a primeira
transacção termina.

Prof: Msc. Hugo Dias Dos Santos


2.1 Bloqueio em actualização de dados
137
 O exemplo abaixo mostra como uma actualização de dados
entre duas sessões diferentes activa um bloqueio:
Tempo sessão1 Sessão 2 comentário
1 drop table teste; Na sessão 1 removemos a
create table teste ( tabela TESTE (caso exista) e
id number(10,0), recriamo-la. São dois
nome varchar2(10), comandos DDL, sendo cada
constraint pk_teste um deles uma transacção
primary key (id)); com COMMIT implícito.
Depois do COMMIT
implícito do segundo
comando inicia-se uma nova
transacção na sessão 1.

Prof: Msc. Hugo Dias Dos Santos


2.1 Bloqueio em actualização de dados
138

2 insert into teste (id,nome) A sessão 1 insere várias linhas na


values (1,'aaaaaa'); tabela TESTE e confirma as
insert into teste (id,nome) alterações.
values (2,'bbbbbb');
insert into teste (id,nome)
values (3,'cccccc');
commit;
3 select * from teste; A sessão 1 inicia uma transacção
update teste set que muda o nome da linha 1. Esta
nome='AAAA‘ where id=1; alteração não é confirmada e
select * from teste; portanto a transacção não termina.
A linha recebe um bloqueio (LOCK)
que se manterá activo enquanto a
transacção não terminar.

Prof: Msc. Hugo Dias Dos Santos


2.1 Bloqueio em actualização de dados
4 select * from teste;139 A sessão 2 inicia uma transacção
update teste que muda o nome da linha 2.
set nome='BBBBBB' Esta alteração não é confirmada
where id=2; e portanto a transacção não
select * from teste; termina.
5 update teste Dentro da mesma transacção
set nome='aaaAAA' iniciada no passo anterior a
where id=1; sessão 2 tenta mudar o nome da
linha 1. No passo 3 a sessão 1
bloqueou o acesso a esta linha,
pelo que a sessão 2 fica à espera
que a sessão 1 levante o
bloqueio.
6 commit; A sessão 1 termina a transacção
e retira o bloqueio.
7 select * from teste; A sessão 2 fica desbloqueada e
continua a transacção, fazendo a
alteração.

Prof: Msc. Hugo Dias Dos Santos


2.1 Bloqueio em actualização de dados
140

8 select * from A sessão 1 ainda não vê as


teste; alterações feitas pela sessão 2
porque estas não foram
confirmadas.

9 commit; A sessão 2 termina a transacção


confirmando as alterações.

tempo Sessão 1 Sessão 2 comentário

Prof: Msc. Hugo Dias Dos Santos


2.2 Bloqueio infinito (DEAD LOCK)
141

O ponto anterior mostra que uma transacção que


pretenda alterar um dado que está bloqueado fica à
espera que o LOCK seja libertado.
Este facto origina situações em que duas transacções
concorrentes ficam à espera uma da outra
indefinidamente, o que é conhecido por "DEAD
LOCK“.
 Esta situação ilustra-se no exemplo abaixo:

Prof: Msc. Hugo Dias Dos Santos


2.2 Bloqueio infinito (DEAD LOCK)
Tempo sessão1 Sessão 2 comentário
1 drop table teste; 142 Na sessão 1 removemos a
create table teste ( tabela TESTE (caso exista) e
id number(10,0), recriamo-la. São dois
nome varchar2(10), comandos DDL, sendo cada
constraint pk_teste um deles uma transacção
primary key (id) com COMMIT implícito.
); Depois do COMMIT
implícito do segundo
comando inicia-se uma nova
transacção na sessão 1.
2 insert into teste (id, A sessão 1 insere várias
nome) values (1,'aa'); linhas na tabela TESTE e
insert into teste confirma as alterações.
(id,nome) values
(2,'bbbbbb');
insert into teste (id,
nome) values (3,'cccc');
commit;

Prof: Msc. Hugo Dias Dos Santos


2.2 Bloqueio infinito (DEAD LOCK)
Tempo sessão1 Sessão 2 comentário
3 update teste set 143 A sessão 1 inicia uma
nome='AA' transacção que muda o nome
where id=1; da linha 1. Esta alteração não
é confirmada e portanto a
transacção não termina. A
linha recebe um bloqueio
(LOCK) que se manterá
activo enquanto a transacção
não terminar.
4 update teste A sessão 2 inicia uma
set transacção que muda o nome
nome='BBBB' da linha 2. Esta alteração
where id=2; não é confirmada e portanto
a transacção não termina. A
linha recebe um bloqueio
(LOCK) que se manterá
activo enquanto a transacção
não terminar.

Prof: Msc. Hugo Dias Dos Santos


2.2 Bloqueio infinito (DEAD LOCK)
144
Tempo sessão1 Sessão 2 comentário
5 update teste A sessão 1 tenta alterar a
set linha 2 que está bloqueada
nome='bbbBBB' pela sessão 2 e por isso fica à
where id=2; espera.
6 update teste set A sessão 2 tenta alterar a
nome='aaaAAA' linha 1 que está bloqueada
where id=1; pela sessão 1 e por isso fica à
espera.
7 update teste As duas sessões estão à
* espera uma da outra,
ERROR at line 1: situação que se manteria
ORA-00060: eternamente, se não fosse a
deadlock intervenção da base de dados
detected while que detecta e termina o
waiting for comando UPDATE da sessão
resource 1.

Prof: Msc. Hugo Dias Dos Santos


2.2 Bloqueio infinito (DEAD LOCK)
Tempo sessão1 Sessão 2 comentário
8 select * from 145 A transacção da sessão 1 ainda não
teste; terminou. O primeiro UPDATE
mantém-se mas o segundo foi abortado.
O LOCK sobre a linha 1 continua a
bloquear a sessão 2. A sessão 1 pode
decidir abortar o trabalho ou tentar de
novo.
9 rollback; Na transacção da sessão 1 o primeiro
comando correu bem, mas o segundo
correu mal, pelo que foi decidido
cancelar a transacção e portanto os
dados voltam à versão inicial.
10 Select * from Logo que a sessão 1 liberta a linha 1 a
teste; sessão 2 prossegue a transacção em
curso, alterando a linha com ID 1;
11 commit; A transacção da sessão 2 termina e os
respectivos LOCKS são libertados. A
sessão 1 já pode ver as alterações;

Prof: Msc. Hugo Dias Dos Santos


2.2 Bloqueio infinito (DEAD LOCK)
146

Os exemplos ilustrados anteriormente mostram que os


DEAD LOCKS são detectados de forma automatica pela base
de dados, sendo terminada a transacção que lhe deu origem;
Embora os DEAD LOCKs sejam resolvidos de forma
automática pela base de dados, são situações que devem ser
evitadas, pois uma das transacções termina de forma
inesperada;
Os DEAD LOCKs podem ser evitados se todas as transacções
que fazem actualizações sucessivas aos mesmos dados
seguirem a mesma sequência, o que no nosso exemplo
poderia ser por ordem crescente de ID.

Prof: Msc. Hugo Dias Dos Santos


2.3 SELECT FOR UPDATE
147

O comando SELECT possui a cláusula FOR UPDATE


que permite activar um LOCK sobre todas as linhas
seleccionadas pelo comando.
Este LOCK impede que outras sessões da base de dados
alterem estas linhas enquanto a transacção actual não
terminar.
Este comando permite bloquear linhas antes de as
alterar, mas deve ser usado com muita cautela, pois
enquanto o LOCK está activo os outros utilizadores não
podem fazer alterações nessas linhas, o que pode gerar
tempos de espera enormes.
Prof: Msc. Hugo Dias Dos Santos
Tempo sessão1
1
2.3 SELECT
drop table teste;
FOR UPDATE
Sessão 2 comentário
Depois do COMMIT implícito do
create table teste (id segundo comando inicia-se uma nova
number(10,0), 148 transacção na sessão 1.
nome varchar2(10),
constraint pk_teste
primary key (id));

2 insert into teste (id, A sessão 1 insere várias linhas na


nome) values (1,‘aa'); tabela TESTE e confirma as
insert into teste (id, alterações.
nome) values (2,'bb');
insert into teste (id,
nome) values (3,'cc');
commit;
3 select id, nome A sessão 1 inicia uma transacção
from teste executando o comando SELECT com a
where id=1 cláusula FOR UPDATE. A base de
for update; dados coloca um LOCK sobre a linha
com ID 1. Note que no resultado do
comando SELECT não há nenhuma
indicação de que foi usada a cláusula
FOR UPDATE;
Prof: Msc. Hugo Dias Dos Santos
Tempo sessão1 Sessão 2 comentário
4 2.3 SELECT FOR
select id, nome UPDATE
A sessão 2 inicia uma transacção
from teste executando o mesmo comando
where id=1 149 SELECT com a cláusula FOR
for update; UPDATE. A sessão 2 vai ficar
bloqueada esperando que a sessão 1
liberte o LOCK;
5 update teste A sessão 1 altera os dados da linha 1,
set enquanto a sessão 2 continua à
nome='AAAA' espera;
where id=1;
6 commit; A sessão 1 termina a transacção e
liberta o LOCK. A sessão 2 retoma o
trabalho bloqueando a linha 1;

7 commit; A sessão 2 termina a transacção e


liberta o LOCK;

Prof: Msc. Hugo Dias Dos Santos


2.3 SELECT FOR UPDATE
150

No exemplo anterior a sessão 2 ficou bloqueada


quando tentou aceder a um recurso que tinha um
LOCK.
A sessão 2 não recebe uma estimativa do tempo de
espera, pois este depende apenas da sessão 1.
A opção NO WAIT pode ser adicionada à cláusula
FOR UPDATE, permitindo a interrupção imediata do
comando SELECT FOR UPDATE quando o recurso
acedido se encontra bloqueado.
O exemplo a seguir mostra a sua utilização:

Prof: Msc. Hugo Dias Dos Santos


Tempo sessão1 Sessão 2 comentário
1 drop table teste; Na sessão 1 removemos a tabela
create table teste ( TESTE (caso exista) e recriamo-la.
id number(10,0), 151 São dois comandos DDL, sendo cada
nome varchar2(10), um deles uma transacção com
constraint pk_teste COMMIT implícito. Depois do
primary key (id) COMMIT implícito do segundo
); comando inicia-se uma nova
transacção na sessão 1.
2 insert into teste (id, A sessão 1 insere várias linhas na
nome) values (1,'aa'); tabela TESTE e confirma as
insert into teste (id, alterações.
nome) values(2,'bb');
insert into teste (id,
nome) values (3,'cc');
commit;
3 select id, nome A sessão 1 inicia uma transacção
from teste executando o comando SELECT com
where id=1 a cláusula FOR UPDATE. A base de
for update; dados coloca um LOCK sobre a linha
com ID 1.

Prof: Msc. Hugo Dias Dos Santos


Tempo sessão1 Sessão 2 comentário
4 select id, nome from A sessão 2 inicia uma transacção
teste where id in (1,2) executando um comando SELECT
for update nowait;152 com a cláusula FOR UPDATE. Este
from teste * comando selecciona duas linhas,
ERROR at line 2: tendo uma delas um LOCK. Como foi
ORA-00054: resource usada a opção NOWAIT a execução do
busy and acquire with comando é abortada de imediato.
NOWAIT specified
5 select id,nome from A sessão 2 executa o mesmo comando
teste where id in (1,2) que no exemplo anterior, mas desta
for update of vez usa as opções OF e WAIT. A
teste.nome wait 10; primeira opção é muito útil quando o
from teste * ERROR query envolve várias tabelas (JOIN),
at line 2: ORA-30006: pois evita o bloqueamento de todas as
resource busy; acquire linhas de todas as tabelas envolvidas.
with WAIT timeout A segunda opção permite definir um
expired tempo de espera, em segundos, pela
libertação do LOCK.
6 commit; A sessão 1 termina a transacção e
liberta o LOCK.

Prof: Msc. Hugo Dias Dos Santos


2.4 Bloqueio e integridade referencial
153

Se existir um relacionamento via Foreign Key entre


uma tabela Main e uma tabela Child, a base de dados
vai gerar bloqueios especiais em Child sempre que
Main sofre
INSERT,
UPDATE ou
DELETE sobre a PK

Prof: Msc. Hugo Dias Dos Santos


3. Nível de isolamento de uma transacção
154
Vamos considerar uma transacção que apenas lê dados.
Enquanto está a ser executada, o que pode demorar uns segundos ou
algumas horas, os dados que ela lê podem ser alterados por outras
transacções, o que coloca em perigo a integridade do seu resultado.
Este problema coloca-se apenas com os dados de leitura, pois quando a
transacção altera dados a base de dados activa LOCKS que impedem a sua
modificação em simultâneo por outras transacções.
Em termos teóricos, enquanto a transacção decorre os dados por ela vistos
não podem ser alterados.
A solução fácil para este problema é bloquear os dados que estão a ser
lidos(LOCK), o que impediria alterações por outros utilizadores.
Mas isto viola um princípio importante: numa base de dados quem lê
dados não pode prejudicar quem escreve.
Para ultrapassar este problema a base de dados deve fornecer um
mecanismo que permita à transacção, durante a sua duração, trabalhar
com a imagem inicial dos dados, tornando-a assim imune a alterações.
Prof: Msc. Hugo Dias Dos Santos
3. Nível de isolamento de uma transacção
155
O nível de isolamento de uma transacção mede a independência desta em relação
às alterações nos dados por ela lidos feitas por outras transacções.
Uma transacção tem um elevado nível de isolamento se for absolutamente imune a
essas alterações.
Pelo contrário, será pouco isolada se os seus resultados perderem integridade com as
alterações feitas por outras transacções.
A norma SQL92 define 4 níveis de isolamento de transacções aos quais
correspondem diferentes graus de impacto nos resultados.
Estes níveis são definidos tendo em conta 3 situações que podem ocorrer quando são
executadas simultaneamente duas transacções que acedem aos mesmos dados
concorrentemente:
 DIRTY READS - A transacção 2 consegue ler dados que foram alterados pela transacção 1 embora a
transacção 1 ainda não tenha confirmado essas alterações;
 NONREPEATABLE (FUZZY) READS - Dentro da mesma transacção são executadas duas consultas.
O resultado da primeira difere do resultado da segunda porque tem menos uma linha ou porque uma
linha tem um conteúdo diferente. Isto porque entre a primeira e a segunda consulta outra transacção
apagou uma linha ou modificou uma linha;
 PHANTOM READS - Dentro da mesma transacção são executadas duas consultas. O resultado da
primeira difere do resultado da segunda porque tem menos linhas. Isto porque entre a primeira e a
segunda consulta outra transacção inseriu uma nova linha;
Prof: Msc. Hugo Dias Dos Santos
3. Nível de isolamento de uma transacção
156

O quadro abaixo descreve a forma como os 4 níveis


de isolamento definidos pela norma SQL92 se
comportam perante as 3 situações referidas antes:
NONREPEATABLE (FUZZY)
Nível de isolamento DIRTY READS PHANTOM READS
READS

READ UNCOMMITED Pode ocorrer Pode ocorrer Pode ocorrer

READ COMMITED Não ocorre Pode ocorrer Pode ocorrer

REPEATABLE READ Não ocorre Não ocorre Pode ocorrer

SERIALIZABLE Não ocorre Não ocorre Não ocorre

Exemplo em anexo C.
Prof: Msc. Hugo Dias Dos Santos
4. SERIALIZABLE / SERIABILIDADE
157

 Se o utilizador quizer um elevado nível de isolamento para a sua


transacção a base de dados disponibiliza o modo de funcionamento
SERIALIZABLE, que pode ser activado ao nível da sessão ou ao nível da
transacção, usando os comandos abaixo:

--alterar ao nível da sessão


ALTER SESSION SET ISOLATION_LEVEL = SERIALIZABLE;
--alterar ao nível da transacção EXEMPLO
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

O nível de isolamento por omissão pode ser reposto


com os comandos abaixo:
--alterar ao nível da sessão
ALTER SESSION SET ISOLATION_LEVEL = READ COMMITTED;
--alterar ao nível da transacção
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;

Prof: Msc. Hugo Dias Dos Santos


Tempo Sessão 1 Sessão 2 Comentário

drop table teste; Na Sessão 1 removemos a tabela


create table teste TESTE (caso exista) e recriamo-la. São
(id number(10,0), 158 dois comandos DDL, sendo cada um
1 nome varchar2(10), deles uma transacção com COMMIT
constraint implícito. Depois do COMMIT implícito
pk_teste primary do segundo comando inicia-se uma nova
key (id)); transacção na Sessão 1.

commit;
Forçar o inicio de uma nova
SET TRANSACTION
transacção na Sessão 2.
ISOLATION
Definir ao nível da transacção o nível
2 LEVEL
SERIALIZABLE; de isolamento SERIALIZABLE.
Select*from Verificar que a nova tabela já é
teste; visível.
insert into teste
(id,nome) values
(1,'aaaaaa');
insert into teste (id,
A Sessão 1 insere várias linhas na tabela
3 nome)values
(2,'bbbbbb'); TESTE mas não confirma as alterações.
insert into teste (id,
nome) values
(3,'cccccc');

Prof: Msc. Hugo Dias Dos Santos


select * from As alterações feitas na tabela TESTE pela Sessão 1 são
4 teste; visiveis na própria sessão.

159
As alterações feitas na tabela TESTE pela Sessão 1
select * from
5 teste; ainda não são visíveis na Sessão 2 pois ainda não estão
confirmadas.

A Sessão 1 confirma as alterações e termina a


6 commit;
transacção actual.

As alterações feitas na tabela TESTE não ficam visíveis


select * from
7 teste; na Sessão 2, mesmo que já confirmadas, visto que foi
definido como nível de isolamento SERIALIZABLE.

update teste
set nome= 'CCCCCC' A Sessão 1 executa um UPDATE e confirma a alteração,
8 where id=3; terminando a transacção. Esta alteração é visível na
commit; Sessão 1.
Select*from teste;

A Sessão 2 continua na mesma transacção e executa o


select * from
9 teste; mesmo SELECT pela quarta vez, obtendo o memso
resultado das execuções anteriores.

Prof: Msc. Hugo Dias Dos Santos


delete from teste A Sessão 1 apaga uma linha e
where id = 2;
confirma a alteração, terminando
10 commit; 160
select * from a transacção. A alteração é visivel
teste; na Sessão 1.

A Sessão 2 continua na mesma


transacção e executa o mesmo
select *
11 from teste; SELECT pela quinta vez,
obtendo o mesmo resultado das
execuções anteriores.

insert into teste


(id,nome) values
A Sessão 1 insere uma linha e
(4,'dddddd'); confirma a alteração, terminando
12 commit;
select * from
a transacção. A alteração é visivel
teste; na Sessão 1.
Prof: Msc. Hugo Dias Dos Santos
161
A Sessão 2 continua na mesma
select * transacção e executa o mesmo SELECT
13 from teste; pela sexta vez, obtendo o mesmo
resultado que nas execuções anteriores.

14 commit; A Sessão 2 termina a transacção actual.

select * A Sessão 2 finalmente vê os dados


15 from teste; confirmados pela Sessão 1.

Prof: Msc. Hugo Dias Dos Santos


4. SERIALIZABLE / SERIABILIDADE
162

Este exemplo mostra que a Sessão 2 só consegue ver as alterações feitas pela Sessão 1
que foram confirmadas e que a Sessão 2 executou o mesmo SELECT várias vezes dentro
da mesma transacção, tendo obtido sempre o mesmo resultado, mesmo com transacções
externas a fazerem INSERT, UPDATE e DELETE. O grau de isolamento foi total;
Como o isolamento foi definido ao nível da transacção, quando esta termina a sessão
volta a trabalhar com o nível READ COMMITED.
Do ponto de vista teórico o nível SERIALIZABLE é muito interessante, mas na prática
obriga a base de dados a um trabalho extra muito pesado, pois tem que guardar uma
fotografia dos dados num determinado instante no tempo. Isto consome espaço
adicional nos segmentos de rollback, que têm armazenamento finito, e obriga a uma
carga acrescida de I/O e CPU.
Na maior parte das situações o nível READ COMMITED é suficiente, sendo por isso o
nível por omissão. O programador deve estar atento às situações especiais onde é
requerido o nível SERIALIZABLE para o activar.
OBS: Até há pouco tempo atrás algumas bases de dados disponíveis no mercado não
faziam sequer READ COMMITED.

Prof: Msc. Hugo Dias Dos Santos


Administração
VI
163

8.1 - Backup e Restore


 8.2 - Importar e Exportar

 8.3 - Converter

 8.4 - Otimização e
Desempenho
Prof: Msc. Hugo Dias Dos Santos
164

Ob
riga
Pel do
Ate a
nçã
o
Perguntas ou dúvidas???
Prof:Prof:
Santos
Msc. Hugo Dias Dos Santos
Outros Comandos
165

CONNECT nomeUser ou database;


SHOW TABLES ou SHOW TABLES IN
nomeDatabase: Mostra todas as tabelas disponiveis
na base de dados.
?: Mostra a lista de comandos disponiveis.
Clear:
Status: informações interessantes.

Prof: Msc. Hugo Dias Dos Santos


BIBLIOGRAFIA
166

[1] “Refactoring Databases: Evolutionary Database Design”,


Scott W. Ambler, S., Sadalage, P. 2006, Addison-Wesley
[2] “Database Administration: Pratices and Procedures”;
Mullins, C. 2002; Addison-Wesley
[3]Database Systems. P. Atzeni, S. Ceri, S. Paraboschi and R.
 Torlone. McGraw-Hill. 1999.
 [4]Database System Concepts. A. Silberschatz, H.F. Korth
and
 S. Sudarshan. McGraw-Hill. 6th Ed, 2010.
 [5]Database Management Systems. R. Ramakrishnan and J.
 Gehrke. McGraw-Hill. 2nd Ed, 2002.

Prof: Msc. Hugo Dias Dos Santos


BIBLIOGRAFIA
167

Apostila de Banco de Dados e SQL: Autores: Prof. Jorge


Surian e Prof. Luiz Nicochelli 2014
INTRODUÇÃO A BANCO DE DADOS: Osvaldo
Kotaro Takai, Isabel Cristina Italiano, João Eduardo
Ferreira: DCC-IME-USP – Fevereiro - 2005
Projeto de Banco de Dados (PDF). Universidade Federal
do Rio Grande do Sul pp. V. Juliano Ribeiro (1998).
Página visitada em 15 de Agosto de 2014.
Visão geral de Segurança em Bancos de Dados (PDF).
Universidade Católica de Brasília pp. 1. Ly-online.
Página visitada em 16 de Agosto de 2014.

Prof: Msc. Hugo Dias Dos Santos


BIBLIOGRAFIA
168

BANCO DE DADOS WEB: Autores: Professor


Luciano Roberto Rocha
Apostila de banco de dados: Takai; I.C.Italiano; J.E.
Ferreira
http://aserlorenzo.com/manSQL/Oracle/toc.htm#D
ML
; Banco de Dados - SQL Server

Prof: Msc. Hugo Dias Dos Santos


ANEXO A Lista de Funções do SQL/oracle
169
As funções SQL são As funções de uma linha
divididas em categorias, são dividias em sub-
segue: categorias, segue:

– Funções de uma linha – Funções Numéricas


– Funções de agregaçoes – Funções Alfanuméricas
(ou agregadas) – Funções de Data e Hora
– Funções analíticas – Funções de conversão
– Funções de referência – Funções de coleção
à objeto – Funções variadas
– Funções de modelo
– Funções definidas
pelo usuário
Prof: Msc. Hugo Dias Dos Santos
ANEXO A Lista de Funções do SQL
170
Funções de Uma Linha POWER
Numéricas
ABS REMAINDER
ACOS ROUND(numero)
ASIN
ATAN SIGN
ATAN2 SIN
BITAND
CEIL SINH
COS SQRT
COSH
EXP TAN
FLOOR TANH
LN
LOG TRUNC(numero)
MOD
NANVL
WIDTH_BUCKET

Prof: Msc. Hugo Dias Dos Santos


ANEXO A Lista de Funções do SQL
171
 Caracter
CHR
Caracter com retorno
CONCAT
INITCAP
numérico
LOWER
LPAD
ASCII
LTRIM
NLS_INITCAP
INSTR
NLS_LOWER LENGTH
NLSSORT
NLS_UPPER REGEXP_INSTR
REGEXP_REPLACE
REGEEXP_SUBSTR
REPLACE
RPAD
RTRIM
SOUNDEX
SUBSTR
TRANSLATE
TREAT
TRIM
UPPER

Prof: Msc. Hugo Dias Dos Santos


ANEXO A Lista de Funções do SQL
172
 Data/Hora  Conversão
ADD_MONTHS ASCIISTR
CURRENT_DATE BIN_TO_NUM
CURRENT_TIMESTAMP CAST
DBTIMEZONE CHARTOROWID
EXTRACT(data/hora) COMPOSE
FROM_TZ CONVERT
LAST_DAY DECOMPOSE
LOCALTIMESTAMP HEXTORAW
NUMTODSINTERVAL
MONTHS_BETWEEN
NUMTOYMINTERVAL
NEW_TIME
RAWTOHEX
NEXT_DAY
RAWTONHEX
NUMTODSINTERVAL
RAWIDTOCHAR
NUMTOYMINTERVAL RAWIDTONCHAR
ROUND(data) SCN_TO_TIMESTAMP
SESSIONTIMEZONE TIMESTAMP_TO_SCN
SYS_EXTRACT_UTC TO_BINARY_DOUBLE
SYSDATE TO_BINARY_FLOAT
SYSTIMESTAMP TO_CHAR(caracter)
TO_CHAR(data/hora) TO_CHAR(data/hora)
TO_TIMESTAMP TO_CHAR(numero)
TO_TIMESTAMP_TZ TO_CLOB
TO_DSINTERVAL TO_DATE
TO_YMINTERVAL TO_DSINTERVAL
TRUNC(data) TO_LOB
TZ_OFFSET

Prof: Msc. Hugo Dias Dos Santos


ANEXO A Lista de Funções do SQL
173
TO_MULTI_BYTE Coleção
TO_NCHAR(data/hora) CARDINALITY
TO_NCHAR(numero) COLLECT
TO_NCLOB POWERMULTISET
TO_NUMBER POWERMULTISET_BY
TO_DSINTERVAL _CARDINALITY
TO_SINGLE_BYTE SET
TO_TIMESTAMP
TO_TIMESTAMP_TZ
TO_YMINTERVAL
TRANSLATE … USING
UNISTR

Prof: Msc. Hugo Dias Dos Santos


ANEXO A Lista de Funções do SQL
174
Variadas ORA_HASH

BFILENAME PATH
COALESCE PRESENTNNV
PRESENTV
CV PREVIOUS
DECODE SYS_CONNECT_BY_PATH
DEPTH SYS_CONTEXT
DUMP SYS_DBURIGEN
EMPTY_BLOB, EMPTY_CLOB SYS_EXTRACT_UTC
EXISTSNODE SYS_GUID
EXTRACT(XML) SYS_TYPEID
SYS_XMLAGG
EXTRACTVALUE
SYS_XMLGEN
GREATES UID
LEAST UPDATEXML
LNNVL USER
NLS_CHARSET_DECL_LEN USERENV
NLS_CHARSET_ID VSIZE
NLS_CHARSET_NAME XMLAGG
XMLCOLATTVAL
NULLIF
XMLCONCAT
NVL XMLFOREST
NVL2 XMLSEQUENCE
XMLTRANSFORM

Prof: Msc. Hugo Dias Dos Santos


ANEXO A Lista de Funções do SQL
175

Funções de agregação (ou


agregadas)
Funções de grupo MIN

AVG PERCENTILE_CONT
PERCENTILE_DISC
COLLECT PERCENT_RANK
CORR RANK
CORR_* REGR_Funções (Regressão Linear)
COUNT STATS_CROSSTAB
COVAR_POP STATS_F_TEST
COVAR_SAMP STATS_KS_TEST
STATS_MODE
CUME_DIST
STATS_MW_TEST
DENSE_RANK STATS_ONE_WAY_ANOVA
FIRST STATS_T_TEST_*
GROUP_ID STATS_WSR_TEST
GROUPING STDDEV
GROUPING_ID STDDEV_POP
LAST STDDEV_SAMP
SUM
MAX
VAR_POP
MEDIAN VAR_SAMP
VARIANCE

Prof: Msc. Hugo Dias Dos Santos


ANEXO A Lista de Funções do SQL
176
Funções de Referência a
Funções Modelo
Objeto

DEREF CV
MAKE_REF ITERATION_NUMBE
REF R
REFTOHEX7 PRESENTNNV
VALUE PRESENTV
PREVIOUS

Prof: Msc. Hugo Dias Dos Santos


ANEXO A Lista de Funções do SQL
177

Funções Analíticas
As funções analíticas são utilizadas principalmente para por exemplo a extração de
dados gerenciais na base de dados. O Oracle é o banco que mais possui dessas
funções, mas muitos SGBDs atuais já contém essas funções disponíveis em suas
novas versões.
Vamos dar um exemplo para utilizar essas funções:
Imagine que você tenha um sistema de cobrança na sua empresa. Seus
recebimentos são baseados em contratos, ou seja, todos os meses você realiza
vendas e, como as vendas são financiadas, você tem um fluxo freqüente de parcelas.
Você recebe a seguinte missão do diretor financeiro: “preciso saber quais são os
contratos com os maiores valores de prestação a cada mês”. Seria relativamente
simples oferecer esta resposta caso o diretor não tivesse incluído “contratos” na
frase. Saber o valor das prestações a cada mês é muito simples.
Para resolver este problema, você precisará utilizar a partícula OVER do comando
SELECT. Com esta opção é possível, além de extrair dados sumarizados, mostrar as
linhas analíticas (detalhe) ao mesmo tempo.

Prof: Msc. Hugo Dias Dos Santos


ANEXO A Lista de Funções do SQL
178

Ao utilizar o OVER você poderá estabelecer uma “quebra” (ou particionamento)
para sua análise. Veja no comando a seguir:
Código:
SELECT to_char( dtvenc, ‘MM-YYYY’) dtvenc, cdcontr,
MAX( vlprest ) OVER (PARTITION BY to_char(dtvenc,’YYYYMM’))
max_prest, vlprest
FROM vRECEBER
WHERE dtvenc > sysdate;
O destaque mostra a atuação da função de grupo (MAX) e do particionamento da
pesquisa (OVER). Neste caso, está sendo mostrado o maior valor de prestação de
cada mês. Este resultado será mostrado na coluna MAX_PREST. O resultado pode
ser observado na imagem abaixo:
Outro ponto que merece destaque é a possibilidade de mostrarmos os dados
analíticos (VLPREST, CDCONTR e DTVENC) ao mesmo tempo que trabalhamos o
maior valor do mês (MAX_PREST). Desta forma é possível observarmos quais são
os contratos, os valores originais das prestações e o maior valor daquele mês.

Prof: Msc. Hugo Dias Dos Santos


ANEXO A Lista de Funções do SQL
179
Naturalmente não é exatamente isto que o diretor pediu… Ele quer apenas o maior valor do
mês e qual é o contrato. Podemos notar que o maior valor do mês 10/2006 é o contrato 56
cujo valor é R$ 695,09 (aliás, o único contrato deste mês). Já nos meses seguintes nota-se
que o maior valor do mês 11/2006 é R$ 11.452,35 do contrato 33. E assim sucessivamente.
Para oferecermos apenas o resultado esperado pelo diretor, precisamos ir além no nosso
comando:
Código:
SELECT dtvenc, cdcontr, vlprest
FROM (SELECT to_char( dtvenc, ‘MM-YYYY’) dtvenc, cdcontr,
MAX( vlprest ) OVER (PARTITION BY to_char(dtvenc,’YYYYMM’))
max_prest, vlprest
FROM vRECEBER
WHERE dtvenc > sysdate
) WHERE vlprest = max_prest;
Ao se utilizar a subquery na cláusula FROM, pode-se extrair somente as linhas que
interessam, ou seja, aqueles contratos e prestações que têm o maior valor de prestação a cada
mês (comparação do MAX_PREST e do VLPREST) na segunda cláusula WHERE. O
resultado pode ser visto na imagem abaixo:

Prof: Msc. Hugo Dias Dos Santos


ANEXO B 180

Prof: Msc. Hugo Dias Dos Santos


ANEXO B: MASCARA_DATA
181

MASCARA_DATA
A tabela abaixo mostra os valores possíveis para a máscara
da data:
FORMATO: SIGNIFICADO
SCC ou CC: Século; 'S' faz preceder de '-' as datas 'BC'
(Antes de Cristo)
YYYY ou SYYYY: Século; 'S' faz preceder de '-' as datas 'BC'
(Antes de Cristo)
YYY ou YY ou Y:Ultimos 3 digitos do ano ou 2 ultimos ou
último digito do ano
Y,YYY:Ano com separador dos milhares nessa posição

Prof: Msc. Hugo Dias Dos Santos


ANEXO B: MASCARA_DATA
182

SYEAR ou YEAR: Ano por extenso (em inglês); 'S' faz


preceder de '-' as datas 'BC' (Antes de Cristo) BC ou AD
Indicador de BC/AD (Antes de Cristo / Depois de Cristo)
B.C. ou A.D.: Indicador de BC/AD com ponto
Q :Trimestre do ano
MM: Mês em número de 1..12
MONTH: Nome do mês preenchido com espaços até 9
caracteres (Setembro)
MON: Nome do mês com três letras (JAN, FEB, MAY,...)
WW, IW ou W: Semana do ano formato Oracle, semana do
ano formato ISO ou semana do mês

Prof: Msc. Hugo Dias Dos Santos


ANEXO B: MASCARA_DATA
183

DDD ou DD ou D:dia do ano, mês ou semana


DAY: Nome do dia da semana, por extenso, preenchido
com espaços até 9 caracteres
DY: Nome do dia da semana com dois caracteres
J: Dia do calendário Juliano; o número de dias desde 31 de
Dezembro de 4713 A.C.
AM ou PM: Indicador de After Moon (AM) ou Post Moon
(PM)
A.M.ou P.M. Indicador de After Moon ou Post Moon com
pontos
HH ou HH12: Hora do dia em formato 1-12

Prof: Msc. Hugo Dias Dos Santos


ANEXO B: MASCARA_DATA
184

HH24: Hora do dia em formato 0-23


MI: Minutos
SS: Segundos
SSSSS: Segundos decorridos desde a meia-noite
FM: Prefixo que pode ser acrescentado aos códigos anteriores;
utilizado em MONTH ou DAY suprime o preenchimento de
espaços; usado com números suprime os zeros à esquerda
TH, SP, SPTH, THSP: Sufixos que converte um número em ordinal
ou por extenso; usando os dois fica número por extenso ordinal
/.,: Os símbolos de pontuação são reproduzidos no resultado
"string“ A string é reproduzida no resultado mas tem que vir entre
aspas

Prof: Msc. Hugo Dias Dos Santos


185

ANEXO
C
Prof: Msc. Hugo Dias Dos Santos
ANEXO C: Os níveis de isolamento
186

Os níveis de isolamento disponibilizados na base de


dados Oracle são READ COMMITTED e
SERIALIZABLE.
Por omissão funciona no modo READ COMMITTED
o que significa que não é possível ocorrerem DIRTY
READS, mas podem ocorrer NONREPEATABLE
(FUZZY) READS ou PHANTOM READS.
O exemplo a seguir apresentado comparam os dois
níveis de isolamento e a forma como a transacção é
por eles afectada.

Prof: Msc. Hugo Dias Dos Santos


ANEXO C: Os níveis de isolamento /READ COMMITTED
187
Tempo Sessão 1 Sessão 2 Comentário
drop table teste; Na Sessão 1 removemos a tabela
create table teste ( TESTE (caso exista) e recriamo-la. São
id number(10,0), dois comandos DDL, sendo cada um
1 nome varchar2(10), deles uma transacção com COMMIT
constraint pk_teste primary implícito. Depois do COMMIT
key (id) implícito do segundo comando inicia-
); se uma nova transacção na Sessão 1.

commit; Forçar o inicio de uma nova


2 select * from transacção na Sessão 2 e verificar que
teste;
a nova tabela já é visível.
insert into teste (id,nome)
values (1,'aaaaaa');
A Sessão 1 insere várias linhas na
insert into teste (id,nome)
3 tabela TESTE mas não confirma as
values (2,'bbbbbb');
alterações.
insert into teste (id,nome)
values (3,'cccccc');

Prof: Msc. Hugo Dias Dos Santos


As alterações feitas na tabela TESTE pela Sessão 1 são visiveis
4 select * from teste;
na própria sessão.

select * from As alterações feitas na tabela TESTE pela Sessão 1 ainda não são
5 teste; visíveis na Sessão 2 pois ainda não estão confirmadas.
188
6 commit; A Sessão 1 confirma as alterações e termina a transacção actual.

As alterações feitas na tabela TESTE pela Sessão 1 ficam visíveis


na Sessão 2 visto que já foram confirmadas (READ
select * from
7 teste; COMMITED). É a terceira vez que executamos o mesmo
SELECT dentro da mesma transacção e obtemos um resultado
diferente. Estamos numa situação PHANTOM READ.
update teste
set nome = 'CCCCCC'
A Sessão 1 executa um UPDATE e confirma a alteração,
8 where id=3;
commit; terminando a transacção. Esta alteração é visível na Sessão 1.
select * from teste;

A Sessão 2 continua na mesma transacção e executa o mesmo


select * from SELECT pela quarta vez, obtendo um resultado diferente das
9 teste; execuções anteriores. Estamos numa situação
NONREPEATABLE (FUZZY) READ.

delete from teste


where id = 2; A Sessão 1 apaga uma linha e confirma a alteração, terminando a
10 commit; transacção. A alteração é visivel na Sessão 1.
select * from teste;

Prof: Msc. Hugo Dias Dos Santos


A Sessão 2 continua na mesma transacção e executa o
mesmo SELECT pela quinta vez, obtendo um resultado
11
diferente das189
execuções anteriores. Estamos numa situação
NONREPEATABLE (FUZZY) READ.

insert into
teste (id,nome)
values
A Sessão 1 insere uma linha e confirma a alteração,
12 (4,'dddddd');
commit; terminando a transacção. A alteração é visivel na Sessão 1.
select * from
teste;
A Sessão 2 continua na mesma transacção e executa o
select *
mesmo SELECT pela sexta vez, obtendo um resultado
13 from
teste; diferente das execuções anteriores. Estamos numa situação
PHANTOM READ.
14 commit; A Sessão 2 termina a transacção actual.
select *
15 from A Sessão 2 continua a ver o que já via.
teste;

Prof: Msc. Hugo Dias Dos Santos


ANEXO C: Os níveis de isolamento
190

Este exemplo mostra que a Sessão 2 só consegue ver as


alterações feitas pela Sessão 1 que foram confirmadas;
Este exemplo também mostra que a Sessão 2 executou o
mesmo SELECT várias vezes dentro da mesma transacção,
tendo obtido resultados diferentes em cada execução o que
mostra que foi sensível a alterações feitas aos dados por
outras transacções;
Este nível de isolamento evita DIRTY READS, mas não
garante REPEATABLE READS. Por ser um bom
compromisso entre desempenho e coerência de dados é o
nível de isolamento usado por omissão na base de dados
Oracle.

Prof: Msc. Hugo Dias Dos Santos


ANEXO D: Triggers
191

Triggers
Um TRIGGER ou gatilho é um objeto de banco de dados, associado a uma
tabela, definido para ser disparado, respondendo a um evento em
particular. Tais eventos são os comandos da DML (Data Manipulation
Language): INSERT, REPLACE, DELETE ou UPDATE. Podemos
definir inúmeros TRIGGERS em uma base de dados baseados
diretamente em qual dos comandos acima irá dispará-lo, sendo que, para
cada um, podemos definir apenas um TRIGGER. Os TRIGGERS poderão
ser disparados para trabalharem antes ou depois do evento.

CREATE TRIGGER gtNovoCliente


ON CLIENTE
FOR INSERT
PRINT 'Novo Cliente'
GO

Prof: Msc. Hugo Dias Dos Santos


ANEXO E:Vistas / Visualizar/oracle
192

O código de uma VIEW pode ser consultado com um query


USER_VIEWS, ALL_VIEWS ou DBA_VIEW.
A primeira mostra os objectos do tipo VIEW que o próprio
utilizador criou (o utilizador que tem a sessão aberta).
A segunda mostra todos os objectos do tipo VIEW aos quais o
utilizador actual tem acesso de leitura, onde se inclui as VIEWS
que lhe pertencem e aquelas que embora pertençam a outros
utilizadores, estes deram privilégios de leitura ao utilizador actual.
A terceira requer um privilégio especial e mostra todas as VIEWS
definidas dentro da base de dados.
 select * from user_views;
 select * from all_views;
 select * from dba_views; /*requer privilégios especiais*/

Prof: Msc. Hugo Dias Dos Santos


Junção entre três tabelas
193

Firma
Select * from pedido join ped_produto on
(pedido.cod_pedido=ped_produto.cod_pedido) join produto on
(ped_produto.cod_produto=produto.cod_produto);
Firma 4 tabelas
 select cliente.nome, quantidade, produto.nome,
cliente.cod_cliente from (cliente join pedido on
(cliente.cod_cliente=pedido.cod_cliente) join
ped_produto on (pedido.cod_pedido
=ped_produto.cod_pedido)) join produto on
(ped_produto.cod_produto =produto.cod_produto)
where cliente.nome="claudia";
Prof: Msc. Hugo Dias Dos Santos
ANEXO F: DQL / cláusulas
194

ROLLUP: A cláusula ROLLUP é usada juntamente com GROUP BY e


permite agregações sobre grupos de linhas.
Usando funções de grupo conseguimos determinar a soma de salários por
função mas, usando um único query, não conseguimos determinar
também a soma total de todos salários.
Adicionando a cláusula ROLLUP ao GROUP BY conseguimos obter essa
soma, como mostra o exemplo:
 select funcao, sum(sal) from empregado
 group by rollup(funcao)
 order by funcao;
CUBE: A clausula CUBE é uma extensão de ROLLUP que permite as
agregações totais por todas as colunas envolvidas. Na prática cria um cubo.
 select job, deptno, sum(sal) from emp
 group by cube(job, deptno)
 order by job, deptno;

Prof: Msc. Hugo Dias Dos Santos

Você também pode gostar