Escolar Documentos
Profissional Documentos
Cultura Documentos
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
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;
Bases de Dados II
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
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
Considerações finais
Bases de Dados II
Recompilar um procedimento:
ALTER PROCEDURE
[ <nome_do_utilizador>.]<nome_do_procedimento>
COMPILE;
Remover um procedimento:
Bases de Dados II
Funções
Uma função é um sub-programa escrito em SQL.
Diferenças
Bases de Dados II
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
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;
return (ret);
end;
Funtion created.
Escola Superior de Tecnologia
LEI e LTIM Instituto Politécnico de Castelo Branco
Execução
Bases de Dados II
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
Passagem de argumentos
Bases de Dados II
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:
Pacotes (PACKAGES)
Bases de Dados II
Cabeçalho
Bases de Dados II
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
Package created.
Escola Superior de Tecnologia
LEI e LTIM Instituto Politécnico de Castelo Branco
Corpo do pacote
Bases de Dados II
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;
Execução de pacotes
Bases de Dados II
print socio
SOCIO
--------------
1
Variavel publica = 4
PL/SQL procedure successfully completed.
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.
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
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
Timing e Events
Bases de Dados II
Exemplo
Bases de Dados II
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).
Trigger created.
Escola Superior de Tecnologia
LEI e LTIM Instituto Politécnico de Castelo Branco
Aplicando
Bases de Dados II
Bases de Dados II
Recompilar triggers
alter trigger <nome_do_trigger> compile;
Remoção de triggers
drop trigger <nome_do_trigger>;