49
Banco de Dados II Prof. Alan Alves Oliveira

Stored Procedures

Embed Size (px)

Citation preview

Page 1: Stored Procedures

Banco de Dados II

Prof. Alan Alves Oliveira

Page 2: Stored Procedures

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Stored Procedure

• Agora vamos aprofundar um pouco mais na T-

SQL:

Page 28: Stored Procedures

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

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

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

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

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

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

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

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

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

Cursores

• CURSOR:

– Sintaxe:

DECLARE <nome do cursor> CURSOR [FORWARD_ONLY | SCROLL] FOR

<sentença SQL>

Page 38: Stored Procedures

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

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

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

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

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

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

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

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

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

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

Estrutura de repetição

• WHILE:

– Resultado:

Page 49: Stored Procedures

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.