SlideShare uma empresa Scribd logo
1 de 50
Baixar para ler offline
ANUNCIO
SQL Magazine - 3
Índice
06
SQL News
Novas tecnologias, atualizações, lançamentos de
produtos,eventos e livros.
12
Otimização de comandos SQL
Conceitos e diretrizes para aumento da perfor-
mance na execução de comandos SQL.
22
Introdução a UML
Definição, implementação e utilizção de um
modelo usando UML
34
Emacs SQL
Utilizando o Emacs para acesso e manutenção de
bancos de dados.
42
PostgreSQL
Uma análise dos recursos do postgre e vantagens
de sua distribuição nacional.
48
JDataStore
Conhecendo o banco de dados e uma entrevista
com Sergio Cardoso.
08
Guia Rápido da SQL
Explorando os princupais recursos do comando
SELECT.
18
Modelagem de dados com ErWin
Uma introdução aos recursos e utilização desta
ferramenta.
26
Conctando Front-Ends
Exemplos práticos para o acesso a banco de dados
com diversas ferramentas.
39
MySQL
Instalação, overview dos recursos e utlilização do
MySQL no linux.
44
Replicação de dados
Teoria e prática envolvendo replicação de dados
no SQL Server.
SQL4 - Magazine
E D I T O R I A L
Coordenador Editorial
Gladstone Matos
gladstone@neoficio.com.br
Editor Geral
Gustavo Viegas
gustavo@sqlmagazine.com.br
Equipe Editorial
Cristina Viegas
Edgar Silva
Fábio Faldini
Gisele Nichols
Pedro Henrique dos Santos
Acessora de Imprensa
Kaline Dolabela
kalined@hotmail.com
Contribuíram nesta edição
Clementino Leal, Cleison Santos,
Everson Ramos, Edgar Silva, Fábio
Faldini,GustavoViegas,GiseleNichols,
GladstoneMatos,PauloRibeiro,Pedro
Henrique
Editor de Arte
Vinicius O. Andrade
viniciusoandrade@gmail.com
Capa
Mauro Lassance
mauro@bitourisn.com
Gerente Geral
Rosângela Matos
rosangela@neoficio.com.br
Publicidade
Julio César Lopes
julio@neoficio.com.br
Jornalista Resposável
Sérgio Moraes C. Brandão
MTb: 15183-68-148
Impressão
Ediouro Gráfica e Editora S/A
Atendimento ao Leitor
info@sqlmagazine.com.br
Assinaturas
assinaturas@sqlmagazine.com.br
Colaboração de Artigos
gustavo@sqlmagazine.com.br
Na Web
www.sqlmagazine.com.br
Distribuição
Fernando Chinaglia Dist. S/A
Rua Teodoro da Silva, 907
Grajaú - RJ - CEP: 206563-900
Atualmente, na medida em que as tecnologias de banco de dados e ferramentas
para desenvolvimento de aplicações vem evoluindo, temos um abismo cada vez
maior entre o profissional de informática e as áreas de conhecimento fora de sua
especialização. Questiono: Até onde deve ir o conhecimento do profissional de
tecnologia da informação? Será que a especialização total é o melhor caminho? Seja
técnico, desenvolvedor ou analista, a questão é quanto de sua área ele precisa saber
para implementar, analisar, projetar e interagir num processo de desenvolvimento
emanutençãodeumaaplicação?Seráquepodemosafirmarqueumdesenvolvedor
deve ter somente conhecimentos profundos de uma determinada ferramenta de
desenvolvimento e, no caso de uma aplicação que acesse um banco de dados, não
teramínimanoçãodestebanco?Ouainda:umDBAquetemaresponsabilidadede
instalar, configurar, dimensionar, criar os objetos de um modelo, garantir uma boa
performance, entre outras, não faria suas tarefas de modo mais consciente sabendo
umpoucosobrecomoosdadosserãoacessadosemanipulados?Podemoscitarainda
aqueles que participam das definições de um projeto, lá no estágio embrionário
do sistema. Para estes, o conhecimento do banco de dados, das tecnologias e
ferramentas utilizadas para desenvolvimento, afetariam na definição do projeto a
ponto de facilitar sua implementação e futura manutenção? Como disse, o abismo
que separa o conhecimento entre cada profissional de informática tem se mostrado
crescente, e isso, de certa forma, não é bom.
ASQLMagazinechegaatévocêcomoobjetivodetrazerinformaçõessobre
o “mundo” dos bancos de dados, tecnologias e ferramentas de desenvolvimento.
Temos uma árdua tarefa diante dos leitores: diminuir o abismo citado, através da
publicação de artigos de “base”, fomentando o conhecimento daqueles que ainda
não lidam com o assunto, artigos técnicos, para os que já utilizam algum tipo de
SGBD e artigos avançados, voltados para DBA´s. Além de novidades, previews,
cursos e dicas.
Espero que você encontre na SQL Magazine informações para o seu
crescimento profissional, tomada de decisão, auxílio na solução de problemas, base
paradefiniçãodeprojetosindependentedoseupapelnosmesmoseacimadetudo:
uma fonte de consultas e mais consultas. Boa leitura.
Gustavo Viegas
Editor
Gustavo@sqlmagazine.com.br
SQL Magazine - 5
ANUNCIO
SQLNews
Usando UML Com .NET
Através do Rational XDE ( eXtended Development Environment ) Professional v2002
você pode ter na IDE do Visual Studio o ambiente nescessário para analisar, implementar e
documentar suas soluções baseadas no .Net FrameWork utilizando UML. Esta integração é
extremamente útil para implementação de sistemas complexo utilizando C#. O XDE suporta
os principais diagramas UML, possibilita a utilização de vários Design Patterns além de facilitar
a implementação de Design Patterns próprios. Consulte www.rational.com <http://www.
rational.com> para um overview do produto.
Application Server da Oracle oferece business intelligence incorporado
Integrado ao servidor de aplicação, o Oracle9i Application Server proporciona todo o
middlewarenecessárioparaumaeficientecomunicaçãodedadoseme-business.Comumúnico
produto é possível executar diversas aplicações (Java, portal, integração de aplicativos, wireless
e outras). Foram efetuadas customizações que otimizam o processo de configuração de backup
e recovery, gerenciamento automático de backups e logs arquivados, backups e restaurações
reiniciáveiserestauração/recuperaçãodeteste.OSQLeoPL/SQLreceberamoutrasmelhorias
noOracle9iAS.Foiadicionadadepuraçãonoladoservidorparamúltiplaslinguagens,permitindo
que os ambientes de desenvolvimento integrado (IDEs) depurem tanto Java quanto PL/SQL
dentro da mesma estrutura. Mais informações em www.oracle.com.br.
Cresce a competição entre os bancos de dados da IBM, Microsoft, e Oracle
EnquantoaMicrosoftfaladefuturasimplementaçõesnoSQLServer,aBigBluedisponibilizaa
versãoDB28.1UDB.Nestaúltimaversão,aIBMestátentandotornaroseubancodedadosmais
fácildeserutilizado,distribuído,eadministrado.Implementaçõesqueaumentamaperformance
na execução de queryes e capacidades autônomas estão entre as novidades do DB2 8.1.
AMicrosoftanunciouaversão64-bitdoSQLServer(Beta)eesperaconquistarmaiorconfiança
dos usuários de banco de dados.
AOracle,porsuavez,utilizouaOracleWorldUserConferenceemSanFranciscoparamostrar
detalhes do seu novo banco de dados, chamado até então de 10i e previsto para lançamento em
meadosde2003.Apesardonomefinaldoprodutonãoestardefinido,aOraclefalouoficialmente
queanovaversãoteráseufoconogerenciamento,aumentodacapacidade,enovosuportepara
XML e Web services.
Computador que se conserta sozinho
A IBM está desenvolvendo sistemas
que se consertam sozinhos e necessitam
de menos intervenção humana.
Para isso, criou a divisão Autonomic
Computing, cuja meta é fazer com que
os computadores sejam autônomos de
maneirasemelhanteaocomportamento
do sistema nervoso humano, que
permite adaptar-se às mudanças à sua
volta, a defender-se de ataques externos
e a recuperar-se de falhas internas. As
capacidadesautônomasestarãoincluídas
inclusive no banco de dados DB2. A
idéia é permitir que os computadores
dêem conselhos sobre seu melhor
rendimento e, então, permitir que esses
sistemas executem os conselhos sem o
aval dos técnicos.
Oracle9i nas eleições
Mais de 185 milhões de votos foram
processadosnoprimeiroesegundoturnosdas
eleições pelo Tribunal Superior Eleitoral. Em
menos de 24 horas, os brasileiros já sabiam o
resultado dos 91 milhões de votos apurados
na primeira fase. Para realizar tal feito, o
TSE utilizou o banco de dados Oracle9i.
O sistema, desenvolvido em parceria do
TSE com a Oracle, é o mais avançado no
segmento. Os dados de todos os Tribunais
Regionais Eleitorais, correspondentes aos
votos para deputados estaduais e federais,
senadores e governadores, são totalizados
e somados aos do TSE, que é responsável
pela centralização e contagem dos votos
para presidente da República. Esse processo
permitiuadivulgaçãoimediatadosresultados
nos telões de apuração e na Internet.
SQL Magazine - 7
IBM DB2 UDB 8.1 para Linux (Beta)
A IBM se orgulha do seu compromentimento com o Linux. Desde o seu portal
Linuxatéacampanha‘Paz,Amor,eLinux’quefoi“grafitada”nasruasdecidades
americanas no ano passado, a companhia tem deixado claro que pretende ser
vista na linha de frente do desenvolvimento para este sistema. A versão 8.1 (Beta)
do DB2 UDB esta disponível para download no site da “Big Blue” (www.ibm.
com/db2/) e a IBM recomenda no mínimo 128Mb de memória e de 250Mb a
350Mb disponíveis em disco para instalação e utilização de um banco de dados
de tamanho médio. Uma novidade está no db2setup utility, um utilitário com
aparência e operação semelhante a de muitos programas para Windows.
Informações adicionais e uma análise do produto estão disponíveis no endereço
http://www.newarchitectmag.com/documents/s=7733/na1202m/index.html.
Microsoft SQL Server comemora seu 10 º Aniversário
A Microsoft Corp. anunciou no dia 20 de novembro o 10º aniversário do
Microsoft(R) SQL Server (TM) na Associação de Profissionais de SQL Server
(PASS) em Seattle, num grande evento exclusivamente dedicado ao banco. No
keynote de abertura, Gordon Mangione, vice presidente corporativo do SQL
ServernaMicrosoft,faloudopassadoedasfuturasimplementaçõesnoSQLServer
como motivos para os muitos clientes e parceiros continuarem a desenvolver
utilizando a plataforma Microsoft SQL Server. Com base nas inovações do
produto, Mangione anunciou a disponibilização do SQL Server 2000 (64-bit) Beta
2 e do Microsoft SQL Server 2000 Service Pack 3 (SP3) Beta 1. Ele encorajou aos
desenvolvedores a utilizarem ambas as versões Beta disponíveis e reforçou o
objetivo da Microsoft de desenvolver um conjunto de ferramentas que garantam
um alto nível de performance, gerenciamento e escalabilidade.
Backups seguros e contínuos
A Storageteck, fornecedora de soluções de armazenamento de dados, está
colocandonomercadoasfitotecasrobotizadasL20,L40eL80,quepermitemqueos
backupssejamfeitoscontinuamente,24horaspordia.Oprodutofoidesenvolvido
para pequenas e médias empresas cujas plataformas rodam em ambientes NT,
Novell, Linux ou Unix. Focados no mercado entry level, as bibliotecas de backup
destinam-se a redes com necessidades de armazenamento a partir de 400 GB. Na
prática, os produtos da Série L são disponíveis nas versões 2, 4 ou 8 drives, com
capacidades de 110 GB a 220 GB cada.
Oracle 9i - O Manual do DBA
Autor: Kevin Loney
Editora Campus - 992 páginas.
R$ 159
Pertencente à série Oracle Press, cujos livros são guias oficiais da Oracle
produzidosporespecialistasdaprópriaempresa,estelivroofereceumacobertura
completa dos recursos mais recentes e as maneiras de incorporar esses recursos
no gerenciamento de um banco de dados Oracle.
Com este livro, o leitor aprenderá a implementar as soluções administrativas
de especialistas, a manter os seus importantes sistemas da Internet e de comércio
eletrônico flexíveis, seguros e disponíveis - tudo com informações exclusivas
autorizadas pela Oracle.
Este guia abrange todos os pontos importantes sobre Oracle 9i, fornecendo
exemplos e técnicas reais. Alguns tópicos:
ANUNCIO
SQL
Guia rápido da
por Gladstone Matos
linguagem SQL é sucinta e ao mesmo tempo poderosa. Através
de um idioma de fácil entendimento, a SQL permitiu a padronização
na forma de comunicar os aplicativos front-ends com os diversos
bancos de dados disponíveis. Neste artigo veremos os principais
parâmetros do comando SELECT, a principal forma de recuperar dados
através da SQL.
A
COMANDO SELECT
A SQL foi criada com o objetivo de
padronizar os comandos de manipulação
de dados em SGBD’s. Hoje em dia, apesar
da linguagem possuir uma quantidade
consideráveldeextensõeseimplementações
proprietárias, pode-se afirmar que a meta
foi alcançada. A maior parte do código
SQL escrito nas aplicações se encontra no
formato“puro”,conhecidocomoANSI.O
sucesso da SQL trouxe uma produtividade
interessante para a manipulação de banco
de dados. Conhecendo bem a linguagem
é possível acessar os recursos básicos de
qualquer banco relacional, como Oracle,
SQL Server ou MySQL, sem praticamente
nenhuma mudança.
Veremos neste artigo um pequeno
guia de referência para os parâmetros
do comando SELECT, um dos mais
importantes da linguagem SQL.
SELECT Simples
O comando SELECT permite recuperar
osdadosdeumobjetodobanco,comouma
tabela, uma view e, em alguns casos, uma
stored procedure (alguns bancos de dados
permitem a criação de procedimentos que
retornam valor). A sintaxe mais básica do
comando é:
SELECT <LISTA_DE_CAMPOS>
FROM <NOME_DA_TABELA>
Exemplo:
SELECT CODIGO, NOME FROM CLIENTES;
SELECT * FROM CLIENTES;
Ocaracter“*”representatodososcampos.
Apesar de prática, esta máscara não é muito
utilizada, pois, para o SGBD, é mais rápido
receber o comando com todos os campos
explicitados. O uso do * obriga o servidor
a consultar quais são os campos antes de
efetuar a busca dos dados, criando mais um
“passo”noprocesso.
COMANDO WHERE
A cláusula Where permite ao comando
SQL passar condições de filtragem, Veja o
exemplo:
SELECT CODIGO, NOME FROM CLIENTES
WHERE CODIGO = 10;
SELECT CODIGO, NOME FROM CLIENTES
WHERE UF = ‘RJ’
SELECT CODIGO, NOME FROM CLIENTES
WHERE CODIGO >= 100 AND CODIGO <=500;
SELECT CODIGO, NOME FROM CLIENTES
WHERE UF=’MG’ OR UF = ‘SP’
Guia Rápido da SQL
SQL Magazine - 9
Osparênteses,corretamenteutilizados,
dão mais poder a consulta:
SELECT CODIGO, NOME FROM CLIENTES
WHERE UF = ‘RJ’ OR (UF=’SP’ AND ATIVO=’N’);
Neste comando, todos os clientes
do Rio de Janeiro e apenas os clientes
inativos de São Paulo seriam capturados.
SELECT CODIGO, NOME FROM CLIENTES
WHERE (ENDERECO IS NULL) OR (CIDADE IS NULL)
Aquitodososclientesquenãopossuem
endereco ou cidade cadastrados serão
selecionados.
FILTRO DE TEXTO
SELECT CODIGO, NOME FROM FUNCIONARIO
WHERE DEPARTAMENTO=’VENDAS’;
SELECT CODIGO FROM CLIENTES
WHERE NOME > “K”;
Parabuscaparcialdestrings,oSELECT
fornece o operador LIKE:
SELECT CODIGO, NOME FROM CLIENTES
WHERE NOME LIKE “MARIA*”;
Neste comando, todos os clientes
cujo nome iniciam com Maria serão
retornados. Se quisermos retornar
os nomes que contenham “MARIA”
também no meio, podemos alterar para:
SELECT CODIGO, NOME FROM CLIENTES
WHERE NOME LIKE “*MARIA*”
O uso da máscara no início e no fim da
stringfornecemaiorpoderdebusca,mas
causaconsiderávelperdadeperformance.
Este recurso deve ser utilizado com
critério.
Nota: Em alguns bancos de dados a
máscara de fitro não é representada pelo
caracter“*”.Consulteareferênciadobanco
utilizadoparaverificarocaractercorreto.
Por padrão, a SQL diferencia caixa
baixa de caixa alta. Para eliminar essa
diferença, utilize a função UPPER:
SELECT CODIGO, NOME FROM CLIENTES WHERE
UPPER(NOME) LIKE “MARIA*SILVA*”
ORDENAÇÃO
A ordenação pode ser definida com
o comando ORDER BY. Assim como
no comando WHERE, o campo de
ordenaçãonãoprecisaestarlistadocomo
campo de visualização:
SELECT CODIGO, NOME FROM CLIENTES
ORDER BY NOME
SELECT CODIGO, NOME FROM CLIENTES
ORDER BY UF, NOME
A inclusão da palavra DESC garante a
ordenação invertida:
SELECT CODIGO, NOME FROM CLIENTES ORDER BY
NOME DESC
SELECT CODIGO, NOME FROM CLIENTES ORDER BY
UF DESC, NOME
JUNÇÃO DE TABELAS
O SELECT permite juntar duas ou
mais tabelas no mesmo resultado. Isso
pode ser feito de várias formas:
SELECT CLIENTES.CODIGO, CLIENTES.NOME,
PEDIDOS.DATA, PEDIDOS.VALOR
FROM CLIENTES, PEDIDOS
WHERE CLIENTES.CODIGO = PEDIDOS.CODCLIENTE
Nesta linha as tabelas relacionadas
CLIENTES e PEDIDOS são unificada
através do campo chave, em uma
operação de igualdade. Repare que o
nomedoscampospassamaserprefixados
pelo nome das tabelas, resolvendo
duplicidades.Umaversãoresumidadesta
comando pode ser:
SELECT A.CODIGO, A.NOME, B.DATA, B.VALOR
FROM CLIENTES A, PEDIDOS B
WHERE A.CODIGO = B.CODCLIENTE
OusodealiasesnocódigoSQLtornaa
manutenção mais simples.
Nocomandoabaixotemosváriastabelas
unificadasemumamesmacláusula:
SELECT A.CODIGO, A.NOME, B.DATA, B.VALOR,
C.QTD, D.DESCRICAO
FROMCLIENTESA,PEDIDOSB,ITENSC,PRODUTOSD
WHERE A.CODIGO = B.CODCLIENTE
AND B.CODIGO = C.CODPEDIDO
AND C.CODPRODUTO = D.CODIGO
Neste comando unificamos as tabelas
relacionadas CLIENTES, PEDIDOS,
ITENS e PRODUTOS. Veja mais alguns
exemplos:
SELECT A.CODIGO, A.NOME, B.DATA, B.VALOR
FROM CLIENTES A, PEDIDOS B
WHERE A.CODIGO = B.CODCLIENTE
AND A.UF= ‘RJ’
SELECT A.CODIGO, A.NOME, B.DATA, B.VALOR
FROM CLIENTES A, PEDIDOS B
WHERE A.CODIGO = B.CODCLIENTE
AND UF = ‘RJ’ OR (UF=’SP’ AND ATIVO=’N’);
SELECT A.CODIGO, A.NOME, B.DATA, B.VALOR
FROM CLIENTES A, PEDIDOS B
WHERE A.CODIGO = B.CODCLIENTE
ORDER BY A.UF, A.NOME
Observe que a junção através da
igualdadedecampostrazcomoresultado
somente os registros que possuem
referência nas duas tabelas. Observe o
comando abaixo:
SELECT A.CODIGO, A.DESCRICAO, B.DESCRICAO
FROM PRODUTOS A , COMPONENTES B
WHERE A.CODIGO = B.CODPRODUTO
Os produtos que não possuem
componentes não são selecionados.
Caso seja necessário criar uma listagem
incluindo também os registros que
não possuem correspondência, deve-se
utilizar o comando JOIN.
COMANDO JOIN
A junção de tabelas no comando
SELECT também pode ser feita com o
comando JOIN. Este comando deve ser
utilizadocomapalavrareservadaINNER
ou com a palavra OUTER:
INNER - Semelhante ao uso do
operador “=” na junção de tabelas. Aqui,
os registros sem correspondências não
são incluídos. Esta cláusula é opcional e
pode ser omitida no comando JOIN.
OUTER – Os registros que não se
relacionam também são exibidos. Neste
caso, é possível definir qual tabela será
incluída na seleção, mesmo não tendo
correspondência.
Para exemplificar, temos as tabelas
abaixo:
Produtos
Código Descrição Categoria
1 Martelo 1
2 Chave de Fenda 1
3 Alicate 2
4 Desmagnetizador 2
5 Parafuso <null>
Componentes
Código Cod.Produto Descrição Qtd
1 3 Adaptador CF 1
2 4 CaboMod A1 2
2 4 CaboMod A2 1
Categoria
Código Descrição
1 Ferramenta A1
2 Ferramenta B1
3 Ferramenta C1
4 Ferramenta D1
Observe os exemplos e o resultado
produzido:
SELECTA.CODIGO,A.DESCRICAO,B.DESCRICAO,B.QTD
FROM PRODUTOS A
INNER JOIN COMPONENTES B
ON (A.CODIGO = B.CODPRODUTO)
SQL10 - Magazine
Resultado 1
Cód Descrição Descrição Qtd
1 Alicate Adaptador CF 1
2 Desmagnetizador CaboMod A1 2
3 Desmagnetizador CaboMod A2 1
Este comando pode ser escrito na
versão resumida abaixo:
SELECT A.CODIGO, A.DESCRICAO, B.DESCRICAO
FROM PRODUTOS A
JOIN COMPONENTES B
ON (A.CODIGO = B.CODPRODUTO)
Como mostrado no resultado, os
produtosquenãopossuemcomponentes
não são incluídos na seleção.
SELECTA.CODIGO,A.DESCRICAO,B.DESCRICAO,B.QTD
FROM PRODUTOS A
LEFT OUTER JOIN COMPONENTES B
ON (A.CODIGO = B.CODPRODUTO)
Resultado 2
Cód Descrição Descrição Qtd
1 Martelo 1
2 Chave de Fenda 2
3 Alicate Adaptador CF 1
4 Desmagnetizador CaboMod A1
4 Desmagnetizador CaboMod B2
5 Parafuso
Neste comando todos os produtos
serão incluídos na seleção, independente
de possuirem um componente. Observe
que a palavra LEFT se refere a primeira
tabela no relacionamento. O mesmo
comando poderia ser descrito na forma:
SELECT A.CODIGO, A.DESCRICAO, B.DESCRICAO
FROM COMPONENTES A
RIGHT OUTER JOIN PRODUTOS B
ON ( A.CODIGO = B.CODPRODUTO )
A ordem das tabelas foi invertida, mas
o resultado é o mesmo. Observe mais
alguns exemplos:
SELECT A.CODIGO, A.DESCRICAO, B.DESCRICAO ,
B.QTD
FROM PRODUTOS A
JOIN COMPONENTES B
ON ( A.CODIGO = B.CODPRODUTO )
WHERE A.CATEGORIA=1
Resultado 3
Cód Descrição Descrição Qtd
<vazio> <vazio> <vazio> <vazio>
SELECT A.CODIGO, A.DESCRICAO, B.DESCRICAO
FROM PRODUTOS A JOIN COMPONENTES B
ON (A.CODIGO = B.CODPRODUTO )
WHERE A.CATEGORIA=1 OR A.CATEGORIA=2
ORDER BY A.CATEGORIA, A.DESCRICAO
Resultado 4
Cód Descrição Descrição Qtd
3 Alicate Adaptador CF 1
4 Desmagnetizador CaboMod A1 2
4 Desmagnetizador CaboMod A2 1
FULL OUTER JOIN
Podemos ainda combinar o uso de
INNER e OUTER através do comando
FULL OUTER JOIN. Neste caso,
todos os registros das duas tabelas
envolvidas serão exibidos, tendo ou não
relacionamento. Observe:
SELECT A.CODIGO, A.DESCRICAO, B.DESCRICAO
FROM PRODUTOS A
FULL OUTER JOIN CATEGORIA B
ON ( A.CATEGORIA = B.CODIGO )
ORDER BY A.DESCRICAO
Produtos
Código Descrição Categoria
1 Martelo Ferramenta A1
2 Chave de Fenda Ferramenta A1
3 Alicate Ferramenta B1
4 Desmagnetizador Ferramenta B1
5 Parafuso
Ferramenta C1
Ferramenta D1
UNION
Existe ainda uma Segunda forma de
juntar tabelas com o comando SELECT.
AtravésdoparâmetroUNION,épossível
“colar” o conteúdo de duas tabelas. Veja
o exemplo:
SELECT CODIGO, NOME FROM CLIENTES
UNION
SELECT CODIGO, NOME FROM FUNCIONARIOS
O resultado deste comando é a
listagem de todos os clientes e a listagem
dos funcionários, dentro do mesmo
result set. Repare que no comando JOIN
auniãoéhorizontalenoUNIONaunião
é vertical.
Por default, os registros duplicados
são eliminados na cláusula UNION. No
exemplo anterior, se tivéssemos um
cliente com mesmo nome e código de
um funcionário, apenas o registro da
primeira tabela seria exibido. Para incluir
todos os registros, independente de
duplicidade, utilize a palavra ALL:
SELECT CODIGO, NOME FROM CLIENTES
UNION ALL
SELECT CODIGO, NOME FROM FUNCIONARIOS
FUNÇÕES DE AGRUPAMENTO
São cinco as funções básicas de
agrupamento:
AVG: Retorna a média do campo
especificado:
SELECT AVG(VALOR) FROM PEDIDOS;
MIN/MAX/SUM: Respectivamente,
retorna o menor valor, o maior e o
somatório de um grupo de registros:
SELECT MIN(VALOR) FROM PEDIDOS;
SELECT MAX(VALOR) FROM PEDIDOS;
SELECT AVG(VALOR) FROM PEDIDOS;
COUNT: Retorna a quantidade de
itens da seleção:
SELECT COUNT(CODIGO) FROM CLIENTES;
AGRUPAMENTO
Um poderoso recurso do comando
SELECT é o parâmetro GROUP
BY. Através dele podemos retornar
informações agrupadas de um conjunto
deregistros,estabelecendoumacondição
de agrupamento. É um recurso muito
utilizado na confecção de relatórios. Para
exemplificar,temosastabelasCLIENTES
e PEDIDOS:
Clientes
Código Nome
1 Gustavo Viegas
2 Vinicius Andrade
3 Rosangela Mattos
Pedidos
Código CodCliente Data Valor
1 1 01/10/2002 500
2 1 02/10/2002 100
3 2 01/10/2002 600
4 3 05/01/2002 100
5 3 10/10/2002 300
6 3 11/10/2002 80
SELECT CODCLIENTE, MAX(VALOR)
FROM PEDIDOS
GROUP BY CODCLIENTE
O comando acima retorna o maior
valor de pedido de cada cliente. Observe
o resultado:
Resultado 6
CodCliente MAX (Valor)
1 500
2 600
3 300
Guia Rápido da SQL
SQL Magazine - 11
SELECT CODCLIENTE, COUNT(*)
FROM PEDIDOS
GROUP BY CODCLIENTE
Aqui vemos quantos pedidos foram
feitos por cada cliente. Veja o resultado:
Resultado 7
CodCliente COUNT(*)
1 2
2 1
3 3
HAVING
Através do comando HAVING
podemos filtrar a cláusula GROUP BY.
Observe o comando abaixo:
SELECT CODCLIENTE, COUNT(*)
FROM PEDIDOS
GROUP BY CODCLIENTE
HAVING COUNT(*) >= 2
Resultado 8
CodCliente COUNT(*)
1 2
3 3
Somente os clientes com 2 ou mais
pedidos serão selecionados. Repare que
o HAVING é utilizado, geralmente,
com alguma função de agrupamento.
Para filtros normais, pode-se utilizar o
comando WHERE. Observe o exemplo
abaixo:
SELECT CODCLIENTE, COUNT(*)
FROM PEDIDOS
WHERE DATA > ‘06/10/2002’
GROUP BY CODCLIENTE
HAVING COUNT(*) >= 2
Resultado 9
CodCliente COUNT(*)
3 2
Repare que o cliente número 3
apresentou apenas dois pedidos, visto
que o primeiro não possui data maior
que 6/10.
Conclusão
O uso correto do comando SELECT
fornece uma poderosa interface de filtro.
Utilizando sempre a sintaxe padrão,
o desenvolvedor conta com maior
independênciadeplataforma,poisoSQL
ANSI é compreendido pelos principais
bancos de dados. Existem ainda funções
especiais e funções de conversão, que
serão abordados em futuras edições da
SQL Magazine. Para maior eficiência no
uso do SELECT, é desejável também o
bomplanejamentosdosíndicesdobanco.
Para maiores informações a respeito do
uso de índices, leia a matéria de Everson
Ramos, publicada nesta edição. Espero
que este artigo introdutório sirva de
consulta em seus projetos!
A formatação no uso de campos do tipo
DATE pode sofrer alterações de acordo com
o banco utilizado. Consulte o manual de
referência do mesmo para maiores detalhes.
NOTA
webSITES
ClubeDelphi
www.clubedelphi.net/guias/index.asp
SQLAutor
GladstoneMatosécoordenadordas
revistasClubeDelphi,JavaMagazineeSQL
Magazine..
Podesercontactadoatravésdoemail:
gladstone@clubedelphi.net
ANUNCIO
SQL
Otimização de comandos
por Everson Volaco
esmo um aplicativo bem projetado poderá experimentar problemas
de desempenho se a frase SQL que usa for mal construída. Falhas no proje-
to do aplicativo e na construção do SQL causam a maioria dos problemas de
desempenho em bancos de dados projetados adequadamente. Veremos neste
artigo como melhorar o comando SQL, para garantir maior performance em
sua execução, tendo como base o ORACLE.
M
A forma como o banco de dados se or-
ganiza para responder a requisição de um
aplicativo é diretamente influenciada pela
maneira como a frase SQL é construída.
Existem vários pontos a serem observados
nesta construção.
O caminho mais
curto é o uso de ín-
dices para auxiliar a
pesquisa mas, é im-
portante observar,
a simples criação de
um índice nem sempre é o melhor cami-
nho para otimização de comandos SQL.
Alguns conceitos importantes
Antes de partir para como e quais as me-
lhores formas de se aplicar e se escrever
comandos SQL é importante relembrar-
mos alguns conceitos importantes.
Existem dois métodos básicos utilizados
pelos SGDB´s para localizar dados, tam-
bém conhecidos como caminhos de aces-
so. São eles:
-Full Table Scan: Leitura seqüencial, blo-
co por bloco, de toda a tabela. Neste mé-
todo, são verificados registro a registro os
critérios de seleção.
-Index Search: Procura de um índice so-
bre a coluna definida no critério de seleção,
identificando a localização dos registros
qualificados.
O ORACLE possui seu próprio meca-
nismo de otimi-
zação, chamado
otimizador, para
executar co-
mandos SQL e
dinamicamente
determinar que
caminho de acesso seguir, dependendo
das informações disponíveis. O melhor
caminho de acesso é, geralmente, o uso
de índices, mas isso nem sempre é verda-
deiro. Por exemplo, se existir uma forma
de identificar diretamente um registro
pelo seu endereço físico, a resposta será
mais rápida. (neste caso estamos falando
do rowid, endereço físico do registro em
uma tabela ORACLE).
Ex.:
SELECT rowid INTO :emp_rowid FROM EMP
WHEREemp.empno=5353FORUPDATEOFemp.ename;
UPDATE emp SET emp.ename = “OTIMIZADOR”
WHERE rowid = :emp_rowid;
“A simples criação de índices nem
sempre é o melhor caminho para
otimizaçãodecomandosSQL”
Otimização de Comandos SQL
SQL Magazine - 13
Excluindo registros duplicados:
DELETE FROM emp e
WHEREe.rowid>(SELECTMIN(x.rowid)FROMempx
WHERE x.empno = e.empno);
Algumas informações para auxiliar o
acesso do otimizador:
Verificar nas colunas dentro da cláusu-
la WHERE:
- Que colunas são índices;
- Que colunas estão definidas como
NOT NULL;
- Que índices podem ser usados.
Épossívelajudarootimizadoraprocu-
rar o melhor caminho de acesso através
dacriaçãodeíndiceseclusters,oqueserá
considerado a partir de agora.
Regras de Utilização de Índices
Um índice será usado se :
- o índice existir;
- a coluna índice for referenciada na
cláusula WHERE;
Umíndicepodeserusadoparatestesde:
- Igualdade:
SELECT e.empno, e.ename FROM emp e
WHERE e.job = ‘CLERK’;
- Intervalo ilimitado:
SELECT e.empno, e.ename FROM emp e
WHERE e.job > ‘CLERK’;
- Intervalo limitado:
SELECT e.empno, e.ename FROM emp e
WHERE e.job BETWEEN ‘CLERK’ AND ‘JONES’;
A criação de índices deve ser feita com
critério. A atualização (inserts, updates e
deletes) em tabelas de dados gera uma
ação equivalente nos índices, sendo que o
tempodeatualizaçãodosíndicesésuperior
ao de atualização da tabelas, pois além da
colocaçãodoregistroemseqüênciadentro
do índice é necessário a atualização dos ra-
mosdasárvoresdoíndice.
Considerando os detalhes acima, índi-
ces devem ser criados somente quando
necessário, pois a sua simples existência
não implica em melhoria de performan-
ce, podendo muitas vezes ser a origem
de perda de performance.
Condições de não utilização de Índices
1)FunçõesouOperadoresAritméticos
Se a coluna índice for modificada por
umafunçãoouporoperadoresaritméticos
(+,-,*,/),oíndicenãoseráutilizado.
Um índice sobre SAL ou ENAME não
será utilizado nos seguintes casos:
SELECT e.ename, e.empno FROM emp e
WHERE e.sal*12 = 2400;
SELECT e.ename, e.empno FROM emp e
WHERE SUBSTR(e.ename,1,3) = ‘JON’
Nos casos acima, as seguintes modifi-
cações permitem o uso de índice:
SELECT e.ename, e.empno FROM emp e
WHERE e.sal = 2400/12
SELECT e.ename, e.empno FROM emp e
WHERE e.ename LIKE ‘JON%’
2) Conversão de Dados
A conversão de dados pode inibir a
utilização do índice da coluna em ques-
tão se usado inadvertidamente.
Na seguinte sentença, um índice sobre
a coluna HIREDATE não será usado:
SELECT e.ename, e.empno FROM emp e
WHERE TO_CHAR(e.hiredate, ‘month dd,yyyy’) =
‘january 23,1982’
Esta mesma sentença SQL, modifica-
da, usará o índice como segue:
SELECT e.ename, e.empno FROM emp e
WHERE e.hiredate = to_date(‘january 23,1982’ ,
’mounth dd,yyyy’)
Se na cláusula WHERE os predicati-
vos utilizam dados de tipos diferentes,
o ORACLE automaticamente converte
um deles sem a preocupação sobre a me-
lhor escolha para a utilização dos índices.
A conversão por default é escolhida, pelo
caso mais comum (Ex.: O valor de uma
coluna, onde o tipo é number, rowid ou
date, comparado com uma constante de
tipo char). Em qualquer caso é muito re-
comendado o controle da conversão dos
dados de maneira explícita.
3) Caso de colunas com valores NULL
Osíndicesnãocontêmreferênciapara
valoresdotiponull.Istoquerdizerqueos
valores null podem ser
recuperados somente
através de uma leitura
seqüencialcompletada
tabela(FullTableScan).
No comando abai-
xo o índice sobre a
coluna COMM não
será utilizado:
SELECT e.ename, e.empno FROM emp e
WHERE e.comm is null
Neste código o otimizador considera
que a maioria dos registros dentro da ta-
bela são valores not null e irá escolher a
leitura seqüencial (Full Table Scan):
SELECT e.ename, empno FROM emp e
WHERE e.comm > = 100
A velocidade de execução dependerá
dos dados da tabela. Se a maioria dos
registros contiver valores não nulos, a
cláusula “comm is not null” será mais
rápida.
Os índices concatenados não terão re-
ferência para os registros onde todas as
colunas que o compõem tiverem valores
nulos.
4) Caso de predicados com a condição
“NOT EQUAL”
Os índices sobre colunas referencia-
das pela condição not equal não serão
usadas. O otimizador considera que o
número de registros que irão satisfazer a
condição será maior do que os registros
que não a satisfazem.
O índice sobre DEPTNO não será usa-
do na seguinte sentença SQL:
SELECT e.ename, e.empno FROM emp e
WHERE e.deptno !=10
No comando abaixo, o índice sobre
deptno será utilizado:
SELECT e.ename, e.empno FROM emp e
WHERE not e.deptno > 20
O ORACLE executará a sentença SQL
como e.deptno <= 20
5)CasosdesentençasSQLcomcláusu-
la “ORDER BY”
A cláusula ORDER BY aumenta con-
sideravelmenteanecessidadederecursos
paraexecuçãodeumasentençaSQL.Em
geral, tabelas temporárias serão necessá-
rias para operação de sort.
É possível evitar a utilização de tabelas
temporárias se um índice sobre a coluna
alvodoorderbyexistir.Asseguintescon-
dições devem ser cumpridas:
- A coluna order by
deveserdefinidacom
not null;
- A coluna order by
deve ser uma simples
coluna índice ou as
primeiras
colunas de índice
concatenado;
- A cláusula order by deve conter so-
mente colunas e não expressões;
- Não deve haver qualquer cláusula
group by, distinct ou for update;
- Não deve haver nenhum outro aces-
“Se a maioria dos registros
contiver valores não nulos, a
cláusula‘comm is not null’será
mais rápida.”
SQL14 - Magazine
so alternativo que seja prioritário sobre o
índice da coluna order by;
A seguinte sentença SQL será executa-
daviaíndiceemDNAMEseosrequisitos
mencionados acima forem respeitados:
SELECT d.dname FROM dept d order by d.dname;
SELECT d.dname, d.deptno FROM dept d
WHERE d.loc = ‘dallas’ order by d.dname;
SELECT d.dname, d.loc FROM dept d
WHEREd.dname!=‘accouting’orderby d.dname;
Nasentençaabaixo,seumíndicesobre
a coluna LOC existir, tornar-se-á prio-
ritário e o índice sobre dname não será
usado:
SELECT d.dname, d.deptno FROM dept d
WHERE d.loc = ‘dallas’ order by d.dname;
6) Casos de sentenças SQL contendo
funções MAX ou `MIN
Um índice será usado para executar
umasentençaSQLcomMAXouMINse
as seguintes condições forem satisfeitas:
- MAX ou MIN devem ser apenas ex-
pressões da lista de seleção;
- A lista de seleção não deve ter qual-
queroutrooperadordeconcatenaçãoou
adição a não ser somen-
te MAX ou MIN;
- A lista de seleção
não deve conter qual-
queroutracolunaanão
ser uma simples ocor-
rência da coluna como
agrupamento de MAX
ou MIN;
- A sentença SQL não pode ser um
JOIN;
- A cláusula WHERE e group by não
podem ser utilizadas;
- A coluna alvo do MAX ou MAX deve
ser indexada ou fazer parte das primeiras
colunas de um índice concatenado.
A seguinte sentença SQL utilizará um
índice sobre a coluna SAL:
SELECT (max(e.sal)*2) + 10000 FROM emp e;
7) Sentenças SQL recuperam informa-
ções sobre uma simples tabela
Uma sentença SQL pode ter vários
índices únicos e/ou não únicos à disposi-
ção do otimizador. A escolha do índice a
ser usado depende da presença de:
-Índicesúnicosenãoúnicos:osíndices
“É possível ajudar o otimizador
a procurar o melhor caminho
de acesso através da criação de
índices e clusters”
únicos serão favorecidos sobre os índices
não únicos.
- Vários índices não únicos : os regis-
trosidentificadospelocaminhodeacesso
do índice condutor (o primeiro nome na
sentença SQL) serão unidos com aquele
identificado por outro índice. A meta é
identificarosregistrospertencentesa to-
dos os índices.
Se o otimizador não tiver clara esco-
lha concernente a qual índice usar, então
irá arbitrariamente escolher o primeiro
mencionado dentro da sentença SQL
como índice condutor (Driving Index).
8) Caso de sentença SQL com inter-
seção de vários predicados de igualdade
dentro da cláusula WHERE com índice
não único.
Oíndicenãoúnicoserásorteadopela
coluna rowid a fim de minimizar o nú-
mero de comparações necessárias.
Se nós temos índice não único sobre
JOB e DEPTNO:
SELECT e.ename FROM emp e WHERE e.job =
‘manager’ and e.deptno = 20;
a. Procura a primeira ou próxima
referência do índice sobre job (driving
index) con-
tendo ‘manager’.
b. Procura a pri-
meira ou a próxi-
ma referência do
índice deptno con-
tendo valor 20.
Compara as duas rowid.
- Se as duas forem iguais, registro en-
contrado. Vai a próxima referência de
“a.” e compara com a próxima refe-
rência de “b.”.
- Se forem diferentes guarda a referên-
cia de “a.” e passa a próxima referência
de “b.”.
- c. Continua a procura até que não
existam mais referências sobre o índice
de job (driving index).
9) Caso de sentença SQL com interse-
ção de um predicado de igualdade com
umpredicadosemlimite,dentrodacláu-
sula WHERE com índice não único.
Somente o índice sobre a igualdade
será usado. No exemplo que segue, se ín-
dices não únicos existirem sobre as colu-
nas JOB e DEPTNO, o índice sobre JOB
será utilizado, os registros corresponden-
tes serão recuperados e verificada a vali-
dade do segundo predicado.
SELECT e.ename FROM emp e
WHERE e.job = ‘manager’ and e.deptno > 10
10) Caso de índice Concatenado
Índices concatenados são índices for-
mados por várias colunas representados
como se fosse simplesmente uma única
coluna.
a) Interseção de vários predicados de
igualdade.
Se um índice concatenado existir sobre
DEPTNO e JOB, somente uma referên-
cia será necessária para localizar a
rowid correspondente :
SELECT e.ename FROM emp e
WHERE e.job = ‘manager’ and e.deptno = 10
b) Interseção de predicados sem limite
com predicados de igualdade.
Se um índice concatenado existir sobre
DEPTNO e JOB, será utilizado para
executar a seguinte sentença SQL :
SELECT e.ename FROM emp e
WHERE e.job = ‘manager’ and e.deptno > 10
c) Interseção de predicado sem limite.
Se um índice concatenado existir sobre
DEPTNO e JOB, será utilizado para
executar a seguinte sentença SQL:
SELECT e.ename FROM emp e
WHERE e.job > ‘manager’ and e.deptno > 10
d) Utilização parcial ou total dos índi-
ces concatenados.
Ootimizadorpodesomenteusaraouas
primeira(s)parte(s)doíndiceconcatenado.
No seguinte caso, um índice concate-
nado foi criado sobre as colunas EMP-
NO, ENAME e DEPTNO:
A seguinte sentença SQL usa plena-
mente o índice concatenado:
SELECT * FROM emp e
WHERE e.empno = 7369
AND e.ename = ‘smith’ and e.depnto = 20
SELECT * FROM emp e
WHERE e.ename = ‘smith’
AND e.empno = 7369
AND e.deptno = 20
As seguintes sentenças SQL utilizam
parcialmente o índice concatenado:
Otimização de Comandos SQL
SQL Magazine - 15
Uso parcial do índice usando somente
EMPNO e ENAME:
SELECT * FROM emp e
WHERE e.empno = 7369 and e.ename = ‘smith’
Uso parcial do índice usando somente
EMPNO e ENAME :
SELECT*FROM emp e
WHERE e.empno = 7369 and e.deptno = 20
As seguintes sentenças SQL não usam
o índice :
SELECT * FROM emp e
WHERE e.ename = ‘smith’ and e.deptno = 20
SELECT * FROM emp e WHERE e.ename = ‘smith’
SELECT * FROM emp e WHERE e.deptno = 20
11) Casos de Índice único e não único
na mesma sentença SQL.
O otimizador favorecerá a utilização
do índice único.
No seguinte caso o índice não único
existe em SAL e um índice único em
EMPNO :
SELECT e.ename FROM emp e
WHERE e.sal = 3000 and e.empno = 7902
Oíndiceúnicoseráusadoparaprocurara
rowidcorrespondenteaoempno=7902.
Nos registros recuperados serão verifi-
cados o valor de sal.
12) Caso de vários índices na mesma
sentença SQL.
Se vários índices únicos estão disponí-
veis, o otimizador irá escolher o primei-
ro mencionado na sentença SQL. Por
exemplo, se índices únicos existirem so-
bre ENAME e EMPNO, e um índice não
único existir sobre SAL, a seguinte sen-
tença SQL será executada sobre o índice
ENAME
SELECT e.deptno FROM emp e
WHERE e.sal = 3000
and e.ename = ‘scott’ and e.empno = 7602
Otimização da cláusula OR (União de
predicados)
O caminho de acesso é determinado
como se a cláusula OR e suas ramifica-
ções estivessem ausentes. O caminho é
determinado considerando cada ramifi-
cação da cláusula OR separadamente.
Exemplo A
Índice existente sobre SAL e JOB.
SELECT e.ename FROM emp e
WHERE e.deptno = 10
AND (e.sal = 3000 or e.job = ‘clerk’)
Neste caso, o caminho de acesso iden-
tificadopor“2”émelhorqueoidentifica-
do por “1”, então a cláusula OR é otimi-
zada para utilização dos índices.
Exemplo B
Somente índice sobre SAL utilizando a
mesma sentença do exemplo
Os dois caminhos de acesso identifi-
cado por “2” não são melhores que o
identificado por “1”, então os índices não
serão utilizados e ocorrerá uma pesquisa
seqüencial na tabela. O otimizador na
Cláusula OR exige a presença dos índices
utilizáveis dentro de cada coluna referen-
ciada dentro da cláusula OR.
Verificando o “Caminho de Acesso” do
otimizador
Podemos verificar o caminho de aces-
so utilizado pelo SGDB para executar
uma determinada frase SQL. Chamare-
mos esse caminho de “Acesso de Plano
de Execução”. No plano de execução são
verificados todos os procedimentos fei-
tos pelo SGDB, como utilização ou não
de índices, clusters, rowid, além da verifi-
cação da quantidade de passos realizados
pelo banco para execução do comando.
Este procedimento é muito útil, pois
pode ser utilizado como recurso para ve-
rificarmos se as alterações efetuadas em
um comando realmente otimizam a exe-
cução do mesmo. A verificação do plano
de execução é feita no Oracle através do
comando EXPLAIN PLAN. A sintaxe do
comando é a seguinte:
EXPLAIN PLAN
SET STATEMENT_ID = ‘COMAND_ID’
INTO OUTPUT
FOR COMANDOSQL;
Onde:
-COMAND_IDéumStringidentifica-
1)Para DEPTNO = 10 - Pesquisa seqüencial na tabela;
2) Para SAL = 3000 - Índice não único sobre SAL;
Para JOB = ‘clerk’ - Índice não único sobre JOB;
Análise
1)Para DEPTNO = 10 - Pesquisa seqüencial na tabela;
2) Para SAL = 3000 - Índice não único sobre SAL;
Para JOB = ‘clerk’ - Pesquisa sequencial na tabela.
Análise
dor para posterior visualização do plano
de execução.
- OUTPUT é tabela onde o plano de
execução é gerado. O usuário que execu-
tar o EXPLAIN PLAN deve ter direitos
de INSERT sobre a mesma. O comando
para criação desta tabela émostrado da
listagem1.
O Script para criação desta tabela cha-
ma-se “UTLXPLAN.SQL” e é instalado
juntamente com oracle e a sua localiza-
ção depende da versão do banco.
- COMANDOSQL é o comando a ser
analisado.
Para verificação do plano de execução
gerado pelo EXPLAIN PLAN devemos
consultar a tabela informada no comando.
Este procedimento pode ser efetuado de
váriasmaneiras,umadelaséaquesegue:
SELECT SUBSTR(LPAD(‘ ‘,2*(LEVEL-1))||
operation,1,50) operation, options,
object_name, position
FROM OUTPUT
STARTWITHid=0ANDstatement_id=‘COMAND_ID’
CONNECT BY PRIOR id = parent_id AND
statement_id = ‘COMAND_ID’;
Onde,
-COMAND_IDéumStringidentifica-
dor do plano de execução informado no
EXPLAIN PLAN
Listagem 1.
create table NOME_DA_TABELA (
statement_id varchar2(30),
timestamp date,
remarks varchar2(80),
operation varchar2(30),
options varchar2(30),
object_node varchar2(128),
object_owner varchar2(30),
object_name varchar2(30),
object_instance numeric,
object_type varchar2(30),
optimizer varchar2(255),
search_columns number,
id numeric,
parent_id numeric,
position numeric,
cost numeric,
cardinality numeric,
bytes numeric,
other_tag varchar2(255),
partition_start varchar2(255),
partition_stop varchar2(255),
partition_id numeric,
other long,
distribution varchar2(30));
SQL16 - Magazine
- OUTPUT é tabela onde o plano de
execução é gerado.
Vamos exemplificar a execução do
EXPLAIN PLAIN validando a seguinte
informação:
“Umíndiceéutilizadoseeleexistirese
acolunaquefazpartedesteíndiceestiver
contida na clausula WHERE do coman-
doSQL.Estemesmoíndicenãoéutiliza-
do se existirem funções de conversão de
dados envolvendo esta coluna.”
Em outras palavras: a execução do co-
mando“SELECT*FROMEMPWHERE
EMPNO = 50” utilizará o índice da chave
primária,quecontémacolunaEMPNO,ea
execuçãodocomando“SELECT*FROM
EMP WHERE TO_CHAR(EMPNO) =
‘50’”,nãoutilizaráoíndice.
Utilizaremos o comando do quadro
emdestaqueacimaparacriaçãodatabela
que receberá o plano de execução, com
o nome de PLAN_TABLE. Em seguida
executaremos o EXPLAIN PLAN para
verificação da utilização do índice com o
seguinte comando:
EXPLAIN PLAN
SETSTATEMENT_ID=‘SQLMagazineComIndice’
INTO PLAN_TABLE
FOR
SELECT * FROM EMP WHERE EMPNO = 50;
A verificação do plano de execução é
feita de seguinte forma:
SELECT SUBSTR(LPAD(‘ ‘,2*(LEVEL-1)) ||
operation,1,50) operation, options,
object_name, position
FROM PLAN_TABLE
START WITH id = 0 AND statement_id =
‘SQLMagazine Com Indice’
CONNECT BY PRIOR id = parent_id AND
statement_id = ‘SQLMagazine Com Indice’;
O resultado com o plano de execução
é mostrado na Tabela 2.
Analisando este resultado comprova-
mos que o índice referente a chave pri-
mária foi utilizado. Vamos verificar ago-
ra o mesmo comando alterado:
EXPLAIN PLAN
SETSTATEMENT_ID=‘SQLMagazineSemIndice’
INTO PLAN_TABLE
FOR
SELECT*FROMEMPWHERETO_CHAR(EMPNO)=‘50’;
A verificação do plano de execução é
feita de seguinte forma:
SELECT SUBSTR(LPAD(‘ ‘,2*(LEVEL-1)) ||
operation,1,50) operation, options,
object_name, position
FROM PLAN_TABLE
START WITH id = 0 AND statement_id =
‘SQLMagazine Sem Indice’
CONNECT BY PRIOR id = parent_id AND
statement_id = ‘SQLMagazine Sem Indice’;
Este resultado mostra que a utilização
doíndicefoianuladapelafunçãoaplicada
a coluna.
Conclusão
Os cuidados a serem tomados com o
acesso a dados da aplicação são parte im-
portante de um projeto. A forma como
as consultas são escritas e como o banco
de dados está projetado influencia direta-
mentenaperformancedoproduto.Esses
fatores não devem andar separados. Na
maioria dos casos é necessária a perfeita
integração entre a consulta escrita e o
estado do banco de dados. Muitas vezes
uma simples “arrumação” na consulta,
trocandoalgumascláusulasoumudando
um pouco a “lógica” das condicionais,
garante um ganho na velocidade de exe-
cuçãoerespostadamesma.Nãoesqueça
nuncadeanalisarseoíndiceasercriadoé
realmente necessário, para não adicionar
um mais um processo para o seu banco.
Boa sorte e bons projetos!
OPERATION OPTONS OBJECT_NAME
select statement
table access by index rowid emp
index unique scan pk_emp
OPERATION OPTONS OBJECT_NAME
select statement
table access full emp
ANUNCIO
Otimização de Comandos SQL
SQL Magazine - 17
ANUNCIO
SQL
Modelagem de dados com
por Cleison Santos
oloca-se como de fundamental importância tanto a análise
como a modelagem de dados para o processo de desenvolvimento
de aplicações. Esses procedimentos garantem um maior controle
das diversas etapas do projeto desde a denição das regras do
negócio até a implementação e manutenção da aplicação como um
todo. Existem no mercado, atualmente, diversas ferramentas para
modelagem de dados, dentre as quais pode ser destacado o soft-
ware ErWin.
C
O ErWin pode ser usado de uma for-
ma simples e prática possibilitando uma
melhor visualização, controle e documen-
tação do que se tem no banco de dados.
Através dos diversos recursos disponíveis
(Figura 1) podemos “desenhar” o nosso
banco de dados definindo as entidades de
que compõe o modelo com seus respec-
tivos atributos e relacionamentos, definir
características dessas entidades tornando-
as reais em um modelo físico ou em vários
modelos físicos se for necessário o acesso a
SGDB´s distintos. Podemos ainda criar, de
forma automática, o modelo implemen-
tado num banco de dados ou gerar scripts
para atualização de alterações efetuadas no
modelo, “sincronizar” dois bancos de for-
ma a garantir uma estrutura idêntica em
ambos, e vários outros recursos.
Na parte superior direita, observa-se uma
barra de ferramentas com os principais ob-
jetos do ErWin, como mostrado na Figura
2, a seguir:
Alguns conceitos importantes
1) Entidades - Entidade é o local onde
ficam armazenadas as informações. Por
exemplo, a Entidade ‘CLIENTES’ pode
guardar informações referentes aos clien-
tes, e assim sucessivamente.
2) Subtipos - Podem
ser definidos como
um espelho de uma
ou mais entidades. Por
exemplo, pode-se criar
um subtipo chamado
CLIENTES_RJ que
contenha somente os
clientes que moram no
Rio de Janeiro, poden-
do ter ou não todos osFigura1.TelainicialdoErWin
Modelagem de Dados com ErWin
SQL Magazine - 19
atributos da Entidade CLIENTES.
3) Atributos - Os atributos podem ser
definidos como identificadores de cada
informação contida na entidade. O Códi-
go do Cliente, por exemplo, é um atribu-
to da Entidade CLIENTES.
4)Relacionamentos-Relacionamentos
são definidos como a ligação entre duas
ou mais entidades.
5) Cardinalidade - É o que caracteriza
o relacionamento.Por exemplo: um pai
pode ter mais de um filho, porém um fi-
lho só pode ter apenas um pai. Isso quer
dizer que a cardinalidade define o com-
portamento do relacionamento, definin-
do-o como um para muitos, muitos para
um ou até muitos para muitos.
Os tipos de modelo
• Modelo Lógico: É o modelo de abs-
tração do sistema. Neste, detalhes como
qual banco de dados será usado, o tipo
de campo, o tipo de hardware, entre ou-
tros aspectos não são relevantes. Aqui,
somente as necessidades do processo são
definidas, dando uma visão “global” do
sistema. No Erwin, podemos ter uma
visão da regra de negócio, ou seja, pode-
mos planejar uma estrutura lógica para
o banco de dados, onde são definidas as
validações,asrestriçõesdaregradenegó-
cio, a análise das entidades e dos atribu-
tos definidos para a aplicação como um
todo.
•Modelo Físico: É onde os detalhes
são definidos. Serve como um espelho
de tudo o que está no banco de dados,
permitindo controlar características de
tabelas e colunas (conhecidos no mode-
lo lógico como Entidades e Atributos) de
forma particular para o SGDB utilizado
além de possibilitar a definição de Proce-
dures, Triggers e outros processos.
Criando o modelo lógico
O tipo de modelo que está sendo visu-
alizado encontra-se na Combo situada
logoacimadabarradeferramentas,mos-
trada na Figura 1.
O modelo utilizado inicialmente será o
modelo lógico, pois começando por este
fica mais fácil definir o outro. Isso por-
que, como já foi visto, no modelo lógico
tem-se um melhor controle da aplicação,
sendo possível definir as validações ne-
cessárias, tanto para a regra de negócio
comoparaaimplementaçãodebancode
dados no modelo físico. Posteriormente,
podem ser criados modelos físicos para
acessar a diferentes bancos de dados a
partir do mesmo modelo lógico.
Será criado um modelo simples, onde
definiremos algumas entidades com seus
respectivos atributos e relacionamentos
mostrandocomoutilizaralgunsdosmui-
tos recursos disponíveis no ErWin para
modelagem de dados. O modelo será
feito com base em um sistema comercial
com as tabelas CLIENTES, VENDEDO-
RES, PRODUTOS, FORNECEDORES,
PEDIDOS E ITENS_PEDIDOS.
Criando as Entidades
Como já visto, as entidades podem
ser criadas através do primeiro objeto da
barra de ferramentas, clicando nesta, ar-
rastando para o modelo e trocando o seu
nome, como mostrado na Figura 3.
Criando os Atributos
Paracriarosatributos,bastaapenasdar
um duplo clique na entidade. É possível
criar novos atributos, renomear ou ex-
cluirumatributojáexistente,comomos-
trado na figura 4. Pode-se, também, ao
lado direito da tela, definir várias caracte-
rísticas do atributo como chave primária
na opção Primary Key ou Requerido na
opção Required.
Figura2.BarradeferramentadoErWin
Entidades
Criar subtipos de entidades existentes
Inserir textos no modelo, como comentário
de entidades, relacionamentos e outros
Relacionamento de cardinalidade um para muitos
Relacionamento de cardinalidade muitos para muitos
Relacionamento de cardinalidade um para um
Auxilio para mudar os atributos de posição ou de entidades
Figura3.CriaçãodaEntidadeClientes
Figura4.EditordeAtributos
Figura5.EditordeRelacionamentosentreentidades
SQL20 - Magazine
Criando os Relacionamentos
Para definir um tipo de relacionamen-
to, basta escolher um dos três objetos já
mostradosdabarradeferramentas,clicar
na tabela pai e depois na tabela filho. Au-
tomaticamente, o relacionamento esco-
lhido é visualizado. A figura 5 mostra o
editor de Relacionamento e suas funcio-
nalidades.
Ao dar um duplo clique sobre o
relacionamento esta tela é automati-
camente aberta. Nela definimos a car-
dinalidade do relacionamento, assim
como a nulidade dos campos que estão
sendo relacionados.
A figura 6 mostra o modelo total-
mente criado, com suas entidades, atri-
butos e respectivos relacionamentos.
Criando o modelo físico
Após criar todo o modelo lógico é ne-
cessária a definição dos atributos do mo-
delo físico.
Para alternar entre os modelo físico e
lógicobastaselecionarnaCombosituada
logoacimadabarradeferramentas,mos-
trada na Figura 1.
No modelo físico iremos definir carac-
terísticas das entidades e atributos cria-
dos no modelo lógico de acordo com o
SGDB utilizado. Neste modelo temos
uma visão real das tabelas, colunas, pro-
cedures, triggers e outros objetos do nos-
so banco.
A figura 7 mostra o Editor de Coluna
do modelo físico.
Conforme o observado no modelo fí-
sico, não existem mais Entidades e Atri-
butos, e sim Tabelas e Colunas, nomes
comuns ao banco de dados. O editor de
coluna permite alterar o tipo e tamanho
decadacampo,assimcomodefinirseele
pode ou não receber valores nulos. Ain-
da pode-se utilizar a aba Comment para
comentar cada campo, assim como cada
tabela.
Criando o banco de dados a partir do
Modelo Físico criado
Terminada a implementação é neces-
sário criar os objetos definidos no ErWin
emumbancodedados.Paraisso,épreci-
so fazer o modelo apontar para o SGDB
a ser utilizado acessando-se o menu: Ser-
verTarget Server. Além da seleção do
SGDB e da versão do mesmo é possível
definir opções referentes ao tipo de da-
dos e a nulidade default para as colunas
definidas no modelo bem como máscara
paranomenclaturaautomáticadeíndices
e tabelas. Vide Figura 9.
Após as configurações do Target Ser-
ver,bastaacessaromenuTasksForward
Engineer/Schema Generation para criar
obancodedados.VideFigura10.Utiliza-
remos um banco criado no Oracle.
Como se pode ver a tela é bem intuiti-
va. Na pasta Summary indicamos os ob-
jetos do nosso modelo ( tabelas, colunas,
índices, triggers, etc.. ) que serão criados
no banco. Ao clicar no botão Generate,
obancoécriado,automaticamente,com
todas as tabelas, campos e relacionamen-
tos demonstrados no modelo físico.
A Figura 11 mostra os scripts com to-
dos objetos gerados no banco de dados a
partir do modelo implementado.
Criando um modelo a partir de um
banco existente
Em muitos casos, o banco de dados já
está totalmente implementado, sendo
necessária a criação do modelo a partir
deste. Este processo chama-se Enge-
nharia Reversa, e é acessado pelo menu
TasksReverse Engineer. A primeira tela
a ser exibida é a ErWin Template Se-
lection, onde escolhe-se a opção Blank
Diagram para criar o modelo do zero.
Ao clicar em Next, depara-se com a tela
Select Taget Server, onde é informado o
tipo de banco de dados a ser utilizado e
a sua versão. Clicando-se mais uma vez
no botão Next, surge a tela Set Options
ondesãodefinidosprocedimentosneces-
sários à realização da engenharia reversa.
Vide figura 12.
Figura6.Modelológicocomentidades,atributoserelacionamentos.
Figura7.EditordeColuna
Figura8.ModeloFísicocomTabelas,ColunaseRelacionamentos
Figura9.TargetServer–ConfiguraçãodoBancodeDados Figura10.Teladegeraçãodebancodedados
Modelagem de Dados com ErWin
SQL Magazine - 21
Deste modo, as opções da engenharia
reversa podem ser definidas como Da-
dos de Tabelas, Colunas, TableSpace,
Procedure, Triggers e outros. Na opção
Table/Views Owned By, foi seleciona-
da a opção Current User para importar
somente os objetos criados pelo usuário
conectado, poderíamos importar objetos
de todos os usuários do banco ou de um
usuáriodiferentedoatualmenteconecta-
do desde que o mesmo tenha privilégios
no banco suficientes para isso. Ainda há
possibilidade de se escolher formas de in-
dexação e outras coisas mais.
Clicando-senobotãoNext,visualiza-seatela
deconexão,conformemostradonaFigura13.
Esta é a tela que permite fazer a cone-
xão do modelo com o banco de dados
definido em Taget Server, mostrado na
Figura 9. Esta tela também é apresentada
quando o banco é criado a partir do mo-
delo. Nela são informados o Nome de
Usuário, a Senha e a Connect String que
repesenta a instância onde será efetuada
a conexão, neste caso, com o Oracle. Foi
criada uma Connection String, chamada
“Comercio” no TNSNAMES do Oracle
apontando para o banco de dados. Feito
tudo isso, é só clicar no botão Connect
que o modelo é criado automaticamen-
te, conforme mostrado na Figura 14.
Foi possível, a partir de um banco exis-
tente, criar um modelo semelhante ao já
implementado, conforme já mostrado.
No processo de Engenharia Reversa no
ErWin, os modelos lógico e físico são
criados automaticamente.
Criando vários modelos físicos a partir
de um único modelo lógico
Ainda se pode, a partir de um modelo
lógico, criar modelos físicos para acessar
bancos de dados diferentes do Oracle.
Será criado um modelo físico que acesse
um banco de dados Sql Server a partir
do mesmo modelo lógico criado para o
Oracle. Para isso basta acessar o Target
Server, mostrado na figura 9, mudar o
banco para o Sql Server, escolhendo a
versão, definindo os padrões (como já
mostrado) e efetuar os procedimentos
mostrados nas figuras 10 e 11.
AFigura15apontacomoficaomodelofísi-
coparaacessarobancodedadosSqlServer.
Observa-se que alguns tipos de campos
mudaram, como os campos de valores
monetários,quepassaramdeNumber(7,2)
paraMoney,eosdedata,quepassaramde
Date para Date/Time. Com isso, conclui-
seque,apartirdeummodelológicocriado,
pode-se criar modelos físicos para acessar
diversosbancosdedados,eesteseadaptaà
situaçãodecadaumautomaticamente.
É importante ressaltar que o modelo
lógico continua o mesmo.
Conclusão
Estes são apenas alguns dos muitos
recursos que o ErWin oferece para mo-
delagem de dados. É possível criar Pro-
cedures, Triggers, Views, alterar o banco
de dados, alterar o modelo a partir de al-
guma alteração feita no banco, criar o di-
cionário de dados, etc. A implementação
de um modelo antes do início do desen-
volvimento de um sistema garante uma
visão ampla e unificada do mesmo, facili-
tando em muito a definição da regras de
negócio, a implementação, manutenção
e análise dos procedimentos, garantindo
inclusive a continuidade do trabalho no
casodealteraçõesnaequipededesenvol-
vimentocompoucoounenhumretraba-
lho uma vez que o modelo disponibiliza
de forma clara e objetiva uma documen-
tação de toda infra-estrutura do sistema.
Figura11.Scriptcomocódigodecriaçãodastabelasde-
finidasnomodelo.
Figura12.TeladeopçõesdaEngenharia
Figura13.TeladeConexãocomoOracle.
Figura15.ModeloFísicoparaacessaroSqlserver.Figura 14. Modelo criado apartir de um banco de dados existente usando a
EngenhariaReversa
SQLAutor
Cleilson Santos é Analista de Sistemas, trabalha no
Projeto SEP (Sistema de Engenharia de Poço) e SIRR
(SistemadeReservaeReservatório)naPetrobrás.
Podesercontatadopeloe-mailcleilsonsantos@uol.com.br
UML
Introdução à
por Gustavo Viegas
o nal dos anos 80 e início dos anos 90, tínhamos muitos con-
itos de denições e nomenclaturas na área de modelagem. A es-
colha para utilização de um determinado padrão era denido mais
pelo “gosto” pessoal do que por fatores técnicos oferecidos. Então,
os três mais respeitados nomes nesse campo, cada qual com seu
conceito e implementação de modelo, Ivar Jacobson (OOSE – Object
Oriented Software Engineering), Grady Booch (The Booch Method)
and James Rumbaugh (OMT –Object Modeling Technique) decidi-
ram por m aos debates e trabalhar juntos na denição de um mod-
elo único que veio a ser a UML.
N
A UML permite que você “desenhe”
uma “planta” do seu sistema. A compara-
ção ideal é a de um construtor que vai rea-
lizarumprojetosemantestertodaaplanta
que defina estrutura a ser construída. A ex-
periência do construtor garante, até certo
ponto, o sucesso do projeto. Mas, com
certeza, uma vez feito o planejamento, o
“cálculo estrutural”, o desenho da planta, a
garantia de sucesso antes, durante e depois
da efetivação da construção é incompara-
velmente maior. O mesmo acontece com
um projeto de software. A experiência
do desenvolvedor ou analista, não pode
substituir a necessidade de um projeto que
defina uma “planta” da solução como um
todo. Esta “planta” garante, em todas as
fases do projeto, seja na definição, desen-
volvimento, homologação, distribuição,
utilização e manutenção do mesmo, uma
maior clareza e objetividade para execu-
ção de cada ação, e, com certeza, quanto
maior a solução, maior a necessidade de
um projeto definido adequadamente. Des-
ta forma, a UML é uma linguagem padrão
para visualização, especificação, constru-
ção e documentação de um aplicativo ou
projeto de software, e objetiva aumentar a
produtividade, otimizar as etapas que en-
volvem o desenvolvimento de um sistema,
aumentando assim a qualidade do produto
a ser implementado. Ela independe da fer-
ramenta em que o aplicativo será desenvol-
vido. A idéia e prover uma visão lógica de
todooprocessodeformaafacilitaraimple-
mentação física do mesmo.
A UML disponibiliza, através de concei-
tos, objetos, símbolos e diagramas, uma
forma simples, mas objetiva e funcional, de
documentação e entendimento de um sis-
tema. Você pode utilizar os diagramas e ar-
quivos que compõe um modelo UML para
o desenvolvimento, apresentação, treina-
mento e manutenção durante todo o ciclo
de vida da sua aplicação. Ela é mais com-
pleta que outras metodologias empregadas
para a modelagem de dados pois, tem em
seu conjunto todos os recursos necessários
parasuprirasnecessidadedetodasasetapas
que compõe um projeto, desde a definição,
implementação, criação do modelo de ban-
co de dados, distribuição, enfim, proporcio-
nando sem qualquer outra ferramenta ou
metodologia adicional, um total controle
IIntrodução à UML
SQL Magazine - 23
do projeto.
A UML implementa uma modelagem
comumavisãoorientadaaobjetos.Atra-
vés dela podemos definir as classes que
compõe a nossa solução, seu atributos,
métodos e como elas interagem entre si.
Apesar da UML ter como base a orien-
tação a objetos, não significa que a fer-
ramenta e a linguagem utilizada para a
implementação do modelo seja também
orientada a objetos, embora seja reco-
mendável. Este artigo não irá explorar os
conceitos de orientação a objetos, e sim
a implementação de um modelo UML
simples, para início da documentação de
um sistema, utilizando dois diagramas
implementados pela UML que são o
“Diagrama de Casos e Uso” e o “Diagra-
ma de Classes”. Os diagramas têm como
objetivo representar, através de um con-
junto de elementos, como o sistema irá
funcionar e como cada peça do sistema
ira trabalhar e interagir com as outras.
Outra vantagem vem da facilidade de lei-
tura dos diagramas que compõe a UML,
além da facilidade de confeccioná-los,
pois existem inúmeras ferramentas para
modelagem de dados orientados a ob-
jetos (ferramentas Case), dentre elas o
RationalRose,oModelMaker,eoPosei-
dom UML. Além dos diagramas citados
a UML disponibiliza outros diagramas,
dentre os quais podemos citar o Diagra-
ma de Objetos, Diagrama de Seqüência,
Diagrama de Colaboração, Diagrama de
Estado, Diagrama de Atividade e Diagra-
ma de Componentes.
Entendendo UML a partir de um ex-
emplo prático
UtilizaremosoPoseidonUMLparaim-
plementar o modelo do exemplo. O Po-
seidon UML é uma ferramenta case que
suporta os principais diagramas UML e é
desenvolvido em Java. Tem algumas fa-
cilidadesnoqueserefereainteraçãocom
o Java podendo, a partir de um modelo
gerar o código Java das classes definidas
no mesmo e também suporta a Enge-
nharia Reversa, que é gerar o modelo a
partir das classes implementadas. O Po-
seidontemsuaversãofreeepodeserbai-
xado em www.gentleware.com.
O modelo aqui proposto começa a ser
implementado a partir de um problema
real que é a necessidade de um cliente. O
problema proposto é o seguinte:
“Desenvolver um sistema para um
caixa eletrônico onde é permitido a um
cliente realizar quatro tipos de opera-
ções: a de consulta de saldo, solicitação
de extrato, depósito e saque. Esse mes-
mo caixa eletrônico deve ser abastecido
de dinheiro e ter os depósitos recolhidos
por um funcionário do banco”
Para definição do modelo do nosso sis-
tema, iremos implementar primeiro um
DiagramadeCasosdeUsoouUseCases.
Os objetivos principais de um diagrama
de Casos de Uso são:
• Descrever os requisitos funcionais do
sistema de maneira uniforme para usuá-
rios e desenvolvedores;
• Descrever de forma clara e consisten-
te as responsabilidades a serem cumpri-
das pelo sistema, formando a base para a
fase de projeto;
•Ofereceraspossíveissituaçõesdomundo
realparaafasedetestesdosistema.
Oselementosbásicosdeumdiagramade
casodeusosão:ator,casodeuso,interação
esistema,todosilustradosnafigura1.
Um ator é uma entidade externa ao
sistema que de alguma forma participa
de um caso de uso. Um ator pode ser
um ser humano, máquinas, dispositivos,
ou outros sistemas. Atores típicos são
cliente, usuário, gerente, computador,
impressora, etc. Os atores representam
um papel e iniciam um caso de uso que
após executado, retorna um valor para o
ator. Um caso de uso especifica um ser-
viço que será executado ao usuário e é
compostoporumoumaiscenários. Um
cenário é uma narrativa de uma parte do
comportamento global do sistema. Para
oproblemaproposto,oDiagramadeCa-
sosdeUsopodeserimplementadocomo
mostrado na figura 2.
No Diagrama de Casos de Uso imple-
mentado o sistema é o Caixa Eletrônico,
os atores representam o Cliente e o Fun-
cionário do banco. O Cliente interage
com os Casos de Uso consulta de saldo,
solicitação de extrato, depósito e saque e
o Funcionário interage com os Casos de
Uso Abastece de dinheiro e Recolher en-
velopes de depósitos.
Para melhor entendimento do Diagra-
madeCasosdeUsoénecessáriaadescrição
textual do fluxo do Caso de Uso (principal
ealternativo)edoCenáriooudosCenários
que compõe cada Caso de Uso. Iremos
descreveroUseCaseSolicitaçãodeExtrato
bemcomooCenárioqueocompõe.
Após a descrição textual de todos os
Casos de Uso e respectivos Cenário, nos-
sa documentação envolvendo o Diagra-
ma de Casos de Uso está completa.
O segundo diagrama a ser utilizado
para solução do problema proposto é
o Diagrama de Classes. Este diagrama,
contém as classes que caracterizam os
objetos do nosso sistema. As classes são
extraídas a partir da análise do Diagrama
de Casos de Uso e representam os com-
ponentesdeinteraçãodonossosistemae
Figura2
SQL24 - Magazine
como eles se relacionam. Vamos implementar um Diagrama
deClasse,apartirdoDiagramadeCasoseUsoimplementado,
com a definição das classes Cliente, ContaBancaria e Lança-
mentos da Conta. ( Vide Figura 4 )
Uma classe é representada por um retângulo sólido com três
partes:aprimeiraparaonomedaclasse;outraparaosatributos
da classe ( que podem ser vistos como características da clas-
se);eaterceiraparaadeclaraçãodasoperaçõesdefinidasparaa
classe. A Figura 3 mostra a notação UML para classes.
Através da classe Cliente implementada no diagrama da fi-
gura 4, nós definimos as características do nosso cliente (neste
caso um Identificador e um Nome que representam os atribu-
tos da classe), seu relacionamento com a classe ContaBancaria
que é de 1 para muitos ( isto representa a cardinalidade do re-
lacionamento ) e definimos uma operação realizada pela classe
que é ObterContaBancaria(). A mesma análise deve ser feita
para a classe ContaBancaria e LancamentoConta.
Com esse diagrama, já podemos identificar elementos que
existirão em nosso sistema, suas carcterísticas e operações. Es-
sas definições estão contidas nas classes. Essas classes tornam-se
reais em nosso sistema a quando são manipuladas por ele e, a
partir daí, são conhecidas como objetos, pois suas características
passam a “ter um valor” e elas começam a interagir com outros
objetosdasclassesrelacionadas.
Conclusão
A UML se mostra como parte essencial no “ciclo de vida”
de uma aplicação. Foi mostrado, utilizando apenas dois dia-
gramas, toda a funcionalidade operacional de um sistema bem
como a definição de elementos internos referentes ao desen-
volvimento do mesmo. Esses dois diagramas fazem parte da
documentação do sistema, e podem ser utilizados para uma
apresentação da solução para o requisitante antes da imple-
mentação da mesma, visualização dos processos que o sistema
irá disponibilizar, definição de elementos inerentes ao desen-
volvimento como estrutura de telas, procedimentos operacio-
nais, referência para criação de objetos de persistência em um
banco de dados, etc.
Existem outros elementos a explorar, outros diagramas, ou-
tros tipos de relacionamentos e documentação, mas este foi
um passo inicial para conhecer todos os recursos que a UML
disponibiliza e aumentar a qualidade do desenvolvimento de
nossas aplicações.
Caso de Uso“Solicitação de Extrato”
1) Descrição textual do fluxo principal do Use Case Solicita-
ção de Extrato
EsteCasodeUsoinicia-sequandooClienteescolheaopçãoExtratoapóspassarocartãonocaixa
eletrônicoeterasuacontavalidada.Apósavalidaçãodacontaosistemapedeaoclienteparaescolher
dentreasopçõesdesaldo:
Extrato Rápido - O subfluxo A1 (Imprimir Extrato Rápido) é executado.
Extrato no Período - O subfluxo A2 (Imprimir Extrato no Período) é executado.
Sair - O Caso de Uso é encerrado, o sistema volta a tela principal e solicita que o cliente passe o
cartão.
2) Descrição textual dos Subfluxos alternativos associados a
este use case
A1 - Imprimir Extrato Rápido
O sistema solicita que o cliente entre com a senha para autorizar a impressão do extrato (o sub-
fluxo B1 - Solicitar e Validar de senha alfabética - é executado). Caso a senha seja validada a conta
do cliente é consultada e o extrato é impresso (o subfluxo B2 – Imprimir Extrato - É executado). O
sistema volta a tela principal e solicita que o cliente passe o cartão.
A2 - Imprimir Extrato no período
O Sistema solicita que o cliente informe a data inicial e final pra impressão do extrato. Em seguida
O sistema solicita que o cliente entre com a senha para autorizar a impressão do extrato (o sub-
fluxo B1 - Solicitar e Validar de senha alfabética - é executado). Caso a senha seja validada a conta
do cliente é consultada de acordo com o período e o extrato é impresso (o subfluxo B2 – Imprimir
Extrato - É executado). O sistema volta a tela principal e solicita que o cliente passe o cartão.
B1- Solicitar e Validar de senha alfabética
O sistema solicita que a senha do cartão seja digitada. Consulta a conta do cliente validando a
senha digitada. Caso a senha não seja válida o sistema informa na tela e pede mais uma tentativa.
O sistema verifica a quantidade de erros de validação de senha ocorridos no dia e informa que
após 3 tentativas erradas o cartão do cliente será bloqueado e informa o número de tentativas
que o cliente ainda dispõe. O Cliente pode sair da operação e voltar para a tela inicial, ou tentar
novamente. Caso a senha seja válida, a operação prossegue. Caso contrário, após três tentativas o
cartão do cliente é bloqueado.
B2- Imprimir Extrato
O sistema verifica se a impressora do caixa eletrônico está ativa e se a mesma possui papel. Caso
apresente um dos problemas citados, o sistema mostra uma mensagem solicitando que o cliente
realiza a operação em outro caixa eletrônico e volta para a tela inicial e avisa do erro sempre que
uma operação que envolva impressão for solicitada. Caso contrário, o conteúdo solicitado para
impressão é impresso.
3) Cenário Primário
José dirige-se ao caixa eletrônico e passa o cartão na máquina. O Sistema, após validar a conta
exibe as opções disponíveis. José seleciona a opção de Solicitação de Extrato. Em seguida
José seleciona a opção de Extrato no Período. Informa a data inicial e final. O Sistema solicita a
senha a José. Após José digitar a senha e confirmar a operação, o Sistema valida a senha, consulta
a conta de José e imprime o extrato de movimentação da conta no período selecionado.
4) Cenário Secundário
O Sistema, ao verificar os requisitos para impressão, retornou que a impressora estava sem papel.
José, após ser informado do problema pelo sistema, dirigi-se a outro caixa eletrônico e inicia
novamente a operação.
Figura4
Figura3
SQLAutor
GustavoViegaséeditordarevistaSQLMagazine.Pode
sercontactadopeloemail:gustavo@sqlmagazine.com.br
IIntrodução à UML
SQL Magazine - 25
ANUNCIO
Delphi, VB.Net e Java
Como conectar Front-Ends
por Pedro Henrique
Paulo Correia
Gustavo Viegas
tualmente não podemos negar que deparamos diariamente
com diversas formas de armazenamento e manipulação de dados.
Isto independe do lugar que estamos ou do que fazemos. Se vamos
a um mercado, temos computadores que registram as vendas, má-
quinas de consulta de preços de produtos, terminais para saques
eletrônicos, máquinas de cartão de crédito, entre outros. É comum
encontrarmos em diversas áreas da nossa vida a presença de má-
quinas e aplicativos que, de alguma forma, lidam com dados arma-
zenados, dinamizando e facilitando seu acesso.
A
É comum encontrar aplicações que inte-
ragem com algum tipo de informação ou
conjunto de informações. Independente
da linguagem que foram desenvolvidas,
elas visam garantir aos seus usuários segu-
rança, clareza e objetividade na recupera-
ção e manutenção do seu conteúdo. Mas
antes de falarmos dos sistemas que fazem
o usuário interagir diretamente com os
dados, visualizando-os e manipulando-os
de forma coerente e usual, é importante
termos conhecimento prévio de que as
informações manipuladas por eles, em sua
maioria, estão armazenadas em um Siste-
ma Gerenciador de Banco de Dados, ou
simplesmente SGBD.
Este SGBD deve garantir que os dados
estejam armazenados de forma organiza-
da,permitindoatualizações,inclusõeseex-
clusões e garantindo toda segurança e con-
sistência. Por definição temos que SGDB é
“um software (ou conjunto de Softwares)
responsável pelo gerenciamento (armaze-
namentoerecuperação)dosdadosnoban-
co de dados”.
Um SGBD pode gerenciar um ou mais
bancos de dados. Mas como definir um
banco de dados? Se nós temos um arquivo
contendo a tabela de preços dos produtos
de uma indústria, nós temos um banco de
dados?Conceitualmente,umabancodeda-
dos tem de representar uma coleção de da-
dos organizados de forma coerente e com
um significado real. Uma tabela de preços,
por si só, não tem um significado real sem
que existam outras tabelas que interajam
com ela. Se nós temos uma tabela de pre-
ços, uma tabela de clientes, uma tabela de
pedidos e uma tabela de produtos, já po-
demos montar um quadro que traduz um
processodeatendimentoaclientes,vendae
controle de estoque, ou seja, uma situação
real armazenada num banco de dados.
A forma mais comum de intera-
ção entre usuário e banco de dados ocor-
re através de sistemas específicos, que por
sua vez acessam o volume de informações
geralmente através da linguagem SQL
(Strutured Query Language), padrão entre
os SGBD´s. A ferramenta de desenvolvi-
Conectando Front-Ends com Delphi,VB.Net e Java
SQL Magazine - 27
mento utilizada para a implementação
desses sistemas é tão importante quanto
o SGBD que gerencia as informações a
serem acessadas por eles. Iremos analisar
três grandes ambientes para desenvolvi-
mento: Delphi, VB .Net e Java.
Por que o Delphi?
O Borland Delphi é uma grande opção
para o desenvolvimento de sistemas em
que é necessário utilizar servidores de
BancodeDadosSQL.Inicialmente,éim-
portante frisar que o Delphi possui um
suporte bem amplo aos Servidores SQL
encontrados hoje no mercado, através
da implementação de diversos drivers e
engines. Alguns são da própria Borland,
como o DbExpress e a obsoleta BDE.
Outros são de terceiros, como o ADO
(ActiveXDataObjects)daMicrosoft.Um
driver geralmente é uma dll, um conjun-
todefunçõesutilizadasparaacessoema-
nipulação de dados em um banco. Um
engine é um aplicativo que faz a interfa-
ce ou tradução das mensagens enviadas
NOTA
Para obter mais informações sobre o
ADO, acesse o Microsoft Universal Data
Access no endereço: http://www.micro-
soft.com/data. Lá é possível baixar a ver-
são mais recente do MDAC (conjunto de
componentes que, entre outros recursos,
inclui o ADO).
pela aplicação para o driver, de forma
que seja transparente para a aplicação o
tipo de driver que está sendo utilizado
para acesso ao banco. Uma das grandes
novidades do novo Delphi é o suporte
através da dbExpress ao servidor Micro-
soft SQL-Server 2000.
Neste artigo usaremos o DbExpress
e o ADO como engines de acesso e o
banco de dados será o Northwind do Mi-
crosoft SQL-Server 2000. O ADO, sendo
desenvolvido pela Microsoft, se caracte-
riza como uma ótima opção para cone-
xãoaoMSSQLServer, alémdefacilitara
distribuição da aplicação, uma vez que é
suportado nativamente por diversas ver-
sões do sistema operacional Microsoft
Windows (Win 98 SE, Win ME/2000
Professional, Win XP Home/Professio-
nal). Exemplificaremos o mesmo acesso
utilizando o DBExpress. Iremos verificar
que as diferenças de programação de um
Engine de acesso para outro no Delphi
são poucas. O que muda mais é o deploy
(distribuição) e a performance.
Figura1. Uma nova aplicação no Delphi Figura2. Componentes SQL Connectiom
Figura3. Configuração do SQL Connection Figura4. SQLConnection configurado
Exemplo em Borland Delphi 7
Primeiro iremos exemplificar a cone-
xão utilizando DbExpress.
Passo1–Iniciandoumanovaaplicação.
Clique menu File / New / Application
como mostra a figura 1
Passo2 – Configurando a conexão
Adicione ao formulário form1 o com-
ponente SQLConnection, localizado na
paleta de componentes DbExpress. Em
seguida, clique com o botão inverso do
SQL28 - Magazine
mouse no componente e selecione Edit
Connection Properties, como mostra a
figura 2.
Será exibida uma caixa de diálogo
para configuração das propriedades de
conexão com o banco de dados. Vamos
utilizar a conexão denominada MSSQL-
Connection (poderíamos adicionar uma
nova conexão clicando no botão “+”,
selecionando o driver MSSQL e dando
um nome para a mesma) e configurar
em Connection Settings os demais parâ-
metros:
HostName – Nome ou IP da máquina servidora
Database- NomedobancodedadosnoSQLServer
User_Name- Nome do usuário
Password - Senha
Para testar a conexão clique no botão
“Test Connection” (último da barra de fer-
ramentas com um ícone de engrenagem).
Afigura3mostraajanelapreenchida.
A conexão é aberta através da pro-
priedade Connected do componente
SQLConnection (as propriedades são
acessadas através do Object Inspector).
Podemos alterar esse valor em tempo de
design ou tempo de execução. Altere a
propriedadeLoginPromptparafalsepara
desabilitar a caixa de diálogo de login do
banco. Neste caso, o usuário e senha já
estãosendopassadosdiretamentepeloapli-
cativo.Observeasalteraçõesnafigura4.
Passo3 – Acessando os dados
Acessaremos a tabela Employees no
banco tomado como exemplo. Para isso,
insira um componente TSQLQuery, lo-
calizado também na paleta DBExpress.
Devemos conectar o SQLQuery ao
objeto SQLConnection. Selecione a pro-
priedade SQLConnection do SQLQuery
e aponte para SQLConnection1. Em
seguida definimos o código da consulta
SQL através da propriedade XXXX. Para
executar a consulta em tempo de proje-
to basta alterar a propriedade Active do
componente para true. Vide figura 5.
Passo4 – Manipulando os dados e exe-
cutando a aplicação
Para permitir que o usuário manipule
os dados selecionados, utilizaremos um
componente DbGrid. Este componente
está localizado na paleta Data Controls.
Uma vez adicionado ao formulário é ne-
cessário que esse componente acesse os
dados retornados pelo SQLQuery confi-
guradonopasso3.Paraisso,utilizaremos
três outros componentes: ClientDataSet,
DataSetProvider e DataSource que estão
localizados na palheta Data Access. Esses
componentes devem ser adicionados ao
formulário e configurados da seguinte
forma:
DataSetProvider - A propriedade DataSet
aponta para o SQLQuery configurado no passo 3.
ClientDataSet – A propriedade ProviderName
aponto para o objeto DataSetProvider.
DataSource – A propriedade DataSet aponta
para o ClientDataSet configurado no passo an-
terior.
Por fim, para que os dados sejam exi-
bidos no grid adicionado ao formulário,
devemos apontar a propriedade Data-
Source do grid para o objeto DataSour-
ce1, alterarando a propriedade Active do
ClientDataSet para true. Dessa forma os
dados serão exibidos no grid, estando
prontos para serem manipulados confor-
me mostra a figura 6.
O ClientDataSet e o DataSetProvider
fazem parte de uma implementação da
Borland denominada DataSnap (antigo
MIDAS) que disponibiliza para o desen-
volvedor o que chamamos de “DataSet
Desconectado”. A partir de um DataSet
Figura5. Configurando o SQLQuery Figura6. Projeto com DBExpress finalizado
Figura7. Componente ADOConnection
Conectando Front-Ends com Delphi,VB.Net e Java
SQL Magazine - 29
qualquer, que no exemplo foi o SQL-
Query, o DataSetProvider monta um
conjunto de dados e envia para o Clien-
tDataSet. Feito isso, o SQLQuery, que é
o DataSet de origem, não é mais utiliza-
do, bem como a conexão com o banco,
e os dados podem ser manipulados sem
sobrecarga da rede e conseqüente degra-
daçãodaperformancedaaplicação.Após
o término da manipulação dos dados, é
necessário a execução do método Ap-
plyUpdates do ClientDataSet, para que
sejam aplicados no banco. No exemplo,
o evento “OnClick” do botão “Aplica Al-
terações” deve ser implementado com o
seguinte código:
procedureTForm1.BitBtn1Click(Sender:TObject);
begin
ClientDataSet1.ApplyUpdates(0);
end;
O parâmetro do método indica o nú-
mero de erros que serão desconsidera-
dos antes de ser gerada uma exceção na
aplicação. Neste caso o parâmetro indica
que não podem ocorrer erros no proces-
samento.
Para cancelar as alterações efetuadas é
necessárioaexecuçãodométodoCance-
lUpdates.Nestecaso,oevento“OnClick”
do botão “Cancela Alterações” deve ser
implementado com o seguinte código:
procedureTForm1.BitBtn2Click(Sender:TObject);
begin
ClientDataSet1.CancelUpdates;
end;
Outra grande vantagem do Client
DataSet e do DataSetProvider é a facili-
dade que eles disponibilizam para que, se
for necessário, seja efetuada uma troca
do engine de acesso ao banco. O mesmo
programa feito com DBExpress será uti-
lizado para exemplificar o acesso a dados
utilizando ADO.
ACESSO AO SQL SERVER COM ADO
Passo 1 – Trocando o componente de
conexão com o banco de dados.
Em primero lugar os componentes
SQLConnection e SQLQuery devem ser
Figura8. Configurando ADOConnection
excluídos do formulário para que pos-
samos adicionar os componentes Ado-
Connection e AdoQuery localizados na
paleta ADO.
No ADO o componente responsável
pela conexão é o AdoConnection. Após
adicioná-lonoformuláriodevemoscon-
figurá-loatravésdoacessoaomenuEdit
ConnectionString, conforme mostra a
figura 7.
A tela exibida por esta opção permite
que utilizemos um Data Link File ou
uma Connection String (figura 8). Utili-
zaremos esta última de forma a mostrar
todooprocessodeconfiguraçãodacone-
xão. A vantagem de usar Data Link File
é que os parâmetros ficam armazenados
em um arquivo externo, possibilitando
alterações sem a necessidade de “recom-
pilação” do aplicativo.
ParamontaraConnectionStringacessa-
remos o assistente através do botão build
dacaixadediálogoexibida(figura8).
Em primeiro lugar devemos confi-
gurar o Provider que irá gerenciar a
conexão com o banco de dados. Esco-
lheremos o “Microsoft OLE DB Pro-
vider for SQL Server” (figura 9). Após
esta seleção devemos informar na pasta
Connection os parâmetros para que a
conexão seja efetuada. Indique o nome
do servidor de banco de dados em
“1. Select or enter a server name”, os
dados para login em “2. Enter the infor-
matino to log on to the server” e o banco
de dados a ser acessado em “3. Select the
database on the serever”. É importante
que a opção “Allow saving password”
esteja marcada para evitar erros na cone-
xão uma vez que os parâmetros de login
(usuário e senha) já estão definidos. En-
cerradasasconfiguraçõespodemostestar
a conexão através do botão “Test Connec-
tion” e em seguida encerrar o assistente
atravésdobotãook(videfigura10).
Passo 2 – Adicionando o componente
para acesso aos dados
NoADOocomponenteaserutilizado
para substituir o SQLQuery é o ADO-
Query que está na paleta ADO. Uma vez
adicionado ao formulário, altere a pro-
priedade Connection apotando-a para
o objeto AdoConnection1. Altere a pro-
priedade SQL de forma análoga ao passo
3 do exemplo com DbExpress.
Feito isso, basta alterar a propriedade
DataSet do DataSetProvider apontando
para o ADOQuery configurado anterior-
mente. Altere a propriedade Active doFigura9. Escolhendo o Provider Figura10. Montando o ConnectionString
SQL30 - Magazine
ClientDataSet para true e pronto! (Vide
figura 11).
Por que o VisualBasic.Net?
O Visual Basic agora faz parte de um
novo conjunto de ferramentas para de-
senvolvimentodeaplicações:aestratégia
.Net. O .Net é uma nova plataforma da
Microsoft, multi-linguagem, totalmente
formulada para lidar com XML e Web
Services e voltada para aplicações multi-
dispositivos. Nesta plataforma, o ADO
também ganhou uma nova implemen-
tação chamada ADO.Net e é este engine
que iremos focalizar.
O novo ADO.Net foi desenvolvido
para ser uma versão bem diferente das
anteriores, focando a completa compre-
ensão do XML, o uso de DataSets des-
conectados e uma implementação mais
leve para a Web.
Exemplo em Microsoft VisualStudio.
Net (utilizando VB.Net)
Inicie o VisualStudio.Net e clique no
menu File|New|Project. Na caixa de
diálogo, clique em Visual Basic Projects
eescolhaWindowsApplicationsnacaixa
Templates. Digite o nome do projeto e
clique em OK.
Após estes passos o VisualStudio.Net
irá preparar o ambiente para o desenvol-
vimento de um projeto Visual Basic.
No ADO.Net, assim como nas versões
anteriores do ADO, existe o objeto Con-
nection que permite a conexão com o
Banco de Dados. Esse objeto, atualmen-
te, não é um objeto único para qualquer
tipo de conexão como antes. Agora ele é
implementado em diversas classes que
utilizam a interface IdbConnection em
comum. Usaremos o SQLConnection,
um componente Connection implemen-
tado para se conectar ao MSSQL-Server
versão 7x e superiores, para acessar o
banco Northwind que acompanha o
MSSQL-Server 2000.
Na ToolBox no lado esquerdo da apli-
cação clique na guia “Data” e insira no
formulário um componente SQLCon-
nection. Na caixa Properties clique na
propriedade ConnectionString e selecio-
ne “New Connection...” (Figura4). Será
exibida a janela padrão de configuração
de ConnectionString do ADO. O exem-
plo no Delphi 7 utiliza a mesma janela e
explica como configurar a ConnectionS-
tring para acessar o banco Northwind
em detalhes.
Configurado o componente de cone-
xão é necessário informar de onde serão
requisitados os dados. Esta requisição é
feita por um objeto Command. Porém,
assim como o objeto Connection, o
Command possui diversas versões que
variam de Provider para Provider. Por
exemplo, para acessar o SQL-Server, o
ADO.Net possui um Provider específi-
co que, para ser utilizado, precisa de um
SQLConnection pertencente ao names-
pace System.Data.SqlClient (implemen-
tação que aproveita recursos específicos
do MS-SQL) e para se executar uma
consulta no Banco deve-se utilizar um
objeto SQLCommand, ou mesmo um
SQLDataAdapter, também do mesmo
namespace (ou seja, também especifico
para o MS-SQL). O que implica que é ne-
cessário importar este namespace com o
comando “Imports”.
Na guia Data da ToolBox clique no
componente SQLDataAdapter e insira-o
no formulário. Automaticamente o Visual
Studioiráapresentaro“DataAdapterCon-
figuration Wizard”, que permite configu-Figura11. Projeto com ADO finalizado
Figura12. Caixa de Diálogo de escolha do projeto noVisualStudio.NET Figura13. SQLConnectionWizard
Conectando Front-Ends com Delphi,VB.Net e Java
SQL Magazine - 31
rar de forma simples o SQLDataAdapter.
Este componente tem como função facili-
tarogerenciamentodasrequisiçõescomo
Servidor em relação ao DataSet (conjunto
de registros), armazenando consultas SQL
através das propriedades: DeleteCom-
mand, InsertCommand, SelectCommand
e UpdateCommand que permitem ao
desenvolvedor especificar comandos SQL
para controlar de forma otimizada e pa-
dronizada pelo ADO.Net os conjuntos de
registrosarmazenadosnoServidor.
Utilizando o Wizard é possível confi-
gurar uma consulta simples e entender
como se utiliza o SQLDataAdapter no
VisualStudio.Net.Naprimeiratelaclique
no botão “Next”, onde será exibido o
passo: “Choose Your Data Connection”.
Estatelapermiteconfigurarqueconexão
irá requisitar os dados. Na caixa Combo
pode-se especificar a conexão que já foi
criada pelo componente SQLConnec-
tion inserido anteriormente. Após clique
no botão “Next”. Em “Choose a Query
Type” especificamos como os dados se-
rão requisitados. Abaixo, segue uma pe-
quena descrição de cada opção:
- Use SQL statements: Permite especi-
ficar uma Query SQL que faça o retorno
dos dados. O próprio Wizard irá gerar os
comandos Delete, Update e Insert basea-
dos nesta Query.
- Create New Stored Procedures: Per-
mite criar novos procedimentos armaze-
nadosapartirdeumaQuerySQLparaos
comandos Insert, Update e Delete.
- Use Existing Stored Procedures: Per-
mite especificar quais serão os procedi-
mentos armazenados que farão os co-
mandos: Select, Insert, Update e Delete
do conjunto de registros específicos para
cada situação.
Será utilizada a opção “Use SQL state-
ments”eaconfiguraçãodaQuerycomo
comando SQL abaixo:
SELECT orderid, customerid, orderdate,
shippeddate, shipname, shipregion, shipcountry
FROM Orders
Conforme visto no exemplo acima,
será requisitado ao banco de dados ape-
nas alguns campos da tabela de pedidos.
Este comando SELECT será inserido na
propriedade SelectCommand do SQL-
DataAdapter.
Clique em “Next”. Serão gerados no
Wizard os comandos SQL de acordo
com o SELECT para configurar o com-
ponente automaticamente. Para finali-
zar, clique no botão “Finish”.
Pronto! Foi criado um componente
SQLDataAdapter que permite fazer con-
sultas e, ainda dentro do padrão ADO.
Net, modificar os dados selecionado,
através da SQL gerada pelo Wizard.
Os controles Data-Aware do .Net para
exibir dados necessitam que estes sejam
recebidos de um DataSet. Para gerar um
DataSet, clique com o botão direito na
figura do SQLDataAdapter no Form De-
signer e selecione “Generate DataSet”.
Será visualizada uma caixa de diálogo
onde, pressionando-se o botão “OK”, irá
aparecer o componente DataSet.
Em seguida insira um controle Data-
Grid.LinkeapropriedadeDataSourceao
DataSet recém-gerado e DataMember a
tabela Orders, visualizando os dados no
grid da mesma forma que no Delphi.
Por que o Java?
O Java tem demonstrado seu poder
com relação ao mundo multi-platafor-
ma. Cada vez mais conhecido no Brasil,
muito se tem produzido com Java. Um
ponto forte do Java é o fato de grandes
empresas estarem investindo nele, como
as gigantes Oracle e IBM. Uma das formas
deconexãodeumaaplicaçãoJavacomum
bancodedadoséatravésdaAPIJDBC.
O JDBC, Java Database Connectivi-
ty, é uma API Java para conexão com
SGDB´s diversos e execução de expres-
sões SQL. Sendo mais específico, JDBC
é um conjunto de classes e interfaces que
permitem acesso a bases de dados rela-
cionaisdemaneirauniforme,numasolu-
ção similar ao ODBC. Existem inúmeras
implementações de drivers de bancos de
dados compatíveis com JDBC que se en-
quadram em quatro categorias de solu-
ções, definidas pela JavaSoft:
Tipo 1 – Ponte JDBC / ODBC
A ponte JDBC / ODBC foi desenvol-
vida em conjunto pela JavaSoft e a In-
tersolv, de modo a aproveitar a grande
quantidade de drivers ODBC que já exis-
tem instalados nas máquinas. Aplicação
Java faz uma chamada ao JDBC que por
sua vez faz essa chamada ao ODBC e
este à API de acesso nativa do banco.
Tipo 2 – Driver Java Parcial
+ API Nativa
Nesta solução o driver ODBC é
eliminado e o driver JDBC conver-
te as chamadas JDBC em chama-
das diretas à API nativa do banco.
Assim como os drivers do Tipo 1
é necessária a instalação de “apli-
cações cliente” do banco de dados
na máquina onde está sendo exe-
cutado o aplicativo.
Tipo 3 – Driver 100% Java +
Protocolo de Rede (arquitetu-
ra em 3 camadas)
NestaconfiguraçãoodriverJDBCcon-
verteaschamadasJDBCemumprotoco-
lo de rede independente (independente
do banco de dados). Estas chamadas são
convertidas, então, em chamadas à API
nativa do banco por um servidor inter-
mediário (middleware). Essa arquitetura
na verdade consiste de três camadas.
Tipo 4 – Driver 100% Java:
Nestasoluçãoodriverconverteascha-
madasJDBCdiretamenteparaoprotoco-
lo de rede utilizado pelo banco de dados.
Escritos somente em Java, estes drivers
não necessitam de ODBC nem de API
nativa, gerando um enorme ganho de
desempenho e permitindo o desenvolvi-
mento de aplicações 100% Java.
Exemplo em Java
Utilizaremos para acessar o mesmo
banco de dados dos exemplos em Delphi
e VB .Net (NorthWind do SQL Server)
um Driver JDBC do tipo 4 denominado
Microsoft SQL Server 2000 JDBC Dri-
ver, que pode ser baixado no em http://
msdn.microsoft.com/downloads/de-
fault.asp?URL=/downloads/sample.
asp?url=/MSDN-FILES/027/001/779/
msdncompositedoc.xml.
Para exemplificar a conexão em Java,
utilizaremos um “console application”
onde será mostrado além da conexão a
execução de um comando SELECT e o
display dos dados retornados na tela. As
classes utilizadas e os procedimentos se-
rão explicados em seguida. Vale a pena
ressaltar que este exemplo mostra uma
das formas de acesso e manipulação de
dados em Java (listagem1.).
NOTA
Nesta parte doWizard pode-se utilizar
o Query Builder doVisualStudio.Net,
uma ferramenta muito interessante
para desenvolver consultas SQL.
SQL32 - Magazine
Inicialmente é declarado um objeto
queirárepresentaraconexãocomoban-
co de dados, neste exemplo chamado de
conn, do tipo Connection. Voltaremos a
falar nele adiante. Em seguida é executa-
da a seguinte chamada:
DriverManager.registerDriver(
new com.microsoft.jdbc.sqlserver.
SQLServerDriver());
O DriverManager é uma classe que
gerencia os drivers registrados no JDBC.
Este registro é feito através da chamada
ao método estático registerDriver. A
partir desse momento, a instância do dri-
ver passado como parâmetro passa a ser
mantida pelo DriverManager e o driver
fica disponível para utilização pela aplica-
ção Java.
A próxima linha abre uma co-
nexão com o banco de dados, que é atri-
buída para o objeto conn para ser mani-
pulada pela aplicação.
conn = DriverManager.getConnection
(“jdbc:microsoft:sqlserver:”+
“//servidor:1433;DatabaseName=NorthWind;
Selectmethod=cursor”, “usuario”, “senha”);
O método estático getConnection tem
como parâmetro um String de Conexão,
um String que representa o nome do
usuário e um último que representa a se-
nha do mesmo. O DriverManager verifi-
ca se o driver passado na primeira parte
de String de Conexão está registrado no
JDBC (como descrito anteriormente).
Caso o driver esteja registrado é solicita-
da a conexão de acordo com os parâme-
tros passados na segunda parte do String
de Conexão (onde temos o nome do
servidor, a porta do listner, o nome do
banco a ser acessado e o tipo de seleção)
além do usuário e senha. Caso a conexão
seja efetuada com sucesso, o objeto conn
passa a “apontar” para a mesma.
As linhas que seguem enviam o co-
mando SQL para o Servidor de Banco de
dados para que o mesmo seja compilado
noservidorefiqueprontoparaexecução.
Este procedimento é executado através
do método prepareStatement do objeto
conn (instanciado pelo método getCon-
nection visto anteriormente). Este mé-
todo, se executado com sucesso, retorna
um PreparedStatement que é a instância
do comando “preparado” no Servidor e,
no nosso exemplo, é manipulado pelo
objeto pstmt.
PreparedStatement pstmt = conn.
prepareStatement(“SELECT * FROM EMPLOYESS”);
Paraacessarmososdadosdocomando
SQL preparado anteriormente é preciso
que tenhamos um objeto do tipo Result-
Set que é instânciado a partir do método
ExecuteQuery() do PreparedStatement,
como mostrado a seguir.
ResultSet rs = pstmt.executeQuery();
Os procedimentos seguintes executam
um “loop” nos dados resultantes do co-
mando SQL contidos no ResultSet rs lis-
tando na tela os valores das colunas Em-
ployeeID, LastName e FirstName.
while ( rs.next() ) {
System.out.println(rs.getInt(“EmployeeID”)+“-“+
rs.getString(“LastName”) +“,”+
rs.getString(“FirstName”) );
}
Por fim, fechamos o PreparedState-
ment pstmt e o Connection Conn libe-
rando com isso recursos do banco de
dados e finalizando a aplicação se forma
adequada.
É interessante notar que todos os pro-
cedimentos referentes a conexão, a exe-
cução de comandos e manipulação de
dados estão contidas num bloco protegi-
do(try...catch)poistodososmétodosuti-
lizadospropagamSQLException,quere-
presentaumaexceçãoreferenteaoacesso
ou manipulação de um banco de dados,
Listagem1
import java.sql.*;
public class Principal {
public static void main (String[] args) {
Connection conn = null;
try {
DriverManager.registerDriver (
new com.microsoft.jdbc.sqlserver.SQLServerDriver());
conn = DriverManager.getConnection
(“jdbc:microsoft:sqlserver:”+
“//servidor:1433;DatabaseName=NorthWind;Selectmethod=cursor”,
“usuario”,
“senha”);
}
catch (SQLException e) {
System.out.println (‘n’+“Erro na conexão com o banco.”);
e.printStackTrace();
System.exit(1);
}
try {
PreparedStatement pstmt =
conn.prepareStatement(“SELECT * FROM EMPLOYESS”);
ResultSet rs = pstmt.executeQuery();
while ( rs.next() ) {
System.out.println(rs.getInt(“EmployeeID”) +“ -“ +
rs.getString(“LastName”) +“,”+
rs.getString(“FirstName”) );
}
pstmt.close();
conn.close();
}
catch (SQLException e) {
System.out.println (‘n’+“Erro ao recuperar dados no banco.”);
e.printStackTrace();
System.exit(1);
}
}
}
Conectando Front-Ends com Delphi,VB.Net e Java
SQL Magazine - 33
devendo ser tratada pela aplicação.
Conclusão
Nosso objetivo foi mostrar os procedi-
mentos a serem efetuados em cada uma
das ferramentas analisadas para conexão
e manipulação de dados de um banco no
SQL Server, deixando alguns conceitos
de forma a facilitar ao analista a definição
sobre qual ferramenta usar para cada so-
lução a ser implementada.
De fato, não será somente a escolha da
ferramenta de desenvolvimento que irá
definir a melhor forma de implementar
um projeto com sucesso. O analista que
tiverumdomíniocompletodoproblema
proposto pelo cliente (além de conheci-
mento e experiência em cada ferramen-
ta) terá mais facilidade de escolher qual
tecnologia se tornará mais eficiente para
resolver o problema em questão.
ANUNCIO
Sql01 final
Sql01 final
Sql01 final
Sql01 final
Sql01 final
Sql01 final
Sql01 final
Sql01 final
Sql01 final
Sql01 final
Sql01 final
Sql01 final
Sql01 final
Sql01 final
Sql01 final
Sql01 final
Sql01 final

Mais conteúdo relacionado

Mais procurados

Enterprise services com .net
Enterprise services com .netEnterprise services com .net
Enterprise services com .net
Fernando Palma
 
Es17 predicao de defeitos em software
Es17   predicao de defeitos em softwareEs17   predicao de defeitos em software
Es17 predicao de defeitos em software
Victor Hugo
 
Powerlogic java ee open-source
Powerlogic   java ee open-sourcePowerlogic   java ee open-source
Powerlogic java ee open-source
Juarez Junior
 

Mais procurados (20)

Enterprise services com .net
Enterprise services com .netEnterprise services com .net
Enterprise services com .net
 
Cs 2
Cs 2Cs 2
Cs 2
 
Engenharia de Software - Pontos de função
Engenharia de Software - Pontos de funçãoEngenharia de Software - Pontos de função
Engenharia de Software - Pontos de função
 
Es 09
Es 09Es 09
Es 09
 
Es06 teste de software
Es06   teste de softwareEs06   teste de software
Es06 teste de software
 
Es17 predicao de defeitos em software
Es17   predicao de defeitos em softwareEs17   predicao de defeitos em software
Es17 predicao de defeitos em software
 
Engenharia de Software
Engenharia de SoftwareEngenharia de Software
Engenharia de Software
 
Arquitetura de Software EXPLICADA
Arquitetura de Software EXPLICADAArquitetura de Software EXPLICADA
Arquitetura de Software EXPLICADA
 
Powerlogic java ee open-source
Powerlogic   java ee open-sourcePowerlogic   java ee open-source
Powerlogic java ee open-source
 
Revista Engenharia de Software n° 44
Revista Engenharia de Software n° 44Revista Engenharia de Software n° 44
Revista Engenharia de Software n° 44
 
Principio de sistemas de informaçao
Principio de sistemas de informaçaoPrincipio de sistemas de informaçao
Principio de sistemas de informaçao
 
Portais Corporativos e Gestao de Conteudo
Portais Corporativos e Gestao de ConteudoPortais Corporativos e Gestao de Conteudo
Portais Corporativos e Gestao de Conteudo
 
Trabalho 4 Semestre e 5 Semestre 2015
Trabalho 4 Semestre e 5 Semestre 2015Trabalho 4 Semestre e 5 Semestre 2015
Trabalho 4 Semestre e 5 Semestre 2015
 
Documento de requisitos
Documento de requisitosDocumento de requisitos
Documento de requisitos
 
Tutorial struts
Tutorial strutsTutorial struts
Tutorial struts
 
O (papel do) Arquiteto de Software
O (papel do) Arquiteto de SoftwareO (papel do) Arquiteto de Software
O (papel do) Arquiteto de Software
 
Merlinferramentassbc2006 Revisado Em6paginas
Merlinferramentassbc2006 Revisado Em6paginasMerlinferramentassbc2006 Revisado Em6paginas
Merlinferramentassbc2006 Revisado Em6paginas
 
Aula2 caracteristicas da_tecnologia_de_banco_de_dados
Aula2 caracteristicas da_tecnologia_de_banco_de_dadosAula2 caracteristicas da_tecnologia_de_banco_de_dados
Aula2 caracteristicas da_tecnologia_de_banco_de_dados
 
Apresentação JAGUAR Software Público
Apresentação JAGUAR Software PúblicoApresentação JAGUAR Software Público
Apresentação JAGUAR Software Público
 
jCompany for SAP NetWeaver
jCompany for SAP NetWeaverjCompany for SAP NetWeaver
jCompany for SAP NetWeaver
 

Semelhante a Sql01 final

Pre proposta trabalho final
Pre proposta trabalho finalPre proposta trabalho final
Pre proposta trabalho final
Sergio Chaves
 
Mercado de trabalho
Mercado de trabalhoMercado de trabalho
Mercado de trabalho
mentrixmax
 
CURSO DELPHI FUND. CLIENT SERVER (DIURNO)
CURSO DELPHI FUND. CLIENT SERVER (DIURNO) CURSO DELPHI FUND. CLIENT SERVER (DIURNO)
CURSO DELPHI FUND. CLIENT SERVER (DIURNO)
Grupo Treinar
 

Semelhante a Sql01 final (20)

Trabalho de sgbd
Trabalho de sgbdTrabalho de sgbd
Trabalho de sgbd
 
Cursos
CursosCursos
Cursos
 
Treinamento ASP.NET 2014
Treinamento ASP.NET 2014Treinamento ASP.NET 2014
Treinamento ASP.NET 2014
 
Teoria de Sistemas de Informação - Atividade: Tecnologia e SI
Teoria de Sistemas de Informação - Atividade: Tecnologia e SITeoria de Sistemas de Informação - Atividade: Tecnologia e SI
Teoria de Sistemas de Informação - Atividade: Tecnologia e SI
 
Revista programar 12
Revista programar 12Revista programar 12
Revista programar 12
 
DDD e Microsservicos - do negócio à arquitetura
DDD e Microsservicos - do negócio à arquiteturaDDD e Microsservicos - do negócio à arquitetura
DDD e Microsservicos - do negócio à arquitetura
 
Pre proposta trabalho final
Pre proposta trabalho finalPre proposta trabalho final
Pre proposta trabalho final
 
Agenda final 13a. conferencia anual do CMG Brasil
Agenda final 13a. conferencia anual do CMG BrasilAgenda final 13a. conferencia anual do CMG Brasil
Agenda final 13a. conferencia anual do CMG Brasil
 
Princípios de Sistemas de Informação Unidade II Unip
 Princípios de Sistemas de Informação Unidade II Unip  Princípios de Sistemas de Informação Unidade II Unip
Princípios de Sistemas de Informação Unidade II Unip
 
Novidades no Windows Mobile Line of Business Solution Accelerator 2008
Novidades no Windows Mobile Line of Business Solution Accelerator 2008Novidades no Windows Mobile Line of Business Solution Accelerator 2008
Novidades no Windows Mobile Line of Business Solution Accelerator 2008
 
Introdução a arquitetura de sistemas com .NET
Introdução a arquitetura de sistemas com .NETIntrodução a arquitetura de sistemas com .NET
Introdução a arquitetura de sistemas com .NET
 
Modelos de Banco de dados e SGBDS
Modelos de Banco de dados e SGBDSModelos de Banco de dados e SGBDS
Modelos de Banco de dados e SGBDS
 
Dfd
DfdDfd
Dfd
 
Agenda Versão Final - CMG 14a. conferencia nacional
Agenda Versão Final - CMG 14a. conferencia nacionalAgenda Versão Final - CMG 14a. conferencia nacional
Agenda Versão Final - CMG 14a. conferencia nacional
 
Mercado de trabalho
Mercado de trabalhoMercado de trabalho
Mercado de trabalho
 
Estrategia. windows 7
Estrategia. windows 7Estrategia. windows 7
Estrategia. windows 7
 
.NET Micro Framework
.NET Micro Framework.NET Micro Framework
.NET Micro Framework
 
Cenário das Plataformas de Dados 2017/2018
Cenário das Plataformas de Dados 2017/2018Cenário das Plataformas de Dados 2017/2018
Cenário das Plataformas de Dados 2017/2018
 
CURSO DELPHI FUND. CLIENT SERVER (DIURNO)
CURSO DELPHI FUND. CLIENT SERVER (DIURNO) CURSO DELPHI FUND. CLIENT SERVER (DIURNO)
CURSO DELPHI FUND. CLIENT SERVER (DIURNO)
 
Criando Aplicações .NET com o TheWebMind
Criando Aplicações .NET com o TheWebMindCriando Aplicações .NET com o TheWebMind
Criando Aplicações .NET com o TheWebMind
 

Sql01 final

  • 1.
  • 3. SQL Magazine - 3 Índice 06 SQL News Novas tecnologias, atualizações, lançamentos de produtos,eventos e livros. 12 Otimização de comandos SQL Conceitos e diretrizes para aumento da perfor- mance na execução de comandos SQL. 22 Introdução a UML Definição, implementação e utilizção de um modelo usando UML 34 Emacs SQL Utilizando o Emacs para acesso e manutenção de bancos de dados. 42 PostgreSQL Uma análise dos recursos do postgre e vantagens de sua distribuição nacional. 48 JDataStore Conhecendo o banco de dados e uma entrevista com Sergio Cardoso. 08 Guia Rápido da SQL Explorando os princupais recursos do comando SELECT. 18 Modelagem de dados com ErWin Uma introdução aos recursos e utilização desta ferramenta. 26 Conctando Front-Ends Exemplos práticos para o acesso a banco de dados com diversas ferramentas. 39 MySQL Instalação, overview dos recursos e utlilização do MySQL no linux. 44 Replicação de dados Teoria e prática envolvendo replicação de dados no SQL Server.
  • 4. SQL4 - Magazine E D I T O R I A L Coordenador Editorial Gladstone Matos gladstone@neoficio.com.br Editor Geral Gustavo Viegas gustavo@sqlmagazine.com.br Equipe Editorial Cristina Viegas Edgar Silva Fábio Faldini Gisele Nichols Pedro Henrique dos Santos Acessora de Imprensa Kaline Dolabela kalined@hotmail.com Contribuíram nesta edição Clementino Leal, Cleison Santos, Everson Ramos, Edgar Silva, Fábio Faldini,GustavoViegas,GiseleNichols, GladstoneMatos,PauloRibeiro,Pedro Henrique Editor de Arte Vinicius O. Andrade viniciusoandrade@gmail.com Capa Mauro Lassance mauro@bitourisn.com Gerente Geral Rosângela Matos rosangela@neoficio.com.br Publicidade Julio César Lopes julio@neoficio.com.br Jornalista Resposável Sérgio Moraes C. Brandão MTb: 15183-68-148 Impressão Ediouro Gráfica e Editora S/A Atendimento ao Leitor info@sqlmagazine.com.br Assinaturas assinaturas@sqlmagazine.com.br Colaboração de Artigos gustavo@sqlmagazine.com.br Na Web www.sqlmagazine.com.br Distribuição Fernando Chinaglia Dist. S/A Rua Teodoro da Silva, 907 Grajaú - RJ - CEP: 206563-900 Atualmente, na medida em que as tecnologias de banco de dados e ferramentas para desenvolvimento de aplicações vem evoluindo, temos um abismo cada vez maior entre o profissional de informática e as áreas de conhecimento fora de sua especialização. Questiono: Até onde deve ir o conhecimento do profissional de tecnologia da informação? Será que a especialização total é o melhor caminho? Seja técnico, desenvolvedor ou analista, a questão é quanto de sua área ele precisa saber para implementar, analisar, projetar e interagir num processo de desenvolvimento emanutençãodeumaaplicação?Seráquepodemosafirmarqueumdesenvolvedor deve ter somente conhecimentos profundos de uma determinada ferramenta de desenvolvimento e, no caso de uma aplicação que acesse um banco de dados, não teramínimanoçãodestebanco?Ouainda:umDBAquetemaresponsabilidadede instalar, configurar, dimensionar, criar os objetos de um modelo, garantir uma boa performance, entre outras, não faria suas tarefas de modo mais consciente sabendo umpoucosobrecomoosdadosserãoacessadosemanipulados?Podemoscitarainda aqueles que participam das definições de um projeto, lá no estágio embrionário do sistema. Para estes, o conhecimento do banco de dados, das tecnologias e ferramentas utilizadas para desenvolvimento, afetariam na definição do projeto a ponto de facilitar sua implementação e futura manutenção? Como disse, o abismo que separa o conhecimento entre cada profissional de informática tem se mostrado crescente, e isso, de certa forma, não é bom. ASQLMagazinechegaatévocêcomoobjetivodetrazerinformaçõessobre o “mundo” dos bancos de dados, tecnologias e ferramentas de desenvolvimento. Temos uma árdua tarefa diante dos leitores: diminuir o abismo citado, através da publicação de artigos de “base”, fomentando o conhecimento daqueles que ainda não lidam com o assunto, artigos técnicos, para os que já utilizam algum tipo de SGBD e artigos avançados, voltados para DBA´s. Além de novidades, previews, cursos e dicas. Espero que você encontre na SQL Magazine informações para o seu crescimento profissional, tomada de decisão, auxílio na solução de problemas, base paradefiniçãodeprojetosindependentedoseupapelnosmesmoseacimadetudo: uma fonte de consultas e mais consultas. Boa leitura. Gustavo Viegas Editor Gustavo@sqlmagazine.com.br
  • 5. SQL Magazine - 5 ANUNCIO
  • 6. SQLNews Usando UML Com .NET Através do Rational XDE ( eXtended Development Environment ) Professional v2002 você pode ter na IDE do Visual Studio o ambiente nescessário para analisar, implementar e documentar suas soluções baseadas no .Net FrameWork utilizando UML. Esta integração é extremamente útil para implementação de sistemas complexo utilizando C#. O XDE suporta os principais diagramas UML, possibilita a utilização de vários Design Patterns além de facilitar a implementação de Design Patterns próprios. Consulte www.rational.com <http://www. rational.com> para um overview do produto. Application Server da Oracle oferece business intelligence incorporado Integrado ao servidor de aplicação, o Oracle9i Application Server proporciona todo o middlewarenecessárioparaumaeficientecomunicaçãodedadoseme-business.Comumúnico produto é possível executar diversas aplicações (Java, portal, integração de aplicativos, wireless e outras). Foram efetuadas customizações que otimizam o processo de configuração de backup e recovery, gerenciamento automático de backups e logs arquivados, backups e restaurações reiniciáveiserestauração/recuperaçãodeteste.OSQLeoPL/SQLreceberamoutrasmelhorias noOracle9iAS.Foiadicionadadepuraçãonoladoservidorparamúltiplaslinguagens,permitindo que os ambientes de desenvolvimento integrado (IDEs) depurem tanto Java quanto PL/SQL dentro da mesma estrutura. Mais informações em www.oracle.com.br. Cresce a competição entre os bancos de dados da IBM, Microsoft, e Oracle EnquantoaMicrosoftfaladefuturasimplementaçõesnoSQLServer,aBigBluedisponibilizaa versãoDB28.1UDB.Nestaúltimaversão,aIBMestátentandotornaroseubancodedadosmais fácildeserutilizado,distribuído,eadministrado.Implementaçõesqueaumentamaperformance na execução de queryes e capacidades autônomas estão entre as novidades do DB2 8.1. AMicrosoftanunciouaversão64-bitdoSQLServer(Beta)eesperaconquistarmaiorconfiança dos usuários de banco de dados. AOracle,porsuavez,utilizouaOracleWorldUserConferenceemSanFranciscoparamostrar detalhes do seu novo banco de dados, chamado até então de 10i e previsto para lançamento em meadosde2003.Apesardonomefinaldoprodutonãoestardefinido,aOraclefalouoficialmente queanovaversãoteráseufoconogerenciamento,aumentodacapacidade,enovosuportepara XML e Web services. Computador que se conserta sozinho A IBM está desenvolvendo sistemas que se consertam sozinhos e necessitam de menos intervenção humana. Para isso, criou a divisão Autonomic Computing, cuja meta é fazer com que os computadores sejam autônomos de maneirasemelhanteaocomportamento do sistema nervoso humano, que permite adaptar-se às mudanças à sua volta, a defender-se de ataques externos e a recuperar-se de falhas internas. As capacidadesautônomasestarãoincluídas inclusive no banco de dados DB2. A idéia é permitir que os computadores dêem conselhos sobre seu melhor rendimento e, então, permitir que esses sistemas executem os conselhos sem o aval dos técnicos. Oracle9i nas eleições Mais de 185 milhões de votos foram processadosnoprimeiroesegundoturnosdas eleições pelo Tribunal Superior Eleitoral. Em menos de 24 horas, os brasileiros já sabiam o resultado dos 91 milhões de votos apurados na primeira fase. Para realizar tal feito, o TSE utilizou o banco de dados Oracle9i. O sistema, desenvolvido em parceria do TSE com a Oracle, é o mais avançado no segmento. Os dados de todos os Tribunais Regionais Eleitorais, correspondentes aos votos para deputados estaduais e federais, senadores e governadores, são totalizados e somados aos do TSE, que é responsável pela centralização e contagem dos votos para presidente da República. Esse processo permitiuadivulgaçãoimediatadosresultados nos telões de apuração e na Internet.
  • 7. SQL Magazine - 7 IBM DB2 UDB 8.1 para Linux (Beta) A IBM se orgulha do seu compromentimento com o Linux. Desde o seu portal Linuxatéacampanha‘Paz,Amor,eLinux’quefoi“grafitada”nasruasdecidades americanas no ano passado, a companhia tem deixado claro que pretende ser vista na linha de frente do desenvolvimento para este sistema. A versão 8.1 (Beta) do DB2 UDB esta disponível para download no site da “Big Blue” (www.ibm. com/db2/) e a IBM recomenda no mínimo 128Mb de memória e de 250Mb a 350Mb disponíveis em disco para instalação e utilização de um banco de dados de tamanho médio. Uma novidade está no db2setup utility, um utilitário com aparência e operação semelhante a de muitos programas para Windows. Informações adicionais e uma análise do produto estão disponíveis no endereço http://www.newarchitectmag.com/documents/s=7733/na1202m/index.html. Microsoft SQL Server comemora seu 10 º Aniversário A Microsoft Corp. anunciou no dia 20 de novembro o 10º aniversário do Microsoft(R) SQL Server (TM) na Associação de Profissionais de SQL Server (PASS) em Seattle, num grande evento exclusivamente dedicado ao banco. No keynote de abertura, Gordon Mangione, vice presidente corporativo do SQL ServernaMicrosoft,faloudopassadoedasfuturasimplementaçõesnoSQLServer como motivos para os muitos clientes e parceiros continuarem a desenvolver utilizando a plataforma Microsoft SQL Server. Com base nas inovações do produto, Mangione anunciou a disponibilização do SQL Server 2000 (64-bit) Beta 2 e do Microsoft SQL Server 2000 Service Pack 3 (SP3) Beta 1. Ele encorajou aos desenvolvedores a utilizarem ambas as versões Beta disponíveis e reforçou o objetivo da Microsoft de desenvolver um conjunto de ferramentas que garantam um alto nível de performance, gerenciamento e escalabilidade. Backups seguros e contínuos A Storageteck, fornecedora de soluções de armazenamento de dados, está colocandonomercadoasfitotecasrobotizadasL20,L40eL80,quepermitemqueos backupssejamfeitoscontinuamente,24horaspordia.Oprodutofoidesenvolvido para pequenas e médias empresas cujas plataformas rodam em ambientes NT, Novell, Linux ou Unix. Focados no mercado entry level, as bibliotecas de backup destinam-se a redes com necessidades de armazenamento a partir de 400 GB. Na prática, os produtos da Série L são disponíveis nas versões 2, 4 ou 8 drives, com capacidades de 110 GB a 220 GB cada. Oracle 9i - O Manual do DBA Autor: Kevin Loney Editora Campus - 992 páginas. R$ 159 Pertencente à série Oracle Press, cujos livros são guias oficiais da Oracle produzidosporespecialistasdaprópriaempresa,estelivroofereceumacobertura completa dos recursos mais recentes e as maneiras de incorporar esses recursos no gerenciamento de um banco de dados Oracle. Com este livro, o leitor aprenderá a implementar as soluções administrativas de especialistas, a manter os seus importantes sistemas da Internet e de comércio eletrônico flexíveis, seguros e disponíveis - tudo com informações exclusivas autorizadas pela Oracle. Este guia abrange todos os pontos importantes sobre Oracle 9i, fornecendo exemplos e técnicas reais. Alguns tópicos: ANUNCIO
  • 8. SQL Guia rápido da por Gladstone Matos linguagem SQL é sucinta e ao mesmo tempo poderosa. Através de um idioma de fácil entendimento, a SQL permitiu a padronização na forma de comunicar os aplicativos front-ends com os diversos bancos de dados disponíveis. Neste artigo veremos os principais parâmetros do comando SELECT, a principal forma de recuperar dados através da SQL. A COMANDO SELECT A SQL foi criada com o objetivo de padronizar os comandos de manipulação de dados em SGBD’s. Hoje em dia, apesar da linguagem possuir uma quantidade consideráveldeextensõeseimplementações proprietárias, pode-se afirmar que a meta foi alcançada. A maior parte do código SQL escrito nas aplicações se encontra no formato“puro”,conhecidocomoANSI.O sucesso da SQL trouxe uma produtividade interessante para a manipulação de banco de dados. Conhecendo bem a linguagem é possível acessar os recursos básicos de qualquer banco relacional, como Oracle, SQL Server ou MySQL, sem praticamente nenhuma mudança. Veremos neste artigo um pequeno guia de referência para os parâmetros do comando SELECT, um dos mais importantes da linguagem SQL. SELECT Simples O comando SELECT permite recuperar osdadosdeumobjetodobanco,comouma tabela, uma view e, em alguns casos, uma stored procedure (alguns bancos de dados permitem a criação de procedimentos que retornam valor). A sintaxe mais básica do comando é: SELECT <LISTA_DE_CAMPOS> FROM <NOME_DA_TABELA> Exemplo: SELECT CODIGO, NOME FROM CLIENTES; SELECT * FROM CLIENTES; Ocaracter“*”representatodososcampos. Apesar de prática, esta máscara não é muito utilizada, pois, para o SGBD, é mais rápido receber o comando com todos os campos explicitados. O uso do * obriga o servidor a consultar quais são os campos antes de efetuar a busca dos dados, criando mais um “passo”noprocesso. COMANDO WHERE A cláusula Where permite ao comando SQL passar condições de filtragem, Veja o exemplo: SELECT CODIGO, NOME FROM CLIENTES WHERE CODIGO = 10; SELECT CODIGO, NOME FROM CLIENTES WHERE UF = ‘RJ’ SELECT CODIGO, NOME FROM CLIENTES WHERE CODIGO >= 100 AND CODIGO <=500; SELECT CODIGO, NOME FROM CLIENTES WHERE UF=’MG’ OR UF = ‘SP’
  • 9. Guia Rápido da SQL SQL Magazine - 9 Osparênteses,corretamenteutilizados, dão mais poder a consulta: SELECT CODIGO, NOME FROM CLIENTES WHERE UF = ‘RJ’ OR (UF=’SP’ AND ATIVO=’N’); Neste comando, todos os clientes do Rio de Janeiro e apenas os clientes inativos de São Paulo seriam capturados. SELECT CODIGO, NOME FROM CLIENTES WHERE (ENDERECO IS NULL) OR (CIDADE IS NULL) Aquitodososclientesquenãopossuem endereco ou cidade cadastrados serão selecionados. FILTRO DE TEXTO SELECT CODIGO, NOME FROM FUNCIONARIO WHERE DEPARTAMENTO=’VENDAS’; SELECT CODIGO FROM CLIENTES WHERE NOME > “K”; Parabuscaparcialdestrings,oSELECT fornece o operador LIKE: SELECT CODIGO, NOME FROM CLIENTES WHERE NOME LIKE “MARIA*”; Neste comando, todos os clientes cujo nome iniciam com Maria serão retornados. Se quisermos retornar os nomes que contenham “MARIA” também no meio, podemos alterar para: SELECT CODIGO, NOME FROM CLIENTES WHERE NOME LIKE “*MARIA*” O uso da máscara no início e no fim da stringfornecemaiorpoderdebusca,mas causaconsiderávelperdadeperformance. Este recurso deve ser utilizado com critério. Nota: Em alguns bancos de dados a máscara de fitro não é representada pelo caracter“*”.Consulteareferênciadobanco utilizadoparaverificarocaractercorreto. Por padrão, a SQL diferencia caixa baixa de caixa alta. Para eliminar essa diferença, utilize a função UPPER: SELECT CODIGO, NOME FROM CLIENTES WHERE UPPER(NOME) LIKE “MARIA*SILVA*” ORDENAÇÃO A ordenação pode ser definida com o comando ORDER BY. Assim como no comando WHERE, o campo de ordenaçãonãoprecisaestarlistadocomo campo de visualização: SELECT CODIGO, NOME FROM CLIENTES ORDER BY NOME SELECT CODIGO, NOME FROM CLIENTES ORDER BY UF, NOME A inclusão da palavra DESC garante a ordenação invertida: SELECT CODIGO, NOME FROM CLIENTES ORDER BY NOME DESC SELECT CODIGO, NOME FROM CLIENTES ORDER BY UF DESC, NOME JUNÇÃO DE TABELAS O SELECT permite juntar duas ou mais tabelas no mesmo resultado. Isso pode ser feito de várias formas: SELECT CLIENTES.CODIGO, CLIENTES.NOME, PEDIDOS.DATA, PEDIDOS.VALOR FROM CLIENTES, PEDIDOS WHERE CLIENTES.CODIGO = PEDIDOS.CODCLIENTE Nesta linha as tabelas relacionadas CLIENTES e PEDIDOS são unificada através do campo chave, em uma operação de igualdade. Repare que o nomedoscampospassamaserprefixados pelo nome das tabelas, resolvendo duplicidades.Umaversãoresumidadesta comando pode ser: SELECT A.CODIGO, A.NOME, B.DATA, B.VALOR FROM CLIENTES A, PEDIDOS B WHERE A.CODIGO = B.CODCLIENTE OusodealiasesnocódigoSQLtornaa manutenção mais simples. Nocomandoabaixotemosváriastabelas unificadasemumamesmacláusula: SELECT A.CODIGO, A.NOME, B.DATA, B.VALOR, C.QTD, D.DESCRICAO FROMCLIENTESA,PEDIDOSB,ITENSC,PRODUTOSD WHERE A.CODIGO = B.CODCLIENTE AND B.CODIGO = C.CODPEDIDO AND C.CODPRODUTO = D.CODIGO Neste comando unificamos as tabelas relacionadas CLIENTES, PEDIDOS, ITENS e PRODUTOS. Veja mais alguns exemplos: SELECT A.CODIGO, A.NOME, B.DATA, B.VALOR FROM CLIENTES A, PEDIDOS B WHERE A.CODIGO = B.CODCLIENTE AND A.UF= ‘RJ’ SELECT A.CODIGO, A.NOME, B.DATA, B.VALOR FROM CLIENTES A, PEDIDOS B WHERE A.CODIGO = B.CODCLIENTE AND UF = ‘RJ’ OR (UF=’SP’ AND ATIVO=’N’); SELECT A.CODIGO, A.NOME, B.DATA, B.VALOR FROM CLIENTES A, PEDIDOS B WHERE A.CODIGO = B.CODCLIENTE ORDER BY A.UF, A.NOME Observe que a junção através da igualdadedecampostrazcomoresultado somente os registros que possuem referência nas duas tabelas. Observe o comando abaixo: SELECT A.CODIGO, A.DESCRICAO, B.DESCRICAO FROM PRODUTOS A , COMPONENTES B WHERE A.CODIGO = B.CODPRODUTO Os produtos que não possuem componentes não são selecionados. Caso seja necessário criar uma listagem incluindo também os registros que não possuem correspondência, deve-se utilizar o comando JOIN. COMANDO JOIN A junção de tabelas no comando SELECT também pode ser feita com o comando JOIN. Este comando deve ser utilizadocomapalavrareservadaINNER ou com a palavra OUTER: INNER - Semelhante ao uso do operador “=” na junção de tabelas. Aqui, os registros sem correspondências não são incluídos. Esta cláusula é opcional e pode ser omitida no comando JOIN. OUTER – Os registros que não se relacionam também são exibidos. Neste caso, é possível definir qual tabela será incluída na seleção, mesmo não tendo correspondência. Para exemplificar, temos as tabelas abaixo: Produtos Código Descrição Categoria 1 Martelo 1 2 Chave de Fenda 1 3 Alicate 2 4 Desmagnetizador 2 5 Parafuso <null> Componentes Código Cod.Produto Descrição Qtd 1 3 Adaptador CF 1 2 4 CaboMod A1 2 2 4 CaboMod A2 1 Categoria Código Descrição 1 Ferramenta A1 2 Ferramenta B1 3 Ferramenta C1 4 Ferramenta D1 Observe os exemplos e o resultado produzido: SELECTA.CODIGO,A.DESCRICAO,B.DESCRICAO,B.QTD FROM PRODUTOS A INNER JOIN COMPONENTES B ON (A.CODIGO = B.CODPRODUTO)
  • 10. SQL10 - Magazine Resultado 1 Cód Descrição Descrição Qtd 1 Alicate Adaptador CF 1 2 Desmagnetizador CaboMod A1 2 3 Desmagnetizador CaboMod A2 1 Este comando pode ser escrito na versão resumida abaixo: SELECT A.CODIGO, A.DESCRICAO, B.DESCRICAO FROM PRODUTOS A JOIN COMPONENTES B ON (A.CODIGO = B.CODPRODUTO) Como mostrado no resultado, os produtosquenãopossuemcomponentes não são incluídos na seleção. SELECTA.CODIGO,A.DESCRICAO,B.DESCRICAO,B.QTD FROM PRODUTOS A LEFT OUTER JOIN COMPONENTES B ON (A.CODIGO = B.CODPRODUTO) Resultado 2 Cód Descrição Descrição Qtd 1 Martelo 1 2 Chave de Fenda 2 3 Alicate Adaptador CF 1 4 Desmagnetizador CaboMod A1 4 Desmagnetizador CaboMod B2 5 Parafuso Neste comando todos os produtos serão incluídos na seleção, independente de possuirem um componente. Observe que a palavra LEFT se refere a primeira tabela no relacionamento. O mesmo comando poderia ser descrito na forma: SELECT A.CODIGO, A.DESCRICAO, B.DESCRICAO FROM COMPONENTES A RIGHT OUTER JOIN PRODUTOS B ON ( A.CODIGO = B.CODPRODUTO ) A ordem das tabelas foi invertida, mas o resultado é o mesmo. Observe mais alguns exemplos: SELECT A.CODIGO, A.DESCRICAO, B.DESCRICAO , B.QTD FROM PRODUTOS A JOIN COMPONENTES B ON ( A.CODIGO = B.CODPRODUTO ) WHERE A.CATEGORIA=1 Resultado 3 Cód Descrição Descrição Qtd <vazio> <vazio> <vazio> <vazio> SELECT A.CODIGO, A.DESCRICAO, B.DESCRICAO FROM PRODUTOS A JOIN COMPONENTES B ON (A.CODIGO = B.CODPRODUTO ) WHERE A.CATEGORIA=1 OR A.CATEGORIA=2 ORDER BY A.CATEGORIA, A.DESCRICAO Resultado 4 Cód Descrição Descrição Qtd 3 Alicate Adaptador CF 1 4 Desmagnetizador CaboMod A1 2 4 Desmagnetizador CaboMod A2 1 FULL OUTER JOIN Podemos ainda combinar o uso de INNER e OUTER através do comando FULL OUTER JOIN. Neste caso, todos os registros das duas tabelas envolvidas serão exibidos, tendo ou não relacionamento. Observe: SELECT A.CODIGO, A.DESCRICAO, B.DESCRICAO FROM PRODUTOS A FULL OUTER JOIN CATEGORIA B ON ( A.CATEGORIA = B.CODIGO ) ORDER BY A.DESCRICAO Produtos Código Descrição Categoria 1 Martelo Ferramenta A1 2 Chave de Fenda Ferramenta A1 3 Alicate Ferramenta B1 4 Desmagnetizador Ferramenta B1 5 Parafuso Ferramenta C1 Ferramenta D1 UNION Existe ainda uma Segunda forma de juntar tabelas com o comando SELECT. AtravésdoparâmetroUNION,épossível “colar” o conteúdo de duas tabelas. Veja o exemplo: SELECT CODIGO, NOME FROM CLIENTES UNION SELECT CODIGO, NOME FROM FUNCIONARIOS O resultado deste comando é a listagem de todos os clientes e a listagem dos funcionários, dentro do mesmo result set. Repare que no comando JOIN auniãoéhorizontalenoUNIONaunião é vertical. Por default, os registros duplicados são eliminados na cláusula UNION. No exemplo anterior, se tivéssemos um cliente com mesmo nome e código de um funcionário, apenas o registro da primeira tabela seria exibido. Para incluir todos os registros, independente de duplicidade, utilize a palavra ALL: SELECT CODIGO, NOME FROM CLIENTES UNION ALL SELECT CODIGO, NOME FROM FUNCIONARIOS FUNÇÕES DE AGRUPAMENTO São cinco as funções básicas de agrupamento: AVG: Retorna a média do campo especificado: SELECT AVG(VALOR) FROM PEDIDOS; MIN/MAX/SUM: Respectivamente, retorna o menor valor, o maior e o somatório de um grupo de registros: SELECT MIN(VALOR) FROM PEDIDOS; SELECT MAX(VALOR) FROM PEDIDOS; SELECT AVG(VALOR) FROM PEDIDOS; COUNT: Retorna a quantidade de itens da seleção: SELECT COUNT(CODIGO) FROM CLIENTES; AGRUPAMENTO Um poderoso recurso do comando SELECT é o parâmetro GROUP BY. Através dele podemos retornar informações agrupadas de um conjunto deregistros,estabelecendoumacondição de agrupamento. É um recurso muito utilizado na confecção de relatórios. Para exemplificar,temosastabelasCLIENTES e PEDIDOS: Clientes Código Nome 1 Gustavo Viegas 2 Vinicius Andrade 3 Rosangela Mattos Pedidos Código CodCliente Data Valor 1 1 01/10/2002 500 2 1 02/10/2002 100 3 2 01/10/2002 600 4 3 05/01/2002 100 5 3 10/10/2002 300 6 3 11/10/2002 80 SELECT CODCLIENTE, MAX(VALOR) FROM PEDIDOS GROUP BY CODCLIENTE O comando acima retorna o maior valor de pedido de cada cliente. Observe o resultado: Resultado 6 CodCliente MAX (Valor) 1 500 2 600 3 300
  • 11. Guia Rápido da SQL SQL Magazine - 11 SELECT CODCLIENTE, COUNT(*) FROM PEDIDOS GROUP BY CODCLIENTE Aqui vemos quantos pedidos foram feitos por cada cliente. Veja o resultado: Resultado 7 CodCliente COUNT(*) 1 2 2 1 3 3 HAVING Através do comando HAVING podemos filtrar a cláusula GROUP BY. Observe o comando abaixo: SELECT CODCLIENTE, COUNT(*) FROM PEDIDOS GROUP BY CODCLIENTE HAVING COUNT(*) >= 2 Resultado 8 CodCliente COUNT(*) 1 2 3 3 Somente os clientes com 2 ou mais pedidos serão selecionados. Repare que o HAVING é utilizado, geralmente, com alguma função de agrupamento. Para filtros normais, pode-se utilizar o comando WHERE. Observe o exemplo abaixo: SELECT CODCLIENTE, COUNT(*) FROM PEDIDOS WHERE DATA > ‘06/10/2002’ GROUP BY CODCLIENTE HAVING COUNT(*) >= 2 Resultado 9 CodCliente COUNT(*) 3 2 Repare que o cliente número 3 apresentou apenas dois pedidos, visto que o primeiro não possui data maior que 6/10. Conclusão O uso correto do comando SELECT fornece uma poderosa interface de filtro. Utilizando sempre a sintaxe padrão, o desenvolvedor conta com maior independênciadeplataforma,poisoSQL ANSI é compreendido pelos principais bancos de dados. Existem ainda funções especiais e funções de conversão, que serão abordados em futuras edições da SQL Magazine. Para maior eficiência no uso do SELECT, é desejável também o bomplanejamentosdosíndicesdobanco. Para maiores informações a respeito do uso de índices, leia a matéria de Everson Ramos, publicada nesta edição. Espero que este artigo introdutório sirva de consulta em seus projetos! A formatação no uso de campos do tipo DATE pode sofrer alterações de acordo com o banco utilizado. Consulte o manual de referência do mesmo para maiores detalhes. NOTA webSITES ClubeDelphi www.clubedelphi.net/guias/index.asp SQLAutor GladstoneMatosécoordenadordas revistasClubeDelphi,JavaMagazineeSQL Magazine.. Podesercontactadoatravésdoemail: gladstone@clubedelphi.net ANUNCIO
  • 12. SQL Otimização de comandos por Everson Volaco esmo um aplicativo bem projetado poderá experimentar problemas de desempenho se a frase SQL que usa for mal construída. Falhas no proje- to do aplicativo e na construção do SQL causam a maioria dos problemas de desempenho em bancos de dados projetados adequadamente. Veremos neste artigo como melhorar o comando SQL, para garantir maior performance em sua execução, tendo como base o ORACLE. M A forma como o banco de dados se or- ganiza para responder a requisição de um aplicativo é diretamente influenciada pela maneira como a frase SQL é construída. Existem vários pontos a serem observados nesta construção. O caminho mais curto é o uso de ín- dices para auxiliar a pesquisa mas, é im- portante observar, a simples criação de um índice nem sempre é o melhor cami- nho para otimização de comandos SQL. Alguns conceitos importantes Antes de partir para como e quais as me- lhores formas de se aplicar e se escrever comandos SQL é importante relembrar- mos alguns conceitos importantes. Existem dois métodos básicos utilizados pelos SGDB´s para localizar dados, tam- bém conhecidos como caminhos de aces- so. São eles: -Full Table Scan: Leitura seqüencial, blo- co por bloco, de toda a tabela. Neste mé- todo, são verificados registro a registro os critérios de seleção. -Index Search: Procura de um índice so- bre a coluna definida no critério de seleção, identificando a localização dos registros qualificados. O ORACLE possui seu próprio meca- nismo de otimi- zação, chamado otimizador, para executar co- mandos SQL e dinamicamente determinar que caminho de acesso seguir, dependendo das informações disponíveis. O melhor caminho de acesso é, geralmente, o uso de índices, mas isso nem sempre é verda- deiro. Por exemplo, se existir uma forma de identificar diretamente um registro pelo seu endereço físico, a resposta será mais rápida. (neste caso estamos falando do rowid, endereço físico do registro em uma tabela ORACLE). Ex.: SELECT rowid INTO :emp_rowid FROM EMP WHEREemp.empno=5353FORUPDATEOFemp.ename; UPDATE emp SET emp.ename = “OTIMIZADOR” WHERE rowid = :emp_rowid; “A simples criação de índices nem sempre é o melhor caminho para otimizaçãodecomandosSQL”
  • 13. Otimização de Comandos SQL SQL Magazine - 13 Excluindo registros duplicados: DELETE FROM emp e WHEREe.rowid>(SELECTMIN(x.rowid)FROMempx WHERE x.empno = e.empno); Algumas informações para auxiliar o acesso do otimizador: Verificar nas colunas dentro da cláusu- la WHERE: - Que colunas são índices; - Que colunas estão definidas como NOT NULL; - Que índices podem ser usados. Épossívelajudarootimizadoraprocu- rar o melhor caminho de acesso através dacriaçãodeíndiceseclusters,oqueserá considerado a partir de agora. Regras de Utilização de Índices Um índice será usado se : - o índice existir; - a coluna índice for referenciada na cláusula WHERE; Umíndicepodeserusadoparatestesde: - Igualdade: SELECT e.empno, e.ename FROM emp e WHERE e.job = ‘CLERK’; - Intervalo ilimitado: SELECT e.empno, e.ename FROM emp e WHERE e.job > ‘CLERK’; - Intervalo limitado: SELECT e.empno, e.ename FROM emp e WHERE e.job BETWEEN ‘CLERK’ AND ‘JONES’; A criação de índices deve ser feita com critério. A atualização (inserts, updates e deletes) em tabelas de dados gera uma ação equivalente nos índices, sendo que o tempodeatualizaçãodosíndicesésuperior ao de atualização da tabelas, pois além da colocaçãodoregistroemseqüênciadentro do índice é necessário a atualização dos ra- mosdasárvoresdoíndice. Considerando os detalhes acima, índi- ces devem ser criados somente quando necessário, pois a sua simples existência não implica em melhoria de performan- ce, podendo muitas vezes ser a origem de perda de performance. Condições de não utilização de Índices 1)FunçõesouOperadoresAritméticos Se a coluna índice for modificada por umafunçãoouporoperadoresaritméticos (+,-,*,/),oíndicenãoseráutilizado. Um índice sobre SAL ou ENAME não será utilizado nos seguintes casos: SELECT e.ename, e.empno FROM emp e WHERE e.sal*12 = 2400; SELECT e.ename, e.empno FROM emp e WHERE SUBSTR(e.ename,1,3) = ‘JON’ Nos casos acima, as seguintes modifi- cações permitem o uso de índice: SELECT e.ename, e.empno FROM emp e WHERE e.sal = 2400/12 SELECT e.ename, e.empno FROM emp e WHERE e.ename LIKE ‘JON%’ 2) Conversão de Dados A conversão de dados pode inibir a utilização do índice da coluna em ques- tão se usado inadvertidamente. Na seguinte sentença, um índice sobre a coluna HIREDATE não será usado: SELECT e.ename, e.empno FROM emp e WHERE TO_CHAR(e.hiredate, ‘month dd,yyyy’) = ‘january 23,1982’ Esta mesma sentença SQL, modifica- da, usará o índice como segue: SELECT e.ename, e.empno FROM emp e WHERE e.hiredate = to_date(‘january 23,1982’ , ’mounth dd,yyyy’) Se na cláusula WHERE os predicati- vos utilizam dados de tipos diferentes, o ORACLE automaticamente converte um deles sem a preocupação sobre a me- lhor escolha para a utilização dos índices. A conversão por default é escolhida, pelo caso mais comum (Ex.: O valor de uma coluna, onde o tipo é number, rowid ou date, comparado com uma constante de tipo char). Em qualquer caso é muito re- comendado o controle da conversão dos dados de maneira explícita. 3) Caso de colunas com valores NULL Osíndicesnãocontêmreferênciapara valoresdotiponull.Istoquerdizerqueos valores null podem ser recuperados somente através de uma leitura seqüencialcompletada tabela(FullTableScan). No comando abai- xo o índice sobre a coluna COMM não será utilizado: SELECT e.ename, e.empno FROM emp e WHERE e.comm is null Neste código o otimizador considera que a maioria dos registros dentro da ta- bela são valores not null e irá escolher a leitura seqüencial (Full Table Scan): SELECT e.ename, empno FROM emp e WHERE e.comm > = 100 A velocidade de execução dependerá dos dados da tabela. Se a maioria dos registros contiver valores não nulos, a cláusula “comm is not null” será mais rápida. Os índices concatenados não terão re- ferência para os registros onde todas as colunas que o compõem tiverem valores nulos. 4) Caso de predicados com a condição “NOT EQUAL” Os índices sobre colunas referencia- das pela condição not equal não serão usadas. O otimizador considera que o número de registros que irão satisfazer a condição será maior do que os registros que não a satisfazem. O índice sobre DEPTNO não será usa- do na seguinte sentença SQL: SELECT e.ename, e.empno FROM emp e WHERE e.deptno !=10 No comando abaixo, o índice sobre deptno será utilizado: SELECT e.ename, e.empno FROM emp e WHERE not e.deptno > 20 O ORACLE executará a sentença SQL como e.deptno <= 20 5)CasosdesentençasSQLcomcláusu- la “ORDER BY” A cláusula ORDER BY aumenta con- sideravelmenteanecessidadederecursos paraexecuçãodeumasentençaSQL.Em geral, tabelas temporárias serão necessá- rias para operação de sort. É possível evitar a utilização de tabelas temporárias se um índice sobre a coluna alvodoorderbyexistir.Asseguintescon- dições devem ser cumpridas: - A coluna order by deveserdefinidacom not null; - A coluna order by deve ser uma simples coluna índice ou as primeiras colunas de índice concatenado; - A cláusula order by deve conter so- mente colunas e não expressões; - Não deve haver qualquer cláusula group by, distinct ou for update; - Não deve haver nenhum outro aces- “Se a maioria dos registros contiver valores não nulos, a cláusula‘comm is not null’será mais rápida.”
  • 14. SQL14 - Magazine so alternativo que seja prioritário sobre o índice da coluna order by; A seguinte sentença SQL será executa- daviaíndiceemDNAMEseosrequisitos mencionados acima forem respeitados: SELECT d.dname FROM dept d order by d.dname; SELECT d.dname, d.deptno FROM dept d WHERE d.loc = ‘dallas’ order by d.dname; SELECT d.dname, d.loc FROM dept d WHEREd.dname!=‘accouting’orderby d.dname; Nasentençaabaixo,seumíndicesobre a coluna LOC existir, tornar-se-á prio- ritário e o índice sobre dname não será usado: SELECT d.dname, d.deptno FROM dept d WHERE d.loc = ‘dallas’ order by d.dname; 6) Casos de sentenças SQL contendo funções MAX ou `MIN Um índice será usado para executar umasentençaSQLcomMAXouMINse as seguintes condições forem satisfeitas: - MAX ou MIN devem ser apenas ex- pressões da lista de seleção; - A lista de seleção não deve ter qual- queroutrooperadordeconcatenaçãoou adição a não ser somen- te MAX ou MIN; - A lista de seleção não deve conter qual- queroutracolunaanão ser uma simples ocor- rência da coluna como agrupamento de MAX ou MIN; - A sentença SQL não pode ser um JOIN; - A cláusula WHERE e group by não podem ser utilizadas; - A coluna alvo do MAX ou MAX deve ser indexada ou fazer parte das primeiras colunas de um índice concatenado. A seguinte sentença SQL utilizará um índice sobre a coluna SAL: SELECT (max(e.sal)*2) + 10000 FROM emp e; 7) Sentenças SQL recuperam informa- ções sobre uma simples tabela Uma sentença SQL pode ter vários índices únicos e/ou não únicos à disposi- ção do otimizador. A escolha do índice a ser usado depende da presença de: -Índicesúnicosenãoúnicos:osíndices “É possível ajudar o otimizador a procurar o melhor caminho de acesso através da criação de índices e clusters” únicos serão favorecidos sobre os índices não únicos. - Vários índices não únicos : os regis- trosidentificadospelocaminhodeacesso do índice condutor (o primeiro nome na sentença SQL) serão unidos com aquele identificado por outro índice. A meta é identificarosregistrospertencentesa to- dos os índices. Se o otimizador não tiver clara esco- lha concernente a qual índice usar, então irá arbitrariamente escolher o primeiro mencionado dentro da sentença SQL como índice condutor (Driving Index). 8) Caso de sentença SQL com inter- seção de vários predicados de igualdade dentro da cláusula WHERE com índice não único. Oíndicenãoúnicoserásorteadopela coluna rowid a fim de minimizar o nú- mero de comparações necessárias. Se nós temos índice não único sobre JOB e DEPTNO: SELECT e.ename FROM emp e WHERE e.job = ‘manager’ and e.deptno = 20; a. Procura a primeira ou próxima referência do índice sobre job (driving index) con- tendo ‘manager’. b. Procura a pri- meira ou a próxi- ma referência do índice deptno con- tendo valor 20. Compara as duas rowid. - Se as duas forem iguais, registro en- contrado. Vai a próxima referência de “a.” e compara com a próxima refe- rência de “b.”. - Se forem diferentes guarda a referên- cia de “a.” e passa a próxima referência de “b.”. - c. Continua a procura até que não existam mais referências sobre o índice de job (driving index). 9) Caso de sentença SQL com interse- ção de um predicado de igualdade com umpredicadosemlimite,dentrodacláu- sula WHERE com índice não único. Somente o índice sobre a igualdade será usado. No exemplo que segue, se ín- dices não únicos existirem sobre as colu- nas JOB e DEPTNO, o índice sobre JOB será utilizado, os registros corresponden- tes serão recuperados e verificada a vali- dade do segundo predicado. SELECT e.ename FROM emp e WHERE e.job = ‘manager’ and e.deptno > 10 10) Caso de índice Concatenado Índices concatenados são índices for- mados por várias colunas representados como se fosse simplesmente uma única coluna. a) Interseção de vários predicados de igualdade. Se um índice concatenado existir sobre DEPTNO e JOB, somente uma referên- cia será necessária para localizar a rowid correspondente : SELECT e.ename FROM emp e WHERE e.job = ‘manager’ and e.deptno = 10 b) Interseção de predicados sem limite com predicados de igualdade. Se um índice concatenado existir sobre DEPTNO e JOB, será utilizado para executar a seguinte sentença SQL : SELECT e.ename FROM emp e WHERE e.job = ‘manager’ and e.deptno > 10 c) Interseção de predicado sem limite. Se um índice concatenado existir sobre DEPTNO e JOB, será utilizado para executar a seguinte sentença SQL: SELECT e.ename FROM emp e WHERE e.job > ‘manager’ and e.deptno > 10 d) Utilização parcial ou total dos índi- ces concatenados. Ootimizadorpodesomenteusaraouas primeira(s)parte(s)doíndiceconcatenado. No seguinte caso, um índice concate- nado foi criado sobre as colunas EMP- NO, ENAME e DEPTNO: A seguinte sentença SQL usa plena- mente o índice concatenado: SELECT * FROM emp e WHERE e.empno = 7369 AND e.ename = ‘smith’ and e.depnto = 20 SELECT * FROM emp e WHERE e.ename = ‘smith’ AND e.empno = 7369 AND e.deptno = 20 As seguintes sentenças SQL utilizam parcialmente o índice concatenado:
  • 15. Otimização de Comandos SQL SQL Magazine - 15 Uso parcial do índice usando somente EMPNO e ENAME: SELECT * FROM emp e WHERE e.empno = 7369 and e.ename = ‘smith’ Uso parcial do índice usando somente EMPNO e ENAME : SELECT*FROM emp e WHERE e.empno = 7369 and e.deptno = 20 As seguintes sentenças SQL não usam o índice : SELECT * FROM emp e WHERE e.ename = ‘smith’ and e.deptno = 20 SELECT * FROM emp e WHERE e.ename = ‘smith’ SELECT * FROM emp e WHERE e.deptno = 20 11) Casos de Índice único e não único na mesma sentença SQL. O otimizador favorecerá a utilização do índice único. No seguinte caso o índice não único existe em SAL e um índice único em EMPNO : SELECT e.ename FROM emp e WHERE e.sal = 3000 and e.empno = 7902 Oíndiceúnicoseráusadoparaprocurara rowidcorrespondenteaoempno=7902. Nos registros recuperados serão verifi- cados o valor de sal. 12) Caso de vários índices na mesma sentença SQL. Se vários índices únicos estão disponí- veis, o otimizador irá escolher o primei- ro mencionado na sentença SQL. Por exemplo, se índices únicos existirem so- bre ENAME e EMPNO, e um índice não único existir sobre SAL, a seguinte sen- tença SQL será executada sobre o índice ENAME SELECT e.deptno FROM emp e WHERE e.sal = 3000 and e.ename = ‘scott’ and e.empno = 7602 Otimização da cláusula OR (União de predicados) O caminho de acesso é determinado como se a cláusula OR e suas ramifica- ções estivessem ausentes. O caminho é determinado considerando cada ramifi- cação da cláusula OR separadamente. Exemplo A Índice existente sobre SAL e JOB. SELECT e.ename FROM emp e WHERE e.deptno = 10 AND (e.sal = 3000 or e.job = ‘clerk’) Neste caso, o caminho de acesso iden- tificadopor“2”émelhorqueoidentifica- do por “1”, então a cláusula OR é otimi- zada para utilização dos índices. Exemplo B Somente índice sobre SAL utilizando a mesma sentença do exemplo Os dois caminhos de acesso identifi- cado por “2” não são melhores que o identificado por “1”, então os índices não serão utilizados e ocorrerá uma pesquisa seqüencial na tabela. O otimizador na Cláusula OR exige a presença dos índices utilizáveis dentro de cada coluna referen- ciada dentro da cláusula OR. Verificando o “Caminho de Acesso” do otimizador Podemos verificar o caminho de aces- so utilizado pelo SGDB para executar uma determinada frase SQL. Chamare- mos esse caminho de “Acesso de Plano de Execução”. No plano de execução são verificados todos os procedimentos fei- tos pelo SGDB, como utilização ou não de índices, clusters, rowid, além da verifi- cação da quantidade de passos realizados pelo banco para execução do comando. Este procedimento é muito útil, pois pode ser utilizado como recurso para ve- rificarmos se as alterações efetuadas em um comando realmente otimizam a exe- cução do mesmo. A verificação do plano de execução é feita no Oracle através do comando EXPLAIN PLAN. A sintaxe do comando é a seguinte: EXPLAIN PLAN SET STATEMENT_ID = ‘COMAND_ID’ INTO OUTPUT FOR COMANDOSQL; Onde: -COMAND_IDéumStringidentifica- 1)Para DEPTNO = 10 - Pesquisa seqüencial na tabela; 2) Para SAL = 3000 - Índice não único sobre SAL; Para JOB = ‘clerk’ - Índice não único sobre JOB; Análise 1)Para DEPTNO = 10 - Pesquisa seqüencial na tabela; 2) Para SAL = 3000 - Índice não único sobre SAL; Para JOB = ‘clerk’ - Pesquisa sequencial na tabela. Análise dor para posterior visualização do plano de execução. - OUTPUT é tabela onde o plano de execução é gerado. O usuário que execu- tar o EXPLAIN PLAN deve ter direitos de INSERT sobre a mesma. O comando para criação desta tabela émostrado da listagem1. O Script para criação desta tabela cha- ma-se “UTLXPLAN.SQL” e é instalado juntamente com oracle e a sua localiza- ção depende da versão do banco. - COMANDOSQL é o comando a ser analisado. Para verificação do plano de execução gerado pelo EXPLAIN PLAN devemos consultar a tabela informada no comando. Este procedimento pode ser efetuado de váriasmaneiras,umadelaséaquesegue: SELECT SUBSTR(LPAD(‘ ‘,2*(LEVEL-1))|| operation,1,50) operation, options, object_name, position FROM OUTPUT STARTWITHid=0ANDstatement_id=‘COMAND_ID’ CONNECT BY PRIOR id = parent_id AND statement_id = ‘COMAND_ID’; Onde, -COMAND_IDéumStringidentifica- dor do plano de execução informado no EXPLAIN PLAN Listagem 1. create table NOME_DA_TABELA ( statement_id varchar2(30), timestamp date, remarks varchar2(80), operation varchar2(30), options varchar2(30), object_node varchar2(128), object_owner varchar2(30), object_name varchar2(30), object_instance numeric, object_type varchar2(30), optimizer varchar2(255), search_columns number, id numeric, parent_id numeric, position numeric, cost numeric, cardinality numeric, bytes numeric, other_tag varchar2(255), partition_start varchar2(255), partition_stop varchar2(255), partition_id numeric, other long, distribution varchar2(30));
  • 16. SQL16 - Magazine - OUTPUT é tabela onde o plano de execução é gerado. Vamos exemplificar a execução do EXPLAIN PLAIN validando a seguinte informação: “Umíndiceéutilizadoseeleexistirese acolunaquefazpartedesteíndiceestiver contida na clausula WHERE do coman- doSQL.Estemesmoíndicenãoéutiliza- do se existirem funções de conversão de dados envolvendo esta coluna.” Em outras palavras: a execução do co- mando“SELECT*FROMEMPWHERE EMPNO = 50” utilizará o índice da chave primária,quecontémacolunaEMPNO,ea execuçãodocomando“SELECT*FROM EMP WHERE TO_CHAR(EMPNO) = ‘50’”,nãoutilizaráoíndice. Utilizaremos o comando do quadro emdestaqueacimaparacriaçãodatabela que receberá o plano de execução, com o nome de PLAN_TABLE. Em seguida executaremos o EXPLAIN PLAN para verificação da utilização do índice com o seguinte comando: EXPLAIN PLAN SETSTATEMENT_ID=‘SQLMagazineComIndice’ INTO PLAN_TABLE FOR SELECT * FROM EMP WHERE EMPNO = 50; A verificação do plano de execução é feita de seguinte forma: SELECT SUBSTR(LPAD(‘ ‘,2*(LEVEL-1)) || operation,1,50) operation, options, object_name, position FROM PLAN_TABLE START WITH id = 0 AND statement_id = ‘SQLMagazine Com Indice’ CONNECT BY PRIOR id = parent_id AND statement_id = ‘SQLMagazine Com Indice’; O resultado com o plano de execução é mostrado na Tabela 2. Analisando este resultado comprova- mos que o índice referente a chave pri- mária foi utilizado. Vamos verificar ago- ra o mesmo comando alterado: EXPLAIN PLAN SETSTATEMENT_ID=‘SQLMagazineSemIndice’ INTO PLAN_TABLE FOR SELECT*FROMEMPWHERETO_CHAR(EMPNO)=‘50’; A verificação do plano de execução é feita de seguinte forma: SELECT SUBSTR(LPAD(‘ ‘,2*(LEVEL-1)) || operation,1,50) operation, options, object_name, position FROM PLAN_TABLE START WITH id = 0 AND statement_id = ‘SQLMagazine Sem Indice’ CONNECT BY PRIOR id = parent_id AND statement_id = ‘SQLMagazine Sem Indice’; Este resultado mostra que a utilização doíndicefoianuladapelafunçãoaplicada a coluna. Conclusão Os cuidados a serem tomados com o acesso a dados da aplicação são parte im- portante de um projeto. A forma como as consultas são escritas e como o banco de dados está projetado influencia direta- mentenaperformancedoproduto.Esses fatores não devem andar separados. Na maioria dos casos é necessária a perfeita integração entre a consulta escrita e o estado do banco de dados. Muitas vezes uma simples “arrumação” na consulta, trocandoalgumascláusulasoumudando um pouco a “lógica” das condicionais, garante um ganho na velocidade de exe- cuçãoerespostadamesma.Nãoesqueça nuncadeanalisarseoíndiceasercriadoé realmente necessário, para não adicionar um mais um processo para o seu banco. Boa sorte e bons projetos! OPERATION OPTONS OBJECT_NAME select statement table access by index rowid emp index unique scan pk_emp OPERATION OPTONS OBJECT_NAME select statement table access full emp ANUNCIO
  • 17. Otimização de Comandos SQL SQL Magazine - 17 ANUNCIO
  • 18. SQL Modelagem de dados com por Cleison Santos oloca-se como de fundamental importância tanto a análise como a modelagem de dados para o processo de desenvolvimento de aplicações. Esses procedimentos garantem um maior controle das diversas etapas do projeto desde a denição das regras do negócio até a implementação e manutenção da aplicação como um todo. Existem no mercado, atualmente, diversas ferramentas para modelagem de dados, dentre as quais pode ser destacado o soft- ware ErWin. C O ErWin pode ser usado de uma for- ma simples e prática possibilitando uma melhor visualização, controle e documen- tação do que se tem no banco de dados. Através dos diversos recursos disponíveis (Figura 1) podemos “desenhar” o nosso banco de dados definindo as entidades de que compõe o modelo com seus respec- tivos atributos e relacionamentos, definir características dessas entidades tornando- as reais em um modelo físico ou em vários modelos físicos se for necessário o acesso a SGDB´s distintos. Podemos ainda criar, de forma automática, o modelo implemen- tado num banco de dados ou gerar scripts para atualização de alterações efetuadas no modelo, “sincronizar” dois bancos de for- ma a garantir uma estrutura idêntica em ambos, e vários outros recursos. Na parte superior direita, observa-se uma barra de ferramentas com os principais ob- jetos do ErWin, como mostrado na Figura 2, a seguir: Alguns conceitos importantes 1) Entidades - Entidade é o local onde ficam armazenadas as informações. Por exemplo, a Entidade ‘CLIENTES’ pode guardar informações referentes aos clien- tes, e assim sucessivamente. 2) Subtipos - Podem ser definidos como um espelho de uma ou mais entidades. Por exemplo, pode-se criar um subtipo chamado CLIENTES_RJ que contenha somente os clientes que moram no Rio de Janeiro, poden- do ter ou não todos osFigura1.TelainicialdoErWin
  • 19. Modelagem de Dados com ErWin SQL Magazine - 19 atributos da Entidade CLIENTES. 3) Atributos - Os atributos podem ser definidos como identificadores de cada informação contida na entidade. O Códi- go do Cliente, por exemplo, é um atribu- to da Entidade CLIENTES. 4)Relacionamentos-Relacionamentos são definidos como a ligação entre duas ou mais entidades. 5) Cardinalidade - É o que caracteriza o relacionamento.Por exemplo: um pai pode ter mais de um filho, porém um fi- lho só pode ter apenas um pai. Isso quer dizer que a cardinalidade define o com- portamento do relacionamento, definin- do-o como um para muitos, muitos para um ou até muitos para muitos. Os tipos de modelo • Modelo Lógico: É o modelo de abs- tração do sistema. Neste, detalhes como qual banco de dados será usado, o tipo de campo, o tipo de hardware, entre ou- tros aspectos não são relevantes. Aqui, somente as necessidades do processo são definidas, dando uma visão “global” do sistema. No Erwin, podemos ter uma visão da regra de negócio, ou seja, pode- mos planejar uma estrutura lógica para o banco de dados, onde são definidas as validações,asrestriçõesdaregradenegó- cio, a análise das entidades e dos atribu- tos definidos para a aplicação como um todo. •Modelo Físico: É onde os detalhes são definidos. Serve como um espelho de tudo o que está no banco de dados, permitindo controlar características de tabelas e colunas (conhecidos no mode- lo lógico como Entidades e Atributos) de forma particular para o SGDB utilizado além de possibilitar a definição de Proce- dures, Triggers e outros processos. Criando o modelo lógico O tipo de modelo que está sendo visu- alizado encontra-se na Combo situada logoacimadabarradeferramentas,mos- trada na Figura 1. O modelo utilizado inicialmente será o modelo lógico, pois começando por este fica mais fácil definir o outro. Isso por- que, como já foi visto, no modelo lógico tem-se um melhor controle da aplicação, sendo possível definir as validações ne- cessárias, tanto para a regra de negócio comoparaaimplementaçãodebancode dados no modelo físico. Posteriormente, podem ser criados modelos físicos para acessar a diferentes bancos de dados a partir do mesmo modelo lógico. Será criado um modelo simples, onde definiremos algumas entidades com seus respectivos atributos e relacionamentos mostrandocomoutilizaralgunsdosmui- tos recursos disponíveis no ErWin para modelagem de dados. O modelo será feito com base em um sistema comercial com as tabelas CLIENTES, VENDEDO- RES, PRODUTOS, FORNECEDORES, PEDIDOS E ITENS_PEDIDOS. Criando as Entidades Como já visto, as entidades podem ser criadas através do primeiro objeto da barra de ferramentas, clicando nesta, ar- rastando para o modelo e trocando o seu nome, como mostrado na Figura 3. Criando os Atributos Paracriarosatributos,bastaapenasdar um duplo clique na entidade. É possível criar novos atributos, renomear ou ex- cluirumatributojáexistente,comomos- trado na figura 4. Pode-se, também, ao lado direito da tela, definir várias caracte- rísticas do atributo como chave primária na opção Primary Key ou Requerido na opção Required. Figura2.BarradeferramentadoErWin Entidades Criar subtipos de entidades existentes Inserir textos no modelo, como comentário de entidades, relacionamentos e outros Relacionamento de cardinalidade um para muitos Relacionamento de cardinalidade muitos para muitos Relacionamento de cardinalidade um para um Auxilio para mudar os atributos de posição ou de entidades Figura3.CriaçãodaEntidadeClientes Figura4.EditordeAtributos Figura5.EditordeRelacionamentosentreentidades
  • 20. SQL20 - Magazine Criando os Relacionamentos Para definir um tipo de relacionamen- to, basta escolher um dos três objetos já mostradosdabarradeferramentas,clicar na tabela pai e depois na tabela filho. Au- tomaticamente, o relacionamento esco- lhido é visualizado. A figura 5 mostra o editor de Relacionamento e suas funcio- nalidades. Ao dar um duplo clique sobre o relacionamento esta tela é automati- camente aberta. Nela definimos a car- dinalidade do relacionamento, assim como a nulidade dos campos que estão sendo relacionados. A figura 6 mostra o modelo total- mente criado, com suas entidades, atri- butos e respectivos relacionamentos. Criando o modelo físico Após criar todo o modelo lógico é ne- cessária a definição dos atributos do mo- delo físico. Para alternar entre os modelo físico e lógicobastaselecionarnaCombosituada logoacimadabarradeferramentas,mos- trada na Figura 1. No modelo físico iremos definir carac- terísticas das entidades e atributos cria- dos no modelo lógico de acordo com o SGDB utilizado. Neste modelo temos uma visão real das tabelas, colunas, pro- cedures, triggers e outros objetos do nos- so banco. A figura 7 mostra o Editor de Coluna do modelo físico. Conforme o observado no modelo fí- sico, não existem mais Entidades e Atri- butos, e sim Tabelas e Colunas, nomes comuns ao banco de dados. O editor de coluna permite alterar o tipo e tamanho decadacampo,assimcomodefinirseele pode ou não receber valores nulos. Ain- da pode-se utilizar a aba Comment para comentar cada campo, assim como cada tabela. Criando o banco de dados a partir do Modelo Físico criado Terminada a implementação é neces- sário criar os objetos definidos no ErWin emumbancodedados.Paraisso,épreci- so fazer o modelo apontar para o SGDB a ser utilizado acessando-se o menu: Ser- verTarget Server. Além da seleção do SGDB e da versão do mesmo é possível definir opções referentes ao tipo de da- dos e a nulidade default para as colunas definidas no modelo bem como máscara paranomenclaturaautomáticadeíndices e tabelas. Vide Figura 9. Após as configurações do Target Ser- ver,bastaacessaromenuTasksForward Engineer/Schema Generation para criar obancodedados.VideFigura10.Utiliza- remos um banco criado no Oracle. Como se pode ver a tela é bem intuiti- va. Na pasta Summary indicamos os ob- jetos do nosso modelo ( tabelas, colunas, índices, triggers, etc.. ) que serão criados no banco. Ao clicar no botão Generate, obancoécriado,automaticamente,com todas as tabelas, campos e relacionamen- tos demonstrados no modelo físico. A Figura 11 mostra os scripts com to- dos objetos gerados no banco de dados a partir do modelo implementado. Criando um modelo a partir de um banco existente Em muitos casos, o banco de dados já está totalmente implementado, sendo necessária a criação do modelo a partir deste. Este processo chama-se Enge- nharia Reversa, e é acessado pelo menu TasksReverse Engineer. A primeira tela a ser exibida é a ErWin Template Se- lection, onde escolhe-se a opção Blank Diagram para criar o modelo do zero. Ao clicar em Next, depara-se com a tela Select Taget Server, onde é informado o tipo de banco de dados a ser utilizado e a sua versão. Clicando-se mais uma vez no botão Next, surge a tela Set Options ondesãodefinidosprocedimentosneces- sários à realização da engenharia reversa. Vide figura 12. Figura6.Modelológicocomentidades,atributoserelacionamentos. Figura7.EditordeColuna Figura8.ModeloFísicocomTabelas,ColunaseRelacionamentos Figura9.TargetServer–ConfiguraçãodoBancodeDados Figura10.Teladegeraçãodebancodedados
  • 21. Modelagem de Dados com ErWin SQL Magazine - 21 Deste modo, as opções da engenharia reversa podem ser definidas como Da- dos de Tabelas, Colunas, TableSpace, Procedure, Triggers e outros. Na opção Table/Views Owned By, foi seleciona- da a opção Current User para importar somente os objetos criados pelo usuário conectado, poderíamos importar objetos de todos os usuários do banco ou de um usuáriodiferentedoatualmenteconecta- do desde que o mesmo tenha privilégios no banco suficientes para isso. Ainda há possibilidade de se escolher formas de in- dexação e outras coisas mais. Clicando-senobotãoNext,visualiza-seatela deconexão,conformemostradonaFigura13. Esta é a tela que permite fazer a cone- xão do modelo com o banco de dados definido em Taget Server, mostrado na Figura 9. Esta tela também é apresentada quando o banco é criado a partir do mo- delo. Nela são informados o Nome de Usuário, a Senha e a Connect String que repesenta a instância onde será efetuada a conexão, neste caso, com o Oracle. Foi criada uma Connection String, chamada “Comercio” no TNSNAMES do Oracle apontando para o banco de dados. Feito tudo isso, é só clicar no botão Connect que o modelo é criado automaticamen- te, conforme mostrado na Figura 14. Foi possível, a partir de um banco exis- tente, criar um modelo semelhante ao já implementado, conforme já mostrado. No processo de Engenharia Reversa no ErWin, os modelos lógico e físico são criados automaticamente. Criando vários modelos físicos a partir de um único modelo lógico Ainda se pode, a partir de um modelo lógico, criar modelos físicos para acessar bancos de dados diferentes do Oracle. Será criado um modelo físico que acesse um banco de dados Sql Server a partir do mesmo modelo lógico criado para o Oracle. Para isso basta acessar o Target Server, mostrado na figura 9, mudar o banco para o Sql Server, escolhendo a versão, definindo os padrões (como já mostrado) e efetuar os procedimentos mostrados nas figuras 10 e 11. AFigura15apontacomoficaomodelofísi- coparaacessarobancodedadosSqlServer. Observa-se que alguns tipos de campos mudaram, como os campos de valores monetários,quepassaramdeNumber(7,2) paraMoney,eosdedata,quepassaramde Date para Date/Time. Com isso, conclui- seque,apartirdeummodelológicocriado, pode-se criar modelos físicos para acessar diversosbancosdedados,eesteseadaptaà situaçãodecadaumautomaticamente. É importante ressaltar que o modelo lógico continua o mesmo. Conclusão Estes são apenas alguns dos muitos recursos que o ErWin oferece para mo- delagem de dados. É possível criar Pro- cedures, Triggers, Views, alterar o banco de dados, alterar o modelo a partir de al- guma alteração feita no banco, criar o di- cionário de dados, etc. A implementação de um modelo antes do início do desen- volvimento de um sistema garante uma visão ampla e unificada do mesmo, facili- tando em muito a definição da regras de negócio, a implementação, manutenção e análise dos procedimentos, garantindo inclusive a continuidade do trabalho no casodealteraçõesnaequipededesenvol- vimentocompoucoounenhumretraba- lho uma vez que o modelo disponibiliza de forma clara e objetiva uma documen- tação de toda infra-estrutura do sistema. Figura11.Scriptcomocódigodecriaçãodastabelasde- finidasnomodelo. Figura12.TeladeopçõesdaEngenharia Figura13.TeladeConexãocomoOracle. Figura15.ModeloFísicoparaacessaroSqlserver.Figura 14. Modelo criado apartir de um banco de dados existente usando a EngenhariaReversa SQLAutor Cleilson Santos é Analista de Sistemas, trabalha no Projeto SEP (Sistema de Engenharia de Poço) e SIRR (SistemadeReservaeReservatório)naPetrobrás. Podesercontatadopeloe-mailcleilsonsantos@uol.com.br
  • 22. UML Introdução à por Gustavo Viegas o nal dos anos 80 e início dos anos 90, tínhamos muitos con- itos de denições e nomenclaturas na área de modelagem. A es- colha para utilização de um determinado padrão era denido mais pelo “gosto” pessoal do que por fatores técnicos oferecidos. Então, os três mais respeitados nomes nesse campo, cada qual com seu conceito e implementação de modelo, Ivar Jacobson (OOSE – Object Oriented Software Engineering), Grady Booch (The Booch Method) and James Rumbaugh (OMT –Object Modeling Technique) decidi- ram por m aos debates e trabalhar juntos na denição de um mod- elo único que veio a ser a UML. N A UML permite que você “desenhe” uma “planta” do seu sistema. A compara- ção ideal é a de um construtor que vai rea- lizarumprojetosemantestertodaaplanta que defina estrutura a ser construída. A ex- periência do construtor garante, até certo ponto, o sucesso do projeto. Mas, com certeza, uma vez feito o planejamento, o “cálculo estrutural”, o desenho da planta, a garantia de sucesso antes, durante e depois da efetivação da construção é incompara- velmente maior. O mesmo acontece com um projeto de software. A experiência do desenvolvedor ou analista, não pode substituir a necessidade de um projeto que defina uma “planta” da solução como um todo. Esta “planta” garante, em todas as fases do projeto, seja na definição, desen- volvimento, homologação, distribuição, utilização e manutenção do mesmo, uma maior clareza e objetividade para execu- ção de cada ação, e, com certeza, quanto maior a solução, maior a necessidade de um projeto definido adequadamente. Des- ta forma, a UML é uma linguagem padrão para visualização, especificação, constru- ção e documentação de um aplicativo ou projeto de software, e objetiva aumentar a produtividade, otimizar as etapas que en- volvem o desenvolvimento de um sistema, aumentando assim a qualidade do produto a ser implementado. Ela independe da fer- ramenta em que o aplicativo será desenvol- vido. A idéia e prover uma visão lógica de todooprocessodeformaafacilitaraimple- mentação física do mesmo. A UML disponibiliza, através de concei- tos, objetos, símbolos e diagramas, uma forma simples, mas objetiva e funcional, de documentação e entendimento de um sis- tema. Você pode utilizar os diagramas e ar- quivos que compõe um modelo UML para o desenvolvimento, apresentação, treina- mento e manutenção durante todo o ciclo de vida da sua aplicação. Ela é mais com- pleta que outras metodologias empregadas para a modelagem de dados pois, tem em seu conjunto todos os recursos necessários parasuprirasnecessidadedetodasasetapas que compõe um projeto, desde a definição, implementação, criação do modelo de ban- co de dados, distribuição, enfim, proporcio- nando sem qualquer outra ferramenta ou metodologia adicional, um total controle
  • 23. IIntrodução à UML SQL Magazine - 23 do projeto. A UML implementa uma modelagem comumavisãoorientadaaobjetos.Atra- vés dela podemos definir as classes que compõe a nossa solução, seu atributos, métodos e como elas interagem entre si. Apesar da UML ter como base a orien- tação a objetos, não significa que a fer- ramenta e a linguagem utilizada para a implementação do modelo seja também orientada a objetos, embora seja reco- mendável. Este artigo não irá explorar os conceitos de orientação a objetos, e sim a implementação de um modelo UML simples, para início da documentação de um sistema, utilizando dois diagramas implementados pela UML que são o “Diagrama de Casos e Uso” e o “Diagra- ma de Classes”. Os diagramas têm como objetivo representar, através de um con- junto de elementos, como o sistema irá funcionar e como cada peça do sistema ira trabalhar e interagir com as outras. Outra vantagem vem da facilidade de lei- tura dos diagramas que compõe a UML, além da facilidade de confeccioná-los, pois existem inúmeras ferramentas para modelagem de dados orientados a ob- jetos (ferramentas Case), dentre elas o RationalRose,oModelMaker,eoPosei- dom UML. Além dos diagramas citados a UML disponibiliza outros diagramas, dentre os quais podemos citar o Diagra- ma de Objetos, Diagrama de Seqüência, Diagrama de Colaboração, Diagrama de Estado, Diagrama de Atividade e Diagra- ma de Componentes. Entendendo UML a partir de um ex- emplo prático UtilizaremosoPoseidonUMLparaim- plementar o modelo do exemplo. O Po- seidon UML é uma ferramenta case que suporta os principais diagramas UML e é desenvolvido em Java. Tem algumas fa- cilidadesnoqueserefereainteraçãocom o Java podendo, a partir de um modelo gerar o código Java das classes definidas no mesmo e também suporta a Enge- nharia Reversa, que é gerar o modelo a partir das classes implementadas. O Po- seidontemsuaversãofreeepodeserbai- xado em www.gentleware.com. O modelo aqui proposto começa a ser implementado a partir de um problema real que é a necessidade de um cliente. O problema proposto é o seguinte: “Desenvolver um sistema para um caixa eletrônico onde é permitido a um cliente realizar quatro tipos de opera- ções: a de consulta de saldo, solicitação de extrato, depósito e saque. Esse mes- mo caixa eletrônico deve ser abastecido de dinheiro e ter os depósitos recolhidos por um funcionário do banco” Para definição do modelo do nosso sis- tema, iremos implementar primeiro um DiagramadeCasosdeUsoouUseCases. Os objetivos principais de um diagrama de Casos de Uso são: • Descrever os requisitos funcionais do sistema de maneira uniforme para usuá- rios e desenvolvedores; • Descrever de forma clara e consisten- te as responsabilidades a serem cumpri- das pelo sistema, formando a base para a fase de projeto; •Ofereceraspossíveissituaçõesdomundo realparaafasedetestesdosistema. Oselementosbásicosdeumdiagramade casodeusosão:ator,casodeuso,interação esistema,todosilustradosnafigura1. Um ator é uma entidade externa ao sistema que de alguma forma participa de um caso de uso. Um ator pode ser um ser humano, máquinas, dispositivos, ou outros sistemas. Atores típicos são cliente, usuário, gerente, computador, impressora, etc. Os atores representam um papel e iniciam um caso de uso que após executado, retorna um valor para o ator. Um caso de uso especifica um ser- viço que será executado ao usuário e é compostoporumoumaiscenários. Um cenário é uma narrativa de uma parte do comportamento global do sistema. Para oproblemaproposto,oDiagramadeCa- sosdeUsopodeserimplementadocomo mostrado na figura 2. No Diagrama de Casos de Uso imple- mentado o sistema é o Caixa Eletrônico, os atores representam o Cliente e o Fun- cionário do banco. O Cliente interage com os Casos de Uso consulta de saldo, solicitação de extrato, depósito e saque e o Funcionário interage com os Casos de Uso Abastece de dinheiro e Recolher en- velopes de depósitos. Para melhor entendimento do Diagra- madeCasosdeUsoénecessáriaadescrição textual do fluxo do Caso de Uso (principal ealternativo)edoCenáriooudosCenários que compõe cada Caso de Uso. Iremos descreveroUseCaseSolicitaçãodeExtrato bemcomooCenárioqueocompõe. Após a descrição textual de todos os Casos de Uso e respectivos Cenário, nos- sa documentação envolvendo o Diagra- ma de Casos de Uso está completa. O segundo diagrama a ser utilizado para solução do problema proposto é o Diagrama de Classes. Este diagrama, contém as classes que caracterizam os objetos do nosso sistema. As classes são extraídas a partir da análise do Diagrama de Casos de Uso e representam os com- ponentesdeinteraçãodonossosistemae Figura2
  • 24. SQL24 - Magazine como eles se relacionam. Vamos implementar um Diagrama deClasse,apartirdoDiagramadeCasoseUsoimplementado, com a definição das classes Cliente, ContaBancaria e Lança- mentos da Conta. ( Vide Figura 4 ) Uma classe é representada por um retângulo sólido com três partes:aprimeiraparaonomedaclasse;outraparaosatributos da classe ( que podem ser vistos como características da clas- se);eaterceiraparaadeclaraçãodasoperaçõesdefinidasparaa classe. A Figura 3 mostra a notação UML para classes. Através da classe Cliente implementada no diagrama da fi- gura 4, nós definimos as características do nosso cliente (neste caso um Identificador e um Nome que representam os atribu- tos da classe), seu relacionamento com a classe ContaBancaria que é de 1 para muitos ( isto representa a cardinalidade do re- lacionamento ) e definimos uma operação realizada pela classe que é ObterContaBancaria(). A mesma análise deve ser feita para a classe ContaBancaria e LancamentoConta. Com esse diagrama, já podemos identificar elementos que existirão em nosso sistema, suas carcterísticas e operações. Es- sas definições estão contidas nas classes. Essas classes tornam-se reais em nosso sistema a quando são manipuladas por ele e, a partir daí, são conhecidas como objetos, pois suas características passam a “ter um valor” e elas começam a interagir com outros objetosdasclassesrelacionadas. Conclusão A UML se mostra como parte essencial no “ciclo de vida” de uma aplicação. Foi mostrado, utilizando apenas dois dia- gramas, toda a funcionalidade operacional de um sistema bem como a definição de elementos internos referentes ao desen- volvimento do mesmo. Esses dois diagramas fazem parte da documentação do sistema, e podem ser utilizados para uma apresentação da solução para o requisitante antes da imple- mentação da mesma, visualização dos processos que o sistema irá disponibilizar, definição de elementos inerentes ao desen- volvimento como estrutura de telas, procedimentos operacio- nais, referência para criação de objetos de persistência em um banco de dados, etc. Existem outros elementos a explorar, outros diagramas, ou- tros tipos de relacionamentos e documentação, mas este foi um passo inicial para conhecer todos os recursos que a UML disponibiliza e aumentar a qualidade do desenvolvimento de nossas aplicações. Caso de Uso“Solicitação de Extrato” 1) Descrição textual do fluxo principal do Use Case Solicita- ção de Extrato EsteCasodeUsoinicia-sequandooClienteescolheaopçãoExtratoapóspassarocartãonocaixa eletrônicoeterasuacontavalidada.Apósavalidaçãodacontaosistemapedeaoclienteparaescolher dentreasopçõesdesaldo: Extrato Rápido - O subfluxo A1 (Imprimir Extrato Rápido) é executado. Extrato no Período - O subfluxo A2 (Imprimir Extrato no Período) é executado. Sair - O Caso de Uso é encerrado, o sistema volta a tela principal e solicita que o cliente passe o cartão. 2) Descrição textual dos Subfluxos alternativos associados a este use case A1 - Imprimir Extrato Rápido O sistema solicita que o cliente entre com a senha para autorizar a impressão do extrato (o sub- fluxo B1 - Solicitar e Validar de senha alfabética - é executado). Caso a senha seja validada a conta do cliente é consultada e o extrato é impresso (o subfluxo B2 – Imprimir Extrato - É executado). O sistema volta a tela principal e solicita que o cliente passe o cartão. A2 - Imprimir Extrato no período O Sistema solicita que o cliente informe a data inicial e final pra impressão do extrato. Em seguida O sistema solicita que o cliente entre com a senha para autorizar a impressão do extrato (o sub- fluxo B1 - Solicitar e Validar de senha alfabética - é executado). Caso a senha seja validada a conta do cliente é consultada de acordo com o período e o extrato é impresso (o subfluxo B2 – Imprimir Extrato - É executado). O sistema volta a tela principal e solicita que o cliente passe o cartão. B1- Solicitar e Validar de senha alfabética O sistema solicita que a senha do cartão seja digitada. Consulta a conta do cliente validando a senha digitada. Caso a senha não seja válida o sistema informa na tela e pede mais uma tentativa. O sistema verifica a quantidade de erros de validação de senha ocorridos no dia e informa que após 3 tentativas erradas o cartão do cliente será bloqueado e informa o número de tentativas que o cliente ainda dispõe. O Cliente pode sair da operação e voltar para a tela inicial, ou tentar novamente. Caso a senha seja válida, a operação prossegue. Caso contrário, após três tentativas o cartão do cliente é bloqueado. B2- Imprimir Extrato O sistema verifica se a impressora do caixa eletrônico está ativa e se a mesma possui papel. Caso apresente um dos problemas citados, o sistema mostra uma mensagem solicitando que o cliente realiza a operação em outro caixa eletrônico e volta para a tela inicial e avisa do erro sempre que uma operação que envolva impressão for solicitada. Caso contrário, o conteúdo solicitado para impressão é impresso. 3) Cenário Primário José dirige-se ao caixa eletrônico e passa o cartão na máquina. O Sistema, após validar a conta exibe as opções disponíveis. José seleciona a opção de Solicitação de Extrato. Em seguida José seleciona a opção de Extrato no Período. Informa a data inicial e final. O Sistema solicita a senha a José. Após José digitar a senha e confirmar a operação, o Sistema valida a senha, consulta a conta de José e imprime o extrato de movimentação da conta no período selecionado. 4) Cenário Secundário O Sistema, ao verificar os requisitos para impressão, retornou que a impressora estava sem papel. José, após ser informado do problema pelo sistema, dirigi-se a outro caixa eletrônico e inicia novamente a operação. Figura4 Figura3 SQLAutor GustavoViegaséeditordarevistaSQLMagazine.Pode sercontactadopeloemail:gustavo@sqlmagazine.com.br
  • 25. IIntrodução à UML SQL Magazine - 25 ANUNCIO
  • 26. Delphi, VB.Net e Java Como conectar Front-Ends por Pedro Henrique Paulo Correia Gustavo Viegas tualmente não podemos negar que deparamos diariamente com diversas formas de armazenamento e manipulação de dados. Isto independe do lugar que estamos ou do que fazemos. Se vamos a um mercado, temos computadores que registram as vendas, má- quinas de consulta de preços de produtos, terminais para saques eletrônicos, máquinas de cartão de crédito, entre outros. É comum encontrarmos em diversas áreas da nossa vida a presença de má- quinas e aplicativos que, de alguma forma, lidam com dados arma- zenados, dinamizando e facilitando seu acesso. A É comum encontrar aplicações que inte- ragem com algum tipo de informação ou conjunto de informações. Independente da linguagem que foram desenvolvidas, elas visam garantir aos seus usuários segu- rança, clareza e objetividade na recupera- ção e manutenção do seu conteúdo. Mas antes de falarmos dos sistemas que fazem o usuário interagir diretamente com os dados, visualizando-os e manipulando-os de forma coerente e usual, é importante termos conhecimento prévio de que as informações manipuladas por eles, em sua maioria, estão armazenadas em um Siste- ma Gerenciador de Banco de Dados, ou simplesmente SGBD. Este SGBD deve garantir que os dados estejam armazenados de forma organiza- da,permitindoatualizações,inclusõeseex- clusões e garantindo toda segurança e con- sistência. Por definição temos que SGDB é “um software (ou conjunto de Softwares) responsável pelo gerenciamento (armaze- namentoerecuperação)dosdadosnoban- co de dados”. Um SGBD pode gerenciar um ou mais bancos de dados. Mas como definir um banco de dados? Se nós temos um arquivo contendo a tabela de preços dos produtos de uma indústria, nós temos um banco de dados?Conceitualmente,umabancodeda- dos tem de representar uma coleção de da- dos organizados de forma coerente e com um significado real. Uma tabela de preços, por si só, não tem um significado real sem que existam outras tabelas que interajam com ela. Se nós temos uma tabela de pre- ços, uma tabela de clientes, uma tabela de pedidos e uma tabela de produtos, já po- demos montar um quadro que traduz um processodeatendimentoaclientes,vendae controle de estoque, ou seja, uma situação real armazenada num banco de dados. A forma mais comum de intera- ção entre usuário e banco de dados ocor- re através de sistemas específicos, que por sua vez acessam o volume de informações geralmente através da linguagem SQL (Strutured Query Language), padrão entre os SGBD´s. A ferramenta de desenvolvi-
  • 27. Conectando Front-Ends com Delphi,VB.Net e Java SQL Magazine - 27 mento utilizada para a implementação desses sistemas é tão importante quanto o SGBD que gerencia as informações a serem acessadas por eles. Iremos analisar três grandes ambientes para desenvolvi- mento: Delphi, VB .Net e Java. Por que o Delphi? O Borland Delphi é uma grande opção para o desenvolvimento de sistemas em que é necessário utilizar servidores de BancodeDadosSQL.Inicialmente,éim- portante frisar que o Delphi possui um suporte bem amplo aos Servidores SQL encontrados hoje no mercado, através da implementação de diversos drivers e engines. Alguns são da própria Borland, como o DbExpress e a obsoleta BDE. Outros são de terceiros, como o ADO (ActiveXDataObjects)daMicrosoft.Um driver geralmente é uma dll, um conjun- todefunçõesutilizadasparaacessoema- nipulação de dados em um banco. Um engine é um aplicativo que faz a interfa- ce ou tradução das mensagens enviadas NOTA Para obter mais informações sobre o ADO, acesse o Microsoft Universal Data Access no endereço: http://www.micro- soft.com/data. Lá é possível baixar a ver- são mais recente do MDAC (conjunto de componentes que, entre outros recursos, inclui o ADO). pela aplicação para o driver, de forma que seja transparente para a aplicação o tipo de driver que está sendo utilizado para acesso ao banco. Uma das grandes novidades do novo Delphi é o suporte através da dbExpress ao servidor Micro- soft SQL-Server 2000. Neste artigo usaremos o DbExpress e o ADO como engines de acesso e o banco de dados será o Northwind do Mi- crosoft SQL-Server 2000. O ADO, sendo desenvolvido pela Microsoft, se caracte- riza como uma ótima opção para cone- xãoaoMSSQLServer, alémdefacilitara distribuição da aplicação, uma vez que é suportado nativamente por diversas ver- sões do sistema operacional Microsoft Windows (Win 98 SE, Win ME/2000 Professional, Win XP Home/Professio- nal). Exemplificaremos o mesmo acesso utilizando o DBExpress. Iremos verificar que as diferenças de programação de um Engine de acesso para outro no Delphi são poucas. O que muda mais é o deploy (distribuição) e a performance. Figura1. Uma nova aplicação no Delphi Figura2. Componentes SQL Connectiom Figura3. Configuração do SQL Connection Figura4. SQLConnection configurado Exemplo em Borland Delphi 7 Primeiro iremos exemplificar a cone- xão utilizando DbExpress. Passo1–Iniciandoumanovaaplicação. Clique menu File / New / Application como mostra a figura 1 Passo2 – Configurando a conexão Adicione ao formulário form1 o com- ponente SQLConnection, localizado na paleta de componentes DbExpress. Em seguida, clique com o botão inverso do
  • 28. SQL28 - Magazine mouse no componente e selecione Edit Connection Properties, como mostra a figura 2. Será exibida uma caixa de diálogo para configuração das propriedades de conexão com o banco de dados. Vamos utilizar a conexão denominada MSSQL- Connection (poderíamos adicionar uma nova conexão clicando no botão “+”, selecionando o driver MSSQL e dando um nome para a mesma) e configurar em Connection Settings os demais parâ- metros: HostName – Nome ou IP da máquina servidora Database- NomedobancodedadosnoSQLServer User_Name- Nome do usuário Password - Senha Para testar a conexão clique no botão “Test Connection” (último da barra de fer- ramentas com um ícone de engrenagem). Afigura3mostraajanelapreenchida. A conexão é aberta através da pro- priedade Connected do componente SQLConnection (as propriedades são acessadas através do Object Inspector). Podemos alterar esse valor em tempo de design ou tempo de execução. Altere a propriedadeLoginPromptparafalsepara desabilitar a caixa de diálogo de login do banco. Neste caso, o usuário e senha já estãosendopassadosdiretamentepeloapli- cativo.Observeasalteraçõesnafigura4. Passo3 – Acessando os dados Acessaremos a tabela Employees no banco tomado como exemplo. Para isso, insira um componente TSQLQuery, lo- calizado também na paleta DBExpress. Devemos conectar o SQLQuery ao objeto SQLConnection. Selecione a pro- priedade SQLConnection do SQLQuery e aponte para SQLConnection1. Em seguida definimos o código da consulta SQL através da propriedade XXXX. Para executar a consulta em tempo de proje- to basta alterar a propriedade Active do componente para true. Vide figura 5. Passo4 – Manipulando os dados e exe- cutando a aplicação Para permitir que o usuário manipule os dados selecionados, utilizaremos um componente DbGrid. Este componente está localizado na paleta Data Controls. Uma vez adicionado ao formulário é ne- cessário que esse componente acesse os dados retornados pelo SQLQuery confi- guradonopasso3.Paraisso,utilizaremos três outros componentes: ClientDataSet, DataSetProvider e DataSource que estão localizados na palheta Data Access. Esses componentes devem ser adicionados ao formulário e configurados da seguinte forma: DataSetProvider - A propriedade DataSet aponta para o SQLQuery configurado no passo 3. ClientDataSet – A propriedade ProviderName aponto para o objeto DataSetProvider. DataSource – A propriedade DataSet aponta para o ClientDataSet configurado no passo an- terior. Por fim, para que os dados sejam exi- bidos no grid adicionado ao formulário, devemos apontar a propriedade Data- Source do grid para o objeto DataSour- ce1, alterarando a propriedade Active do ClientDataSet para true. Dessa forma os dados serão exibidos no grid, estando prontos para serem manipulados confor- me mostra a figura 6. O ClientDataSet e o DataSetProvider fazem parte de uma implementação da Borland denominada DataSnap (antigo MIDAS) que disponibiliza para o desen- volvedor o que chamamos de “DataSet Desconectado”. A partir de um DataSet Figura5. Configurando o SQLQuery Figura6. Projeto com DBExpress finalizado Figura7. Componente ADOConnection
  • 29. Conectando Front-Ends com Delphi,VB.Net e Java SQL Magazine - 29 qualquer, que no exemplo foi o SQL- Query, o DataSetProvider monta um conjunto de dados e envia para o Clien- tDataSet. Feito isso, o SQLQuery, que é o DataSet de origem, não é mais utiliza- do, bem como a conexão com o banco, e os dados podem ser manipulados sem sobrecarga da rede e conseqüente degra- daçãodaperformancedaaplicação.Após o término da manipulação dos dados, é necessário a execução do método Ap- plyUpdates do ClientDataSet, para que sejam aplicados no banco. No exemplo, o evento “OnClick” do botão “Aplica Al- terações” deve ser implementado com o seguinte código: procedureTForm1.BitBtn1Click(Sender:TObject); begin ClientDataSet1.ApplyUpdates(0); end; O parâmetro do método indica o nú- mero de erros que serão desconsidera- dos antes de ser gerada uma exceção na aplicação. Neste caso o parâmetro indica que não podem ocorrer erros no proces- samento. Para cancelar as alterações efetuadas é necessárioaexecuçãodométodoCance- lUpdates.Nestecaso,oevento“OnClick” do botão “Cancela Alterações” deve ser implementado com o seguinte código: procedureTForm1.BitBtn2Click(Sender:TObject); begin ClientDataSet1.CancelUpdates; end; Outra grande vantagem do Client DataSet e do DataSetProvider é a facili- dade que eles disponibilizam para que, se for necessário, seja efetuada uma troca do engine de acesso ao banco. O mesmo programa feito com DBExpress será uti- lizado para exemplificar o acesso a dados utilizando ADO. ACESSO AO SQL SERVER COM ADO Passo 1 – Trocando o componente de conexão com o banco de dados. Em primero lugar os componentes SQLConnection e SQLQuery devem ser Figura8. Configurando ADOConnection excluídos do formulário para que pos- samos adicionar os componentes Ado- Connection e AdoQuery localizados na paleta ADO. No ADO o componente responsável pela conexão é o AdoConnection. Após adicioná-lonoformuláriodevemoscon- figurá-loatravésdoacessoaomenuEdit ConnectionString, conforme mostra a figura 7. A tela exibida por esta opção permite que utilizemos um Data Link File ou uma Connection String (figura 8). Utili- zaremos esta última de forma a mostrar todooprocessodeconfiguraçãodacone- xão. A vantagem de usar Data Link File é que os parâmetros ficam armazenados em um arquivo externo, possibilitando alterações sem a necessidade de “recom- pilação” do aplicativo. ParamontaraConnectionStringacessa- remos o assistente através do botão build dacaixadediálogoexibida(figura8). Em primeiro lugar devemos confi- gurar o Provider que irá gerenciar a conexão com o banco de dados. Esco- lheremos o “Microsoft OLE DB Pro- vider for SQL Server” (figura 9). Após esta seleção devemos informar na pasta Connection os parâmetros para que a conexão seja efetuada. Indique o nome do servidor de banco de dados em “1. Select or enter a server name”, os dados para login em “2. Enter the infor- matino to log on to the server” e o banco de dados a ser acessado em “3. Select the database on the serever”. É importante que a opção “Allow saving password” esteja marcada para evitar erros na cone- xão uma vez que os parâmetros de login (usuário e senha) já estão definidos. En- cerradasasconfiguraçõespodemostestar a conexão através do botão “Test Connec- tion” e em seguida encerrar o assistente atravésdobotãook(videfigura10). Passo 2 – Adicionando o componente para acesso aos dados NoADOocomponenteaserutilizado para substituir o SQLQuery é o ADO- Query que está na paleta ADO. Uma vez adicionado ao formulário, altere a pro- priedade Connection apotando-a para o objeto AdoConnection1. Altere a pro- priedade SQL de forma análoga ao passo 3 do exemplo com DbExpress. Feito isso, basta alterar a propriedade DataSet do DataSetProvider apontando para o ADOQuery configurado anterior- mente. Altere a propriedade Active doFigura9. Escolhendo o Provider Figura10. Montando o ConnectionString
  • 30. SQL30 - Magazine ClientDataSet para true e pronto! (Vide figura 11). Por que o VisualBasic.Net? O Visual Basic agora faz parte de um novo conjunto de ferramentas para de- senvolvimentodeaplicações:aestratégia .Net. O .Net é uma nova plataforma da Microsoft, multi-linguagem, totalmente formulada para lidar com XML e Web Services e voltada para aplicações multi- dispositivos. Nesta plataforma, o ADO também ganhou uma nova implemen- tação chamada ADO.Net e é este engine que iremos focalizar. O novo ADO.Net foi desenvolvido para ser uma versão bem diferente das anteriores, focando a completa compre- ensão do XML, o uso de DataSets des- conectados e uma implementação mais leve para a Web. Exemplo em Microsoft VisualStudio. Net (utilizando VB.Net) Inicie o VisualStudio.Net e clique no menu File|New|Project. Na caixa de diálogo, clique em Visual Basic Projects eescolhaWindowsApplicationsnacaixa Templates. Digite o nome do projeto e clique em OK. Após estes passos o VisualStudio.Net irá preparar o ambiente para o desenvol- vimento de um projeto Visual Basic. No ADO.Net, assim como nas versões anteriores do ADO, existe o objeto Con- nection que permite a conexão com o Banco de Dados. Esse objeto, atualmen- te, não é um objeto único para qualquer tipo de conexão como antes. Agora ele é implementado em diversas classes que utilizam a interface IdbConnection em comum. Usaremos o SQLConnection, um componente Connection implemen- tado para se conectar ao MSSQL-Server versão 7x e superiores, para acessar o banco Northwind que acompanha o MSSQL-Server 2000. Na ToolBox no lado esquerdo da apli- cação clique na guia “Data” e insira no formulário um componente SQLCon- nection. Na caixa Properties clique na propriedade ConnectionString e selecio- ne “New Connection...” (Figura4). Será exibida a janela padrão de configuração de ConnectionString do ADO. O exem- plo no Delphi 7 utiliza a mesma janela e explica como configurar a ConnectionS- tring para acessar o banco Northwind em detalhes. Configurado o componente de cone- xão é necessário informar de onde serão requisitados os dados. Esta requisição é feita por um objeto Command. Porém, assim como o objeto Connection, o Command possui diversas versões que variam de Provider para Provider. Por exemplo, para acessar o SQL-Server, o ADO.Net possui um Provider específi- co que, para ser utilizado, precisa de um SQLConnection pertencente ao names- pace System.Data.SqlClient (implemen- tação que aproveita recursos específicos do MS-SQL) e para se executar uma consulta no Banco deve-se utilizar um objeto SQLCommand, ou mesmo um SQLDataAdapter, também do mesmo namespace (ou seja, também especifico para o MS-SQL). O que implica que é ne- cessário importar este namespace com o comando “Imports”. Na guia Data da ToolBox clique no componente SQLDataAdapter e insira-o no formulário. Automaticamente o Visual Studioiráapresentaro“DataAdapterCon- figuration Wizard”, que permite configu-Figura11. Projeto com ADO finalizado Figura12. Caixa de Diálogo de escolha do projeto noVisualStudio.NET Figura13. SQLConnectionWizard
  • 31. Conectando Front-Ends com Delphi,VB.Net e Java SQL Magazine - 31 rar de forma simples o SQLDataAdapter. Este componente tem como função facili- tarogerenciamentodasrequisiçõescomo Servidor em relação ao DataSet (conjunto de registros), armazenando consultas SQL através das propriedades: DeleteCom- mand, InsertCommand, SelectCommand e UpdateCommand que permitem ao desenvolvedor especificar comandos SQL para controlar de forma otimizada e pa- dronizada pelo ADO.Net os conjuntos de registrosarmazenadosnoServidor. Utilizando o Wizard é possível confi- gurar uma consulta simples e entender como se utiliza o SQLDataAdapter no VisualStudio.Net.Naprimeiratelaclique no botão “Next”, onde será exibido o passo: “Choose Your Data Connection”. Estatelapermiteconfigurarqueconexão irá requisitar os dados. Na caixa Combo pode-se especificar a conexão que já foi criada pelo componente SQLConnec- tion inserido anteriormente. Após clique no botão “Next”. Em “Choose a Query Type” especificamos como os dados se- rão requisitados. Abaixo, segue uma pe- quena descrição de cada opção: - Use SQL statements: Permite especi- ficar uma Query SQL que faça o retorno dos dados. O próprio Wizard irá gerar os comandos Delete, Update e Insert basea- dos nesta Query. - Create New Stored Procedures: Per- mite criar novos procedimentos armaze- nadosapartirdeumaQuerySQLparaos comandos Insert, Update e Delete. - Use Existing Stored Procedures: Per- mite especificar quais serão os procedi- mentos armazenados que farão os co- mandos: Select, Insert, Update e Delete do conjunto de registros específicos para cada situação. Será utilizada a opção “Use SQL state- ments”eaconfiguraçãodaQuerycomo comando SQL abaixo: SELECT orderid, customerid, orderdate, shippeddate, shipname, shipregion, shipcountry FROM Orders Conforme visto no exemplo acima, será requisitado ao banco de dados ape- nas alguns campos da tabela de pedidos. Este comando SELECT será inserido na propriedade SelectCommand do SQL- DataAdapter. Clique em “Next”. Serão gerados no Wizard os comandos SQL de acordo com o SELECT para configurar o com- ponente automaticamente. Para finali- zar, clique no botão “Finish”. Pronto! Foi criado um componente SQLDataAdapter que permite fazer con- sultas e, ainda dentro do padrão ADO. Net, modificar os dados selecionado, através da SQL gerada pelo Wizard. Os controles Data-Aware do .Net para exibir dados necessitam que estes sejam recebidos de um DataSet. Para gerar um DataSet, clique com o botão direito na figura do SQLDataAdapter no Form De- signer e selecione “Generate DataSet”. Será visualizada uma caixa de diálogo onde, pressionando-se o botão “OK”, irá aparecer o componente DataSet. Em seguida insira um controle Data- Grid.LinkeapropriedadeDataSourceao DataSet recém-gerado e DataMember a tabela Orders, visualizando os dados no grid da mesma forma que no Delphi. Por que o Java? O Java tem demonstrado seu poder com relação ao mundo multi-platafor- ma. Cada vez mais conhecido no Brasil, muito se tem produzido com Java. Um ponto forte do Java é o fato de grandes empresas estarem investindo nele, como as gigantes Oracle e IBM. Uma das formas deconexãodeumaaplicaçãoJavacomum bancodedadoséatravésdaAPIJDBC. O JDBC, Java Database Connectivi- ty, é uma API Java para conexão com SGDB´s diversos e execução de expres- sões SQL. Sendo mais específico, JDBC é um conjunto de classes e interfaces que permitem acesso a bases de dados rela- cionaisdemaneirauniforme,numasolu- ção similar ao ODBC. Existem inúmeras implementações de drivers de bancos de dados compatíveis com JDBC que se en- quadram em quatro categorias de solu- ções, definidas pela JavaSoft: Tipo 1 – Ponte JDBC / ODBC A ponte JDBC / ODBC foi desenvol- vida em conjunto pela JavaSoft e a In- tersolv, de modo a aproveitar a grande quantidade de drivers ODBC que já exis- tem instalados nas máquinas. Aplicação Java faz uma chamada ao JDBC que por sua vez faz essa chamada ao ODBC e este à API de acesso nativa do banco. Tipo 2 – Driver Java Parcial + API Nativa Nesta solução o driver ODBC é eliminado e o driver JDBC conver- te as chamadas JDBC em chama- das diretas à API nativa do banco. Assim como os drivers do Tipo 1 é necessária a instalação de “apli- cações cliente” do banco de dados na máquina onde está sendo exe- cutado o aplicativo. Tipo 3 – Driver 100% Java + Protocolo de Rede (arquitetu- ra em 3 camadas) NestaconfiguraçãoodriverJDBCcon- verteaschamadasJDBCemumprotoco- lo de rede independente (independente do banco de dados). Estas chamadas são convertidas, então, em chamadas à API nativa do banco por um servidor inter- mediário (middleware). Essa arquitetura na verdade consiste de três camadas. Tipo 4 – Driver 100% Java: Nestasoluçãoodriverconverteascha- madasJDBCdiretamenteparaoprotoco- lo de rede utilizado pelo banco de dados. Escritos somente em Java, estes drivers não necessitam de ODBC nem de API nativa, gerando um enorme ganho de desempenho e permitindo o desenvolvi- mento de aplicações 100% Java. Exemplo em Java Utilizaremos para acessar o mesmo banco de dados dos exemplos em Delphi e VB .Net (NorthWind do SQL Server) um Driver JDBC do tipo 4 denominado Microsoft SQL Server 2000 JDBC Dri- ver, que pode ser baixado no em http:// msdn.microsoft.com/downloads/de- fault.asp?URL=/downloads/sample. asp?url=/MSDN-FILES/027/001/779/ msdncompositedoc.xml. Para exemplificar a conexão em Java, utilizaremos um “console application” onde será mostrado além da conexão a execução de um comando SELECT e o display dos dados retornados na tela. As classes utilizadas e os procedimentos se- rão explicados em seguida. Vale a pena ressaltar que este exemplo mostra uma das formas de acesso e manipulação de dados em Java (listagem1.). NOTA Nesta parte doWizard pode-se utilizar o Query Builder doVisualStudio.Net, uma ferramenta muito interessante para desenvolver consultas SQL.
  • 32. SQL32 - Magazine Inicialmente é declarado um objeto queirárepresentaraconexãocomoban- co de dados, neste exemplo chamado de conn, do tipo Connection. Voltaremos a falar nele adiante. Em seguida é executa- da a seguinte chamada: DriverManager.registerDriver( new com.microsoft.jdbc.sqlserver. SQLServerDriver()); O DriverManager é uma classe que gerencia os drivers registrados no JDBC. Este registro é feito através da chamada ao método estático registerDriver. A partir desse momento, a instância do dri- ver passado como parâmetro passa a ser mantida pelo DriverManager e o driver fica disponível para utilização pela aplica- ção Java. A próxima linha abre uma co- nexão com o banco de dados, que é atri- buída para o objeto conn para ser mani- pulada pela aplicação. conn = DriverManager.getConnection (“jdbc:microsoft:sqlserver:”+ “//servidor:1433;DatabaseName=NorthWind; Selectmethod=cursor”, “usuario”, “senha”); O método estático getConnection tem como parâmetro um String de Conexão, um String que representa o nome do usuário e um último que representa a se- nha do mesmo. O DriverManager verifi- ca se o driver passado na primeira parte de String de Conexão está registrado no JDBC (como descrito anteriormente). Caso o driver esteja registrado é solicita- da a conexão de acordo com os parâme- tros passados na segunda parte do String de Conexão (onde temos o nome do servidor, a porta do listner, o nome do banco a ser acessado e o tipo de seleção) além do usuário e senha. Caso a conexão seja efetuada com sucesso, o objeto conn passa a “apontar” para a mesma. As linhas que seguem enviam o co- mando SQL para o Servidor de Banco de dados para que o mesmo seja compilado noservidorefiqueprontoparaexecução. Este procedimento é executado através do método prepareStatement do objeto conn (instanciado pelo método getCon- nection visto anteriormente). Este mé- todo, se executado com sucesso, retorna um PreparedStatement que é a instância do comando “preparado” no Servidor e, no nosso exemplo, é manipulado pelo objeto pstmt. PreparedStatement pstmt = conn. prepareStatement(“SELECT * FROM EMPLOYESS”); Paraacessarmososdadosdocomando SQL preparado anteriormente é preciso que tenhamos um objeto do tipo Result- Set que é instânciado a partir do método ExecuteQuery() do PreparedStatement, como mostrado a seguir. ResultSet rs = pstmt.executeQuery(); Os procedimentos seguintes executam um “loop” nos dados resultantes do co- mando SQL contidos no ResultSet rs lis- tando na tela os valores das colunas Em- ployeeID, LastName e FirstName. while ( rs.next() ) { System.out.println(rs.getInt(“EmployeeID”)+“-“+ rs.getString(“LastName”) +“,”+ rs.getString(“FirstName”) ); } Por fim, fechamos o PreparedState- ment pstmt e o Connection Conn libe- rando com isso recursos do banco de dados e finalizando a aplicação se forma adequada. É interessante notar que todos os pro- cedimentos referentes a conexão, a exe- cução de comandos e manipulação de dados estão contidas num bloco protegi- do(try...catch)poistodososmétodosuti- lizadospropagamSQLException,quere- presentaumaexceçãoreferenteaoacesso ou manipulação de um banco de dados, Listagem1 import java.sql.*; public class Principal { public static void main (String[] args) { Connection conn = null; try { DriverManager.registerDriver ( new com.microsoft.jdbc.sqlserver.SQLServerDriver()); conn = DriverManager.getConnection (“jdbc:microsoft:sqlserver:”+ “//servidor:1433;DatabaseName=NorthWind;Selectmethod=cursor”, “usuario”, “senha”); } catch (SQLException e) { System.out.println (‘n’+“Erro na conexão com o banco.”); e.printStackTrace(); System.exit(1); } try { PreparedStatement pstmt = conn.prepareStatement(“SELECT * FROM EMPLOYESS”); ResultSet rs = pstmt.executeQuery(); while ( rs.next() ) { System.out.println(rs.getInt(“EmployeeID”) +“ -“ + rs.getString(“LastName”) +“,”+ rs.getString(“FirstName”) ); } pstmt.close(); conn.close(); } catch (SQLException e) { System.out.println (‘n’+“Erro ao recuperar dados no banco.”); e.printStackTrace(); System.exit(1); } } }
  • 33. Conectando Front-Ends com Delphi,VB.Net e Java SQL Magazine - 33 devendo ser tratada pela aplicação. Conclusão Nosso objetivo foi mostrar os procedi- mentos a serem efetuados em cada uma das ferramentas analisadas para conexão e manipulação de dados de um banco no SQL Server, deixando alguns conceitos de forma a facilitar ao analista a definição sobre qual ferramenta usar para cada so- lução a ser implementada. De fato, não será somente a escolha da ferramenta de desenvolvimento que irá definir a melhor forma de implementar um projeto com sucesso. O analista que tiverumdomíniocompletodoproblema proposto pelo cliente (além de conheci- mento e experiência em cada ferramen- ta) terá mais facilidade de escolher qual tecnologia se tornará mais eficiente para resolver o problema em questão. ANUNCIO