PROGRAMAÇÃO EM BANCO DADOS Store Procedure e Trigger a tecnologia de banco de dados permite persistir dados de forma a compartilha-los com varias aplicações. Aplicação 1 aplicação 2 aplicação 3 SGDB Banco de Dados Por meio dos SGBD - Sistema Gerenciador de Banco de Dados - é possível gerenciar o acesso a dados em um BD. A SQL - linguagem de consulta estruturada -, é uma linguagem padrão ANSI para manipular dados por meio de um sistema gerenciador de banco de dados. A SQL pode ser dividida em 3 sub-linguagens: DDL - linguagem de definição de dados DCL - linguagem de controle de dados DML - linguagem de manipulação de dados Os SGDB devem disponibilizar recursos para manipulação de dados por meio de PL (linguagens procedimentais), Já que a SQL é uma linguagem não procedimental. 1
Ex: Linguagem procedimental linguagem não procedimenta ------------------------------------------------------------------------------- Readln(y); select x,y Y= x*x; from raízes Println(x); where y = x*x Println(y); --------------------------------------------------------------------------- A programação em PL é feita por meio de function (função) Store Procedure (procedimentos armazenada) e Tigger (gatilho). Cada SGDB tem sua maneira própria para tratar esses elementos de programação. As sintaxe apresentadas a seguir referem-se ao ambiente Postgresql. Store Procedure O postgresql emprega o conceito de function para definir store procedure ( procedimentos armazenados) Sintexe básica: Create function nome_da_função (tipo_dado_a, tipo_dado_b, tipo_dado_c) Return tipo AS corpo da função LANGUAGE `nome da linguagem usada no corpo` Dentre as linguagens possíveis para o postgresql temos: SQL PLPGSQL C PERL TEL PYTHONU A aspa no nome da linguagem pode ser opcional, depende da versão do Postgresql( no 8.3 ela já é opcional) A definição do corpo da função depende da linguagem para plpgsql ela deve obedece a seguinte sintaxe: 2
declare variavel1 tipo1, variavel2 tipo2,... BEGIN INSTRUÇÃO 1 INSTRUÇÃO 2 RETURN VALOR RETORNO END; LANGUAGE 'PLPGSQL'; Obs: 1- As aspas simples podem ser substituídas por $$ 2 - Para que uma função retorne mais de um valor, mais de uma linha de uma tabela, o tipo de dado no retorno return tipo deve ser SETOF nome_tabela 3 - As variáveis que correspondem aos n-valores passados como parâmetros para a função devem ser nomeadas como $1, $2, $3,.. $n Exemplos: 1 - Função sem parâmetros de entrada primeiro: criação da função Create function dois() returns integer as `select 2; segundo: uso da função Select dois(); 2 - função com parâmetros de entrada 3
primeiro: criação da função create funcition media(decimal,decimal) returns decimal as $$select ($1+$2)/2;$$ segundo: uso da função caso1 select media(10,8); caso2 select media(8,9); 3 - Função que totaliza os valores de itens de uma nota de venda da tabela item_nota CREATE FUNCTION totalnota(integer) RETURNS INTEGER AS ' SELECT SUM(preco) FROM item_nota WHERE numnota = $1; ' LANGUAGE 'SQL'; 4 exemplo função maior salário de tabela funcionário 4.1 criar a tabela create table func(cód integer, nome varchar(30), salário decimal(10,2), comissão decimal(10,2)); 4.2 inserir dados na tabela criada insert into func values(1, ZE,1000,500); insert into func values(2, IVO,1500,200); insert into func values(3, EVA,1800,100); 4.3 crie uma função maior_salario, para exibir o maior salario create funcition maior_salário() returns decimal as select Max(salario) from func; 4.4 usar a função que retorna o maior salario select maior_salario(); 4
5 - Função que concatena textos Create function soma(text, text) returns char as $$ Declare resultado text; Begin resultado := $1 $2; return resultado; End; $$ language 'plpgsql'; usando a função: select soma('sidney ','Silva'); 6 Função que retorna o nome dos clientes que fazem aniversário hoje( data corrente) CREATE FUNCTION aniversariantes() RETURNS SETOF clientes AS' SELECT nome FROM clientes WHERE aniversario = current_date; LANGUAGE 'SQL'; 7- Função que disponibilize o maior valor de venda. create function maiorvenda() returns decimal as 'select Max(valor) from venda;' usando a função: select maiorvenda(); 8- Função que disponibilize o valor total obtido com vendas create function valortotal() returns decimal as 'select sum(valor) from venda;' usando a função: select valortotal(); 9- Crie um store procedure que disponibilize data da ultima venda create function dataultimavenda() returns date as 'select max(data) from venda;' 5
usando a função: select dataultimavenda(); TRIGGER Uma função de gatilho, trigger, é uma ação que o SGBD deve desencadear antes ou depois de um dos seguintes comandos: insert, update ou delete. Sintaxe: Create trigger nome_gatilho {before ou after} {evento[or evento]} on table for each {row ou STATEMENT } execute procedure nome_função (v1,v2,...,vn) Variáveis disponíveis no ambiente de programação - PL NEW Tipo de dado RECORD; variável contendo a nova linha do banco de dados, para as operações de INSERT/UPDATE nos gatilhos no nível de linha. OLD Tipo de dado RECORD; variável contendo a antiga linha do banco de dados, para as operações de UPDATE/DELETE nos gatilhos no nível de linha.. TG_NAME Tipo de dado name; variável contendo o nome do gatilho disparado. TG_WHEN Tipo de dado text; uma cadeia de caracteres contendo BEFORE ou AFTER, dependendo da definição do gatilho. TG_LEVEL Tipo de dado text; uma cadeia de caracteres contendo ROW ou STATEMENT, dependendo da definição do gatilho. TG_OP Tipo de dado text; uma cadeia de caracteres contendo INSERT, UPDATE, ou DELETE, informando para qual operação o gatilho foi disparado. TG_RELID Tipo de dado oid; o ID de objeto da tabela que causou o disparo do gatilho. TG_RELNAME Tipo de dado name; o nome da tabela que causou o disparo do gatilho. TG_NARGS Tipo de dado integer; o número de argumentos fornecidos ao procedimento de gatilho na instrução CREATE TRIGGER. 6
TG_ARGV[] Tipo de dado matriz de text; os argumentos da instrução CREATE TRIGGER. O contador do índice começa por 0. Índices inválidos (menor que 0 ou maior ou igual a tg_nargs) resultam em um valor nulo. Exemplos: 1 Gatilho que ao se efetuar uma inserção na tabela venda armazena na tabela data o usuario, o nome venda e a data com hora. Create trigger auditoria after insert on venda for each Statement execute procedure inseriu(); Create function inseriu() returns trigger as insert into data values (user,'vendas',now()); Create table data(usuario varchar(50), tabela varchar(50), Datahora timestamp); 2 - Crie um gatilho que a cada mudança no preço de venda de um produto armazene os dados na tabela histórico. Create trigger atualiza_preco_venda after update on produto for each row execute procedure incluir_historico(); Create function incluir_historico () returns trigger as begin if (old..valor_venda<>new.valor_venda) then insert into historico (data, user, valor_anterior, valor_atual) values (now(),user,old.valor_venda, new.valor_venda); return null; end; language plpgsql; 7