Beruflich Dokumente
Kultur Dokumente
Introduo
O que PLSQL?
a linguagem procedural do SGBD Oracle
uma extenso do SQL
Banco de Dados II Mistura linguagem de programao com SQL
Introduo
Permite criar programas que ficaro
armazenados no banco de dados e que podem
ser acessados por quaisquer aplicaes
PLSQL
Estrutura Estrutura
A estrutura bsica de um programa PLSQL a Um primeiro programa:
seguinte: SET SERVEROUTPUT ON
DECLARE
v_width INTEGER;
v_height INTEGER := 2;
v_area INTEGER := 6;
Os blocos
BEGIN
entre [] so -- configura a largura igual rea dividida pela altura
opcionais v_width := v_area / v_height;
DBMS_OUTPUT.PUT_LINE('v_width = ' || v_width);
EXCEPTION
WHEN ZERO_DIVIDE THEN
DBMS_OUTPUT.PUT_LINE('Division by zero');
END;
1
28/03/2016
7 8
2
28/03/2016
Variveis e Tipos
Declarao de Varivel:
15 16
17 18
3
28/03/2016
19 20
Variveis e Tipos
Outra forma de atribuir um valor varivel
por meio do comando SELECT INTO:
DECLARE
v_Cargo EMPLOYEES.JOB_ID%TYPE;
BEGIN
SELECT JOB_ID
INTO v_Cargo
FROM EMPLOYEES
WHERE EMPLOYEE_ID = 108;
ESTRUTURAS DE CONTROLE
DBMS_OUTPUT.PUT_LINE(v_Cargo);
END;
21
23 24
4
28/03/2016
DECLARE
v_Regiao COUNTRIES.REGION_ID%TYPE; Estruturas de Repetio
BEGIN
SELECT REGION_ID
Estruturas de Deciso INTO v_Regiao As estruturas do tipo LOOP-EXIT WHEN tm a seguinte
FROM COUNTRIES
WHERE COUNTRY_NAME = 'Egypt'; sintaxe:
EXEMPLO CASE CASE v_Regiao LOOP
WHEN 1 THEN
DBMS_OUTPUT.PUT_LINE ('Europe');
Sequncia_de_instrues
WHEN 2 THEN EXIT WHEN condio;
DBMS_OUTPUT.PUT_LINE ('Americas'); END LOOP
WHEN 3 THEN SET SERVEROUTPUT ON;
DBMS_OUTPUT.PUT_LINE ('Asia'); DECLARE
WHEN 4 THEN v_counter INTEGER := 0;
DBMS_OUTPUT.PUT_LINE ('Middle East / BEGIN
Africa'); LOOP
ELSE v_counter := v_counter + 1;
DBMS_OUTPUT.PUT_LINE ('Sem Regiao'); EXIT WHEN v_counter = 5;
END CASE; END LOOP;
END; DBMS_OUTPUT.PUT_LINE(v_counter);
27 28
END;
5
28/03/2016
emp:=emp+1;
END LOOP;
31 32
END;
33 34
6
28/03/2016
Excees
Voltando estrutura dos blocos PLSQL:
TRATANDO EXCEES
38
Excees
Excees H diversos erros pr-definidos, entre os quais:
39 40
Excees Excees
Para trat-las devemos seguir esta sintaxe: Exemplo:
DECLARE
EXCEPTION sal employees.salary%TYPE := 0;
WHEN nome_da_exceo THEN mgr_id employees.manager_id%TYPE;
lname employees.last_name%TYPE;
Seqncia_de_instrues1;
BEGIN
WHEN nome_da_exceo THEN SELECT salary, manager_id, last_name INTO sal, mgr_id, lname
Seqncia_de_instrues2; FROM employees;
WHEN OTHERS THEN EXCEPTION
Seqncia_de_instrues3; WHEN NO_DATA_FOUND OR TOO_MANY_ROWS THEN
END; INSERT INTO log_table VALUES ('A insert erro occurred',
SYSDATE);
COMMIT;
41
END; 42
7
28/03/2016
excees:
EXCEPTION
WHEN comm_missing THEN
PROCEDURES E FUNCTIONS
DBMS_OUTPUT.PUT_LINE (Employee doesnt
receive comm');
commission := 0;
WHEN OTHERS THEN
43 44
NULL; END award_bonus;
Procedures
Procedures
Modo Descrio
Uma procedure no possui valor de retorno O valor do parmetro real passado para a procedure quando ela
IN invocada. Dentro da procedure, o parmetro formal atua como uma
Para declar-la, utiliza-se a seguinte sintaxe: constante PL/SQL - ele considerado de leitura e no pode ser alterado.
Procedures Procedures
Embora seja interessante, no recomendado Exemplo de procedure:
que uma procedure possua argumentos do
tipo OUT CREATE OR REPLACE PROCEDURE NOVO_PERIODO
(P_COD_PERIODO IN NUMBER,
P_DATA_INCIAL IN DATE,
P_DATA_FINAL IN DATE)
IS
BEGIN
INSERT INTO PERIODO_LETIVO VALUES(P_COD_PERIODO,
P_DATA_INCIAL, P_DATA_FINAL);
END;
47 48
8
28/03/2016
Fixao Functions
Crie um procedure que receba como As funes tm obrigatoriamente valor de
parmetro o cdigo de um produto e o valor e retorno
verifique se o produto existe A sintaxe de declarao a seguinte:
Em caso positivo, a procedure deve atualizar o
preo do produto, multiplicando-o pelo valor. CREATE [OR REPLACE] FUNCTION nome_de_funo
A atualizao ser feita na tabela de produtos [(argumento [{IN | OUT| IN OUT}] tipo)] ,
...
Lembre-se que para chamar uma stored argumento [{IN | OUT| IN OUT}] tipo)]
procedure o seguinte comando deve ser RETURN tipo_de_retorno {IS |AS}
executado: corpo_da_funo
BEGIN
nome_procedure (args);
50
END;
Fixao Functions
Crie uma funo que receba como parmetro Exemplo de Function:
o raio e retorne a rea do crculo CREATE OR REPLACE FUNCTION salario
(v_empno in employees.employee_id%type)
RETURN number
IS
v_emp_sal employees.salary%type := 0;
BEGIN
SELECT salary INTO v_emp_sal
FROM employees
WHERE employee_id = v_empno;
RETURN (v_emp_sal);
END salario;
52
Record
uma estrutura de dados heterognea:
DECLARE
TYPE tipo_regEmpregado IS RECORD (
codigo NUMBER,
nome VARCHAR2(50));
reg_Empregado tipo_regEmpregado;
BEGIN
SELECT employee_id, first_name
INTO reg_Empregado.codigo, reg_Empregado.nome
UTILIZANDO TIPOS NO FROM employees
WHERE employee_id = 100;
PRIMITIVOS DBMS_OUTPUT.PUT_LINE (reg_Empregado.codigo);
DBMS_OUTPUT.PUT_LINE (reg_Empregado.nome);
END;
53 54
9
28/03/2016
Varrays
Record
O Record tambm pode ser declarado com Armazenam uma quantidade pr-
%ROWTYPE: determinada de elementos
CREATE OR REPLACE PROCEDURE process_employee Um exemplo simples:
IS
rec_employee employees%ROWTYPE;
DECLARE
BEGIN
TYPE ARRAY_T IS VARRAY(3) OF VARCHAR2(10);
SELECT *
ARRAY ARRAY_T := ARRAY_T('MATT', 'JOANNE', 'ROBERT');
INTO rec_employee
BEGIN
FROM employees
FOR i IN 1..ARRAY.COUNT LOOP
WHERE employee_id = 100;
DBMS_OUTPUT.PUT_LINE(ARRAY(i));
DBMS_OUTPUT.PUT_LINE (rec_employee.employee_id);
END LOOP;
DBMS_OUTPUT.PUT_LINE (rec_employee.last_name);
END;
DBMS_OUTPUT.PUT_LINE (rec_employee.salary);
END; 55 56
Nested Table
Cursor
Outro exemplo:
DECLARE J sabemos como declarar um cursor:
TYPE TYP_REC IS RECORD ( CURSOR c_Empregado IS
ID_NUMBER VARCHAR2(50), SELECT FIRST_NAME, SALARY
FROM EMPLOYEES
DESCRIPTION VARCHAR2(50)); WHERE MANAGER_ID = 100
TYPE TYP_NTAB IS TABLE OF TYP_REC;
NTAB TYP_NTAB := TYP_NTAB(); Agora veremos como manipul-los
So trs etapas: OPEN, FETCH e CLOSE
BEGIN Para inicializar o cursor utiliza-se a instruo OPEN, que
FOR I IN 1..10 LOOP identifica o conjunto de resultados
NTAB.EXTEND; Em seguida, executa-se o FETCH repetidamente at que
NTAB(I).ID_NUMBER:='ID NUMBER #'||I; todas as linhas tenham sido recuperadas (ou o BULK
NTAB(I).DESCRIPTION:='TEST CASE '||I; COLLECT para buscar todas as linhas de uma s vez)
DBMS_OUTPUT.PUT_LINE(NTAB(I).ID_NUMBER|| Quando a ltima linha tiver sido processada, deve-se
' '||NTAB(I).DESCRIPTION); liberar o cursor com a instruo CLOSE
59 60
END LOOP; END;
10
28/03/2016
61
Questes de Fixao
1. Criar uma procedure que dever receber o cdigo
de um empregado e a partir deste dado imprimir
o seu nome, e-mail e nome do departamento.
11
28/03/2016
Triggers Triggers
Trigger uma procedure executada (ou H dois tipos de triggers
disparada) automaticamente pelo banco de Triggers de linha: o cdigo do trigger pode ser
dados quando uma instruo DML executado uma vez para cada linha afetada
executada Este tipo de trigger tem acesso a valores novos e
antigos de uma coluna
So teis em vrias ocasies
Triggers de instruo: executada uma vez para
todas as linhas
Um trigger pode ser disparado antes ou
depois de uma instruo DML
Triggers Triggers
Detalhando:
Sintaxe da trigger BEFORE | AFTER: a trigger disparada antes/depois do
evento_trigger; INSTEAD OF: a trigger disparada no lugar do
CREATE [OR REPLACE] TRIGGER nome_trigger
evento_trigger; FOR: permite criar um trigger composto
{BEFORE | AFTER | INSTEAD OF | FOR} evento_trigger Evento_trigger: o evento que dispara a trigger
ON nome_tabela FOR EACH ROW: identifica um trigger de linha
[FOR EACH ROW]
[{ FORWARD | REVERSE} CROSSEDITION ]
FORWARD | REVERSE CROSSEDITION: identifica o momento
[{FOLLOWS | PRECEDES } esquema.outro_trigger] de executar a trigger durante ou depois uma atualizao de
[{ENABLE | DISABLE}] patch
[WHEN condiao_trigger] FOLLOWS | PRECEDES: especifica se a trigger vem depois ou
BEGIN antes de outra
corpo_trigger; ENABLE |DISABLE: identifica se a trigger inicialmente
END nome_trigger;
habilitada ou no
Condicao_trigger: condio booleana que identifica quando a
trigger executa seu cdigo
Triggers Triggers
DROP TRIGGER STORE.BEFORE_PRODUCT_PRICE_UPDATE;
Exemplo:
CREATE OR REPLACE TRIGGER STORE.before_product_price_update
BEFORE UPDATE OF price
ON STORE.PRODUCTS FOR EACH ROW
WHEN (
CREATE OR REPLACE TRIGGER AJUSTE_ADMINISTRADOR
new.price < old.price * 0.75
BEFORE UPDATE OF LOGIN ON TB_ADMINISTRADOR
)
BEGIN
BEGIN
RAISE_APPLICATION_ERROR (-20096, 'Nao e possivel alterar o nome
dbms_output.put_line('product_id = ' || :old.product_id);
de um usuario ja cadastrado');
dbms_output.put_line('Old price = ' || :old.price);
END;
dbms_output.put_line('New price = ' || :new.price);
dbms_output.put_line('The price reduction is more than 25%');
12
28/03/2016
Triggers Triggers
A trigger anterior disparada caso um Crie uma trigger que funcione como um log,
produto tenha uma diminuio em mais de armazenando os seguintes dados em uma
25% nova tabela chamada log:
Para cada insero, alterao e deleo de um
funcionrio: um ID, a data e hora atual, o valor
anterior, o tipo de ao (CUD)
13