Banco de Dados
Objetivos
Definir as variáveis locais em procedimentos e funções armazenadas.
Compreender os comandos de decisão e repetição utilizados para controlar os fluxos de
dados dentro dos programas armazenados no banco de dados.
Conteúdos
Definição de variáveis locais em MySQL.
Alocação de dados em variáveis locais em MySQL.
Comandos de decisão em MySQL.
Comandos de repetição em MySQL.
Como a linguagem SQL deveria ser padronizada, mas, na verdade, ela não é, experimente
desenvolver este mesmo banco de dados aqui proposto para MySQL/MariaDB em outros
SGBDs, como, por exemplo, o FireBird ou o PostgreeSQL, que são livres, ou, ainda, o
Oracle, o DB2 ou o Microsoft SQL Server, que são proprietários, para observar as
diferenças e semelhanças sutis na linguagem SQL deles.
Introdução
Vamos iniciar nossa primeira unidade de estudo. Você está preparado?
Nesta unidade, retomaremos a construção do banco de dados da clínica médica (Figura 1) que você
viu em Linguagem SQL. Caso você não tenha mais esse banco, procure o seu tutor e veja se ele tem
o script de criação para o SGBD MySQL, que é o SGBD que tomaremos como referência nesta obra,
ou seja, todos os comandos seguirão a sintaxe da linguagem SQL do SGBD (Sistema Gerenciador de
Banco de Dados MySQL). Para outros SGBDs, você precisará fazer adaptações nos códigos aqui
apresentados. Algumas observações serão feitas já considerando algumas diferenças para alguns
SGBDs, mas, de forma alguma, poderíamos ter a pretensão de conseguir abranger todos os SGBDs
existentes.
Figura 1 Sistema da clínica médica.
O MySQL e o MariaDB
O banco de dados da clínica médica, cujo projeto pode ser observado na Figura 1, foi modelado para
o SGBD MySQL MariaDB. O MySQL é um SGBD (Sistema Gerenciador de Bancos de Dados) que
utiliza a linguagem SQL e é um dos mais populares atualmente. Dentre seus usuários mais famosos,
destacam-se a NASA, o Banco Bradesco, a Nokia e a Sony, por exemplo. Ele foi criado na Suécia, e,
em 2008, a MyAB, desenvolvedora do MySQL, foi vendida para a Sun Microsystems, que, por sua
vez, foi vendida, em 2009, para a Oracle, com todos os seus produtos, incluindo o MySQL, que se
tornou uma marca registrada da Oracle.
O nome “MySQL”, assim como o nome do mecanismo de armazenamento MyISAM, vem do nome da
primeira filha do fundador da MySQL (Michael “Monty” Widenius), que se chama My. O MariaDB
continuou essa tradição ao ser nomeado com o nome de sua filha mais nova, Maria (WIKIPÉDIA,
2016; MARIADB, 2016).
Ferramentas de acesso
Para gerenciar o MySQL, será preciso utilizar uma ferramenta de administração. As duas mais
conhecidas são o MySQL Workbench (Figura 2), desenvolvida pela própria Oracle e disponível para
download gratuitamente no seu site, mediante um simples cadastro, ou o phpMyAdmin (Figura 3),
uma ferramenta web desenvolvida em PHP e utilizada nas pilhas de software XAMPP, WAMPP,
VertrigoServ, EasyPHP etc., todas elas oferecendo o Apache, MySQL, PHP e phpMyAdmin juntos.
Se preferível, há, ainda, dois apps (Pallapa Web Server e Andro PHP [Figura 4]) que permitem utilizar
a pilha lighttpd, PHP, MySQL e phpMyAdmin no Android a partir do 2.2 – Foyo. O lighttpd é um
servidor para ambientes de alta performance, com baixa utilização de memória e bom gerenciamento
de carga de CPU e opções avançadas, como CGI, FastCGI, SCGI, SSL, reescrita de URL, entre
outras, estando em pé de igualdade com outros servidores, como o Apache (WIKIPÉDIA, 2016).
Dentre todas essas ferramentas, a melhores opções são o XAMPP, pois possui versões para
Windows, Linux, Apple e Windows portáteis, ou seja, que você carrega em seu pendrive, ou o MySQL
Workbench, que possui versões para Windows e Linux.
Independentemente de qual ferramenta e da versão que você escolher, o funcionamento será sempre
idêntico. Mais detalhes estão nos Apêndices A e B, que foram disponibilizados juntamente com o
material da disciplina Linguagem SQL.
Por questão de precaução, a sugestão é que você sempre utilize, nos comandos SQL, letras em caixa
alta, ou seja, letras maiúsculas, pois os sistemas derivados do UNIX (Linux, FreBSD, iOS etc.) são
case sensitive, ou seja, diferenciam caixa alta (letras maiúsculas) de caixa baixa (letras minúsculas);
assim, caso você utilize letras minúsculas no nome de uma tabela, digamos “cliente”, e hospede esse
banco de dados em um provedor na nuvem (cloud computing – internet) que use um desses sistemas
operacionais ao invés de Windows, quando você emitir seus comandos DML (Data Manipulation
Language), caso eles não estejam também em caixa baixa, poderão gerar erros por não encontrarem
a tabela, pois procurarão por uma tabela com nome em letras maiúsculas (“CLIENTE”) e ela estará
criada em letras minúsculas (“cliente”)! Isto é grave e difícil de identificar. Portanto, evite transtornos
padronizando a caixa alta em seus comandos em linguagem SQL.
Figura 3 phpMyAdmin.
Figura 4 Andro PHP.
Variáveis Locais
Você pode definir variáveis de memória dentro de funções e procedimentos em MySQL. Para isso,
essas variáveis devem ter os mesmos tipos de dados possíveis das colunas das tabelas do MySQL.
Esse raciocínio pode ser extrapolado para os demais SGBDs existentes. Na Figura 5 a seguir, temos
os principais tipos de dados do MySQL MariaDB:
O MySQL tem uma particularidade no tipo TIMESTAMP: ele é atualizado com a data
e a hora do sistema toda vez que qualquer outra coluna da tabela for atualizada,
como uma espécie de log da atualização.
Uma variável local deve ser declarada dentro de um bloco BEGIN … END. As variáveis poderão ser
utilizadas, por exemplo, em comandos SELET … INTO. O MySQL interpreta o IDENTIFICADOR
como uma referência à variável. Para definir o IDENTIFICADOR, há algumas regras que devem ser
seguidas, das quais, destacamos as principais:
Para atribuir um valor a uma variável, deve-se utilizar o comando SET e o sinal de “=”, conforme pode
ser observado nos Códigos 1 e 2 a seguir:
Código 1
1 BEGIN
7 FROM PACIENTE
9 END;
Código 2
1 BEGIN
7 SELECT CON.DATA_ATENDIMENTO
8 ,MED.NOM_MEDICO, COUNT(CON.COD_PACIENTE)
14
16 END;
O detalhe desse comando é que, se ele retornar mais de uma linha, será emitido um erro, e, se não
retornar nenhuma linha, será emitida uma outra mensagem de erro. Dessa forma, o seu SELECT
deve garantir que apenas uma linha seja retornada ou você deverá tratar esses erros para que a
aplicação não seja abortada abruptamente.
A forma de tratar os erros em MySQL será abordada na Unidade 3, quando veremos a criação de
stored procedures, necessárias para o uso dessa técnica (MYSQL, 2016; RANGEL, 2004).
Os textos a seguir são compostos por referências dos fabricantes dos SGBDs
utilizados neste material. Estas são as entidades que detêm o maior nível de
conhecimento possível sobre eles. Nelas, você encontrará a de nição de variáveis
em linguagem SQL, bem como exemplos e detalhes que não caberiam aqui, mas
que merecem a sua atenção, a m de aperfeiçoar os seus conhecimentos.
MySQL – variáveis locais e tratamento de erros em stored procedures – parte 02. BIANCHI,
W.
Desenvolvimento. SCRIPTCASE.
Estruturas de decisão
IF ... THEN
Código 3
[ELSE instrução]
END IF
As cláusulas ELSEIF e ELSE são opcionais e serão executadas apenas se a primeira condição lógica
do IF não for verdadeira. A cláusula ELSEIF realiza um novo teste lógico, e podem ser utilizadas
quantas cláusulas desse tipo forem necessárias numa sequência de ELSEIFs, testando, assim, todas
as opções possíveis.
Normalmente, esta é uma das falhas de segurança do software e é uma das fraquezas exploradas
pelos invasores mal-intencionados. Quando existem duas opções apenas para um campo, vamos
supor “F” e “M” para a coluna SEXO, muitos desenvolvedores testam da seguinte forma (Código 4):
Código 4
ELSE
END IF;
Entretanto, o invasor não precisa enviar necessariamente “F” para acessar o lado FEMININO, e, sim,
enviar qualquer letra diferente de “M”. Muito cuidado com isso! Teste as duas opções e deixe o
ELSE para o ERRO. O código correto para essa situação é conforme veremos no Código 5:
Código 5
IF SEXO = “M” THEN
ELSE
END IF;
CASE
O comando CASE tem a mesma função do comando IF, mas com a vantagem de poder ser utilizado
da mesma forma em um comando SELECT. O comando CASE avalia várias opções e executa o
comando referente a apenas uma delas. Sua sintaxe é (Código 6):
Código 6
CASE
[ELSE statement_list]
END CASE
A título de comparação, faremos o mesmo exemplo do campo SEXO com o comando CASE. Da
mesma forma, o cuidado de testar todas as opções e deixar o ELSE para o erro deve ser tomado,
assim como fora no comando IF ... THEN (MYSQL, 2016; FANDERUFF, 2003; RANGEL, 2003;
RANGEL, 2004). Vejamos, então, o seguinte exemplo no Código 7:
Código 7
CASE SEXO
END CASE;
Estruturas de repetição
O MySQL dispõe de três estruturas de repetição (iteração), a saber: o loop, o whille e o repeat. Outros
SGBDs (Sistemas Gerenciadores de Bancos de Dados) ainda dispõem do for, que, geralmente, é
semelhante ao encontrado no Pascal ou Visual Basic.
Código 8
[begin_label:] LOOP
statement_list
1 BEGIN
2 INICIO: LOOP
3 SET A = A + 1;
4 IF A < 10 THEN
5 ITERATE INICIO;
6 END IF;
7 LEAVE INICIO;
9 SET @x = A;
10 END;
Código 10
[begin_label:] REPEAT
statement_list
UNTIL search_condition
Código 12
1 SET A = 5;
2 SET @Y = 0;
3 REPEAT
4 SET @Y = @Y + 1;
Código 13
statement_list
Código 14
4 …
6 END WHILE;
Os textos a seguir são compostos por referências diferentes das utilizadas na confecção desta obra.
Neles, você encontrará exemplos detalhados sobre estruturas de repetição que não foram abordados
no decorrer dos estudos desta unidade e que merecem a sua atenção, a fim de aperfeiçoar os seus
conhecimentos.
MySQL cursors and loops. GRAVELLE, R.
Cursores
Em Ciência da Computação, um cursor de banco de dados é uma estrutura de controle que permite
percorrer um conjunto de registros em um banco de dados na memória RAM do servidor, composta
por 0 ou mais linhas de dados. Os cursores facilitam o processamento em operações, tais como
recuperação, adição e remoção de registros da base de dados. Os cursores não estão presentes em
todos os SGBDs e podem ser de dois tipos: explícitos e implícitos (FANDERUFF, 2003; RANGEL,
2003; WIKIPÉDIA, 2016).
Cursores explícitos
Segundo Fanderuff (2003), “Cursores Explícitos são utilizados para a execução de consultas que
possam retornar nenhuma ou mais de uma linha. Nesse caso, o cursor deve ser declarado
explicitamente na área de declarações (Declare)”.
No MySQL, o tratamento de erros é feito utilizando um recurso chamado HANDLER, que pode ser
declarado da mesma forma que uma variável local, e uma condição deve ser criada para que uma
mensagem seja retornada quando um SQLSTATE for disparado pelo banco de dados.
Um SQLSTATE é exibido sempre que um erro é enviado para o usuário ou quando ele executa uma
operação que viola as regras de integridade dos dados, como tentar inserir uma chave primária
duplicada, por exemplo (BIANCHI, 2016; MYSQL, 2016).
Código 15
Código 16
1 BEGIN
3 DECLARE a CHAR(16);
4 DECLARE b, c INT;
8 OPEN cur1;
9 OPEN cur2;
10
11 read_loop: LOOP
14 IF done THEN
15 LEAVE read_loop;
16 END IF;
17 IF b < c THEN
19 ELSE
21 END IF;
22 END LOOP;
23
24 CLOSE CURSOR1;
25 CLOSE CURSOR2;
26 END;
26 END;
Cursor. MILANI, A.
Vídeo complementar
Neste momento, é fundamental que você assista ao vídeo complementar para aprofundar os
conteúdos tratados nesta unidade.
01:42
Questões Autoavaliativas
A autoavaliação pode ser uma ferramenta importante para você testar o seu desempenho. Aqui você
encontrará algumas questões de múltipla escolha e que estão diretamente relacionadas aos
conteúdos apresentados nesta unidade.e encontrar dificuldades em respondê-las, faça uma revisão
dos conteúdos estudados para sanar as suas dúvidas.
Para obter o controle do fluxo em um subprograma no MySQL, você pode utilizar os comandos
____ e ____.
LOOP e REPEAT.
IF e LOOP.
IF e CASE
CASE e REPEAT
CASE e IF
Responder
Considerações
Chegamos ao final da primeira unidade, na qual você teve a oportunidade de verificar a criação de
variáveis e os comandos de controle de fluxo em MySQL para a criação de subprogramas em banco
de dados, tendo a oportunidade de iniciar seu aprendizado sobre a programação em linguagem SQL.
Foram apresentados os comandos para criação e atribuição de valores a variáveis, comandos de
controle de fluxo de decisão (IF e CASE) e comandos de controle de repetições (LOOP, REPEAT e
WHILE), além da criação de cursores.
Na próxima unidade, você aprenderá a criar funções no MySQL, e esses conhecimentos aprendidos
na Unidade 1 serão fundamentais para o bom prosseguimento e aprendizado dos novos comandos
que serão apresentados a você.
Até lá!