LEI e LTIM

Bases de Dados II

Escola Superior de Tecnologia Instituto Politécnico de Castelo Branco

Bases de Dados
Filipe Fidalgo ffidalgo@est.ipcb.pt

LEI e LTIM
Bases de Dados II

Escola Superior de Tecnologia Instituto Politécnico de Castelo Branco

Procedimentos, Funções, …

LEI e LTIM
Bases de Dados II

Escola Superior de Tecnologia Instituto Politécnico de Castelo Branco

Linguagens de Consulta, só…!!?

Motivação: Falta de controlo de fluxos Interacção com as BD Programa - Blocos de SQL Diminuição número de comunicações (C/S) Código armazenado na BD

LEI e LTIM
Bases de Dados II

Escola Superior de Tecnologia Instituto Politécnico de Castelo Branco

Linguagens Proprietárias

PL/SQL: Linguagem procedimental, que permite controlar o fluxo dum programa em SQL, utilizar variáveis e escrever procedimentos de tratamento de erros. Possui dois tipos de instruções: Construtores Programáticos Comandos DML (Data Manipulation Language)

LEI e LTIM
Bases de Dados II

Escola Superior de Tecnologia

Blocos de PL/SQL

Instituto Politécnico de Castelo Branco

Um bloco de PL/SQL divide-se em três secções: Secção Declarativa Secção de Execução Secção de Tratamento de excepções EXEMPLO: «nome_do_bloco» DECLARE <declaração de varáveis> BEGIN <comandos procedimentais> <comandos SQL> EXCEPTION <tratamento de excepções> END;

LEI e LTIM
Bases de Dados II

Escola Superior de Tecnologia Instituto Politécnico de Castelo Branco

Comentários em PL/SQL

Os comentários podem ser inseridos como em SQL: Comentário de Linha (--) Comentário Multi-Linha (/* */) Exemplo

begin --- Comentário de uma só linha /* Comentário em várias linhas e mais comentários*/ null; -- não faz nada.... end;

LEI e LTIM
Bases de Dados II

Escola Superior de Tecnologia Instituto Politécnico de Castelo Branco

Declarações

Regras para a declaração de Variáveis e Constantes: - primeiro caracter tem de ser uma letra - em cada instrução só pode ser declarada uma variável - o nome não é case sensitive - dentro de blocos aninhados podem existir variáveis com o mesmo nome do bloco exterior - a inicialização pode ser feita por referência a outras variáveis

LEI e LTIM
Bases de Dados II

Escola Superior de Tecnologia Instituto Politécnico de Castelo Branco

Exemplos

Declare iDadE number(3); altura number(3,2); nome varchar2(80) := 'Filipe Fidalgo'; cidade varchar2(50) DEFAULT 'Covilhã'; pi constant number(3,2) := '3,14'; Begin dbms_output.put_line(nome); dbms_output.put_line(cidade); dbms_output.put_line(pi); End;

LEI e LTIM
Bases de Dados II

Escola Superior de Tecnologia Instituto Politécnico de Castelo Branco

Declare data_hoje date default sysdate; data_amanha date := data_hoje + 1; begin dbms_output.put_line(data_hoje); dbms_output.put_line(data_amanha); end;

Mais exemplos

OUTRO:
Declare n number := 0; begin declare n number; begin n:=1; dbms_output.put_line('n='||to_char(n)); end; dbms_output.put_line('n='||to_char(n)); end;

LEI e LTIM
Bases de Dados II

Escola Superior de Tecnologia Instituto Politécnico de Castelo Branco

Declaração por Referência (%TYPE)

Quando se declara uma variável que receberá: - o valor de uma coluna da base de dados; - ou de outra variável, pode ser declarada de forma dinâmica, para evitar inconsistência quando se altera uma tabela. Exemplos Baseado numa variável: declare preco number(12,2); pvp preco%TYPE := 6750; preco_revenda preco%TYPE NOT NULL; preco_30d preco_revenda%TYPE; ... Baseado numa coluna de uma tabela: delcare nome_livro livro.titulo%TYPE; ...

LEI e LTIM
Bases de Dados II

Escola Superior de Tecnologia Instituto Politécnico de Castelo Branco

Dados Compostos – declarações de variáveis com mais de um valor, como por exemplo, uma linha de uma tabela ou a própria tabela. Tipos compostos em PL/SQL: RECORD TABLE Exemplos: declare TYPE morada IS RECORD( rua varchar2(50) NOT NULL, numero tabela_moradas.num%TYPE, localidade varchar2(80) default ‘Covilhã’ );

Dados não escalares

LEI e LTIM
Bases de Dados II

Escola Superior de Tecnologia Instituto Politécnico de Castelo Branco

Só existem duas colunas no tipo TABLE que são o seu tipo de acesso (do tipo BINARY_INTEGER) e o seu Tipo de Dados que pode ser escalar (exemplo1) ou pode ser composto (exemplo 2 e 3). Exemplo1 declare type aniversario is table of data; Exemplo2 declare type moradas_tab is table of morada; Exemplo3 declare type moradas_tab is table of tabela_morada%rowtype;

Mais exemplos

LEI e LTIM
Bases de Dados II

Escola Superior de Tecnologia

Métodos em TABLE

Instituto Politécnico de Castelo Branco

O manuseamento dos tipo de dados TABLE é feito com base no seu índice, numa lista de elementos e também possui uma série de métodos. Os métodos são: EXISTS (testa se existe algum valor no elemento do índice indicado) COUNT (conta o número de elementos da tabela) FIRST (índice do primeiro elemento) LAST (índice do ultimo elemento) PRIOR (índice do elemento anterior ou NULL se não existir) NEXT (índice do elemento seguinte ou NULL se não existir) EXTEND (adiciona um elemento em branco ou cópias de outros) TRIM (remove um ou mais elementos do final da tabela) DELELTE (remove todos ou uma parte indicados por um ou vários índices)

LEI e LTIM
Bases de Dados II

Escola Superior de Tecnologia Instituto Politécnico de Castelo Branco

set serveroutput on; declare Type morada IS RECORD ( rua loc varchar2(50), varchar(25)); numero number(5),

APLICANDO...

TYPE tab_moradas is table of morada INDEX BY BINARY_INTEGER; tm tab_moradas; BEGIN --Acesso através do indice com tipo composto tm(1).rua := 'Rua 5 de Outubro'; tm(1).numero := 10; tm(1).loc := 'Covilha'; dbms_output.put_line(tm(1).rua); dbms_output.put_line(tm(1).numero); dbms_output.put_line(tm(1).loc); end;

LEI e LTIM
Bases de Dados II

Escola Superior de Tecnologia Instituto Politécnico de Castelo Branco

Referenciais (cursores e objectos REF) Large Objects (LOB’s – limite 4 Gigabytes!!!) LOB CLOB (informação de texto) BLOB (informação binária) NCLOB (informação especifica de um conjunto de caracteres – chineses por exemplo) BFILE (apontador para ficheiros)

Outros tipos não escalares

LEI e LTIM
Bases de Dados II

Escola Superior de Tecnologia Instituto Politécnico de Castelo Branco

Interacção com aDML: BD Inclusão de SQL dentro do PL/SQL limita-se a comandos
Insert; Delete; Update e Select; e TCL (Transaction Control Language): Commit; Rollback e Savepoint. NOTA: O comando SELECT só pode ser usando com uma clausula adicional (INTO), redireccionando os valores das colunas ou expressões seleccionadas para uma ou mais variáveis. select coluna1, expressão1, coluna2 into variavel1, variavel2, variavel3 from tabela[s] where .... group by ... order by .... ;

LEI e LTIM
Bases de Dados II

Escola Superior de Tecnologia Instituto Politécnico de Castelo Branco

SELECT ... INTO ... Variavel_escalar ... declare nome_livro begin select titulo into nome_livro from livro where codigo = 1;

Exemplo

livro.titulo%TYPE;

dbms_output.put_line(nome_livro); end; Mr. Vertigo PL/SQL procedure successfully completed.

LEI e LTIM
Bases de Dados II

Escola Superior de Tecnologia Instituto Politécnico de Castelo Branco

SELECT ... INTO variavel_composta ... show serveroutput; set serveroutput on; declare registo_liv livro%ROWTYPE; begin select * into registo_liv from livro where codigo = 1;

Mais exemplos

dbms_output.put_line(registo_liv.codigo); dbms_output.put_line(registo_liv.titulo); end; PL/SQL procedure successfully completed.

LEI e LTIM
Bases de Dados II

Escola Superior de Tecnologia Instituto Politécnico de Castelo Branco

Ainda mais exemplos INSERT dentro de PL/SQL
declare registo_liv livro%ROWTYPE; begin insert into livro (codigo, titulo) values (90, 'A Tempestade'); select * into registo_liv from livro where codigo = 90; dbms_output.put_line(registo_liv.codigo); dbms_output.put_line(registo_liv.titulo); end; 90 A Tempestade PL/SQL procedure successfully completed.

LEI e LTIM
Bases de Dados II

Escola Superior de Tecnologia

Cursores implícitos
Atributo de Cursor Implícito

Instituto Politécnico de Castelo Branco

Por cada comandos de DML o ORCALE SERVER cria um cursor sobre as linhas afectadas, que possui uma série de atributos. Estes atributos podem ser consultados através de construtores programáticos do PL/SQL. Os atributos disponíveis e o seu conteúdo são descritos pela seguinte tabela:

Descrição

SQL%ROWCOUNT

Numero de linhas afectadas pelo ultimo comando DML

SQL%ISOPEN

Valor lógico. No caso dos cursores implícitos este atributo está sempre com o valor FALSE uma vez que são abertos quando o comando executa e fechados quando o comando termina Valor lógico que indica se foram afectadas linhas no ultimo comando DML. TRUE indica que foi afectada uma ou mais linhas

SQL%FOUND

SQL%NOTFOUND

Valor lógico que indica se não foram afectadas linhas no ultimo comando de DML

LEI e LTIM
Bases de Dados II

Escola Superior de Tecnologia Instituto Politécnico de Castelo Branco

Controlo Condicional

Controlo de Fluxo

if <condição> then <instrução>; ... [elseif <condição> then <instrução>; ...] [else <instrução>; ...] end if;

LEI e LTIM
Bases de Dados II

Escola Superior de Tecnologia Instituto Politécnico de Castelo Branco

Três tipos de loop’s: Loop’s Simples loop <instrução>; ... EXIT [WHEN <condição>]; end loop; Loop’s Condicionais while <condição> loop <instrução>; ... EXIT [WHEN <condição>]; end loop; Loop’s Finitos for <contador> in [reverse] valor_inicial..valor_final loop <instrução>; end loop;

Controlo iterativo

LEI e LTIM
Bases de Dados II

Escola Superior de Tecnologia Instituto Politécnico de Castelo Branco

Comandos em SQL com um nome identificativo e cujo deslocamento de linha para linha pode ser controlado pelo programador. Baseados em SELECT’s, depois de aberto aponta para uma linha de cada vez. Devem-se usar os seguintes passos: Declarar o cursor na secção declarativa; Abrir cursor na secção de execução (quando o programador entender) Iniciar um ciclo que faça: Deslocar o cursor de linha Testar se existem mais linhas Processar a informação dessa linha Quando o cursor chegar ao fim das linhas afectadas pelo comando select no qual se baseia, deve-se fechar o cursor

Cursores explícitos

LEI e LTIM
Bases de Dados II

Escola Superior de Tecnologia Instituto Politécnico de Castelo Branco

declare cursor livros is select * from livro; regliv livros%ROWTYPE; begin open livros; loop fetch livros into regliv; exit when livros%notfound; dbms_output.put_line (to_char(regliv.codigo) || ' ' || regliv.titulo || ' - ' || regliv.divisa); end loop; close livros;

Exemplo

LEI e LTIM
Bases de Dados II

Escola Superior de Tecnologia Instituto Politécnico de Castelo Branco

Atributos do Cursores Explícitos

Os atributos são:
Atributo do Cursor Explicito %ROWCOUNT %ISOPEN %FOUND %NOTFOUND

Descrição Número de linhas processadas até ao momento Valor lógico que indica se o cursor está aberto Valor lógico que indica se o cursor está a apontar para alguma linha ou se o comando select não devolveu nenhum registo Inverso de %FOUND

LEI e LTIM
declare Bases de Dados II cursor livros is select * from livro; regliv livros%ROWTYPE; estado varchar2(10); begin open livros; loop fetch livros into regliv; exit when livros%notfound; -- Processamento da linha (não se faz nada) dbms_output.put_line('ROWCOUNT=' || to_char(livros%rowcount)); end loop; if livros%isopen then estado := 'aberto'; else estado := 'fechado'; end if; dbms_output.put_line('ISOPEN (antes close) = ' || estado); close livros;

Escola Superior de Tecnologia Instituto Politécnico de Castelo Branco

Exemplo
Rowcount=1 Rowcount=2 Rowcount=3 Rowcount=4 ISOPEN (antes close) = aberto ISOPEN (depois close) =fechado PL/SQL procedure successfully completed.

-- Depois de fechado o cursor já não e possivel aceder aos valores dos seus atributos excepto Isopen if livros%isopen then estado := 'aberto'; else estado := 'fechado'; end if; dbms_output.put_line('ISOPEN (depois close) = ' || estado); end;

LEI e LTIM
Bases de Dados II

Escola Superior de Tecnologia Instituto Politécnico de Castelo Branco

1. FOR <contador_do_tipo_registo> IN <nome_do_cursor> LOOP --- Processamento da linha actual 2. END LOOP; No passo 1. Declaração implícita da variável do tipo registo Abertura implícita do cursor FETCH implícito do cursor No passo 2. teste implícito do final do cursor Fecho implícito do cursor depois de chegar ao fim da sua utilização

Cursores e Ciclos Finitos

LEI e LTIM
Bases de Dados II

Escola Superior de Tecnologia Instituto Politécnico de Castelo Branco

declare cursor livros is select * from livro; -- Não é preciso declarar a varialvel do tipo registo begin for regliv in livros loop if regliv.divisa is null then dbms_output.put_line(to_char(regliv.codigo) || ' – ' || 'Não tem divisa'); else dbms_output.put_line(to_char(regliv.codigo) || ' – ' || regliv.divisa); end if; 10 – Euro end loop; 20 – Euro end; 30 – Escudo
40 – Não tem divisa PL/SQL procedure successfully completed.

Exemplo

LEI e LTIM
Bases de Dados II

Escola Superior de Tecnologia Instituto Politécnico de Castelo Branco

Cursores Explícitos com Parâmetros
Sem parâmetros
Declare cursor livros_em_escudos is select codigo, livro from livro where divisa = ‘PTE’; cursor livros_em_euros is select codigo, livro from livro where divisa = ‘EUR’; Begin ... open livros_em_escudos; ... open livros_em_euros; ... Begin ... open livros(‘PTE’); ... open livros(‘EUR’); ... Declare cursor livros (div varchar2) is select codigo, livro from livro where upper (divisa) = upper (div); -- declara-se apenas um cursor -- em vez de dois

Com parâmetros