Vous êtes sur la page 1sur 197

UNIVERSIDADE METODISTA DE ANGOLA

FACULDADE DE ENGENHARIA
1

Administrao de Base de
Dados
3O ano Engenharia Informtica 2016

Prof: Msc. Hugo Dias Dos Santos

Prof: Msc. Hugo Dias Dos Santos


Programa
2

Captulo I: . Apresentao e Consolidao e


reviso de conceptual
Captulo 2. DDL (Data Definition Language)
2.1 - Criao e excluso de bancos, esquemas, tabelas,
views, Constraints, etc
2.2 - Alteraes nos objetos dos bancos
2.3 - ndices, Tipos de Dados e Integridade Referencial
Captulo 3 - DML (Data Manipulation
Language) .
3.1 - Consultas (select,insert, update e delete)
3.2 - Consultas JOIN
3.3 - Sub Consultas
Prof: Msc. Hugo Dias Dos Santos
Captulo 4 - Funes Internas
Programa
3

4.1 Strings
4.2 Matemticas
4.3 - Agrupamento (Agregao)
4.4 - Data/Hora
4.5 - Formatao de Tipos de Dados
4.6 - Converso de Tipos (CAST)
Captulo 5 - Funes Definidas pelo Usurio e Triggers
5.1 - SQL
5.2 - PlpgSQL
5.3 Triggers
Captulo 6 - DCL (Data Control Language) -
Administrao
6.1 - Administrao de usurios, grupos e privilgios

Prof: Msc. Hugo Dias Dos Santos


Programa
4

Captulo 7- Controlo de Concorrencia


7.1- Transaes
7.2- Comportamentos Indesejveis nas Transaces
7.3- Isolamento
7.4- Bloqueio (Locks)
7.5- Seriabilidade e Recuperabilidade
Captulo 8 Administrao
8.1 - Backup e Restore
8.2 - Importar e Exportar
8.3 - Converter
8.4 - Otimizao e Desempenho
Captulo 9 - Replicao

Prof: Msc. Hugo Dias Dos Santos


Objetivos Administrao de Base de Dados

1
Adquirir conhecimentos avanados sobre bases de dados,

2 Conhecer as tecnologias envolvidas e modelos de BD

Fornecer as competncias necessrias para


3
Plano a anlise critica de aplicaes de BD

4 Fornecer as competncias necessrias para o


desenvolvimento eficaz de novas BDs

Utilizar diferentes softwares para a dministrao de


5 base de dados

6 Ganhar conhecimentos avanados na linguagem SQL

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

Dados: Valor de um campo armazenado ou


matria-prima para obteno de informao.
Informao: Dados obtidos aps
compilao e processamento de acordo com
a solicitao de consultas e anlises.
Bancos de dados ou bases de dados:
so colees organizadas de dados que se
relacionam de forma a criar algum sentido
ou informao e dar mais eficincia durante
uma pesquisa ou estudo.
Prof: Msc. Hugo Dias Dos Santos
Modelo Entidade Relacionamento

1.Reviso de conceitos
7

Um Sistema Gerenciador de Base de Dados


(SGBD) ou DBMS: uma coleo de programas
que permitem aos usurios 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 aplicaes.
Abstrao: 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.Reviso de conceitos
8

Modelo: uma abstrao /representao


simplificada de uma parcela do mundo real
composta por objectos.
Modelagem: Actividade atravs da qual se cria um
modelo
Modelo de Dados: uma descrio das
informaes que devem ser armazenadas em uma
BD, ou seja, a definio formal da estrutura da
base de dados.
Estrutura da BD: a descrio dos dados, dos
relacionamentos entre os dados, da semntica e das
restries impostas aos dados.
Prof: Msc. Hugo Dias Dos Santos
Exemplos de Modelos
9

No Modelo Conceitual:
Modelo Entidade Relacionamento,
Modelos Orientados a Objectos,
Modelo de Semntica de Dados,
Modelo Infolgico.
Modelo Lgico:
Modelo Relacional,
Modelo Hierrquico,
Modelo em Rede.
Modelo Fsico:
Modelo de Dados
Prof: Msc. Hugo Dias Dos Santos
Fases de um projecto de construo de
BD
10

1 construir o modelo Cenceitual:


Etapa de alto nvel,
Modelo de alto nvel,
Independente da implementao,
Uso de uma tecnica de modelagem de dados,
Abstrao do ambiente hardware/software.
1 construir o modelo Lgico:
Etapa de normalizao dos Dados,
Modelo implementvel, dependente do tipo de SGBD a ser usado,
Considera as necessidades de processamento
Considera as carecteristicas e restries do SGBD
1 construir o modelo Fsico:
Modelo implementvel, com metodos de acesso a estrutura fsica,

Considera as necessidades de desempenho

Considera as carecteristicas e restries do SGBD


Prof: Msc. Hugo Dias Dos Santos
Modelo Entidade Relacionamento

1.Reviso de conceitos
11

Entidade: Conjunto de objectos da realidade


modelada sobre os quais deseja-se manter
informaes na BD. Estes objectos podem ser
concretos (pessoa, viatura,) ou abstratos
(programas, disciplinas, profisses).
Relao: toda associao entre as entidades
sobre as quais deseja-se manter informao na
BD.
Cardinalidade: o numero de instncias de uma
determinada entidade que podem ser associadas
a uma intncia de uma outra entidade.

Prof: Msc. Hugo Dias Dos Santos


1.Reviso de
Modelo Entidade Relacionamento

12
conceitos(Atributo)
Atributo: um dado que associado cada ocorrncia de uma
entidade ou relacionamentos.
Domnio: o conjunto de valores vlidos que um atributo pode assumir.
Tipos de Atributo:
Opcional: O atributo pode ter o valor nulo. Ex: numero de telefone.
Mandatrio: O atributo deve possuir um valor vlido no nulo. Ex: Nome do
cliente
Monovalorado: O atributo assume um unico valor dentro do domnio. Ex:
Data de Nascimento
Multivalorado: O atributo pode ter um numero qualquer de valores dentro do
dominio. Ex : contactos
Atmico: O atributo no pode ser decomposto em outros atributos. Ex: idade.
Composto: composto por mais de um atributo. Ex Endereo

Prof: Msc. Hugo Dias Dos Santos


1.Reviso de
Modelo Entidade Relacionamento

13
conceitos(Atributo)
Identificador de entidades: o atributo
ou conjunto de atributos que tm a
capacidade de identificar univocamente
cada ocorrncia de uma entidade.
O identificador deve ser nico,
monovalorado e mandatrio
Entidade Associativa (Agregao): um
relacionamento que passa a ser tratado
como entidade devido a existncia de
um relacionamento com uma entidade.
Prof: Msc. Hugo Dias Dos Santos
Modelo
Relacional
2. Modelo Relacional (Reviso)
14

um modelo que considera os dados


organizados como um conjunto de
relaes que representam a base de
dados como uma coleo de tabelas.

Prof: Msc. Hugo Dias Dos Santos


Modelo Relacional

Caractersticas do modelo relacional


15

a) cada linha em uma tabela chamada de tupla;


b) cada coluna em uma tabela chamada de atributo;
c) a interseco 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 definio todas as linhas em uma tabela so distintas;
g) a relao precisa possuir uma chave a qual pode ser um conjunto
de atributos;
h) para cada coluna de uma tabela deve existir um conjunto de
possveis valores chamado de domnio;
j) o grau de uma relao o numero de atributos (colunas) contidos
na relao;
k) a cardinalidade de uma relao o nmero de tuplas (linhas)
existentes na relao.

Prof: Msc. Hugo Dias Dos Santos


Modelo Relacional

Conceitos Bsicos M.R


16

Chave Primria (Primary Key): um atributo ou


combinao de atributos cujo valor destingue cada linha de
uma tabela.
Chave Estrangeira (Foreign Key): um atributo ou
combinao de atributos cujos valores aparecem
necessriamente na chave primria 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 relao mas que no faz
parte da chave primria.

Prof: Msc. Hugo Dias Dos Santos


Modelo Relacional

Dependncia 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 Relao. Ex A=numEmp-
>B=nomeEmp
Dependncia Funcional Total: Um atributo C funcionalmente
dependente da chave primria composta pelos atributos A e B, se
for funcionalmente dependente de A e B.
Dependncia Funcional Parcial: O atributo C parcialmente
funcionalmente dependente da chave primria composta
pelos atributos A e B, se for funcionalmente dependente de A
ou B e no de Ambos.
Dependncia Funcional Transitiva: O atributo C funcionalmente
dependente Transitivo do atributo A, se C dependente
funcional de B e B de A na mesma relao.

Prof: Msc. Hugo Dias Dos Santos


Modelo Relacional

Dependncia Funcional
18

Soluo Para D.F.P


Consiste na criao de uma nova relao 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.
Soluo Para D.F.T
Consiste na criao de uma nova relao que
ser composta pelo atributo ou atributos que
so dependentes funcionais transitivos tendo
como chave primria o atributo que determina a
transitividade.
Prof: Msc. Hugo Dias Dos Santos
Modelo Relacional

Normalizao
19

o processo formal de exame e agrupamento de


dados em uma forma capaz de suportar melhor as
mudanas futuras, minimizando o impacto destas
mudanas sobre a base de dados.
Segundo Edward F. codd um processo sistemtico e
reversvel que consiste em substituir um determinado conjunto
de relaes por sucessivos conjuntos nos quais as relaes
tenham uma estrutura mais simples e regular.
Objectivos
Reduzir as redundncias
Reduzir a inconcistncia
Reduzir a necessidade de reestruturar as relaes.
Prof: Msc. Hugo Dias Dos Santos
Modelo Relacional

Formas Normais.
20

1. Primeira FN: Uma relao estar na primeira FN se


no houver atributo representando agrupamento
e nem atributo repetitivo(multivalorado).
2. Segunda FN: Um relao estar na segunda FN se
estiver na primeira forma normal e seus atributos
no chaves forem dependentes total da chave
primria.
3. Terceira FN: Um relao estar na terceira FN se e
somente se estiver na segunda FN e seus
atributos no chaves forem dependentes no
transitivos da chave primria.

Prof: Msc. Hugo Dias Dos Santos


Modelo Relacional

lgebra Relacional
21

um conjunto de operaes que usa


uma ou duas relaes como entrada e
gera uma relao na saida.
Este conjunto de operaes pode ser
dividido em 2 grupos.
Operaes Matemticas: Operaes de
1. Unio Manipulao de Dados:
2. Interseco 1. Restrio
3. Diferena 2. Projeo
4. Produto Cartesiano 3. Juno
Prof: Msc. Hugo Dias Dos Santos
Unio, interseo e Modelo Relacional

22
diferena
A unio entre duas relaes R1 e R2 s
possvel se ambas tiverem o mesmo nmero 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

Restrio
24

A operao de Restrio usada para


selecionar um subconjunto de tuplas de
uma relao as quais devem satisfazer
uma condio de seleo.

Por exemplo, a seleo de um


subconjunto de tuplas da relao
EMPREGADOS que trabalham para o
departamento 4 e que tenham salrio
Prof: Msc. Hugo Dias Dos Santos
superior a 3000 se apresenta:
Restrio
25

As clusulas podem ser utilizadas em conjunto


com os operadores lgicos {AND, OR NOT} para
formar uma condio de seleo composta.
Por exemplo, suponha que se deseja selecionar
as tuplas de todos os empregados que ou
trabalham no departamento 4 com salrio
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

Projeco
26

Pensando na relao como uma tabela, o operador de


restrio SELECT seleciona algumas linhas da tabela
enquanto descarta outras.
O operador de Projeo, por outro lado, seleciona certas
colunas da tabela e descarta outras. Se existir o interesse
sobre certos atributos da relao, pode-se usar o PROJECT
para projetar a relao sobre esses atributos.

Por exemplo, suponha a necessidade de listar, para cada


empregado, os atributos PNOME, SNOME e SALRIO;
ento pode-se usar o PROJECT como segue:

Prof: Msc. Hugo Dias Dos Santos


Projeco
27

Convm salientar que, caso a lista de atributos no contenha atributos


chaves, ento provvel que tuplas duplicadas apaream no resultado.
A operao de projeo remove implicitamente todas tuplas duplicadas,
para que o resultado da operao seja um conjunto de tuplas e assim,
uma relao vlida. Por exemplo, considere a seguinte operao:


SEXO, SALRIO (EMPREGADO)

Dessa maneira, se duas ou mais tuplas idnticas aparecerem quando


aplicada a operao, apenas uma ser mantida no resultado; isto
conhecido como eliminao de duplicidade e necessrio para
assegurar que o resultado da operao tambm seja uma relao.

O nmero de tuplas na relao resultante sempre ser igual ou menor


que a quantidade de tuplas na relao original.

Prof: Msc. Hugo Dias Dos Santos


Juno
28

A operao JOIN, denotada por
, usada para combinar
tuplas relacionadas de relaes em uma nica tupla. Esta
operao muito importante para todas bases de dados
relacionais, pois permite processar relacionamentos entre
relaes.
Para ilustrar a operao JOIN, suponha que se deseja
recuperar os nomes dos gerentes de cada departamento.
Para obter-se o nome dos gerentes, necessrio 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 operao JOIN, ento projeta-se o
resultado sobre aqueles atributos necessrios:

Prof: Msc. Hugo Dias Dos Santos


Juno
29

A forma geral da operao JOIN sobre duas relaes R(A 1, A 2, ..., An ) e S(B1 ,
B2 , ..., Bm ) : R <condio join>S.
O resultado de JOIN uma relao Q com n+m atributos Q(A1 , A2 , ..., An , B1 ,
B2, ..., Bm ) .
Nesta ordem; Q tem uma tupla para cada combinao de tuplas (de R e de S)
onde quer que a combinao satisfaa a condio join. Esta a principal
diferena entre CARTESIAN PRODUCT e JOIN; em JOIN, apenas combinaes de
tuplas que satisfazem a condio join que aparecer no resultado, j no
CARTESIAN PRODUCT, todas as combinaes de tuplas so includas no resultado.


muito comum encontrar JOIN que envolva condies joins com apenas a
comparao de igualdade. Um JOIN, onde apenas o operador de comparao =
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 idnticos em todas as tuplas. Devido a esta duplicao
ser desnecessria, uma nova operao chamada NATURAL JOIN foi criada.
Denota-se o join natural por *, que basicamente um equijoin seguido da
remoo de atributos desnecessrios.
Prof: Msc. Hugo Dias Dos Santos
Exerccios
30

de
Aplicao.
Prof: Msc. Hugo Dias Dos Santos
31

II:SQL,DDL,
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 caractersticas originais do SQL foram
inspiradas na lgebra relacional
Foi desenvolvido originalmente no incio dos anos 70
nos laboratrios da IBM.
Tinha por objetivo demonstrar a viabilidade da
implementao do modelo relacional proposto por
Edgar Codd.
Seu nome original era SEQUEL, acrnimo para
"Structured English Query Language"

Prof: Msc. Hugo Dias Dos Santos


2.SQL: principais caractersticas
33

A linguagem SQL um grande padro de banco de


dados.
Apesar de ser originalmente criada pela IBM, muitos
desenvolvedores foram criando "dialetos" para ela.
Essa expanso levou necessidade de ser criado e
adaptado um padro 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 mudanas
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 so os diferentes


domnios 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 relao.
Os tipos de dados dependem em grande
parte dos SGBD porque so estes que
primam sobre certos tipos de dados em
relao a outros
Prof: Msc. Hugo Dias Dos Santos
Principais tipos de Dados
36
SQL
Entre os principais tipos de
dados podemos citar: Cadeias de caracteres
Numricos exatos Unicode
bigint
nchar
numeric
bit nvarchar
smallint
decimal ntext
smallmoney
int
tinyint Cadeias de caracteres
Money binrias
binary
Numricos aproximados
float varbinary
real
image
Prof: Msc. Hugo Dias Dos Santos
Principais tipos de Dados
37
SQL
Data e hora Outros tipos de
Date
dados
datetimeoffset
datetime2
cursor
smalldatetime timestamp
datetime hierarchyid
time
uniqueidentifier
Cadeias de caracteres
char
sql_variant
varchar xml
text table
Tipos espaciais
Prof: Msc. Hugo Dias Dos Santos
Os tipos de Mais Usuais
38

VARCHAR: um tipo de letras,bastanteutilizadopara


nomes, ruas, entre outros;
FLOAT ou DOUBLE : Como nome j define, e utilizado
para valoresnumricosquando vai se trabalhar com
divises. Exemplo, peso, altura.
INTEGER: Bastante usando emnmerosinteiros
quando no 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 divises
39

A linguagem SQL dividida em subconjuntos de


acordo com as operaes que se deseja efetuar sobre
um banco de dados. Os principais subconjuntos so:
DDL - Data Definition Language ( Linguagem de
Definio de Dados ). Principais comandos: CREATE,
ALTER e DROP
DML - Data Manipulation Language ( Linguagem
de Manipulao 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 Definio de Dados
40

O conjunto de comandos da linguagem DDL usado para a


definio das estruturas de dados, fornecendo as instrues
que permitem a criao, modificao e remoo de objetos
de banco de dados (base de dados, tabelas, ndices etc.).
A maioria dos bancos de dados comerciais tem extenses
proprietrias no DDL.
Os comandos bsicos da DDL so:
CREATE: cria um objeto (uma Tabela, por exemplo)
dentro da base de dados.
DROP: apaga um objeto do banco de dados.
ALTER: permite ao usurio alterar um objeto, por
exemplo, adicionando uma coluna a uma tabela existente.

Prof: Msc. Hugo Dias Dos Santos


DML:Linguagem de Manipulao de
Dados
41

o grupo de comandos dentro da linguagem SQL utilizado para


a recuperao, incluso, remoo e modificao de
informaes em bancos de dados.
Os comandos bsicos da DML so:
SELECT:permite ao usurio especificar uma consulta ("query") como
uma descrio 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 transao atualmente executada.
ROLLBACK:desfaz a transao corrente, fazendo com que todas as
modificaes realizadas pela transao 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 autorizao de
dados e licenas de usurios para controlar quem tem acesso
para ver ou manipular dados dentro do banco de dados.
Alguns exemplos de comandos DCL so:
GRANT:concede privilgios a um ou mais usurios para acessar ou
realizar determinadas operaes em um objetos de dados.
REVOKE: revoga (remove) ou restringe a capacidade de um
usurio de executar operaes.
SET: Define parmetros em tempo de execuo, como por
exemplo, o tipo de codificao do cliente e o estilo de
representao de data e hora.
LOCK: Bloqueia explicitamente uma tabela fazendo o controle de
acessos concorrente.

Prof: Msc. Hugo Dias Dos Santos


DDL: Sintaxe Bsica
43

Criao de banco de dados


CREATE DATABASE Nome_da_base;
Criao de Tabelas
CREATE TABLE [Nome tabela];
Criao de Vistas
Create VIEW Nome_vista AS SELECT [lista_de_colunas] FROM
nome_tabela;
Criao 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 Bsica
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 Bsica
45

Insero:
INSERT INTO nome_tabela [([col1],[col2],[coli],
[coln] )] VALUES [([val1],[val2],[vali],[valn] )] ;
Seleo:
SELECT (Lista_de_atributos) FROM
(Lista_de_tabelas);
Actualizao:
UPDATE nome_tabela SET coluna=valor WHERE
(condio);
Deleo:
DELETE FROM nome_tabela WHERE (condio);
Prof: Msc. Hugo Dias Dos Santos
Criao de Tabelas
46

Uma tabela define-se pelo seu nome, pelo


nome das suas colunas, pelo tipo de
dados que comporta cada coluna, pelas
restries de colunas e pelas restries
de tabela.
Na realidade existem ainda outras opes
avanadas que se podem definir nas
tabelas, que tm haver com a forma
como o servidor guarda a tabela e as
ligaes em disco.
Prof: Msc. Hugo Dias Dos Santos
Criao de Tabelas
47

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


tabela a criar. Entre parnteses define-se uma lista de
colunas ou restries tabela separadas por vrgulas.
Ao definir-se as colunas determina-se qual o nome da coluna,
que tipo de dados comporta, o tamanho, qual o valor por
omisso dos dados nessa coluna e que restries se devem
verificar sobre os dados dessa coluna.
As restries da tabela indicam normalmente restries sobre
dados de mais do que uma coluna e usam uma sintaxe
ligeiramente diferente porque indicam explicitamente a que
coluna(s) se referem.
As restries de coluna, por outro lado, indicam
implicitamente a que coluna se referem atravs da linha em
que se localizam.

Prof: Msc. Hugo Dias Dos Santos


Criao 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 espao at 50
caracteres por nome. No indicada nenhuma
restrio sobre nenhuma coluna da tabela nem
definida nenhuma chave primria.
CREATE TABLE Estudante
(numero INT(10), nome VARCHAR(50) ) ;

Prof: Msc. Hugo Dias Dos Santos


Criao de Tabelas/ Restrio de Chave
Primria
49

Restrio de Chave Primria (PRIMARY KEY): Como j visto nas


seces anteriores, a chave primria de uma tabela a coluna ou
conjunto de colunas que servem para definir univocamente um
registo na tabela. Uma coluna de chave primria no pode conter
valores nulos nem pode conter valores repetidos.
Se quisermos modificar a relao estudante de formas a definir uma
chave primria, podemos proceder como segue:
CREATE TABLE Estudante
(numero INT(10) PRIMARY KEY,
nome VARCHAR(40)) ;

Ou ainda dando um nome na restrio de chave primria (Restrio da coluna)


CREATE TABLE Estudante
(numero INT(10) CONSTRAINT pk_numero_estudante PRIMARY KEY,
nome VARCHAR(40)) ;

Prof: Msc. Hugo Dias Dos Santos


Criao de Tabelas: Restrio de Chave
Primria
50

Ou definindo restrio de chave primria a nivel da tabela(Restrio


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 clusula Modify, mas estes items so tratados em
sesses posteriores.

Prof: Msc. Hugo Dias Dos Santos


Criao de Tabelas/ Chaves Primrias
compostas:
51

Chaves Primrias compostas: Quando a chave


primria de uma relao composta o mtodo
recomendado definir a restrio ao nvel da tabela.
Exemplo:
CREATE TABLE Estudante1
(ano_entrada INT(6),
num_entr ada INT(4),
nome VARCHAR(40),
CONSTRAINT pk_ano_num_estudante PRIMARY
KEY(ano_entrada, num_entrada));

Prof: Msc. Hugo Dias Dos Santos


Criao de Tabelas / Restrio de
Unicidade
52

Restrio de Unicidade (UNIQUE): Uma coluna que obedea


restrio de Unicidade no pode ter valores repetidos. Note no entanto
que uma coluna nestas condies PODE conter valores nulos.
Pode declarar-se a coluna com restries de Unicidade nas restries
desta coluna ou no conjunto de restries 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


Criao de Tabelas / Restrio de
Integridade Geral
53

Restrio de Integridade Geral (CHECK)


possvel obrigar a que na insero de dados sejam verificadas
condies.
As condies a verificar apenas permitem a insero de dados se o
valor devolvido for Verdade ou Desconhecido (no caso do valor ser
Nulo).
As condies a verificar podem incluir expresses aritmticas e
chamadas de funes SQL.
As condies a verificar no podem incluir:
chamadas s funes SYSDATE, UID, USER e USERENV
referncias s pseudo-colunas CURRVAL, NEXTVAL, LEVEL e ROWNUM
subconsultas
referncias a colunas de outras tabelas ou a outras linhas da mesma tabela
Pode declarar-se a restrio de integridade na zona de restries da
coluna ou na zona de restries da tabela.

Prof: Msc. Hugo Dias Dos Santos


Criao de Tabelas / Restrio de
Integridade Geral
54

A sintaxe para se definir uma coluna com restrio de


integridade geral :
[CONSTRAINT nome_restrio] 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),
ano INT(4),
CONSTRAINT ck_ano_alunos CHECK(ano>1980) ) ;

Prof: Msc. Hugo Dias Dos Santos


Criao de Tabelas / Restrio de
Integridade Geral
55

Outro exemplo: Criar uma tabela empregados com duas restries


CHECK.
A primeira restrio, ck_nome_empregados, obriga a que os nomes
tenham um espao no meio, ou seja, que exista pelo menos um nome
e um apelido para cada empregado.
A outra restrio, ck_funcao_empregado, obriga a que a funo 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


Criao de Tabelas / Restrio de Proibio de
Valores Nulos
56

Restrio de Proibio de Valores


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

Prof: Msc. Hugo Dias Dos Santos


Criao de Tabelas / Restries de Chave
estrangeira
57

Restries de Chave Estrangeira (FOREIGN KEY) Uma chave estrangeira


(FOREIGN KEY) uma referncia a um valor que existe em outra coluna de outra
tabela. A coluna referenciada tem que ser uma chave primria ou uma coluna
UNIQUE.
[CONSTRAINT nome_restrio] REFERENCES tabela[(coluna)]
[ON DELETE CASCADE]

A opo ON DELETE CASCADE indica que se o registo da chave referenciada for apagado
ento 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 Omisso (DEFAULT)
58

Quando se inserem registos numa tabela possvel no especificar todos os valores de todos os campos.
Os campos em falta sero inseridos com um valor por omisso, se este estiver definido, ou com o valor
NULL.
A sintaxe para definir um valor por omisso para uma coluna a seguinte:
CREATE TABLE tabela
(coluna1 tipo_coluna1 DEFAULT valor1 [ restries_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 Restries
59

Os nomes das restries so usados por vrios SGBDs para dar uma
pista ao utilizador do que que correu mal durante uma instruo SQL.
importante definir nomes de restries que permitam saber
exactamente que tipo de restrio (em que tabela, em que coluna,
chave primria, chave forasteira, NOT NULL, etc.) impediu a execuo
normal do comando.

Cada programador ou equipa de programadores deve definir o seu
prprio esquema de nomeao de restries.
No existe nenhuma regra fixa mas uma sugesto usar:
descrio_coluna_tabela
Onde descrio indica que tipo de restrio se est a usar
(pk=PRIMARY KEY, fk=FOREIGN KEY, ck = CHECK, nn=NOT NULL, uni
=UNIQUE), coluna o nome sobre o qual a restrio 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: atribuio 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 possvel alter-la. Embora no 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
no se podem perder.
As alteraes possveis so:
Acrescentar colunas
Redefinir colunas no que diz respeito ao tipo de dados, comprimento e
valor por omisso
Acrescentar e retirar restries
Activar e desactivar restries
Repare que na maioria dos SGBDs no possvel remover uma
coluna. Note ainda que s possvel 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 restries sobre a coluna bem como valores
por omisso.
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


omisso) usa-se o comando:
ALTER TABLE tabela
MODIFY (coluna [tipo_coluna] [ valor_omissao]);
Note que no possvel com a clusula MODIFY coluna alterar ou
remover restries sobre essas colunas. Para isso preciso a
clusula DROP restrio. Os parntesis so opcionais porque a clusula
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 omisso
ALTER TABLE empregados MODIFY (sexo DEFAULT Fem);
Note que este valor por omisso entra em conflito com a restrio
de integridade, ck_sexo_empregados, definida na pgina anterior.

Prof: Msc. Hugo Dias Dos Santos


Alterar Tabelas / restries
64

Remover Restries : Para remover uma restrio usa-se:


ALTER TABLE tabela
DROP CONSTRAINT restrio;
Exemplo: Remover a restrio da coluna sexo
ALTER TABLE empregados
DROP CONSTRAINT ck_sexo_empregados;
Acrescentar Restries: Para acrescentar uma restrio usa-se:
ALTER TABLE tabela
ADD CONSTRAINT nome_restricao condicao [ DISABLE];
Se se usar a palavra DISABLE, a restrio acrescentada mas no
activada. Ou seja, existe mas ainda no est a funcionar.
Exemplo: Acrescentar uma restrio coluna sexo
ALTER TABLE empregados
ADD CONSTRAINT ck_sexo_empregados CHECK (sexo IN (Fem, Mas));
Exemplo2: restrio 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 / restries
65

Desactivar Restries (DISABLE CONSTRAINT)


A sintaxe para desactivar restries :
ALTER TABLE tabela
DISABLE CONSTRAINT nome_condio;
Exemplo: Desactiva a restrio ck_sexo_empregados
ALTER TABLE empregados
DISABLE CONSTRAINT ck_sexo_empregados;
Activar Restries
Da mesma forma que possvel desactivar restries tambm
possvel activ-las. A sintaxe para activar restries :
ALTER TABLE tabela
ENABLE CONSTRAINT nome_condio;
Exemplo: Activa a restrio ck_sexo_empregados
ALTER TABLE empregados
ENABLE CONSTRAINT ck_sexo_empregados;

Prof: Msc. Hugo Dias Dos Santos


66

Exerccios
de
avaliao
Prof: Msc. Hugo Dias Dos Santos
Os ndices
67

Os ndices so mecanismos utilizados para melhorar o


tempo de resposta nas pesquisas dentro de uma BD.
As pesquisas acontecem nas seguintes situaes:
De forma explcita num comando SELECT;
De forma implcita num INSERT, porque preciso verificar
a no duplicao da PRIMARY KEY e das UNIQUE KEYs;
De forma implcita num UPDATE ou num DELETE porque
preciso encontrar a linha que vai ser alterada ou
eliminada;
De forma implcita quando o comando SQL inclui uma
suboperao que requer a pesquisa, por exemplo um JOIN
entre duas tabelas;

Prof: Msc. Hugo Dias Dos Santos


Os ndices / desvantagem
68

A acelerao provocada por um ndice pode ser enorme, por


exemplo horas convertidas em segundos, mas a sua utilizao
tem um custo. Esse custo manifesta-se nas seguintes
situaes:
As operaes de INSERT, UPDATE e DELETE obrigam a uma

actualizao do ndice, o que as torna mais pesadas;


O ndice ocupa espao em disco que em algumas situaes

ocupa tanto quanto a tabela a que se refere;


Os ndices tm que ser reconstrudos com alguma

frequncia, e esta operao consome recursos e demora


tempo;
O uso de ndices uma deciso de compromisso entre a
degradao de algumas operaes e a maior velocidade
noutras, devendo ser ponderada e reflectida.

Prof: Msc. Hugo Dias Dos Santos


Os ndices / Criao de um ndice
69

Para criar um ndice usamos a sintaxe genrica a seguir indicada:


CREATE [UNIQUE] INDEX nomeIndice ON
nomeTabela(coluna1 [, coluna2...])
[TABLESPACE nomeTablespace];
O nome do ndice obrigatrio.
Alguns comandos em Oracle criam ndices de forma implcita como a
restrio Primary Key ou Unique.
A clusula UNIQUE opcional. Na sua ausncia o ndice suporta valores
repetidos.
Um ndice est sempre associado a uma tabela e removido de forma
automtica quando a respectiva tabela removida.
Um ndice usa no mnimo 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
omisso para esse utilizador. Faz parte das boas prticas 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 concatenao das
colunas FIRST_NAME e LAST_NAME. Este ndice no
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 so


diferentes, sendo pouco selectivo quando possui muitos valores
repetidos.
Se calcularmos o ratio entre nmero de valores diferentes do
ndice e nmero total de linhas da tabela, o ndice ser muito
selectivo se o ratio der 1, enquanto pouco selectivo se der
prximo de zero.
Um ndice criado sobre a coluna NUMERO_CLIENTE
(identificador numrico 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, no
conta a coluna individual mas sim a concatenao de todas as
colunas.
Prof: Msc. Hugo Dias Dos Santos
Vistas
72

Uma vista uma a instruo SELECT que recebe


um nome e pode ser consultada como se fosse
uma tabela.
Uma vista no contem dados, pois usa os da
tabela que lhe d suporte.
As vistas permitem definir um nvel de
abstraco e um nvel superior de segurana.
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 instruo SELECT.
Prof: Msc. Hugo Dias Dos Santos
Vistas / Criao
73

Vamos criar uma vista (VIEW) que faz uma seleco


vertical e horizontal sobre uma tabela:
CREATE OR REPLACE VIEW empregado_v1 AS SELECT
nome, numero, funao 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
informaes 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 unio 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 clusula
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 visualizao de uma


vista utiliza-se os mesmos comandos
utilizados na visualizao de tabelas
como:
Select * from nome_vista;
Describe vista;

Prof: Msc. Hugo Dias Dos Santos


77

Exerccios
de
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 usurio especificar uma consulta
("query") como uma descrio do resultado desejado.
Esse comando composto de vrias clusulas e opes,
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 vrios tipos de
relao (restrio, projeco, produto, juno, unio,
interseco e diferena) s tabelas existentes na base de
dados e executar operaes sobre os valores retirados das
tabelas antes de os mostrar.

Prof: Msc. Hugo Dias Dos Santos


DQL / clusulas
79

As clusulas so condies de modificao 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
repetio.
Exemplo: SELECT DISTINCT especialidade FROM medico;
A maioria dos SGBDs modernos realizam um distinct
implicito no resultado de uma operao de seleo.
Prof: Msc. Hugo Dias Dos Santos
DQL / clusulas
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
especficos. Este comando realiza o mesmo que o order by quando
todos valores da coluna especificada so distintos. Porque em regra
geral este comando retorna as linhas em funo dos diferentes valores
na coluna passada em parmetros.
Exemplo: SELECT especialidade, nome FROM medico GROUP BY especialidade;

Prof: Msc. Hugo Dias Dos Santos


A clusula WHERE
81

WHERE Utilizada para especificar as


condies que devem reunir os dados
que sero retornados na seleo.
Exemplo: SELECT id_mae, nome FROM mae
WHERE id_mae=2;

Prof: Msc. Hugo Dias Dos Santos


A clusula WHERE
82

A clusula WHERE permite restringir linhas atravs de


uma condio.
Apenas as linhas que satisfaam a condio so
devolvidas.
Podem usar-se no WHERE condies sobre uma ou
mais colunas de uma ou mais tabelas ou vistas desde
que as tabelas ou vistas apaream na clusula FROM.
Pode comparar-se valores de colunas, expresses
aritmticas e constantes.
Para alm de fazer restries simples sobre uma
tabela, o uso mais comum do WHERE o de permitir
relacionar colunas de vrias tabelas ou vistas.

Prof: Msc. Hugo Dias Dos Santos


A clusula WHERE / Operadores lgicos
83

AND E lgico. Avalia as condies 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 lgico. Avalia as condies e devolve
um valor verdadeiro se algum for correto.
Exemplo: SELECT id_mae, nome FROM mae WHERE
id_mae>2 OR <22;
NOT Negao lgica. Devolve o valor contrrio
da expresso. SELECT id_mae, nome FROM mae
WHERE NOT(id_mae>2 OR idade <22);

Prof: Msc. Hugo Dias Dos Santos


A clusula WHERE / Operadores
Relacionais
84

O SQL possui operadores relacionais,


que so usados para realizar
comparaes 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 comparao de um

modelo e para especificar registros de


um banco de dados. "Like" + extenso %
significa buscar todos resultados com o
mesmo incio da extenso. 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
Prof: Msc. Hugo Diasidade in (20,22,24);
Dos Santos
A clusula HAVING
85

A clusula HAVING define condies na clusula


GROUP BY semelhante ao modo que WHERE
interage com SELECT. O critrio de pesquisa
WHERE aplicado antes da execuo da operao
de agrupamento; o critrio de pesquisa HAVING
aplicado depois que a operao de agrupamento
executada.
A sintaxe HAVING semelhante sintaxe WHERE,
exceto se HAVING contiver funes de agregao.
Exemplo: SELECT especialidade, nome,cartao_med FROM
medico GROUP BY especialidade HAVING
cartao_med>1500;

Prof: Msc. Hugo Dias Dos Santos


86

Exerccios
de
aplicao
Prof: Msc. Hugo Dias Dos Santos
87

III:
Funes
Prof: Msc. Hugo Dias Dos Santos
O que so Funes?
88
So pedaos de cdigo, definidos pelo utillizador ou pr-definidos pela
linguagem, utilizados para manipular dados.
Aceitam um ou mais argumentos, devolvendo um valor. O argumento
uma constante, varivel ou o nome de uma coluna. O valor devolvido
serve para classificar a funo(numrica, char, Date).
As funes so utilizadas para manipular dados, tornando mais potentes
as consultas.
Dividem-se em trs grandes grupos:
Manipulao de linhas: neste grupo encontramos funes para manipular
caracteres, nmeros, datas e funes que permitem converter dados de
um tipo para outro;
Manipulao de grupos de linhas: As funes de grupo permitem obter um
valor que depende do grupo de linhas, por exemplo uma mdia, varincia ou
um mximo;
Funes analticas: 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 prprias funes usando a
linguagem de programao PL/SQL ou JAVA.
Prof: Msc. Hugo Dias Dos Santos
3.2 Funes 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
funes.
Nas funes de linha destacam-se os seguintes grupos:
Funes de manipulao de caracteres;
Funes encadeadas;
Funes numricas;
Funes para manipular datas;
Funes para converso de tipos;
Funes especiais;

Prof: Msc. Hugo Dias Dos Santos


3.2.1 Funes de manipulao de caracteres;
90

Estas funes aceitam como argumento(s) caracteres e devolvem


caracteres ou valores numricos:
LOWER(string):Converte 'string' para letras minsculas. Ex: SELECT
LOWER (nome) FROM estudante;
UPPER(string):Converte 'string' para letras maisculas. Ex: SELECT
UPPER (nome) FROM estudante;
CONCAT(string1,string2); Devolve a concatenao de string1 com
string2. Ex SELECT CONCAT (nome, sobrenome), CONCAT (pais,provincia)
FROM estudante;
SUBSTR(string1,pos,n);
Esta funo pressupe que os caracteres numa cadeia so numerados da
esquerda para a direita, comeando em 1. Devolve a substring de 'string1'
que comea na posio 'pos' e tem comprimento n. Se o parametro 'n' for
omitido, devolve todos os caracteres desde a posio '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 Funes de manipulao de
caracteres;
91

INSTR(string1,string2); Devolve a posio da


primeira ocorrncia 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); Substiti um caracter
por outro. Converte todas as ocorrncias do caracter
c1 de string1 para c2. Podem ser colocados vrios
caracteres. Se c2 for omitido, c1 convertido para
espao em branco. Ex select nome,
TRANSLATE(endereco,Viana',Luanda') FROM mae;

Prof: Msc. Hugo Dias Dos Santos


3.2.2 Funes encadeadas
92

As funes de linha podem ser progressivamente


encadeadas, umas dentro das outras. A avaliao
feita das funes interiores para as funes
exteriores.
Como faria para saber quantas vezes aparece um
determinado caracter dentro de uma string? Uma
soluo encadear as funes 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.3Funes numricas
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 Funes para manipular datas
94

Estas funes operam sobre datas Oracle. Todas devolvem um valor do tipo data,
excepto MONTHS_BETWEEN que produz um nmero.
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 numrico, que contem 7 bytes. Cada
byte armazena um dos componentes abaixo e por esta ordem:
Sculo;
Ano;
Ms;
Dia;
Horas;
Minutos;
Segundos;
A parte inteira do nmero corresponde ao ano+ms+dia, sendo a parte dcimal
as horas+minutos+segundos. A unidade de "medida" o dia.
O comando abaixo altera o formato de apresentao da data para todos os
comandos que sejam executados dentro da mesma sesso no ORACLE:
ALTER SESSION SET nls_date_format = 'yyyy-mm-dd hh24:mi:ss';

Prof: Msc. Hugo Dias Dos Santos


3.2.4 Funes para manipular datas
95

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


de dados. No necessita argumentos:
EX: select sysdate(); EX2: select Current_date();
Ex3 select sysdate(), Current_date();
MONTHS_BETWEEN(data1,data2): Determina o nmero de meses entre
data1 e data2. O resultado pode ser positivo ou negativo.
OBS: A parte dcimal do resultado representa o nmero de horas, minutos e
segundos em fraco de dia, que a unidade usada na data.
ADD_MONTHS(data,n): Adiciona n meses de calendrio data. O nmero n
tem que ser inteiro e pode ser negativo.
DATE_ADD(Data,n): Funo utilizada no MySql faz o mesmo que a funo
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 Funes 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 Funes para manipular datas
97

LAST_DAY(data1):Devolve o ltimo dia do ms 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 tm horas/minutos/segundos
diferentes e apenas nos interessa o ano/ms/dia.
TRUNC(data1,'MONTH'); Devolve o primeiro dia do ms que
contm data1.
TRUNC(data1,'YEAR'): Devolve o primeiro dia do ano que contm
data1.

ROUND(data1,'MONTH'); Devolve o primeiro dia do ms que


contm data1 se esta estiver na primeira metade. Devolve o
primeiro dia do ms seguinte se data1 estiver na segunda metade
do ms.

Prof: Msc. Hugo Dias Dos Santos


Funes para manipular datas (MySql)
98

DATE_FORMAT(<data_para_fomatar>,<formato_desejado): como
o nome indica nos permite mudar o formato da apresentao da
data. Se a letra Y fornecida em parametros for minscula ento 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 diferena em dias entre
data1 e data dois. O resultado pode ser negativo.
Ex: obter a diferena 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)) " diferena 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 Funes para de Extrao de data
99

EXTRACT(YEAR|MONTH|WEEK|DAY|HOUR|MINUTE|TIMEZONE FROM DATE|


TIMESTAMP): A funo EXTRACT surgiu na verso 9i e permite extrair as
componentes de uma data. A sua sintaxe genrica :
EXTRACT ({ YEAR | MONTH | DAY | HOUR | MINUTE | SECOND }| { TIMEZONE_HOUR |
TIMEZONE_MINUTE } | { TIMEZONE_REGION | TIMEZONE_ABBR } FROM
{ date_value | interval_value } )
Tem as seguintes limitaes:
De um tipo DATE apenas podemos extrair o ano, o ms e o dia;
S podemos extrair TIMEZONE_HOUR e TIMEZONEMINUTE de um tipo TIMESTAMP que
possua TIMEZONE;
Seguem alguns exemplos de utilizao:
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 Funes para converso de tipos
100

A linguagem SQL fornece vrias funes para controlar a


converso de tipos de dados. Estas funes convertem um
valor de um tipo para outro tipo. Entre elas as principais so:
TO_DATE(string, mscara de data): A funo TO_DATE()
converte do formato cadeia de caracteres para data,
seguindo o formato de data escolhido pelo utilizador.
A funo 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, mscara_data, [nls_date_format] ): A
funo TO_CHAR(data) converte do formato data para cadeia
de caracteres, seguindo a mscara escolhida pelo utilizador

Prof: Msc. Hugo Dias Dos Santos


3.2.5 Funes para converso de tipos
101

DECODE: A sintaxe do comando DECODE a seguinte:


DECODE (v, v1, r1, v2, r2, r_default);
Se a expresso v assumir o valor v1 ento colocado o
resultado r1, se v2 ento r2. Se nenhum desses valores ocorrer
ento colocado r_default. Simula um comando if-then-else ou
um comando CASE com sinal de igual (=). O nmero de pares
de valores (v1,r1) pode variar. O valor r_default facultativo.
A expresso v pode ser o nome de uma coluna ou o resultado de
uma funo;
O resultado da expresso v e os valores v1, v2, ... tm que ser do
mesmo tipo;
Se r_default for omitido devolvido null nos casos em que a
condio no satisfaa 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 Funes especiais
102

A lista abaixo possui funes especiais, que em alguns


contextos podem ser enquadradas como "pseudo-colunas"
da tabela.
USER:Mostra o nome do utilizador Oracle que abriu sesso.
select user from dual;
UID: Mostra o nmero que a base de dados atribuiu ao
utilizador.
select user,uid from dual;
USERENV(arg): Devolve dados da sesso actual. Os
valores de arg podem ser: 'LANGUAGE' - lingua; 'LANG' -
pas; 'INSTANCE,'TERMINAL' - nome do computador
(quando o cliente JDBC aparece em branco); 'SESSIONID'-
nmero da sesso Oracle que est em execuo;

Prof: Msc. Hugo Dias Dos Santos


3.3 Funes de grupo de linhas
103

Permitem obter informao resultante de


processamento sobre valores
pertencentes a um grupo de linhas,
como a mdia, mximo ou mnimo.
Neste mdulo descreve-se a utilizao
destas funes, assim como a diviso de
linhas de uma tabela em conjuntos mais
pequenos e como especificar critrios de
pesquisa para grupos de linhas.

Prof: Msc. Hugo Dias Dos Santos


3.3.1 Funes de estatstica / agregao
104

Enquadram-se nas funes de grupo ou agregado


porque operam sobre um conjunto de linhas,
produzindo um nico resultado para esse conjunto,
ao contrrio das funes de linha que produzem um
resultado para cada linha.
Quando no usada a clausula GROUP BY todas as
linhas da tabela so tratadas como um grupo.
As colunas que possuem valores null so ignoradas.
Todas as funes permitem a utilizao da clausula
DISTINCT que elimina valores repetidos.

Prof: Msc. Hugo Dias Dos Santos


3.3.1 Funes de estatstica / agregao
105

As funes de agregao, como ilustradas nos exemplos abaixo, so usadas


dentro de uma clusula SELECT em grupos de dados para devolver um nico
valor que se aplica a um grupo de dados.
AVG Utilizada para calcular a mdia dos valores de um campo determinado;
Exemplo: SELECT AVG(credito) FROM cliente;
COUNT Utilizada para devolver o nmero de registros da seleo;
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 varincia de n, ignorando valores nulos.
Prof: Msc. Hugo Dias Dos Santos
3.4 Funes analticas
106

As funes analticas calculam um valor para cada linha


que varia com os valores das outras linhas do grupo.
Diferem das funes de grupo pelas seguintes razes:
Devolvem um valor para cada linha, em vez de um valor para
todo o grupo;
O grupo de linhas escolhido por uma clusula "order by" ou
partio de tabela;
A funo analtica usa as linhas do grupo para efectuar clculos
"deslizantes" que tm em conta os valores das outras linhas do
grupo e as posies relativas das linhas entre si;
Na execuo de um query, Primeiro so feitas as junes,
filtros horizontais (WHERE), agrupamento (GROUP BY) e
filtro de grupos (HAVING). Depois feito o clculo da funo
analtica e s em ltimo lugar a ordeno (ORDER BY).

Prof: Msc. Hugo Dias Dos Santos


3.4 Funes analticas
107 Estas funes so 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( )
Funes estatsticas combinadas com clusula OVER
As Funes Analiticas no 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 funes/ de Linha
108

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


dos valores v1, v2 ou v3. A funo 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 so os comandos da DML (Data
Manipulation Language): INSERT, REPLACE, DELETE ou UPDATE.
Uma funo de gatilho pode ser criada para executar antes
(BEFORE) ou aps (AFTER) as consultas INSERT, UPDATE OU DELETE.
A funo de gatilho deve ser declarada como uma funo que no
recebe argumentos e que retorna o tipo TRIGGER.
Aps criar a funo de gatilho, estabelecemos o gatilho pelo
comando CREATE TRIGGER.
Uma funo de gatilho pode ser utilizada por vrios gatilhos.
As funes de gatilho chamadas por gatilhos-por-instruo devem
sempre retornar NULL.
As funes 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_funo
(argumentos)
O gatilho fica associado tabela especificada e executa a funo
especificada nome_da_funo quando determinados eventos
ocorrerem.
O gatilho pode ser especificado para disparar antes de tentar realizar a
operao na linha (antes das restries serem verificadas e o comando
INSERT, UPDATE ou DELETE ser tentado), ou aps a operao estar
completa (aps as restries serem verificadas e o INSERT, UPDATE ou
DELETE ter completado).
evento Um, entre INSERT, UPDATE ou DELETE; especifica o evento que
dispara o gatilho.
Vrios eventos podem ser especificados utilizando OR.
Exempo:

Prof: Msc. Hugo Dias Dos Santos


Exemplo de Triggers;
111

Criao de uma tabela que fara a recepo de todos Status modificado.

CREATE TABLE cliente_auditoria (


id INT(11) NOT NULL AUTO_INCREMENT,
cod_cliente INT(11) NOT NULL, status VARCHAR(50) NOT NULL,
modificadoem datetime DEFAULT NULL, acao VARCHAR(50) DEFAULT NULL,
PRIMARY KEY (id) )

TRIGGER
DELIMITER $$
CREATE TRIGGER Update_empregados BEFORE UPDATE ON cliente
FOR EACH ROW BEGIN
INSERT INTO cliente_auditoria
SET acao = 'update',
cod_cliente = OLD.cod_cliente,
status = OLD.status,
modificadoem = NOW(); END$$
DELIMITER ;
Prof: Msc. Hugo Dias Dos Santos
Exemplo2
112

Criao de uma tabela cujo o nome quantidade_stock1. A mesma


contem informaes 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 salrio do empregado--
IF NEW.nome IS NULL THEN
RAISE EXCEPTION 'O nome do empregado no pode ser nulo'; END IF;
IF NEW.salario IS NULL THEN
RAISE EXCEPTION '% no pode ter um salrio nulo', NEW.nome;
END IF;
-- -- Quem paga para trabalhar?--
IF NEW.salario<0 THEN
RAISE EXCEPTION '% no pode ter um salrio 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,'Joo',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);
NEWPara INSERT e UPDATE OLDPara 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 operao realizada na
tabela emp.Utiliza a varivel especial TG_OP para descobrir a operao 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 ('Joo',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='Joo';
SELECT*FROM empregados; SELECT*FROM empregados_audit;

Prof: Msc. Hugo Dias Dos Santos


IV: DCL
119

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 autorizao de
dados e licenas de usurios para controlar quem tem acesso
para ver ou manipular dados dentro do banco de dados.
Os comandos mais usuais da DCL so:
GRANT:concede privilgios a um ou mais usurios para acessar ou
realizar determinadas operaes em um objetos de dados.
REVOKE: revoga (remove) ou restringe a capacidade de um usurio
de executar operaes.
SET: Define parmetros em tempo de execuo, como por
exemplo, o tipo de codificao do cliente e o estilo de
representao de data e hora.
LOCK: Bloqueia explicitamente uma tabela fazendo o controle de
acessos concorrente.

Prof: Msc. Hugo Dias Dos Santos


DCL: Sintaxe de Criao de Usurio
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 usurio que ser criado;
sua_senha a senha para o usurio que est sendo criado;
nome_da_tablespace a tablespace padro onde os objetos do
banco de dados so armazenados. Se essa opo for omitida, o
banco assume a tablespace SYSTEM padro;
tablespace_temporaria a tablespace padro onde so
armazenados os objetos temporrios, como tabelas temporrias por
exemplo. Se essa opo for omitida um tablespace temporrio 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
122
tablespaces
No exemplo1 anterior foi criado o usurio
ELIEZIO com a senha 123, esse usurio foi criado
de forma direta, ou seja, foi omitida a DEFAULT
TABLESPACE e TEMPORARY TABLESPACE, isso faz
com que o Oracle assuma o padro do banco.
Para visualizar as tablespaces usadas na criao
do usurio, 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 usurio
ALTER USER devmedia identified by 4321;
A senha do usurio DEVMEDIA foi alterada de teste para 4321.
Desbloqueando um usurio
ALTER USER devmedia identified by 4321 account unlock;
Foram adicionados dois novos comandos, o ACCOUNT UNLOCK
que tem a funo de desbloquear o usurio, nesse caso no
necessrio troca da senha, a menos que seja necessrio.
Bloqueando um usurio
ALTER USER devmedia account lock;
Excluindo um usurio
DROP USER eliezio;
.

Prof: Msc. Hugo Dias Dos Santos


DCL: Privilgios de Sistema
124

Como foi mencionado j anteriormente neste artigo, so


os privilgios que permitem executar instrues DDL, tais
como create session,create sequence, create
synonym,create table,create view dentre vrios outros.
Conceder Privilgios de Sistema:
GRANT create session,create table,create view TO eliezio;
Est sendo concedido trs privilgios de sistema para o
usurio ELIEZIO, nesse momento esse usurio passa a ter
privilgio de criar uma sesso de conexo na BD, e ainda
pode criar tabelas e views.
Usando a clusula WITH ADMIN OPTION, isso permite que
o usurio possa estender seus privilgios para outros
usurios.

Prof: Msc. Hugo Dias Dos Santos


DCL: Privilgios de Sistema
125
WITH ADMIN OPTION
GRANT create session,create table,create view TO eliezio WITH
ADMIN OPTION;
esto sendo concedidos trs privilgios de sistema para o usurio
ELIEZIO, como foi adicionada a clusula WITH ADMIN OPTION
significa que o usurio ELIEZIO pode estender seus privilgios de
sistema para outros usurios.
Conceder Privilgios de Objeto
so os privilgios que permitem executar instrues DML, tais
como select, insert, update, delete dentre vrios outros.
GRANT select,update ON HR.employees TO eliezio;
esto sendo concedidos privilgios de SELECT e UPDATE na tabela
EMPLOYEES que do esquema HR para o usurio ELIEZIO. Vale
ressaltar que sempre que se est liberando privilgios a objetos de
outro usurio deve-se sempre colocar o nome do
usurio(esquema) antes do nome do objeto.
Prof: Msc. Hugo Dias Dos Santos
DCL: Privilgios de Sistema
126
WITH GRANT OPTION
GRANT select,update ON HR.employees TO eliezio WITH GRANT OPTION;
Esto sendo dados privilgios de SELECT e UPDATE na tabela
EMPLOYEES que do esquema HR para o usurio ELIEZIO, no
final foi adicionada a clusula WITH GRANT OPTION, significando
que o usurio ELIEZIO pode estender seus privilgios de objetos
para outros usurios.
Revogando(Removendo) de Sistema

REVOKE create view FROM eliezio;

No exemplo apresentada a clusula REVOKE que responsvel

por remover um privilgio de um usurio, seja ela um privilgio


de sistema ou objeto. Nesse caso est sendo removido o
privilgio CREATE VIEW do usurio ELIEZIO que um privilgio de
sistema.
Revogando(Removendo) de Objetos

REVOKE insert ON HR.employees FROM eliezio;


Prof: Msc. Hugo Dias Dos Santos
127

V:Controlo de
Concorrncia

Prof: Msc. Hugo Dias Dos Santos


1. Transaco
128

Uma transaco um conjunto de instrues SQL que devem


funcionar como um todo. Isto significa que uma transaco tem
sucesso se todas as suas instrues tiverem sucesso e fracassa
se uma das suas instrues falhar.
Como iniciar e terminar uma transaco?
Uma transaco pode ser constituda por um ou mais comandos
SELECT, INSERT, UPDATE ou DELETE. Em Oracle uma transaco
comea logo que termina a transaco anterior. Uma transaco
termina numa das seguintes situaes:
executado o comando COMMIT;
executado o comando ROLLBACK;
executado um comando DDL (Data Definition Language);
executado um comando DCL (Data Control Language);
Fim de sesso;
Ocorre um erro num comando da transaco;

Prof: Msc. Hugo Dias Dos Santos


1. Transaco
129
Quando a transaco termina com confirmao as alteraes
feitas aos dados tornam-se definitivas. Isto ocorre nestas situaes:
COMMIT;
Comando DDL;
Comando DCL;
Fim de sesso normal (EXIT);
Na realidade uma transaco termina apenas com COMMIT ou
ROLLBACK, mas os comandos DDL e DCL assim como o fim de
sesso normal (EXIT) tm COMMIT implcito, ou seja, a base de
dados confirma a sua execuo de forma automtica.
Quando a transaco termina sem confirmao as alteraes
feitas aos dados so desfeitas. Isto ocorre nas seguintes situaes:
ROLLBACK;
Erro num comando da transaco;
Fim de sesso anormal, por exemplo por falha nas comunicaes ou fim
do "client process";
Prof: Msc. Hugo Dias Dos Santos
Tempo 1. Transaco / exemplo Sesso 1 Comentrio
Fim da transaco anterior e inicio da
1 commit;
130 nova
Remover a tabela TESTE (caso
drop table teste; exista) e recri-la. So dois
create table teste (
comandos DDL, sendo cada um
id number(10,0),
2 nome varchar2(100), deles uma transaco com COMMIT
constraint pk_teste primary key (id) implcito. Depois do COMMIT
); implcito do segundo comando
inicia-se uma nova transaco.
insert into teste (id,nome) values (1,'Jos');
insert into teste (id,nome) values (2,'Joo');
Dentro da transaco inserir vrias linhas
3 insert into teste (id,nome) values (4,Abel');
na tabela TESTE e verificar que esto l.
insert into teste (id,nome) values (5,'jos');
select * from teste;

4 rollback; Fazer rollback transaco


Verificar que as alteraes foram
5 select * from teste; desfeitas, ou seja, os dados voltaram ao
valor inicial

Prof: Msc. Hugo Dias Dos Santos


1. Transaco
131

No exemplo anterior, se no passo 4


tivessemos feito COMMIT em vez de
ROLLBACK as alteraes tornavam-se
definitivas.
SAVEPOINT
O comando ROLLBACK na sua verso
simples desfaz todas as alteraes feitas
na transaco. possvel adicionar
SAVEPOINTs ao longo da transaco que
permitem o "desfazer" parcial. O
exemplo a Prof:
seguir mostra como:
Msc. Hugo Dias Dos Santos
1. Transaco
Tempo Sesso 1 Comentrio
1
132 drop table teste; Remover a tabela TESTE (caso
create table teste ( exista) e recri-la. So dois
id number(10,0), comandos DDL, sendo cada
nome varchar2(100), um deles uma transaco com
constraint pk_teste primary COMMIT implcito. Depois do
key (id) COMMIT implcito do segundo
); comando inicia-se uma nova
transaco.

2 insert into teste (id,nome) values Dentro da transaco so


(1,'Jos'); inseridas vrias linhas na
insert into teste (id,nome) values tabela TESTE. Depois
(2,'Joo'); verificamos que as linhas
insert into teste (id,nome) values esto l. Estas alteraes
(3,'joo'); ainda no foram confirmadas.
insert into teste (id,nome) values
(4,'joaquim');
select * from teste;
Prof: Msc. Hugo Dias Dos Santos
1. Transaco
3 SAVEPOINT Joao_1; Criar o SAVEPOINT
Joao_1
133
4 update teste Alterar o nome 'joo'
set nome='JOAO' para 'JOAO'
where nome = 'joo';
5 SAVEPOINT Joao_2; Criar o SAVEPOINT
Joao_2

6 select * from teste; Verificar que o update


anterior foi bem
sucedido. A
transaco ainda no
terminou, pelo que as
alteraes ainda no
so definitivas

7 update teste Alterar o nome 'jos'


set nome='JOSE' para 'JOSE'
where nome = 'jos';
Prof: Msc. Hugo Dias Dos Santos
1. Transaco
8 select * from teste; Verificar que o update anterior foi
bem sucedido. As duas alteraes
134 feitas na transaco so visveis, mas
ainda no definitivas.
9 rollback to savepoint Desfazer as alteraes at ao
Joao_2; SAVEPOINT 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 alteraes at ao
Joao_1; SAVEPOINT Joao_1
12 select * from teste; Verificar que o update JOAO foi
desfeito
13 rollback; Desfazer as alteraes at ao inicio
da transaco
14 select * from teste; Verificar que a tabela no tem linhas.
Os comandos INSERT fazem parte da
transaco e foram desfeitos.
Um comando COMMIT executado no meio dos comandos anteriores
tornaria as alteraes
Prof: Msc. feitas at Dos
Hugo Dias a definitivas,
Santos e portanto um
ROLLBACK posterior no seria capaz de as desfazer.
1. Transaco / AUTOCOMMIT
135
Dentro do ambiente SQL*Plus e em alguns clientes Oracle (por exemplo o TOAD ou
o SQL Navigator) existe a opo AUTOCOMMIT que permite a confirmao implicita
de um comando logo que termina a sua execuo.
Quando esta opo est activa cada comando uma transaco.
Uma alterao a um dado implica o "esmagamento" de um novo valor sobre um
valor antigo.
Para possibilitar o ROLLBACK da alterao a base de dados necessita guardar o
valor antigo, o que ocorre nas seguintes circunstncias:
Quando feito um UPDATE ou DELETE na prpria transaco, sendo guardado enquanto
esta estiver a decorrer;
Quando a nossa transaco est a fazer consultas (SELECT) e possui o nvel de isolamento
SERIALIZABLE e existe outra transaco que ao mesmo tempo altera os dados que a nossa
est a ler. A imagem anterior dos dados mantida por causa do nvel de isolamento e
enquanto a nossa transaco no terminar;
Do ponto de vista de desempenho ao activar a opo AUTOCOMMIT estamos a
beneficiar a base de dados. Isto porque o volume de dados necessrio para fazer
ROLLBACK aumenta com o aumento do nmero de instrues que formam a
transaco e neste caso temos apenas uma.
No exemplo abaixo vemos como activar e desactivar a opo AUTOCOMMIT. Esta
sintaxe vlida no SQL*PLus:
set autocommit on; Prof: Msc. Hugo Dias Dos Santos
2. Bloqueios
136

Numa base de dados, os dados so consultados


e alterados concorrentemente pelos vrios
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
transaco terminar.
A segunda transaco ter que esperar que o
bloqueio seja retirado, o que s acontece
quando a primeira transaco termina.
Prof: Msc. Hugo Dias Dos Santos
2.1 Bloqueio em actualizao de dados
137
O exemplo abaixo mostra como uma actualizao
de dados entre duas sesses diferentes activa um
bloqueio:
Tempo sesso1 Sesso comentrio
2
1 drop table teste; Na sesso 1 removemos
create table teste ( a tabela TESTE (caso
id number(10,0), exista) e recriamo-la. So
nome dois comandos DDL,
varchar2(10), sendo cada um deles
constraint uma transaco com
pk_teste primary COMMIT implcito. Depois
key (id)); do COMMIT implcito do
segundo comando inicia-
se uma nova transaco
na sesso 1.
2

Prof: Msc. Hugo Dias Dos Santos


2.1 Bloqueio em actualizao de
dados
138

2 insert into teste A sesso 1 insere vrias linhas


(id,nome) values na tabela TESTE e confirma as
(1,'aaaaaa'); alteraes.
insert into teste
(id,nome) values
(2,'bbbbbb');
insert into teste
(id,nome) values
(3,'cccccc');
commit;
3 select * from teste; A sesso 1 inicia uma
update teste set transaco que muda o nome
nome='AAAA where da linha 1. Esta alterao no
id=1; confirmada e portanto a
select * from teste; transaco no termina. A linha
recebe um bloqueio (LOCK) que
se manter activo enquanto a
Prof: Msc. Hugo Dias Dos Santos
transaco no terminar.
2.1 Bloqueio em actualizao de
4
dados select * from teste; A sesso 2 inicia uma
139
update teste transaco que muda o
set nome='BBBBBB' nome da linha 2. Esta
where id=2; alterao no confirmada
select * from teste; e portanto a transaco no
termina.
5 update teste Dentro da mesma
set nome='aaaAAA' transaco iniciada no passo
where id=1; anterior a sesso 2 tenta
mudar o nome da linha 1.
No passo 3 a sesso 1
bloqueou o acesso a esta
linha, pelo que a sesso 2
fica espera que a sesso 1
levante o bloqueio.
6 commit; A sesso 1 termina a
transaco e retira o
bloqueio.
7 select * from teste; A sesso 2 fica
Prof: Msc. Hugo Dias Dos Santos
desbloqueada e continua a
2.1 Bloqueio em actualizao de
dados
140

8 select * A sesso 1 ainda no v as


from teste; alteraes feitas pela sesso
2 porque estas no foram
confirmadas.

9 commit; A sesso 2 termina a


transaco confirmando as
alteraes.

tempo Sesso 1 Sesso 2 comentrio

Prof: Msc. Hugo Dias Dos Santos


2.2 Bloqueio infinito (DEAD LOCK)
141

O ponto anterior mostra que uma


transaco que pretenda alterar um
dado que est bloqueado fica espera
que o LOCK seja libertado.
Este facto origina situaes em que duas
transaces concorrentes ficam espera
uma da outra indefinidamente, o que
conhecido por "DEAD LOCK.
Esta situao ilustra-se no exemplo
abaixo:
Prof: Msc. Hugo Dias Dos Santos
2.2 Bloqueio infinito (DEAD LOCK)
Tempo sesso1 Sesso comentrio
2
142
1 drop table teste; Na sesso 1 removemos
create table teste ( a tabela TESTE (caso
id number(10,0), exista) e recriamo-la. So
nome dois comandos DDL,
varchar2(10), sendo cada um deles
constraint pk_teste uma transaco com
primary key (id) COMMIT implcito. Depois
); do COMMIT implcito do
segundo comando inicia-
se uma nova transaco
na sesso 1.
2 insert into teste (id, A sesso 1 insere vrias
nome) values linhas na tabela TESTE e
(1,'aa'); confirma as alteraes.
insert into teste
(id,nome) values
(2,'bbbbbb');
insert into teste (id,
nome) values Prof: Msc. Hugo Dias Dos Santos
(3,'cccc');
2.2 Bloqueio infinito (DEAD LOCK)
Tempo sesso1 Sesso 2 comentrio
143 3 update teste A sesso 1 inicia uma
set nome='AA' transaco que muda o
where id=1; nome da linha 1. Esta
alterao no
confirmada e portanto a
transaco no termina.
A linha recebe um
bloqueio (LOCK) que se
manter activo enquanto
a transaco no
terminar.
4 update teste A sesso 2 inicia uma
set transaco que muda o
nome='BBBB' nome da linha 2. Esta
where id=2; alterao no
confirmada e portanto a
transaco no termina.
A linha recebe um
bloqueio (LOCK) que se
manter activo enquanto
Prof: Msc. Hugo Dias Dos Santos
a transaco no
2.2 Bloqueio infinito (DEAD LOCK)
144 Tempo sesso1 Sesso 2 comentrio
5 update teste A sesso 1 tenta alterar a
set linha 2 que est
nome='bbbBB bloqueada pela sesso 2
B' e por isso fica espera.
where id=2;
6 update teste A sesso 2 tenta alterar a
set linha 1 que est
nome='aaaAA bloqueada pela sesso 1
A' e por isso fica espera.
where id=1;
7 update teste As duas sesses esto
* espera uma da outra,
ERROR at line situao que se manteria
1: eternamente, se no
ORA-00060: fosse a interveno da
deadlock base de dados que
detected while detecta e termina o
waiting comando
Prof: Msc. Hugo Dias Dos Santos UPDATE da
for resource sesso 1.
2.2 Bloqueio infinito (DEAD LOCK)
Tempo sesso1 Sesso 2 comentrio
8
145 select * from A transaco da sesso 1 ainda
teste; no terminou. O primeiro UPDATE
mantm-se mas o segundo foi
abortado. O LOCK sobre a linha 1
continua a bloquear a sesso 2. A
sesso 1 pode decidir abortar o
trabalho ou tentar de novo.
9 rollback; Na transaco da sesso 1 o
primeiro comando correu bem,
mas o segundo correu mal, pelo
que foi decidido cancelar a
transaco e portanto os dados
voltam verso inicial.
10 Select * Logo que a sesso 1 liberta a linha
from teste; 1 a sesso 2 prossegue a
transaco em curso, alterando a
linha com ID 1;
11 commit; A transaco da sesso 2 termina
e Dosos
Prof: Msc. Hugo Dias respectivos LOCKS so
Santos
libertados. A sesso 1 j pode ver
2.2 Bloqueio infinito (DEAD LOCK)
146

Os exemplos ilustrados anteriormente mostram que os


DEAD LOCKS so detectados de forma automatica pela
base de dados, sendo terminada a transaco que lhe
deu origem;
Embora os DEAD LOCKs sejam resolvidos de forma
automtica pela base de dados, so situaes que
devem ser evitadas, pois uma das transaces termina
de forma inesperada;
Os DEAD LOCKs podem ser evitados se todas as
transaces que fazem actualizaes sucessivas aos
mesmos dados seguirem a mesma sequncia, 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 clusula FOR UPDATE


que permite activar um LOCK sobre todas as linhas
seleccionadas pelo comando.
Este LOCK impede que outras sesses da base de
dados alterem estas linhas enquanto a transaco
actual no 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 no podem fazer alteraes nessas
linhas, o que pode gerar tempos de espera
enormes.
Prof: Msc. Hugo Dias Dos Santos
2.3 sesso1
Temp
o
SELECT FOR UPDATE
Sesso comentrio
2
1 drop table teste; Depois do COMMIT implcito do
148
create table teste segundo comando inicia-se uma
(id number(10,0), nova transaco na sesso 1.
nome
varchar2(10),
constraint
pk_teste primary
key (id));
2 insert into teste A sesso 1 insere vrias linhas na
(id, nome) values tabela TESTE e confirma as
(1,aa'); alteraes.
insert into teste
(id, nome) values
(2,'bb');
insert into teste
(id, nome) values
(3,'cc');
commit;
3 select id, nome A sesso 1 inicia uma transaco
from teste executando o comando SELECT
where id=1 Prof: Msc. Hugo Dias Dos
comSantos
a clusula FOR UPDATE. A
for update; base de dados coloca um LOCK
Temp sesso1 Sesso 2 comentrio
o
4
2.3 SELECT
select id,
FORA sesso
UPDATE2 inicia uma transaco
149
nome executando o mesmo comando
from teste SELECT com a clusula FOR
where id=1 UPDATE. A sesso 2 vai ficar
for update; bloqueada esperando que a
sesso 1 liberte o LOCK;
5 update teste A sesso 1 altera os dados da
set linha 1, enquanto a sesso 2
nome='AAA continua espera;
A'
where
id=1;
6 commit; A sesso 1 termina a transaco
e liberta o LOCK. A sesso 2
retoma o trabalho bloqueando a
linha 1;

7 commit; A sesso 2 termina a transaco


e liberta o LOCK;
Prof: Msc. Hugo Dias Dos Santos
2.3 SELECT FOR UPDATE
150

No exemplo anterior a sesso 2 ficou bloqueada


quando tentou aceder a um recurso que tinha um
LOCK.
A sesso 2 no recebe uma estimativa do tempo
de espera, pois este depende apenas da sesso 1.
A opo NO WAIT pode ser adicionada clusula
FOR UPDATE, permitindo a interrupo imediata
do comando SELECT FOR UPDATE quando o
recurso acedido se encontra bloqueado.
O exemplo a seguir mostra a sua utilizao:

Prof: Msc. Hugo Dias Dos Santos


Temp sesso1 Sesso 2 comentrio
o
1 drop table teste; Na sesso 1 removemos a
151
create table teste tabela TESTE (caso exista) e
( recriamo-la. So dois comandos
id number(10,0), DDL, sendo cada um deles uma
nome transaco com COMMIT
varchar2(10), implcito. Depois do COMMIT
constraint implcito do segundo comando
pk_teste primary inicia-se uma nova transaco
key (id) na sesso 1.
);
2 insert into teste A sesso 1 insere vrias linhas
(id, nome) values na tabela TESTE e confirma as
(1,'aa'); alteraes.
insert into teste
(id, nome)
values(2,'bb');
insert into teste
(id, nome) values
(3,'cc');
commit;
3 select id, nomeProf: Msc. Hugo Dias Dos
A Santos
sesso 1 inicia uma
from teste transaco executando o
Temp sesso Sesso 2 comentrio
o 1
4 select id, nome from A sesso 2 inicia uma transaco
152
teste where id in executando um comando SELECT
(1,2) com a clusula FOR UPDATE. Este
for update comando selecciona duas linhas,
nowait; tendo uma delas um LOCK. Como
from teste * foi usada a opo NOWAIT a
ERROR at line 2: execuo do comando abortada
ORA-00054: de imediato.
resource busy and
acquire with
NOWAIT specified
5 select id,nome from A sesso 2 executa o mesmo
teste where id in comando que no exemplo
(1,2) anterior, mas desta vez usa as
for update of opes OF e WAIT. A primeira
teste.nome wait opo muito til quando o
10; query envolve vrias tabelas
from teste * (JOIN), pois evita o bloqueamento
ERROR at line 2: de todas as linhas de todas as
ORA-30006: tabelas envolvidas. A segunda
resource
Prof:busy; opo
Msc. Hugo Dias Dos permite definir um tempo
Santos
acquire de espera, em segundos, pela
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. Nvel de isolamento de uma
transaco
154
Vamos considerar uma transaco 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
transaces, o que coloca em perigo a integridade do seu resultado.
Este problema coloca-se apenas com os dados de leitura, pois quando
a transaco altera dados a base de dados activa LOCKS que impedem
a sua modificao em simultneo por outras transaces.
Em termos tericos, enquanto a transaco decorre os dados por ela
vistos no podem ser alterados.
A soluo fcil para este problema bloquear os dados que esto a ser
lidos(LOCK), o que impediria alteraes por outros utilizadores.
Mas isto viola um princpio importante: numa base de dados quem
l dados no pode prejudicar quem escreve.
Para ultrapassar este problema a base de dados deve fornecer um
mecanismo que permita transaco, durante a sua durao,
trabalhar com a imagem inicial dos dados, tornando-a assim imune a
alteraes.
Prof: Msc. Hugo Dias Dos Santos
3. Nvel de isolamento de uma transaco
155
O nvel de isolamento de uma transaco mede a independncia desta em
relao s alteraes nos dados por ela lidos feitas por outras transaces.
Uma transaco tem um elevado nvel de isolamento se for absolutamente
imune a essas alteraes.
Pelo contrrio, ser pouco isolada se os seus resultados perderem integridade
com as alteraes feitas por outras transaces.
A norma SQL92 define 4 nveis de isolamento de transaces aos quais
correspondem diferentes graus de impacto nos resultados.
Estes nveis so definidos tendo em conta 3 situaes que podem ocorrer
quando so executadas simultaneamente duas transaces que acedem aos
mesmos dados concorrentemente:
DIRTY READS - A transaco 2 consegue ler dados que foram alterados pela transaco 1
embora a transaco 1 ainda no tenha confirmado essas alteraes;
NONREPEATABLE (FUZZY) READS - Dentro da mesma transaco so executadas duas
consultas. O resultado da primeira difere do resultado da segunda porque tem menos uma linha
ou porque uma linha tem um contedo diferente. Isto porque entre a primeira e a segunda
consulta outra transaco apagou uma linha ou modificou uma linha;
PHANTOM READS - Dentro da mesma transaco so 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 transaco inseriu uma nova linha;

Prof: Msc. Hugo Dias Dos Santos


3. Nvel de isolamento de uma transaco
156

O quadro abaixo descreve a forma como os 4


nveis de isolamento definidos pela norma
SQL92 se comportam perante as 3 situaes
referidas antes:
NONREPEATABLE (FUZZY)
Nvel de isolamento DIRTY READS PHANTOM READS
READS

READ UNCOMMITED Pode ocorrer Pode ocorrer Pode ocorrer

READ COMMITED No ocorre Pode ocorrer Pode ocorrer

REPEATABLE READ No ocorre No ocorre Pode ocorrer

SERIALIZABLE No ocorre No ocorre No ocorre

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

Se o utilizador quizer um elevado nvel de isolamento para


a sua transaco a base de dados disponibiliza o modo de
funcionamento SERIALIZABLE, que pode ser activado ao
nvel da sesso ou ao nvel da transaco, usando os
comandos abaixo:
--alterar ao nvel da sesso
ALTER SESSION SET ISOLATION_LEVEL = SERIALIZABLE;
--alterar ao nvel da transaco
EXEMPLO
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

O nvel de isolamento por omisso pode


ser reposto com
--alterar os comandos
ao nvel da sesso abaixo:
ALTER SESSION SET ISOLATION_LEVEL = READ COMMITTED;
--alterar ao nvel da transaco
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
Prof: Msc. Hugo Dias Dos Santos
Tempo Sesso 1 Sesso 2 Comentrio
drop table teste; Na Sesso 1 removemos a tabela
create table teste TESTE (caso exista) e recriamo-la. So
(id number(10,0), dois comandos DDL, sendo cada um
1
158 nome varchar2(10), deles uma transaco com COMMIT
constraint implcito. Depois do COMMIT implcito
pk_teste primary do segundo comando inicia-se uma nova
key (id)); transaco na Sesso 1.
commit;
Forar o inicio de uma nova
SET TRANSACTION
transaco na Sesso 2.
ISOLATION
Definir ao nvel da transaco o nvel
2 LEVEL
SERIALIZABLE; de isolamento SERIALIZABLE.
Select*from Verificar que a nova tabela j
teste; visvel.
insert into teste
(id,nome) values
(1,'aaaaaa');
insert into teste (id,
A Sesso 1 insere vrias linhas na tabela
3 nome)values
(2,'bbbbbb'); TESTE mas no confirma as alteraes.
insert into teste (id,
nome) values
(3,'cccccc');

Prof: Msc. Hugo Dias Dos Santos


select * from As alteraes feitas na tabela TESTE pela Sesso 1 so
4 teste; visiveis na prpria sesso.

As alteraes feitas na tabela TESTE pela Sesso 1


159 select * from
5 teste; ainda no so visveis na Sesso 2 pois ainda no esto
confirmadas.

A Sesso 1 confirma as alteraes e termina a


6 commit;
transaco actual.

As alteraes feitas na tabela TESTE no ficam visveis


select * from
7 teste; na Sesso 2, mesmo que j confirmadas, visto que foi
definido como nvel de isolamento SERIALIZABLE.

update teste
set nome= 'CCCCCC' A Sesso 1 executa um UPDATE e confirma a alterao,
8 where id=3; terminando a transaco. Esta alterao visvel na
commit; Sesso 1.
Select*from teste;

A Sesso 2 continua na mesma transaco e executa o


select * from
9 teste; mesmo SELECT pela quarta vez, obtendo o memso
resultado das execues anteriores.
Prof: Msc. Hugo Dias Dos Santos
delete from teste A Sesso 1 apaga uma linha e
where id = 2;
confirma a alterao, terminando
10 commit;
160 select * from a transaco. A alterao visivel
teste; na Sesso 1.

A Sesso 2 continua na mesma


transaco e executa o mesmo
select *
11 from teste; SELECT pela quinta vez,
obtendo o mesmo resultado das
execues anteriores.

insert into teste


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

14 commit; A Sesso 2 termina a transaco actual.

select * A Sesso 2 finalmente v os dados


15 from teste; confirmados pela Sesso 1.

Prof: Msc. Hugo Dias Dos Santos


4. SERIALIZABLE /
162
SERIABILIDADE
Este exemplo mostra que a Sesso 2 s consegue ver as alteraes feitas
pela Sesso 1 que foram confirmadas e que a Sesso 2 executou o mesmo
SELECT vrias vezes dentro da mesma transaco, tendo obtido sempre o
mesmo resultado, mesmo com transaces externas a fazerem INSERT,
UPDATE e DELETE. O grau de isolamento foi total;
Como o isolamento foi definido ao nvel da transaco, quando esta termina
a sesso volta a trabalhar com o nvel READ COMMITED.
Do ponto de vista terico o nvel SERIALIZABLE muito interessante, mas na
prtica 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 espao adicional nos segmentos de rollback, que tm
armazenamento finito, e obriga a uma carga acrescida de I/O e CPU.
Na maior parte das situaes o nvel READ COMMITED suficiente, sendo por
isso o nvel por omisso. O programador deve estar atento s situaes
especiais onde requerido o nvel SERIALIZABLE para o activar.
OBS: At h pouco tempo atrs algumas bases de dados disponveis no
mercado no faziam sequer READ COMMITED.

Prof: Msc. Hugo Dias Dos Santos


VI
163

Administrao
8.1 - Backup e Restore
8.2 - Importar e Exportar
8.3 - Converter
8.4 - Otimizao e

Desempenho
Prof: Msc. Hugo Dias Dos Santos
164

Prof: Msc. Hugo Dias Dos Santos


165

Prof: Msc. Hugo Dias Dos Santos


166

Prof: Msc. Hugo Dias Dos Santos


167

Ob
rig
Pe ado
Ate la
n
o
Perguntas ou dvidas???
Prof: Msc. Hugo Dias Dos Santos
Prof: Santos
Outros Comandos
168

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: informaes interessantes.

Prof: Msc. Hugo Dias Dos Santos


BIBLIOGRAFIA
169

[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
170

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


Jorge Surian e Prof. Luiz Nicochelli 2014
INTRODUO A BANCO DE DADOS: Osvaldo
Kotaro Takai, Isabel Cristina Italiano, Joo 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). Pgina visitada em 15 de Agosto de 2014.
Viso geral de Segurana em Bancos de Dados
(PDF). Universidade Catlica de Braslia pp. 1. Ly-
online. Pgina visitada em 16 de Agosto de 2014.

Prof: Msc. Hugo Dias Dos Santos


BIBLIOGRAFIA
171

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#DML
; Banco de Dados - SQL Server

Prof: Msc. Hugo Dias Dos Santos


ANEXO A Lista de Funes do SQL/oracle
172

As funes SQL so divididas


As funes de uma linha so dividias
em categorias, segue: em sub-categorias, segue:

Funes de uma linha Funes Numricas


Funes de Funes
agregaoes (ou Alfanumricas
agregadas)
Funes de Data e
Funes analticas
Hora
Funes de referncia
objeto
Funes de
Funes de modelo converso
Funes definidas Funes de coleo
pelo usurio Funes variadas

Prof: Msc. Hugo Dias Dos Santos


ANEXO A Lista de Funes
173
do SQL
Funes de Uma Linha
POWER


Numricas
ABS REMAINDER
ACOS
ASIN ROUND(numero)
ATAN
ATAN2
SIGN
BITAND SIN
CEIL
COS SINH
COSH SQRT
EXP
FLOOR TAN
LN
LOG TANH
MOD TRUNC(numero)
NANVL
WIDTH_BUCKET
Prof: Msc. Hugo Dias Dos Santos
ANEXO A Lista de Funes
174
do SQL
Caracter
Caracter com

CHR
CONCAT
INITCAP
LOWER
retorno
LPAD
LTRIM
numrico
NLS_INITCAP
NLS_LOWER ASCII
NLSSORT
NLS_UPPER INSTR
REGEXP_REPLACE
REGEEXP_SUBSTR
REPLACE
LENGTH
RPAD
RTRIM
REGEXP_INSTR
SOUNDEX
SUBSTR
TRANSLATE
TREAT
TRIM
UPPER

Prof: Msc. Hugo Dias Dos Santos


ANEXO A Lista de Funes
175
do SQL
Data/Hora Converso
ADD_MONTHS ASCIISTR
CURRENT_DATE BIN_TO_NUM
CURRENT_TIMESTAMP CAST
DBTIMEZONE CHARTOROWID
EXTRACT(data/hora) COMPOSE
FROM_TZ CONVERT
LAST_DAY DECOMPOSE
HEXTORAW
LOCALTIMESTAMP
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 Funes
176
do SQL
TO_MULTI_BYTE Coleo
TO_NCHAR(data/hora) CARDINALITY
TO_NCHAR(numero)
TO_NCLOB
COLLECT
TO_NUMBER POWERMULTISET
TO_DSINTERVAL POWERMULTISET_
TO_SINGLE_BYTE BY_CARDINALITY
TO_TIMESTAMP SET
TO_TIMESTAMP_TZ
TO_YMINTERVAL
TRANSLATE USING
UNISTR
Prof: Msc. Hugo Dias Dos Santos
ANEXO A Lista de Funes
177
do SQL
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 Funes
178
do SQL
Funes de agregao (ou
agregadas)
Funes de grupo MIN
PERCENTILE_CONT
AVG PERCENTILE_DISC
COLLECT PERCENT_RANK
CORR RANK
CORR_* REGR_Funes (Regresso Linear)
COUNT STATS_CROSSTAB
COVAR_POP STATS_F_TEST
STATS_KS_TEST
COVAR_SAMP
STATS_MODE
CUME_DIST STATS_MW_TEST
DENSE_RANK STATS_ONE_WAY_ANOVA
FIRST STATS_T_TEST_*
GROUP_ID STATS_WSR_TEST
GROUPING STDDEV
STDDEV_POP
GROUPING_ID
STDDEV_SAMP
LAST SUM
MAX VAR_POP
MEDIAN VAR_SAMP
VARIANCE

Prof: Msc. Hugo Dias Dos Santos


ANEXO A Lista de Funes
179
do SQL
Funes de Referncia a
Funes Modelo
Objeto

DEREF CV
MAKE_REF ITERATION_NUMB
REF ER
REFTOHEX7 PRESENTNNV
VALUE PRESENTV
PREVIOUS

Prof: Msc. Hugo Dias Dos Santos


ANEXO A Lista de Funes
180
do SQL
Funes Analticas
As funes analticas so utilizadas principalmente para por exemplo a
extrao de dados gerenciais na base de dados. O Oracle o banco que mais
possui dessas funes, mas muitos SGBDs atuais j contm essas funes
disponveis em suas novas verses.
Vamos dar um exemplo para utilizar essas funes:
Imagine que voc tenha um sistema de cobrana na sua empresa. Seus
recebimentos so baseados em contratos, ou seja, todos os meses voc
realiza vendas e, como as vendas so financiadas, voc tem um fluxo
freqente de parcelas.
Voc recebe a seguinte misso do diretor financeiro: preciso saber quais so
os contratos com os maiores valores de prestao a cada ms. Seria
relativamente simples oferecer esta resposta caso o diretor no tivesse
includo contratos na frase. Saber o valor das prestaes a cada ms
muito simples.
Para resolver este problema, voc precisar utilizar a partcula OVER do
comando SELECT. Com esta opo possvel, alm de extrair dados
sumarizados, mostrar as linhas analticas (detalhe) ao mesmo tempo.

Prof: Msc. Hugo Dias Dos Santos


ANEXO A Lista de Funes
181
do SQL
Ao utilizar o OVER voc poder estabelecer uma quebra (ou
particionamento) para sua anlise. Veja no comando a seguir:
Cdigo:
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 atuao da funo de grupo (MAX) e do
particionamento da pesquisa (OVER). Neste caso, est sendo mostrado o
maior valor de prestao de cada ms. 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 analticos (VLPREST, CDCONTR e DTVENC) ao mesmo tempo que
trabalhamos o maior valor do ms (MAX_PREST). Desta forma possvel
observarmos quais so os contratos, os valores originais das prestaes e o
maior valor daquele ms.

Prof: Msc. Hugo Dias Dos Santos


ANEXO A Lista de Funes
182
do SQL
Naturalmente no exatamente isto que o diretor pediu Ele quer apenas o maior
valor do ms e qual o contrato. Podemos notar que o maior valor do ms 10/2006
o contrato 56 cujo valor R$ 695,09 (alis, o nico contrato deste ms). J nos
meses seguintes nota-se que o maior valor do ms 11/2006 R$ 11.452,35 do
contrato 33. E assim sucessivamente.
Para oferecermos apenas o resultado esperado pelo diretor, precisamos ir alm no
nosso comando:
Cdigo:
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 clusula FROM, pode-se extrair somente as linhas que
interessam, ou seja, aqueles contratos e prestaes que tm o maior valor de
prestao a cada ms (comparao do MAX_PREST e do VLPREST) na segunda
clusula WHERE. O resultado pode ser visto na imagem abaixo:

Prof: Msc. Hugo Dias Dos Santos


Prof: Msc. Hugo Dias Dos Santos 183

ANEXO
B
ANEXO B: MASCARA_DATA
184

MASCARA_DATA
A tabela abaixo mostra os valores possveis para a
mscara da data:
FORMATO: SIGNIFICADO
SCC ou CC: Sculo; 'S' faz preceder de '-' as datas
'BC' (Antes de Cristo)
YYYY ou SYYYY: Sculo; '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 posio

Prof: Msc. Hugo Dias Dos Santos


ANEXO B: MASCARA_DATA
185

SYEAR ou YEAR: Ano por extenso (em ingls); '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: Ms em nmero de 1..12
MONTH: Nome do ms preenchido com espaos at 9
caracteres (Setembro)
MON: Nome do ms com trs letras (JAN, FEB, MAY,...)
WW, IW ou W: Semana do ano formato Oracle, semana
do ano formato ISO ou semana do ms

Prof: Msc. Hugo Dias Dos Santos


ANEXO B: MASCARA_DATA
186

DDD ou DD ou D:dia do ano, ms ou semana


DAY: Nome do dia da semana, por extenso,
preenchido com espaos at 9 caracteres
DY: Nome do dia da semana com dois caracteres
J: Dia do calendrio Juliano; o nmero 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
187

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 cdigos anteriores;
utilizado em MONTH ou DAY suprime o preenchimento de
espaos; usado com nmeros suprime os zeros esquerda
TH, SP, SPTH, THSP: Sufixos que converte um nmero em
ordinal ou por extenso; usando os dois fica nmero por
extenso ordinal
/.,: Os smbolos de pontuao so reproduzidos no resultado
"string A string reproduzida no resultado mas tem que vir
entre aspas

Prof: Msc. Hugo Dias Dos Santos


ANEXO
188

CProf: Msc. Hugo Dias Dos Santos


ANEXO C: Os nveis de
189
isolamento
Os nveis de isolamento disponibilizados na
base de dados Oracle so READ COMMITTED e
SERIALIZABLE.
Por omisso funciona no modo READ
COMMITTED o que significa que no possvel
ocorrerem DIRTY READS, mas podem ocorrer
NONREPEATABLE (FUZZY) READS ou PHANTOM
READS.
O exemplo a seguir apresentado comparam os
dois nveis de isolamento e a forma como a
transaco por eles afectada.
Prof: Msc. Hugo Dias Dos Santos
ANEXO C: Os nveis de isolamento /READ
COMMITTED
190
Tempo Sesso 1 Sesso 2 Comentrio
Na Sesso 1 removemos a tabela
drop table teste;
TESTE (caso exista) e recriamo-la.
create table teste (
So dois comandos DDL, sendo
id number(10,0),
cada um deles uma transaco
1 nome varchar2(10),
com COMMIT implcito. Depois do
constraint pk_teste
COMMIT implcito do segundo
primary key (id)
comando inicia-se uma nova
);
transaco na Sesso 1.
Forar o inicio de uma nova
commit;
transaco na Sesso 2 e
2 select * from
teste; verificar que a nova tabela j
visvel.
insert into teste (id,nome)
values (1,'aaaaaa');
A Sesso 1 insere vrias linhas na
insert into teste (id,nome)
3 tabela TESTE mas no confirma
values (2,'bbbbbb');
as alteraes.
insert into teste (id,nome)
values (3,'cccccc');
Prof: Msc. Hugo Dias Dos Santos
As alteraes feitas na tabela TESTE pela Sesso 1 so visiveis
4 select * from teste;
na prpria sesso.

select * from As alteraes feitas na tabela TESTE pela Sesso 1 ainda no so


5 teste; visveis na Sesso 2 pois ainda no esto confirmadas.
191

6 commit; A Sesso 1 confirma as alteraes e termina a transaco actual.

As alteraes feitas na tabela TESTE pela Sesso 1 ficam visveis


na Sesso 2 visto que j foram confirmadas (READ
select * from
7 teste; COMMITED). a terceira vez que executamos o mesmo
SELECT dentro da mesma transaco e obtemos um resultado
diferente. Estamos numa situao PHANTOM READ.
update teste
set nome = 'CCCCCC'
A Sesso 1 executa um UPDATE e confirma a alterao,
8 where id=3;
commit; terminando a transaco. Esta alterao visvel na Sesso 1.
select * from teste;

A Sesso 2 continua na mesma transaco e executa o mesmo


select * from SELECT pela quarta vez, obtendo um resultado diferente das
9 teste; execues anteriores. Estamos numa situao
NONREPEATABLE (FUZZY) READ.

delete from teste


where id = 2; A Sesso 1 apaga uma linha e confirma a alterao, terminando a
10 commit; transaco. A alterao visivel na Sesso 1.
select * from teste;

Prof: Msc. Hugo Dias Dos Santos


A Sesso 2 continua na mesma transaco e executa o
mesmo SELECT pela quinta vez, obtendo um resultado
11
diferente das execues anteriores. Estamos numa situao
192 NONREPEATABLE (FUZZY) READ.

insert into
teste (id,nome)
values
A Sesso 1 insere uma linha e confirma a alterao,
12 (4,'dddddd');
commit; terminando a transaco. A alterao visivel na Sesso 1.
select * from
teste;
A Sesso 2 continua na mesma transaco e executa o
select *
mesmo SELECT pela sexta vez, obtendo um resultado
13 from
teste; diferente das execues anteriores. Estamos numa situao
PHANTOM READ.
14 commit; A Sesso 2 termina a transaco actual.
select *
15 from A Sesso 2 continua a ver o que j via.
teste;

Prof: Msc. Hugo Dias Dos Santos


ANEXO C: Os nveis de
193
isolamento
Este exemplo mostra que a Sesso 2 s consegue ver
as alteraes feitas pela Sesso 1 que foram
confirmadas;
Este exemplo tambm mostra que a Sesso 2 executou
o mesmo SELECT vrias vezes dentro da mesma
transaco, tendo obtido resultados diferentes em cada
execuo o que mostra que foi sensvel a alteraes
feitas aos dados por outras transaces;
Este nvel de isolamento evita DIRTY READS, mas no
garante REPEATABLE READS. Por ser um bom
compromisso entre desempenho e coerncia de dados
o nvel de isolamento usado por omisso na base de
dados Oracle.
Prof: Msc. Hugo Dias Dos Santos
ANEXO D: Triggers
194

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 so os comandos da DML (Data
Manipulation Language): INSERT, REPLACE, DELETE ou
UPDATE. Podemos definir inmeros 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 podero 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
195

O cdigo 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 prprio
utilizador criou (o utilizador que tem a sesso 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 pertenam
a outros utilizadores, estes deram privilgios de leitura ao
utilizador actual.
A terceira requer um privilgio 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 privilgios especiais*/

Prof: Msc. Hugo Dias Dos Santos


Juno entre trs tabelas
196

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 / clusulas
197

ROLLUP: A clusula ROLLUP usada juntamente com GROUP BY e


permite agregaes sobre grupos de linhas.
Usando funes de grupo conseguimos determinar a soma de salrios
por funo mas, usando um nico query, no conseguimos
determinar tambm a soma total de todos salrios.
Adicionando a clusula 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 extenso de ROLLUP que permite as
agregaes totais por todas as colunas envolvidas. Na prtica 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

Vous aimerez peut-être aussi