Sunteți pe pagina 1din 55

Algoritmos e Linguagem de

Procedimentos
Prof.: Marcos Vincius G. Vieira, MSc

Ementa da Aula
Objetivos:
O que mysql
O que uma Stored Procedure
Caractersticas do mysql
Funes internas
Criando procedures
Criando funes

O que MySQL?
um servidor de bancos de dados SQL
(Structured Query Language - Linguagem
Estruturada para Pesquisas) muito rpido,
multi-tarefa e multi-usurio.

O que uma Stored Procedure?


Uma stored procedure (SP) um conjunto de
comandos SQL que podem ser armazenados no
servidor, de forma a permitir um aumento no
desempenho das aplicaes visto que h uma
reduo no volume de informaes entre o
servidor e o cliente(aplicao).

Caractersticas

Multi-plataforma;
Utiliza padro ANSI/ISO SQL;
Open Source (GPL ou Comercial License);
Rpido, confivel, e fcil de usar;
Mecanismos de armazenamento transacional
e no transacional;
Suporte a operadores e funes;

Caractersticas
Trabalha com bancos de dados enormes (mais
de 60.000 tabelas e 5 milhes de registros);
At 32 ndices por tabela (composto de 1 a 16
colunas);
Mensagens em vrios idiomas;
Escolha de codificao para gravar dados;
API's em vrias linguagens (p.e. C, C++, Eiffel,
Java, Perl, PHP, Python, Ruby e Tcl);

Caractersticas
Outras funcionalidades:
Gatilhos (triggers);
Stored procedures;
Vises (views);
Joins otimizados;
Sistema de privilgios.

Stored Procedures
recurso disponvel a partir da verso MySQL
5.0;
conjunto de comandos SQL que podem ser
armazenados no servidor;
aumento no desempenho: menos informao
enviada entre cliente/servidor;
mais trabalho para o servidor.

Motivos para Utilizar


Clientes em diferentes linguagens;
Operaes repetitivas e
Segurana.

Antes de Iniciar
Abrir o SGBD MySQL;
Abrir o aplicativo MySQL Query Browser;
Criar uma Database;
Create Database POS;

Aloca o Database para utilizao;


Use POS;

Antes de Iniciar
DELIMITER //
-- Verificar a verso do banco (um exemplo de
funo) >= 5.0
select version()
DELIMITER ;

Iniciando
Delimiter //
CREATE TABLE empresas (
codigo integer auto_increment,
nome varchar(50),
primary key(codigo)
) engine=innodb //
Delimiter ;

Iniciando
Delimiter //
CREATE TABLE pessoas (
codigo integer auto_increment,
nome varchar(50),
empresa integer, salario real,
primary key(codigo),
foreign key(empresa) references empresas(codigo))
engine=innodb //
Delimiter ;

Inserindo dados
Inserir dados na tabela empresas
Delimiter //
INSERT INTO empresas ( nome)
VALUES ('Solis'),
('Unisinos'),
('Univates'),
('Governo FEDERAL')
Delimiter ;

Inserir dados
Inserir dados na tabela pessoas
Delimiter //
INSERT INTO pessoas (nome, empresa, salario) VALUES
('Nasair Silva',1,100),
('Joice',1,200),
('Daniel',1,300),
('Leonardo',2,400), ('Andra','2',500),
('Cesar',3,600),
('Viviane',3,700),
('Roberto Jefferson',4,3000),
('Luis Incio',4,5000)
Delimiter ;

Procedimentos e Funes
Procedimentos
chamado usando a instruo CALL;
valores de retorno somente com variveis de
sada;

Funes
podem retornar valor escalar ;
pode ser utilizado da mesma forma que funo
interna;

Funes Bsicas
AVG (Mdia)
SELECT avg(salario) FROM pessoas;
SELECT empresa, avg(salario) FROM pessoas
GROUP BY empresa;

SUM (Soma)
SELECT sum(salario) FROM pessoas;
SELECT empresa, sum(salario) FROM pessoas
GROUP BY empresa;

Funes Bsicas
COUNT (Contagem)
SELECT empresa, count(salario) FROM pessoas GROUP
BY empresa;

MIN (Mnimo) e MAX (Mximo)


SELECT empresa, min(salario), max(salario)
FROM pessoas GROUP BY empresa;
SELECT empresa, count(salario) AS NumFuncionarios,
avg(salario) AS MediaSalarial, sum(salario) AS
TotalFolha
FROM pessoas GROUP BY empresa;

Funes String

ASCII('A')
BIN(N)
BIT_LENGTH(str)
CHAR(N1,N2,N3,...)
CONCAT(str1,str2,...)
LCASE(str) ,
LOWER(str)
UCASE(str),
UPPER(str)
E outras

Funes Matemticas

ABS(X)
SIGN(X)
MOD(N,M)
ROUND(X,D)
A DIV B
EXP(X)
LN(X)
POWER(X,Y)
SQRT(X)
PI()
outras

Funes Data e Hora

DATE(data)
TIME(data)
TIMESTAMP(expr)
DAYOFWEEK(data) //1=Segunda
WEEKDAY(data) //0=Segunda
DAYOFMONTH(data), DAY(data),
DAYOFYEAR(data)
MONTH(data)
CURTIME(), CURDATE(), CURRENT_TIMESTAMP
outras

Stored Procedure - Localizao


So inseridos em uma tabela chamada
ROUTINES no banco de dados
INFORMATION_SCHEMA.ROUTINES, que o
dicionrio de dados do MySQL.

Como ter acesso


Para listarmos todos os stored routines
(Stored Procedure e Functions), no mysql
client:
SELECT * FROM
INFORMATION_SCHEMA.ROUTINES;

Sintaxe Geral
CREATE PROCEDURE proc_name([parameters,
...])
[characteristics]
[BEGIN]
corpo_da_rotina;
[END]

Sintaxe Geral
proc_name: seu procedimento armazenado
deve ter um nome, para quando for chamado,
podermos ento us-lo;
parameters: nessa parte do procedimento,
informaremos os parmetros da seguinte
forma: [IN | OUT | INOUT] nome_parametro
tipo_dado.

Sintaxe Geral
Existem 3 tipos de parmetros em uma Stored
Procedure no MySQL:
IN, OUT e INOUT.
characteristics: as caractersticas do
procedimento pode apresentar.
Questes de segurana, se determinstica ou
no, qual a linguagem que estamos utilizando
e se nosso procedimento modificar dados na
banco de dados,

Parmetro IN
o modo padro (default). Quando voc define
um parmetro IN em um SP, o programa
chamador tem de passar um argumento ao
procedimento armazenado.
Essa passagem de parmetros do tipo
passagem por valor, portanto o valor do
parmetro fora do procedimento armazenado
permanece inalterado.
So semelhantes aos parmetros de funo.

Parmetro OUT
O valor de um parmetro OUT pode ser alterado
dentro do procedimento armazenado e seu
novo valor passado de volta ao programa
chamador.
O procedimento armazenado no pode acessar
o valor inicial do parmetro OUT quando ele
iniciado, e a varivel passada limpa.

Parmetro OUT
Procedimentos OUT so similares aos
procedimentos INOUT, com uma diferena
significativa: no parmetro OUT, o valor do
parmetro, portanto o valor da varivel cujo
valor passado como parmetro, ajustado
para NULL no incio da execuo do
procedimento.

Parmetro INOUT
Trata-se de uma combinao dos parmetros
IN e OUT.
Isso significa que o programa chamador deve
passar o argumento e o procedimento
armazenado pode modificar o parmetro
INOUT e repassar o novo valor de volta ao
programa chamador.
Portanto, uma referncia varivel externa
passada ao procedimento.

Criando Procedure
Delimiter //
CREATE PROCEDURE pessoas ()
SELECT * FROM pessoas;//
Delimiter ;
Acionando uma procedure:
Delimiter //
call pessoas ();//
Delimiter ;

Criando Procedure
Criar a procedure:
CREATE PROCEDURE pessoas ()...
espao para no confundir com outros objetos;

Chamar a procedure
CALL pessoas ();

Crie uma procedure para listar todas as


empresas;

Criando Procedure
Podem alterar dados:
Delimiter //
create procedure apagaPessoas ()
delete from pessoas
Where codigo > 0//
Delimiter ;
call apagaPessoas ()//

Criando Procedure
Delimiter //
create procedure inserePessoas ()
INSERT INTO pessoas (nome, empresa, salario) VALUES
('Nasair Silva',1,100),
('Joice',1,200), ('Daniel',1,300),
('Leonardo',2,400),
('Andra','2',500), ('Cesar',3,600),
('Viviane',3,700),
('Roberto Jefferson',4,3000),
('Luis Incio',4,5000);//
Delimiter ;
call inserePessoas ();

Exerccio
1. Crie um procedimento que exiba a data e
hora (timestamp) atual;

Exerccio
1. Crie um procedimento que exiba a data e
hora (timestamp) atual;
Delimiter //
CREATE PROCEDURE dataEhora()
SELECT CURRENT_TIMESTAMP;//
Delimiter ;
Call dataEhora ();

Parmetros
Parntes aps nome do procedimento
delimitam os parmetros
CREATE PROCEDURE p2 ([IN|OUT|INOUT]
nome_do_parmetro tipo_do_parmetro) ...
Parmetros de entrada: IN
Parmetros de sada: OUT
Parmetros entrada e sada: INOUT

Parmetros de Entrada
select @x;//
| @x |
| NULL |
1 row in set (0.00 sec)
create procedure setaX (in aux int)
set @x=aux;//
call setaX (4);//
Query OK, 0 rows affected (0.01 sec)
select @x;//
| @x |
|4 |
1 row in set (0.00 sec)

Parmetros de Sada
create procedure recebeX (out aux int)
set aux=5;//
Query OK, 0 rows affected (0.08 sec)
call recebeX(@x);//
Query OK, 0 rows affected (0.01 sec)
select @x;//
| @x |
+------+
|5 |
+------+
1 row in set (0.00 sec)

Blocos de Funo
create procedure p7 ()
begin
set @a = 5;
set @b = 5;
insert into t values (@a);
select s1 * @a FROM t WHERE s1 >= @b;
end;//
Query OK, 0 rows affected (0.00 sec)
call p7 ();//
| s1 * @a |
| 25 |
1 row in set (0.00 sec)

Variveis
CREATE PROCEDURE p8 ()
BEGIN
DECLARE a INT;
DECLARE b INT;
SET a = 5;
set b = 5;
INSERT INTO t VALUES (a);
SELECT s1 * a FROM t WHERE s1 >= b;
END //

Variveis e Valor Padro


CREATE PROCEDURE p10 ()
BEGIN
DECLARE a, b INT DEFAULT 5;
INSERT INTO t VALUES (a);
SELECT s1 * a FROM t WHERE s1 >= b;
END;//
Query OK, 0 rows affected (0.00 sec)

Escopo de Variveis
CREATE PROCEDURE p11 ()
BEGIN
DECLARE x1 char(5) DEFAULT 'outer';
BEGIN
DECLARE x1 char(5) DEFAULT 'inner';
SELECT x1;
END;
SELECT x1;
END //
Query OK, 0 rows affected (0.00 sec)

Escopo de Variveis
call p11 ();//
| x1 |
+-------+
| inner |
1 row in set (0.00 sec)
| x1 |
+-------+
| outer |
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)

Condies
create procedure p12 (in parametro INT)
BEGIN
if parametro = 0 then
select ' igual a zero!';
else
select ' diferente de zero!';
end if;
end;//
Query OK, 0 rows affected (0.00 sec)
call p12(0)//
| igual a zero! |
call p12(1);//
| diferente de zero! |

Condio Case
CREATE PROCEDURE p13 (in parametro INTEGER)
begin
case parametro
when 0 then SELECT 'Zero';
when 1 then SELECT 'Um';
else Select 'No zero nem um';
end case;
end;//
call p13(1);//
| Um |
call p13(2);//
| No zero nem um |
call p13(0);//
| Zero |

Exerccios
1. Crie uma procedure que diga se um nmero
par ou mpar.
SELECT 10 % 2;
SELECT 9 % 2;
2. Crie um procedimento que exiba o nome do
ms, de acordo com o nmero (1=Janeiro,
2=Fevereiro, 3=Maro, ...)

Exerccios - Resoluo
create procedure parOUimpar (in parametro INT)
BEGIN
if parametro % 2 then
SELECT 'mpar';
else
S
SELECT 'par';
end if;
END//

Exerccios Resoluo 2
CREATE PROCEDURE nomeDoMes (in parametro
INT)
BEGIN
case parametro
when 1 then SELECT 'Jan';
when 2 then SELECT 'Fev'; ...
when 12 then SELECT 'Dez';
else SELECT 'MS INVLIDO';
end case;
END//

Laos de Repetio - WHILE


create procedure p14 (in parametro integer)
begin
while parametro >= 0 do
insert into t values (parametro);
set parametro = parametro - 1;
end while;
end//
select count(*) from t;
|
9|
call p14 (2)//
Query OK, 1 row affected (0.00 sec)
select count(*) from t;//
|
12 |

Laos de Repetio - REPEAT


create procedure p15 (in parametro integer)
begin
REPEAT
SELECT parametro;
SET parametro = parametro + 1;
until parametro >= 5
end REPEAT;
end//
Query OK, 0 rows affected (0.00 sec)
call p15 (3);//
|3|
|4|
Query OK, 0 rows affected (0.03 sec)

Laos de Repetio - LOOP


CREATE PROCEDURE p16 (in parametro INT)
BEGIN
loop_label: LOOP
SELECT parametro;
set parametro = parametro + 1;
if parametro >= 5 then
leave loop_label;
end if;
end loop;
end;//
call p16(3) //
|
3|
|
4|

Laos de Repetio - Estruturas


CREATE PROCEDURE p17 (in parametro INT) BEGIN
primeiro_loop: LOOP
set parametro = parametro + 1;
if parametro <= 3 then
ITERATE primeiro_loop;
END IF;
if parametro >= 5 then
LEAVE primeiro_loop;
END IF;
elect parametro;
END LOOP;
END//
call p17 (1)//
|
4|
1 row in set (0.00 sec)

Exerccio
1. Criar um procedimento que exiba os
nmeros pares entre os dois parmetros
(nmeros inteiros) passados

Exerccio - Resoluo
CREATE PROCEDURE exibePares(IN param1 INT, IN param2 INT)
BEGIN
DECLARE aux INT;
SET aux = param1;
if aux % 2 THEN
SET aux = aux + 1;
END IF;
WHILE aux <= param2 DO
SELECT aux;
SET aux = aux + 2;
END WHILE;
END//

S-ar putea să vă placă și