Are you sure?
This action might not be possible to undo. Are you sure you want to continue?
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
This action might not be possible to undo. Are you sure you want to continue?