Sei sulla pagina 1di 49

Banco de Dados II

Prof. Alan Alves Oliveira


Stored Procedure
• Stored Procedure: procedimento armazenado;
• É um objeto do banco de dados;
• Possui alguma funcionalidade e pode ser
chamada de aplicativos, interfaces com o
usuário, tarefas agendadas, etc.;
Stored Procedure
• Para serem escritas, as Stored Procedures
necessitam de uma extensão à linguagem SQL;
• Os SGBD fornecem esta extensão através de
linguagens próprias. Exemplos:
– SQL Server: Transact SQL (T-SQL);
– Oracle: PL-SQL;
– MySQL: padrão SQL 2003.
Stored Procedure
• Para começar, vamos aprender um pouco
sobre a T-SQL. Vamos utilizar exemplos de
aplicação onde, simultaneamente, iremos
conhecendo a sintaxe.
Stored Procedure no SQL Server
• Para acessar as Stored Procedures no SQL
Server, vá até o item Programmability, que se
encontra abaixo do nó do banco de dados.
Veja na figura abaixo:
Stored Procedure no SQL Server
• Clicando com o botão direito do mouse sobre
o item Stored Procedures é possível selecionar
a opção New Stored Procedure...;
• Será aberta uma tela de Query com o
esqueleto da Stored Procedure já criado;
Stored Procedure no SQL Server
• Porém, pode ser mais fácil começar uma nova
Stored Procedure direto na janela de query. A
sintaxe básica é:
CREATE PROCEDURE <nome_da_procedure>
[@parametro1, @parametro2, ...]
AS
BEGIN
<linhas de código>
END[;]
Stored Procedure no SQL Server
• Para alterar ou excluir a Stored Procedure via
sentença devemos utilizar o comando ALTER
PROCEDURE e para excluir o comando DROP
PROCEDURE;
• Para alterar ou excluir a Stored Procedure
usando as opções da interface, devemos clicar
com o botão direito sobre ela;
Stored Procedure no SQL Server
• A opção Modify, permite alterar a Stored
Procedure e a opção Delete permite excluí-la;
• No caso da alteração a Stored Procedure será
aberta em uma janela de query, com todo o
código já armazenado.
Stored Procedure no SQL Server
• Uma Stored Procedure aceita qualquer
comando SQL padrão suportado pelo SGBD;
• Vamos utilizar o banco de dados da
videolocadora, criado no semestre anterior,
para criar nossas Stored Procedures.
Stored Procedure no SQL Server
• Vamos começar com um exemplo simples
onde armazenaremos uma consulta em uma
Stored Procedure:
CREATE PROCEDURE ListaClientes
AS
BEGIN
SELECT
P.PessoaCodigo, P.Nome
FROM
Pessoa P
WHERE
P.ECliente = 1
END
Stored Procedure no SQL Server
• Quando executamos o código do slide anterior
na janela de query o SQL Server cria um
objeto Stored Procedure com o nome
indicado;
• Então, a execução desse código é a criação da
Stored Procedure e não a execução da sua
funcionalidade;
Stored Procedure no SQL Server
• Para executarmos a funcionalidade da Stored
Procedure devemos:
– Clicar sobre o objeto que representa a Stored
Procedure com o botão direito do mouse e
selecionar a opção Execute Stored Procedure...,
ou;
– Simplesmente digitar o nome da Stored
Procedure em uma janela de query aberta para
o banco de dados em questão;
Stored Procedure no SQL Server
• A chamada à Stored Procedure poderá conter,
opcionalmente, o comando EXEC;
• Veja os exemplos abaixo:
EXEC ListaClientes

-- OU

ListaClientes
Stored Procedure no SQL Server
• Atividade:
– Crie e execute a Stored Procedure vista
anteriormente em seu banco de dados.
– Agora faça outra Stored Procedure, que tem o
objetivo de listar o nome do cliente, o título do
filme e a data da locação para todas as locações
ainda não devolvidas.
Stored Procedure no SQL Server
• Vamos agora melhorar um pouco a nossa
Stored Procedure. Vamos alterá-la para que
ela traga somente os clientes de acordo com
um parâmetro, que será informado no
momento da execução;
• Para isso devemos inserir um parâmetro que
será recebido pela Stored Procedure;
Stored Procedure no SQL Server
• Parâmetros devem ser definidos antes da
cláusula AS e precisam ser iniciados com o
símbolo @;
• Além disso, precisam ser seguidos pelo tipo de
dados que será recebido naquele parâmetro;
• Veja o exemplo a seguir:
Stored Procedure no SQL Server
• O código ficará assim:
ALTER PROCEDURE ListaClientes
@ParteNome VARCHAR(MAX)
AS
BEGIN
SELECT
P.PessoaCodigo, P.Nome
FROM
Pessoa P
WHERE
P.ECliente = 1 AND
P.Nome LIKE @ParteNome + '%'
END
Stored Procedure no SQL Server
• Acrescentamos as linhas em negrito;
• A Stored Procedure agora traz todos os
clientes cujo nome comece com o valor
passado como parâmetro. Veja:
Exec ListaClientes 'L'
Stored Procedure no SQL Server
• Atividade:
– Crie e execute a Stored Procedure vista
anteriormente em seu banco de dados.
– Altere a Stored Procedure, que lista o nome do
cliente, o título do filme e a data das locações
ainda não devolvidas incluindo uma opção para
que o usuário informe parte do título do filme
que ele deseja pesquisar.
Stored Procedure no SQL Server
• Até agora, utilizamos somente comandos SQL
padrão nas Stored Procedures;
• O resultado que aparece na aba Results do
SQL Server Management Studio está se
originando justamente na cláusula SELECT de
nossas sentenças;
• Porém, é possível utilizar variáveis e retornar o
seu valor através de um SELECT;
Stored Procedure no SQL Server
• Veja o exemplo:
CREATE PROCEDURE QuantClientes
AS
BEGIN
DECLARE
@TotalClientes INT

SET @TotalClientes = (SELECT


COUNT(P.PessoaCodigo)
FROM
Pessoa P
WHERE
P.ECliente = 1)
SELECT @TotalClientes
END
Stored Procedure no SQL Server
• No exemplo, veja que a variável deve ser
declarada após a cláusula DECLARE;
• Todas as variáveis precisam ser iniciadas com
o símbolo @;
• Para atribuir um valor a uma variável é preciso
usar a cláusula SET;
• O último SELECT seleciona e mostra o
conteúdo da variável.
Stored Procedure
• Para continuar, vamos primeiramente
conhecer algumas funções que podem nos
ajudar na criação de procedimentos;
• IMPORTANTE: lembre-se que as funções nem
sempre são um padrão, portanto, funções da
T-SQL (SQL Server) podem ser diferentes de
funções com o mesmo objetivo em outros
SGBD.
Stored Procedure
Função Sintaxe Descrição
AVG AVG(expressão) Média
COUNT COUNT(expressão) Contagem
MAX MIN(expressão) Mínimo (valor mínimo)
MIN MAX(expressão) Máximo (valor máximo)
SUM SUM(expressão Soma
DATEADD DATEADD(<parte da data>, incremento, <data original>) Incrementa/decrementa data/hora
DATEDIFF DATEDIFF(<parte da data>, <data inicial>, <data final>) Calcula a diferença entre duas datas
DAY DAY(data) Retorna o dia (valor) de uma data
GETDATE GETDATE() Retorna a data e hora atuais (do servidor)
MONTH MONTH(data) Retorna o mês (valor) de uma data
YEAR YEAR(data) Retorna o ano (valor) de uma data
ABS ABS(Número) Retorna o valor absoluto de um número
ROUND ROUND(número, <tamanho decimais> [, função]) Arredonda um número com a quantidade
de casas decimais indicadas
CHAR CHAR(código) Retorna o caractere referente ao código
ASC II informado
Stored Procedure
Função Sintaxe Descrição
CHARINDEX CHARINDEX(<expr. procurada>, <expr. total>[, localização Retorna a posição onde uma expressão se
inicial]) encontra em um texto
LEFT LEFT(<expr. literal>, tamanho) Retorna a parte esquerda de uma
expressão literal
RIGHT RIGHT(<expr. literal, tamanho) Retorna a parte direita de uma expressão
literal
SUBSTRING SUBSTRING(<expr. literal, <pos. inicial>, <tamanho>) Retorna uma parte qualquer em uma
expressão literal
CAST CAST(expressão AS <tipo de dados>[(tamanho)]) Converte um tipo de dados para outro
tipo
CONVERT CONVERT(<tipo de dados>[(tamanho)], expressão[, Converte um tipo de dados para outro
estilo]) tipo
ISDATE ISDATE(expressão) Retorna (0 ou 1) se uma expressão é uma
data
ISNULL ISNULL(expressão, <valor substituto>) Retorna um valor (substituto) para uma
expressão nula
ISNUMERIC ISNUMERIC(expressão) Retorna (0 ou 1) se uma expressão é um
número
Stored Procedure
• Agora vamos aprofundar um pouco mais na T-
SQL:
Estrutura condicional
• Veremos duas estruturas condicionais: CASE e
IF.
• CASE:
– O CASE permite a criação de uma estrutura
condicional de múltipla escolha;
– O valor retornado pela estrutura dependerá da
opção de escolha que atenda às condição
desejada;
Estrutura condicional
• CASE:
– Sintaxe:
-- Opção 1
CASE <expressão avaliada>
WHEN <opção 1> THEN <resultado 1>
[WHEN <opção 2> THEN <resultado 2>]
[...]
[ ELSE <resultado else> ]
END

-- Opção 2
CASE
WHEN <teste condicional 1> THEN <resultado 1>
[WHEN <teste condicional 2> THEN <resultado 2>]
[...]
[ ELSE <resultado else> ]
END
Estrutura condicional
• CASE:
– Exemplo 1:
...
SET @var1 = CASE @mes
WHEN 1 THEN 'Janeiro'
WHEN 2 THEN 'Fevereiro'
WHEN 3 THEN 'Março'
...
ELSE 'Mês inválido'
END
...
Estrutura condicional
• CASE:
– Exemplo 2:
...
SELECT
Data_Locacao,
CASE
WHEN L.Data_Devolucao IS NULL THEN 'Em aberto'
ELSE 'Devolvida'
END Status
FROM
LOCACAO L
...
Estrutura condicional
• IF:
– O IF permite a criação de uma estrutura
condicional simples IF...[ELSE];
– Sintaxe:
IF <expressão lógica>
[BEGIN]
<comandos>
[END]
[ELSE]
[BEGIN]
<comandos>
[END]
Estrutura condicional
• IF:
– Exemplo:
CREATE PROCEDURE VerificaSituacao
@cliente int
AS BEGIN
DECLARE
@var1 INT,
@var2 VARCHAR(MAX)
SET @var1 = (SELECT
COUNT(L.PessoaCodigoCliente)
FROM
LOCACAO L
WHERE
L.DataDevolucao IS NULL AND
L.PessoaCodigoCliente = @cliente)
IF @var1 > 0
SET @var2 = 'Possui locações em aberto!'
ELSE
SET @var2 = 'Não possui locações em aberto!'

PRINT @var2
END
Cursores
• CURSOR:
– Os cursores permitem que sejam recuperadas
determinadas linhas referentes a uma consulta
SQL;
– O cursor permite a navegação pelo resultado da
sentença utilizando, por exemplo, uma
estrutura de repetição.
Cursores
• CURSOR:
– Um cursor é uma variável que precisa ser
declarada como as demais, porém, não
necessita do prefixo @ como as outras;
– Uma vez declarado o cursor e definida a
sentença que irá recuperar os dados ele deve
ser aberto através do comando OPEN;
– Para acessar as linhas de um cursor, deve ser
utilizado o comando FETCH;
Cursores
• CURSOR:
– Muitas opções podem definir o tipo de cursor,
porém, a princípio, nos interessam as opções
relativas à navegação pelas linhas, sendo:
• FORWARD_ONLY: esta é a opção padrão, onde o
cursor permite navegação apenas para frente, ou
seja, para a linha seguinte
• SCROLL: o cursor permite a navegação em ambos
os sentidos.
Cursores
• CURSOR:
– Sintaxe:
DECLARE <nome do cursor> CURSOR [FORWARD_ONLY | SCROLL] FOR
<sentença SQL>
Cursores
• CURSOR:
– Vejamos alguns exemplos:
– Declaração do cursor:
// Declaração de um cursor chamado Lista
DECLARE Lista CURSOR SCROLL FOR
SELECT
PessoaCodigo,
Nome
FROM
Pessoa
Cursores
• CURSOR:
– Abertura do cursor:
// Abertura do cursor Lista
OPEN Lista

– Acessando as linhas de um cursor:


• Para acessar as linhas do cursor é necessário
utilizar o comando FETCH;
• É preciso que existam variáveis declaradas para
receber os valores de retorno;
Cursores
• CURSOR:
– Acessando as linhas de um cursor:
• Exemplo:
FETCH FIRST FROM Lista INTO @Codigo, @Nome

• No caso acima, foi usada a opção First, que


retorna a próxima linha do cursor;
• Veja que as variáveis @Codigo e @Nome recebem
os valores dos campos PessoaCodigo e Nome,
respectivamente.
Cursores
• CURSOR:
– Acessando as linhas de um cursor:
• Opções do cursor:
-- Retorna a próxima linha
FETCH NEXT ...

-- Retorna a linha anterior


FETCH PRIOR ...

-- Retorna a primeira linha


FETCH FIRST ...

-- Retorna a última linha


FETCH LAST ...
Cursores
• CURSOR:
– Acessando as linhas de um cursor:
• Observação: cursores do tipo FORWARD_ONLY só
permitem o uso da opção FETCH NEXT.
Cursores
• CURSOR:
– A função do sistema @@FETCH_STATUS retorna
o status de uma operação FETCH;
– Retornos possíveis para a função
@@FETCH_STATUS:
0 FETCH executado com sucesso
-1 FETCH falhou
-2 Não existe linha para ser retornada
Cursores
• CURSOR:
– No final do seu uso, o cursor deve ser fechado e
desalocado, para liberar a memória. Veja abaixo
as linhas para executar estas ações:
CLOSE Lista
DEALLOCATE Lista
Estrutura de repetição
• WHILE:
– A cláusula WHILE permite a criação de uma
estrutura de repetição condicional, controlada
por uma expressão lógica;
– Sintaxe:
WHILE <expressão lógica>
[BEGIN]
<comandos>
[END]
Estrutura de repetição
• WHILE:
– Um exemplo completo (cursor e laço):
CREATE PROCEDURE Exemplo
AS BEGIN
DECLARE
@Codigo INT,
@Nome VARCHAR(MAX)
DECLARE Lista CURSOR FOR
SELECT
PessoaCodigo,
Nome
FROM
Pessoa
Estrutura de repetição
• WHILE:
– Um exemplo completo (cursor e laço):
OPEN Lista
FETCH NEXT FROM Lista INTO @Codigo, @Nome
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT 'Código: ' + CAST(@Codigo AS VARCHAR) + ' - Nome: ' + @Nome
FETCH NEXT FROM Lista INTO @Codigo, @Nome
END
CLOSE Lista
DEALLOCATE Lista
END
Estrutura de repetição
• WHILE:
– Resultado:
Atividade
• Faça uma Stored Procedure que utilize cursor,
estrutura de repetição e variáveis e faça uma
varredura nas locações imprimindo no
console:
– O valor total das locações não devolvidas;
– O valor total das locações devolvidas;
– O valor médio geral das locações.

Potrebbero piacerti anche