Vous êtes sur la page 1sur 31

Esquemas de Bancos de Dados............................................................................................................................

2
lgebra Relacional...............................................................................................................................................4
Operaes Fundamentais..................................................................................................................................4
Seleo..........................................................................................................................................................4
Projeo........................................................................................................................................................5
Produto Cartesiano.......................................................................................................................................5
Renomeao.................................................................................................................................................6
Unio............................................................................................................................................................7
Diferena......................................................................................................................................................8
Operaes Adicionais.....................................................................................................................................12
Interseo....................................................................................................................................................12
Juno Natural............................................................................................................................................13
Diviso........................................................................................................................................................14
Clculo Relacional..............................................................................................................................................16
Clculo Relacional de Tuplas.........................................................................................................................16
Definies Formais.....................................................................................................................................16
Exemplos....................................................................................................................................................16
Clculo Relacional de Domnios....................................................................................................................18
Definies Formais.....................................................................................................................................18
Exemplos....................................................................................................................................................18
QBE................................................................................................................................................................19
SQL.....................................................................................................................................................................21
Declarao de Domnios.................................................................................................................................22
Manipulao de Tabelas.................................................................................................................................22
DML...............................................................................................................................................................22
DQL................................................................................................................................................................23
Segunda Lista de Exemplos............................................................................................................................24
Terceira Lista de Exemplos............................................................................................................................25
SQL Embutida................................................................................................................................................27
Reconhecendo Comandos SQL Embutidos................................................................................................27
Uma Primeira Viso da SQL Embutida......................................................................................................27
Variveis da Linguagem Hospedeira na SQL Embutida............................................................................27
Declarao de Variveis.............................................................................................................................28
SELECT na SQL Embutida........................................................................................................................28
UPDATE em SQL Embutida......................................................................................................................28
DELETE e INSERT na SQL Embutida......................................................................................................28
Outros Comandos SQL Embutidos............................................................................................................29
Cursores......................................................................................................................................................29
O Uso de Cursores Para UPDATE e DELETE..........................................................................................29

Esquemas de Bancos de Dados


Um esquema de relao uma lista de atributos e seus domnios correspondentes. Um esquema de
banco de dados o projeto lgico do BD enquanto uma instncia de banco de dados o conjunto de dados
no BD em um determinada instante.
Exemplo: Considere-se um modelo bancrio com cinco relaes depsitos, emprstimos,
correntistas, filiais e clientes. Os esquemas correspondentes poderiam ser:
Depsitos
Depsito_esquema(nome_f,conta_#,nome_c,saldo) ou
Depsito_esquema(nome_f:string,conta_#:inteiro,nome_c:string,saldo:inteiro)
Filiais
Filial_esquema(nome_f,ativo,cidade_f)
Correntistas
Correntista_esquema(nome_c,rua,cidade_c)
Emprstimos
Emprstimos_esquema(nome_f,emprstimo_#,nome_c,valor)
Clientes
Cliente_esquema(nome_c,gerente)

nome_f
Bingen
Botafogo
Flamengo
Flamengo
Icara
Madureira
Madureira

depsitos
conta_#
22473
20018
20210
20500
19872
19880
19890

nome_c
Lindalva
Pedro
Pedro
Paulo
Joo
Rosa
Pedro

saldo

nome_f
Bingen
Flamengo
Icara
Madureira

emprstimos
emprstimo-#
6698
5578
1455
3367

nome_c
Lindalva
Paulo
Joo
Pedro

valor

nome_f
Icara
Bingen
Botafogo
Flamengo
Madureira

filiais
ativo
9000000
17000000
23000000
34000000
21000000

889
8450
5100
2315
3243
5312
4111

1500
2000
1000
2000

cidade_f
Niteri
Petrpolis
Rio de Janeiro
Rio de Janeiro
Rio de Janeiro

correntistas
rua
Miguel de Frias
Gavio Peixoto
Alfenas
Curimat
Cotingo
Mem de S
Curimat
Uruguai

nome_c
Joo
Laerte
Lindalva
Geraldo
Laura
Paulo
Pedro
Rosa

cidade_c
Niteri
Niteri
Petrpolis
Rio de Janeiro
Rio de Janeiro
Rio de Janeiro
Rio de Janeiro
Rio de Janeiro

clientes
nome_c
Joo
Laerte
Laura
Lindalva
Paulo
Pedro

gerente
Erasmo
Pedro
Joo
Joo
Clia
Pedro

lgebra Relacional
A lgebra Relacional uma linguagem de consulta procedimental que possui seis operaes
fundamentais e diversas outras. Cada uma das operaes da lgebra Relacional que se seguem produz como
resultado uma relao.
Operaes fundamentais
Seleo (unria)

Projeo (unria)
Renomeao (unria)
Produto cartesiano (binria)
Unio (binria)
Diferena (binria)
Outras operaes
Interseo

Juno natural
Diviso
Atribuio
Operaes Fundamentais

Seleo
Esta operao seleciona as tuplas que atendem a uma determinada condio. denotada pela letra
grega sigma com o predicado aparecendo como subscrito. A relao argumento aparece entre parnteses
depois do sigma. Para selecionar as tuplas da relao emprstimos aonde a filial seja Madureira, escrevese

nome _ f " Madureira"(empr stimos)

A relao resultado ser constituda de apenas uma tupla


Madureira
3367
Pedro
2000
Para obter os emprstimos superiores a 1200 escreve-se

nome _ f " Madureira"valor 1200(empr stimos)

Para obter os clientes que tenham o mesmo nome que seus gerentes pode-se escrever

nome _ c gerente (clientes)

A relao resultado ser constituda de apenas uma tupla


nome_c
gerente
Pedro
Pedro

Projeo
Esta operao copia de sua relao argumento apenas os atributos especificados. Como uma relao
um conjunto eventuais tuplas duplicadas so eliminadas. Projeo denotada pela letra grega pi maisculo
com os atributos aparecendo como subscritos. Para obter uma relao de emprstimos mostrando apenas os
correntistas e filiais escreve-se

nome _ f ,nome _c empr stimos


obtendo-se
nome_f
Bingen
Flamengo
Icara
Madureira
Madureira

nome_c
Lindalva
Paulo
Joo
Rosa
Pedro

Para obter os nomes dos correntistas que tenham o mesmo nome que seus gerentes escreve-se

nome _c (nome _c gerente (clientes))


obtendo-se
nome_c
Pedro

Produto Cartesiano
O Produto Cartesiano de duas relaes denotado por . O resultado da operao r1 r2 uma nova
relao com uma tupla para cada possvel par de tuplas de r1 e r2. Para evitar ambigidade os atributos tem
seus nomes concatenados com os nomes das relaes a que pertencem. Quando inexiste ambigidade o nome
da relao pode ser omitido.
O resultado da operao uma nova relao. Se r1 possui n1 tuplas e r2 possui n2 tuplas ento r = r1 r2 possui
n1.n2 tuplas. Para encontrar os clientes do gerente Joo e a cidade na qual eles vivem necessita-se de
informaes das relaes correntistas e clientes e pode-se escrever

clientes.nome _ ccorrentistas.nome _ c gerente" Joo " clientes correntisitas


obtendo-se
nome_c
Laura
Lindalva

gerente
Joo
Joo

nome_c
Laura
Lindalva

rua
Cotingo
Alfenas

cidade_c
Rio de Janeiro
Petrpolis

Se desta relao apenas se desejasse o nome do correntista e sua cidade usar-se-ia uma projeo

clientes.nome _c (clientes.nome _ccorrentistas.nome _c gerente" Joo " clientes correntisitas )


obtendo-se
nome_c
Laura
Lindalva

cidade_f
Rio de Janeiro
Petrpolis

Renomeao
A operao de renomeao resolve os problemas que ocorrem quando se faz o produto cartesiano de
uma relao por ela mesma. Considere-se, por exemplo, que se deseja encontrar os nomes dos correntistas que
moram na mesma cidade e na mesma rua que Pedro. Pode-se obter a cidade e a rua de Pedro escrevendo

rua ,cidade _c (nome _c" Pedro" (correntistas))


obtendo-se
rua
Curimat

cidade_c
Rio de Janeiro

Para obter outros correntistas com a mesma informao necessita-se referenciar novamente a relao
correntistas, da forma

P (correntistas (rua ,cidade _ c ( nome _ c" Pedro" (correntistas))))

Na expresso anterior P um predicado de seleo requerendo a igualdade de rua e cidade_c. Para distinguir
entre os diferentes valores de rua aparecendo no produto cartesiano usa-se o operador de renomeao
denotado pela letra grega ro cujo ndice o novo nome da relao e o argumento entre parnteses o nome
anterior, ou seja

corrent 2.rua correntistas.rua corrent 2.cidade _ ccorrentistas.cidade _ c


(correntistas (rua ,cidade _ c ( nome _ c" Pedro" ( corrent 2 (correntistas)))))
obtendo-se
correntistas
rua
Curimat
Curimat
Curimat
Curimat

nome_c
Pedro
Pedro
Geraldo
Geraldo

cidade_c
Rio de Janeiro
Rio de Janeiro
Rio de Janeiro
Rio de Janeiro

nome_c
Pedro
Geraldo
Pedro
Geraldo

corrent2
rua
Curimat
Curimat
Curimat
Curimat

cidade_c
Rio de Janeiro
Rio de Janeiro
Rio de Janeiro
Rio de Janeiro

Como o que se quer dessa relao apenas o nome dos correntistas faz-se uma projeo

correntistas.nome _c (corrent 2.ruacorrentistas.ruacorrent 2.cidade _ccorrentistas.cidade _c


(correntistas (rua ,cidade _ c (nome _ c" Pedro" ( corrent 2 (correntistas))))))

obtendo-se
nome_c
Pedro
Geraldo

Unio
A operao de unio para funcionar tal como na teoria dos conjuntos necessita que as relaes a se
unir tenham o mesmo nmero de atributos e que os domnios dos atributos correspondentes coincidam. Para
encontrar os usurios da agncia Madureira preciso encontrar todos aqueles que ou tenham conta na agncia
ou que tenham feito emprstimos l, escrevendo-se

nome _c nome _ f " Madureira" empr stimos nome _c nome _ f " Madureira" depsitos

Como em todas as operaes de conjuntos as duplicadas so eliminadas e o que se obtm

nome_f
Madureira

emprstimos em Madureira
emprstimo_#
nome_c
3367
Pedro

valor
2000

emprstimos em Madureira
nome_c
Pedro

nome_f
Madureira
Madureira

depsitos em Madureira
conta_#
nome_c
19880
Rosa
19890
Pedro

saldo
5312
4111

depsitos em Madureira
nome_c
Rosa
Pedro
usurios em Madureira
nome_c
Rosa
Pedro

Diferena
A operao diferena encontra as tuplas que esto em uma relao mas no esto na outra. Para
encontrar os usurios do banco que na agncia Madureira tenham conta corrente mas no tenham
emprstimos pode-se escrever

nome _c nome _ f " Madureira" depsitos nome _c nome _ f " Madureira" empr stimos

o resultado obtido

nome_f
Madureira
Madureira

depsitos
conta_#
19880
19890

nome_c
Rosa
Pedro

saldo
5312
4111

depsitos em Madureira
nome_c
Rosa
Pedro

nome_f
Madureira

emprstimos
emprstimo_#
nome_c
3367
Pedro

valor
2000

emprstimos em Madureira
nome_c
Pedro
usurios com conta e sem emprstimos em Madureira
nome_c
Rosa

Para encontrar o maior saldo dentre as contas correntes do banco o que se faz encontrar uma
relao r que no contenha o maior saldo e verificar a diferena entre a relao anterior e a relao de
depsitos. Para encontrar r o que se faz

depsitos.saldo depsitos.saldod .saldo depsitos d depsitos

obtendo-se

depsitos d(depsitos)
nome_f
Bingen
Bingen
Bingen
Bingen
Bingen
Bingen
Bingen
Botafogo
Botafogo
Botafogo
Botafogo
Botafogo
Botafogo
Botafogo
Flamengo
Flamengo
Flamengo
Flamengo
Flamengo
Flamengo
Flamengo
Flamengo
Flamengo
Flamengo
Flamengo
Flamengo
Flamengo
Flamengo
Icara
Icara
Icara
Icara
Icara
Icara
Icara

depsitos
conta_#
nome_c
22473 Lindalva
22473 Lindalva
22473 Lindalva
22473 Lindalva
22473 Lindalva
22473 Lindalva
22473 Lindalva
20018 Pedro
20018 Pedro
20018 Pedro
20018 Pedro
20018 Pedro
20018 Pedro
20018 Pedro
20210 Pedro
20210 Pedro
20210 Pedro
20210 Pedro
20210 Pedro
20210 Pedro
20210 Pedro
20500 Paulo
20500 Paulo
20500 Paulo
20500 Paulo
20500 Paulo
20500 Paulo
20500 Paulo
19872 Joo
19872 Joo
19872 Joo
19872 Joo
19872 Joo
19872 Joo
19872 Joo

saldo

nome_f
889Bingen
889Botafogo
889Flamengo
889Flamengo
889Icara
889Madureira
889Madureira
8450Bingen
8450Botafogo
8450Flamengo
8450Flamengo
8450Icara
8450Madureira
8450Madureira
5100Bingen
5100Botafogo
5100Flamengo
5100Flamengo
5100Icara
5100Madureira
5100Madureira
2315Bingen
2315Botafogo
2315Flamengo
2315Flamengo
2315Icara
2315Madureira
2315Madureira
3243Bingen
3243Botafogo
3243Flamengo
3243Flamengo
3243Icara
3243Madureira
3243Madureira

d
conta_#
nome_c
22473 Lindalva
20018 Pedro
20210 Pedro
20500 Paulo
19872 Joo
19880 Rosa
19890 Pedro
22473 Lindalva
20018 Pedro
20210 Pedro
20500 Paulo
19872 Joo
19880 Rosa
19890 Pedro
22473 Lindalva
20018 Pedro
20210 Pedro
20500 Paulo
19872 Joo
19880 Rosa
19890 Pedro
22473 Lindalva
20018 Pedro
20210 Pedro
20500 Paulo
19872 Joo
19880 Rosa
19890 Pedro
22473 Lindalva
20018 Pedro
20210 Pedro
20500 Paulo
19872 Joo
19880 Rosa
19890 Pedro

saldo
889
8450
5100
2315
3243
5312
4111
889
8450
5100
2315
3243
5312
4111
889
8450
5100
2315
3243
5312
4111
889
8450
5100
2315
3243
5312
4111
889
8450
5100
2315
3243
5312
4111

nome_f
Madureira
Madureira
Madureira
Madureira
Madureira
Madureira
Madureira
Madureira
Madureira
Madureira
Madureira
Madureira
Madureira
Madureira

continuao de depsitos d(depsitos)


depsitos
d
conta_#
nome_c
saldo
nome_f
conta_#
nome_c
19880 Rosa
5312Bingen
22473 Lindalva
19880 Rosa
5312Botafogo
20018 Pedro
19880 Rosa
5312Flamengo
20210 Pedro
19880 Rosa
5312Flamengo
20500 Paulo
19880 Rosa
5312Icara
19872 Joo
19880 Rosa
5312Madureira
19880 Rosa
19880 Rosa
5312Madureira
19890 Pedro
19890 Pedro
4111Bingen
22473 Lindalva
19890 Pedro
4111Botafogo
20018 Pedro
19890 Pedro
4111Flamengo
20210 Pedro
19890 Pedro
4111Flamengo
20500 Paulo
19890 Pedro
4111Icara
19872 Joo
19890 Pedro
4111Madureira
19880 Rosa
19890 Pedro
4111Madureira
19890 Pedro

nome_f
Bingen
Bingen
Bingen
Bingen
Bingen
Bingen
Flamengo
Flamengo
Flamengo
Flamengo
Flamengo
Flamengo
Icara
Icara
Icara
Icara
Madureira
Madureira
Madureira

depsitos.saldo < d.saldo em depsitos d(depsitos)


depsitos
d
conta_#
nome_c
saldo
nome_f
conta_#
nome_c
22473 Lindalva
889Botafogo
20018 Pedro
22473 Lindalva
889Flamengo
20210 Pedro
22473 Lindalva
889Flamengo
20500 Paulo
22473 Lindalva
889Icara
19872 Joo
22473 Lindalva
889Madureira
19880 Rosa
22473 Lindalva
889Madureira
19890 Pedro
20210 Pedro
5100Botafogo
20018 Pedro
20500 Paulo
2315Botafogo
20018 Pedro
20500 Paulo
2315Flamengo
20210 Pedro
20500 Paulo
2315Icara
19872 Joo
20500 Paulo
2315Madureira
19880 Rosa
20500 Paulo
2315Madureira
19890 Pedro
19872 Joo
3243Botafogo
20018 Pedro
19872 Joo
3243Flamengo
20210 Pedro
19872 Joo
3243Madureira
19880 Rosa
19872 Joo
3243Madureira
19890 Pedro
19880 Rosa
5312Botafogo
20018 Pedro
19890 Pedro
4111Flamengo
20210 Pedro
19890 Pedro
4111Madureira
19880 Rosa

saldo
889
8450
5100
2315
3243
5312
4111
889
8450
5100
2315
3243
5312
4111

saldo
8450
5100
2315
3243
5312
4111
8450
8450
5100
3243
5312
4111
8450
5100
5312
4111
8450
5100
5312

depsitos
saldo
889
5100
2315
3243
5312
4111

10

Essa relao contm todos os saldos exceto o maior deles. Para finalizar a consulta calcula-se a
diferena

depsitos.saldo depsitos depsitos.saldo depsitos.saldod .saldo depsitos d depsitos


O resultado
depsitos
saldo
8450

11

Operaes Adicionais
Interseo
A operao de interseo retorna uma relao que contm as tuplas que estejam em ambas as
relaes argumentos da interseo.
r s = r - (r - s)
Para obter todos os usurios que possuam tanto emprstimos quanto contas correntes no banco escreve-se

nome _c nome _ f " Madureira" empr stimos nome _c nome _ f " Madureira" depsitos
obtendo-se

nome_f
Madureira

emprstimos em Madureira
emprstimo_#
nome_c
3367
Pedro

valor
2000

emprstimos em Madureira
nome_c
Pedro

nome_f
Madureira
Madureira

depsitos em Madureira
conta_#
nome_c
19880
Rosa
19890
Pedro

saldo
5312
4111

depsitos em Madureira
nome_c
Rosa
Pedro
usurios com emprstimos e depsitos em Madureira
nome_c
Rosa
Pedro

12

Juno Natural
A operao de juno natural combina o produto cartesiano e a seleo em uma s operao. A
seleo fora a igualdade nos atributos que aparecem nos esquemas das duas relaes. Para encontrar os
usurios que possuem emprstimos no banco e as cidades em que moram necessrio utilizar as relaes
emprstimos e correntistas, de uma das formas abaixo

empr stimos.nome _c,cidade _c empr stimos.nome _ccorrentistas.nome _c empr stimos correntistas


empr stimos.nome _c,cidade _c empr stimoscorrentistas

O resultado

nome_f
Bingen
Bingen
Bingen
Bingen
Bingen
Bingen
Bingen
Bingen
Flamengo
Flamengo
Flamengo
Flamengo
Flamengo
Flamengo
Flamengo
Flamengo
Icara
Icara
Icara
Icara
Icara
Icara
Icara
Icara
Madureira
Madureira
Madureira
Madureira
Madureira
Madureira
Madureira
Madureira

emprstimos correntistas
emprstimos
emprstimo_# nome_c
valor
nome_c
6698
Lindalva
1500
Joo
6698
Lindalva
1500
Laerte
6698
Lindalva
1500
Lindalva
6698
Lindalva
1500
Geraldo
6698
Lindalva
1500
Laura
6698
Lindalva
1500
Paulo
6698
Lindalva
1500
Pedro
6698
Lindalva
1500
Rosa
5578
Paulo
2000
Joo
5578
Paulo
2000
Laerte
5578
Paulo
2000
Lindalva
5578
Paulo
2000
Geraldo
5578
Paulo
2000
Laura
5578
Paulo
2000
Paulo
5578
Paulo
2000
Pedro
5578
Paulo
2000
Rosa
1455
Joo
1000
Joo
1455
Joo
1000
Laerte
1455
Joo
1000
Lindalva
1455
Joo
1000
Geraldo
1455
Joo
1000
Laura
1455
Joo
1000
Paulo
1455
Joo
1000
Pedro
1455
Joo
1000
Rosa
3367
Pedro
2000
Joo
3367
Pedro
2000
Laerte
3367
Pedro
2000
Lindalva
3367
Pedro
2000
Geraldo
3367
Pedro
2000
Laura
3367
Pedro
2000
Paulo
3367
Pedro
2000
Pedro
3367
Pedro
2000
Rosa

correntistas
rua
Miguel de Frias
Gavio Peixoto
Alfenas
Curimat
Cotingo
Mem de S
Curimat
Uruguai
Miguel de Frias
Gavio Peixoto
Alfenas
Curimat
Cotingo
Mem de S
Curimat
Uruguai
Miguel de Frias
Gavio Peixoto
Alfenas
Curimat
Cotingo
Mem de S
Curimat
Uruguai
Miguel de Frias
Gavio Peixoto
Alfenas
Curimat
Cotingo
Mem de S
Curimat
Uruguai

cidade_c
Niteri
Niteri
Petrpolis
Rio de Janeiro
Rio de Janeiro
Rio de Janeiro
Rio de Janeiro
Rio de Janeiro
Niteri
Niteri
Petrpolis
Rio de Janeiro
Rio de Janeiro
Rio de Janeiro
Rio de Janeiro
Rio de Janeiro
Niteri
Niteri
Petrpolis
Rio de Janeiro
Rio de Janeiro
Rio de Janeiro
Rio de Janeiro
Rio de Janeiro
Niteri
Niteri
Petrpolis
Rio de Janeiro
Rio de Janeiro
Rio de Janeiro
Rio de Janeiro
Rio de Janeiro

13

nome_f
Bingen
Flamengo
Icara
Madureira

emprstimo.nome = correntistas.nome em emprstimos correntistas


emprstimos
correntistas
emprstimo_# nome_c
valor
nome_c
rua
6698
Lindalva
1500
Lindalva
Alfenas
5578
Paulo
2000
Paulo
Mem de S
1455
Joo
1000
Joo
Miguel de Frias
3367
Pedro
2000
Pedro
Curimat

nome_c
Lindalva
Paulo
Joo
Pedro

cidade_c
Petrpolis
Rio de Janeiro
Niteri
Rio de Janeiro

cidade_c
Petrpolis
Rio de Janeiro
Niteri
Rio de Janeiro

Diviso
A operao de diviso destina-se s consultas que incluem a frase para todo. Quando se divide uma
relao de grau m+n (com m+n colunas) por uma relao grau n (com n colunas) se obtm uma relao grau
m (com m colunas). Para encontrar todos os usurios que possuem contas em todas as agncias situadas no
Rio de Janeiro usam-se trs passos. No primeiro determinam-se os nomes das agncias do Rio de Janeiro

r1 nome _ f cidade _ f " RiodeJaneiro" filiais


obtendo-se

nome_f
Botafogo
Flamengo
Madureira

filiais
ativo
23000000
34000000
21000000

cidade_f
Rio de Janeiro
Rio de Janeiro
Rio de Janeiro

nome_f
Botafogo
Flamengo
Madureira

14

O passo seguinte consiste em determinar os pares nome_c e nome_f para os quais o correntista
possua uma conta

r2 nome _ c ,nome _ f depsitos


obtendo-se
depsitos
nome_f
Botafogo
Flamengo
Flamengo
Madureira
Madureira

nome_c
Pedro
Pedro
Paulo
Rosa
Pedro

No terceiro passo preciso determinar os correntistas que aparecem em r2 com todos os nomes de filiais de r1,
o que feito pela operao de diviso r2 r1.

nome _c,nome _ f depsitos nome _ f cidade _ f "RiodeJaneiro" filiais

obtendo-se

nome_c
Pedro

15

Clculo Relacional
Clculo Relacional de Tuplas

Definies Formais
A notao t r(Q(t)) significa existe uma tupla t na relao r tal que o predicado Q(t) verdadeiro.
Uma expresso de tupla de Clculo Relacional da forma {t P(t)} onde P uma frmula. Uma
varivel de tupla uma varivel livre a menos que seja quantificada por ou . Quando isto ocorrer a varivel
dita ligada. Uma frmula constituda de tomos. Um tomo de uma das formas:
s r, aonde s uma varivel de tupla e r uma relao, no se aceitando para a relao ;
s[x] u[y], aonde s e u so variveis de tupla, x e y so atributos e um operador de
comparao
s[x] c, aonde c uma constante no domnio do atributo x
As frmulas so constitudas de tomos de acordo com as seguintes regras:
Um tomo uma frmula
Se P uma frmula, ento P e (P) so frmulas
Se P1 e P2 so frmulas, ento P1 P2, P1 P2 e P1=P2 tambm so frmulas
Se P(s) uma frmula contendo uma varivel livre de tupla, s, ento s r(P(s)) e s r(P(s))
tambm so frmulas
So equivalentes conhecidos
P1 P2 = (P1 P2)
t r(P(t)) = t r(P(t))
P1 P2 = P1 P2
Exemplos
Para encontrar todos os atributos das tuplas correspondentes aos emprstimos maiores do que 1200
escreve-se
{t t emprstimos t[valor] > 1200}
Para encontrar apenas os nomes dos correntistas correspondentes aos emprstimos maiores do que
1200 procura-se o conjunto de todas as tuplas t tais que existe uma tupla s na relao emprstimos para a
qual os valores de t e de s para os atributos nome_c so iguais e o valor de s para o atributo valor maior do
que 1200 e escreve-se
{t s emprstimos (t[nome_c] = s[nome_c] s[valor] > 1200)}
Com outra notao tambm pode-se escrever, para a mesma consulta
{t[nome_c] t emprstimos t[valor] > 1200)}
Para encontrar os usurios que obtiveram emprstimos na agncia Madureira obtendo tambm as
cidades em que moram o que se tem de recuperar o conjunto das tuplas (nome_c,cidade_c) para as quais
nome_c um tomador de emprstimo na agncia Madureira e cidade a cidade aonde mora nome_c. A
varivel s servir para caracterizar o usurio como tomador de emprstimo na agncia Madureira. A varivel
u restrita a pertencer ao mesmo usurio s e garante que cidade_c a moradia do usurio.
{t s emprstimos (t[nome_c] = s{nome_c] s[nome_f] = Madureira)
u correntistas (u[nome_c] = s[nome_c] t[cidade_c] = u[cidade_c])}

16

Para encontrar os usurios que possuem uma conta, um emprstimo, ou ambos, na agncia Madureira
{t s emprstimos (t[nome_c] = s{nome_c] s[nome_f] = Madureira)
u depsitos (u[nome_c] = s[nome_c] u[nome_f] = Madureira)}
Para encontrar os usurios que possuem tanto uma conta quanto um emprstimo na agncia
Madureira basta trocar, na expresso anterior, por .
Para encontrar os usurios que possuem uma conta na agncia Madureira mas no possuem um
emprstimo l
{t u depsitos (t[nome_c] = u{nome_c] s[nome_f] = Madureira)
s emprstimos (t[nome_c] = s[nome_c] s[nome_f] = Madureira)}
Para encontrar todos os usurios que possuem uma conta em todas as agncias da cidade do Rio de
Janeiro, na lgebra Relacional usa-se diviso e no Clculo Relacional de tuplas usa-se a implicao. O
resultado o conjunto de todas as tuplas nome_c t tais que para todas as tuplas u na relao filiais, se os
valores de u para o atributo cidade forem iguais a Rio de Janeiro, ento o usurio tem uma conta na filial
cujo nome aparece no atributo nome_f de u.
{t u filias (u[cidade_f] = Rio de Janeiro) s depsitos (t[nome_c] = s[nome_c]
u[nome_f] = s[nome_f])}
Uma expresso {t P(t)} segura se for finita e se todos os valores que aparecem no resultado forem
valores do domnio de P. Como exemplo de expresso infinita pode-se escrever
{t (t emprstimos)}

Clculo Relacional de Domnios

Definies Formais
Uma expresso da forma {<x1, x2, ..., xn> P(x1, x2, ..., xn)} , aonde xi1 , 1 i n representam variveis
de domnios e P uma frmula.
Um tomo no Clculo Relacional de domnio de uma das formas:
<x1, x2, ..., xn> r, aonde r uma relao de n atributos e xi1 , 1 i n so variveis de domnio ou
constantes ;
x [y, aonde, x e y so variveis de domnio e um operador de comparao
x c, aonde c uma constante no domnio do atributo x
As frmulas so constitudas de tomos de acordo com as seguintes regras:
Um tomo uma frmula
Se P uma frmula, ento P e (P) so frmulas
Se P1 e P2 so frmulas, ento P1 P2, P1 P2 e P1=P2 tambm so frmulas
Se P(x) uma frmula aonde x uma varivel de domnio, ento x (P(x)) e x (P(x)) tambm
so frmulas
Exemplos
Para encontrar todos os atributos das tuplas correspondentes aos emprstimos maiores do que 1200
escreve-se
{<f1 e1 c1 v> <f1 e1 c1 v> emprstimos v > 1200}

nome_f

smbolos para os atributos de emprstimos


emprstimo-#
nome_c

valor

Para encontrar apenas os nomes dos correntistas correspondentes aos emprstimos maiores do que
1200 escreve-se

17

{<c> f1 e1 v (<f1 e1 c1 v> emprstimos v > 1200)}


Para encontrar os usurios que obtiveram emprstimos na agncia Madureira obtendo tambm as
cidades em que moram escreve-se
{<c1 x> f1 e1 v (<f1 e1 c1 v> emprstimos f = Madureira) y(<c1 y1 x> correntistas)}

nome_c

smbolos para os atributos de correntistas


rua
cidade_c

Para encontrar os usurios que possuem uma conta, um emprstimo, ou ambos, na agncia Madureira
escreve-se
{<c> f1 e1 v (<f1 e1 c1 v> emprstimos f = Madureira) f1 o1 n(<f1 o1 c1 s> depsitos
f = Madureira)}

nome_f

smbolos para os atributos de depsitos


conta_#
nome_c

saldo

Para encontrar todos os usurios que possuem uma conta em todas as agncias da cidade do Rio de
Janeiro escreve-se
{<c> x1 y1 z ((<x1 y1 z > filiais) z Rio de Janeiro ( o1 s(<x1 o1 c1 s> depsitos ))}
Se esta expresso for considerada de difcil entendimento ela pode ser re escrita utilizando
implicao.
{<c> nf1 at1 cf ((<nf1 at1 cf > filiais) cf = Rio de Janeiro) o1 s(<nf1 o1 c1 s>
depsitos ))}

nome_f
nome_f

smbolos para os atributos de filiais


ativo

cidade_f

smbolos para os atributos de depsitos


conta_#
nome_c

saldo

So equivalentes:
A lgebra Relacional

O Clculo Relacional de tuplas restrito a expresses seguras


O Clculo Relacional de domnios restrito a expresses seguras
A diferena entre clculo relacional de tuplas e clculo relacional de domnios est na viso do
usurio sobre os dados. No clculo de tuplas o usurio tem de reciocinar sob a forma de tuplas das relaes
existentes. No clculo de domnios o usurio escolhe as entidades que quiser, inclusive atributos de relaes
existentes. Uma consulta no clculo de domnios mais simples do que no clculo de tuplas quando
ocorrerem procutos cartesianos de uma relao por si mesma (isto , quando uma varivel de domnio ocorrer
mais de uma vez na consulta).

QBE

18

A linguagem Query By Example, ou QBE, uma linguagem de consulta baseada no clculo


relacional de domnios.
A linguagem possui uma sintaxe bidimensional pois o sistema exibe na tela do terminal um
esqueleto de tabela em branco. As consultas so feitas por marcao, no esqueleto, dos atributos que se
deseja obter. Para identificar o que se deseja identificam-se as transaes previstas pela linguagem por uma
inicial maiscula seguida de um ponto, da forma P. para impresso, I. para incluso, U. para
modificao e D. para excluso. Quando esses indicadores de transaes aparecerem esquerda de uma
tupla no esqueleto referem-se a toda a tupla. Quando aparecerem dentro de uma coluna referem-se apenas
ao atributo correspondente.
Para formular uma consulta insere-se nas colunas do esqueleto as clusulas de condio desejadas
e indica-se o que se deseja ver inserindo-se P. nas colunas dos atributos desejados. A resposta da consulta
fornecida pelo sistema preenchendo as colunas do prprio esqueleto no qual foi formulada a consulta.
Para utilizar a linguagem QBE nas relaes existentes ao se disparar o programa o sistema exibe os
esqueletos das tabelas da forma
depsitos

emprstimos

filiais

nome_f

nome_f

nome_f

correntistas

clientes

conta_#

ativo

nome_c

nome_c

nome_c

emprstimo-#

saldo

nome_c

valor

cidade_f

rua

cidade_c

gerente

Para listar os nomes das filiais do banco escreve-se


filiais

nome_f
P.

ativo

cidade_f

Para listar os nomes das filiais do banco na cidade do Rio de Janeiro escreve-se
filiais

nome_f
P.

ativo

cidade_f
Rio de Janeiro

Para listar os nomes das filiais do banco com ativo superior a 2.000.000 escreve-se

19

filiais

nome_f
P.

ativo
> 2000000

cidade_f

Para listar os nomes e as cidades dos correntistas que possuam saldo superior a 2.000 escreve-se
correntistas

depsitos

nome_c
P.X
nome_f
X

rua

conta_#

cidade_c
P
nome_c

saldo
> 2000

Para listar os nomes dos clientes que tenham conta na agncia Icara ou que tenham emprstimos
superiores a 3.000 escreve-se
emprstimos

nome_f
Icara

emprstimo-#

nome_c
P.X
P.Y

valor
> 3000

Para listar todos os atributos dos clientes que tenham emprstimos na agncia Flamengo escreve-se
emprstimos
P.

nome_f
Flamengo

emprstimo-#

nome_c

valor

20

SQL
A linguagem Structured Query Language, ou SQL, baseada no modelo relacional mas no uma
rgida implementao daquele mtodo. A primeira verso da linguagem foi padronizada em 1986. Uma
reviso feita em 1992 foi chamada de SQL2. Presentemente trabalha-se em nova verso prevista para meados
de 1998 chamada de SQL3. SQL3 pretende ser uma linguagem computacional completa para a definio e
gerenciamento de objetos complexos persistentes.
As unidades bsicas da linguagem so tabelas, linhas e colunas.
Uma relao mapeada em uma tabela, uma coluna representa um elemento de dado presente na
tabela e uma linha representa uma instncia de um registro.
Algumas de suas caractersticas (da SQL) so:
A linguagem no sensvel a espaos CR, LF, TAB etc.

Palavras reservadas so limitadas por vrgulas quando aplicvel e usam-se parnteses para agrupamentos.
Quando se utiliza mltiplas consultas usa-se ; para separar umas das outras.
As consultas so indiferentes a maisculas.
Um esquema uma coleo de zero ou mais tabelas sendo que cada tabela s pode pertencer a um
esquema. Um catlogo contm zero ou mais esquemas.
A linguagem SQL dividida em trs partes:

Data Definition Language, ou DDL, para definio dos dados, criao de tabelas (CREATE TABLE).
Data Control Language, ou DCL, para controlar a segurana e o acesso aos dados (GRANT REVOKE).
Data Manipulation Language, ou DML, para manipulao dos dados, armazenamento, modificao e
recuperao.
A linguagem SQL pode ser utilizada pelos usurios finais. As tabelas relacionais so autnomas.
Referncias cruzadas entre tabelas podem ser estabelecidas por comandos SQL.
A lgebra relacional opera sobre conjuntos. Para bancos de dados relacionais no preciso navegar
sobre arquivos. Toda consulta retorna todos os dados que respondem a consulta.
Usurios da linguagem SQL no precisam se preocupar com ndices, chaves ou qualquer outra
estrutura de navegao. Para esses usurios qualquer campo pode ser uma chave.
Quando duas ou mais tabelas so relacionadas pela linguagem SQL existe uma juno.
Os BD relacionais tentam postergar o mapeamento de relaes entre as estruturas de dados at o
momento em que um agente deseja que algo seja feito.
Muito embora a linguagem SQL no seja extremamente amigvel sua operao intuitiva para
muitos usurios e mais simples que a maioria das linguagens procedimentais de acesso.
Muitos processadores de texto, planilhas e EIS esto sendo construdos com interfaces SQL.
Quase todos os fornecedores de BD relacionais embutem em seus pacotes suas prprias solues de
gerenciamento de interfaces e linguagem de 4a gerao.

21

Declarao de Domnios
Pela declarao de domnios pode-se dar um nome a um tipo de dados de tamanho especificado. Isto
auxilia quando vrias colunas tem caractersticas comuns.
CREATE DOMAIN NMERO_EMP AS CHAR(5);
A pr definio de um objeto de dados til para garantir que certa entrada em uma tabela tenha a
forma dos dados esperados para essa coluna.
CREATE DOMAIN NMERO_EMP AS CHAR(5) CHECK (VALUE IS NOT NULL);
SQL possui dois tipos de strings: CHAR e VARCHAR. Se uma entrada for especificada como
CHAR(N) e o string for menor do que N, os caracteres restantes recebem branco. Por outro lado
VARCHAR sempre armazena exatamente o string recebido (no completa a cadeia de caracteres) e o tamanho
da especificao de VARCHAR serve apenas para limite superior.
Sempre que uma tabela fizer referncia a outra preciso definir anteriormente a tabela referenciada.
Manipulao de Tabelas
Para remover de um BD uma tabela EMPREGADOS o comando : DROP TABLE EMPREGADOS;
Para excluir uma coluna de uma tabela o comando :
ALTER TABLE EMPREGADOS
DROP primeironome;
Para adicionar uma coluna a uma tabela o que se faz :
ALTER TABLE EMPREGADOS
ADD datanascimento DATE NOT NULL;
Uma clusula ALTER permite diversas alteraes.
DML
Suponha-se que a criao de uma tabela foi feita da forma
CREATE TABLE EMPREGADOS
(
emp_nmero
NUM(10)
PRIMARY KEY,
ltimonome
VARCHAR(20)
NOT NULL,
primeironome VARCHAR(20)
NOT NULL,
funo
VARCHAR(20)
NOT NULL,
departamento
VARCHAR(20)
);
A incluso de uma linha pode ser feita da maneira que se segue.
INSERT INTO EMPREGADOS
VALUES (
0466,
Brito,
Claudio,
Marinheiro,

);
ou

INSERT INTO EMPREGADOS (emp_nmero, ltimonome, primeironome, funo, departamento)


VALUES (

22

0466, Brito, Claudio, Marinheiro,


);
ou ainda
INSERT INTO EMPREGADOS (emp_nmero, ltimonome, primeironome, funo)
VALUES (
0466, Brito, Claudio, Marinheiro
);
Para excluir todos os dados de uma tabela usa-se DELETE.
DELETE FROM EMPREGADOS;
Para excluses seletivas deve-se especificar o critrio de excluso pela clusula WHERE.
DELETE FROM EMPREGADOS
WHERE emp_nmero = 0406;
Pode-se fazer excluses simultneas de mais de uma tabela.
DELETE FROM EMPREGADOS, GERAL
WHERE emp_nmero = 0406;
A atualizao feita utilizando UPDATE e SET.
UPDATE EMPREGADOS
SET primeironome = Manoel
WHERE emp_nmero = 0394;
ou
UPDATE EMPREGADOS
SET primeironome = Manoel, funo = Mecnico
WHERE emp_nmero = 0394;
DQL
A sintaxe do comando SELECT :
SELECT nomes_das_colunas
FROM
nomes_das_tabelas
[WHERE predicados_das_condies]
[GROUP BY nomes_das_colunas]
[HAVING condio]
[ORDER BY nome_de_coluna].
As condies podem ser {BETWEEN, IN, LIKE, IS NULL, NOT, AND, OR, !=, >, >=, <=,<}. As
funes de agregao ou de conjunto so seguidas do nome de uma coluna a qual elas se aplicam. O nome da
coluna vem entre parnteses e essas funes so:
Funo
COUNT
SUM
AVG
MAX
MIN

Retorno
Nmero de valores de uma coluna
Soma dos valores de uma coluna/expresso
Mdia dos valores de uma coluna/expresso
Maior valor em uma coluna
Menor valor em uma coluna

A diferena entre asa clusulas HAVING e WHERE que a condio de busca WHERE se aplica a
linhas isoladas antes do agrupamento, enquanto que a condio de busca da clusula HAVING se aplica a
grupos de linhas. Quando se usa a clusula GROUP BY a clusula HAVING se aplica a cada um dos grupos
formado com valores iguais na coluna especificada para o grupamento. Caso no exista uma clusula GROUP
BY ento .a clusula HAVING aplica-se a toda a tabela.
Se duas tabelas possuem, cada qual, uma coluna com um domnio comum, estas tabelas podem ser
unidas por uma operao de juno com base nas colunas definidas sobre o domnio comum. A operao de
juno retorna uma nova tabela da qual cada linha produto da concatenao de uma linha de cada uma das
tabelas que contriburam para a operao de juno. As linhas contribuintes foram selecionadas pelos seus

23

valores na colunas de domnio comum. Junes nas quais a condio de juno baseada na igualdade so
chamadas de equi-junes que caracterizam-se por gerar tabelas que possuem duas colunas idnticas.
Quando se elimina a duplicidade de colunas por uma operao de projeo a juno se torna uma juno
natural.
Quando se deseja obter e combinar o resultado de diversas consultas usa-se a unio de tabelas.
Quando se utiliza uma operao de unio a linguagem SQL automaticamente elimina as duplicatas sem
necessidade de tornar explcita a clusula Distinct. Nas situaes nas quais uma chave primria est
relacionada com uma chave estrangeira e, esta chave estrangeira possa ser nula para algum valor da chave
primria o efeito combinado da unio poderia ficar comprometido. Considere-se, por exemplo, uma tabela na
qual a chave primria fosse vendedor e outra tabela na qual a chave primria fosse cliente e, nesta ltima o
vendedor fosse um atributo. Caso um vendedor estivesse sem cliente ele no apareceria na tabela de
clientes. Para que uma juno de tabelas na qual as tuplas de uma tabela sem correspondncia na outra
apaream no resultado concatenadas com uma tupla nula cria-se o conceito de juno externa.
Para recuperar toda uma tabela escreve-se
select from empregados;
Para obter a lista dos empregados do departamento comercial escreve-se
select from empregados
where departamento = Comercial;
Para obter esta lista classificada em ordem ascendente de sobrenome escreve-se
select from empregados
where departamento = Comercial
order by ltimonome;
Para desta lista recuperar apenas os nmeros dos empregados escreve-se
select emp_nmero from empregados
where departamento = Comercial
order by ltimonome;
Para obter a lista dos empregados chamados Jos Silva escreve-se
select from empregados
where (primeironome = Jos) and (ltimonome = Silva);
Para obter todos os dados das tabelas EMPREGADOS e GERAL escreve-se
select empregados., geral.
from empregados, geral;
Para obter os salrios do pessoal do departamento comercial, sabendo que os salrios ficam na tabela
GERAL escreve-se
select g.salrio
from empregados e, geral g
where e.departamento = Comercial
and g.emp_nmero = e.emp_nmero;
Verificar quem ganha mais de R$2.500,00 pode ser feito da forma
select salrio
from geral
where salrio > 2.500;
Verificar quem ganha mais de R$2.500,00 no departamento comercial pode ser feito da forma
select g.salrio
from empregados e, geral g
where e.departamento = Comercial
and g.emp_nmero = e.emp_nmero
and g.salrio > 2.500;
A mdia salarial desse departamento pode ser obtida utilizando-se AVG.
select avg (g.salrio)
from empregados e, geral g
where e.departamento = Comercial
and g.emp_nmero = e.emp_nmero;

24

Segunda Lista de Exemplos


EMP (EMP_#, EMP_NOME, DEPTO_#, CARGO, GERENTE, SALRIO)
DEPTO (DEPTO_#, DEPTO_NOME, CIDADE)
EMPREGO (DEPTO_#, PEA)
ABASTECIMENTO (FORNEC, PEA)
Q2 - Listar os diferentes nmeros de departamentos da relao Emp
SELECT UNIQUE DEPTO_#
FROM EMP;
Q3 - Listar os nomes dos empregados dos departamentos 25, 47 e 53
SELECT EMP_NOME
FROM EMP
WHERE DEPTO_# IN (25, 47, 53);
alternativa
WHERE (DEPTO_# = 25) (DEPTO_# = 47) (DEPTO_# = 53);
M3 - Aumentar em 10% os salrios dos empregados que ganham menos de R$10.000,00
UPDATE EMP
SET SALRIO = SALRIO1.1
WHERE SALRIO < 10000

Terceira Lista de Exemplos


Como exemplo da linguagem SQL sero resolvidos os problemas utilizados na apresentao da
lgebra Relacional.
Para selecionar as tuplas da relao emprstimos aonde a filial seja Madureira, escreve-se
select * from emprestimos
where nome_f = 'Madureira';
Para obter os clientes que tenham o mesmo nome que seus gerentes pode-se escrever
select * from clientes
where nome_c = gerente;
Para encontrar os clientes do gerente Joo e a cidade na qual eles vivem necessita-se de
informaes das relaes correntistas e clientes e pode-se escrever
select correntistas.nome_c, correntistas.cidade_c
from clientes, correntistas
where clientes.nome_c = correntistas.nome_c and
gerente = 'Joo';
Para encontrar os nomes dos correntistas que moram na mesma cidade e na mesma rua que Pedro
escreve-se
select nome_c from correntistas
where rua in (select rua from correntistas
where nome_c = 'Pedro')
and cidade_c in (select cidade_c from correntistas

25

where nome_c = 'Pedro');


Para encontrar os usurios da agncia Madureira preciso encontrar todos aqueles que ou tenham
conta na agncia ou que tenham feito emprstimos l, escrevendo-se
select emprestimos.nome_c from emprestimos
where emprestimos.nome_f = 'Madureira'
union all select depositos.nome_c from depositos
where depositos.nome_f = 'Madureira';
ou
select e.nome_c from emprestimos e
where e.nome_f = 'Madureira'
union all select d.nome_c from depositos d
where d.nome_f = 'Madureira';
Para encontrar os usurios do banco que na agncia Madureira tenham conta corrente mas no
tenham emprstimos pode-se escrever
select depositos.nome_c from depositos
where depositos.nome_f = 'Madureira'
minus select emprestimos.nome_c from emprestimos
where emprestimos.nome_f = 'Madureira';
Para encontrar o maior saldo dentre as contas correntes do banco o que se faz
select saldo from depositos
where saldo in (select max(saldo)
from depositos);
Para obter todos os usurios que possuam tanto emprstimos quanto contas correntes no banco
escreve-se
select correntistas.nome_c, correntistas.cidade_c
from correntistas, emprestimos
where correntistas.nome_c = emprestimos.nome_c;
Para encontrar os usurios que possuem emprstimos no banco e as cidades em que moram
necessrio utilizar as relaes emprstimos e correntistas, de uma das formas abaixo
select correntistas.nome_c, correntistas.cidade_c
from correntistas, emprestimos
where correntistas.nome_c = emprestimos.nome_c;
Para encontrar todos os usurios que possuem contas em todas as agncias situadas no Rio de Janeiro
necessrio mudar a frase para encontrar todos os usurios para os quais no exista uma filial para a qual
no exista um depsito do mesmo usurio, da forma
select df.nome_c, df.nome_f from depositos df
where not exists
(select * from filiais
where cidade_f = 'Rio de Janeiro'
and not exists
(select * from depositos dd
where dd.nome_c = df.nome_c
and dd.nome_f = filiais.nome_f));
ou da forma
select nome_c, nome_f from depositos df
where not exists
(select * from filiais
where cidade_f = 'Rio de Janeiro'
and not exists
(select * from depositos

26

where nome_c = df.nome_c


and nome_f = filiais.nome_f));
Outra soluo pode ser obtida usando minus, da forma
select distinct s.nome_c, s.nome_f from depositos s
where not exists
((select nome_f from filiais
where cidade_f = 'Rio de Janeiro')
minus
(select t.nome_f from depositos t
where s.nome_c = t.nome_c));

27

SQL Embutida
A SQL embutida fornece um meio para construir a consulta necessria num programa de computador
e torna possvel escrever o programa sem que se saiba nada a respeito da maneira como os dados esto
armazenados. Em outras palavras, a SQL embutida mantm os ideais dos bancos de dados relacionais e das
linguagens de consulta como SQL.
Est ao encargo do programador fornecer as variveis da linguagem hospedeira para os resultados
das consultas ou para os valores variveis das condies da linguagem da consulta. Estas ltimas so s vezes
chamadas de variveis de ligao. Adotar-se- o termo variveis de ligao para tais variveis.
Para o texto que se segue se utilizado um Banco de Dados Judicirio, cujas relaes so definidas
como se segue.
ID (nmero_de_registro, nome_do_prisioneiro, identificao_do_prisioneiro)
APELIDO (identificao_do_prisioneiro, apelido_do_prisioneiro)
NASCIMENTO (identificao_do_prisioneiro, data_do_nascimento)
PRISO (nmero_de_registro, data_da_priso, pena)
Reconhecendo Comandos SQL Embutidos
Todos os comandos SQL embutidos so precedidos pelas palavras-chave EXEC SQL. Dependendo
da linguagem de programao hospedeira, eles so encerrados por um ponto e vrgula ou algum outro
terminador, ou at mesmo sem nenhum terminador em particular.
Uma Primeira Viso da SQL Embutida
Com a utilizao das palavras-chave EXEC SQL para iniciar e do ponto e vrgula para encerrar,
muitos comandos SQL podem ser embutidos na linguagem hospedeira simplesmente pela sua incluso no
programa, como, por exemplo:
exec sql update priso
set pena = dirigir embriagado
where identificao_do_prisioneiro = 111111;
ou
exec sql delete
from priso
where identificao_do_prisioneiro = 111111;
Variveis da Linguagem Hospedeira na SQL Embutida
Variveis da linguagem de programao hospedeira devem aparecer em comandos SQL embutidos.
Assim, um formato para o comando SELECT na SQL embutida :
exec sql select < lista-objetivo >
into < variveis da linguagem hospedeira >
from
where
;

28

Um exemplo especfico deste formato :


exec sql select pena
into: cadeia
from priso
where nmero_de_registro = : varivel_hospedeira;
Este formato aceitvel se a consulta retorna apenas uma linha. Caso contrrio, necessria uma
rea de trabalho. Na SQL embutida, a rea de trabalho chamada de cursor.
No ltimo exemplo, cadeia e varivel_hospedeira so variveis da linguagem hospedeira. Em
algumas implementaes, todas as variveis da linguagem hospedeira usadas numa expresso SQL
embutida devem ser precedidas por dois pontos ( : ) para diferenci-las dos nomes das colunas.
Declarao de Variveis
As variveis da linguagem hospedeira que so usadas em comandos EXEC SQL devem aparecer
numa seo de declarao no local apropriado do programa hospedeiro.
O formato EXEC SQL BEGIN DECLARE, seguido das declaraes das variveis, que so ento
seguidas de EXEC SQL END DECLARE.
SELECT na SQL Embutida
O formato do SELECT :
exec sql select ... into [lista de variveis da linguagem hospedeira] from
...where...;
Por exemplo:
exec sql select nome_do_prisioneiro into :cadeia from id where
nmero_de_registro = 111111;
ou
exec sql select nome_do_prisioneiro into :cadeia from id where
nmero_de_registro = :varivel_hospedeira;
UPDATE em SQL Embutida
O formato do UPDATE na SQL embutida :
exec sql update id set nome_do_prisioneiro = Manoel de Almeida
where nmero_de_registro = 111111;
exec sql update id set nome_do_prisioneiro = Manoel de Almeida
where nmero_de_registro = :varivel_hospedeira;
exec sql update id set nome_do_prisioneiro = varivel_hospedeira_1
where nmero_de_registro = :varivel_hospedeira_2;
DELETE e INSERT na SQL Embutida
As variveis da linguagem hospedeira podem ser usadas onde for apropriado. Eis um exemplo:
exec sql delete
from priso
where pena = :varivel_hospedeira;
exec sql insert
into priso (nmero_de_registro, pena)
values (:varivel_hospedeira_1, :varivel_hospedeira_2);

29

Outros Comandos SQL Embutidos


As regras para os comandos de bloqueio e para os comandos COMMIT WORK e ROLLBACK
WORK so exatamente as mesmas que as da SQL no embutida, exceto que eles devem ser precedidos por
EXEC SQL e encerrados por um ponto e vrgula ( ; ).
Cursores
O resultado de uma consulta uma tabela virtual ou uma viso. Em qualquer situao, os resultados
de uma consulta contero freqentemente vrias linhas com mltiplas colunas, que precisaro ser tratadas
uma a uma num lao de programa. Uma vez que a maioria das linguagens de programao contm recursos
para manipular arquivos, razovel tratar o resultado da consulta de modo similar a um arquivo, que pode ser
aberto, lido seqencialmente, uma linha de cada vez, e fechado quando o fim do arquivo alcanado.
Tal entidade correspondente a um arquivo deveria ser chamada de cursor. O cursor deve ser
associado a uma consulta. O formato para isto :
exec sql declare a cursor for [comando sql]
O A na expresso acima uma varivel e pode ser substitudo por qualquer nome, dependendo,
claro, das restries que o projetista pode ter implementado para nome de cursor. O comando SQL entre
colchetes tanto pode ser uma consulta SQL real como um ponteiro para uma cadeia de caracteres, isto , um
nome de varivel da linguagem hospedeira apontando para uma cadeia de caracteres que contm um comando
para uma consulta SQL.
Aps dar um nome ao seu cursor, pode-se abri-lo (como a um arquivo). O formato para isto :
exec sql open a;
Para ler seu pseudo-arquivo cursor, h o comando FETCH...INTO com o formato
exec sql fetch a into [lista de nomes de variveis da linguagem hospedeira]
(H uma varivel hospedeira para cada nome de coluna selecionada).
Provavelmente, o comando FETCH ficar em algum tipo de lao na linguagem hospedeira por meio
do qual cada linha tratada na sua vez.
bom fechar o cursor, como feito com arquivos, quando todas as leituras tiverem terminado. O
formato para isto :
exec sql close a;
O Uso de Cursores Para UPDATE e DELETE
Finalmente, observa-se que um cursor pode ser usado para atualizar ou eliminar certas linhas,
dependendo dos valores dessas linhas. O formato para o DECLARE nesse caso :
exec sql declare a cursor for select......
where......
for update of < nome da coluna >;
As linhas do cursor esto ordenadas, seja por uma clusula ORDER BY ou por algum outro valor
suposto. Cada FETCH move ento a posio corrente para a frente uma linha e o UPDATE ou o DELETE
podem operar na linha corrente. Depois que o cursor for fechado, um EXEC SQL COMMIT WORK efetivar
no banco de dados as modificaes feitas no cursor.
O formato para atualizar um cursor :
exec sql update < nome da tabela >
set < nome da coluna > = < varivel_hospedeira >
where current of a;
O nome da coluna acima deve ser o mesmo nome da coluna do DECLARE. De modo semelhante, o
formato para eliminao de linha num cursor :
exec sql delete from < nome da tabela >
where current of a;

30

Todos os comandos SQL que no envolvam matrizes podem ser embutidos, bastando preced-los por
EXEC SQL e encerr-los por um ponto e vrgula. Na existncia de matrizes, os cursores podem ser usados
como mostrado nos exemplos acima.

31