Você está na página 1de 33

Escola Superior de Tecnologia

LEI e LTIM Instituto Politécnico de Castelo Branco

Bases de Dados II

Bases de Dados

Filipe Fidalgo
ffidalgo@est.ipcb.pt
Escola Superior de Tecnologia
LEI e LTIM Instituto Politécnico de Castelo Branco

Bases de Dados II

Procedimentos, Funções, …
Escola Superior de Tecnologia
LEI e LTIM Instituto Politécnico de Castelo Branco

Utilização IN OUT
Bases de Dados II

create or replace procedure


formata_nome(nome in out varchar2)
is
pos number;
begin
pos:= instr(nome, ' ' , -1);
nome:= substr(nome,pos+1) || ',' || substr(nome,1,pos-1);
end;

Prcedure created.
Escola Superior de Tecnologia
LEI e LTIM Instituto Politécnico de Castelo Branco

Bases de Dados II
Cont.
declare
cursor nomes is select nome_pessoa from pessoa;
aux_nome pessoa.nome_pessoa%type;
begin
for reg in nomes loop
aux_nome := reg.nome_pessoa;
dbms_output.put_line('Era assim:' || aux_nome);
formata_nome(aux_nome);
dbms_output.put_line('Ficou assim: ' || aux_nome);
end loop;
end;

Era assim: Filipe Miguel Fidalgo


Ficou assim: Fidalgo, Filipe Miguel

PL/SQL procedure successfully completed.


Escola Superior de Tecnologia
LEI e LTIM Instituto Politécnico de Castelo Branco

Bases de Dados II

Passagem de valores para os argumentos


create or replace procedure
ins_livro ( cod_p in number,
tit_p in varchar2,
autor_p in varchar2,
preco_p in number,
divisa_p in varchar2,
data_p in date DEFAULT SYSDATE,
erro out boolean) is
begin
insert into livros2 (cod, tit, autor, preco, divisa, data)values (cod_p, tit_p, autor_p, preco_p,
divisa_p, data_p);
erro:= FALSE;
exception
when others then
erro := TRUE;
end ins_livro;

Prcedure created.
Escola Superior de Tecnologia
LEI e LTIM Instituto Politécnico de Castelo Branco

Cont.
Bases de Dados II

declare
resultado_erro boolean;
begin
ins_livro(50,'Titulo','Zé Anzois', 90, 248,SYSDATE,resultado_erro);
if resultado_erro then
dbms_output.put_line('A inserção falhou');
else
dbms_output.put_line('Inserção com sucesso');
end if;
end;
Inserção com sucesso

PL/SQL Procedure successfully completed.

SQL > select * from livro where codigo = 50;


Escola Superior de Tecnologia
LEI e LTIM Instituto Politécnico de Castelo Branco

Outra forma:
Bases de Dados II

declare
resultado_erro boolean;
begin
ins_livro(cod_p=>50, tit_p=>'Titulo', autor_p=>'Autor', preco_p=> 10,
erro=>resultado_erro);
if resultado_erro then
dbms_output.put_line('A inserção falhou');
else
dbms_output.put_line('Inserção com sucesso');
end if;
end;
Inserção com sucesso

PL/SQL Procedure successfully completed.

select * from livro where codigo = 50;


Escola Superior de Tecnologia
LEI e LTIM Instituto Politécnico de Castelo Branco

Considerações finais
Bases de Dados II

Ver a estrutura de um procedimento:

SQL > desc formata_nome


Procedure formata_nome
Argument Name Type IN/OUT DEFAULT
-----------------------------------------------------------------------------------------------------------------------------
NOME Varchar2 In/Out

Recompilar um procedimento:

ALTER PROCEDURE
[ <nome_do_utilizador>.]<nome_do_procedimento>
COMPILE;

Remover um procedimento:

DROP PROCEDURE <nome_do_procedimento>;


Escola Superior de Tecnologia
LEI e LTIM Instituto Politécnico de Castelo Branco

Bases de Dados II

Funções
Uma função é um sub-programa escrito em SQL.

Diferem dos procedimentos em dois pontos:


- Devolvem sempre um valor como retorno
- Pode ser usada dentro de comandos SQL (enquanto que os
procedimentos só podem constituir instruções em PL/SQL)

As duas classes de funções são:


-funções statement
-funções non-statement
Escola Superior de Tecnologia
LEI e LTIM Instituto Politécnico de Castelo Branco

Diferenças
Bases de Dados II

Funções Statement Funções Non-Statement Procedimentos

Não podem incluir


Podem incluir qualquer Podem incluir qualquer
comandos Insert, Delete
comando DML comando DML
ou Update

Só podem ter comandos Podem ter todo o tipo de Podem ter todo o tipo de
IN parametros parametros
Retornam um valor de
Retornam apenas um Não retornam nenhum
qualquer tipo de dados e
valor de um dos seguintes valor a não ser por
ainda podem retornar
tipos: Number, Char, ou argumentos do tipo IN
através de argumentos IN
Date OUT
OUT
Não podem conter Podem conter qualquer Podem conter qualquer
instruções de Select...into tipo de instruções tipo de instruções
com a clausula Group By Select...into Select...into
Escola Superior de Tecnologia
LEI e LTIM Instituto Politécnico de Castelo Branco

Sintaxe
Bases de Dados II

A sintaxe de uma função é:

CREATE [OR RELACE] FUNCTION <nome_da_função> ( [<argumento1> <modo>


<tipodados> [{ := | DEFAULT} valor], <argumento2> <modo> <tipodados> [{ := |
DEFAULT} valor], ... ] ) RETURN <tipodados>
IS
<secção declarativa>
BEGIN
<secção de execução>
[EXCEPTION
<tratamento_de_excepções>]
END [ <nome_da_função> ];

NOTAS:
<modo>, SHOW ERRORS... igual aos procedimentos;

Não é obrigatório uma função possuir argumentos, mas é obrigatório retornar um valor.
Escola Superior de Tecnologia
LEI e LTIM Instituto Politécnico de Castelo Branco

Bases de Dados II

Exemplo
create or replace function socio_top (livro in number)
return number
is
ret number;
n number;
n2 number;
begin
select max(count(*))
into n
from requisicao
where id_livro = livro
group by id_socio;

select id_socio, count(*)


into ret, n2
from requisicao
where id_livro = livro
group by id_socio
having count(*) = n;

return (ret);
end;

Funtion created.
Escola Superior de Tecnologia
LEI e LTIM Instituto Politécnico de Castelo Branco

Execução
Bases de Dados II

A função anterior é statement, o que significa que pode ser utilizada


em expressões de comandos SQL ou em instruções PL/SQL.

Tudo porque tem apenas comando IN e porque não efectua nenhum


comando de DML.

select nome_socio
from socio
where id_socio= socio_top(2);

Nome
-------------------------------------------
Filipe Fidalgo
Escola Superior de Tecnologia
LEI e LTIM Instituto Politécnico de Castelo Branco

Bases de Dados II

Função NonStatement
create or replace function ins_socio (
cod in number,
nome in varchar2,
data in date := SYSDATE,
telef in int default null,
amigo in varchar2 default null,
sexo in varchar2)
-- Vai devolver TRUE se a inserção correu bem
-- ou devolve FALSE se ocorreu um erro na inserção
return boolean
is
begin
insert into socio (id_socio, nome_socio, data_insc, telefone, socio_req, sexo) values (cod, nome, data,
telef, amigo, sexo);
return (TRUE);
exception
when others then
return(FALSE);
end;

Funtion created.
Escola Superior de Tecnologia
LEI e LTIM Instituto Politécnico de Castelo Branco

Aplicando
Bases de Dados II

select ins_socio(10, ’Filipe’, sysdate, ‘10000’,1,’M’)


from DUAL;

Select ins_socio(10, ’Filipe’, sysdate, ‘10000’,1,’M’)


*
ERROR at line 1:
ORA-06571: Function INS_SOCIO does not guarantee not to
update database

A função anterior, como possui um comando de INSERT dentro


do código e como devolve um tipo que o SQL não entende
(boolean), torna-se então non-statement, ou seja, não pode ser
usada em comandos SQL.
Escola Superior de Tecnologia
LEI e LTIM Instituto Politécnico de Castelo Branco

Passagem de argumentos
Bases de Dados II

Os três métodos de passagem de argumentos (posicional, por nome e


misto) referidos para os procedimentos, são apenas válidos em
funções que sejam chamadas dentro de um bloco de PL/SQL,
independentemente de serem statement ou non-statement.

create or replace function


xp (a number, b number)
return number
is
begin
return(a/b);
end;

Function created.
Escola Superior de Tecnologia
LEI e LTIM Instituto Politécnico de Castelo Branco

Cont.
Bases de Dados II

var n number;
execute :N := xp (b=> 9, a=> 27);

print n;

N
---------------
3

NOTAS:

Descrição de uma função.


desc ins_socio

Recompilar uma função


ALTER FUNCTION [<nome_utilizador>.]<nome_da_função> COMPILE;

Remover uma função


DROP FUNCTION <nome_da_função>;
Escola Superior de Tecnologia
LEI e LTIM Instituto Politécnico de Castelo Branco

Pacotes (PACKAGES)
Bases de Dados II

Agrupamento lógico de vários procedimentos, funções, tipos e até


mesmo variáveis e constantes.
Vantagens:
-Agrupamento lógico de procedimentos e funções que estão
relacionadas entre si;
- Criação de um repositório comum para o código;
- Aumento do desempenho: o pacote é todo carregado em memória
depois de ser acedido pela primeira vez e pode ainda ser fixado em
memória programaticamente.
- Encapsulamento: possibilidade de definir subprogramas que não são
visíveis, apenas utilizáveis pelos subprogramas do pacote.
- Overloading: permite criar várias especificações para o mesmo
subprograma.

Constituído por duas partes:


- Cabeçalho do Pacote
- Corpo do Pacote
Escola Superior de Tecnologia
LEI e LTIM Instituto Politécnico de Castelo Branco

Cabeçalho
Bases de Dados II

Local onde estão todas as especificações, que podem ser


acedidas externamente, por isso se diz que são públicos.
Não contém qualquer código, apenas definições.

Sintaxe:
CREATE [OR REPLACE] PACKAGE <nome_do_pacote>
IS
<definição_de_variáveis_de_qualquer_tipo>;
<definição_de_constantes_de_qualquer_tipo>;
<definição_de_tipos>;
<definição_de_procedimentos>;
<definição_de_funções>;
Escola Superior de Tecnologia
LEI e LTIM Instituto Politécnico de Castelo Branco

Exemplo
Bases de Dados II

create or replace package socio_api is


num_livro_socio_top number;
taxa_conversão_euro constant number(6,3):=200.482;
type reg_socio is record (cod socio.id_socio%type,
nome socio.nome_socio%type,
data socio.data_insc%type,
telef socio.telefone%type,
amigo socio.socio_req%type,
sexo socio.sexo%type);
procedure apaga_socio (codigo in number,
erro out boolean);
function socio_top (livro in number) return number;
end socio_api;

Package created.
Escola Superior de Tecnologia
LEI e LTIM Instituto Politécnico de Castelo Branco

Corpo do pacote
Bases de Dados II

Objecto à parte que vai conter o código dos subprogramas


públicos e eventualmente especificações de qualquer tipo de
suprograma privado.

Uma função ou procedimento diz-se privado porque não pode


ser acedido externamente apenas por funções ou
procedimentos do próprio pacote.

O corpo não é obrigatório (pode ou não existir).


Apagar o corpo  cabeçalho fica
Apagar o cabeçalho  o corpo removido automaticamente
Escola Superior de Tecnologia
LEI e LTIM Instituto Politécnico de Castelo Branco

Bases de Dados II
procedure apaga_socio(codigo in number, erro out
CREATE [OR REPLACE] PACKAGE BODY boolean) IS
<nome_do_cabeçalho_do_pacote> IS begin
<definição_de_variáveis_privadas_de_qualquer_tipo>; delete from socio where socio.id_socio=codigo;
<definição_de_constantes_privadas_de_qualquer_tipo>;
erro:=FALSE;
<definição_de_tipos_privados>;
<definição_e_codigo_de_procedimentos_privados>; exception
<definição_e_codigo_de_funções_privados>; when others then
<codigo_de_procedimentos_especificados_no_cabeçalhos>; erro:= TRUE;
<codigo_de_funções_especificados_no_cabeçalhos>; end;
END [<nome_do_cabeçalho_do_pacote>]; function socio_top (livro in number)
 
return number IS
EXEMPLO:
CREATE OR REPLACE PACKAGE BODY socio_api AS ret number;
function max_socio_livro (livro in number) maks number;
return number IS begin
ret number; maks := max_socio_livro(livro);
begin select id_socio, count(*)
select max(count(*))
into ret, num_livro_socio_top
into ret
from requisicao from requisicao
where id_livro = livro where id_livro = livro
group by id_socio; group by id_socio
return (ret); having count(*) = maks;
end max_socio_livro; return (ret);
end;
END socio_api;

Package body created.


Escola Superior de Tecnologia
LEI e LTIM Instituto Politécnico de Castelo Branco

Execução de pacotes
Bases de Dados II

var socio number


exec :socio := socio_api.socio_top(10);
PL/SQL procedure successfully completed.

print socio
SOCIO
--------------
1

set serveroutput on;


begin
dbms_output.put_line('Variavel publica =' || to_char (socio_api.num_livro_socio_top));
end;

Variavel publica = 4
PL/SQL procedure successfully completed.

(o socio 1 requisitou 4 vezes o livro 10)


Escola Superior de Tecnologia
LEI e LTIM Instituto Politécnico de Castelo Branco

Bloco de execução unica


Bases de Dados II

Só é executado a primeira vez que o pacote é chamado.

Create package body pacote_xpto is


function lala
...
Procedure blabla
...
End;
BEGIN – aqui começa o bloco de execução única
<instruções de PL/SQL>
End pacote_xpto;
Escola Superior de Tecnologia
LEI e LTIM Instituto Politécnico de Castelo Branco

Overloading...
Bases de Dados II

Quando um pacote contém uma função que pode ser chamada com um
número variável de argumentos, nesse caso tem de se declarar uma
função para cada um dos casos.

Consultar a estrutura de um pacote:


desc <nome_do_pacote>;

Recompilação de pacotes:
alter package <nome_do_pacote> compile package;
alter package <nome_do_pacote> compile body;

Remoção de pacotes:
(remove tudo cabeçalho e corpo)
drop package <nome_do_pacote>;
Escola Superior de Tecnologia
LEI e LTIM Instituto Politécnico de Castelo Branco

TRIGGERS
Bases de Dados II

Conjunto de instruções que podem ser associadas a uma


tabela ou a uma vista, para um determinado evento.

Um trigger é disparado quando tabela é alvo de uma


determinada operação.

Os triggres podem:
- disparar por linha,
- disparar por tabela,
- disparar por um conjunto de operações,
- dispara condicionalmente,
- ou podem estar desactivados.
Escola Superior de Tecnologia
LEI e LTIM Instituto Politécnico de Castelo Branco

Sintaxe
Bases de Dados II

CREATE [OR REPLACE] TRIGGER <nome_do_trigger>


{BEFORE | AFTER | INSTEAD OF}
{DELETE | DELETE OR}
{UPDATE | UPDATE OR} [OF (coluna1, [coluna2, ...])]
{INSERT | INSERT OR}
ON [{nome_do_utilizador}.]<nome_da_tabela_ou_vista>
[REFERENCES {OLD [AS] <outro_nome_para_old>},
(new [as] <outro_nome_para_new>)]
[FOR EACH {ROW | STATEMENT}]
[WHEN (<condição>)]
[DECLARE]
...
BEGIN
...
[EXECPTION
...]
END;
Escola Superior de Tecnologia
LEI e LTIM Instituto Politécnico de Castelo Branco

Timing e Events
Bases de Dados II

O trigger pode ser criado para ser executado antes


(BEFORE), depois (AFTER) ou em substituição
(INSTED OF) de DML (INSERT, DELETE ou
UPDATE) de uma combinação de operações:
- INSERT OR UPDATE
- DELETE OR UPDATE
- UPDATE OR DELETE
- UPDATE OR DELETE OR INSERT

Os triggers INSTED OF só podem ser definidos para vistas.

No caso do UPDATE o trigger pode ser definido para


disparar sobre um conjunto especifico de colunas da
tabela ou vista.
Escola Superior de Tecnologia
LEI e LTIM Instituto Politécnico de Castelo Branco

Exemplo
Bases de Dados II

create or replace trigger valida_data_insc


before insert on socio
for each row
begin
if :new.data_insc < sysdate then
raise_application_error (-20100, 'Data Invalida');
end if;
end;

Trigger created.
insert into socio (id_socio, nome_socio, data_insc) values (99, 'Filipe', SYSDATE-1);

insert into socio (id_socio, nome_socio, data_insc) values (99, 'Filipe', SYSDATE-1)
            *
ERRO na linha 1:
ORA-20100: Data Invalida
ORA-06512: na "FFIDALGO_BD2.VALIDA_DATA_INSC", linha 3
ORA-04088: erro durante a execução do trigger
'FFIDALGO_BD2.VALIDA_DATA_INSC'
Escola Superior de Tecnologia
LEI e LTIM Instituto Politécnico de Castelo Branco

Bases de Dados II

Triggers de execuçãocondicional
Trigger que só é disparado mediante uma determinada condição
(WHEN).

CREATE OR REPLACE TRIGGER verifica_salario


BEFORE UPDATE OF sal ON empregado
FOR EACH ROW
WHEN (NEW.sal < OLD.sal)
BEGIN
RAISE_APPLICATION_ERROR (-20508, 'O salário não pode ser
reduzido');
END;

Trigger created.
Escola Superior de Tecnologia
LEI e LTIM Instituto Politécnico de Castelo Branco

Aplicando
Bases de Dados II

update empregado set sal=90 where id_empregado=1;

update empregado set sal=90 where id_empregado=1


*
ERRO na linha 1:
ORA-20508: O salário não pode ser reduzido
ORA-06512: na "FFIDALGO_BD2.VERIFICA_SALARIO", linha 2
ORA-04088: erro durante a execução do trigger
'FFIDALGO_BD2.VERIFICA_SALARIO'
Escola Superior de Tecnologia
LEI e LTIM Instituto Politécnico de Castelo Branco

Bases de Dados II

CREATE OR REPLACE TRIGGER verifica_salario


BEFORE UPDATE OF sal ON empregado
REFERENCING NEW AS NOVO
FOR EACH ROW
WHEN (NOVO.sal < OLD.sal)
BEGIN
RAISE_APPLICATION_ERROR (-20508, 'O salário não pode ser
reduzido');
END;
Escola Superior de Tecnologia
LEI e LTIM Instituto Politécnico de Castelo Branco

Estado dos triggers


Bases de Dados II

Activar e desactivar triggers (individualmente):


alter trigger <nome_do_trigger> disable;
Ou
alter trigger <nome_do_trigger> enable;

Pode também ser feito para uma determinada tabela:


alter table <nome_da_tabela> enable all triggers;
Ou
alter table <nome_da_tabela> disable all triggers;

Recompilar triggers
alter trigger <nome_do_trigger> compile;

Remoção de triggers
drop trigger <nome_do_trigger>;

Você também pode gostar