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. Além disto, é necessário que todas as aplicações cliente conheçam minuciosamente a estrutura da base de dados. Por outro lado, o elevado número de pedidos a partir de uma grande quantidade de clientes pode deteriorar o desempenho do sistema. Os procedimentos guardados no servidor (Stored procedures) são um mecanismo essencial na implementação de sistemas de bases de dados robustos.
Stored Procedures Os seus benefícios resultam primariamente do facto de serem executados no ambiente do servidor. 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.
Stored Procedures - Vantagens Desempenho Tipicamente i a máquina servidora de bases de dados tem maior capacidade de processamento em relação a um vulgar posto de trabalho. Elimina i a necessidade d de múltiplas l transmissões de dados através da rede. São compilados aquando da primeira execução e depois guardados numa tabela de sistema. É também anexa informação sobre o melhor caminho para os dados.
Stored Procedures - Vantagens Separabilidade Cliente/Servidor Facilitam a identificação clara entre as tarefas que devem ser executadas pelo lado do cliente e do servidor. Cliente. Análise e interpretação dos resultados Criação de pedidos Servidor Interacção com a informação
Stored Procedures - Vantagens Segurança Todas as operações usuais (inserção, alteração, remoção, consulta) podem ser executadas a partir de stored procedures. As aplicações cliente deixam de necessitar de um conhecimento completo e minucioso da estrutura da base de dados.
Stored Procedures Definição CREATE PROCEDURE <nome>[;versao] [@<parametro1> <tipo> [=<default>] [OUT]... AS <BLOCO T-SQL>
Stored Procedures Exemplo CREATE PROCEDURE selecciona_empregados AS SELECT * FROM Empregados; Este procedimento iria devolver todos os atributos de todas as instâncias de Empregados
Stored Procedures Execução Execute <nome_procedimento> @<parametro1>,... @<parametron> Dentro de stored procedures podem-se executar todos os tipos de instruções T-SQL excepto blocos CREATE
Stored Procedures Parâmetros Flexibilizam a utilização de stored procedures. Deve ter-se em atenção que: São locais aos procedimentos onde estão definidos Devem ser precedidos de @ para indicar que se trata de um valor de um parâmetro e não outro objecto qualquer.
Stored Procedures Parâmetros EXEMPLO 1 Criação de um procedimento para devolver toda a informação acerca de determinado empregado: CREATE PROCEDURE infempregado(@id int) AS SELECT * FROM Empregado WHERE Codigo=@id
Stored Procedures Parâmetros EXEMPLO 2 Criação de um procedimento para inserir informação relativa a um empregado CREATE PROCEDURE insempregado(@id int, @nome VARCHAR(80), @profissao int) AS INSERT INTO Empregado(@id,@nome); @ INSERT INTO ProfEmpreg(@id,@profissao);
Stored Procedures Parâmetros Valores p/ Omissão Pode-se definir um valor de omissão para cada um dos parãmetros: CREATE PROCEDURE insempregado(@id int, @nome VARCHAR(80), @profissao int = 5) AS INSERT INTO Empregado(@id,@nome) INSERT INTO ProfEmpreg(@id,@profissao) @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.
Valores de Retorno Valores de Retorno Pode-se retornar informação a partir de um procedimento de 5 formas distintas: SELECT Deve ser utilizado exclusivamente como resposta aos pedidos de informação efectuados pelas aplicações cliente. PRINT Envio de mensagens não-criticas aos utilizadores (não aos programadores!) RAISEERROR Envio de mensagens críticas aos utilizadores Parâmetros de Saída e valor de retorno Enviados à aplicação cliente como indicativos de estado da execução.
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. Declaração Na declaração do procedimento, basta colocar a palavra chave OUTPUT a seguir ao tipo de dados do parâmetro. Execução Ao executar o procedimento é necessário indicar que o parâmetro é de saída
Parâmetros de Saída Exemplo CREATE Procedure XYZ( @a int, @b int OUTPUT) AS SELECT @b=10 RETURN Será necessário que, na declaração, seja colocad a explicitamente a informação de que o parãmetro é de saída: DECLARE @v int, @z EXECUTE XYZ(@z, @v OUTPUT)
Valores de Retorno Uso de Return Serve para terminar a execução de um procedimento, podendo disponibilizar um valor indicativo do estado de execução. Sintaxe RETURN [<valor_inteiro>] O valor de retorno deve servir exclusivamente para o programador e nunca para o utilizador de uma aplicação-cliente Pode-se utilizar em qualquer ponto de um procedimento, sendo que as instruções que se lhe seguem não serão executadas.
Valores de Retorno O SGBD disponibiliza por omissão valores indicativos do estado relativo à execução de cada procedimento: 0 Execução com sucesso -1 Falta de um objecto... 99 Estes valores são sempre devolvidos, mesmo que não exista a correspondente instrução RETURN dentro do procedimento. Cabe ao utilizador criar códigos que não interfiram com os criados por omissão (Valores Naturais).
Valores de Retorno Implícitos Exemplo 1: CREATE procedure procedimento1 as SELECT * FROM Empregado; Declare @status int Execute @status=procedimento1 SELECT @status
Valores de Retorno Explícitos Exemplo 1: CREATE procedure procedimento1 as SELECT * FROM Empregado; RETURN 5; Declare @status int Execute @status=procedimento1 SELECT @status
Stored Procedures Regras práticas: 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 Verifique @@error após cada bloco que envolva 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
Stored Procedures Variáveis 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);
Stored Procedures Variáveis 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 SELECT @total=count(*) FROM Empregados SELECT @x=1
Controlo de Execução A Linguagem T-SQL como extensão ao ANSI-SQL fornece um conjunto de instruções de controlo da execução de blocos. Estas instruções permitem transferir para dentro de procedimentos grande parte das operações de manuseamento e interacção com a informação.
Controlo de Execução 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>
Controlo de Execução 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
Controlo de Execução Execução Repetida Pode-se usar a palavra-chave WHILE para definir uma condição que irá determinar o número de vezes que um bloco será executado. Forma: WHILE <expressão booleana> WHILE <expressão_booleana> BEGIN <bloco> END
Controlo de Execução 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.
Controlo de Execução 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.
Tabelas Temporárias È por vezes imprescindível a criação de tabelas temporárias para registarem valor que irão ser necessários 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
Tabelas Temporárias 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. SELECT * FROM #t É imprescindível que o utilizador apague explicitamente a tabela antes de terminar a execução do procedimento Deve e ter-se em atenção o retorno o em casos imprevistos ou excepcionais. Mesmo nestes, a eliminação da tabela deve ser efectuada.