Você está na página 1de 19

Unidade 1 – Linguagem de Programação em

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 2 MySQL Workbench.

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:

Figura 5 Tipos de dados do MySQL.

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:

1. Pode conter números, letras, “_” (underline) e “$” (cifrão).


2. Não pode conter apenas números.
3. Deve-se evitar nomes que possam ser confundidos com números de notação científica, como,
por exemplo, 10 e 5.
4. Podem estar contidos entre “`” (crase).

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

2 DECLARE NOME VARCHAR(250) DEFAULT NULL;

3 DECLARE ENDERECO VARCHAR(250) DEFAULT NULL;

3 DECLARE CODPAC INT DEFAULT 5;

5 SELECT NOM_PACIENTE, END_PACIENTE

6 INTO NOME, ENDERECO

7 FROM PACIENTE

8 WHERE COD_PACIENTE = CODPAC;

9 END;

Código 2
1 BEGIN

2 DECLARE NOME VARCHAR(250) DEFAULT NULL;

3 DECLARE ENDERECO VARCHAR(250) DEFAULT NULL;

4 DECLARE QTD INT DEFAULT NULL;

5 DECLARE MAX INT;

7 SELECT CON.DATA_ATENDIMENTO

8 ,MED.NOM_MEDICO, COUNT(CON.COD_PACIENTE)

9 INTO NOME, ENDERECO, QTD

10 FROM CONSULTA CON

11 JOIN MEDICO MED ON CON.CRM_MEDICO = MED.CRM_MEDICO

12 WHERE DATA_ATENDIMENTO BETWEEN '2016-03-05 00:00:00'

13 AND '2016-03-05 23:59:59';

14

15 SET MAX = QTD;

16 END;

O SELECT ... INTO


Dentro de um bloco BEGIN … END, ou, melhor dizendo, dentro de um bloco P/SQL, ou seja, um
objeto de programação em banco de dados (function, stored procedure ou trigger), você não poderá
utilizar um comando SELECT comum, pois não haverá como recuperar o seu resultado. No entanto, a
linguagem SQL nos dá uma variante dele que permite recuperar uma linha de cada vez.

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.

MySQL stored procedure variables. MySQL TUTORIAL.

Desenvolvimento. SCRIPTCASE.

Trabalhando com stored procedures. SILVA, M. V.

Codi cando dentro dos subprogramas de banco de dados


Dentro de subprogramas de banco de dados, como gatilhos, funções e procedimentos armazenados,
é possível fazer desvios condicionais e repetições estruturadas como em outras linguagens de
programação, tais como Pascal ou Visual Basic, às quais os comandos da linguagem P/SQL se
assemelham muito – na verdade, parece uma fusão das duas.

Estruturas de decisão
IF ... THEN

O comando IF executa um determinado comando de acordo com o resultado de uma ou mais


condições lógicas, e o seu funcionamento pode ser observado na Figura 6 a seguir (FANDERUFF,
2003):

Figura 6 Estrutura condicional.


O comando IF ... THEN possui a seguinte sintaxe (Código 3):

Código 3

IF condição lógica THEN instrução

[ELSEIF condição lógica THEN instrução] ...

[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

IF SEXO = “M” THEN

COMANDOS PARA SEXO MASCULINO

ELSE

COMANDOS PARA SEXO FEMININO

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

COMANDOS PARA SEXO MASCULINO

ELSEIF SEXO = “F” THEN

COMANDOS PARA SEXO FEMININO

ELSE

COMANDOS PARA CASO DE ERRO

END IF;

Os textos a seguir são compostos por referências diferentes das utilizadas na


confecção desta obra. Neles, você encontrará exemplos e detalhes sobre
estruturas de decisão que não caberiam aqui, mas também merecem a sua
atenção, a m de aperfeiçoar os seus conhecimentos.

Stored procedures no Mysql 5: estruturas condicionais e exemplo prático no vb.net.


DVMEDIA.

MySQL IF statement. MySQL TUTORIAL.

MySQL case expression. MySQL TUTORIAL.

MySQL case statement. MySQL TUTORIAL.

Utilizando case no MySQL. USUÁRIO ROOT.

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

WHEN search_condition THEN statement_list

[WHEN search_condition THEN statement_list] ...

[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

WHEN “M” THEN COMANDOS PARA SEXO MASCULINO

WHEN “F” THEN COMANDOS PARA SEXO FEMININO

ELSE COMANDOS PARA ERRO NO 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.

LOOP ... END LOOP


O comando LOOP cria um loop simples utilizando uma etiqueta (label) no seu início, e é para ela que
o desvio do processamento é feito quando o teste da condição de saída for verdadeiro. Quando o
resultado for falso, o loop é encerrado (MYSQL, 2016; FANDERUFF, 2003; RANGEL, 2003; RANGEL,
2004). A seguir, o Código 8 demonstra a sintaxe do comando LOOP e o Código 9 demonstra um
bloco de repetição do comando LOOP que será executado enquanto A < 10.

Código 8

[begin_label:] LOOP

statement_list

END LOOP [end_label]


Código 9

1 BEGIN

2 INICIO: LOOP

3 SET A = A + 1;

4 IF A < 10 THEN

5 ITERATE INICIO;

6 END IF;

7 LEAVE INICIO;

8 END LOOP INICIO;

9 SET @x = A;

10 END;

REPEAT ... END REPEAT


O comando REPEAT realiza um loop com teste lógico no final. Isso garante que, pelo menos uma
vez, os comandos dentro do loop serão executados e somente depois será realizado o teste de
verificação de saída. Quando o valor de saída é atingido e o teste lógico retorna verdadeiro, o loop é
encerrado (MYSQL, 2016; FANDERUFF, 2003; RANGEL, 2003; RANGEL, 2004).

A seguir, o Código 10 demonstra a sintaxe do comando REPEAT e o Código 11 demonstra um bloco


de repetição do comando REPEAT que será executado até que @y > A. O detalhe é que, pelo menos
uma vez, o bloco será executado.

Código 10

[begin_label:] REPEAT

statement_list

UNTIL search_condition

END REPEAT [end_label]

Código 12
1 SET A = 5;

2 SET @Y = 0;

3 REPEAT

4 SET @Y = @Y + 1;

5 UNTIL @Y > A END REPEAT;

WHILE condição DO ... END WHILE


O comando WHILE realiza um loop com teste lógico no INÍCIO. Isso garante que, se o teste der
resultado falso, os comandos dentro do loop nunca serão executados. Quando o valor de saída é
atingido e o teste falso retorna verdadeiro, o loop é encerrado (MYSQL, 2016; FANDERUFF, 2003;
RANGEL, 2003; RANGEL, 2004).

A seguir, o Código 13 demonstra a sintaxe do comando WHILE e o Código 14 demonstra um bloco de


repetição do comando WHILE que será executado até que a VARIAVEL1 > 0. O valor inicial da
VARIAVEL1 é 5, e, a cada iteração, 1 é subtraído dela.

Código 13

[begin_label:] WHILE search_condition DO

statement_list

END WHILE [end_label]

Código 14

1 DECLARE VARIAVEL1 INT DEFAULT 5;

3 WHILE VARIAVEL1 > 0 DO

4 …

5 SET VARIAVEL1 = VARIAVEL1 - 1;

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.

MySQL loop in stored procedures. MySQL TUTORIAL.

While. TOAD WORLD.

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

O MySQL possui somente o tipo explícito de cursores. Deve-se, primeiro, declarar um


IDENTIFICADOR e um comando SELECT, como pode ser visto na sintaxe a seguir (Código 15):

Código 15

DECLARE < identificador > CURSOR FOR < consulta >;

O IDENTIFICADOR é o nome do cursor, e CONSULTA é o comando SELECT, que retornará o array


para a memória e que será percorrido por comandos de repetição (MYSQL, 2016). Vejamos o Código
16 a seguir:

Código 16
1 BEGIN

2 DECLARE done INT DEFAULT FALSE;

3 DECLARE a CHAR(16);

4 DECLARE b, c INT;

5 DECLARE CURSOR1 CURSOR FOR SELECT id,data FROM ESTOQUE.COMPRAS;

6 DECLARE CURSOR2 CURSOR FOR SELECT i FROM ESTOQUE.PRODUTOS;

7 DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

8 OPEN cur1;

9 OPEN cur2;

10

11 read_loop: LOOP

12 FETCH CURSOR1 INTO a, b;

13 FETCH CURSOR2 INTO c;

14 IF done THEN

15 LEAVE read_loop;

16 END IF;

17 IF b < c THEN

18 INSERT INTO ESTOQUE.ESTOQUEP VALUES (a,b);

19 ELSE

20 INSERT INTO ESTOQUE.ESTOQUEP VALUES (a,c);

21 END IF;

22 END LOOP;

23

24 CLOSE CURSOR1;

25 CLOSE CURSOR2;

26 END;
26 END;

Os textos a seguir são compostos por referências diferentes das utilizadas na


confecção desta obra. Neles, você encontrará exemplos diferentes sobre cursores
que não foram exibidos no decorrer dos estudos desta unidade e que merecem a
sua atenção, a m de aperfeiçoar os seus conhecimentos.

Cursor. MILANI, A.

MySQL cursor. MySQL TUTORIAL.

Criando uma procedure com cursor no MySQL. TSQL MASTER.

Cursores em MySql. ZACHI, V.

Vídeo complementar
Neste momento, é fundamental que você assista ao vídeo complementar para aprofundar os
conteúdos tratados nesta unidade.

Programação em Banco de Dados -


Complementar1
de Claretiano - Rede de Educação

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 ____.

A opção que preenche corretamente as lacunas é:

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á!

© 2018 Programação em Banco de Dados-CRC | Claretiano