FAPLAN - Faculdade Anhanguera Passo Fundo Gestão da Tecnologia da Informação Banco de Dados II Prof. Eder Pazinatto Stored Procedures Procedimento armazenados dentro do banco de dados Um Stored Procedure é um conjunto de comandos SQL definidos pelo usuário que fica armazenado no banco de dados como um procedimento/função, para eventuais processamentos. Além de simples Selects, podem armazenar lógica do negócio, possuir loops, trabalhar com variáveis, imprimir mensagens de erro, etc. São processamentos aplicações(determinadas tarefas) que residem no SGBD ao invés de no código da aplicação (máquina cliente). Algumas vantagens que podemos ter usando Stored Procedures. Desempenho: Ex.: Seja a consulta SELECT p.codigop, a. nome, COUNT(*) FROM Projeto p, Alocacao a WHERE p.codproj = a.codigop GROUP BY p.codproj, p.nome Se vários usuários realizarem esta consulta o tráfego de rede será alto. No entanto, se criarmos uma stored procedure para executar esta consulta, os usuário necessitaram apenas de um comando para executar a consulta anterior: EXEC nomeprocedimento; Outro ponto é a compilação, a consulta anterior seria compilada a cada chamada, enquanto o procedimento contendo a consulta seria compilado (e armazenado na memória) uma única vez para as várias chamadas. Facilita o gerenciamento do BD: pois a consulta é escrita em um único lugar, portanto a manutenção desta torna-se mais eficaz e segura. Segurança: podemos usar stored procedures para limitar o acesso de alguns usuários ao BD. Desta forma, a maneira em que o BD pode ser modificado é estritamente definida. O formato dos procedimentos mudam em relação a versão e tipos de SGBDs. O Mysql, suporta desde a versão 5. O formato dos procedimentos mudam em relação a versão e tipos de SGBDs. O Mysql, suporta desde a versão 5.0. 1
Exemplos: utilizando o SGBD Oracle 10g Procedimento para aumentar a nota do aluno, passando como parâmetro a matrícula do aluno. CREATE OR REPLACE PROCEDURE aumentanota (cod2 IN aluno.mat%type) IS UPDATE aluno SET nota = nota * 1.5 WHERE cod2 = aluno.mat; END aumentanota; Informações: Replace: caso o procedimento exista, ele será editado Aumentanota: nome do procedimento Cod2 parâmetro, indica o nome da variável PL/SQL que é passada na chamada da procedure ou o nome da variável que retornará os valores da procedure. IN: é o modo. Indica que o parâmetro é de entrada (IN), saída (OUT) ou ambos (IN OUT). IN é o modo default, ou seja, se não informarmos nada o modo do nosso parâmetro será, automaticamente, IN; TYPE: indica o tipo de dado do parâmetro, com o comando aluno.mat% está informando que o parâmetro é do mesmo tipo e tamanho do campo mat da tabela aluno. IS AS - a sintaxe do comando aceita tanto IS como AS. Por padrão usamos IS na criação de procedures e AS quando estivermos criando pacotes no Orcale 10g. Begin End: início e fim de uma comando PL/SQL no Oracle Executar o procedimento: o procedimento pode ser executado de três forma diferentes, vai depender do tipo de procedimento e a versão do SGBD // Bloco PL/SQL begin aumentanota(0722); // 0722 matrícula que sofrer a ação end; // Chamando o procedimento CALL aumentanota(0722); // 0722 matrícula que vai sofrer a ação // Executando o procedimento EXECUTE aumentanota(0722); // 0722 matrícula que sofrer a ação 2
Exemplo 2: procedimento para excluir um aluno CREATE OR REPLACE PROCEDURE deletaaluno (matricula NUMBER) IS DELETE FROM aluno WHERE matricula = aluno.mat; END Execução do procedimento: begin deletaaluno(0722); end; * Passível de RollBack. Se não estiver por default a opção Commit Exemplos: utilizando no MySQL O MySql também utiliza parâmetros IN, OUT e INOUT, mas de maneira diferente do Oracle. A seguir, há um exemplo bastante simples de procedimentos no MySQL. Exemplo: apresentação de uma mensagem, sem envolvimento de tabelas. CREATE PROCEDURE Mesg( ) SELECT olá td bem ; Executando o procedimento: CALL Mesg( ); Exemplos: utilizando o SGBD SQL-Server Exemplo 1: CREATE PROCEDURE DBO.MostraEmpregadosDep @nomedep varchar(50) = Informática - - Departamento padrão AS SELECT e.mat, e.nome, e.endereco, e.salario FROM Empregados e, Departamento d WHERE d.nomed = @nomedep Uma chamada a este procedimento seria: USE Empresa -- Empresa nome do banco EXEC MostraEmpregadosDep Para passer um departamento como parâmetro EXEC MostraEmpregadosDep Informatica Exemplo 2: CREATE PROCEDURE InsereEmpregado @mat int, @nomee varchar(30), @endereco varchar(60), @salario float, @depto int AS INSERT INTO Empregado VALUES (@mat, @nomee, @endereco, @salario, @depto) Para execução do procedimento, chamá-lo e passar o conteúdo das variáveis com parâmetro 3
Alguns Stored Procedures, já definidos exemplo no SQL-Server - sp_tables: mostra todos os nomes das tabelas do catálogo - sp_store_procedures: mostra todos os stored procedures - sp_server_info: mostra configuração do SQL-Server - sp_databases: mostra os BD disponíveis - sp_monitor: mostra como o SQL-server está executando (memória, grau de atividade do processador, etc) - sp_who: informa quem está usando o BD num dado instante - sp_help: dá informações sobre qualquer objeto do BD TRIGGERS Regras que especificam ações disparadas automaticamente por meio de eventos Triggers são procedimentos que podem ser gravados no banco de Dados. São executados (ou disparados) implicitamente quando uma tabela é modificada, um objeto é criado ou ocorrem algumas ações de usuário ou de sistema de banco de dados. As triggers são similares as stored procedures diferindo, apenas, na maneira como são chamadas. A trigger é executada implicitamente quando ocorre algum evento de trigger enquanto a stored procedure deve ser executado explicitamente. Uma trigger é composta por três partes: - Evento (operações que ocorrem no banco de dados); - Condição (determina se a ação da regra deve ser executada); - Ação (aquilo que será efetivamente executado pela trigger) O momento em que uma trigger irá pode ser acionada. Pode ser: - BEFORE (em tabelas os comandos são executados antes que os dados da tabela sejam alterados) - AFTER (em tabelas os comando são executados depois que os dos dados da tabela forem alterados) - INSTEAD OF (em visões - indica que a trigger irá ser executada no lugar da instrução que disparou ela. Permite que façamos alterações em uma tabela através de uma visão) Trigger: Sintaxe CREATE [OR REPLACE] TRIGGER [schema.] nome_da_trigger [BEFORE AFTER] [DELETE OR INSERT OR UPDATE[OF coluna]] ON nome_da_tabela_ou_da_view [FOR EACH ROW] [WHEN [condição]] BLOCO PL/SQL -- no caso do Oracle 4
Alguns comando e opções de Triggers: Eliminando a trigger: DROP TRIGGER nome_da_trigger; Desabilitar a trigger: ALTER TRIGGER nome_da_trigger DISABLE; Quando a trigger é criada pela primeira vez ela é habilitada automaticamente. Para habilitar a trigger novamente usar o comando: ALTER TRIGGER nome_da_trigger ENABLE; Exemplo: Trigger que não permite baixar o valor da nota de um aluno(no SGBD Orcale 10g). CREATE OR REPLACE TRIGGER vericanota BEFORE UPDATE OF nota ON aluno FOR EACH ROW WHEN (NEW.nota < OLD.nota) RAISE_APPLICATION_ERROR (-20508,'Meu amigo, a nota nunca pode ser reduzida'); END; A execução do comando de atualização a seguir não vai ser permitida, pois a nota do aluno com a matrícula 0722 é 5.0, e não vai aceitar a redução da nota. A ferramenta irá apresentar uma mensagem de erro('meu amigo, a nota nunca pode ser reduzida ). UPDATE aluno SET nota = 4.8 WHERE aluno.mat=0722; 5