You are on page 1of 6

Laboratrio 4

Base de Dados II
2008/2009


Plano de Trabalho Referncias
Lab. 4: Programao em Transact-SQL




MICROSOFT SQL SERVER
- Procedimentos do Lado do Servidor (Stored
Procedures) - cont.
- Exerccios

http://dev.mysql.com/doc


1. Conceito.
- Stored Procedures so semelhantes a subrotinas ou subprogramas desenvolvidos
noutras linguagens de programao (p.e. C, Pascal, Basic, Java, etc.), mas que so
guardados no servidor.
- Aceitam parmetros de entrada e retornam resultados. Isto , como qualquer
subprograma, um procedimento permite a passagem de parmetros de entrada e de
sada, aceitando valores e devolvendo algum tipo de resultado entidade que o
invocou, que pode ser um outro procedimento, um gatilho ou mesmo uma aplicao
externa cliente.
- Retornam um valor de status indicando se aconteceu um erro, e qual foi.
- So basicamente blocos de instrues SQL compiladas num nico plano de
execuo.

EXERCCIOS I
(base de dados Livro&Livro)


Exerccio 1. (Exerccio 5 da aula prtica 3 aqui repetido por convenincia).
Crie um procedimento que nos fornea o total de vendas por livro, para uma dada coleco
e ano de vendas. Vamos supor que a coleco a A e que o ano o 2000.
Estratgia.
- Vamos comear por por seleccionar na tabela Vendas os registos que correspondem s
vendas de livros efectuadas no ano 2000.
- Ao mesmo tempo, aproveitamos para fazer a combinao das tabelas Vendas e Vendas-
Detalhes atravs duma operao de juno, mais concretamente uma equijuno. Desta
operao, obtemos todos os livros vendidos, assim como a restante informao
relacionada com os valores das vendas de livros para o ano pretendido.
- De seguida, e agora com base na tabela Livros, seleccionamos todos os livros que
pertencem coleco indicada e continuamos o processo de clculo, combinando os
resultados obtidos nas duas etapas anteriores novamente atravs duma equijuno.
- Por fim, agrupamos a informao obtida por livro, de forma a ser possvel calcular o
total de vendas por livro, ordenando a lista de livros alfabeticamente.

-- Procedimento que fornece a relao das vendas
-- referentes coleco A do ano 2000, ordenadas por livro

CREATE PROCEDURE VendasLivrosColeccaoAno2000
AS
SELECT VD.Livro, L.Designao, SUM(VD.Total) AS Total
FROM
(SELECT D.Livro, V.Total
FROM Vendas As V, [Vendas-Detalhes] AS D
WHERE SUBSTRING(CONVERT(nvarchar(22),V.Data,111),1,4)=2000 AS VD,
(SELECT Cdigo, Designao, Coleco
FROM Livros p
WHERE Coleco =A) AS L
WHERE L.Cdigo = VD.Livro
GROUP BY VD.Livro, L.Designao
ORDER BY VD.Livro ASC

O exemplo anterior mostra, por omisso, como a passagem de parmetros das linguagens
de programao poderiam ser teis na construo de procedimentos do lado do servidor
(stored procedures). Por exemplo, teramos todo o interesse em usar o procedimento
anterior para uma outra coleco e um outro ano. No entanto, isso no possvel.

Parmetros de Entrada
atravs de parmetros de entrada que se passa informao para dentro dum procedimento.

Exerccio 2.
Crie um procedimento que nos fornea o total de vendas por livro, para uma dada coleco
e ano de vendas. Isto obriga a reformular o procedimento do exerccio anterior de modo a
passar-lhe dois parmetros concretos.
O primeiro referente a uma dada coleco e ser armazenado na varivel ou parmetro
formal @CdigoColeco.
O segundo refere-se a um ano especfico e ser armazenado na varivel ou parmetro
formal @AnoDeVendas.

-- T-SQL 6.7 - Criao do procedimento
-- VendasLivrosPorColeccaoPorAno.
--
-- Procedimento que nos fornece uma relao das vendas
-- realizadas, por coleco e por ano,
-- agrupando-as por livro.

CREATE PROCEDURE VendasLivrosPorColeccaoPorAno
(@CdigoColeco VARCHAR(03), @AnoDeVendas VARCHAR(4))
AS
PRINT 'Vendas por Coleco/Ano, Agrupadas por Livro'
PRINT 'Coleco: ' + CONVERT(varchar(3), @CdigoColeco)
PRINT 'Ano: ' + CONVERT(varchar(4), @AnoDeVendas)
PRINT ''

SELECT VD.Livro, L.Designao, SUM(VD.Total) AS Total
FROM (SELECT D.Livro, V.Total FROM Vendas AS V, [Vendas-Detalhes] AS D
WHERE SUBSTRING(CONVERT(nvarchar(22),V.Data,111),1,4)=@AnoDeVendas) AS VD,
(SELECT Cdigo, Designao, Coleco
FROM Livros p
WHERE Coleco = @CdigoColeco) AS L
WHERE L.Cdigo = VD.Livro
GROUP BY VD.Livro, L.Designao
ORDER BY VD.Livro ASC

--
--

Nota: Podemos definir os valores por omisso dos parmetros de cada procedimento no
SQL Server Management Studio, bastando para tal seleccionar o procedimento e depois os
respectivos parmetros com o rato.
Vejamos um exemplo de execuo:

USE Livro&Livro
EXECUTE VendasLivrosPorColecoPorAno a, 2002

Parmetros de Sada
atravs de parmetros de sada que um procedimento devolve ou passa informao para o
exterior.

Exerccio 3.
Crie um procedimento que nos fornea alguns dados (nmero, nome e total) sobre o cliente
que, no dia de hoje, efectuou o maior volume de compras na Livro&Livro.

-- T-SQL 6.8 - Criao do procedimento MelhorClienteDeHoje.

CREATE PROCEDURE [MelhorClienteDeHoje]
@NmeroCliente INT OUTPUT,
@NomeCliente VARCHAR(50) OUTPUT,
@TotalCliente MONEY OUTPUT
AS
SELECT
@NmeroCliente=C.Nmero,@NomeCliente=C.Nome,@TotalCliente=sum(V.Total)
FROM Vendas as V INNER JOIN Clientes AS C ON V.Cliente=C.Nmero
WHERE convert(varchar(11),V.Data,111)=convert(varchar(11),getdate(),111)
GROUP BY C.Nmero, C.Nome
ORDER BY sum(V.Total) DESC
--
--

Aps a criao deste procedimento estamos em condies de analisar a sua execuo e
observar a forma como os parmetros so utilizados. Para isso, vamos executar:

USE Livro&Livro
DECLARE @NmeroCliente INT, @NomeCliente VARCHAR(50), @TotalCliente MONEY
EXECUTE MelhorClienteDeHoje @NmeroCliente OUTPUT, @NomeCliente OUTPUT,
@TotalCliente OUTPUT
PRINT Melhor cliente de hoje ( + CONVERT(VARCHAR(11),GETDATE(),111) +
na loja:
PRINT CONVERT(VARCHAR(10),@NmeroCliente)
PRINT @NomeCliente
PRINT CONVERT(VARCHAR(25),@TotalCliente)

As variveis declaradas antes da execuo do procedimento no tm que ter o mesmo nome
que os parmetros formais, mas os tipos de dados tm de ser os mesmos, ou serem pelo
menos compatveis.

H uma outra forma de passar informao de dentro para fora dum procedimento. Para isso
utiliza-se a instruo RETURN. No entanto, semelhana da linguagem C, com esta forma
de passar informao s se pode passar um dado ou resultado.

Exerccio 4.
Crie um procedimento que nos fornea o nmero de livros vendidos hoje pela
Livro&Livro.

-- T-SQL 6.9 : Procedimento NmeroLivrosVendidosHoje.
--

CREATE PROCEDURE NmeroLivrosVendidosHoje
AS
DECLARE @NmeroLivros as SMALLINT
SELECT @NmeroLivros = COUNT(VD.Livro)
FROM Vendas AS VE, [Vendas-Detalhes] AS VD
WHERE VE.Nmero = VD.Nmero AND
CONVERT(nvarchar(22), VE.Data, 111) =
CONVERT(nvarchar(22),getdate(), 111)
RETURN @NmeroLivros

--
--

Repare-se na declarao da varivel @NmeroLivros imediatamente antes do SELECT,
sendo o seu valor devolvido com RETURN aps o SELECT.
Para se perceber como e onde que o valor de retorno guardado, observe-se o seguinte
cdigo de execuo:

USE Livro&Livro
DECLARE @NmeroLivrosVendidos SMALLINT

EXECUTE @NmeroLivrosVendidos = NmeroLivrosVendidosHoje

PRINT Nmero de livros vendidos hoje:
PRINT CONVERT(VARCHAR(5), @NmeroLivrosVendidos)

Como se pode observar, semelhana do que acontece em C, do lado exterior ao
procedimento h uma varivel que, atravs do operador de atribuio, guarda o valor de
retorno do procedimento.