Académique Documents
Professionnel Documents
Culture Documents
Aplicaes
interrogar a BD
tomar decises
dialogar com o utilizador
etc.
Acesso BD
ligao directa (API)
ODBC
dados locais
JDBC
BD
aplicao
chamadas
LMD
PL/SQL - 2
Comunicao
logo
PL/SQL - Ambiente
Motor PL/SQL
PL/SQL
Block
PL/SQL
PL/SQL
Block
SQL
Execuo da
expresso
procedimental
PL/SQL - 4
PL/SQL - Benefcios
PL/SQL - Benefcios
PL/SQL - Benefcios
Declare
ooo
Begin
ooo
Exception
ooo
End;
Desenvolvimento modular de
programas.
Permite executar instrues
condicionais.
Permite executar instrues num ciclo.
Permite processar vrias linhas
devolvidas por uma pergunta atravs de
cursores.
Os erros podem ser processados com
rotinas de tratamento de excepes.
PL/SQL - 7
Estruturas de controlo
Instrues 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;
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
FOR counter IN [REVERSE]
lower_bound . . uper_bound LOOP
statement1;
statement2;
...
END LOOP;
WHILE condition LOOP
statement1;
statement2;
...
END LOOP;
PL/SQL - 11
PL/SQL - 12
Estrutura
DECLARE - Optativo
Variveis, cursores, excepes definidas pelo utilizador
BEGIN - Obrigatrio
Declare
ooo
Expresses PL/SQL
Begin
EXCEPTION - Optativo
ooo
Aces a executar quando ocorrem erros Exception
ooo
END - Obrigatrio
End;
Expresses SQL
PL/SQL - 13
Tipos de Blocos
Annimo
[DECLARE]
BEGIN
--statements
[EXCEPTION]
END;
Procedimento
PROCEDURE name
IS
Funo
[EXCEPTION]
FUNCTION name
RETURN datatype
IS
BEGIN
-- statements
RETURN value;
[EXCEPTION]
END;
END;
BEGIN
--statements
Procedimentos
Sintaxe:
CREATE [OR REPLACE] PROCEDURE procedure_name
(parameter1 [mode1] datatype1,
parameter2 [mode2] datatype2,
)
IS | AS
PL/SQL Block
(v_id in emp.empno%TYPE)
IS
BEGIN
UPDATE emp
SET sal = sal * 1.1
WHERE empno = v_id;
END raise_salary;
/
Executar:
SQL> EXECUTE raise_salary (7369)
PL/SQL> raise_salary(7369)
PL/SQL - 15
Funes
Sintaxe:
Exemplo:
Gatilhos
PL/SQL - 17
Gatilhos
Corpo do gatilho
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>
2
3
4
5
6
7
8
9
10
11
Tipos de variveis
PL/SQL variveis:
PL/SQL - 21
Variveis ligadas
Variveis definidas no PL/SQL no so visveis pelo SQL*Plus
Bind variables -> Variveis ligadas so variveis que so 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 varivel
Ex:
:ret_val :=1;
Para mudar o valor desta varivel no SQL*Plus necessrio
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 Salrio 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(Salrio mensal de ||
TO_CHAR(v_sal));
SQL> */
PL/SQL - 23
Declarao e atribuio
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;
Atribuio:
v_hiredate := 31-DEC-98;
Tipos escalares
Varchar2(max_comp)
Number[(preciso,casas decimais)]
Date
ATENO: As variveis
Char [(max_comp)] no devem ter nomes
iguais a nomes das
Long
colunas da BD.
Long Raw
Ambiguidade: no se
Boolean
true, false, null
sabe se se escreve na BD
ou na varivel!
Binary_integer
Pls_integer
PL/SQL - 25
number(4);
varchar2(10);
date not null;
boolean := 1;
PL/SQL - 26
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;
BEGIN
SELECT SUM(sal) --group function
INTO
v_num_sal
FROM
emp
WHERE dptno=v_deptno;
END;
PL/SQL - 28
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
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 ligao em massa
DELETE FROM emp WHERE deptno = depts(i); -- causa erro
END;
Exists
Count
First
Last
Prior
Next
Extend
Trim
Delete
PL/SQL - 33
PL/SQL - Cursores
PL/SQL - 34
PL/SQL - 35
Open
identifica
cria uma
rea no SQL conjunto activo
Fetch
Empty?
carrega linha
testa fim de
corrente
dados
Close
yes
liberta conjunto
activo
PL/SQL - 36
Cursores - declarao
CURSOR cursor_name [(parameter[, parameter]...)]
[RETURN return_type] IS select_statement;
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;
PL/SQL - 38
PL/SQL - 39
PL/SQL - 40
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