Hugo Pedro Proença, © 2007 Stored Procedures À medida que a complexidade dos sistemas aumenta, torna-se cada vez mais difícil a tarefa de integrar o SQL com as aplicações cliente. z Além disto, é necessário que todas as aplicações cliente conheçam minuciosamente a estrutura da base de dados. z Por outro lado, l d o elevado l d número ú d de pedidos did a partir i d de uma grande quantidade de clientes pode deteriorar o desempenho do sistema. z Os procedimentos guardados no servidor (Stored procedures) são um mecanismo essencial na implementação de sistemas de bases de dados robustos. z Hugo Pedro Proença, © 2007 Stored Procedures z Os seus benefícios resultam primariamente do facto de serem executados no ambiente do servidor. z z z z z São executados em processos do servidor. Servidor contém os dados Não será mais lógico que as rotinas de interacção com os dados sejam executadas no mesmo ambiente? Aproveitam mecanismos de optimização de desempenho disponibilizados pelo SGBD Podem devolver ou alterar valores e receber parâmetros de entrada. Hugo Pedro Proença, © 2007 Stored Procedures - Vantagens z Desempenho Tipicamente Ti i t a máquina á i servidora id de d bases b de d dados tem maior capacidade de processamento em relação a um vulgar posto de trabalho. z Elimina Eli i a necessidade id d de d múltiplas últi l transmissões de dados através da rede. z São compilados aquando da primeira execução e depois g guardados a dados n numa ma tabela de sistema sistema. É também anexa informação sobre o melhor caminho para os dados. z Hugo Pedro Proença, © 2007 Stored Procedures - Vantagens z Separabilidade Cliente/Servidor z Facilitam F ilit a identificação id tifi ã clara l entre t as tarefas t f que devem ser executadas pelo lado do cliente e do servidor. z Cliente. Cli t z Análise e interpretação dos resultados z Criação de pedidos z Servidor z Interacção com a informação Hugo Pedro Proença, © 2007 Stored Procedures - Vantagens z Segurança z Todas T d as operações õ usuais i (inserção, (i ã alteração, remoção, consulta) podem ser executadas a partir de stored procedures. z As A aplicações li õ cliente li t deixam d i de d necessitar it de um conhecimento completo e minucioso da estrutura da base de dados. Hugo Pedro Proença, © 2007 Stored Procedures z Definição z CREATE PROCEDURE <nome>[;versao] [@<parametro1> <tipo> [=<default>] [OUT] ... AS <BLOCO T-SQL> Hugo Pedro Proença, © 2007 Stored Procedures z Exemplo z CREATE PROCEDURE selecciona_empregados AS SELECT * FROM Empregados; z Este procedimento iria devolver todos os atributos de todas as instâncias de “Empregados” Hugo Pedro Proença, © 2007 Stored Procedures z Execução z Execute <nome_procedimento> @<parametro1>,... @<parametroN> p z Dentro de stored procedures podem-se executar todos os tipos de instruções T-SQL excepto blocos “CREATE “ Hugo Pedro Proença, © 2007 Stored Procedures z Parâmetros z Flexibilizam a utilização de stored procedures. Deve ter-se em atenção que: São locais aos procedimentos onde estão definidos z Devem D ser precedidos did de d “@” para iindicar di que se trata de um valor de um parâmetro e não outro objecto qualquer. z Hugo Pedro Proença, © 2007 Stored Procedures z Parâmetros – EXEMPLO 1 z Criação de um procedimento para devolver toda a informação acerca de determinado empregado: z CREATE PROCEDURE infEmpregado(@id int) AS SELECT * FROM Empregado WHERE Codigo=@id Hugo Pedro Proença, © 2007 Stored Procedures z Parâmetros – EXEMPLO 2 z Criação de um procedimento para inserir informação relativa a um empregado z CREATE PROCEDURE insEmpregado(@id int, int @nome VARCHAR(80), @profissao int) AS INSERT INTO Empregado(@id,@nome); E d (@id @ ) INSERT INTO ProfEmpreg(@id,@profissao); Hugo Pedro Proença, © 2007 Stored Procedures z Parâmetros – Valores p/ Omissão z Pode-se definir um valor de omissão para cada um dos parãmetros: z z CREATE PROCEDURE insEmpregado(@id int, @nome VARCHAR(80) @profissao VARCHAR(80), @ fi int i = 5) AS INSERT INTO Empregado(@id,@nome) INSERT INTO ProfEmpreg(@id,@profissao) ProfEmpreg(@id @profissao) Neste caso, sempre que não fôr colocada a profissão do novo empregado, é-lhe atribuida a profissão com código “5”. 5 . Hugo Pedro Proença, © 2007 Valores de Retorno z Valores de Retorno z Pode-se retornar informação a partir de um procedimento de 5 formas distintas: z SELECT Æ Deve ser utilizado exclusivamente como resposta aos pedidos de informação efectuados pelas aplicações cliente. z PRINT Æ Envio de mensagens não-criticas aos utilizadores (não aos programadores!) z RAISEERROR Æ Envio de mensagens críticas aos utilizadores z Parâmetros de Saída e valor de retorno Æ Enviados à aplicação cliente como indicativos de estado da execução. Hugo Pedro Proença, © 2007 Parâmetros de Saída Correspondem a parâmetros passados por referência. O seu valor pode ser alterado dentro do procedimento e essa alteração terá efeito fora do âmbito do procedimento. z Declaração z Na declaração do procedimento procedimento, basta colocar a palavra chave “OUTPUT” a seguir ao tipo de dados do parâmetro. z Execução z Ao executar o procedimento é necessário indicar que o parâmetro é de saída z Hugo Pedro Proença, © 2007 Parâmetros de Saída z Exemplo z CREATE Procedure XYZ( @a int, @b int OUTPUT) AS SELECT @b=10 RETURN z Será necessário que, na declaração, seja colocad a explicitamente a informação de que o parãmetro é de saída: í z DECLARE @v int, @z z EXECUTE XYZ(@z, ( , @v OUTPUT) ) Hugo Pedro Proença, © 2007 Valores de Retorno z Uso de “Return” Serve para terminar a execução de um procedimento, podendo disponibilizar um valor indicativo do estado de execução. z Sintaxe z RETURN [<valor_inteiro>] z O valor de retorno deve servir exclusivamente para o p p programador g e nunca p para o utilizador de uma aplicação-cliente z Pode-se utilizar em qualquer ponto de um procedimento,, sendo q p que as instruções ç q que se lhe seguem não serão executadas. z Hugo Pedro Proença, © 2007 Valores de Retorno z O SGBD disponibiliza por omissão valores indicativos do estado relativo à execução d cada de d procedimento: di t 0 Æ Execução com sucesso z -1Æ Falta de um objecto j z ... z 99 Æ z Estes valores são sempre devolvidos devolvidos, mesmo que não exista a correspondente instrução “RETURN” dentro do procedimento. z Cabe ao utilizador criar códigos que não interfiram com os criados por omissão (Valores Naturais). z Hugo Pedro Proença, © 2007 Valores de Retorno Implícitos z – Exemplo 1: z CREATE procedure procedimento1 as SELECT * FROM Empregado; Declare @status int z Execute @status=procedimento1 z SELECT @status z Hugo Pedro Proença, © 2007 Valores de Retorno Explícitos z – Exemplo 1: z CREATE procedure procedimento1 as SELECT * FROM Empregado; RETURN 5; Declare @status int z Execute @status=procedimento1 z SELECT @status z Hugo Pedro Proença, © 2007 Stored Procedures z Regras práticas: z z z z z z Atribua sempre que possível valores por omissão Devolva valores de retorno significativos Avalie os valores de retorno após a execução de cada procedimento V ifi Verifique @@error @@ após ó cada d bloco bl que envolva l alteração da informação. Crie os novos procedimentos off-line Nunca devolva informação da BD através de valores de retorno ou de procedimentos de saída Hugo Pedro Proença, © 2007 Stored Procedures – Variáveis z Definição de variáveis – Dentro de um procedimento as variáveis são definidas da seguinte forma: • DECLARE @<nome> <Tipo> – Exemplo: • DECLARE @x VARCHAR(100); Hugo Pedro Proença, © 2007 Stored Procedures – Variáveis z Atribuição de variáveis – As variáveis são normalmente atribuídas dentro de um bloco SQL através da instrução SELECT: – Exemplos: • SELECT @nome=‘João António’ •S SELECT C @tota @total=COUNT(*) COU ( ) FROM O Empregados • SELECT @x=1 Hugo Pedro Proença, © 2007 Controlo de Execução z A Linguagem T-SQL como extensão ao ANSI-SQL fornece um conjunto de instruções de controlo da execução de blocos. z Estas instruções permitem transferir para dentro de procedimentos grande parte das operações de manuseamento e interacção com a informação. Hugo Pedro Proença, © 2007 Controlo de Execução z Execução Condicional – Através das palavras-Chave “IF” e “ELSE” pode-se condicionar a execução de determinado bloco . – Forma: • IF <expressão> <BLOCO> ELSE <BLOCO> Hugo Pedro Proença, © 2007 Controlo de Execução z Execução Condicional – Tal como na generalidade das linguagens estruturadas, quando um bloco é composto por mais que uma instrução deve ser delimitado pelas palavras-chave “BEGIN” e “END” • Exemplo: – IF @x>1 BEGIN INSERT INTO T(1) INSERT INTO R(2) END Hugo Pedro Proença, © 2007 Controlo de Execução z Execução Repetida – Pode Pode-se se usar a palavra-chave palavra chave “WHILE” WHILE para definir uma condição que irá determinar o número de vezes que um bloco será executado. – Forma: • WHILE <expressão_booleana> <expressão booleana> BEGIN <bloco> END Hugo Pedro Proença, © 2007 Controlo de Execução z Execução Repetida – A palavra-chave “BREAK” serve, como seria de esperar, para terminar a execução dentro do bloco iterativo onde estiver incluída. – A palavra-chave “CONTINUE” servirá envia a execução para a avaliação da expressão booleana. Hugo Pedro Proença, © 2007 Controlo de Execução z Variáveis Globais – São definidas pelo Sistema Gestor de Bases de Dados e têm alcance sobre todos os procedimentos criados. – Nunca se podem declarar variáveis locais com o mesmo nome das variáveis de ambiente (globais) – Acede-se ao seu valor através do uso de “@@” • @@ERROR Æ Código de erro do ultimo bloco SQL • @@ROWCOUNT Æ Número de linhas afectadas pelo ultimo bloco. • @@TRANCOUNT Æ Número total de transacções activas do utilizador. Hugo Pedro Proença, © 2007 Tabelas Temporárias z È por vezes imprescindível a criação de tabelas temporárias para registarem valor que irão ser necessários p posteriormente ( (mas ainda no âmbito do procedimento actual. – No entanto, o SGBD não permite a execução da instrução “CREATE” – Nestas situações, podem-se criar tabelas temporárias simplesmente através do uso do caracter # – Exemplo: • INSERT INTO #t1 SELECT * FROM Empregados Hugo Pedro Proença, © 2007 Tabelas Temporárias z Da execução do bloco anterior resultaria uma nova tabela “#t” criada internamente na base de dados “temp” e que o utilizador pode aceder como se de outra tabela qualquer se tratasse. tratasse – SELECT * FROM #t É imprescindível que o utilizador apague explicitamente a tabela antes de terminar a execução do procedimento z Deve e e te ter-se se e em ate atenção ção o retorno eto o em e casos imprevistos ou excepcionais. z – Mesmo nestes, a eliminação da tabela deve ser efectuada.