FESURV UNIVERSIDADE DE RIO VERDE FACULDADE DE CIÊNCIA DA COMPUTAÇÃO. Stored Procedures e Triggers

Documentos relacionados
PROGRAMAÇÃO EM BANCO DADOS Stored Procedure e Trigger

Laboratório de Banco de Dados Prof. Luiz Vivacqua. PL/pgSQL A Linguagem de programação do PostgreSQL

BANCO DE DADOS II Prof. Ricardo Rodrigues Barcelar

Oracle Database 10g: Fundamentos de SQL e PL/SQL

PL/pgSQL. Introdução. Introdução. Introdução

Bancos de Dados I. Integridade semântica

SQL Procedural. Josino Rodrigues Neto

PROGRAMAÇÃO EM BANCO DADOS Store Procedure e Trigger

Lógica de Programação. Profas. Simone Campos Camargo e Janete Ferreira Biazotto


Triggers. um trigger permite que uma determinada sequência de comandos SQL seja accionada quando um determinado evento ocorre.

Oracle 10g: SQL e PL/SQL

Introdução às funções e procedimentos. SQL suporta funções e procedimentos úteis com tipos de dados específicos

Integridade dos Dados

Bases de Dados 2012/2013 Funções/procedimentos e triggers. Helena Galhardas 2012 IST. Bibliografia. Manual referência PostgreSQL

Page 1. Prof. Constantino Jacob

Triggers e Regras. Fernando Lobo. Base de Dados, Universidade do Algarve

Sistemas de Informação

BANCO DE DADOS II Prof. Ricardo Rodrigues Barcelar

AULA 1 INTRODUÇÃO A BANCO DE DADOS E VISÃO GERAL DO SQL CONCEITUANDO BANCO DE DADOS MODELO RELACIONAL

Projeto de Banco de Dados

TUTORIAL MATLAB Victor Breder 2016

Oracle PL/SQL Overview

Introdução à orientação a objetos

T.I. para o DealerSuite: Servidores Versão: 1.1

2 Segmentação de imagens e Componentes conexas

BANCO DE DADOS. Vinícius Pádua

PL/SQL. Profa. Dra. Cristina Dutra de Aguiar Ciferri. Laboratório de Bases de Dados PL/SQL

PL/pgSQL por Diversão e Lucro

Aula 11: Desvios e Laços

SQL Gatilhos (Triggers)

Tecnologia da Informação

FUNCTION ) RETURNS INTEGER AS $$ DECLARE

LINGUAGEM SQL Linguagem usada em SGBD para: Definir estrutura de dados; Modificar dados em um banco de dados; Especificar restrições de segurança; Rea

PROCEDIMENTOS ARMAZENADOS (Stored Procedures)

Prova de Fundamentos de Bancos de Dados 1 a Prova


UNINGÁ UNIDADE DE ENSINO SUPERIOR INGÁ FACULDADE INGÁ CIÊNCIA DA COMPUTAÇÃO CURSORS. Profº Erinaldo Sanches Nascimento

Tópicos Avançados em Banco de Dados Dependências sobre regime e controle de objetos em Banco de Dados. Prof. Hugo Souza

Manual de Programação TED1000 versão TC100 Ethernet

REITORA Ulrika Arns. VICE-REITOR Almir Barros da Silva Santos Neto. DIRETOR DO NTIC Leonardo Bidese de Pinho

Cadeira de Tecnologias de Informação. Ano lectivo 2009/2010. Sites dinâmicos. Com Expression Web TI2009/10 EWD_1. Filipa Pires da Silva (2009)

Triggers em PostgreSQL. Linguagem de Programação de Banco de Dados. Triggers em PostgreSQL. Triggers em PostgreSQL

UNIVERSIDADE DO TOCANTINS TECNOLOGIA EM ANÁLISE E DESENVOLVIMENTO DE SISTEMAS PRÁTICA EM PROGRAMAÇÃO DE SISTEMAS

PHP INTEGRAÇÃO COM MYSQL PARTE 2

GBC043 - Sistemas de Banco de Dados Funções e Gatilhos no PostgreSQL

trigger insert, delete, update

Banco de Dados II. Triggers e Functions. Prof. Moser Fagundes. Curso TSI Instituto Federal Sul-Rio-Grandense (IFSul) Campus Charqueadas

CRIAÇÃO DE TABELAS NO ACCESS. Criação de Tabelas no Access

Hugo Pedro Proença, 2007

Os passos a seguir servirão de guia para utilização da funcionalidade Acordo Financeiro do TOTVS Gestão Financeira.

Triggers no PostgreSQL

Bases de Dados 2012/2013 Restrições de Integridade em SQL. Helena Galhardas 2012 IST. Bibliografia

Os salários de 15 áreas de TI nas cinco regiões do Brasil

PostgreSQL. André Luiz Fortunato da Silva Analista de Sistemas CIRP / USP alf@cirp.usp.br

Programação Orientada a Objetos SANTOS, Rafael

Aplicativo para geração automática de páginas de gerenciamento on-line de banco de dados para sites

Criando Restrições em Tabelas

Para entender o conceito de objetos em programação devemos fazer uma analogia com o mundo real:

SQL Linguagem de Definição de Dados. Banco de Dados Profa. Dra. Cristina Dutra de Aguiar Ciferri

Consultoria e Treinamento em Bancos de Dados Relacionais

SQL Server Triggers Aprenda a utilizar triggers em views e auditar as colunas atualizadas em uma tabela

O sistema gestor já contem uma estrutura completa de categorias que são transferidas automaticamente para cada empresa nova cadastrada.

Arquitecturas de Software Enunciado de Projecto

Programação WEB II. PHP e Banco de Dados. progweb2@thiagomiranda.net. Thiago Miranda dos Santos Souza

Backup. José Antônio da Cunha CEFET-RN

Logado no OracleXE vamos acessar a opção:

Orientação a Objetos

Criando scanner para dectar BackupExec vulneráveis ao exploit do Metasploit. Inj3cti0n P4ck3t

Fundamentos de Bancos de Dados 3 a Prova Caderno de Questões

FastCube 2.0 Programmer Manual

Comandos de Eletropneumática Exercícios Comentados para Elaboração, Montagem e Ensaios

COMO CRIAR UM PEDIDO DE COMPRAS

Carlos de Salles Soares Neto Segundas e Quartas, 17h40 às 19h10

Marcelo Henrique dos Santos

LEUCOTRON EQUIPAMENTOS LTDA ROTEIRO DE INTERLIGAÇÃO SIP ACTIVE IP COM REGISTRO

A linguagem SQL

Disciplina: Unidade III: Prof.: Período:

Modelo Lógico: Tabelas, Chaves Primárias e Estrangeiras

,QVWDODomR. Dê um duplo clique para abrir o Meu Computador. Dê um duplo clique para abrir o Painel de Controle. Para Adicionar ou Remover programas

Conteúdo programático

Parametrização do Banco de Dados PROGRESS Base de Dados Origem

epucc.com.br SAIBA COMO INCLUIR INFORMAÇÕES DE COLABORADORES, CENTROS DE CUSTO E RATEIO DE DESPESAS

Objetivo do Portal da Gestão Escolar

Registro de Retenções Tributárias e Pagamentos

UNIVERSIDADE DO VALE DO RIO DOS SINOS - UNISINOS CENTRO DE CIÊNCIAS EXATAS E TECNOLÓGICAS - CENTRO 06. Funções, variáveis, parâmetros formais

DOCUMENTO DE REQUISITO DE SOFTWARE

Banco de Dados I. Prof. Edson Thizon

PostgreSQL 8.0. Diogo Biazus

Introdução à Programação. Funções e Procedimentos. Prof. José Honorato F. Nunes honoratonunes@gmail.com

SQL Structured Query Language

OBJETIVO GERAL DA DISCIPLINA

Administração de Banco de Dados. José Antônio da Cunha CEFET - RN

INTRODUÇÃO. No entanto, o que pode ser considerado um produto (resultado) da criação de BDs?

Linguagem de Consulta Estruturada SQL- DML

Transcrição:

FESURV UNIVERSIDADE DE RIO VERDE FACULDADE DE CIÊNCIA DA COMPUTAÇÃO Stored Procedures e Triggers THIAGO BORGES DE OLIVEIRA Definição e implementação de stored procedures e triggers para SGBD's relacionais. Rio Verde, GO Maio/2005

Stored procedures Stored procedure é um programa armazenado no metadata (catálogo) do banco de dados, composto por uma coleção de instruções SQL, PL/SQL, PL/PgSQL (depo do SGBD), que é requisitada por aplicações clientes para realizar determinada operação e retornar ou não resultado. A linguagem de escrita da procedure permite a utilização de estruturas de repetição (while, for), condicionais (if), funções externas (UDF's - User defined functions - Funções definidas pelo usuário), declarar variáveis locais, dentre outros. Uma stored procedure é como uma procedure de uma linguagem de programação comum. Além de possuirem uma linguagem própria de manipulação de dados, algumas implementações de banco de dados (Oracle, Postgre, etc.) possibilitam a criação de stored procedures em linguagens como c e java. Uma stored procedure pode ser recursiva e também chamar outras procedures. As procedures podem combinar três características principais: - passagem de parâmetros - retorno de resultado - execução de tarefas Estas três características podem ser combinadas entre si. Assim, podemos ter uma procedure que recebe parâmetros e retorna resultado, apenas executa uma tarefa, apenas retorna resultado, dentre outras. O resultado retornado por uma stored procedure pode conter uma ou mais linhas, como se fosse uma tabela. Alguns SGBD's não implementam esta funcionalidade atualmente (MySQL). Em outros (Oracle) a procedure que retorna resultado é chamada de "function". As vantagens do uso de stored procedures são: - redução do tráfego de informações na rede: a stored procedure é executada no servidor de banco de dados, enviando apenas o resultado do processamento para o cliente. - velocidade: os dados já estão no local onde as operações são executadas, a redução no tráfego proporciona maior velocidade de execução e também pode-se aliar o fato de um servidor ser uma máquina mais robusta. - compartilhamento de código: várias aplicações clientes (web, desktop) que fazem parte de um mesmo sistema podem fazer as mesmas tarefas sem a necessidade de reescrita do código, diminuindo assim o tamanho das aplicações e facilitando a manutenção devido a permanência das regras em um só local. - passagem de parâmetros: comparada com tabelas e visões, a stored procedure tem a vantagem de receber parâmetros que podem influenciar em seu resultado. Triggers Uma trigger é uma procedure que não recebe parâmetros, não retorna resultado e não pode ser chamada por uma aplicação cliente. Ela somente é disparada pelo SGBD no momento de uma manutenção (insert, update, delete) em um registro (linha) de uma tabela ou view. Como na procedure, uma trigger também pode declarar variáveis, fazer consultas SQL, operações matemáticas, disparar exceções, chamar procedures, etc. É utilizada principalmente para manter a integridade dos dados em um BD, isolar regras de negócio de uma aplicação e facilitar o desenvolvimento e manutenção das aplicações clientes. Uma trigger possui duas variáveis de contexto: OLD e NEW. São vetores com o conteúdo antigo e novo, respectivamente, de cada campo (coluna) da tabela. Não faz sentido porém uma trigger de "insert" ter o vetor OLD já que não existe uma versão antiga do registro. Igualmente, uma trigger de "delete" não possui o vetor NEW já que a operação de exclusão não gera uma versão do registro. Triggers podem ser executadas em dois momentos: antes (before) ou depois (after) da execução da instrução SQL. Em operações de Insert e Update o vetor NEW vem preenchido

com os dados que a instrução SQL continha. A alteração de um ou mais campos deste vetor, em uma "before trigger", será propagada (gravada) no registro físico na tabela. Já o vetor OLD é geralmente read-only (somente leitura). Alguns SGBD's (Oracle, Firebird, PostgreSQL) possibilitam a criação de uma trigger que é disparada para dois ou mais eventos. Assim, podemos ter uma trigger que é disparada ao incluir ou alterar um registro. Para saber que evento está so executado no momento da chamada o SBGD implementa variáveis booleanas para definir a operação (inserting, updating, deleting). No Oracle e PostgreSQL podemos também criar triggers de update que são executadas somente quando determinados campos da tabela são atualizados. Existe também a implementação das chamadas "statement triggers" que, diferentemente das "row triggers" abordadas acima, são executadas apenas uma vez por instrução, mesmo que ela atualize várias ou nenhuma linha. Existe também uma forma de triggers chamada "instead of". Este tipo de trigger permite a atualização de visões (views) que não podem ser atualizadas devido a complexidade de sua instrução sql (junções, por exemplo). É assim chamada porque o SGBD a executa "ao invés de" executar a instrução SQL. Fica a cargo do DBA definir que tabelas serão atualizadas quando uma solicitação for feita para a view, podo inclusive não ser a mesma tabela que a view seleciona. Estrutura e criação de uma stored procedure O comando utilizado para a criação de uma stored procedure (SP) é o CREATE PROCEDURE. Uma SP tem duas partes: cabeçalho e corpo. No cabeçalho, temos a definição do nome da SP, parâmetros de entrada (caso existam) e parâmetros de saída (caso a SP retorne valores). O corpo contém declarações de variáveis e comandos a serem executados. A estrutura é definida da seguinte maneira: CREATE PROCEDURE nome_procedure ( PARAMETRO1 TIPO, /*lista de parâmetros de entrada*/ PARAMETRO2 TIPO) RETURNS ( RESULTADO1 TIPO, /*lista de parâmetros de saída*/ RESULTADO2 TIPO) AS DECLARE VARIABLE VAR1 TIPO; DECLARE VARIABLE VAR2 TIPO; BEGIN <Corpo da stored procedure(comandos)> END Estrutura e criação de um trigger Semelhante a uma stored procedure, um trigger também possui um cabeçalho e um corpo. No cabeçalho definimos a tabela à qual o trigger está associado e o tipo de evento que irá dispará-lo. O corpo do trigger contém a declaração de variáveis e comandos a serem executados. Veja sua estrutura: CREATE TRIGGER nome_trigger FOR nome_tabela ACTIVE evento POSITION posição AS DECLARE VARIABLE VAR1 TIPO; DECLARE VARIABLE VAR2 TIPO: BEGIN <...Corpo do trigger (comandos)...> END

A linguagem de SPs e triggers no firebird O Firebird possui uma linguagem própria para a construção de triggers e stored procedures. Basicamente, os mesmos comandos aplicam-se tanto a triggers como a SPs, salvo em poucas exceções. A seguir, um resumo da sintaxe e da forma de uso dos principais comandos da linguagem de SPs e triggers do Firebird. Variáveis As variáveis têm papel fundamental. Pode-se definir e utilizar variáveis de qualquer tipo de dado suportado no Firebird, exceto os tipos ARRAY e BLOB. Variáveis são sempre locais, ou seja, são visíveis somente dentro da SP ou trigger em que foram criadas. Valores são atribuídos a variáveis usando o operador de atribuição "=": Variável = Valor; Aqui, Valor pode conter um valor imediato (1, 2, 'A', etc.), o resultado de uma expressão (como x/y+2), ou até mesmo chamadas a UDFs (Funções definidas pelo usuário). Note o ";" obrigatório no final da sentença, semelhante a linguagem C. Importante: referências a variáveis e parâmetros em uma instrução SQL devem ser precedidas por um ":" (dois-pontos). Comentários Comentários de blocos em SPs e triggers são delimitados por /* e */. Uma linha que começe com "--" também é considerada comentário. Por exemplo: IF (new.status == 'A') THEN /* Verificar se foi aprovado */ -- Linha de comentário Exception O comando EXCEPTION gera uma exceção previamente definida pelo usuário. Quando o comando EXCEPTION é executado, ele termina a execução da SP ou do trigger e desfaz todas as operações executadas anteriormente por eles. Exemplo: IF (New.estoque < 0) THEN EXCEPTION NOME_EXCEPTION 'Estoque negativo!'; IF...THEN...ELSE A condição em um IF deve sempre estar entre parênteses. Como de costume, o ELSE é executado quando a condição avaliada for falsa. Você também pode utilizar blocos de código dentro de IFs (BEGIN, END) e IFs aninhados. Um exemplo: if (:status == 1) then :desc_status = 'OK"; else :desc_status = 'FALHOU'; FOR SELECT... DO O FOR SELECT é um dos comandos mais importantes em SPs e triggers. Permite que você abra um cursor unidirecional (uma só direção) e percorra os dados retornados pelo SELECT. Nesse tipo de SELECT é exigido o uso da cláusula INTO para receber os dados dos campos especificados. Um exemplo de utilização é mostrado na seção Uma procedure para BD Firebird. Stored procedures selecionáveis O suporte a stored procedures selecionáveis é um dos recursos mais poderosos do Firebird. Com ele você pode utilizar uma stored procedure como fonte de dados para os seus SELECTs, como se a SP fosse uma tabela do seu banco de dados. O efeito é o mesmo de ter uma "tabela virtual" montada com informações vindas de uma ou mais tabelas do banco de

dados, so que essas informações podem ser transformadas, calculadas etc. para montar a tabela. Chamando a procedure Uma stored procedure selecionável pode ser chamada em um SELECT como se fosse uma tabela comum do banco de dados. Veja um exemplo de chamada supondo uma procedure que recebe duas datas como parâmetros de entrada: SELECT * FROM PROCEDURE_CAIXA ('15.1.2003','1.3.2003') ORDER BY data Note que as datas do período estão so passadas usando "." ao invés da tradicional "/". O ponto diz ao Firebird que a data está so passada no formato dia.mês.ano. Se fosse usado / deveria usar o formato americano mês/dia/ano. Para procedure não selecionáveis (que não retornam resultado) é utilizado o comando EXECUTE PROCEDURE. Exemplo: EXECUTE PROCEDURE RECALCULA_SALDOS('01.01.2005') Uma procedure para BD Firebird A procedure abaixo é selecionável. Ela retorna uma tabela conto um fluxo de caixa, para uma tabela de contas a receber e outra de contas a pagar para um determinado período, listando o saldo inicial, seguido pelos lançamentos (Débitos e Créditos) e por fim o saldo final. CREATE PROCEDURE CAIXA ( INICIO DATE, FIM DATE) RETURNS ( DATA DATE, HISTORICO VARCHAR(30), VALOR NUMERIC(9,2), TIPO CHAR(1)) AS DECLARE VARIABLE SALDO_ANT_CREDITO NUMERIC(9,2); DECLARE VARIABLE SALDO_ANT_DEBITO NUMERIC(9,2); DECLARE VARIABLE SALDO_FINAL NUMERIC(9,2); /* Primeiro recuperamos a soma dos valores dos debitos anteriores ao periodo informado para posteriormente calcularmos nosso saldo inicial */ select sum(ap.valor) from apagar ap where (ap.data < :inicio) into :saldo_ant_debito; /* Agora recuperamos a soma dos valores dos creditos anteriores ao periodo informado */ select sum(ar.valor) from areceber ar where (ar.data < :inicio) into :saldo_ant_credito; /* Caso não haja lancamentos anteriores, a variavel ficara no estado NULL, como no SQL qualquer operação matemática feita com valores NULL sempre

resulta em NULL, temos que verificar isso e atribuir 0.00 na variavel nula para que forneça o resultado esperado */ if (:saldo_ant_credito is null) then saldo_ant_credito = 0.00; if (:saldo_ant_debito is null) then saldo_ant_debito = 0.00; data = :inicio - 1; historico = 'SALDO ANTERIOR'; valor = (saldo_ant_credito - saldo_ant_debito); /* Por questões "estéticas" não queremos ter valores negativos no campo valor, so assim, se o saldo anterior é negativo, devemos informar que o lançamento é de débito e tornar o valor do saldo positivo, caso contratio informamos que o lançamento é de crédito.*/ if (:valor < 0) then tipo = 'D'; valor = valor * -1; else tipo = 'C'; susp; /* Retornando a primeira linha (registro) com o saldo anterior */ /* Inicializando a variavel que armazenara o saldo final com o valor do saldo anterior */ saldo_final = valor; /* o comando a seguir seleciona os registros dentro do periodo informado buscando na tabela de contas a pagar */ tipo = 'D'; /* Estamos recuperando débitos */ for select ap.data, ap.historico, ap.valor from apagar ap where (ap.data between :inicio and :fim) into :data, :historico, :valor do /* Subtraimos o valor do lançamento do saldo final */ saldo_final = saldo_final - valor; /* O susp a seguir retorna uma "linha" conto os campos data, historico, tipo e valor que tem seus valores armazenados nas variáveis de mesmo nome */ susp; tipo = 'C'; /* Estamos recuperando créditos */ /* seleciona os registros dentro do periodo informado buscando na tabela de contas a receber */ for select ar.data, ar.historico, ar.valor from areceber ar where (ar.data between :inicio and :fim) into :data, :historico, :valor do

/* Adicionamos o valor do lançamento ao saldo final */ saldo_final = saldo_final + valor; /* O susp a seguir retorna uma "linha" conto os campos data, historico, tipo e valor que tem seus valores armazenados nas variáveis de mesmo nome */ susp; /* Montamos o ultimo "registro" que conterá os valores do saldo FINAL */ data = :fim; historico = 'SALDO FINAL'; tipo = 'C'; valor = saldo_final; susp; Uma trigger para BD Firebird A trigger abaixo registra todas as alterações de salário feita para os empregados de uma empresa. Note que a mudança é armazenada em uma tabela auxiliar (SALARIO_HISTORICO). A função 'NOW' e a variável de contexto 'user' são utilizadas em uma instrução de insert comum. create trigger SALVA_ALTERACAO_SALARIO for EMPREGADO active after update position 0 as if (old.salario <> new.salario) then insert into SALARIO_HISTORICO (EMPRESA, DATA_ALTERACAO, USUARIO, SALARIOANTIGO, PERCENTUAL) values (old.empresa, 'NOW', user, old.salario, (new.salario - old.salario) * 100 / old.salario);

Bibliografia FIREBIRD. Firebird documentation. Site: Firebird Relational Database for the New Millenium. Disponível em: <http://www.firebirdsql.org/index.php?op=doc&id=userdoc>. Acesso em: 08/05/2005. CANTU, CARLOS H. Programando em Interbase e Firebird: criação de stored procedures e triggers. Revista Clube Delphi, Rio de Janeiro, a. IV, n. 39, p. 30 35. IBPhoenix Editors. Firebird 1.5 Quick Start Guide. Disponível em <http://www.firebirdsql.org/pdfmanual/firebird-1.5-quickstart.pdf>. Acesso em: 08/05/2005. Document version 2.1.1. March 2005. Borland Tech writers. InterBase 6.0 manuals (7 volumes). Disponível em: <http://www.ibphoenix.com/downloads/60all.zip>. Acesso em: 08/05/2005. ORACLE CORPORATION. Oracle8 Server Concepts. Site: San Diego State University. Disponível em: <http://www-rohan.sdsu.edu/doc/oracle/server803/a54643_01/ch14.htm> e <http://www-rohan.sdsu.edu/doc/oracle/server803/a54643_01/ch15.htm>. Acesso em: 08/05/2005. PostgreSQL. PostgreSQL 8.0.2 Documentation. Site: PostgreSQL. Disponível em: <http://www.postgresql.org/docs/8.0/interactive/triggers.html>. Acesso em: 08/05/2005. WIKIPEDIA. Stored procedures, Database Triggers. Site: <http://en.wikipedia.org/wiki/stored_procedure> e <http://en.wikipedia.org/wiki/database_trigger>. Acesso em: 08/05/2005.