Você está na página 1de 15

Bases de Dados I

Aula 10 – LECT
29 de Abril de 2003
Subqueries correlacionadas – pequena
revisão
 Problema:
– Obter Nome, Numero de Sócio e Data de
Ultimo Empréstimo (aula teórica de revisão)
– Solução apresentada não funciona(va)
 3 Formas de Solução:
– Subquery no SELECT
– Subquery no WHERE
– Tabelas “calculadas”
Subquery no SELECT
SELECT S.Nome, S.Numero, (SELECT TOP 1 E.DataInicial FROM Emprestimo E WHERE
E.RefIDSocio=S.IDSocio ORDER By E.DataInicial DESC) AS DataUltimoEmprestimo FROM
Socio S;

 Aspectos relevantes:
– Uso de alias nas tabelas
– Relação estabelecida entre a query exterior e a query
interior (por meio dos alias)
– Necessita de uma condição para eliminar Datas Nulas
– Implementada pela query
Solução1ProblemaUltimoEmprestimo na base de dados
da aula
Subquery no WHERE
SELECT S.Nome, S.Numero, E.DataInicial
FROM Socio AS S INNER JOIN Emprestimo AS E ON S.IDSocio=E.RefIDSocio
WHERE E.DataInicial = (SELECT Max(E2.DataInicial) As DataUltimoEmp FROM
Emprestimo E2 WHERE E2.RefIDSocio=S.IDSocio);

 Aspectos relevantes:
– Uso de alias nas tabelas
– Relação estabelecida entre a query exterior e a query
interior (por meio dos alias), mas desta vez na cláusula
WHERE
– Implementada pela query
Solução2ProblemaUltimoEmprestimo na base de dados
da aula
Tabelas “calculadas” ou “derivadas”
SELECT [Socio].[Nome], [Socio].[Numero], Q1.DataUltimoEmp
FROM Socio INNER JOIN (SELECT RefIDSocio, Max(DataInicial) As DataUltimoEmp
FROM Emprestimo Group By RefIDSocio) AS Q1 ON [Socio].
[IDSocio]=Q1.RefIDSocio;

 Aspectos relevantes:
– Temos um statement SELECT que funciona como se de uma
tabela se tratasse
– Para podermos referenciá-lo como uma tabela, temos de lhe dar
um alias
– Do ponto de vista prático é como se Q1 fosse uma query pré-
gravada que é incluída noutra query
– Implementada pela query Solução3ProblemaUltimoEmprestimo
na base de dados da aula. CUIDADO: O Access guarda-a com
uma sintaxe que tem de ser alterada para a query poder ser
executada
Uso de tabelas ligadas
 Divisão de uma base de dados em duas:
– base de dados de dados
– base de dados de aplicação
– Uso do Database Splitter:
 Menu Database Utilities -> Database Splitter
 Cria-se uma base de dados “back-end” (normalmente como o
nome da original e com o sufixo “_be” na parte final do nome)
e outra “front-end” (nome inalterado)
 As tabelas são graficamente representadas de modo distinto na
BD front-end
 A BD back-end só tem tabelas; A front-end tem todos os outros
elementos, para além de tabelas ligadas
Uso de tabelas ligadas
 Inconveniente “aborrecido”:
– O path para a base de dados back-end é fixo, o
que levanta problemas se a localização de uma
ou das duas BDs for alterada
 Vantagens (da divisão em duas):
– Separação de dados de aplicação
Uso de tabelas ligadas
 Numa qualquer base de dados Access podem existir
tabelas ligadas, que não têm necessariamente de ser todas
 As tabelas podem ser ligadas a qualquer base de dados
que tenha um driver ODBC, desde que se crie um D(ata)
S(ource) N(ame):
– SQL Server (o mais comum)
– Oracle, DB2, MySQL, até bases de dados mais antigas, como
Dbase
 A base de dados a que se faz a ligação pode não ser local:
rede ou Internet (no caso de SQL Server ou outros SGBD
servidores)
ADO – Ligações a BDs
 Definição de uma ligação a BD:
– Access, OLEDB:
 strConnString = "Provider=Microsoft.Jet.OLEDB.4.0;Data
Source=c:\shared\Aula10.mdb“
– SQL Server, OLEDB:
 strConnString = "Provider=SQLOLEDB;Data
Source=localhost;database=myDBName;uid=MyID;pwd=My
PWd;"
– Usa-se este valor na abertura da ligação:
Set cnn = New ADODB.Connection
cnn.open strConnString ‘Abre a ligação
ADO – Abertura de recordsets

Set rst= New ADODB.Recordset


strSql = “SELECT * FROM Obra”

Rst.open strSql, cnn, adOpenKeyset, adLockOptimistic,


adCmdText
 Que parâmetros:
– Sql ou nome de tabela ou stored procedure
– Ligação – connection object ou string
– Tipo de cursor
– Tipo de lock
– Tipo de comando
ADO – Tipos de cursores
 O cursor é quem gere o recordset e a localização
actual no recordset. Podem ser de vários tipos:
– Estáticos (adOpenStatic): contém uma cópia estática dos
registos à altura da abertura;
– Forward-Only (adOpenForwardOnly): idêntico ao estático,
mas só poder haver movimento para a frente no recordset
– Dinâmicos (adOpenDynamic): mantém um conjunto de
registos que reflecte todas as alterações que possam ser
feitas, em qualquer momento;
– Keyset (adOpenKeyset): semelhantes aos dinâmicos, mas
registos novos criados depois da abertura não são incluídos
ADO – Tipos de locks
 Os locks asseguram a integridade dos dados
 Permitem assegurar que só um utilizador
altera o mesmo registo, num dado instante,
por exemplo
ADO – Tipos de locks
 Só Leitura (adLockReadOnly) – Tipo por defeito,
os registos não podem ser alterados neste caso
 Pessimista (adLockPessimistic) – O registo é
“bloqueado” assim que começa a ser editado
 Optimista (adLockOptimistic) – o registo só é
bloqueado quando as alterações são guardadas no
SGBD
ADO – Tipos de comandos
 adCmdText – Linha de texto, string SQL por
exemplo
 adCmdTable – Nome de tabela
 adCmdStoredProc – Stored procedure or query
Access
 adCmdTableDirect – Nome de tabela,
marginalmente mais rápido se forem
seleccionadas todas as colunas
 Outros com menos interesse
ADO – movimentos num Recordset

 Métodos MoveNext, MovePrevious,


MoveFirst, MoveLast
 Propriedade EOF – True se estivermos no
fim do recordset
 Propriedade BOF – True se estivermos no
início do recordset
 Exemplos de uso em ASP: bdi.asp

Você também pode gostar