PL/SQL. Linguagens hospedeiras



Documentos relacionados
Oracle PL/SQL Overview

Oracle 10g: SQL e PL/SQL

PL/SQL. Profa. Dra. Cristina Dutra de Aguiar Ciferri. Laboratório de Bases de Dados PL/SQL

Introdução às funções e procedimentos. SQL suporta funções e procedimentos úteis com tipos de dados específicos

Bancos de Dados I. Integridade semântica

António Rocha Nuno Melo e Castro


Sistemas de Informação

Linguagem PL/SQL e Triggers

Laboratório de Banco de Dados Prof. Luiz Vivacqua. PL/pgSQL A Linguagem de programação do PostgreSQL

PROGRAMAÇÃO EM BANCO DADOS Store Procedure e Trigger

SQL Gatilhos (Triggers)

SQL Procedural. Josino Rodrigues Neto

PL/pgSQL por Diversão e Lucro

Triggers e Regras. Fernando Lobo. Base de Dados, Universidade do Algarve

Logado no OracleXE vamos acessar a opção:

FUNCTION ) RETURNS INTEGER AS $$ DECLARE

Triggers. um trigger permite que uma determinada sequência de comandos SQL seja accionada quando um determinado evento ocorre.

trigger insert, delete, update

BANCO DE DADOS II Prof. Ricardo Rodrigues Barcelar


PROGRAMAÇÃO EM BANCO DADOS Stored Procedure e Trigger

Bases de Dados 2007/2008. Aula 9

Hugo Pedro Proença, 2007

poder de manipulação de dados do SQL com poder de processamento das lp procedimentais

Triggers no PostgreSQL

Bases de Dados 2012/2013 Funções/procedimentos e triggers. Helena Galhardas 2012 IST. Bibliografia. Manual referência PostgreSQL

Create Sequence Cria uma sequence. Uma sequence é um objeto que permite vários usuários gerarem valores inteiros sem repetição.

PL/pgSQL. Introdução. Introdução. Introdução

INTRODUÇÃO AO PL/SQL

Introdução ao PL/SQL

Tarefa Orientada 19 Triggers

Bases de Dados 2007/2008. Aula 8

GBC043 - Sistemas de Banco de Dados Funções e Gatilhos no PostgreSQL

Controle de transações em SQL

Banco de Dados II. Triggers e Functions. Prof. Moser Fagundes. Curso TSI Instituto Federal Sul-Rio-Grandense (IFSul) Campus Charqueadas

Programação com ODBC 3

BD Oracle. Licenciatura em Engenharia Informática e Computação. Bases de Dados 2003/04

Monitoria GDI Aula Prática. DML + PL/SQL parte 1

PROCEDURES, FUNÇÕES, PL/SQL, CURSORES, VIEW, ÍNDICE e SEQUÊNCIA. Stored procedure PL/SQL. Procedimentos e Funções. Procedimento (procedure) Procedure

Triggers em PostgreSQL. Linguagem de Programação de Banco de Dados. Triggers em PostgreSQL. Triggers em PostgreSQL

Banco de Dados. Prof. Antonio

Gatilhos (Triggers) Prof. Márcio Bueno Elaborado por Maria Lígia B. Perkusich

Consultoria e Treinamento em Bancos de Dados Relacionais

SQL TGD/JMB 1. Projecto de Bases de Dados. Linguagem SQL

DSS 08/09. Camada de Dados - JDBC. Aula 1. António Nestor Ribeiro /António Ramires Fernandes/ José Creissac Campos {anr,arf,jfc}@di.uminho.

O dono de uma livraria cuja base de dados é administrada por si pediu-lhe para efectuar as seguintes alterações ao preço dos livros:

BANCO DE DADOS. info 3º ano. Prof. Diemesleno Souza Carvalho

DSS 09/10. DSS 09/10 Que métodos é que fazem parte de cada camada? Aplicações Multi-camada JDBC. Aula 3 DSS 09/10

Banco de Dados Avançados Banco de Dados Ativo

DESENVOLVIMENTO DE SOFTWARE

Bases de Dados 2012/2013 Restrições de Integridade em SQL. Helena Galhardas 2012 IST. Bibliografia

Introdução à Banco de Dados. Nathalia Sautchuk Patrício

Projeto de Banco de Dados

8. Outros tipos de Transação (Modo de Transação de Autoconfirmação e Modo Implícito)

SQL Structured Query Language

Introdução ao SQL. Aécio Costa

Funções Definidas pelo Usuário

Os dados no MySQL são armazenado em tabelas. Uma tabela é uma colecção de informação relacionada e consiste em colunas e linhas.

RECUPERAÇÃO DE CONTEÚDO BANCO DE DADOS

PostgreSQL. André Luiz Fortunato da Silva Analista de Sistemas CIRP / USP alf@cirp.usp.br

SQL (Structured Query Language)

Bases de Dados 2007/2008. Aula 1. Referências

António Rocha Nuno Melo e Castro

DESENVOLVIMENTO DE SOFTWARE

Banco de Dados I. Aula 12 - Prof. Bruno Moreno 04/10/2011

A linguagem SQL

Programação SQL. Introdução

COMPETÊNCIAS ESPECÍFICAS Compreender e utilizar a linguagem SQL, na construção e manutenção de uma base de dados.

BANCO DE DADOS II Prof. Ricardo Rodrigues Barcelar

BD SQL Server. Licenciatura em Engenharia Informática e Computação. Bases de Dados 2003/04

Laboratório 3. Base de Dados II 2008/2009

Laboratório de Banco de Dados Aula 1 Acesso a Banco de Dados. Prof. Josenildo Silva jcsilva@ifma.edu.br

SQL Server Triggers Aprenda a utilizar triggers em views e auditar as colunas atualizadas em uma tabela

BANCO DE DADOS: SQL. Edson Anibal de Macedo Reis Batista. 27 de janeiro de 2010

Aula 1 Acesso a Banco de Dados

Tarefa Orientada 16 Vistas

ACH2025. Laboratóriode Bases de Dados. SQL Oracle Asserçõese gatilhos. Professora: Fátima L. S. Nunes SISTEMAS DE INFORMAÇÃO

Integridade dos Dados

Roteiro 9 - SQL Básico: chave estrangeira, operadores de comparação e operadores booleanos

FERRAMENTA DE APOIO A REESTRUTURAÇÃO DE CÓDIGO FONTE EM LINGUAGEM PL/SQL BASEADO EM PADRÕES DE LEGIBILIDADE

UNINGÁ UNIDADE DE ENSINO SUPERIOR INGÁ FACULDADE INGÁ CIÊNCIA DA COMPUTAÇÃO CURSORS. Profº Erinaldo Sanches Nascimento

Comandos de Manipulação

Motivação. Aplicações precisam acessar o BD Linguagens BD X Linguagens Programação. paradigmas diferentes (impedance mismatch)

Faculdade Pitágoras 16/08/2011. Curso Superior de Tecnologia: Banco de Dados Sistemas para Internet

São 182 videoaulas de Oracle pl/sql procedures functions triggers Forms Reports

Faculdade Pitágoras. Curso Superior de Tecnologia: Banco de Dados. Disciplina: Banco de Dados Prof.: Fernando Hadad Zaidan SQL

O que são Bancos de Dados?

MANUAL INSTALAÇÃO WEB SERVICE

SQL: Definição de tabelas, Modificações à Base de Dados

Centro Universitário Franciscano

SQL e PL/SQL Oracle Dicas de preparação para certificação

Banco de Dados II. PL/SQL - Procedures -Cursor - Funções. Segurança: Introdução; Controle de Acesso; Criptografia; Recursos de SQL.

Transcrição:

PL/SQL Linguagens hospedeiras Aplicações interrogar a BD tomar decisões dialogar com o utilizador etc. linguagem de programação convencional C, Cobol, Ada, Java linguagem de manipulação de dados optimizada para acesso rápido a grandes BD O SGBD fornece um conjunto de procedimentos que implementam as principais funções da LMD 2 1

Acesso à BD dados locais ligação directa (API) ODBC JDBC BD aplicação chamadas LMD 3 Comunicação os programas de aplicação não escrevem directamente na BD usam operações do nível conceptual - a bem da independência dos dados se uma chamada da LMD produz uma relação esta pode ser maior que a área de dados local as linguagens convencionais são record-oriented logo 4 é transferido para a área local um tuplo de cada vez o seguinte é obtido com uma instrução de fetch os dados na área local são variáveis normais do programa 2

PL/SQL - Ambiente PL/SQL Block PL/SQL Block Motor PL/SQL PL/SQL SQL Execução da expressão procedimental Execução da expressão SQL Servidor Oracle 5 PL/SQL - Benefícios Pode ser usado para agrupar várias perguntas SQL num só bloco e enviá-lo de uma só vez para o servidor. PL/SQL pode cooperar com as ferramentas de desenvolvimento de aplicações Oracle tais como Developer Forms e Reports adicionando poder de processamento procedimental a estas ferramentas. Podemos tirar vantagens das capacidades procedimentais do PL/SQL que não estão presentes no SQL. 6 3

PL/SQL - Benefícios Os programas podem ser transportados para qualquer ambiente (SO ou plataforma) que suporte o servidor Oracle e PL/SQL, ou seja, os programas PL/SQL podem correr em qualquer sítio onde o servidor Oracle corra. Pode-se escrever programas e criar bibliotecas que podem ser reutilizadas em diferentes ambientes. Pode-se declarar variáveis dinamicamente baseadas em estruturas de dados ou tabelas e colunas da BD (%TYPE, %ROWTYPE) 7 PL/SQL - Benefícios Desenvolvimento modular de programas. Declare o o o Begin o o o Exception o o o End; Permite executar instruções condicionais. Permite executar instruções num ciclo. Permite processar várias linhas devolvidas por uma pergunta através de cursores. Os erros podem ser processados com rotinas de tratamento de excepções. 8 4

Estruturas de controlo Instruções condicionais: IF-THEN-END IF IF-THEN-ELSE-END IF IF-THEN-ELSIF-END IF Ciclos LOOP FOR WHILE 9 Estruturas de controlo LOOP statement1; EXIT [WHEN condition]; END LOOP; condition - é uma variável booleana ou uma expressão que evolui para (TRUE, FALSE ou NULL) Exercício: bloco que insira 10 linhas numa tabela de linhas de encomenda, para a encomenda 0017 10 5

Exemplo de ciclo v_num_enc itens.no_enc%type := 134; Contador number(2) := 1; LOOP INSERT INTO itens( no_enc, linha ) values(v_num_enc, contador ); Contador:= contador+1; Exit when contador >10; End loop; 11 Estruturas de controlo FOR counter IN [REVERSE] lower_bound.. uper_bound LOOP statement1; statement2;... END LOOP; WHILE condition LOOP statement1; statement2;... END LOOP; 12 6

Frases SQL em PL/SQL Extrair uma única linha de dados da BD usando SELECT; Alterar linhas da BD usando comandos DML; Controlar transacções com COMMIT, ROLLBACK ou SAVEPOINTS; Determinar a saída gerada por DML com cursores; PL/SQL não suporta DDL (create/alter/drop table); PL/SQL não suporta DCL (Grant, ); 13 Estrutura - Optativo Variáveis, cursores, excepções definidas pelo utilizador - Obrigatório Expressões SQL Declare o o o Expressões PL/SQL Begin EXCEPTION - Optativo o o o Acções a executar quando ocorrem erros Exception END - Obrigatório o o o End; 14 7

Tipos de Blocos Anónimo Procedimento Função [] --statements [EXCEPTION] PROCEDURE name IS --statements [EXCEPTION] FUNCTION name RETURN datatype IS -- statements RETURN value; [EXCEPTION] Um bloco dentro de outro funciona como uma instrução (composta) Nível de encaixe arbitrário Funções SQL disponíveis em PL/SQL excepto as de agregação 15 Procedimentos Sintaxe: CREATE [OR REPLACE] PROCEDURE procedure_name (parameter1 [mode1] datatype1, parameter2 [mode2] datatype2, ) IS AS PL/SQL Block Exemplo: SQL> CREATE OR REPLACE PROCEDURE raise_salary 2 (v_id in emp.empno%type) 3 IS 4 5 UPDATE emp 6 SET sal = sal * 1.1 7 WHERE empno = v_id; 8 END raise_salary; 9 / Executar: SQL> EXECUTE raise_salary (7369) PL/SQL> raise_salary(7369) 16 8

Funções Sintaxe: Exemplo: CREATE [OR REPLACE] FUNCTION function_name (parameter1 [mode1] datatype1, parameter2 [mode2] datatype2, ) RETURN datatype IS AS PL/SQL Block SQL> CREATE OR REPLACE FUNCTION get_sal 2 (v_id IN emp.empno%type) 3 RETURN NUMBER 4 IS v_salary emp.sal%type :=0; 5 6 SELECT sal INTO v_salary 7 FROM emp WHERE empno = v_id; 8 RETURN (v_salary); 9 END get_sal; 10 / 17 Triggers Um trigger é um bloco PL/SQL que executa implicitamente sempre que um evento particular acontece. Um trigger pode ser da BD ou da aplicação. Quando executa? BEFORE - Antes de executar uma frase DML sobre uma tabela. AFTER - Depois da frase DML INSTEAD OF - Executa o corpo do trigger em vez da frase que activou o trigger. 18 9

Triggers Que frase DML activa trigger? INSERT; UPDATE; DELETE. Tipo de triggers: (quantas vezes deve o trigger executar ao acontecer o evento?) Statement - executa uma vez; Row - executa uma vez para cada linha afectada pelo trigger. Corpo do trigger Bloco PL/SQL ou chamada a procedimento. 19 Triggers Sintaxe CREATE [OR REPLACE] TRIGGER trigger_name timing event1 [OR event2 OR event3] ON table_name trigger_body Ou (gatilho de linha) CREATE [OR REPLACE] TRIGGER trigger_name timing event1 [OR event2 OR event3] ON table_name [REFERENCING OLD AS old / NEW AS new] FOR EACH ROW [WHEN condition] trigger_body 20 10

Triggers Exemplo SQL> CREATE OR REPLACE TRIGGER derive_commission_pct 2 BEFORE INSERT OR UPDATE OF sal ON emp 3 FOR EACH ROW 4 5 IF NOT (:NEW.JOB IN ( MANAGER, PRESIDENT )) 6 and :NEW.SAL > 5000 7 THEN 8 RAISE_APPLICATION_ERROR 9 (-20202, Employee cannot earn this amount ); 10 END IF; 11 UPDATE EMP SET SAL=6500 WHERE ENAME= MILLER ; 21 Tipos de variáveis PL/SQL variáveis: Escalar (valor único); Composta (records); Referência (apontador); LOB (especificam a localização de objectos grandes. Ex: imagens) Variáveis não PL/SQL: bind or host variables Usadas para passar valores obtidos durante a execução de PL/SQL para o ambiente SQL*Plus 22 11

Variáveis ligadas Variáveis definidas no PL/SQL não são visíveis pelo SQL*Plus Bind variables -> Variáveis ligadas são variáveis que são criadas no SQL*Plus e podem ser referidas no PL/SQL. Como criar Ex: VARIABLE ret_val NUMBER; Para referir vars ligadas no PL/SQL usa-se (:) imediatamente antes da variável Ex: :ret_val :=1; Para mudar o valor desta variável no SQL*Plus é necessário escrever um bloco PL/SQL. Ex: SQL> begin 2 :ret_val:=4; 3 end; 4 / 23 Exemplo em SQL/Plus SQL> VARIABLE g_sal_mensal NUMBER SQL> ACCEPT p_sal_anual PROMPT Salário anual: SQL> SQL> v_sal NUMBER(9,2) := &p_sal_anual; SQL> SQL> :g_sal_mensal := v_sal / 12; SQL> SQL> / SQL> PRINT g_sal_mensal SQL> /* ou: SET SERVEROUTPUT ON SQL>DBMS_OUTPUT.PUT_LINE( Salário mensal de TO_CHAR(v_sal)); SQL> */ 24 12

Declaração e atribuição Sintaxe: identifier [CONSTANT] datatype [NOT NULL] [:= DEFAULT expr]; Exemplos: Declare v_hiredate DATE; v_deptno NUMBER(2) NOT NULL :=10; c_comm CONSTANT NUMBER :=1400; v_ename emp.ename%type; Atribuição: v_hiredate := 31-DEC-98 ; Variáveis %TYPE herdam o tipo da coluna base e suportam mudanças nessa definição 25 Tipos escalares Varchar2(max_comp) Number[(precisão,casas decimais)] Date Char [(max_comp)] Long Long Raw Boolean true, false, null Binary_integer Pls_integer ATENÇÃO: As variáveis não devem ter nomes iguais a nomes das colunas da BD. Ambiguidade: não se sabe se se escreve na BD ou na variável! 26 13

Exercício sobre variáveis Quais as declarações erradas? v_id number(4); v_x, v_y, v_z varchar2(10); v_aniversario date not null; v_em_stock boolean := 1; 27 Alcance das variáveis Qual o valor de cada variável em ambos os blocos? V_sal number(7,2) := 60000; V_com number(7,2) := v_sal*0.2; V_mensagem varchar2(255) := de qualidade. ; Begin... Declare V_sal number(7,2) := 50000; V_com number(7,2) := 0; V_total number(7,2) := v_sal+v_com; Begin... V_mensagem := Operario v_mensagem; End; V_mensagem := Secretario v_mensagem; 28 14

PL/SQL - SELECT em PL/SQL SINTAXE: Exemplo: erro se pergunta devolver 0 (NO_DATA_FOUND) ou mais do que 1 linha (TOO_MANY_ROWS) cláusula INTO crucial SELECT select_list INTO {variable_name[, variable_name] record_name} FROM table WHERE condition; v_sum_sal emp.sal%type; v_deptno NUMBER NOT NULL :=10; SELECT SUM(sal) --group function INTO v_num_sal FROM emp WHERE dptno=v_deptno; 29 PL/SQL - INSERT/UPDATE em PL/SQL INSERT INTO emp(empno, ename, job, deptno) VALUES empno_sequence.nextval, Harding, Clerk, 10); v_sal_increase emp.sal%type := 2000; UPDATE emp SET sal:= sal + v_sal_increase WHERE job = ANALYST ; 30 15

Registos Definir um tipo RECORD para agrupar dados heterogéneos TYPE nome_tipo IS RECORD (campo[, campo]...); nome_campo tipo [[NOT NULL] {:= DEFAULT} expressão] Pode-se herdar a definição de um registo registo_emp emp%rowtype SELECT * INTO registo_emp FROM emp WHERE... Tornando desnecessário conhecer em detalhe a tabela base 31 Registos encaixados TYPE TimeRec IS RECORD (mins SMALLINT, hrs SMALLINT); TYPE MeetingRec IS RECORD ( day DATE, time_of TimeRec, -- nested record room_no INTEGER(4)); TYPE PartyRec IS RECORD ( day DATE, time_of TimeRec, -- nested record place VARCHAR2(25)); seminar MeetingRec; party PartyRec;... party.time_of := seminar.time_of; 32 16

Tabelas Coluna de Binary integer funciona como índice; segunda coluna (de conteúdo) pode ser simples ou composta TYPE CourseList IS TABLE OF VARCHAR2(10); courses CourseList; courses := CourseList('Biol 4412', 'Psyc 3112', 'Anth 3001'); courses.delete(3); -- delete element 3 /* PL/SQL keeps a placeholder for element 3. So, the next statement appends element 4, not element 3. */ courses.ext -- append one null element /* Now element 4 exists, so the next statement does not raise SUBSCRIPT_BEYOND_COUNT. */ courses(4) := 'Engl 2005'; 33 Tabelas TYPE NumList IS TABLE OF NUMBER; depts NumList := NumList(10, 20, 30, 40); depts.delete(3); -- apaga terceiro elemento FORALL i IN depts.first..depts.last ligação em massa DELETE FROM emp WHERE deptno = depts(i); -- causa erro Métodos para tabelas Exists First Prior Extend Delete Count Last Next Trim 34 17

PL/SQL - Cursores Um cursor é uma área privada do SQL. Há dois tipos de cursores: Implícitos (chamados SQL) Explícitos O servidor Oracle usa cursores implícitos para analisar e executar código SQL. Os cursores explícitos são explicitamente declarados pelo programador. 35 Atributos do cursor SQL Através dos atributos do cursor implícito (chamado SQL) podemos testar a saída produzida por uma pergunta SQL: SQL%ROWCOUNT - nº de linhas afectadas pela mais recente frase SQL; SQL%FOUND - TRUE se a mais recente frase SQL afecta uma ou mais linhas; SQL%NOTFOUND - TRUE se a mais recente frase SQL não afecta nenhuma linha; SQL%ISOPEN - Sempre FALSE porque o PL/SQL fecha sempre os cursores implícitos depois de os executar; 36 18

Controlo de cursores explícitos no Declar e cria uma área no SQL Open Fetch Empty? Close identifica conjunto activo carrega linha corrente testa fim de dados yes liberta conjunto activo 37 Cursores - declaração CURSOR cursor_name [(parameter[, parameter]...)] [RETURN return_type] IS select_statement; cursor_parameter_name [IN] datatype [{:= DEFAULT} expression] CURSOR c1 IS SELECT empno, ename, job, sal FROM emp WHERE sal > 2000; CURSOR c2 RETURN dept%rowtype IS SELECT * FROM dept WHERE deptno = 10; sem cláusula INTO 38 19

Cursor num Package CREATE PACKAGE BODY emp_stuff AS CURSOR c1 RETURN emp%rowtype IS SELECT * FROM emp WHERE deptno = 20; -- new WHERE clause... END emp_stuff; 39 Processamento das linhas emp_rec emp%rowtype; -- ou emp_rec emp_stuff.c1%rowtype...... OPEN emp_stuff.c1; LOOP FETCH emp_stuff.c1 INTO emp_rec; EXIT WHEN emp_suff.c1%notfound;... END LOOP; CLOSE emp_stuff.c1; 40 20

Atributos dos cursores explícitos Através dos atributos dos cursores explícitos podemos controlar o processamento do resultado: SQL%ROWCOUNT - nº de linhas devolvidas até ao momento; SQL%FOUND - TRUE se o fetch mais recente devolveu linha; SQL%NOTFOUND - TRUE se o fetch mais recente não devolveu linha; SQL%ISOPEN TRUE se o cursor estiver aberto Convém fechar o cursor; máximo de cursores abertos (50) no parâmetro da BD OPEN_CURSORS 41 Cursor de ciclo FOR result temp.col1%type; CURSOR c1 IS SELECT n1, n2, n3 FROM data_table WHERE exper_num = 1; FOR c1_rec IN c1 LOOP /* calcula e armazena os resultados */ result := c1_rec.n2 / (c1_rec.n1 + c1_rec.n3); INSERT INTO temp VALUES (result, NULL, NULL); END LOOP; COMMIT; 42 21

Cursor de sub-pergunta bonus REAL; FOR emp_rec IN (SELECT empno, sal, comm FROM emp) LOOP bonus := (emp_rec.sal * 0.05) + (emp_rec.comm * 0.25); INSERT INTO bonuses VALUES (emp_rec.empno, bonus); END LOOP; COMMIT; Neste caso não se pode usar os atributos de cursor porque o cursor não tem nome 43 22