Вы находитесь на странице: 1из 42

Linguagens hospedeiras

Aplicaes

interrogar a BD tomar decises dialogar com o utilizador etc.

linguagem de programao convencional


C, Cobol, Ada, Java

linguagem de manipulao de dados


optimizada para acesso rpido a grandes BD

O SGBD fornece um conjunto de procedimentos que implementam as principais funes da LMD


PL/SQL - 1

Acesso BD
ligao directa (API) ODBC JDBC

dados locais

BD

aplicao chamadas LMD


PL/SQL - 2

Comunicao

os programas de aplicao no escrevem directamente na BD usam operaes do nvel conceptual - a bem da independncia dos dados se uma chamada da LMD produz uma relao

esta pode ser maior que a rea de dados local as linguagens convencionais so record-oriented

logo

transferido para a rea local um tuplo de cada vez o seguinte obtido com uma instruo de fetch os dados na rea local so variveis normais do programa
PL/SQL - 3

PL/SQL - Ambiente
Motor PL/SQL PL/SQL

PL/SQL Block

PL/SQL Block SQL

Execuo da expresso procedimental

Execuo da expresso SQL


Servidor Oracle

PL/SQL - 4

PL/SQL - Benefcios

Pode ser usado para agrupar vrias 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 aplicaes 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 no esto presentes no SQL.

PL/SQL - 5

PL/SQL - Benefcios

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 stio onde o servidor Oracle corra. Pode-se escrever programas e criar bibliotecas que podem ser reutilizadas em diferentes ambientes. Pode-se declarar variveis dinamicamente baseadas em estruturas de dados ou tabelas e colunas da BD (%TYPE, %ROWTYPE)

PL/SQL - 6

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 LOOP FOR WHILE

Ciclos

PL/SQL - 8

Estruturas de controlo
LOOP
statement1; EXIT [WHEN condition]; END LOOP; condition - uma varivel booleana ou uma expresso que evolui para (TRUE, FALSE ou NULL) Exerccio: bloco que insira 10 linhas numa tabela de linhas de encomenda, para a encomenda 0017
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
FOR counter IN [REVERSE] lower_bound . . uper_bound LOOP statement1; statement2; ... END LOOP; WHILE condition LOOP statement1; statement2; ... END LOOP;

PL/SQL - 11

Frases SQL em PL/SQL


Extrair uma nica linha de dados da BD usando SELECT; Alterar linhas da BD usando comandos DML; Controlar transaces com COMMIT, ROLLBACK ou SAVEPOINTS; Determinar a sada gerada por DML com cursores; PL/SQL no suporta DDL (create/alter/drop table); PL/SQL no suporta DCL (Grant,);

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 BEGIN --statements [EXCEPTION] END;

Funo
FUNCTION name RETURN datatype IS BEGIN -- statements RETURN value; [EXCEPTION] END;

Um bloco dentro de outro funciona como uma instruo (composta)


Nvel de encaixe arbitrrio Funes SQL disponveis em PL/SQL excepto as de agregao
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 3 4 5 6 7 8 9 (v_id in emp.empno%TYPE) IS BEGIN UPDATE emp SET sal = sal * 1.1 WHERE empno = v_id; END raise_salary; / PL/SQL> raise_salary(7369)
PL/SQL - 15

Executar:
SQL> EXECUTE raise_salary (7369)

Funes
Sintaxe:
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 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

Exemplo:

Gatilhos

Um gatilho um bloco PL/SQL que executa implicitamente sempre que um evento particular acontece. Um gatilho pode ser da BD ou da aplicao. Quando executa?

BEFORE - Antes de executar uma frase DML sobre uma tabela. AFTER - Depois da frase DML INSTEAD OF - Executa o corpo do gatilho em vez da frase que activou o gatilho.

PL/SQL - 17

Gatilhos

Que frase DML activa gatilhos?

INSERT; UPDATE; DELETE.

Tipo de gatilhos: (quantas vezes deve o gatilho executar ao acontecer o evento?)


Statement - executa uma vez; Row - executa uma vez para cada linha afectada pelo gatilho. Bloco PL/SQL ou chamada a procedimento.

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 CREATE OR REPLACE TRIGGER derive_commission_pct BEFORE INSERT OR UPDATE OF sal ON emp FOR EACH ROW BEGIN IF NOT (:NEW.JOB IN (MANAGER,PRESIDENT)) and :NEW.SAL > 5000 THEN RAISE_APPLICATION_ERROR (-20202,Employee cannot earn this amount); END IF; END;

UPDATE EMP SET SAL=6500 WHERE ENAME=MILLER;


PL/SQL - 20

Tipos de variveis

PL/SQL variveis:

Escalar (valor nico); Composta (records); Referncia (apontador); LOB (especificam a localizao de objectos grandes. Ex: imagens) Usadas para passar valores obtidos durante a execuo de PL/SQL para o ambiente SQL*Plus

Variveis no PL/SQL: bind or host variables

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;

Variveis %TYPE herdam o tipo da coluna base e suportam mudanas nessa definio
PL/SQL - 24

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 Boolean

true, false, null

Binary_integer Pls_integer

Ambiguidade: no se sabe se se escreve na BD ou na varivel!

PL/SQL - 25

Exerccio sobre variveis

Quais as declaraes erradas?


DECLARE v_id v_x, v_y, v_z v_aniversario v_em_stock number(4); varchar2(10); date not null; boolean := 1;

PL/SQL - 26

Alcance das variveis

Qual o valor de cada varivel em ambos os blocos?


DECLARE 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; END;


PL/SQL - 27

PL/SQL - SELECT em PL/SQL


SINTAXE: SELECT select_list INTO {variable_name[, variable_name] | record_name} FROM table WHERE condition;
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

Exemplo:
erro se pergunta devolver 0 (NO_DATA_FOUND) ou mais do que 1 linha (TOO_MANY_ROWS) clusula INTO crucial

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

Definir um tipo RECORD para agrupar dados heterogneos


TYPE nome_tipo IS RECORD (campo[, campo]...); nome_campo tipo [[NOT NULL] {:= | DEFAULT} expresso]

Pode-se herdar a definio de um registo


DECLARE registo_emp emp%ROWTYPE BEGIN SELECT * INTO registo_emp FROM emp WHERE... Tornando desnecessrio conhecer em detalhe a tabela base

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

Coluna de Binary integer funciona como ndice; segunda coluna (de contedo) pode ser simples ou composta
DECLARE TYPE CourseList IS TABLE OF VARCHAR2(10); courses CourseList; BEGIN 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.EXTEND; -- append one null element /* Now element 4 exists, so the next statement does not raise SUBSCRIPT_BEYOND_COUNT. */ courses(4) := 'Engl 2005';
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 ligao em massa DELETE FROM emp WHERE deptno = depts(i); -- causa erro END;

Mtodos para tabelas


Exists Count

First Last

Prior Next

Extend Trim

Delete

PL/SQL - 33

PL/SQL - Cursores

Um cursor uma rea privada do SQL. H dois tipos de cursores:


Implcitos (chamados SQL) Explcitos

O servidor Oracle usa cursores implcitos para analisar e executar cdigo SQL. Os cursores explcitos so explicitamente declarados pelo programador.

PL/SQL - 34

Atributos do cursor SQL

Atravs dos atributos do cursor implcito (chamado SQL) podemos testar a sada 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 no afecta nenhuma linha; SQL%ISOPEN - Sempre FALSE porque o PL/SQL fecha sempre os cursores implcitos depois de os executar;

PL/SQL - 35

Controlo de cursores explcitos


no Declare Open Fetch Empty? yes
carrega linha testa fim de corrente dados

Close
liberta conjunto activo

cria uma identifica rea no SQL conjunto


activo

PL/SQL - 36

Cursores - declarao
CURSOR cursor_name [(parameter[, parameter]...)] [RETURN return_type] IS select_statement;

cursor_parameter_name [IN] datatype [{:= | DEFAULT} expression]

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 clusula INTO


PL/SQL - 37

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;

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 explcitos

Atravs dos atributos dos cursores explcitos 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 no devolveu linha; SQL%ISOPEN TRUE se o cursor estiver aberto

Convm fechar o cursor; mximo de cursores abertos (50) no parmetro da BD OPEN_CURSORS

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;

Neste caso no se pode usar os atributos de cursor porque o cursor no tem nome

PL/SQL - 42

Вам также может понравиться