View
670
Download
12
Category
Preview:
Citation preview
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 inicial])
Retorna a posição onde uma expressão se 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[, estilo])
Converte um tipo de dados para outro 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.
Recommended