Sei sulla pagina 1di 14

UnC Campus Mafra

Sistemas de Informao 4 fase


Banco de Dados II
Aula 01 05/08/2015

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

sentena seja omitida da criao do TRIGGER, o valor padro desta opo


CURRENT_USER();
trigger_name: define o nome do procedimento, por exemplo, trg_test;
trigger_time: define se o TRIGGER ser ativado antes (BEFORE) ou depois (AFTER) do
comando que o disparou;
trigger_event: aqui se define qual ser o evento, INSERT, REPLACE, DELETE ou UPDATE;
tbl_name: nome da tabela onde o TRIGGER ficar "pendurado" aguardando o trigger_event;
trigger_stmt: as definies do que o o TRIGGER dever fazer quando for disparado.

Definir dados de antes (OLD) e depois (NEW)


Em meio aos TRIGGERS temos dois operadores importantssimos que nos possibilitam
acessar as colunas da tabela alvo do comando DML, ou seja, podemos acessar os valores que sero
enviados para a tabela tbl_cliente antes (BEFORE) ou depois (AFTER) de um UPDATE, por exemplo.
Tais operadores nos permitiro ento, ter dois momentos, o antes e o depois e tambm examinar os
valores para que sejam ou no inseridos, atualizados ou excludos da tabela.
Antes mesmo de analisarmos os operadores, temos que analisar vejamos as seguintes
diretrizes:
INSERT: o operador NEW.nome_coluna, nos permite verificar o valor enviado para ser
inserido em uma coluna de uma tabela. OLD.nome_coluna no est disponvel.
DELETE: o operador OLD.nome_coluna nos permite verificar o valor excludo ou a ser
excludo. NEW.nome_coluna no est disponvel.
UPDATE: tanto OLD.nome_coluna quanto NEW.nome_coluna esto disponveis, antes
(BEFORE) ou depois (AFTER) da atualizao de uma linha.

Exemplos
1) Trigger que ir inserir dados na tabela de pontos para cada nova insero na tabela de
clientes:

CREATE TRIGGER add_linha_pontos AFTER INSERT ON tb_usuarios


FOR EACH ROW BEGIN
INSERT INTO tb_pontos SET codigo_usuario=NEW.codigo, pontos='0';
END;

2) Trigger que ir realizar uma validao de campos:

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;

UnC Campus Mafra


Sistemas de Informao 4 fase
Banco de Dados II
Aula 02 12/08/2015

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.

CREATE TRIGGER add_linha_pontos


AFTER INSERT ON tb_usuarios
FOR EACH ROW
BEGIN
INSERT INTO tb_pontos SET codigo_usuario=NEW.codigo,
pontos=0;
END;

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:

mysql> SELECT * FROM INFORMATION_SCHEMA.ROUTINES;

A sintaxe geral para criao de Stored Procedure a seguinte:

CREATE PROCEDURE proc_name([parmetros, ...])


[caractersticas]
[BEGIN]
corpo_da_rotina;
[END]

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.

1) Stored procedure que exibe uma saudao na tela:

DELIMITER $$
DROP PROCEDURE IF EXISTS test.sp_ola
$$
CREATE PROCEDURE test.sp_ola ()
BEGIN
SELECT "OL!";
END$$

DELIMITER ;

Executando a stored procedure:

CALL test.sp_ola;

2) Stored procedure para inserir dados na tabela correntista:

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 ;

Executando a stored procedure:

CALL sp_inserecorrentista;
Ou
CALL sp_inserecorrentista(Emerson Schafhauser, 023.456.789-10);

3) Stored procedure para alterar(atualizar) dados na tabela correntista:

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

UPDATE tb_correntista SET nome =v_nome, cpf =v_cpf


WHERE codigo =v_id;
ELSE
SELECT Os novos NOME e CPF devem ser informados! AS Msg;
END IF;
END $$
DELIMITER ;

Executando a stored procedure:

CALL sp_alteracorrentista(1, Wagner MySQL Bianchi, 123.123.111-11);

4) Stored procedure para alterar(atualizar) dados na tabela correntista:

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 ;

Executando a stored procedure:

CALL sp_deletacorrentista(1);

UnC Campus Mafra


Sistemas de Informao 4 fase
Banco de Dados II
Aula 04 26/08/2015
Functions
Criando funes

mysql> DELIMITER //
mysql> CREATE FUNCTION palavra (texto CHAR(20)) RETURNS CHAR(50)
-> RETURN CONCAT('Voce digitou: ',texto,' !!!');
-> //
mysql> DELIMITER ;

Para testar

mysql> SELECT palavra('oi');


+----------------------+
| palavra('oi')
|
+----------------------+
| Voce digitou: oi !!! |
+----------------------+

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);

Inserindo valores na tabela

mysql> INSERT INTO notas VALUES('Maria', 10, 9, 10, 10);


mysql> INSERT INTO notas VALUES('Pedro', 5, 2, 3, 4);

Criando a funo que calcula a mdia

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

mysql> SELECT media('Maria');


+----------------+
| media('Maria') |
+----------------+
|
9.75 |
+----------------+
mysql> SELECT media('Pedro');
+----------------+
| media('Pedro') |
+----------------+
|
3.5 |
+----------------+

Apagar a funo
Se desejar apagar a funo:

mysql> DROP FUNCTION nome_da_funcao;

UnC Campus Mafra


Sistemas de Informao 4 fase
Banco de Dados II
Aulas 05 02/09/2015
VIEWS
Introduo
Para quem trabalha com desenvolvimento de sistemas e administrao de dados diretos em
bases de dados concentradas em um SGBD como o MySQL, Oracle ou SQL Server, sabe o quanto
trabalhoso ter que escrever e reescrever determinadas consultas todos os dias ou mesmo mais de
uma vez no mesmo dia. Muitas destas consultas so derivadas de vrias tabelas o que nos d um retrabalho ao montar todas aquelas JOINs, utilizar esse ou aquele ndice setado para esta ou aquela
tabela para que tambm a performance de tal consulta tenha um tempo razoavelmente atraente.
Sabemos tambm que a cada momento em que reescrevemos uma mesma consulta,
conseguir os mesmos resultados de antes uma tarefa sria, j que existem vrias formas para se
escrever uma mesma consulta, levando em conta a ordem em que as tabelas aparecem, a ordem dos
campos e tudo mais. Tudo isso implica em ganho ou perda de performance. De fato, quando temos
um grande trabalho de ajuste de performance em uma consulta, podemos rapidamente transformar
esta em uma View, que a partir disso, permanecer armazenada no servidor de bancos de dados em
forma de tabela, para que possamos consult-la todas as vezes que precisarmos, sem ter que
reescrever a mesma.

Mas, o que uma View?


Uma View um objeto que pertence a um banco de dados, baseada em declaraes
SELECTs, retornando uma determinada visualizao de dados de uma ou mais tabelas. Esses
objetos so chamados por vezes de "virtual tables", formada a partir de outras tabelas que por sua
vez so chamadas de "based tables" ou ainda outras Views. E alguns casos, as Views so
atualizveis e podem ser alvos de declarao INSERT, UPDATE e DELETE, que na verdade
modificam sua "based tables".
Os benefcios da utilizao de Views, alm dos j salientados, so:
Uma View pode ser utilizada, por exemplo, para retornar um valor baseado em um
identificador de registro;
Pode ser utilizada para promover restries em dados para aumentar a segurana dos
mesmos e definir polticas de acesso em nvel de tabela e coluna. Podem ser configurados
para mostrar colunas diferentes para diferentes usurios do banco de dados;
Pode ser utilizada com um conjunto de tabelas que podem ser unidas a outros conjuntos de
tabelas com a utilizao de JOINs ou UNION.

Criando Views
Para definir Views em um banco de dados, utilize a declarao CREATE VIEW, a qual tem a
seguinte sintaxe:

CREATE [OR REPLACE] [ALGORITHM = algorithm_type] VIEW


VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]

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;

## criar a viso que retorne todos os


## estados e suas cidades
create view vw_estadosecidades as
select
uf.id as 'Cdigo do Estado',
uf.nome as 'Estado',
uf.sigla as 'Sigla',
uf.regiao as 'Regio',
ci.id as 'Cdigo da Cidade',
ci.nome as 'Cidade',
ci.abreviatura as 'Abreviatura'
from
tb_uf as uf
inner join tb_cidades as ci on
(uf.id = ci.estado)
order by
uf.nome, ci.nome;
## PROCEDURE PARA INSERIR DADOS NA TB_UF (COM VALIDAO)
DELIMITER $$
CREATE PROCEDURE `sp_insereuf`(
nomeuf varchar(25),
siglauf varchar(2),
regiaouf varchar(15))
begin
if ((nomeuf != '') and
(siglauf != '') and
(regiaouf != '')) then
insert into tb_uf (nome, sigla, regiao)
values(nomeuf, siglauf, regiaouf);
select ('Registros inseridos
com sucesso!') as Mensagem1;
else
select ('Os campos no podem ser
nulos') as Mensagem2;
end if;
end$$
DELIMITER ;
## FUNO QUE CONTA O TOTAL DE PESSOAS POR GENERO
DELIMITER $$
CREATE FUNCTION `contagenero`(genero char(1)) RETURNS int(11)
begin
declare totalgenero int;
select count(cli.genero) into totalgenero
from
tb_clientes as cli
where
cli.genero = genero;
return totalgenero;
end$$
DELIMITER ;
## FUNO QUE RETONRA O TOTAL DE PRODUTOS POR MARCA
DELIMITER $$
CREATE FUNCTION `totalprodutosmarca`(nomemarca varchar(25)) RETURNS int(11)
begin
declare totalprodutos int;
select count(pr.id) into totalprodutos
from tb_produtos as pr
inner join tb_marcas as ma on
(pr.marca = ma.id)
where
ma.nome = nomemarca;
return totalprodutos;
end$$
DELIMITER ;

Potrebbero piacerti anche