Stored Procedures

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