You are on page 1of 10

BASES DE DADOS II Plano de Trabalho Lab.

5: Programao em Transact-SQL - Procedimentos do Lado do Servidor (Stored Procedures)

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.

2. Propsitos/Vantagens.
- Diminuio do trfego na rede. A execuo destes programas no seio de um servidor permite reduzir substancialmente o trfego de rede provocado por aplicaes que solicitem ao servidor a execuo de instrues SQL. O servidor passa a ser assim no s servidor de dados, mas tambm servidor de programas para a manipulao dos dados. - Programao por mdulos. Um stored procedure aps ser guardado na BD, pode ser invocado vrias vezes num programa. Pode tambm ser alterado sem que haja necessidade de alterar em todos os lados. - Execuo mais rpida. Se uma operao tem muitas instrues T-SQL e/ou executada muitas vezes, os stored procedures conseguem ser mais rpidos, pois so compilados e optimizados no momento da sua criao. - Segurana. Pode ser dada permisso aos utilizadores para executar um stored procedure, mesmo que no tenham permisso para utilizar o mesmo cdigo directamente atravs de um editor. 3. Exemplos. Exemplo 1: CREATE PROC Cli AS SELECT * FROM CLIENTE EXEC cli

Exemplo 2: ALTER PROC Cli @CodCli int AS SELECT * FROM CLIENTES WHERE ClienteID = @CodCli EXEC Cli 1

4. Sintaxe.
CREATE PROC[EDURE] procedure_name [;number] [ {@parameter data_type} [VARYING] [= default] [OUTPUT] ] [,...n] [WITH { RECOMPILE | ENCRYPTION | RECOMPILE, ENCRYPTION } ] [FOR REPLICATION] AS sql_statement [...n]

4.1. Argumentos procedure_name Is the name of the new stored procedure. Procedure names must conform to the rules for identifiers and must be unique within the database and its owner. Local or global temporary procedures can be created by preceding the procedure_name with a single number sign (#procedure_name) for local temporary procedures and a double number sign (##procedure_name) for global temporary procedures. The complete name, including # or ##, cannot exceed 128 characters. Specifying the procedure owner name is optional. ;number Is an optional integer used to group procedures of the same name so they can be dropped together with a single DROP PROCEDURE statement. For example, the procedures used with an application called orders may be named orderproc;1, orderproc;2, and so on. The statement DROP PROCEDURE orderproc drops the entire group. If the name contains delimited identifiers, the number should not be

included as part of the identifier; use the appropriate delimiter around procedure_name only. @parameter Is a parameter in the procedure. One or more parameters can be declared in a CREATE PROCEDURE statement. The value of each declared parameter must be supplied by the user when the procedure is executed (unless a default for the parameter has been defined). A stored procedure can have a maximum of 1,024 parameters. Specify a parameter name using an at sign (@) as the first character. The parameter name must conform to the rules for identifiers. Parameters are local to the procedure; the same parameter names can be used in other procedures. By default, parameters can take the place only of constants; they cannot be used in place of table names, column names, or the names of other database objects. data_type Is the data type of the parameter. All data types, including text and image, can be used as a parameter for a stored procedure. However, the cursor data type can be used only on OUTPUT parameters. When you specify a data type of cursor, the VARYING and OUTPUT keywords must also be specified VARYING Specifies the result set supported as an output parameter (constructed dynamically by the stored procedure and whose contents can vary). Applies only to cursor parameters. default Is a default value for the parameter. If a default is defined, the procedure can be executed without specifying a value for that parameter. The default must be a constant or it can be NULL. It can include wildcard characters (%, _, [], and [^]) if the procedure uses the parameter with the LIKE keyword.

4.2.

Parmetros

possvel passar parmetros para a um stored procedure, que podem ser utilizados como variveis dentro do stored procedure. Os stored procedures tambm podem retornar valores. Para cada parmetro necessrio definir o nome, o tipo de dados, a direco (entrada ou sada) e o valor defeito (opcional).

Exemplo 3 (de parmetros de entrada) ALTER PROC Cli @CodCli int=NULL, @InicioNome Varchar(40) AS SELECT * FROM CLIENTES WHERE ClienteID > @CodCli AND Nome LIKE (@InicioNome+'%') EXEC Cli 2, 'A' ou EXEC Cli @InicioNome = 'A', @CodCli=2 Exemplo 4 (de parmetros de sada): ALTER PROC Cli @CodCli int, @InicioNome Varchar(40), @TotalReg int OUTPUT AS SELECT @TotalReg = COUNT(*) FROM CLIENTES WHERE ClienteID > @CodCli AND Nome LIKE (@InicioNome+'%') DECLARE @Tot int EXEC Cli 1, 'A', @TotalReg = @Tot OUTPUT PRINT 'Numero de registos = ' + cast(@Tot AS Varchar(10)) Exemplo 5 (de parmetro de resultado): ALTER PROC Cli @CodCli int, @InicioNome Varchar(40), @TotalReg int OUTPUT AS BEGIN SELECT @TotalReg = COUNT(*) FROM CLIENTES WHERE ClienteID > @CodCli AND Nome LIKE (@InicioNome+'%') RETURN @@ERROR END

DECLARE @Tot int, @Erro int EXEC @Erro = Cli 1, 'A', @TotalReg = @Tot OUTPUT IF @Erro <> 0 Print 'Ocorreu um erro !' ELSE PRINT 'Numero de registos = ' + cast(@Tot AS Varchar(10))

5. Criao.
H 3 formas de criar procedimentos no servidor de bases de dados: Procedure Wizard Enterprise Manager Instrues Transact-SQL no Query Analyser

EXERCCIOS I (base de dados Livro&Livro) Exerccio 1. (Backup Wizard) Crie um procedimento para inserir um novo autor na tabela Autores da bases de dados Livro&Livro carregada na aula prtica anterior. O nome do procedimento aquele sugerido pelo wizard, i.e.: insert_Autores_1 Antes de finalizar a criao deste procedimento (ou seja, antes de clicar no boto Finish), clique no boto Edit para editar o cdigo SQL. Tente compreend-lo tanto quanto possvel. Ser que existem parmetros de entrada? Quais so? Exerccio 2. (Query Analyzer) Execute o procedimento anterior insert_Autores_1 no Query Analyzer e verifique o que acontece em termos de output e na tabela Autores que foi afectada. Os dados de entrada so os seguintes: 1000 e Tiago Pereira A instruo de execuo a seguinte: EXECUTE insert_Autores_1 1000, Tiago Pereira Exerccio 3. Escreva um procedimento chamado Livros_Nao_Disponiveis que permita obter uma lista dos livros no disponveis ou esgotados. Esta lista deve conter o Cdigo, Designao e Preo de Venda de todos os livros cujo stock real 0. -- Procedimento que nos fornece uma lista com os livros ---- esgotados; existncia em stock igual a 0 CREATE PROCEDURE [Livros_Nao_Disponiveis] AS SELECT Cdigo, Designao, [Preo-Venda] FROM livros WHERE [Stock-Real]=0 Todo o processo de criao de um procedimento semelhante ao de criao duma inquirio (query). A nica, e grande, diferena que depois de executar o comando CREATE PROCEDURE, o SQL Server armazena o procedimento para que possa mais tarde a ser executado. Exerccio 4. (Query Analyzer) Execute o procedimento do exerccio anterior. USE Livro&Livro EXECUTE Livros_Nao_Disponiveis Questes: - O que que acontece se no usarmos USE Livro&Livro?

- Quantos parmetros de entrada tem este procedimento? - Quantos parmetros de sada tem este procedimento? Exerccio 5. 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 correspondentes s vendas do 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 pertenam 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 VendasLivrosColecoAAno2000 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

EXERCCIOS II (base de dados ?&?) Exerccio 2. Criar uma stored procedure que mediante a entrada de 2 variveis (Cod e Nome) insira um registo no ficheiro de clientes e devolva um erro se acontecer algum problema. Exerccio 2. Criar uma stored procedure que mediante a passagem dos parmetros descrio da famlia, data inicio e data fim, devolva a quantidade vendida dessa famlia nesse perodo. Exerccio 2. Criar uma stored procedure que determine qual os dois cdigos de famlia de artigos com mais vendas, num determinado perodo. EXEC FamiliasMaisVendida '1991/01/01', '1999/01/01' FamiliaID Quantidade -------------- ----------1 17 5 6 Exerccio 2. Criar uma stored procedure que mediante a passagem de uma string, mostre todas as descries de artigos e todas as descries de famlias que tenham essa string, ordenadas. EXEC DescFamArt 'a' Descricao ---------------------------------------Cala ganga azul Cala ganga branca Cala ganga preta Calas Exerccio 2. Criar uma stored procedure que devolva a mdia de descontos por factura. Mdia 1133.33

Ex. Criar uma stored procedure que devolva o primeiro e o terceiro desconto de factura, desde que acima da mdia de descontos das factura. Primeiro 6000 Terceiro 5500

You might also like