Execução de Instruções SQL - DI PUC-Rio

Propaganda
Bancos de Dados III
Acesso a SGBDs
via Aplicação
Rogério Costa
[email protected]
1
Execução de Instruções SQL
Instruções SQL dentro de um programa
aplicativo, em conjunto com seu código. SQL
Embutido
Comandos podem ser estáticos (todo o
comando está escrito e não é modificado em
tempo de execução) ou dinâmicos (partes do
comando SQL podem ser alteradas em tempo
de execução).
2
1
SQL Embutido (Embedded SQL)
Permite acesso a bases e dados SQL, via outra linguagens de
programação.
Código embutido
Acesso e manipulação da base de dados
sistema de bases de dados.
Processamento associado
A linguagem host recebe os resultados e manipula-os.
O código tem que ser pré-processado. A parte SQL é
transformada em código da linguagem host, mais chamadas
a run-time do servidor.
3
SQL Embutido (Embedded SQL)
Código tem que ser pré-processado. A parte
SQL é transformada em código da linguagem
host, mais chamadas a run-time do servidor.
Exemplo: Pro*C
4
2
SQL Embutido (Embedded SQL)
A expressão EXEC SQL é usado para
identificar código 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 { …. } ;
5
SQL Embutido (Embedded SQL)
Para executar um comando SQL numa linguagem host é
necessário começar por declarar um cursor para esse
comando.
O comando pode conter variáveis 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
6
3
Programas com SQL
Embutidos
É preciso que o programa possa:
invocar operações SQL passando
parâmetros;
recuperar os resultados de consultas em
variáveis do programa;
detectar exceções produzidas pela
avaliação remota dos comandos SQL
7
Programas com SQL Embutidos
O comando open inicia a avaliação da consulta no cursor
EXEC SQL open c END-EXEC
O comando fetch coloca o valor de um tuplo em variáveis
da linguagem host.
EXEC SQL fetch c into :cn, :cc END-EXEC
Chamadas sucessivas a fetch obtêm tuplos sucessivos
O comando close apaga a relação temporária, criada pelo
open, que contem os resultados da avaliação do SQL.
EXEC SQL close c END-EXEC
8
4
Programas com SQL Embutidos
Em Java -> Exemplo: SQLJ: Embedded SQL
for Java
String dBuser;
#sql { select user into :dBuser from dual };
System.out.println("Database username is " +
dBuser);
9
Acesso via interfaces
padrão
10
5
SGBD Relacional
Os dados ficam armazenados em SGBDs
segundo alguma organização ou modelo.
Modelo mais utilizado => relacional.
Uma das vantagens dos SGBDs relacionais
foi a utilização da linguagem SQL.
Padronização no acesso aos dados.
Mas os fornecedores implementaram variações
da linguagem, da forma de acesso ao SGBD...
11
Interface Padronizada para Acesso
a Banco de Dados
1989
Fornecedores de SGBDs associaram-se através
da SAG ( SQL Access Group) para produzir
especificações de uma interface para uso comum
no acesso aos dados gerenciados pelos diferentes
produtos baseados em SQL.
12
6
Interface Padronizada para Acesso
a Banco de Dados
A SGA se concentrou na especificação de uma
interface para SQL de chamada de função (SQL
Call-Level Interface – SQL CLI)
Objetivo SQL CLI
Simplificar o uso da linguagem SQL para processamento
dos comandos embutidos
Evitar o uso de pré-compiladores para processar os comandos
embutidos e
Viabilizar a emissão de comandos diretamente pelos programas
de aplicação
13
Interface Padronizada para
Acesso a Banco de Dados
Padrão atual da SQL/Cli
ISO/IEC 9075-3:2003
Implementações podem ter diferentes níveis de
conformidade com o padrão
Objetivo de uma interface genérica de programação
(API) padronizada
Desenvolvimento de uma aplicação não precisa estar
orientado a uma linguagem de um SGBD específico
Deve estar de acordo com nível de conformidade (SQL)
14
7
Interface Padronizada para Acesso
a Banco de Dados
Nesta abordagem, a aplicação, em tempo de
execução:
Especifica qual a fonte de dados a que deseja
ter acesso.
Faz a vinculação entre a aplicação e a fonte de
dados, através de um módulo (driver).
O driver converte os formatos de dados e os
comandos padronizados para os formatos
compreendidos pelo SGBD-alvo.
15
Interface Padronizada para Acesso
a Banco de Dados
Não é necessário utilizar várias linguagens para
acesso a dados de diferentes SGBDs
Menor exigência de treinamento dos desenvolvedores
Menos erros de programação
Mais rápido desenvolvimento
Os desenvolvedores não precisam se preocupar com as
particularidades dos bancos de dados que irão acessar e
trabalhar.
16
8
Interface Padronizada para Acesso
a Banco de Dados
Principais implementações de APIs no
mercado
ODBC
JDBC
17
ODBC
ODBC (Open Database Connectivity)
Gerenciador desenvolvido pela Microsoft
Diversos fornecedores de drivers
18
9
Aplicativo
API ODBC
Gerenciador de Drivers ODBC
API do Driver ODBC
Driver ODBC suprido pelo fornecedor
Jet SQL
Oracle
Access SQL
Oracle
19
Aplicativo
API ODBC
Gerenciador de Drivers ODBC
API do Driver ODBC
Driver ODBC suprido pelo fornecedor
Jet SQL
Aplicativo
Access
SQL
Oracle
Oracle
Programa desenvolvido pelo usuário ou pode ser um produto para recuperação,
apresentação e manipulação de dados pelo usuário final, como planilhas por
exemplo.
Interação entre aplicação e fonte de dados:
• Estabelecimento de conexão
• Texto de cada comando colocado em buffer e submetido para execução
• No caso de retorno de resultados, a aplicação deve ter uma área para
armazenamento dos resultados
• No caso de retorno de erros, a aplicação recupera o erro e adota uma ação
adequada
• Fechamento de transação (commit e rollback)
• Finalização da conexão
20
10
Aplicativo
API ODBC
Gerenciador de Drivers ODBC
API do Driver ODBC
Driver ODBC suprido pelo fornecedor
Jet SQL
Access
Oracle
SQL
Oracle
API ODBC: Interface entre o aplicativo e o gerenciador
de drivers.
21
Aplicativo
API ODBC
Gerenciador de Drivers ODBC
API do Driver ODBC
Driver ODBC suprido pelo fornecedor
Jet SQL
Oracle
Access SQL
Oracle
Gerenciador de Drivers
Objetivo:
Efetuar a carga dos drivers solicitados pelos aplicativos,
Inicialização – alocação e desalocação de recursos e criação e finalização de
conexões com os BDs
Passagem de chamadas de função da aplicação para os drivers
Log: registro das chamadas de função efetuadas pela aplicação
Gerencia os diversos pedidos associados a diferentes conexões da aplicação com o
SGBD
22
11
Aplicativo
API ODBC
Gerenciador de Drivers ODBC
API do Driver ODBC
Driver ODBC suprido pelo fornecedor
Jet SQL
Access
Oracle
SQL
Oracle
API do Driver ODBC:
Encapsulamento das regras para escrever drivers de
dispositivo – interessa aos fornecedores de bancos de
dados.
23
Aplicativo
API ODBC
Gerenciador de Drivers ODBC
API do Driver ODBC
Driver ODBC suprido pelo fornecedor
Jet SQL
Access
SQL
Oracle
Oracle
Drivers
É o componente específico de cada SGBD
Driver é o mediador entre a aplicação e a fonte de dados.
Implementa as chamadas remotas ao SGBD
Gerencia a obtenção dos resultados de comandos SQL (como a manipulação de
cursores);
Aloca área para dados e mensagens de erro;
Em casos em que a fonte de dados não implementa todo o potencial ODBC, o driver
implementa a funcionalidade;
Cada driver, em princípio, corresponde a uma biblioteca e corresponde a apenas
uma fonte de dados. Mas existem drivers que podem se comunicar com mais de
uma fonte de dados.
24
12
ODBC
25
ODBC
Camada de middleware
Maior consumo de recursos... Exemplo:
Driver Oracle, em algumas versões, 3% mais
lento do que conexão direta à API do SGBD
26
13
ODBC
Segurança:
Sniffers podem descobrir tudo que é trafegado
Alguns drivers fornecem criptografia
27
ODBC
É possível criar um Data Source Name
(DSN), apontando para uma instância de um
SGBD, utilizando ODBC
28
14
ODBC – Criando DSN
Para executar o ODBC siga os passos:
Menu Start (Iniciar) do Windows, selecionar
Settings (Configurações).
Escolha a opção Control Panel (Painel de
Controle), e na janela que será aberta dê um
duplo clique no ícone do ODBC.
29
Tela Principal do Gerenciador
ODBC
30
15
Origem de Dados ODBC
Para acessar um banco de dados (BD) através
do ODBC é necessário registrar este banco
como uma origem de dados ODBC. Fazendo
isto a aplicação precisa apenas saber o nome
desta origem de dados. A localização e o tipo
do BD não fazem diferença.
31
Origem de Dados ODBC
Origem de Dados System DSN
ao definir a origem de dados como System DSN,
o BD será aberto para qualquer usuário do
sistema.
32
16
Criando um System DSN
(1)
Na tela inicial do ODBC siga os passos descritos a seguir:
Selecione a pasta
System DSN.
Para criar um novo
System DSN, clique
no botão Add.
33
Criando um System DSN
(2)
Depois de pressionado o botão Add, será mostrada a tela a
seguir, onde deve ser especificado o driver ODBC a ser
utilizado para acessar seus dados
Selecione um
driver na lista
apresentada.
Depois de
selecionar, clique
em Finish.
34
17
Criando um System DSN
(3)
Depois de especificar o driver ODBC a ser utilizado, é preciso
selecionar o arquivo que contém os dados.
Indique o nome da origem de
dados (não precisa ser o nome
do banco de dados).
Dê uma descrição
para a origem de
dados.
Nesta parte estão disponíveis as
opções para seleção, criação ou
reparo e compactação do arquivo
de banco de dados. Para
selecionar um arquivo clique no
botão Select.
Feito isso foi criado uma origem de dados para seu banco de dados. Quando for
preciso acessar um BD, será preciso fazer referência apenas a origem de dados.35
Conectando com o SGBD
Utilizando o DSN
' VB.NET
Imports System.Data.Odbc
...
Dim oODBCConnection As OdbcConnection
Dim sConnString As String = _
"Dsn=MeuDSN;" & _
"Uid=UsuarioDoBD;" & _
"Pwd=SenhaDoUsuario"
oODBCConnection = New Odbc.OdbcConnection(sConnString)
oODBCConnection.Open()
36
18
Conectando com o SGBD
Sem o DSN
' VB.NET
Imports System.Data.Odbc
...
Dim oODBCConnection As OdbcConnection
Dim sConnString As String = _
"Driver={SQL Server};" & _
"Server=NomeDoServidor;" & _
"Database=DatabaseASeConectar;" & _
"Uid=UsuarioDoBd;" & _
"Pwd=SenhaDoUsuario"
oODBCConnection = New Odbc.OdbcConnection(sConnString)
oODBCConnection.Open()
37
Conectando com o SGBD
Sem o DSN
' VB.NET
Imports System.Data.Odbc
...
Dim oODBCConnection As OdbcConnection
Dim sConnString As String = _
"Driver={SQL Server};" & _
"Server=NomeDoServidor;" & _
"Database=DatabaseASeConectar;" & _
"Uid=UsuarioDoBd;" & _
"Pwd=SenhaDoUsuario"
oODBCConnection = New Odbc.OdbcConnection(sConnString)
oODBCConnection.Open()
38
19
Conectando com o SGBD
Sem o DSN – Outras strings de conexão
-- Oracle
Dim sConnString As String = _
"Driver={Microsoft ODBC for Oracle};" & _
"Server=OracleServer.world;" & _
"Uid=UsuarioDoBd;" & _
"Pwd=SenhaDoUsuario"
-- Access
Dim sConnString As String = _
"Driver={Microsoft Access Driver (*.mdb)};" & _
"Dbq=c:\somepath\mydb.mdb;"
39
Executando Comandos
Exemplo:
Dim commandString As String = "DELETE FROM Sessions
WHERE Expires < ?"
Dim conn As OdbcConnection = new
OdbcConnection(connectionString)
Dim cmd As OdbcCommand = New OdbcCommand(commandString,
conn)
cmd.Parameters.Add("@Expires", OdbcType.DateTime).Value
= DateTime.Now
conn.Open()
cmd.ExecuteNonQuery()
conn.Close()
40
20
Executando Comandos
Public Sub LeDistinct(ByVal connectionString As String, ByVal
strColuna As String, ByVal strTabela As String)
Dim queryString As String = "SELECT DISTINCT " & strColuna & _
" FROM " & strTabela
Using connection As New OdbcConnection(connectionString)
Dim command As New OdbcCommand(queryString, connection)
connection.Open()
Dim reader As OdbcDataReader = command.ExecuteReader()
While reader.Read()
Console.WriteLine("Valor lido={0}", reader(0).ToString)
End While
reader.Close()
End Using
End Sub
41
JDBC
Java Database Connectivity
Permite aos programadores Java conectar-se
a bancos de dados e a acessá-lo e manipulálo utilizando SQL.
Vantagem: Programas escritos em Java e
JDBC são independentes de plataforma e
independentes de fornecedor.
42
21
Aplicativo Java
API JDBC
Gerenciador de Drivers JDBC
API do Driver JDBC
Ponte JDBC/ODBC
Driver JDBC suprido
pelo fornecedor
Driver ODBC suprido
pelo fornecedor
Jet SQL
Oracle
Access SQL
Oracle
Jet
SQL
Oracle
Jet SQL
Oracle
Access SQL
Oracle
43
JDBC vs ODBC
No final das contas, o conceito por trás de
JDBC é o mesmo que o de ODBC:
programas escritos usando a API JDBC se
comunicariam com o gerenciador de driver
JDBC, que por sua vez usaria os drivers que
estivessem plugados nele naquele momento
para comunicações com o banco de dados
real.
44
22
JDBC vs ODBC
Por que a Sun não utilizou o modelo ODBC?
Motivos alegados por ela:
1. ODBC é difícil de ser aprendida (?)
2. ODBC tem poucos comandos com complexas
opções.
3. Dificuldade de mapear ODBC para Java por causa
de ponteiros e ponteiros para ponteiros, comuns em
C.
45
JDBC
Utilizando JDBC
Carregando drivers com a ponte JDBC-ODBC
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Ou direto via JDBC (exemplo Oracle)
Class.forName("oracle.jdbc.OracleDriver");
46
23
JDBC
Conexão com BD
Estabelecendo conexão
Connection con = DriverManager.getConnection
(url,"myLogin", "myPassword");
Exemplo:
String url = "jdbc:odbc:Fred";
Connection con = DriverManager.getConnection(url,
"Fernanda", "J8");
String url =
"jdbc:oracle:thin:@200.20.235.31:1521:desenv01";
Connection con = DriverManager.getConnection(url,
"Fernanda", "J8");
47
Conexão com BD
Fechando Conexão
con.close();
48
24
JDBC
Criando Comandos em JDBC
Statement
Objeto que envia o comando SQL ao SGBD.
Criamos o objeto comando e o executamos
através de um método apropriado com o tipo do
comando
Métodos de execução de comandos
SELECT -> método executeQuery .
INSERT -> método executeUpdate
Criação, modificação, remoção de tabelas ->
executeUpdate
49
25
Download