Sunteți pe pagina 1din 61

Captulo 4: SQL!

Linguagem de Definio de Dados"


Estrutura bsica"
Operaes com conjuntos"
Funes de agregao"
Valores nulos"
Subconsultas embutidas"
Relaes derivadas"
Junes"
Vistas"
Modificao da Base de Dados"
SQL Recursivo"
Embedded SQL"
Dynamic SQL"
Funes e Procedimentos"

Database System Concepts!

1!

Silberschatz, Korth and Sudarshan (modificado)!

Operaes de Juno!
As operaes de juno retornam uma relao como resultado

da combinao de duas outras relaes."


Estas operaes adicionais so utilizadas habitualmente em

subconsultas na clusula from"


Condio de juno define quais os tuplos que so

combinados nas duas relaes, assim como quais os atributos


que aparecem no resultado da juno."
Tipo de juno define como tratar os tuplos que no esto

relacionados entre si (basedados na condio de juno)."


Tipos de Juno"

Condies de Juno"

inner join!
left outer join!
right outer join!
full outer join!

natural!
on <predicate>"
using (A1, A2, ..., An)"
!

Database System Concepts!

2!

Silberschatz, Korth and Sudarshan (modificado)!

Operaes de Juno!
Tipos de Juno"

Condies de Juno"

inner join!
left outer join!
right outer join!
full outer join!

natural!
on <predicate>"
using (A1, A2, ..., An)"
!

obrigatria a utilizao de uma condio de juno nos junes de tipo

outer. opcional no inner join (na ausncia, comporta-se como o produto


cartesiano)!
A condio natural aparece antes do tipo de juno (por exemplo natural
inner join). As restantes condies aparecem aps o tipo de juno."
Nas junes com condio natural, primeiro aparecem os atributos comuns
a ambas as relaes, na ordem pela qual aparecem na relao do lado
esquerdo. Depois, aparecem os restantes atributos da relao do lado
esquerdo, seguidos dos restantes atributos da relao do lado direito."
Nas junes com condio using (A1, A2, ..., An), primeiro aparecem os
atributos A1, A2, ..., An. Depois, aparecem os restantes atributos da relao
do lado esquerdo, seguidos dos restantes atributos da relao do lado
direito."

Database System Concepts!

3!

Silberschatz, Korth and Sudarshan (modificado)!

Juno versus Produto Cartesiano!


Listar o nome, nmero de emprstimo e montante de todos os clientes

que efectuaram um emprstimo na agncia de Perryridge.


"select borrower.*, amount
"from borrower, loan
"where borrower.loan_number = loan.loan_number and
branch_name = Perryridge"
Versus"

"

"select *
"from borrower natural inner join loan
"where branch_name = Perryridge"
A ltima separa claramente onde se coloca a origem dos dados de
onde se colocam as condies de filtragem (seleco)"
Esta separao no s torna a leitura mais fcil, como pode ser aproveitada
para implementaes."
Na ltima consulta no se pode colocar borrower.* aps o select pois

deixa de ser possvel utilizar o nome da tabela nas colunas usadas para
fazer a juno natural (isto , as comuns a ambas as tabelas)"
"

Database System Concepts!

4!

Silberschatz, Korth and Sudarshan (modificado)!

Relaes de Exemplo!
Relao loan"
loan_number"

branch_name"

amount"

L-170 "

Downtown"

3000"

L-230"

Redwood"

4000"

L-260"

Perryridge"

1700"

Relao borrower"
customer_name" loan_number "

Database System Concepts!

Jones"

L-170"

Smith"

L-230"

Hayes"

L-155

5!

Silberschatz, Korth and Sudarshan (modificado)!

loan_number" branch_name"

amount"

L-170 "

Downtown"

3000"

L-230"

Redwood"
Perryridge"

4000"

L-260"

customer_name"

Exemplos!

1700"

loan_number "

Jones"

L-170"

Smith"

L-230"

Hayes"

L-155

select * from loan inner join borrower on

loan.loan_number = borrower.loan_number"
l.loan_number "

branch_name"

amount"

customer_name" b.loan_number "

L-170"

Downtown"

3000"

Jones"

L-170"

L-230"

Redwood"

4000"

Smith"

L-230"

select * from loan left outer join borrower on


loan.loan_number = borrower.loan_number"
l.loan_number " branch_name"

amount"

customer_name" b.loan_number "

L-170"

Downtown"

3000"

Jones"

L-170"

L-230"

Redwood"

4000"

Smith"

L-230"

L-260

Perryridge"

1700"

null"

Database System Concepts!

6!

null

Silberschatz, Korth and Sudarshan (modificado)!

loan_number" branch_name"

amount"

L-170 "

Downtown"

3000"

L-230"

Redwood"
Perryridge"

4000"

L-260"

customer_name"

Exemplos!

1700"

loan_number "

Jones"

L-170"

Smith"

L-230"

Hayes"

L-155

select * from loan natural inner join borrower"


loan_number "

branch_name"

amount"

customer_name"

L-170"

Downtown"

3000"

Jones"

L-230"

Redwood"

4000"

Smith"

select * from loan natural right outer join borrower"


loan_number "

Database System Concepts!

branch_name"

amount"

customer_name"

L-170"

Downtown"

3000"

Jones"

L-230"

Redwood"

4000"

Smith"

L-155

null "

null"

Hayes"

7!

Silberschatz, Korth and Sudarshan (modificado)!

loan_number" branch_name"

amount"

L-170 "

Downtown"

3000"

L-230"

Redwood"
Perryridge"

4000"

L-260"

customer_name"

Exemplos!

1700"

loan_number "

Jones"

L-170"

Smith"

L-230"

Hayes"

L-155

select * from loan full outer join borrower using (loan_number)"


loan_number "

branch_name"

amount"

customer_name"

L-170"

Downtown"

3000"

Jones"

L-230"

Redwood"

4000"

Smith"

L-260"

Perryridge"

1700"

null"

L-155

null"

Database System Concepts!

null"

8!

Hayes"

Silberschatz, Korth and Sudarshan (modificado)!

Utilizao tpica de USING!


Considerem-se as tabelas cursos(cod_curso,nome) e alunos(num_aluno,

nome, cod_curso)
!
A interrogao

select * from cursos natural inner join alunos

equivalente a

select cursos.cod_curso as cod_curso, cursos.nome as nome,

alunos.num_aluno
from cursos, alunos
where cursos.cod_curso = alunos.cod_curso and cursos.nome = alunos.nome
"
Enquanto que a interrogao

select * from cursos inner join alunos using (cod_curso)

corresponde a

select cursos.cod_curso as cod_curso, cursos.nome,


alunos.num_aluno, alunos.nome
from cursos, alunos
where cursos.cod_curso = alunos.cod_curso
"
Qual a correcta?"

Database System Concepts!

9!

Silberschatz, Korth and Sudarshan (modificado)!

Aspectos a ter cuidado!


Ocasionalmente as junes podem ser ambguas quando esto

envolvidas mais do que 2 tabelas:"


"select *
from a natural left outer join b left outer join c on b.c1 = c.c1"
Pode ser interpretado como:"
"select *
from (a natural left outer join b) left outer join c on b.c1 = c.c1"
"ou:"
"select *
from a natural left outer join (b left outer join c on b.c1 = c.c1)"
Os operadores associam esquerda, ou seja, a primeira

hiptese a executada. Na dvida usar os parntesis, em


particular quando h muitas condies de juno expressas
atravs de ON."

Database System Concepts!

10!

Silberschatz, Korth and Sudarshan (modificado)!

Exemplos!
Listar todos os clientes que tm uma conta e nenhum emprstimo"
!

!select customer_name
!from depositor left outer join borrower using(customer_name)
!where loan_number is null!

Listar todos os clientes que tm uma conta ou um emprstimo no


banco (mas no ambos!) !
!

!select customer_name
!from depositor natural full outer join borrower
!where account_number is null or loan_number is null!

Database System Concepts!

11!

Silberschatz, Korth and Sudarshan (modificado)!

Vistas!
Em certas circunstncias, no desejvel que todos os

utilizadores possam aceder a todo o modelo lgico (i.e. a todas


as relaes armazenadas na base de dados)."
Considere o caso de um empregado que necessita de saber o

nmero de emprstimo de um cliente, mas que no precisa de


saber o montante desse emprstimo. Este empregado dever
ver apenas a relao descrita por
""
!select costumer_name, loan_number
"from borrower natural inner join loan"

Database System Concepts!

12!

Silberschatz, Korth and Sudarshan (modificado)!

Vistas!
" Mesmo que no seja por razes de segurana, pode ser til apresentar

um conjunto de relaes personalizada que se adapte melhor s


intuies de um dado utilizador do que o modelo lgico."
Considere o caso de um empregado do departamento de marketing que

poder preferir ver uma relao contendo os clientes que tm uma


conta ou um emprstimo no banco, e as respectivas agncias. Tal
relao seria:"
"(select branch_name, customer_name
"from depositor natural inner join account)"
!union!
"(select branch_name, customer_name
"from borrower natural inner join loan)!
Qualquer relao que no pertena ao modelo lgico mas que se torne

visvel ao utilizador como uma relao virtual designada por vista."

Database System Concepts!

13!

Silberschatz, Korth and Sudarshan (modificado)!

Vistas!
Mecanismo que permite apresentar um modelo diferente do

modelo lgico, e.g. ocultando (escondendo) informao de


certos utilizadores. Para criar uma vista utilizamos o comando:
"
"

"create view v as <query expression>"

"em que:"
<query expression> qualquer expresso SQL vlida"
O nome da vista v"
Em SQL do Oracle pode-se escrever"

!
!create or replace view v as <query expression>

para criar ou substituir uma vista j existente, evitando a


utilizao do comando drop view."
Database System Concepts!

14!

Silberschatz, Korth and Sudarshan (modificado)!

Exemplo!
Uma vista contendo todas as agncias e respectivos clientes"

!create view all_customer as


!(select branch_name, customer_name
" from depositor natural inner join account)"
" union
!(select branch_name, customer_name
" from borrower natural inner join loan)"
Listar todos os clientes da agncia de Perryridge"

"

"select customer_name
"from all_customer
"where branch_name = Perryridge"

Uma definio de uma vista no o mesmo que a criao duma

nova relao a partir da avaliao da sua expresso. Em vez


disso, a definio da vista permite guardar a expresso que
depois substituda nas consultas que utilizam a vista."

Database System Concepts!

15!

Silberschatz, Korth and Sudarshan (modificado)!

Definio de vistas!
Uma vista pode ser utilizada na expresso de definio de outra

vista. Por exemplo:"


!
!
"
"

!create view perryridge_customer as !


!
!select customer_name
"
"from all_customer
"
"
"
"where branch_name = Perryridge"

"

"

Uma vista v1 depende directamente de uma vista v2 se v2

utilizada na expresso que define v1"

Uma vista v1 depende de uma vista v2 se v1 depende

directamente de v2 ou se existe um caminho de dependncias

entre v1 e v2 "
Uma vista v diz-se recursiva se depender dela prpria."
Em SQL no so permitidas vistas recursivas!"

Database System Concepts!

16!

Silberschatz, Korth and Sudarshan (modificado)!

Expanso de vistas!
Forma de atribuir significado a vistas definidas em termos de

outras vistas."
Seja a vista v1 definida em termos de uma expresso e1 que

pode ela prpria conter vistas."

Para expandir as vistas numa expresso repete-se

sucessivamente o seguinte passo:"


"repeat
!Encontrar uma vista vi em e1
"Substituir a vista vi pela expresso que a define
until no ocorram mais vistas em e1"
Desde que as definies das vistas no sejam recursivas, este

ciclo terminar sempre."

Database System Concepts!

17!

Silberschatz, Korth and Sudarshan (modificado)!

Expanso de vistas (exemplo)!


A expresso:"

! !select *
" "from perryridge_customer "
"
"
"
"where customer_name = John"
... inicialmente expandida para:"
! ! !select *
" "from (select customer_name
" "
"from all_customer
"
"
"
" "
"where branch_name = Perryridge)"
"
"where customer_name = John"
... que por sua vez expandida para:"
! ! !select *
" "from (select customer_name
" "
"from ( "(select branch_name, customer_name
" "
"
"from depositor natural inner join account)"
" " "
"
"union
! !
!
!(select branch_name, customer_name
" "
"
"from borrower natural inner join loan))
" "
"
"where branch_name = Perryridge)"
" "
"where customer_name = John"

Database System Concepts!

18!

""

"
""

"
"

Silberschatz, Korth and Sudarshan (modificado)!

Modificao da base de Dados Remoo!


A remoo de tuplos de uma tabela (ou vista) feita em SQL

com a instruo"
"
!

"delete from <tabela ou vista>"


!where <Condio>!

Apagar todas as contas da agncia de Perryridge"

"

Database System Concepts!

"delete from account


"where branch-name = Perryridge

19!

Silberschatz, Korth and Sudarshan (modificado)!

Exemplo de remoo!
Apagar todas as contas de todas as agncias na cidade de

Needham."
"delete from depositor
where account-number in
(select account-number
"
"from branch natural inner join account
"
"where branch-city = Needham)"
!delete from account
where branch-name in (select branch-name
"
"
" from branch
"
"
" where branch-city = Needham)
"

Database System Concepts!

20!

Silberschatz, Korth and Sudarshan (modificado)!

Exemplo de remoo!
Remover todas as contas com saldos inferiores aos da mdia do

banco."
"

"delete from account


"where balance < some (select avg (balance)
"
"
from account)"
Problema:"
medida que removemos tuplos de deposit, o saldo mdio

altera-se"

Soluo utilizada no standard SQL:"


1."Primeiro, calcula-se o saldo mdio (avg) e determinam-se quais
os tuplos a apagar"
2."Seguidamente, removem-se todos os tuplos identificados
anteriormente (sem recalcular avg ou testar novamento os
tuplos)"

Database System Concepts!

21!

Silberschatz, Korth and Sudarshan (modificado)!

Modificao da base de dados Insero!


A insero de tuplos numa tabela (ou vista) feita em SQL com a

instruo"
"
"insert into <tabela ou vista>"
!
!values <Conjunto de tuplos>"
ou"
"
"insert into <tabela ou vista>"
!
!select ..."
Adicionar um novo tuplo a account"
"
"insert into account
"
"values (A-9732, Perryridge,1200)
ou equivalentemente

insert into account (branch-name, balance, account-number)


"values (Perryridge, 1200, A-9732)"
Adicionar um novo tuplo a account em que balance null"
"
"insert into account
"
"values (A-777,Perryridge, null)"
"
Database System Concepts!

22!

Silberschatz, Korth and Sudarshan (modificado)!

Exemplo de Insero!
Dar como bnus a todos os muturios da agncia de Perryride,

uma conta de poupana de $200. O nmero do emprstimo


servir de nmero de conta de poupana"
" insert into account
"select loan-number, branch-name, 200
"from loan
"where branch-name = Perryridge
insert into depositor
"select customer-name, loan-number
"from loan natural inner join borrower
"where branch-name = Perryridge
""
A instruo select-from-where avaliada antes da insero de
tuplos na relao (caso contrrio consultas como
insert into table1 select * from table1
causariam problemas)"

Database System Concepts!

23!

Silberschatz, Korth and Sudarshan (modificado)!

Modificao da base de dados Actualizao!


A actualizao de tuplos duma tabela (ou vista) feita em SQL

com a instruo"
"
"update <tabela ou vista>"
!
!set <Atributo> = <Expresso>, <Atributo> =
<Expresso>, ... "
"
"where <Condio>"
Pagar juros de 1% a todas as contas da agncia Perryride."

"

"update account
"set balance = balance * 1.01
"where branch_name = Perryride"
"

Database System Concepts!

24!

Silberschatz, Korth and Sudarshan (modificado)!

Modificao da base de dados Actualizao!


Pagar juros de 6% a todas as contas com saldos superiores a

$10,000, e juros de 5% s restantes contas."


Escrever duas instrues de update:"
"

"update account
"set balance = balance * 1.06
"where balance > 10000"

"

"update account
"set balance = balance * 1.05
"where balance 10000"

"

A ordem importante. Porqu?"


Pode ser efectuado de maneira mais limpa recorrendo instruo
case"

Database System Concepts!

25!

Silberschatz, Korth and Sudarshan (modificado)!

Instruo Case para Actualizaes Condicionais!


Pagar juros de 6% a todas as contas com saldos superiores a

$10,000, e juros de 5% s restantes contas."


update account
set balance = case
when balance <= 10000 then balance *1.05
else balance * 1.06
end!
"

Database System Concepts!

26!

Silberschatz, Korth and Sudarshan (modificado)!

Actualizao de uma vista!


Modificaes nas bases de dados atravs de vistas devem ser

traduzidas para modificaes das verdadeiras relaes


presentes na base de dados."
E.g com uma vista com a informao sobre emprstimos,
escondendo o atributo amount"

"

"create view branch-loan as


!
"

!select branch-name, loan-number


"from loan"

a adio de um novo tuplo em branch-loan"

"insert into branch-loan values (Perryridge, L-307)"


Causa problemas pois ter que ser traduzido em adies de tuplos
em tabelas que existam na base de dados. Duas hipteses: "
Rejeitar a insero e devolver uma mensagem de erro"
Traduzir na insero, na relao loan, do tuplo"

"

"

Database System Concepts!

"(L-307, Perryridge, null)"

27!

Silberschatz, Korth and Sudarshan (modificado)!

Actualizao de uma vista (cont.)!


Outro problema ocorre quando temos, por exemplo, a vista:"

!create view info_emprstimos as !


!
!
!
!select customer_name, amount
"
"from borrower natural inner join loan!
e pretendemos fazer a seguinte insero:"
insert into info_emprstimos values (Johnson,1900)"
A nica forma seria inserir (Johnson,null) na tabela borrower e
(null,null,1900) na tabela loan, no tendo o efeito desejado."

Database System Concepts!

28!

Silberschatz, Korth and Sudarshan (modificado)!

Actualizao de uma vista (cont)!


Outras no tm traduo nica, como por exemplo:"

"create view all_costumers as


!
!(select * from depositor) "
!

!
"

!union "
"
"
"(select * from borrower)"

"

"

"

Toda a adio em all_costumers no tem traduo nica:"

Deve introduzir-se em depositor ou em borrower???"

Database System Concepts!

29!

Silberschatz, Korth and Sudarshan (modificado)!

Actualizao de vistas!
Uma view em SQL actualizvel (updatable) se todas as seguintes

condies se verificam:"
A clasula from s contm uma relao da base de dados;"
A clasula select apenas contm nomes de atributos da relao, no
contendo expresses, agregados, ou especificao de distinct;"
Qualquer atributo que no aparece na clasula select deve poder tomar o
valor null;"
A consulta no contm nenhuma clasula group by nem having."
A view "

"

"create view downtown_account as

!
"
!

!select acount_number,branch_name,balance
"from account"
!where branch-name = Downtown"

... actualizvel. No entanto, a insero "


"
"insert into downtown_account values (L-307,Perryridge,1000)"
apesar de ser efectuada, no produziria efeitos na view."

Database System Concepts!

30!

Silberschatz, Korth and Sudarshan (modificado)!

Actualizao de vistas!
Em Oracle 11g possvel impedir as situaes anteriores por

intermdio da clusula WITH CHECK OPTION na criao da


vista.

create view downtown_account as


!
!select acount_number,branch_name,balance
"
"from account"
!
!
!where branch-name = Downtown"
"with check option!
"
Para impedir a actualizao de vistas utiliza-se a clusula WITH READ

ONLY"

"

Database System Concepts!

31!

Silberschatz, Korth and Sudarshan (modificado)!

Recurso em SQL!
SQL:1999 permite definio recursiva de vistas"
Exemplo: encontrar todos os pares empregado-chefe, onde o

empregado responde directa ou indirectamente ao chefe (i.e. ao chefe


do chefe do chefe, etc.)
with recursive empl (employee_name, manager_name ) as (
select employee_name, manager_name
from manager
union
select manager.employee_name, empl.manager_name
from manager, empl
where manager.manager_name = empl.employe_name)
select *
from empl"
"Esta vista, empl, o fecho transitivo da relao manager"

Database System Concepts!

32!

Silberschatz, Korth and Sudarshan (modificado)!

O poder da recurso!
As vistas recursivas permitem a escrita de consultas, tais como

as de fecho transitivo, que no podem ser escritas sem recurso


(ou iterao). "
Intuio: Sem recurso, um programa no-iterativo e no-recursivo
s pode calcular um nmero fixo de junes de manager consigo
prpria."
Isto s pode fornecer um nmero fixo de nveis de chefias"
Clculo do fecho transitivo"

Cada passo do processo iterativo constroi uma verso estendida de


empl a partir da sua definio recursiva. "
O resultado final chamado de ponto-fixo da definio recursiva da
vista."
As vistas recursivas tm que ser monotnicas. I.e. se

acrescentarmos tuplos relao manager, a vista contm todos


os tuplos que continha anteriormente, e possivelmente mais."

Database System Concepts!

33!

Silberschatz, Korth and Sudarshan (modificado)!

Exemplo de uma computao ponto-fixo!


with recursive empl (emp_name, man_name ) as
!
!(select emp_name, man_name "
"
"
"
"from manager) "
"
"
"
"
"
"
"union
!
!
!
!
!
!
!
!
!(select manager.emp_name, empl.man_name "
"from manager, empl "
"
"
"
"
"
"where manager.man_name = empl.emp_name)"
select * from empl"
empl (1 iter)!

empl (2 iter)!

!
"
!
"
"

empl (inicial)!

manager!

!
emp_name
"

man_name"

Antnio!

Bruno!

Bruno!

Eduardo!

Carla!

Duarte!

Duarte!

Joo!

Eduardo!

Joo!

Joo!

Lara!

Rita!

Lara!

empl (3 iter)!

emp_name"

man_name"

Ponto Fixo"
empl (4 iter)!

empl (5 iter)!

emp_name"

man_name"

emp_name"

man_name"

emp_name"

man_name"

emp_name"

man_name"

emp_name"

man_name"

Antnio!

Bruno!

Antnio!

Bruno!

Antnio!

Bruno!

Antnio!

Bruno!

Antnio!

Bruno!

Bruno!

Eduardo!

Bruno!

Eduardo!

Bruno!

Eduardo!

Bruno!

Eduardo!

Bruno!

Eduardo!

Carla!

Duarte!

Carla!

Duarte!

Carla!

Duarte!

Carla!

Duarte!

Carla!

Duarte!

Duarte!

Joo!

Duarte!

Joo!

Duarte!

Joo!

Duarte!

Joo!

Duarte!

Joo!

Eduardo!

Joo!

Eduardo!

Joo!

Eduardo!

Joo!

Eduardo!

Joo!

Eduardo!

Joo!

Joo!

Lara!

Joo!

Lara!

Joo!

Lara!

Joo!

Lara!

Joo!

Lara!

Rita!

Lara!

Rita!

Lara!

Rita!

Lara!

Rita!

Lara!

Rita!

Lara!

Antnio!

Eduardo!

Antnio!

Eduardo!

Antnio!

Eduardo!

Antnio!

Eduardo!

Bruno!

Joo!

Bruno!

Joo!

Bruno!

Joo!

Bruno!

Joo!

Carla!

Joo!

Carla!

Joo!

Carla!

Joo!

Carla!

Joo!

Duarte!

Lara!

Duarte!

Lara!

Duarte!

Lara!

Duarte!

Lara!

Eduardo!

Lara!

Eduardo!

Lara!

Eduardo!

Lara!

Eduardo!

Lara!

Antnio!

Joo!

Antnio!

Joo!

Antnio!

Joo!

Bruno!

Lara!

Bruno!

Lara!

Bruno!

Lara!

Carla!

Lara!

Carla!

Lara!

Carla!

Lara!

Antnio!

Lara!

Antnio!

Lara!

Database System Concepts!

34!

Silberschatz, Korth and Sudarshan (modificado)!

Exemplo de uma computao ponto-fixo!


empl"
with recursive empl (emp_name, man_name ) as !
!
!
!select emp_name, man_name "
"
"
"
"
"from manager
"
"
"
"
"
"
"
"union !
!
!
!
!
!
!
!
!
!
!
!select manager.emp_name, empl.man_name "
"
"from manager, empl "
"
"
"
"
"
"
"where manager.man_name = empl.emp_name
select * "
"
"
"
"
"
"
"
"
"
from empl"

manager"

1st iteration!
2nd iteration!
3rd iteration!
4th iteration!
5th iteration!

emp_name"

man_name"

Antnio!

Bruno!

Bruno!

Eduardo!

Carla!

Duarte!

Duarte!

Joo!

Eduardo!

Joo!

Joo!

Lara!

Rita!

Lara!

Antnio!

Eduardo!

Bruno!

Joo!

Carla!

Joo!

emp_name"

man_name"

Antnio!

Bruno!

Bruno!

Eduardo!

Duarte!

Lara!

Carla!

Duarte!

Eduardo!

Lara!

Duarte!

Joo!

Antnio!

Joo!

Eduardo!

Joo!

Bruno!

Lara!

Joo!

Lara!

Carla!

Lara!

Rita!

Lara!

Antnio!

Lara!

Database System Concepts!

35!

Silberschatz, Korth and Sudarshan (modificado)!

Embedded SQL!
SQL fornece uma linguagem declarativa para manipulao de bases de

dados. Facilita a manipulao e permite optimizaes muito difceis se


fossem programadas em linguagens imperativas."
Mas h razes para usar SQL juntamente com linguagens de

programao gerais (imperativas):"


o SQL no tem a expressividade de uma mquina de Turing (h perguntas
impossveis de codificar em SQL e.g. fechos transitivos)"
usando SQL juntamente com linguagens gerais possvel suprir esta
deficincia"
nem tudo nas aplicaes de bases de dados declarativo (e.g. aces de
afixar resultados, interfaces, etc)"
Essa parte pode ser programado em linguagens gerais"
O standard SQL define uma srie de embeddings, para vrias

linguagens de programao (e.g. Pascal, PL/I, C, C++, Cobol, etc)."


linguagem na qual se incluem comandos SQL chama-se linguagem

host. s estruturas SQL permitidas na linguagem host chama-se SQL


embutido (ou embedded SQL)"

Database System Concepts!

36!

Silberschatz, Korth and Sudarshan (modificado)!

Embedded SQL!
Permite acesso a bases e dados SQL, via outra linguagens de

programao."
Toda a parte de acesso e manipulao da base de dados feito

atravs de cdigo embutido. Todo o processamento associado


feito pelo sistema de bases de dados. A linguagem host recebe
os resultados e manipula-os."
O cdigo tem que ser pr-processado. A parte SQL

transformada em cdigo da linguagem host, mais chamadas a


run-time do servidor."
A expresso EXEC SQL usado para identificar cdigo SQL

embutido"
" "EXEC SQL <embedded SQL statement > END-EXEC"
"Nota: Este formato varia de linguagem para linguagem. E.g. em
C usa-se ; em vez do END-EXEC. Em Java usa-se # SQL
{ . } ; "

Database System Concepts!

37!

Silberschatz, Korth and Sudarshan (modificado)!

Cursores!
Para executar um comando SQL numa linguagem host

necessrio comear por declarar um cursor para esse comando."


O comando pode conter variveis da linguagem host,

precedidas de :"
E.g. Encontrar os nome e cidades de clientes cujo saldo seja

superior a amount"
EXEC SQL"
"declare c cursor for
select customer-name, customer-city
from account natural inner join depositor"
"
"
" natural inner join customer
where account.balance > :amount"
END-EXEC"

Database System Concepts!

38!

Silberschatz, Korth and Sudarshan (modificado)!

Embedded SQL (Cont.)!


O comando open inicia a avaliao da consulta no cursor"

"

"EXEC SQL open c END-EXEC"

O comando fetch coloca o valor de um tuplo em variveis da

linguagem host."
"

"EXEC SQL fetch c into :cn, :cc END-EXEC"

Chamadas sucessivas a fetch obtm tuplos sucessivos"


Uma varivel chamada SQLSTATE na SQL communication area

(SQLCA) toma o valor 02000 quando no h mais dados."


O comando close apaga a relao temporria, criada pelo

open, que contem os resultados da avaliao do SQL."


"

Database System Concepts!

"EXEC SQL close c END-EXEC"

39!

Silberschatz, Korth and Sudarshan (modificado)!

Modificaes com Cursores!


Como no devolvem resultado, o tratamento de modificaes

dentro doutras linguagens mais fcil."


Basta chamar qualquer comando vlido SQL de insert, delete,

ou update entre EXEC SQL e END SQL"


Em geral, as vriaveis da linguagem host s podem ser usadas

em locais onde se poderiam colocar variveis SQL."


No possvel construir comandos (ou parte deles)

manipulando strings da linguagem host"

Database System Concepts!

40!

Silberschatz, Korth and Sudarshan (modificado)!

Dynamic SQL!
Permite construir e (mandar) executar comandos SQL, em run-

time."
E.g. (chamando dynamic SQL, dentro de um programa em C)

char * sqlprog = update account


set balance = balance * 1.05
"
where account-number = ?
EXEC SQL prepare dynprog from :sqlprog;
char account [10] = A-101;
EXEC SQL execute dynprog using :account;"
A string contm um ?, que indica o local onde colocar o valor a

ser passado no momento da chamada para execuo."

Database System Concepts!

41!

Silberschatz, Korth and Sudarshan (modificado)!

ODBC!
Standard Open DataBase Connectivity(ODBC)"

Standard para comunicao entre programas e servidores de bases


de dados"
application program interface (API) para "
Abrir uma ligao a uma base de dados"
Enviar consultas e pedidos de modificaes"
Obter os resultados"

Aplicaes diversas (eg GUI, spreadsheets, etc) podem usar

ODBC"

Database System Concepts!

42!

Silberschatz, Korth and Sudarshan (modificado)!

ODBC (Cont.)!
Um sistema de bases de dados que suporte ODBC tem uma

driver library que tem que ser ligada com o programa cliente."
Quando o cliente faz uma chamada API ODBC, o cdigo da

library comunica com o servidor, que por sua vez executa a


chamada e devolve os resultados."
Um programa ODBC comea por alocar um ambiente SQL, e

um connection handle."
Para abrir uma ligao a uma BD, usa-se SQLConnect(). Os

parmetros so:"
connection handle,"
servidor onde ligar"
username, "
password "

Database System Concepts!

43!

Silberschatz, Korth and Sudarshan (modificado)!

Exemplo de cdigo ODBC!


int ODBCexample()"

"{"
RETCODE error;"
HENV env; /* environment */ "
HDBC conn; /* database connection */ "
SQLAllocEnv(&env);"
SQLAllocConnect(env, &conn);"
SQLConnect(conn, "aura.bell-labs.com", SQL_NTS, "avi", SQL_NTS,
"avipasswd", SQL_NTS); "
{ . Manipulao propriamente dita }"
"
SQLDisconnect(conn); "
SQLFreeConnect(conn); "
SQLFreeEnv(env); "
}"

Database System Concepts!

44!

Silberschatz, Korth and Sudarshan (modificado)!

ODBC (Cont.)!
Os programas enviam comandos SQL base de dados usando

SQLExecDirect"
Os tuplos resultado so obtidos via SQLFetch()"
SQLBindCol() liga variveis da linguagem a atributos do

resultado do SQL"
Quando um tuplo obtido com um fetch, os valores dos seus
atributos so automaticamente guardados nas ditas variveis."

"

Database System Concepts!

45!

Silberschatz, Korth and Sudarshan (modificado)!

Exemplo de cdigo ODBC!


"char branchname[80];
float balance;
int lenOut1, lenOut2;
HSTMT stmt; "
SQLAllocStmt(conn, &stmt);
char * sqlquery = "select branch_name, sum (balance)
from account
group by branch_name";"
error = SQLExecDirect(stmt, sqlquery, SQL_NTS);"
if (error == SQL_SUCCESS) {
SQLBindCol(stmt, 1, SQL_C_CHAR, branchname , 80, &lenOut1);
SQLBindCol(stmt, 2, SQL_C_FLOAT, &balance,
0 , &lenOut2);"
while (SQLFetch(stmt) >= SQL_SUCCESS) {
printf (" %s %g\n", branchname, balance);
}
}
SQLFreeStmt(stmt, SQL_DROP); "

Database System Concepts!

46!

Silberschatz, Korth and Sudarshan (modificado)!

JDBC!
JDBC uma API Java para comunicar com sistemas de bases

de dados que suportam o SQL."


JDBC suporta vrias formas de consulta e modificao de bases

de dados"
O modelo de comunicao com a base de dados:"

Abre uma ligao"


Cria um objecto statement"
Executa comandos usando esse objecto para enviar os comandos e
obter os resultados"
Usa mecanismos de excepo para lidar com os erros"

Database System Concepts!

47!

Silberschatz, Korth and Sudarshan (modificado)!

Exemplo de cdigo JDBC!


public static void JDBCexample(String dbid, String userid, String passwd) "

{"
try { "
Class.forName ("oracle.jdbc.driver.OracleDriver"); "
Connection conn =
DriverManager.getConnection( "jdbc:oracle:thin:@aura.belllabs.com:2000:bankdb", userid, passwd); "
Statement stmt = conn.createStatement(); "
Do Actual Work ."
stmt.close();
""
conn.close();
""
}" ""
catch (SQLException sqle) { "
""
System.out.println("SQLException : " + sqle); "
""
}" ""

}"

Database System Concepts!

48!

Silberschatz, Korth and Sudarshan (modificado)!

Exemplo de cdigo JDBC (Cont.)!


Actualizao"
try { "
stmt.executeUpdate( "insert into account values
('A-9732', 'Perryridge', 1200)"); "
} catch (SQLException sqle) { "
System.out.println("Could not insert tuple. " + sqle);"
}"
Execuo de perguntas "
ResultSet rset = stmt.executeQuery( "select branch_name,
avg(balance)
from account
group by branch_name");"
while (rset.next()) { "
""
System.out.println(
rset.getString("branch_name") + " " + rset.getFloat(2));
""
} " ""

Database System Concepts!

49!

Silberschatz, Korth and Sudarshan (modificado)!

Linguagens proprietrias!
A maior parte dos sistemas comerciais incluem linguagens

proprietrias que, para alm do embedded SQL, tm primitivas


prprias para (entre outras) criar interfaces no ecr (forms) e
para formatar dados para apresentao de relatrios (reports)."
Algumas destas linguagens tm ainda construtores de mais alto

nvel, para trabalhar sobre cursores."


Tipicamente os programas nestas linguagens, compilam para

outras linguagens (eg C) embedded SQL."


Os sistemas comerciais costumam ainda ter aplicaes de
gerao fcil de programas na linguagem proprietria"
No Oracle a linguagem proprietria o PLSQL. O Forms, o

Reports e o APEX so aplicaes que geram PLSQL."

Database System Concepts!

50!

Silberschatz, Korth and Sudarshan (modificado)!

PL/SQL!
Extenso procedimental ao SQL, do Oracle."
Suporta:"

Variveis (mesmos tipos do Oracle)"


Condies (IF-THEN-ELSE e CASE)"
Ciclos (LOOP, FOR)"
Excepes (para tratamento de erros)"
Unidades de programas em PL/SQL podem ser compilados na

base de dados Oracle."

Database System Concepts!

51!

Silberschatz, Korth and Sudarshan (modificado)!

Construtores procedimentais!
O SQL:1999 suporta uma grande variedade de construtores

procedimentais"

O Oracle suporta aqueles que existem no PL/SQL"


Expresses com whiles e repeats!

!
!
!
!
!

!declare n integer default 0;!


!while n < 10 do!
! ! set n = n+1;!
!end while;

!repeat!
set n = n 1;"
!
!until n = 0;"
!
!end repeat!
Em Oracle, em vez de set var = usa-se var :=!

Database System Concepts!

52!

Silberschatz, Korth and Sudarshan (modificado)!

Construtores procedimentais (Cont.)!


Ciclos"
Iteraes sobre o resultado de perguntas"
E.g. soma de todos os saldos da agncia Perryridge

declare n integer default 0;


for r as
select balance from account
where branch-name = Perryridge
do
!
set n = n + r.balance;
end for"

Database System Concepts!

53!

Silberschatz, Korth and Sudarshan (modificado)!

Construtores procedimentais (cont.)!


Expresses condicionais (if-then-else)

E.g. Soma dos saldos por categorias de contas (com saldo <1000, entre
1000 e 5000, > 5000)"
!
!if r.balance < 1000
" then set l = l + r.balance
"elseif r.balance =< 5000
" then set m = m + r.balance
"else set h = h + r.balance
"end if !
Assinalar condies de excepo e erros, e declarao de tratamento
de excepes"
!
!declare out_of_stock condition;
!declare exit handler for out_of_stock ;
"begin
!
.. signal out-of-stock;
"end!
Neste exemplo o tratamento da excepo exit sai do bloco beginend"
No Oracle em vez de signal usa-se raise!

Database System Concepts!

54!

Silberschatz, Korth and Sudarshan (modificado)!

Funes e Procedimentos!
O SQL:1999 suporta funes e procedimentos"

As funes e procedimentos podem ser escritas directamente em


SQL, ou em linguagens de programao externas (e.g. PL/SQL)."
Alguns sistemas de bases de dados (entre eles o Oracle) permitem
definir funes que devolvem tabelas"
Grande parte dos sistemas de bases de dados tm linguagens

proprietrias onde se podem definir funes e procedimentos, e


que diferem bastante do standard SQL:1999"
No Oracle podem-se criar funes e procedimentos atravs da

linguagem PL/SQL, ou directamente na base de dados."

Database System Concepts!

55!

Silberschatz, Korth and Sudarshan (modificado)!

Funes SQL!
Definir uma funo que, dado o nome de um cliente, devolva o nmero

de contas de que ele titular."


create function account_count (customer_name varchar(20))
returns integer
begin
declare a_count integer;
select count (* ) into a_count
from depositor
where depositor.customer_name = customer_name
return a_count;
end!
Encontrar o nome e morada dos clientes com mais do que uma conta."

"

"select customer_name, customer_street, customer_city


"from customer
"where account_count (customer_name ) > 1"

Database System Concepts!

56!

Silberschatz, Korth and Sudarshan (modificado)!

Funes que retornam Tabelas!


SQL:2003 acrescenta funes que devolvem uma relao como

resultado. "
Examplo: Devolver todas as contas de um dado cliente"
"create function accounts_of (customer_name char(20)"
"
"returns table ( "account_number char(10),
"
"
"branch_name char(15)
"
"
"balance numeric(12,2)))"
"return table
"(select account_number, branch_name, balance
" from account A
" where exists (
" select *
" from depositor D
" where D.customer_name=accounts_of.customer_name
"
and D.account_number = A.account_number ))"
Utilizao"
"
"select *
!from table (accounts_of (Smith))"

Database System Concepts!

57!

Silberschatz, Korth and Sudarshan (modificado)!

Funes e procedimentos SQL!


A funo account_count pode ser escrita como procedimento:"

!create procedure account_count_proc (in customer_name varchar(20),


out a_count integer)
begin!
! select count(*) into a_count
from depositor
where depositor.customer_name = account_count_proc.customer_name"
end!
Os procedimentos podem ser chamados dentro de outros procedimentos

SQL, ou de linguagens SQL embedded ou proprietrias."


E.g. num procedimento SQL"

!declare a_count integer;


"call account_count_proc( Smith, a_count);"

O SQL:1999 permite que haja mais que uma funo ou procedimento com o

mesmo nome, desde que o nmero de argumentos (ou, pelo menos, os


seus tipos) sejam diferentes"

Database System Concepts!

58!

Silberschatz, Korth and Sudarshan (modificado)!

Funes e procedimentos externos!


O SQL:1999 permita o uso de funes e procedimentos escritos

noutras linguagens (e.g. C ou C++) "


A declarao de funes e procedimentos externos faz-se da

seguinte forma:"
"create procedure account_count_proc(in customer_name
varchar(20),out count integer)
language C
external name /usr/avi/bin/account_count_proc

create function account_count(customer_name varchar(20))


returns integer
language C
external name /usr/avi/bin/author_count"

Database System Concepts!

59!

Silberschatz, Korth and Sudarshan (modificado)!

Funes e procedimentos externos (Cont.)!


Vantagens: "
Mais eficiente para muitas operaes"
Mais poder expressivo"
Desvantagens"
O cdigo que implementa as rotinas externas pode ter que ser
carregado no sistema de bases de dados e executado no
espao de endereos deste"
risco de corromper acidentalmente a estrutura da base de
dados"
risco de segurana dos dados"
H alternativas que garante segurana ( custa, por vezes, da
deteriorao da performance)"
A execuo directa no sistema de bases de dados s feita se
a eficincia for bem mais importante que a segurana"

Database System Concepts!

60!

Silberschatz, Korth and Sudarshan (modificado)!

Segurana para rotinas externas!


Para lidar com estes problemas de segurana"

Usar tcnicas de sandbox"


i.e. usar linguagem segura como o Java, que no permite

o acesso a outras parte do cdigo da base de dados"

Ou executar rotinas externas em processo separado, sem


acesso memria usada por outros processos do sistema
de bases de dados"
Os parmetro e resultados so passados via

comunicao entre processos"


Ambas as alternativas tm custos de performance"

"

Database System Concepts!

61!

Silberschatz, Korth and Sudarshan (modificado)!

S-ar putea să vă placă și