Banco de Dados SQL Stored Procedures

19
1 Banco de Dados Banco de Dados SQL SQL Stored Procedures Stored Procedures Elaini Simoni Angelotti Elaini Simoni Angelotti

description

Banco de Dados SQL Stored Procedures. Elaini Simoni Angelotti. Stored Prodecure (sp). São semelhantes a procedimentos e subrotinas em outras linguagens: Podem ser chamadas por outra sp ou por aplicativos desenvolvidos em PHP, ASP, Delphi, VB, etc Podem receber e retornar parâmetros - PowerPoint PPT Presentation

Transcript of Banco de Dados SQL Stored Procedures

Page 1: Banco de Dados SQL Stored Procedures

1

Banco de DadosBanco de DadosSQLSQL

Stored ProceduresStored Procedures

Banco de DadosBanco de DadosSQLSQL

Stored ProceduresStored Procedures

Elaini Simoni AngelottiElaini Simoni Angelotti

Page 2: Banco de Dados SQL Stored Procedures

2

Stored Prodecure (sp)

• São semelhantes a procedimentos e subrotinas em outras linguagens:– Podem ser chamadas por outra sp ou por aplicativos

desenvolvidos em PHP, ASP, Delphi, VB, etc– Podem receber e retornar parâmetros– Podem conter instruções de controle e laços

• Uma stored procedure (sp) é uma coleção de comandos nomeada que é salva no BD.

Page 3: Banco de Dados SQL Stored Procedures

3

• Uma vez criada, uma sp pode ser executada sempre que necessário, simplesmente chamando a sp.

• Vantagens de utilizar sp:– Facilitar a manutenção e a alteração das aplicações– Ocultar a complexidade de acesso ao BD– Poder receber parâmetros de entrada e retornar

resultados– Reduzir o tráfego de rede gerado pela aplicação– Facilitar e centralizar o gerenciamento de permissões– Melhorar a velocidade de execução

Page 4: Banco de Dados SQL Stored Procedures

4

• Para escrever uma sp pode-se utilizar instruções de comparações (if), loops (while), operadores, variáveis, etc

• Para o início e fim de um bloco usa-se BEGIN e END

• Exemplo: Escrever uma sp que imprima “Hello world”

CREATE PROCEDURE sp_Teste ASBEGIN

SELECT ‘o famoso Hello World’END

• Para Executar a sp: EXEC sp_Teste

Page 5: Banco de Dados SQL Stored Procedures

5

• Pode-se declarar uma variável em uma sp para armazenar valores.

• Usa-se o comando DECLARE para declarar variáveis.

CREATE PROCEDURE sp_Teste1 AS

DECLARE @msg varchar (100)

BEGIN

SELECT @msg = ‘o famoso Hello World’

PRINT @msg

END

• Para Executar a sp: EXEC sp_Teste1

Page 6: Banco de Dados SQL Stored Procedures

6

Sp com Parâmetros de Entrada

• Permite a criação de sp mais flexíveis• Os parâmetros são sempre declarados como @ e

devem ter o tipo de dados definido.

– Exemplo 1: Crie uma sp para encontrar todas as pessoas que emprestaram uma fita em um determinado ano (para o BD Locadora). O ano será passado como parâmetro de entrada e a sp utilizará este parâmetro como critério de pesquisa, retornando o nome do cliente, data de empréstimo, data de devolução prevista e data de devolução efetiva.

Page 7: Banco de Dados SQL Stored Procedures

7

CREATE PROCEDURE sp_Emprestimo_Ano @ano int ASBEGIN select nome_cli as 'Nome do Cliente',

convert(char, data_emp,103) as 'Data do Emprestimo', convert(char, data_dev_prev, 103) as 'Data da Devolução Prevista', convert(char, data_dev_efet, 103) as 'Data da Devolução Efetiva'

from Cliente inner join Emp_dev on cliente.CPF_cli = Emp_dev.CPF_cli where datepart(yy, data_emp) = @anoEND

EXEC sp_Emprestimo_Ano 2006

Page 8: Banco de Dados SQL Stored Procedures

8

– Exemplo 2: Crie uma sp para encontrar todas as pessoas que emprestaram uma fita em um determinado período. Para isso, a sp terá dois parâmetros de entrada (data inicial e data final). Esses parâmetros serão utilizados como critério de pesquisa. A sp deve retornar o nome do cliente, data de empréstimo, data de devolução prevista e data de devolução efetiva.

Page 9: Banco de Dados SQL Stored Procedures

9

CREATE PROCEDURE sp_Emprestimo @data_inicio datetime, @data_fim datetime ASBEGIN select nome_cli as 'Nome do Cliente',

convert(char, data_emp,103) as 'Data do Emprestimo', convert(char, data_dev_prev, 103) as 'Data da Devolução

Prevista', convert(char, data_dev_efet, 103) as 'Data da Devolução Efetiva'

from Cliente inner join Emp_dev on cliente.CPF_cli = Emp_dev.CPF_cli where data_emp between @data_inicio and @data_fimEND

EXEC sp_Emprestimo '2005-01-01', '2005-12-31'

Page 10: Banco de Dados SQL Stored Procedures

10

• Exemplo 3: usando variáveis, parâmetros e instrução IF .. ELSE

– Crie uma sp que receba uma substring do nome de um fornecedor e conte quantos fornecedores existem com aquela substring. Caso nenhum fornecedor tenha a substring, uma mensagem deve ser enviada notificando o usuário. Caso a quantidade de fornecedor seja maior que zero, então o usuário também deve ser notificado sobre o número de pessoas com a substring.

Page 11: Banco de Dados SQL Stored Procedures

11

CREATE PROCEDURE sp_BuscaFornecedor @Nome_forn varchar (50)AS DECLARE @Qtde int , @msg varchar (100)BEGIN select CNPJ_forn, Nome_forn from Fornecedor where nome_forn like '%' + @Nome_forn + '%'

SET @Qtde = (select count(*) from Fornecedor where nome_forn like '%' + @Nome_forn + '%')

IF @Qtde = 0 BEGIN

select @msg = 'Nenhum fornecedor contem a substring ' + @Nome_forn

print @msg END ELSE BEGIN

select @msg = 'existem ' + convert(char,@Qtde) print @msgselect @msg = 'fornecedores com a substring ' + @Nome_fornprint @msg

ENDEND

EXEC sp_BuscaFornecedor 'M'

Page 12: Banco de Dados SQL Stored Procedures

12

• Exemplo 4:

– Crie uma sp que receba como parâmetros de entrada o nome de duas categorias de filmes e conte o número de empréstimos para cada uma das duas categorias em um determinado ano (que também será passado por parâmetro). O número de empréstimos de cada categoria deve ser armazenado em uma variável local. Em seguida, um teste é feito emitindo a mensagem de qual categoria teve mais filmes emprestados no ano selecionado.

Page 13: Banco de Dados SQL Stored Procedures

13

CREATE PROCEDURE sp_Maior_Emprestimo_Categoria@ano int, @categoria1 varchar(50), @categoria2 varchar(50)

ASDECLARE @TotalCategoria1 int, @TotalCategoria2 int, @msg varchar (100)

BEGIN SET @TotalCategoria1 = (select count(*)

from fita inner join Emp_dev on fita.cod_fita = Emp_dev.cod_fita where categoria = @Categoria1 AND datepart(yy,data_emp) = @ano)

SET @TotalCategoria2 = (select count(*) from fita inner join Emp_dev on fita.cod_fita = Emp_dev.cod_fita where categoria = @Categoria2 AND datepart(yy,data_emp) = @ano)

IF (@TotalCategoria1 > @TotalCategoria2) BEGIN

set @msg = 'o número de emprestimos de fitas da categoria ' + @categoria1 + ' é maior'print @msg

END ELSE IF (@TotalCategoria2 > @TotalCategoria1) BEGIN

set @msg = 'o número de emprestimos de fitas da categoria ' +@categoria1 + ' é menor' print @msgEND

ELSE BEGIN

set @msg = 'o número emprestimos de fitas das duas categoria são iguais' print @msg

ENDEND

EXEC sp_Maior_Emprestimo_Categoria 2005, 'comedia', 'terror'

Page 14: Banco de Dados SQL Stored Procedures

14

Usando a Instrução WHILE• Faz com que um conjunto de comandos execute

enquanto uma dada condição for verdadeira• Exemplo 5:

– Crie uma nova tabela chamada Soma_Naturais com dois atributos inteiros:

• número e Soma_acumulada

create table Soma_naturais( Numero int, Soma_acumulada int)

Page 15: Banco de Dados SQL Stored Procedures

15

• Em seguida crie uma sp que calcule a soma dos “n” primeiros números e armazene as somas nas respectivas colunas. Por exemplo:

Número Soma Acumulada

1 1

2 3

3 6

CREATE PROCEDURE sp_CalculaSoma@num int

AsDELETE from Soma_naturaisdeclare @contador intset @contador = 1declare @soma int set @soma = 0

BEGIN WHILE (@contador <= @Num)

BEGIN SET @Soma = @Soma + @Contador insert into Soma_naturais values (@Contador, @soma) SET @contador = @contador + 1

END select * from Soma_naturaisEND

Page 16: Banco de Dados SQL Stored Procedures

16

Instrução WHILE e BREAK

CREATE PROCEDURE sp_PreçoAS DECLARE @preco_MAX money

WHILE (SELECT AVG(preco) FROM fita) < 5BEGIN UPDATE fita SET preco = preco + 1.5 SET @preco_MAX = (Select MAX(preco) FROM fita)

IF (@preco_MAX > 7) BREAKPRINT 'Isso foi apenas um teste!' select * from fitaEND

exec sp_Preço

Page 17: Banco de Dados SQL Stored Procedures

17

Parâmetros de Saída para sp

• Para definir um parâmetro de saída basta colocar a palavra OUTPUT após a definição do tipo de parâmetro

CREATE PROCEDURE sp_saída

@saida int OUTPUT

• Crie uma sp que retorne o valor médio de preço das fitas para um estado que será passado como parâmetro de entrada

Page 18: Banco de Dados SQL Stored Procedures

18

CREATE PROCEDURE sp_MediaPreçoEstado@estado char(2),@media float OUTPUT

ASBEGIN

SET @media = (Select AVG(preco) as Media from fita INNER JOIN Fornecedor_Fita

ON Fornecedor_Fita.cod_fita = fita.cod_fita

INNER JOIN Fornecedor ON Fornecedor_Fita.CNPJ_forn =

Fornecedor.CNPJ_forn where UF_forn = @estado)

END

PARA EXECUTAR:declare @resultado floatexec sp_MediaPreçoEstado 'PR', @Resultado OUTPUTPrint (@Resultado)

Page 19: Banco de Dados SQL Stored Procedures

19

• Para alterar uma sp usa-se o seguinte comando:

ALTER PROCEDURE nome_da_sp

• Para apagar uma sp usa-se o seguinte comando:

DROP PROCEDURE nome_da_sp

• Para criptografar os comandos de uma sp:

CREATE PROCEDURE sp_Clientes

WITH ENCRYPTION

AS

select * from Cliente

Exec sp_helptext sp_clientes

Exec sp_helptext sp_Teste