2008.2
Stored Procedures
Renata Viegas
2008.2
Variáveis
• Conceito
– Objetos que armazenam valores de acordo com o
tipo especificado
• Declaração
DECLARE @<nome_var> <tipo>
– quando uma variável é criada, o seu valor inicial
é NULL
– Recebem valores com SET ou SELECT
2008.2
Variáveis
• Exemplo
DECLARE @quant
varchar(40)
int,
@estado
char(2),
SET @quant = 100
SELECT @estado = ‘PB’
SELECT @nome = (SELECT f.nome FROM
funcionario f WHERE f.cod = 1500)
SELECT @quant, @estado, @nome
GO
@nome
2008.2
Estrutura de Decisão
• Definição
– Estrutura condicional que impõe condições para a execução de alguns
comandos SQL especificados.
• Sintaxe
IF <condicao>
comandos sql
[ELSE
comandos sql ]
Para mais de um comando
no IF/ELSE, abra um bloco
com BEGIN e END
– A condição deve ser expressa por uma expressão lógica que retorna
Verdadeiro ou Falso e pode conter um SELECT, que deve estar entre
parênteses.
2008.2
Estrutura de Decisão
• Exemplo: Criar uma procedure para eliminar
um usuário cujo período de trabalho é igual a
4 horas. O código do usuário é passado por
parâmetro.
2008.2
Estrutura de Decisão - Exemplo
CREATE PROCEDURE spEliminaUser
@codUsuario varchar(8)
AS
IF EXISTS (SELECT codigo FROM usuario WHERE codigo= @codUsuario)
IF (SELECT periodo FROM usuario WHERE cod = @codUsuario) = 4
DELETE FROM usuario
WHERE codigo = @codUsuario
ELSE
PRINT ‘Usuario nao pode ser eliminado’
ELSE
PRINT (‘Usuário não existente’)
EXEC spEliminaUser ‘Jose’
2008.2
Estrutura de Decisão
• Exemplo: Criar uma procedure para eliminar
um usuário cujo código é passado por
parâmetro, desde que ele não tenha recebido
qualquer mensagem
2008.2
Estrutura de Decisão - Exemplo
CREATE PROCEDURE spEliminaUser2
@ cod_usuario char(8) AS
IF (SELECT COUNT(*) FROM recebedor
WHERE destinatario = @ cod_usuario) = 0
BEGIN
DELETE FROM usuario
WHERE cod = @ cod_usuario
PRINT ‘Usuario removido’
END
ELSE
PRINT ‘Usuario nao pode ser removido’
2008.2
Estrutura de Decisão
• Exemplo: Criar uma stored procedure que
informe se o preço de venda de um
determinado produto é maior, menor ou igual
a média do preço de venda de todos os
produtos da empresa.
2008.2
Estrutura de Decisão - Exemplo
CREATE PROCEDURE spPreco
@codProd int AS
DECLARE @media decimal(7,2)
SELECT @media = AVG(venda) FROM produto
IF (SELECT venda FROM produto WHERE codigo = @codProd) < @media
PRINT ‘Preço menor que a média’
ELSE
IF (SELECT venda FROM produto WHERE codigo = @codProd ) > @media
PRINT ‘Preco maior que a media’
ELSE
PRINT ‘Preco igual a media’
2008.2
Estrutura de Decisão
• Observações
– O SELECT correspondente à condição pode conter vários JOIN’s
– O comando PRINT pode exibir o conteúdo de variáveis + texto
DECLARE @codigo int, @nome varchar(40)
SELECT @codigo = 14
SET @nome = ‘Folha de Pagamento’
PRINT(‘Programa : ‘ + @nome)
PRINT(‘Codigo: ‘ + CONVERT(char, @codigo) )
2008.2
Exercícios
• Crie uma SP que, passando o código do
cliente como parâmetro, mostre a quantidade
de pedidos que o mesmo fez, apenas se o
cliente for de Recife
2008.2
Exercícios
create procedure QuantPedido
@cliente int
as
if exists (select codigo from cliente where codigo = @cliente)
if (select ci.nome from cidade ci, cliente c where ci.codigo = c.cidade and
c.codigo=@cliente)='Recife'
begin
select count(*) as quantidade
from cliente c, pedido pe
where c.codigo = pe.cliente and c.codigo = @cliente
end
else print ('Cliente não é de Recife')
else print ('Cliente não Cadastrado')
2008.2
Exercícios
• Crie uma SP que, passando como parâmetro
o código do funcionário, exiba uma
mensagem se o funcionário mora na mesma
cidade em que ele nasceu. Caso contrário,
faça com que a Procedure exiba outra
mensagem.
2008.2
Exercícios
create procedure CidadeNaturalidade
@funcionario int
As
if exists (select codigo from funcionario where codigo = @funcionario)
if ((select naturalidade from funcionario where codigo = @funcionario )=
(select cidade from funcionario where codigo = @funcionario))
print (‘Funcionário nasceu e mora na mesma cidade')
else print (‘Funcionário nasceu em uma cidade e mora em outra')
else print ('Funcionário não Cadastrado')
2008.2
Estrutura de Repetição: WHILE
• Definição
– Estrutura de repetição que executa um bloco de comandos
enquanto uma determinada condição for avaliada como
verdadeira.
• Sintaxe:
WHILE <condicao>
comandos sql
BREAK: força a saída do laço
[BREAK]
CONTINUE: reinicia o loop.
[CONTINUE]
– A condição deve ser expressa por uma expressão lógica que
retorna Verdadeiro ou Falso e pode conter um SELECT, que deve
estar entre parênteses
2008.2
Exemplo
declare @qtd int, @qtdIt int
set @qtd = (select count(*) from pedido)
set @qtdIt = (select count(*) from itens)
select @qtd, @qtdIt
While (@qtd >= @qtdIt)
Begin
Print ('Quantidade de Pedidos é maior')
set @qtdIt = @qtdIt + 1
Print ('Valor de @qtd é ' + convert (varchar(5), @qtd))
Print ('Valor de @qtdIt é ' + convert (varchar(5), @qtdIt))
If (@qtd < @qtdIt)
Begin
Print ('Vou parar')
Break
End
Else
Begin
Print ('Vou continuar')
Continue
End
End
Go
2008.2
Estrutura de Repetição: WHILE
• Exemplo: Criar uma stored procedure que reajuste
o preço dos produtos de acordo com as seguintes
regras:
– O percentual de aumento dos produtos será fornecido
como parâmetro
– Os produtos só sofrerão reajuste desde que a média de
preço seja inferior ao valor de uma média passado como
parâmetro
– Os produtos sofrerão reajustes repetidas vezes até que o
maior preço não ultrapasse o limite estabelecido por
parâmetro
2008.2
Estrutura de Repetição: WHILE
CREATE PROCEDURE spReajusta
@percentual numeric(5,2), @media money, @maior money
AS
WHILE (SELECT AVG(venda) FROM produto) < @media
BEGIN
UPDATE produto
SET venda = venda*(1+@percentual/100)
Print ('Atualiza o preço')
IF (SELECT MAX(venda) FROM produto) >= @maior
BREAK
ELSE
Print ('continua')
END
Download

Stored Procedures-Parte 02