Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Reviso
Bancos de Dados
Um sistema de banco de dados caracteriza-se por um sistema computadorizado de
armazenamento de registros, ou seja, um repositrio para uma coleo de arquivos de dados
computadorizados. De forma abstrata, podemos comparar um sistema de banco de dados a um
arquivo de metal onde ficam armazenadas pastas com diversos formulrios.
Os usurios deste sistema podem efetuar diversas operaes sobre esses arquivos como:
Inserir novos arquivos vazios;
Inserir novos dados nos arquivos existentes;
Buscar dados;
Alterar dados;
Eliminar dados e
Remover arquivos existentes dentro do banco de dados;
Linguagem SQL
SQL Structured Query Language uma linguagem de definio e manipulao de dados
relacionais, desenvolvida nos laboratrios da IBM na dcada de 70 e hoje padronizada pelos comits
ISO/Ansi. Em resumo podemos dizer que se trata de uma linguagem padro de comunicao com
base de dados que nos permite trabalhar com qualquer tipo de linguagem (ASP, PHP, C/C++, Java) e
com qualquer tipo de sistemas gerenciadores de bases de dados (SQL Server, MySQL, Oracle).
- DDL: Linguagem de Definies de Dados o subconjunto da linguagem SQL que trata das
operaes/comandos que definem objetos dentro do banco de dados: create, alter e drop;
- DML: Linguagem de Manipulao de Dados um subconjunto da linguagem SQL usada
para inserir, apagar e atualizar os dados dentro de um banco de dados. Basicamente constituda
das seguintes operaes/comandos: insert, update, delete e select;
Triggers
Um TRIGGER ou gatilho um objeto de banco de dados, associado a uma tabela, definido
para ser disparado, respondendo a um evento em particular. Tais eventos so os comandos da DML
(Data Manipulation Language): INSERT, REPLACE, DELETE ou UPDATE. Podemos definir inmeros
TRIGGERS em uma base de dados baseados diretamente em qual dos comandos acima ir disparlo, sendo que, para cada um, podemos definir apenas um TRIGGER. Os TRIGGERS podero ser
disparados para trabalharem antes ou depois do evento.
Podemos definir os TRIGGERS para serem disparados, por exemplo, antes (BEFORE) ou
depois (AFTER) de um INSERT. Agora sabemos ento que para cada momento BEFORE ou AFTER,
podemos ter um TRIGGER a ser disparado para defender alguma lgica.
A sintaxe geral de definio de um TRIGGER a seguinte:
CREATE
[DEFINER = { user | CURRENT_USER }]
TRIGGER trigger_name trigger_time trigger_event
ON tbl_name FOR EACH ROW trigger_stmt
DEFINER: Quando o TRIGGER for disparado, esta opo ser checada para checar com
quais privilgios este ser disparado. Utilizar os privilgios do usurio informado em user
(fulano@localhost) ou os privilgios do usurio atual (CURRENT_USER). Caso essa
Exemplos
1) Trigger que ir inserir dados na tabela de pontos para cada nova insero na tabela de
clientes:
DELIMITER |
CREATE TRIGGER tr_validanome BEFORE INSERT ON tb_clientes
FOR EACH ROW
BEGIN
SET @nome = NEW.nome;
IF ((CHAR_LENGTH(@nome) <= 4) OR (@nome = )) THEN
SET NEW.nome=NULL;
END IF;
END|
DELIMITER;
Triggers
Prtica 1: criar uma trigger para o cenrio abaixo, onde a cada nova insero na tabela de usurios
ser tambm inserido um novo registro na tabela de pontos.
Prtica 2: criar uma trigger que far uma validao de dados sobre o campo nome.
DELIMITER |
CREATE TRIGGER tr_validanome
BEFORE INSERT ON tb_clientes
FOR EACH ROW
BEGIN
SET @nome = NEW.nome;
IF ((CHAR_LENGTH(@nome) <= 4) OR (@nome = )) THEN
SET NEW.nome=NULL;
END IF;
END |
DELIMITER ;
Stored Procedures
Stored procedures ou procedimentos armazenados so "programas armazenados no
servidor, pr-compilados, chamados de forma explcita para executar alguma lgica de manipulao
de dados, podendo retornar ou no algum valor".
No caso do SGBD MySQL as stored procedures quando criados e compilados, so inseridos
em uma tabela chamada ROUTINES no banco de dados INFORMATION_SCHEMA, que o
dicionrio de dados do MySQL. Para listarmos todos os stored routines (Stored Procedure e
Functions), basta emitirmos o seguinte comando no mysql client:
proc_name: seu procedimento armazenado deve ter um nome, para quando for chamado, podermos
ento us-lo;
tipo_param: existem 3 tipos de parmetros em uma Stored Procedure no MySQL:
IN => este um parmetro de entrada, ou seja, um parmetro cujo seu valor ser utilizado no
interior do procedimento para produzir algum resultado;
OUT => est parmetro retorna algo de dentro do procedimento para o lado externo,
colocando os valores manipulados disponveis na memria ou no conjunto de resultados;
INOUT => faz os dois trabalhos ao mesmo tempo!
parmetros: nessa parte do procedimento, informaremos os parmetros da seguinte forma: [IN | OUT
| INOUT] nome_parametro tipo_dado.
caractersticas: as caractersticas do procedimento pode apresentar. Como no utilizaremos
inicialmente tais caractersticas, vamos nos ater a sintaxe principal. Questes de segurana, se
determinstica ou no, qual a linguagem que estamos utilizando e se nosso procedimento modificar
dados na banco de dados, so algumas das caractersticas que poderemos definir neste item que
abordaremos com mais detalhe na parte dois do artigo.
corpo_da_rotina: onde so definidos os comandos SQL que faro alguma manipulao e/ou
defendero alguma lgica, podendo retornar ou no algum resultado.
DELIMITER $$
DROP PROCEDURE IF EXISTS test.sp_ola
$$
CREATE PROCEDURE test.sp_ola ()
BEGIN
SELECT "OL!";
END$$
DELIMITER ;
CALL test.sp_ola;
DELIMITER $$
CREATE PROCEDURE sp_inserecorrentista(v_nome VARCHAR(60), v_cpf
VARCHAR(20))
BEGIN
IF ((v_nome != ) && (v_cpf != )) THEN
INSERT INTO tb_correntista (nome, cpf)
VALUES (v_nome, v_cpf);
ELSE
SELECT NOME e CPF devem ser fornecidos para o cadastro! AS Msg;
END IF;
END$$
DELIMITER ;
CALL sp_inserecorrentista;
Ou
CALL sp_inserecorrentista(Emerson Schafhauser, 023.456.789-10);
DELIMITER $$
CREATE PROCEDURE sp_alteracorrentista(v_id INT, v_nome VARCHAR(60),
v_cpf VARCHAR(20))
BEGIN
IF (((v_id > 0) && (v_id != ) ) && (v_nome != ) && (v_cpf != )) THEN
DELIMITER $$
CREATE PROCEDURE sp_deletacorrentista(v_id INT)
BEGIN
IF ((v_id > 0) && (v_id != )) THEN
DELETE FROM tb_correntista WHERE codigo=v_id;
ELSE
SELECT O identificador do registro no foi informado! AS Msg;
END IF;
END $$
DELIMITER ;
CALL sp_deletacorrentista(1);
mysql> DELIMITER //
mysql> CREATE FUNCTION palavra (texto CHAR(20)) RETURNS CHAR(50)
-> RETURN CONCAT('Voce digitou: ',texto,' !!!');
-> //
mysql> DELIMITER ;
Para testar
Segundo exemplo
Vamos criar uma tabela que contenha os nomes dos alunos de certa disciplina com as notas
de quatro bimestres, mostrando a mdia final.
Criando a tabela
mysql> CREATE TABLE notas(aluno VARCHAR(10), nota1 INT, nota2 INT, nota3 INT, nota4 INT);
mysql> DELIMITER //
mysql> CREATE FUNCTION media (nome VARCHAR(10))
-> RETURNS FLOAT
-> DETERMINISTIC
-> BEGIN
-> DECLARE n1,n2,n3,n4 INT;
-> DECLARE med FLOAT;
-> SELECT nota1,nota2,nota3,nota4 INTO n1,n2,n3,n4 FROM notas WHERE aluno = nome;
-> SET med = (n1+n2+n3+n4)/4;
-> RETURN med;
-> END
-> //
mysql> DELIMITER ;
Testar a funo
Apagar a funo
Se desejar apagar a funo:
Criando Views
Para definir Views em um banco de dados, utilize a declarao CREATE VIEW, a qual tem a
seguinte sintaxe:
view_name: o nome que damos ao objeto View que criarmos. Esse nome poder ser no
qualificado, quando criado no banco de dados corrente ou totalmente qualificado quando criarmos em
um banco de dados que no est definido no contexto atual (db_name.view_name).
column_list: recurso para que possamos sobrescrever os nomes das colunas que sero
recuperadas pela declarao SELECT;
select_statement: a sua declarao SELECT e indica a forma na qual voc deseja que os dados
sejam retornados. Tal declarao dever indicar a forma a qual voc deseja retornar os dados,
podendo ser utilizado funes, JOINs e UNION. Podem ser utilizadas quaisquer tabelas ou views
contidas no servidor de bancos de dados MySQL;
OR REPLACE: pode ser utilizada para substituir uma View de mesmo nome existente no banco de
dados ao qual ela pertence. Pode-se utilizar ALTER TABLE para o mesmo efeito;
ALGORITHM: essa clusula define qual algoritmo interno utilizar para processar a View quando a
mesma for invocada. Estes podem ser UNDEFINED (clusula em branco), MERGE ou TEMPTABLE.
WITH CHECK OPTION: todas as declaraes que tentarem modificar dados de uma view definida
com essa clusula sero revisadas para checar se as modificaes respeitaro a condio WHERE,
definida no SELECT da View.
Ao criar uma View, um arquivo com extenso ".frm", com o mesmo nome desta tambm
criado no diretrio do banco de dados, sob o diretrio de dados do MySQL (datadir).
Definindo Views
Para iniciarmos com a mo na massa, definiremos uma View simples para listar cidades da
tabela City, do banco de dados World:
Podemos explicar que, a partir desse momento, se dermos um SHOW TABLES no banco de
dados World, veremos que uma tabela adicional foi criada, que a View que criamos. Para uma
conceituao mais ampla, uma View um mapeamento lgico de vrias tabelas contidas em um ou
mais bancos de dados que por sua vez esto em um servidor MySQL. No caso da View criada no
passo anterior temos uma tabela virtual (vw_viewCity) baseada em uma tabela chamada de base
(City). Um bom exemplo para utilizarmos a tal lista de colunas criar a mesma View, mas agora
sobrescrevendo o nome da coluna "Name" para "Cidade", como segue abaixo:
Nossa inteno foi boa, mas faltou um pouco mais de anlise. Teremos que sobrescrever
tambm a View, pois j existe uma outra com o mesmo nome. Portanto, usaremos o OR REPLACE
para facilitar nossa vida:
Podemos criar Views mais sofisticadas, com um comando SELECT mais trabalhado, podendo
utilizar das clusulas WHERE, GROUP BY, HAVING e ORDER BY. Alguns SGBDs comerciais no
permitem a utilizao de ORDER BY em meio ao SELECT na definio de uma View, a exemplo do
SQL Server, da Microsoft. Abaixo temos uma consulta mais trabalhada para a criao de uma View,
envolvendo as tabelas Country e CountryLanguage do banco de dados World.
SCRIPTS
## 1) criar uma viso que retorne todos os produtos
##
com suas marcas
create view vw_produtosemarcas as
select
pr.id as 'CodigoProduto',
pr.tipo as 'TipoProduto',
pr.modelo as 'ModeloProduto',
pr.precovenda as 'PrecoProduto',
pr.cor as 'CorProduto',
pr.peso as 'PesoProduto',
pr.descricao as 'DescricaoProduto',
ma.id as 'CodigoMarca',
ma.nome as 'Marca',
ma.nacionalidade as 'NacionalidadeMarca',
ma.observacao as 'ObsMarca'
from
tb_produtos as pr
inner join tb_marcas as ma on
(pr.marca = ma.id)
order by
ma.nome, pr.tipo, pr.modelo;
## 2) criar uma viso que retorne todos os clientes
##
com suas cidades e estados
create view vw_clientesecidadesestados as
select
cl.id as 'CodigoCliente',
cl.nome as 'Cliente',
cl.nascimento as 'Nascimento',
cl.cpf as 'CPFCliente',
uf.id as 'CodigoEstado',
uf.nome as 'Estado',
uf.regiao as 'Regiao',
ci.id as 'CodigoCidade',
ci.nome as 'Cidade'
from
tb_clientes as cl
inner join tb_cidades as ci on
(cl.cidade = ci.id)
inner join tb_uf as uf on
(ci.estado = uf.id)
order by
cl.nome;
## 3) criar uma viso que retorne todos os vendedores
##
com suas cidades e estados
create view vw_vendedoresecidadesestados as
select
ve.id as 'CodigoVendedor',
ve.nome as 'Vendedor',
ve.dt_nasc as 'Nascimento',
ve.cpf as 'CPFVendedor',
ve.dt_admissao as 'DataAdmissao',
uf.id as 'CodigoEstado',
uf.nome as 'Estado',
uf.regiao as 'Regiao',
ci.id as 'CodigoCidade',
ci.nome as 'Cidade'
from
tb_vendedores as ve
inner join tb_cidades as ci on
(ve.cidade = ci.id)
inner join tb_uf as uf on
(ci.estado = uf.id)
order by
ve.nome;