BD2 - Linguagem procedural

Propaganda
Banco de Dados II
Prof: Márcio Soussa
Curso de Sistemas de Informação
Faculdades Jorge Amado
Referências Bibliográficas
Sistemas de Banco de Dados
Elmasri, Navathe
Introdução a Sistemas de Bancos de
Dados, C.J. Date, Ed. Campus.
Sistema de Banco de Dados, A
Silberschatz, H.F. Korth, Ed. Makron Books
Linguagem Procedural
Introdução
Objetivo
Reforça a arquitetura Cliente-Servidor
Características
Mescla os seguintes comandos:
Comandos de seleção (IF)
Comandos de iteração (While, Loop, For)
Comandos de BD (Select, Insert, Delete, Update)
Padrão inexistente
PL/SQL
Transact-SQL
Introdução ao
PL/SQL
Linguagem PL/SQL
Características:
PL/SQL é uma extensão da linguagem SQL.
Linguagem procedural de 4a. geração.
Combinação de manipulação e processamento de dados no
banco de dados Oracle.
Vantagens:
Alta performance de procedimentos armazenados no banco.
Integração com o dicionário de dados do Oracle.
Provê escalabilidade para as aplicações.
Portável para qualquer ambiente Oracle.
Suporte a programação orientada a Objetos.
Linguagem PL/SQL
Exemplo de um Bloco PL/SQL:
DECLARE
Emp_number INTEGER := 9999;
Emp_name VARCHAR2(10);
BEGIN
SELECT Ename INTO Emp_name FROM Emp_tab
WHERE Empno = Emp_number;
DBMS_OUTPUT.PUT_LINE('O Nome é ' ||
Emp_name);
END;
Tipos de Dados do PL/SQL
Tipos Escalares:
 Number
Binary_integer: -2147483647 a 2147483647
Number (precision,scale) - 38 precisão máxima
Decimal
Float
Integer

Character
Char(n) - 1 até 32767 bytes
Varchar2(n) - 1 até 32767 bytes



Boolean - true, false e null
Date - data (default: dia 01 do mês corrente) e hora (default:
12:00 a.m.)
Rowid - endereço binário de linha.
Declaração de
Variáveis e Constantes
DECLARE
var1
var2
var3
var4
var5
var6
DATE;
SMALLINT:=0;
REAL:=5;
NUMBER(2):=12;
DATE:=null;
CHAR DEFAULT '0';
var7 var2%TYPE;
var8 tabela_do_banco%ROWTYPE;
Declaração de
Variáveis e Constantes
Atributos:
%TYPE - atribui o tipo de uma variável ou coluna
do banco de dados.
l_dname scott.dept.dname%TYPE;
var7 var2%TYPE;
%ROWTYPE - atribui o tipo de um registro (linha)
de uma tabela do banco de dados.
emp_rec emp%ROWTYPE;
Comandos
SQL
BEGIN
SELECT mun.cdmunicipio, uf.sgestado,uf.dsestado
INTO municipio,uf,estado
FROM Municipio mun, Estado uf
WHERE mun.sgestado = uf.sgestado
ORDER BY uf.sgestado;
...
SELECT dsNivelAtiv INTO nivel FROM AtividadeNivel
ORDER BY cdNivelAtiv;
...
END;
Estruturas do
PL/SQL
Funções do PL/SQL
Categorias de Funções do PL/SQL:
Tipo Number
Tipo Char
Tipo Date
Conversão de Tipos
Controle de Erros
Tipo
Number
Função
Definição
MOD(m,n)
Retorna o resto da divisão de m por n.
LTRIM(a,b)
Remove a cadeia de caracteres que aparece à esquerda
Character
SUBSTR(c,m,n) Retorna um pedaço da cadeia de caracteres
TO_CHAR(d,f) Converte a data para o formato especificado
Conversion
TO_DATE(c,f) Converte o caracter para uma data no formato especificado
Date
ROUND(d,f)
Arredonda a data para o formato especificado
Funções do PL/SQL
Number
ABS
ACOS
ASIN
ATAN
ATAN2
CEIL
COS
COSH
EXP
FLOOR
LN
LOG
MOD
POWER
ROUND
SIGN
SIN
SINH
SQRT
TAN
TANH
TRUNC
Character
ASCII
CHR
CONCAT
INITCAP
INSTR
INSTRB
LENGTH
LENGTHB
LOWER
LPAD
LTRIM
NLS_INITCA
NLS_LOWE
NLSSORT
NLS_UPPER
REPLACE
RPAD
RTRIM
SOUNDEX
SUBSTR
SUBSTRB
TRANSLATE
TRIM
UPPER
Conversion
Date
CHARTOROWI ADD_MONTH
CONVERT
LAST_DAY
HEXTORAW
MONTHS_BET
RAWTOHEX
NEW_TIME
ROWIDTOCHA NEXT_DAY
TO_CHAR
ROUND
TO_DATE
SYSDATE
TO_MULTI_BY TRUNC
TO_NUMBER
TO_SINGLE_B
Estruturas de
Controle de Fluxo
Estruturas de Controle de Fluxo:
•
Condicional
IF-THEN
IF-THEN-ELSE
IF-THEN-ELSIF
•
Iterativo
LOOP
WHILE-LOOP
FOR-LOOP
•
Sequencial
GOTO sentença
NULL
Procedures,
Funções e
Triggers em
PL/SQL
Tipos de Programas
PL/SQL
Blocos Anônimos - direto no prompt do SQLPlus.
DECLARE
Emp_number INTEGER := 9999;
Emp_name VARCHAR2(10);
BEGIN
SELECT Ename INTO Emp_name FROM Emp_tab
WHERE Empno = Emp_number;
DBMS_OUTPUT.PUT_LINE('O Nome é ' || Emp_name);
END;
Tipos de Programas
PL/SQL
Procedures:
CREATE OR REPLACE PROCEDURE Get_emp_rec
(Emp_number IN Emp_tab.Empno%TYPE,
Emp_ret OUT Emp_tab%ROWTYPE) IS
BEGIN
SELECT Empno, Ename, Job, Mgr, Hiredate, Sal, Comm, Deptno
INTO Emp_ret
FROM Emp_tab WHERE Empno = Emp_number;
END;
Tipos de Programas
PL/SQL
Funções:
CREATE OR REPLACE FUNCTION upErro (pnuErro
CHAR)
RETURN VARCHAR2 AS
msg VARCHAR2(150);
BEGIN
SELECT nvl(dsmensagem,'Erro não cadastrado')
INTO msg FROM tratamentoerro WHERE nuerro=
pnuerro;
return msg;
END;
Tipos de Programas
PL/SQL
Cursor
É um dos recursos mais poderosos da linguagem procedural
Está vinculado a uma consulta de banco de dados
Permite a navegação entre os registros resultantes da consulta
no banco de dados
Corresponde a um ponteiro que aponta para um determinado
registro em um determinado momento
Comandos
DECLARE CURSOR: Vincula um cursor a uma consulta
OPEN: Abre o cursor
FETCH: Lê um registro do cursor e movimenta o ponteiro para o
próximo registro
CLOSE: Fecha o cursor
Tipos de Programas
PL/SQL
CURSOR c_empregado IS
Select nome, cpf funcionario where datademissao is not null;
stNome varchar2(30);
stCPF varchar2(11);
BEGIN
OPEN c_empregado;
LOOP
FETCH c_empregado INTO stNome, stCPF;
EXIT WHEN c_empregado%NOTFOUND;
INSERT INTO Arquivo_morto (arqu_nome, arqu_CPF) VALUES
(stnome, stcpf);
END LOOP;
CLOSE c_empregado;
END
Tipos de Chamdas de um Programa
PL/SQL
Chamada de Procedures:
- Dentro do código de outra procedure ou de
um trigger:
...
Calculo_IR(cd_emp,15);
...
- Dentro do ambiente SQLPlus e SQLTools:
...
EXECUTE Calculo_IR(cd_emp,15);
...
Tipos de Chamadas de um Programa
PL/SQL
Chamada de Funções:
- Dentro do código de outra procedure o função ou de um trigger.
- Dentro de um Comando SQL nas cláusulas:
SELECT
WHERE e HAVING
ORDER BY e GROUP BY
VALUES (do comando Insert)
SET
(do comando Update)
EXEMPLOS:
SELECT Calculo_IR(cd_emp,15)
INTO vl_calculo
FROM Emp_tab;
WHERE Calculo_IR(cd_emp,15) > 100;
Tipos de Programas
PL/SQL
É acionado automaticamente pelo SGBD (Ativa)
Relacionado a comandos de Update, Insert e Delete
Pode ser acionado antes ou depois do comando
Pode ser: Row-level ou Statement-level
Pode acionar um procedimento armazenado
Cuidado com loop de gatilhos
Geralmente utilizado para realizar alguma operação de
modificação no banco de dados ou garantir a integridade
do mesmo
Linguagem Procedural
Gatilho (trigger)
CREATE TRIGGER TR_Fornecedor_Estado BEFORE INSERT OR UPDATE
ON FORNECEDOR FOR EACH ROW
DECLARE Estado CHAR(02);
BEGIN
SELECT
est_cha_sigla INTO Estado
FROM cidade
JOIN
estado ON (cid_int_estado = est_int_ID)
WHERE Cid_int_ID = :New.For_Int_Cidade;
IF (Estado <> 'BA' AND Estado <> 'SE') THEN
RAISE_APPLICATION_ERROR(-20300, 'Não é permitido fornecedor
fora do eixo Bahia-Sergipe');
END IF;
END;
Tipos de Programas
PL/SQL
Triggers:
CREATE OR REPLACE TRIGGER tr_bir_CEP
BEFORE insert ON CEP
FOR EACH ROW
DECLARE
chValida EXCEPTION;
BEGIN
if (:NEW.stTipoCEP = 1 or :NEW.stTipoCEP = 3) then
RAISE chValida;
end if;
EXCEPTION
WHEN chValida THEN
RAISE_APPLICATION_ERROR(-20011,'Erro',False);
Download