stored procedures
TRANSCRIPT
![Page 1: Stored Procedures](https://reader031.vdocuments.mx/reader031/viewer/2022020306/5571f7f049795991698c4fd3/html5/thumbnails/1.jpg)
Banco de Dados II
Prof. Alan Alves Oliveira
![Page 2: Stored Procedures](https://reader031.vdocuments.mx/reader031/viewer/2022020306/5571f7f049795991698c4fd3/html5/thumbnails/2.jpg)
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.;
![Page 3: Stored Procedures](https://reader031.vdocuments.mx/reader031/viewer/2022020306/5571f7f049795991698c4fd3/html5/thumbnails/3.jpg)
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.
![Page 4: Stored Procedures](https://reader031.vdocuments.mx/reader031/viewer/2022020306/5571f7f049795991698c4fd3/html5/thumbnails/4.jpg)
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.
![Page 5: Stored Procedures](https://reader031.vdocuments.mx/reader031/viewer/2022020306/5571f7f049795991698c4fd3/html5/thumbnails/5.jpg)
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:
![Page 6: Stored Procedures](https://reader031.vdocuments.mx/reader031/viewer/2022020306/5571f7f049795991698c4fd3/html5/thumbnails/6.jpg)
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;
![Page 7: Stored Procedures](https://reader031.vdocuments.mx/reader031/viewer/2022020306/5571f7f049795991698c4fd3/html5/thumbnails/7.jpg)
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[;]
![Page 8: Stored Procedures](https://reader031.vdocuments.mx/reader031/viewer/2022020306/5571f7f049795991698c4fd3/html5/thumbnails/8.jpg)
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;
![Page 9: Stored Procedures](https://reader031.vdocuments.mx/reader031/viewer/2022020306/5571f7f049795991698c4fd3/html5/thumbnails/9.jpg)
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.
![Page 10: Stored Procedures](https://reader031.vdocuments.mx/reader031/viewer/2022020306/5571f7f049795991698c4fd3/html5/thumbnails/10.jpg)
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.
![Page 11: Stored Procedures](https://reader031.vdocuments.mx/reader031/viewer/2022020306/5571f7f049795991698c4fd3/html5/thumbnails/11.jpg)
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
![Page 12: Stored Procedures](https://reader031.vdocuments.mx/reader031/viewer/2022020306/5571f7f049795991698c4fd3/html5/thumbnails/12.jpg)
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;
![Page 13: Stored Procedures](https://reader031.vdocuments.mx/reader031/viewer/2022020306/5571f7f049795991698c4fd3/html5/thumbnails/13.jpg)
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;
![Page 14: Stored Procedures](https://reader031.vdocuments.mx/reader031/viewer/2022020306/5571f7f049795991698c4fd3/html5/thumbnails/14.jpg)
Stored Procedure no SQL Server
• A chamada à Stored Procedure poderá conter, opcionalmente, o comando EXEC;
• Veja os exemplos abaixo:
EXEC ListaClientes
-- OU
ListaClientes
![Page 15: Stored Procedures](https://reader031.vdocuments.mx/reader031/viewer/2022020306/5571f7f049795991698c4fd3/html5/thumbnails/15.jpg)
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.
![Page 16: Stored Procedures](https://reader031.vdocuments.mx/reader031/viewer/2022020306/5571f7f049795991698c4fd3/html5/thumbnails/16.jpg)
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;
![Page 17: Stored Procedures](https://reader031.vdocuments.mx/reader031/viewer/2022020306/5571f7f049795991698c4fd3/html5/thumbnails/17.jpg)
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:
![Page 18: Stored Procedures](https://reader031.vdocuments.mx/reader031/viewer/2022020306/5571f7f049795991698c4fd3/html5/thumbnails/18.jpg)
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
![Page 19: Stored Procedures](https://reader031.vdocuments.mx/reader031/viewer/2022020306/5571f7f049795991698c4fd3/html5/thumbnails/19.jpg)
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'
![Page 20: Stored Procedures](https://reader031.vdocuments.mx/reader031/viewer/2022020306/5571f7f049795991698c4fd3/html5/thumbnails/20.jpg)
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.
![Page 21: Stored Procedures](https://reader031.vdocuments.mx/reader031/viewer/2022020306/5571f7f049795991698c4fd3/html5/thumbnails/21.jpg)
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;
![Page 22: Stored Procedures](https://reader031.vdocuments.mx/reader031/viewer/2022020306/5571f7f049795991698c4fd3/html5/thumbnails/22.jpg)
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
![Page 23: Stored Procedures](https://reader031.vdocuments.mx/reader031/viewer/2022020306/5571f7f049795991698c4fd3/html5/thumbnails/23.jpg)
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.
![Page 24: Stored Procedures](https://reader031.vdocuments.mx/reader031/viewer/2022020306/5571f7f049795991698c4fd3/html5/thumbnails/24.jpg)
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.
![Page 25: Stored Procedures](https://reader031.vdocuments.mx/reader031/viewer/2022020306/5571f7f049795991698c4fd3/html5/thumbnails/25.jpg)
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
![Page 26: Stored Procedures](https://reader031.vdocuments.mx/reader031/viewer/2022020306/5571f7f049795991698c4fd3/html5/thumbnails/26.jpg)
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
![Page 27: Stored Procedures](https://reader031.vdocuments.mx/reader031/viewer/2022020306/5571f7f049795991698c4fd3/html5/thumbnails/27.jpg)
Stored Procedure
• Agora vamos aprofundar um pouco mais na T-
SQL:
![Page 28: Stored Procedures](https://reader031.vdocuments.mx/reader031/viewer/2022020306/5571f7f049795991698c4fd3/html5/thumbnails/28.jpg)
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;
![Page 29: Stored Procedures](https://reader031.vdocuments.mx/reader031/viewer/2022020306/5571f7f049795991698c4fd3/html5/thumbnails/29.jpg)
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
![Page 30: Stored Procedures](https://reader031.vdocuments.mx/reader031/viewer/2022020306/5571f7f049795991698c4fd3/html5/thumbnails/30.jpg)
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
...
![Page 31: Stored Procedures](https://reader031.vdocuments.mx/reader031/viewer/2022020306/5571f7f049795991698c4fd3/html5/thumbnails/31.jpg)
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
...
![Page 32: Stored Procedures](https://reader031.vdocuments.mx/reader031/viewer/2022020306/5571f7f049795991698c4fd3/html5/thumbnails/32.jpg)
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]
![Page 33: Stored Procedures](https://reader031.vdocuments.mx/reader031/viewer/2022020306/5571f7f049795991698c4fd3/html5/thumbnails/33.jpg)
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
![Page 34: Stored Procedures](https://reader031.vdocuments.mx/reader031/viewer/2022020306/5571f7f049795991698c4fd3/html5/thumbnails/34.jpg)
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.
![Page 35: Stored Procedures](https://reader031.vdocuments.mx/reader031/viewer/2022020306/5571f7f049795991698c4fd3/html5/thumbnails/35.jpg)
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;
![Page 36: Stored Procedures](https://reader031.vdocuments.mx/reader031/viewer/2022020306/5571f7f049795991698c4fd3/html5/thumbnails/36.jpg)
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.
![Page 37: Stored Procedures](https://reader031.vdocuments.mx/reader031/viewer/2022020306/5571f7f049795991698c4fd3/html5/thumbnails/37.jpg)
Cursores
• CURSOR:
– Sintaxe:
DECLARE <nome do cursor> CURSOR [FORWARD_ONLY | SCROLL] FOR
<sentença SQL>
![Page 38: Stored Procedures](https://reader031.vdocuments.mx/reader031/viewer/2022020306/5571f7f049795991698c4fd3/html5/thumbnails/38.jpg)
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
![Page 39: Stored Procedures](https://reader031.vdocuments.mx/reader031/viewer/2022020306/5571f7f049795991698c4fd3/html5/thumbnails/39.jpg)
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;
![Page 40: Stored Procedures](https://reader031.vdocuments.mx/reader031/viewer/2022020306/5571f7f049795991698c4fd3/html5/thumbnails/40.jpg)
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.
![Page 41: Stored Procedures](https://reader031.vdocuments.mx/reader031/viewer/2022020306/5571f7f049795991698c4fd3/html5/thumbnails/41.jpg)
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 ...
![Page 42: Stored Procedures](https://reader031.vdocuments.mx/reader031/viewer/2022020306/5571f7f049795991698c4fd3/html5/thumbnails/42.jpg)
Cursores
• CURSOR:
– Acessando as linhas de um cursor:
• Observação: cursores do tipo FORWARD_ONLY só permitem o uso da opção FETCH NEXT.
![Page 43: Stored Procedures](https://reader031.vdocuments.mx/reader031/viewer/2022020306/5571f7f049795991698c4fd3/html5/thumbnails/43.jpg)
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
![Page 44: Stored Procedures](https://reader031.vdocuments.mx/reader031/viewer/2022020306/5571f7f049795991698c4fd3/html5/thumbnails/44.jpg)
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
![Page 45: Stored Procedures](https://reader031.vdocuments.mx/reader031/viewer/2022020306/5571f7f049795991698c4fd3/html5/thumbnails/45.jpg)
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]
![Page 46: Stored Procedures](https://reader031.vdocuments.mx/reader031/viewer/2022020306/5571f7f049795991698c4fd3/html5/thumbnails/46.jpg)
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
![Page 47: Stored Procedures](https://reader031.vdocuments.mx/reader031/viewer/2022020306/5571f7f049795991698c4fd3/html5/thumbnails/47.jpg)
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
![Page 48: Stored Procedures](https://reader031.vdocuments.mx/reader031/viewer/2022020306/5571f7f049795991698c4fd3/html5/thumbnails/48.jpg)
Estrutura de repetição
• WHILE:
– Resultado:
![Page 49: Stored Procedures](https://reader031.vdocuments.mx/reader031/viewer/2022020306/5571f7f049795991698c4fd3/html5/thumbnails/49.jpg)
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.