Aplicações
interrogar a BD
tomar decisões
dialogar com o utilizador
etc.
linguagem de programação convencional
C, Cobol, Ada, Java
aplicação
chamadas
LMD
PL/SQL - 2
Comunicação
PL/SQL - 3
PL/SQL - Ambiente
Motor PL/SQL
PL/SQL Execução da
PL/SQL PL/SQL
expressão
Block Block SQL
procedimental
Servidor Oracle
PL/SQL - 4
PL/SQL - Benefícios
PL/SQL - 5
PL/SQL - Benefícios
PL/SQL - 6
PL/SQL - Benefícios
Desenvolvimento modular de
Declare programas.
ooo
Begin Permite executar instruções
ooo condicionais.
Exception Permite executar instruções num ciclo.
ooo Permite processar várias linhas
End; devolvidas por uma pergunta através de
cursores.
Os erros podem ser processados com
rotinas de tratamento de excepções.
PL/SQL - 7
Estruturas de controlo
Instruções condicionais:
IF-THEN-END IF
IF-THEN-ELSE-END IF
IF-THEN-ELSIF-END IF
Ciclos
LOOP
FOR
WHILE
PL/SQL - 8
Estruturas de controlo
LOOP
statement1;
…
EXIT [WHEN condition];
END LOOP;
PL/SQL - 9
Exemplo de ciclo
DECLARE
v_num_enc itens.no_enc%TYPE := 134;
Contador number(2) := 1;
BEGIN
LOOP
INSERT INTO itens( no_enc, linha )
values(v_num_enc, contador );
Contador:= contador+1;
Exit when contador >10;
End loop;
END;
PL/SQL - 10
Estruturas de controlo
PL/SQL - 11
Frases SQL em PL/SQL
PL/SQL - 12
Estrutura
DECLARE - Optativo
Variáveis, cursores, excepções definidas pelo utilizador
BEGIN - Obrigatório
Expressões SQL Declare
Expressões PL/SQL
ooo
Begin
EXCEPTION - Optativo ooo
Acções a executar quando ocorrem erros Exception
END - Obrigatório ooo
End;
PL/SQL - 13
Tipos de Blocos
PL/SQL - 14
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 BEGIN
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)
PL/SQL - 15
Funções
Sintaxe: CREATE [OR REPLACE] FUNCTION function_name
(parameter1 [mode1] datatype1,
parameter2 [mode2] datatype2,
…)
RETURN datatype
IS | AS
PL/SQL Block
Exemplo: 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 BEGIN
6 SELECT sal INTO v_salary
7 FROM emp WHERE empno = v_id;
8 RETURN (v_salary);
9 END get_sal;
10 /
PL/SQL - 16
Gatilhos
PL/SQL - 17
Gatilhos
PL/SQL - 18
Gatilhos
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
PL/SQL - 19
Gatilhos
Exemplo
SQL> CREATE OR REPLACE TRIGGER derive_commission_pct
2 BEFORE INSERT OR UPDATE OF sal ON emp
3 FOR EACH ROW
4 BEGIN
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 END;
PL/SQL - 20
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
PL/SQL - 21
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 /
PL/SQL - 22
Exemplo em SQL/Plus
SQL> VARIABLE g_sal_mensal NUMBER
SQL> ACCEPT p_sal_anual PROMPT ‘Salário anual: ‘
SQL> DECLARE
SQL> v_sal NUMBER(9,2) := &p_sal_anual;
SQL> BEGIN
SQL> :g_sal_mensal := v_sal / 12;
SQL> END;
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> */
PL/SQL - 23
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;
PL/SQL - 24
Tipos escalares
Varchar2(max_comp)
Number[(precisão,casas decimais)]
Date ATENÇÃO: As variáveis
Char [(max_comp)] não devem ter nomes
Long iguais a nomes das
Long Raw colunas da BD.
Boolean Ambiguidade: não se
true, false, null sabe se se escreve na BD
Binary_integer ou na variável!
Pls_integer
PL/SQL - 25
Exercício sobre variáveis
PL/SQL - 26
Alcance das variáveis
PL/SQL - 27
PL/SQL - SELECT em PL/SQL
SINTAXE: SELECT select_list
INTO {variable_name[, variable_name]…
| record_name}
FROM table
WHERE condition;
Exemplo: DECLARE
v_sum_sal emp.sal%TYPE;
v_deptno NUMBER NOT NULL :=10;
• erro se pergunta devolver BEGIN
0 (NO_DATA_FOUND) ou SELECT SUM(sal) --group function
mais do que 1 linha INTO v_num_sal
(TOO_MANY_ROWS) FROM emp
• cláusula INTO crucial WHERE dptno=v_deptno;
END;
PL/SQL - 28
PL/SQL - INSERT/UPDATE em PL/SQL
BEGIN
INSERT INTO emp(empno, ename, job, deptno)
VALUES empno_sequence.nextval,’Harding’,’Clerk’, 10);
END;
DECLARE
v_sal_increase emp.sal%TYPE := 2000;
BEGIN
UPDATE emp
SET sal:= sal + v_sal_increase
WHERE job = ‘ANALYST’;
END;
PL/SQL - 29
Registos
PL/SQL - 30
Registos encaixados
DECLARE
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;
BEGIN ...
party.time_of := seminar.time_of;
END;
PL/SQL - 31
Tabelas
PL/SQL - 32
Tabelas
DECLARE
TYPE NumList IS TABLE OF NUMBER;
depts NumList := NumList(10, 20, 30, 40);
BEGIN
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
END;
PL/SQL - 33
PL/SQL - Cursores
PL/SQL - 34
Atributos do cursor SQL
PL/SQL - 35
Controlo de cursores explícitos
no
PL/SQL - 36
Cursores - declaração
DECLARE
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
PL/SQL - 37
Cursor num Package
PL/SQL - 38
Processamento das linhas
DECLARE
emp_rec emp%ROWTYPE;
-- ou emp_rec emp_stuff.c1%ROWTYPE
...
BEGIN
...
OPEN emp_stuff.c1;
LOOP
FETCH emp_stuff.c1 INTO emp_rec;
EXIT WHEN emp_suff.c1%NOTFOUND;
...
END LOOP;
CLOSE emp_stuff.c1;
END;
PL/SQL - 39
Atributos dos cursores explícitos
PL/SQL - 40
Cursor de ciclo FOR
DECLARE
result temp.col1%TYPE;
CURSOR c1 IS
SELECT n1, n2, n3 FROM data_table WHERE exper_num = 1;
BEGIN
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;
END;
PL/SQL - 41
Cursor de sub-pergunta
DECLARE
bonus REAL;
BEGIN
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;
END;
PL/SQL - 42