Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
DE
BANCO DE DADOS
Se eu tivesse oito horas para derrubar
uma árvore, passaria seis afiando meu
machado (Abraham Lincoln).
2019
L A B O R A T O R I O D E B A N C O D E D A D O S
SUMÁRIO
2
L A B O R A T O R I O D E B A N C O D E D A D O S
3
L A B O R A T O R I O D E B A N C O D E D A D O S
4
L A B O R A T O R I O D E B A N C O D E D A D O S
5
L A B O R A T O R I O D E B A N C O D E D A D O S
6
L A B O R A T O R I O D E B A N C O D E D A D O S
INFORMAÇÕES IMPORTANTES
OBJETIVO
Implementar soluções de Banco de Dados por meio de tecnologias emergentes.
EMENTA
Tecnologias emergentes de mercado que serão aplicadas em laboratório com uso
de comandos da linguagem SQL e PL/SQL.
BIBLIOGRAFIA
• ALVES, William Pereira, Banco de Dados: Teoria e Desenvolvimento,
Érica, 2009.
• BJARKI, Hólm Et., Oracle 9i Java Programando: Soluções para
Desenvolvedores Que Trabalham com PL/SQL e Java AL, Alta Books,
2002.
• BRYLA, Bob, OCP Oracle Database 11g: Administração II, Porto Alegre:
Bookman, 2010.
• CHANG, Ben, Oracle XML: O manual oficial, Campus, 2001.
• ELMASRI, Ramez; Navathe, Shamkant B. , Sistemas de banco de dados,
Imprensa Oficial ,6 ed, 2011.
• PRICE, Jason, Oracle Database 11g Sql: Domine Sql e Pl/sql no Banco
de Dados Oracle, Bookman, 2009.
• RAMAKRISHNAN, Raghu, Sistemas de Gerenciamento de Banco de
Dados, Mc Graw Hill, 2008.
• Revista SQL MAGAZINE (http://www.sqlmagazine.com.br);
• Site: www.profissionaloracle.com.br;
• Estudo de Caso com script:
http://chinookdatabase.codeplex.com/releases/view/55169
SOFTWARES UTILIZADOS
• DBDesigner 4- software opensource;
• Oracle Data Modeler;
• BR Modelo – software freeware;
• Oracle 10G Express Edition1 (www.oracle.com.br2);
• Oracle 11G Express Edition (www.oracle.com.br3)
ABONO DE FALTAS
• Somente com atestado médico.
1 Software gratuito.
2 Necessário ter cadastro no site da Oracle, porém é gratuito.
3 Necessário ter cadastro no site da Oracle, porém é gratuito.
7
L A B O R A T O R I O D E B A N C O D E D A D O S
CONTATO
8
L A B O R A T O R I O D E B A N C O D E D A D O S
Será atribuída nota zero ao aluno que utilizar de meios ilícitos nos procedimentos
de avaliação do rendimento escolar.
Para aprovação, sendo todos os cursos presenciais, frequência mínima de 75%
(setenta e cinco por cento) no nosso caso, máximo 20 faltas por semestre, sendo
que falta do professor não acarreta falta ao aluno.
PERDA DE ATIVIDADE
ATENÇÃO!!!! CASO O ALUNO FALTE – INDEPENDENTE DE TER ATESTADO OU TER
ATESTADO – NÃO SERÁ ACEITO A TAREFA POIS O MESMO NÃO ASSISTIU A AULA.
ERROS DA APOSTILA
Caso seja encontrado erro na apostila, favor enviar por e-mail.
TRABALHO SEMESTRAL
Haverá dois trabalhos (um para cada bimestre), com valor de 5,0 pontos.
Dois cursos com emissão de certificado, cada um com data máxima para término
até 07/06/2019 (data da P2)
9
L A B O R A T O R I O D E B A N C O D E D A D O S
Figura 2 - Tela principal do software Linha de Comando SQL (feito pelo Autor)
10
L A B O R A T O R I O D E B A N C O D E D A D O S
Figura 3 – Tela principal do software Linha de Comando SQL – Propriedades (feito pelo Autor)
11
L A B O R A T O R I O D E B A N C O D E D A D O S
Figura 4 – Tela principal do software Linha de Comando SQL – Propriedades – Fonte (feito pelo Autor)
PROBLEMAS DE CONEXÃO
12
L A B O R A T O R I O D E B A N C O D E D A D O S
13
L A B O R A T O R I O D E B A N C O D E D A D O S
Figura 7 - Tela principal Oracle 11G Express Edition Gráfico (feito pelo Autor)
14
L A B O R A T O R I O D E B A N C O D E D A D O S
15
L A B O R A T O R I O D E B A N C O D E D A D O S
16
L A B O R A T O R I O D E B A N C O D E D A D O S
DEPARTMENTS (departamento)
NOME DA COLUNA TIPO E TAMANHO DESCRIÇÃO
DEPARTMENT_ID NUMBER (4) – PK Código do departamento
DEPARTMENT_NAME VARCHAR2(30) Nome do departamento
MANAGER_ID NUMBER (6) Código do gerente do
departamento
LOCATION_ID NUMBER (4) – FK Código da localização do
departamento
REGIONS (região)
NOME DA COLUNA TIPO E TAMANHO DESCRIÇÃO
REGION_ID NUMBER – PK Código da região
REGION_NAME VARCHAR2(25) Nome da região
JOBS (cargo)
NOME DA COLUNA TIPO E TAMANHO DESCRIÇÃO
JOB_ID VARCHAR2(10) – Código do cargo
PK
JOB_TITLE VARCHAR2(35) Nome do cargo
MIN_SALARY NUMBER (6) Menor salário do cargo
MAX_SALARY NUMBER (6) Maior salário do cargo
17
L A B O R A T O R I O D E B A N C O D E D A D O S
LOCATIONS (localização)
NOME DA COLUNA TIPO E TAMANHO DESCRIÇÃO
LOCATION_ID NUMBER (4) – PK Código da localização
STREET_ADDRESS VARCHAR2(40) Endereço da localização
POSTAL_CODE VARCHAR2(12) Código postal da localização
CITY VARCHAR2(30) Nome da cidade
STATE_PROVINCY VARCHAR2(25) Nome do estado
COUNTRY_ID CHAR (2) – FK Identificação do país
COUNTRIES (país)
NOME DA COLUNA TIPO E TAMANHO DESCRIÇÃO
COUNTRY_ID CHAR (2) – PK Identificação do país
COUNTRY_NAME VARCHAR2(40) Nome do país
REGION_ID NUMBER – FK Identificação da região
EMPLOYEES (empregado)
NOME DA COLUNA TIPO E TAMANHO DESCRIÇÃO
EMPLOYEE_ID NUMBER (6) – PK
Identificação do empregado
FIRST_NAME VARCHAR2(20)
Primeiro nome do empregado
LAST_NAME VRCHAR2(25)
Último nome do empregado
EMAIL VARCHAR2(25)
Email do empregado
PHONE_NUMBER VARCHAR2(20)
Telefone do empregado
HIRE_DATE DATE
Data de admissão do
empregado
JOB_ID VARCHAR2(10) Cargo do empregado
SALARY NUMBER (8,2) Salário do empregado
COMMISSION_PCT NUMBER (2,2) Percentual de comissão do
empregado
MANAGER_ID NUMBER (6) Identificação do gerente do
empregado
DEPARTMENT_ID NUMBER (4) - FK Identificação do departamento
JOB_HISTORY(histórico_cargos)
NOME DA COLUNA TIPO E TAMANHO DESCRIÇÃO
EMPLOYEE_ID NUMBER (6) – PK Identificação do empregado
START_DATE DATE Data início do empregado no
cargo
END_DATE DATE Data final do empregado no
cargo
JOB_ID VARCHAR2(10) – Identificação do cargo
FK
DEPARTMENT_ID NUMBER (4) – FK Identificação do departamento
18
L A B O R A T O R I O D E B A N C O D E D A D O S
19
L A B O R A T O R I O D E B A N C O D E D A D O S
OUTROS ESQUEMAS
USUÁRIO LOJA:
Quadro 2 - Tabelas do Esquema LOJA
CUSTOMERS (cliente)
NOME DA COLUNA TIPO E TAMANHO DESCRIÇÃO
CUSTOMER_ID INTEGER (PK)
Identificação do cliente
FIRST_NAME VARCHAR2(10)
Nome do Cliente
LAST_NAME VARCHAR2(10)
Sobrenome do cliente
DOB DATE Data de Nascimento do
cliente
PHONE VARCHAR2(12) Número do telefone do cliente
PRODUCT_TYPES (tipos de produtos)
NOME DA COLUNA TIPO E TAMANHO DESCRIÇÃO
PRODUCT_TYPE_ID INTEGER(PK) Identificação do tipo do
produto
NAME VARCHAR2(10) Nome do tipo do produto
PRODUCTS (produtos)
NOME DA COLUNA TIPO E TAMANHO DESCRIÇÃO
PRODUCT_ID INTEGER(PK)
Identificação do produto
PRODUCT_TYPE_ID INTEGER(FK)
Identificação do tipo do
produto
NAME VARCHAR2(30) Nome do produto
DESCRIPTION VARCHAR2(50) Descrição do produto
PRICE NUMBER(5,2) Valor do produto
PURCHASES(compras feitas por um cliente)
NOME DA COLUNA TIPO E TAMANHO DESCRIÇÃO
PRODUCT_ID INTEGER(PK) – Identificação do produto
FK
CUSTOMER_ID INTEGER(PK) – Identificação do cliente
FK
QUANTITY INTEGER Quantidade de produto
adquirida
EMPLOYEES (empregado)
NOME DA COLUNA TIPO E TAMANHO DESCRIÇÃO
EMPLOYEE_ID INTEGER – PK
Identificação do empregado
FIRST_NAME VARCHAR2(10)
Primeiro nome do empregado
LAST_NAME VRCHAR2(10)
Último nome do empregado
TITLE VARCHAR2(20)
Cargo do empregado
SALARY NUMBER(6,0)
Salário do empregado
MANAGER_ID INTEGERIdentificação do gerente do
empregado
SALARY_GRADES(níveis salariais)
NOME DA COLUNA TIPO DESCRIÇÃO
SALARY_GRADE_ID INTEGER (PK) Identificação da faixa salarial
LOW_SALARY NUMBER(6,0) Início da faixa salarial
HIGH_SALARY NUMBER(6,0) Fim da faixa salarial
20
L A B O R A T O R I O D E B A N C O D E D A D O S
USUÁRIO COMPLETO
Quadro 3 - Tabelas do Esquema COMPLETO
EMPRESA
NOME DA COLUNA TIPO E TAMANHO DESCRIÇÃO
EMP_CODIGO INTEGER(PK) Código da empresa
EMP_NOME VARCHAR2(30) Nome da empresa
EMP_ENDERECO VARCHAR2(100) Endereço da empresa
EMP_TELEFONE VARCHAR2(15) Telefone da empresa
FILIAL
NOME DA COLUNA TIPO E TAMANHO DESCRIÇÃO
EMP_CODIGO INTEGER (PK FK) Código da empresa
FILIAL_NRO INTEGER(PK) Código da filial
FILIAL_LOCAL VARCHAR2(30) Local da filial
FILIAL_DATA_ABERTURA DATE Data da abertura da filial
FUNCIONARIO
NOME DA COLUNA TIPO E TAMANHO DESCRIÇÃO
FUN_CODIGO INTEGER(PK) Código do funcionário
PRIMEIRO_NOME VARCHAR2(30) Nome do funcionário
SOBRENOME VARCHAR2(30) Sobrenome do funcionário
FUN_ENDERECO VARCHAR2(100) Endereço do funcionário
FUN_SEXO CHAR (1) Sexo do funcionário (f ou
m)
FUN_NIVER DATE Data do aniversário do
funcionário
FUN_SALARIO FLOAT Salário do funcionário
TIPO_FUNCIONARIO VARCHAR2(10) Função do funcionário
(secretario/motorista)
EMP_CODIGO INTEGER (FK) Código da empresa
COD_SUPERVISOR INTEGER Código do supervisor do
funcionário
MOTORISTA
NOME DA COLUNA TIPO E TAMANHO DESCRIÇÃO
FUN_CODIGO INTEGER(PK) Código do funcionário
NUM_CARTEIRA INTEGER Código da carteira de
motorista
CLASSE CHAR (1) Classe da carteira (B ou D)
SECRETARIO
NOME DA COLUNA TIPO E TAMANHO DESCRIÇÃO
FUN_CODIGO INTEGER(PK) Código do funcionário
NUM_CERTIFICACAO INTEGER Número do certificado
DATA_EXPEDICAO DATE Data da expedição do
certificado
CLIENTE
NOME DA COLUNA TIPO E TAMANHO DESCRIÇÃO
CLI_CODIGO INTEGER(PK) Código do cliente
CLI_NOME VARCHAR2(30) Nome do cliente
CLI_TELEFONE VARCHAR2(15) Telefone do cliente
21
L A B O R A T O R I O D E B A N C O D E D A D O S
22
L A B O R A T O R I O D E B A N C O D E D A D O S
INSTALAÇÃO
23
L A B O R A T O R I O D E B A N C O D E D A D O S
Nesta etapa poderá ser escolhida uma outra pasta de destino e clique em
Próximo:
24
L A B O R A T O R I O D E B A N C O D E D A D O S
25
L A B O R A T O R I O D E B A N C O D E D A D O S
26
L A B O R A T O R I O D E B A N C O D E D A D O S
27
L A B O R A T O R I O D E B A N C O D E D A D O S
Nesta aula fazendo uma revisão de banco de dados como tarefa avaliativa.
Estudo de Caso: Com base no modelo abaixo faça o que se pede a seguir:
28
L A B O R A T O R I O D E B A N C O D E D A D O S
SUBCONSULTA (SUBQUERIE)
OPERADOR OBSERVAÇÃO
=, <>, >, <, >=, Usado em subconsulta de uma linha.
<=
IN Teste se um valor pertence a um conjunto de
valores.
NOT IN Teste se um valor não pertence a um conjunto
de valores.
ANY Verifica se um determinado argumento casa
com qualquer membro de um conjunto.
ALL Verifica se um determinado argumento casa
com todos os membros de um conjunto.
EXISTS Usado em subconsulta correlatas, vê se um dado
valor existe em um conjunto, levando em conta
valores nulos. Este fato não é considerado pelo
operador in.
NOT EXISTS Nega o anterior.
UMA LINHA
SELECT last_name, salary
FROM employees
WHERE salary = (SELECT MAX (salary) FROM employees);
29
L A B O R A T O R I O D E B A N C O D E D A D O S
UPDATE employees
SET salary = 1.1 * salary
WHERE salary = (SELECT MIN (salary) FROM employees);
MÚLTIPLAS LINHAS
SELECT COM IN
Exemplo: Localize os funcionários que recebem o mesmo salário que o salário
mínimo dos departamentos.
SELECT last_name, salary, department_id
FROM employees
WHERE salary IN (SELECT MIN(salary)
FROM employees
GROUP BY department_id);
30
L A B O R A T O R I O D E B A N C O D E D A D O S
FROM employees
WHERE salary < ANY (SELECT salary
FROM employees
WHERE job_id = 'ST_CLERK')
AND job_id <> 'ST_CLERK';
COMPARAÇÕES DE COLUNA
As comparações de coluna em sub-consultas de várias colunas podem ser
emparelhadas ou não-emparelhadas.
COMPARAÇÃO EMPARELHADA
Exemplo: Exibir os detalhes dos funcionários que são gerenciados pelo
mesmo gerente e que trabalham no mesmo departamento que os funcionários
com employee_id 178 ou 174:
31
L A B O R A T O R I O D E B A N C O D E D A D O S
COMPARAÇÃO NÃO-EMPARELHADA
Exemplo: Exibir os detalhes dos funcionários que são gerenciados pelo
mesmo gerente e que trabalham no mesmo departamento que os funcionários
com employee_id 141 ou 174:
SELECT employee_id, manager_id, department_id FROM employees
WHERE (manager_id IN (SELECT manager_id
FROM employees
WHERE employee_id IN (174, 141))
AND (department_id IN (SELECT department_id
FROM employees
WHERE employee_id IN (174,141));
AND employee_id NOT IN (174,141);
SUBCONSULTA ESCALAR
32
L A B O R A T O R I O D E B A N C O D E D A D O S
SUBCONSULTA CORRELACIONADA
EXISTS
NOT EXISTS
Testa a existência de linhas no conjunto de resultados da sub-consulta. Este
operador garante que a consulta interna seja interrompida quando encontra no
mínimo uma ocorrência.
33
L A B O R A T O R I O D E B A N C O D E D A D O S
Solução Alternativa:
SELECT department_id, department_name
FROM departments
WHERE department_id NOT IN (SELECT department_id FROM employees);
UPDATE CORRELACIONADA
Podemos utilizar subconsulta correlacionada para atualizar as linhas de uma
tabela com base nas linhas de outra tabela. Exemplo: Altere o padrão da tabela
EMPLOYEES adicionando uma coluna para armazenar o nome do departamento e
preenche a tabela usando uma atualização correlacionada:
ALTER TABLE employee
ADD (department_name VARCHAR2(14));
UPDATE employees e
SET department_name = (SELECT department_name
FROM departaments d
WHERE e.department_id = d.department_id);
DELETE CORRELACIONADA
34
L A B O R A T O R I O D E B A N C O D E D A D O S
EXERCÍCIOS PRÁTICOS
1. Crie uma consulta para exibir o sobrenome e a data de admissão de todos os
funcionários no mesmo departamento do funcionário com sobrenome Zlotkey.
Exclua Zlotkey.
2. Cria uma consulta para exibir o número e o nome de todos os funcionários que
recebam mais que o salário médio. Classifique os resultados, por salário, em
ordem decrescente.
3. Crie uma consulta que exiba o número e o sobrenome de todos os funcionários
que trabalhem em um departamento com qualquer funcionário cujo sobrenome
contenha uma letra u.
4. Exiba o sobrenome do funcionário, o número do departamento e o cargo de
todos os funcionários cuja localização do departamento seja 1700.
5. Exiba o sobrenome e o salário dos funcionários que se reportem a King.
6. Exiba o número do departamento, o sobrenome e o cargo de todos os
funcionários do departamento de Executive (executivo).
7. Exibir o número, o sobrenome e o salário de todos os funcionários que recebam
mais que o salário médio e trabalhem em um departamento com qualquer
funcionário cujo nome contenha um u.
8. Localize todos os funcionários que não são supervisores.
9. Crie uma consulta para exibir o sobrenome, o numero do departamento e o
salário de qualquer funcionário cujo salário coincidam com o numero de
departamento e salário de qualquer funcionário que receba comissão.
10. Crie uma consulta para exibir o sobrenome, a data de admissão e o salário de
todos os funcionários que tenham o mesmo salário e a mesma comissão do
funcionário com sobrenome Kochhar. Obs. Não exibir Kochhar no conjunto de
resultados.
11. Crie uma consulta para exibir os funcionários que recebem um salário mais alto
do que o salário dos gerentes de vendas JOB_ID = ‘SA_MAN’. Classifique os
resultados dos salários do maior para o menor.
12. Exibir os detalhes do ID dos funcionários, o sobrenome e o ID do departamento
dos funcionários que vivem em cidades que começam com a letra T.
13. Descubra todos os funcionários que não são supervisores:
a) Utilizar o operador NOT EXISTS;
b) Pode ser feito com o operador NOT IN? Como ou por que não?
14. Crie uma consulta para exibir os sobrenomes dos funcionários que recebam
menos que o salário médio nos respectivos departamentos.
15. Crie uma consulta para exibir os sobrenomes dos funcionários que tem um ou
mais colegas de trabalho nos respectivos departamentos com datas de
admissão posteriores, mas com salários mais altos.
35
L A B O R A T O R I O D E B A N C O D E D A D O S
RECUPERAÇÃO HIERÁRQUICA
King
employee_id =
100 (PAI)
De Hann Zlotkey Hartstein
Kochhar
manager_id=10 Mourgos manager_id=10 manager_id=10
manager_id=10 0 0 0
0 manager_id=10
(FILHO) 0 (FILHO) (FILHO)
(FILHO)
(FILHO)
Whalen Higgins Hunold
Rajs Davies Matos Vargas Abel Taylor Grant Fay
Ernst
Lorentz
Sintaxe:
SELECT [LEVEL] coluna
FROM tabela
WHERE condição
[START WITH condição]
[CONNECT BY PRIOR condição];
Onde:
• LEVEL: retorna 1 para uma linha-raiz e 2 para um filho de uma raiz e
assim por diante.
• START WITH: especifica as linhas-raiz da hierarquia (onde começar). É
obrigatória para uma consulta hierárquica verdadeira.
• CONNECT BY PRIOR: especifica as colunas nas quais existe o
relacionamento entre linhas mãe e linhas filhas. Obrigatória.
36
L A B O R A T O R I O D E B A N C O D E D A D O S
37
L A B O R A T O R I O D E B A N C O D E D A D O S
MERGE
O SQL foi estendido de modo a incluir a instrução MERGE. Quando usar essa
instrução, podemos atualizar ou inserir uma linha condicionalmente em uma
tabela, evitando várias instruções UPDATE. A decisão referente à atualização ou
inserção da tabela de destino se baseia em uma condição na cláusula ON. Este
comando combina o INSERT e o UPDATE, por isto, precisamos possuir estes dois
privilégios. Com este comando não é possível atualizar a mesma linha da tabela
de destino várias vezes na mesma instrução. Sintaxe:
MERGE INTO tabela apelido_tabela
USING (tabela|view|subconsulta) apelido
ON (condição_junção)
WHEN MATCHED THEN
UPDATE SET coluna1 = valor1, coluna2 = valor2
WHEN NOT MATCHED THEN
INSERT (coluna1, coluna2)
VALUES (valor1, valor2);
TRANSAÇÃO → SAVEPOINT
Já vimos que os comandos DML (INSERT, UPDATE, DELETE e MERGE)
precisam de confirmação de transação (COMMIT) ou cancelamento da mesma
(ROLLBACK). O comando SAVEPOINT marca um ponto de salvamento na transação
atual. Podemos ainda utilizar o comando ROLLBACK TO SAVEPOINT para efetuar
o cancelamento da transação atual até o ponto de salvamento especificado,
descartando, portanto, todas as alterações e/ou pontos de salvamento criados
depois do ponto de salvamento especificado para o rollback. Se for omitida a
cláusula TO SAVEPOINT, a instrução ROLLBACK será efetuado o rollback da
38
L A B O R A T O R I O D E B A N C O D E D A D O S
transação inteira. Como estes pontos de salvamento são lógicos, não há como
listá-los. Passos:
• Faça um comando DML;
• Crie um marcador em uma transação atual usando a instrução SAVEPOINT;
• Faça o cancelamento deste marcador usando a instrução ROLLBACK TO
SAVEPOINT.
INSERT MULTITABELAS
Podemos inserir linhas calculadas derivadas das linhas retornadas da
avaliação de uma subconsulta em uma ou mais tabelas. Pode desempenhar uma
função muito útil em um cenário de data warehouse.
Tipos de Instruções:
INSERT incondicional;
ALL INSERT condicional;
FIRST INSERT condicional;
INSERT de criação de pivôs.
Sintaxe:
INSERT [ALL] [condição da cláusula INSERT]
[ valores da cláusula do INSERT] (subconsulta)
39
L A B O R A T O R I O D E B A N C O D E D A D O S
40
L A B O R A T O R I O D E B A N C O D E D A D O S
INSERT FIRST
WHEN sal > 25000 THEN
INTO special_sal VALUES (deptid, sal)
WHEN hiredate LIKE '%00%' THEN
INTO hiredate_history_00 VALUES (deptid, hiredate)
WHEN hiredate LIKE '%99%' THEN
INTO hiredate_history_99 VALUES (deptid, hiredate)
ELSE
INTO hiredate_history VALUES (deptid, hiredate)
SELECT department_id deptid, sum(salary) sal, max(hire_date) hiredate
FROM employees
GROUP BY department_id;
41
L A B O R A T O R I O D E B A N C O D E D A D O S
INSERT ALL
INTO Sales_info VALUES (employee_id, week_id, Sales_MON)
INTO Sales_info VALUES (employee_id, week_id, Sales_TUE)
INTO Sales_info VALUES (employee_id, week_id, Sales_WED)
INTO Sales_info VALUES (employee_id, week_id, Sales_THUR)
INTO Sales_info VALUES (employee_id, week_id, Sales_FRI)
SELECT employee_id, week_id, sales_mon,
sales_tue, sales_wed, sales_thur, sales_fri
FROM sales_source_data;
42
L A B O R A T O R I O D E B A N C O D E D A D O S
SEQUÊNCIAS
Exemplo:
CREATE SEQUENCE SEQ_ALUNO
INCREMENT BY 1
START WITH 20040001
MAXVALUE 20049999
NOCYRCLE;
43
L A B O R A T O R I O D E B A N C O D E D A D O S
OBSERVAÇÕES:
Se for executado um ROLLBACK, o número da sequência não voltará;
Duas pseudo-colunas são utilizadas nas sequências:
• NEXTVAL, que retorna o próximo número da sequência;
• CURRVAL, valor corrente da sequência.
SINÔNIMOS
CRIANDO SINÔNIMOS
Sintaxe: CREATE [PUBLIC] SYNONYM sinônimo FOR objeto
Em que:
PUBLIC → específica que o sinônimo poderá ser usado por todos. O default
é que somente o criador possa utilizá-lo. Para criar este sinônimo devemos estar
conectados como usuário SYSTEM.
Exemplo: CREATE PUBLIC SYNONYM teste FOR all_sales;
OBJETO→ informa o nome do objeto sobre o qual se aplica o sinônimo. Pode
ser tabela, índice, view ou sequence.
Exemplo: CREATE PUBLIC SYNONYM cursos_dba FOR cursos;
Supondo que o usuário corrente se chamada TESTE1 e houvesse outro
usuário denominado PEDRO, este poderia fazer referência à tabela cursos TESTE1:
SELECT * FROM cursos_dba;
Em vez de:
SELECT * FROM teste1.cursos_dba.
44
L A B O R A T O R I O D E B A N C O D E D A D O S
ELIMINANDO SINÔNIMOS
DROP PUBLIC SYNONYM nome_sinônimo;
Exemplo: DROP PUBLIC SYNONYM cursos_dba;
INDICES
45
L A B O R A T O R I O D E B A N C O D E D A D O S
Possuir mais índices em uma tabela não significa que as consultas serão
aceleradas. Cada operação DML que seja submetida a COMMIT em uma tabela
com índices significa que os índices devem ser atualizados. Quanto mais índices
associados a uma tabela você tiver, maior será o esforço realizado pelo Oracle
Server para atualizar todos os índices após uma instrução DML.
Também podemos criar um índice composto em várias colunas, por
exemplo, um índice contendo o nome e o sobrenome do empregado:
4Área utilizada pelo bando de dados para armazenar objetos (tabelas). Por motivos de
desempenho armazenamos um índice em uma tablespace diferente da tablespace das tabelas.
46
L A B O R A T O R I O D E B A N C O D E D A D O S
• Quando duas ou mais colunas forem usadas juntas com frequência em uma
cláusula WHERE ou em uma condição de junção.
• Quando a tabela for grande e se esperar que a maioria das consultas recupere
menos que 2 a 4% das linhas.
REMOÇÃO DE UM ÍNDICE
Não podemos modificar índices. Para alterar um índice, você deve eliminá-lo
e, em seguida, recriá-lo. Remova uma definição de índice do dicionário de dados
emitindo a instrução DROP INDEX. Para eliminar um índice, você precisa ser o
proprietário do índice ou possuir o privilégio DROP ANY INDEX. Sintaxe:
DROP INDEX nome_indice;
ALTERAR UM ÍNDICE
47
L A B O R A T O R I O D E B A N C O D E D A D O S
VIEWS
Também conhecido como visão, é uma tabela virtual na qual os dados não
estão fisicamente armazenados. Ela é apenas uma visão de um grupo de colunas
de uma ou mais tabelas do banco de dados. Utilizamos visões para:
• Restringir o acesso a dados;
• Facilitar as consultas complexas;
• Permitir a independência dos dados;
• Apresentar diferentes visualizações dos mesmos dados.
Pode ser:
• SIMPLES: somente uma tabela, não contém funções e nem grupos e faz
operação DML.
• COMPLEXA: uma ou mais tabelas, contém funções, grupos de dados e
nem sempre faz uma operação DML.
Sintaxe:
CREATE [OR REPLACE] [FORCE | NOFORCE] VIEW nome_da_view
[apelido1, apelido2, …]
AS subconsulta
[WITH CHECK OPTION [CONSTRAINT restrição] ]
[WITH READ ONLY [CONSTRAINT restrição]];
Onde:
REPLACE Recria a view, se ela já existir.
FORCE Cria a view, mesmo que a tabela não exista.
NOFORCE Só cria a view se a tabela existir. (padrão)
CONSULTA Comando SELECT. Não se usa o ORDER BY.
WITH CHECK Somente linhas acessíveis pela view (cláusula
OPTION where na sua definição), podemos inserir e alterá-
las.
WITH READ ONLY Indica que não podem ser executados comandos
DML sobre a views.
Exemplo:
CREATE OR REPLACE VIEW aluno_curso
AS
SELECT a.cdmatricula, a.nmaluno, c.nmcurso
FROM aluno a, curso c
WHERE a.cdcurso = c.cdcurso;
48
L A B O R A T O R I O D E B A N C O D E D A D O S
VIEW COMPLEXA
Exemplo:
SELECT a.nmfuncionario, a.vlsalario, a.nmfuncao, b.maior
FROM funcionario a,
(SELECT nmfuncao, max(vlsalario) maior
FROM funcionario
GROUP BY nmfuncao) b
WHERE a.nmfuncao = b.nmfuncao
AND a.vlsalario < b.maior;
OPERAÇÕES DML
Podemos executar operações DML nos dados através de uma view se essas
operações não tiverem uma destas exceções:
• Funções de grupo;
• GROUP BY;
• DISTINCT;
• ROWNUM;
• Colunas definidas por expressões (exemplo: salário * 1.10);
• Colunas NOT NULL nas tabelas-base que não sejam selecionadas pela
view.
•
WITH CHECK OPTION
49
L A B O R A T O R I O D E B A N C O D E D A D O S
Esta cláusula assegura que nenhum comando DML através da view. Qualquer
tentativa com relação a um comando DML ocasionará um erro. Exemplo:
CREATE OR REPLACE VIEW empvu10 (id, nome, cargo)
AS
SELECT employee_id, last_name, job_id
FROM employees
WHERE department_id = 10
WITH READ ONLY;
ANÁLISE TOP-N
VIEW MATERIALIZADA
50
L A B O R A T O R I O D E B A N C O D E D A D O S
Exemplo:
CREATE MATERIALIZED VIEW vm_employees
REFRESH FAST
START WITH SYSDATE + 1
NEXT SYSDATE + 1/24
WIDTH PRIMARY KEY
AS
SELECT employee_id, last_name, job_id, salary
FROM employees;
51
L A B O R A T O R I O D E B A N C O D E D A D O S
EXERCÍCIOS PRÁTICOS
1. Crie uma visão EMP_VU com base no número, nome dos funcionários e
número dos departamentos da tabela EMPLOYEES. Altere o cabeçalho do
funcionário para EMPREGADO.
2. Exiba o conteúdo da visão EMP_VU.
3. Usando a visão EMP_VU, informe uma coluna para exibir os nomes de todos
os funcionários e números dos departamentos.
4. Crie uma visão chamada DEPT50 que contenha o número e o nome do
funcionário e o número do departamento dos funcionários do departamento
50. Coloque um label (OU APELIDO) nas colunas da visão. Não permita que
um funcionário seja atribuído a outro departamento através da visão.
5. Crie uma visão chamada SALARIO_VU com base no nome, salário do
funcionário, nome do departamento e classe de salário de todos os
funcionários.
6. Criar uma tabela chamada ESTOQUE tenha uma coluna chamada ID do tipo
inteiro com chave primária.
7. Crie uma sequência para ser usada como a coluna de chave primária da tabela
ESTOQUE. A sequência deve iniciar em 200 e ter um valor máximo de 1000.
O incremento da sequência deve ser de dez números. Nomeie a sequência
como ESTOQUE_ID_SEQ.
8. Crie um script para exibir as seguintes informações sobre as sequências:
nome, valor máximo, tamanho do incremento e o último número utilizado.
9. Crie um sinônimo para cada uma das tabelas: EMPLOYEES e DEPARTMENTS.
52
L A B O R A T O R I O D E B A N C O D E D A D O S
OBJETO-RELACIONAL
TIPO OBJETO
HERANÇA
A partir do Oracle 9i, um tipo pode ser estendido criado subtipos que
reutilizam a especificação e implementação (atributos e métodos) do tipo que ele
deriva. Assim, através dos objetos podemos criar uma hierarquia de tipos.
53
L A B O R A T O R I O D E B A N C O D E D A D O S
Por padrão, o tipo de objeto é FINAL. Por isso, para permitir subtipos, deve
ser obrigatoriamente adicionada à expressão NOT FINAL à declaração do tipo do
objeto. Exemplo: CREATE TYPE t_pessoa AS OBJECT
(codigo_pessoa NUMBER(5),
nome VARCHAR2(50),
endereco VARCHAR2(50)) NOT FINAL;
/
São tabelas com colunas cujo tipo de dado de domínio é outra tabela. Isto é,
as tabelas podem ser aninhadas dentro de outras tabelas como valores na coluna.
Permite que os relacionamentos N:N possam ser representados por tabelas
aninhadas.
Este tipo de dados contém elementos desordenados, todos do mesmo tipo, e
sem limite de elementos. Quando uma coluna de uma tabela é do tipo nested
table, seus dados são armazenados no mesmo lugar desta tabela, ou seja, os
dados são armazenamentos fisicamente na mesma área de disco. Assim a
substituição de um join por uma tabela aninhada, garante um desempenho
superior. Exemplo:
CREATE OR REPLACE TYPE t_end AS OBJECT
(rua VARCHAR2(60),
numero INTEGER,
bairro VARCHAR2(60),
cidade VARCHAR2(60),
uf CHAR(2),
cep CHAR(9));
54
L A B O R A T O R I O D E B A N C O D E D A D O S
Obs. A partir da versão 9i é possível que uma tabela aninhada tenha outra
tabela aninhada.
-0p=Ao criarmos object tables de object types que contenham como atributo
uma ou mais nested tables devemos especificar para o Oracle o nome de uma
tabela chamada store table, que é usada para guardar a tabela aninhada
Por padrão, os tipos de objeto são FINAL. Por isso, para permitir subtipos,
deve ser obrigatoriamente adicionada à expressão NOT FINAL à declaração do tipo
do objeto. Exemplo:
CREATE TYPE t_livro AS OBJECT
(numero NUMBER(4),
titulo VARCHAR2(40));
55
L A B O R A T O R I O D E B A N C O D E D A D O S
OPERADOR VALUE
56
L A B O R A T O R I O D E B A N C O D E D A D O S
TIPOS REFERÊNCIA
O relacionamento entre duas entidades pode ser modelado nativamente
através de ponteiros que referenciam as entidades relacionadas. Expressamos tais
relacionamentos utilizando o identificador do objeto (OID 5 ) associado a cada
instância de um tipo de dado estruturado. Esse identificador é atribuído
automaticamente a objetos, permitindo que o objeto correspondente seja
referenciado a partir de outros objetos. Isto é feito através do tipo REF 6, que
encapsula uma referência para um objeto especificado. Ou seja, ao declaramos
um tipo, podemos declarar como seu atributo um ponteiro para outro tipo através
da expressão REF. Exemplo:
CREATE OR REPLACE TRIGGER departamento_d
AFTER DELETE ON departamentos
FOR EACH ROW
DECLARE
D_ref REF t_departamento;
BEGIN
SELECT REF(d) INTO d_ref FROM departamentos d
WHERE d.num_depto = :old.num_depto;
UPDATE funcionaros f SET f.depto = null
WHERE f.depto = d_ref;
END;
Exemplo: CREATE TYPE t_departamento AS OBJECT
(num_depto NUMBER,
nome VARCHAR2(30),
endereço t_endereco);
EXERCÍCIO PRÁTICO
1. Fazer a implementação objeto-relacional em Oracle que demonstre a hierarquia de
tipos (herança). Primeiramente, deve-se criar um tipo chamado VEICULO e também os
tipos Moto, Carro, Caminhão, Ônibus que herdam de VEÍCULO. O tipo VEICULO deve
possuir Placa, Descrição e Ano_Fabricação. O tipo Carro deve possuir Moto e Portas. O
tipo Moto deve possuir o atributo Cilindradas. O tipo Caminhão deve possuir o atributo
Comprimento. O tipo Ônibus deve possuir Número de Lugares e Andar. Definir as
tabelas dos tipos criados e fazer a inserção de dados nessas tabelas.
do OBJECT TABLES usando navegação por ponto (dot navigation) também conhecida como
expressão de caminho. É um operador que retorna o ponteiro para um objeto, dado um sinônimo
de tabela.
57
L A B O R A T O R I O D E B A N C O D E D A D O S
ARQUITETURA ORACLE
Toda instância possui sua própria SGA. Quando uma instância é iniciada
o servidor aloca memória para SGA que será liberado quando a instância
for desativada.
A região da memória é compartilhada. O espaço de memória não pode
ter swapped e nem pode ser paginado. Tem a finalidade armazenar
memória dados para acesso rápido, a memória deve estar na memória
principal e se estiver no disco não terá acesso rápido.
A SGA consiste num grupo de estrutura de memória e o seu espaço é
alocado na inicialização da instância. Temos: POOL COMPARTILHADO,
CACHE DE BUFFER DE BANCO DE DADOS, BUFFER DE REDO LOG, também
tem o POOL GRANDE e o POOL JAVA.
Podemos exibir as alocações de memória utilizando o comando SHOW
SGA.
58
L A B O R A T O R I O D E B A N C O D E D A D O S
60
L A B O R A T O R I O D E B A N C O D E D A D O S
• REDO LOG: todo banco de dados Oracle tem no mínimo dois grupos
de redo log e cada um com pelo menos um arquivo de redo log. Estes
arquivos registram todas as alterações feitas nos dados e permite a
recuperação dos dados num caso de falha de instância. Para proteger
estes arquivos das falhas dos arquivos, o Oracle suporta arquivos
multiplexados, que significa que podemos ter duas ou mais cópias de
redo log em diferentes discos. As cópias mantidas em arquivos
diferentes são chamadas ARQUIVOS DE LOG ESPELHADOS, cada
membro de um grupo de arquivos de log tem um arquivo de log do
mesmo tamanho.
62
L A B O R A T O R I O D E B A N C O D E D A D O S
63
L A B O R A T O R I O D E B A N C O D E D A D O S
64
L A B O R A T O R I O D E B A N C O D E D A D O S
EXIBIR INFORMAÇÕES
Temos as seguintes tablespaces já definidas no banco de dados:
• SYSTEM: usada pelo servidor para gerenciar o banco de dados. Contém
o dicionário de dados e tabelas com informações administrativas usadas
pelo DBA;
• SYSAUX: auxilia a SYSTEM. Obrigatória a partir da versão 10G;
• TEMP: armazena índices e tabelas temporárias usadas no processamento
das instruções SQL, como por exemplo, ordenação dos dados;
• UNDOTBS1: armazena informações de undo;
• USERS: armazena dados e objetos criados pelos usuários;
• EXAMPLE: contém exemplos de esquemas que podem ser instalados no
momento da criação do banco de dados.
EXERCÍCIOS
65
L A B O R A T O R I O D E B A N C O D E D A D O S
DICIONÁRIO DE DADOS
• ALL_xxxx: exibe objetos que o usuário tem acesso além dos objetos do
próprio usuário.
• DBA_xxxx: para usuários que tem o acesso de DBA, exibe objetos
pertencentes à base de dados e objetos que o usuário não DBA tem
acesso.
66
L A B O R A T O R I O D E B A N C O D E D A D O S
67
L A B O R A T O R I O D E B A N C O D E D A D O S
68
L A B O R A T O R I O D E B A N C O D E D A D O S
69
L A B O R A T O R I O D E B A N C O D E D A D O S
USUÁRIOS E PRIVILÉGIOS
A razão de ser de um banco de dados e seu DBA são os usuários. Tudo o que
o DBA faz, em última análise, tem por objetivo atender às necessidades do usuário.
O DBA deve conhecer os seguintes detalhes:
• O que o usuário quer?
• O que o usuário precisa?
• Exibe outro usuário que queira ou necessite do mesmo?
• Qual seria o nível mínimo de segurança aceitável?
• E o máximo?
• Exigem regras na empresa que restrinjam a utilização do banco pelo usuário?
CONCEITO EXPLICAÇÃO
USUARIO Individuo que se conecta ao banco de dados e utiliza
objetos nele. Também pode criar objetos e permitir que
outros usuários manipulem.
SCHEMA Conjuntos de objetos (tabelas, índices, visões, etc) de
um usuário. Pode ser listado com o comando:
SELECT * FROM cat;
PRIVILÉGIO Direito que um usuário recebe para fazer algo. Existem
duas categorias:
- sistema: realiza conexão até eliminar qualquer tabela
- objeto: desde ler até eliminar
PAPEL (role) Conjunto de privilégios agrupados e com um nome.
Facilita bastante a gerência de privilégios.
CRIANDO USUARIOS
Sintaxe: CREATE USER nome
IDENTIFIED BY senha
DEFAULT TABLESPACE users
QUOTA UNLIMITED7 ON users;
70
L A B O R A T O R I O D E B A N C O D E D A D O S
EXCLUINDO UM USUÁRIO
DROP USER nome CASCADE;
PRIVILÉGIOS DE SISTEMA
Ao criar um usuário ele não tem direito de se conectar. Para que possa ser
considerado um usuário, ele deve receber alguns privilégios de sistema: CREATE
SESSION; CREATE TABLE; CREATE SEQUENCE; CREATE VIEW; CREATE USER e
DROP USER.
71
L A B O R A T O R I O D E B A N C O D E D A D O S
PRIVILÉGIOS DE OBJETO
Privilégios de objeto servem, basicamente para que outros usuários que não
o dono, ou aqueles que tenham privilégios de sistema do tipo ANY possam ler,
alterar ou até mesmo apagar linhas de tabelas.
Privilégio Tabela View Sequence Procedure
ALTER X X
DELETE X X
EXECUTE X
INDEX X
INSERT X X
REFERENCES X
SELECT X X X
UPDATE X X
ALL X X X X
ROLES
É um grupo de privilégios (sistema ou objeto), reunidos sob um único nome,
que pode ser concedido a um ou mais usuários.
72
L A B O R A T O R I O D E B A N C O D E D A D O S
PRÁTICA DE LABORATÓRIO
1) Crie dois usuários cada um com o seu primeiro nome e a senha sendo as suas
iniciais. Solicitar a troca de senha na primeira conexão e com quota na
tablespace USERS de 10Mb.
2) Crie uma role com o nome de GRUPO e acrescente estes dois usuários.
- Criar a tabela CLIENTE, com codigo como chave primária, número com 5
dígitos, nome do cliente como string de 30 caracteres, telefone com string de
20 caracteres.
- Criar a tabela VEICULO, com placa como chave primaria e string com 10
caracteres, marca do veículo como string de 20 caracteres de preenchimento
obrigatório. Relacionar a tabela CLIENTE com a tabela VEICULO através da
coluna codigo.
11) Conectar com o sendo usuário e criar a tabela TESTE com a coluna numero
do tipo INTEGER. O QUE ACONTECEU? POR QUE?
73
L A B O R A T O R I O D E B A N C O D E D A D O S
CONCEITOS GERAIS
VANTAGENS:
• Capacidade de organizar comandos SQL em blocos;
• Diminuir o número de comunicações entre cliente e servidor;
• Produtividade;
• Interação com o gerenciador de banco;
• Portabilidade;
• Capacidade procedural (estruturas de controle);
• Tipos de objeto e métodos (a partir da versão 8).
9Linguagem de quarta geração que descreve o que deve ser feito, mas não como fazê-lo
(detalhes de como o comando é processado fica oculto).
74
L A B O R A T O R I O D E B A N C O D E D A D O S
ESTRUTURA DO PL/SQL
DECLARE
- Seção opcional, em que
todos os objetos são
declarados.
BEGIN
- Em que os comandos
PL/SQL são colocados. Pode
conter outros blocos.
EXCEPTION
- Seção opcional, onde os
erros são tratados. (pode
conter outros blocos)
END
- Finaliza o bloco
DECLARAÇÃO
75
L A B O R A T O R I O D E B A N C O D E D A D O S
Só para lembrar que cada variável ou constante deve ser especificada com
seu nome, tipo e, opcionalmente, valor inicial. Todas as linhas devem terminar
com ponto-e-vírgula. Exemplo:
DECLARE
nome VARCHAR2(20);
numero NUMBER(5,2) := 100;
casado BOOLEAN NOT NULL := TRUE;
data_adm DATE := SYSDATE + 30 ;
contador BINARY_INTEGER := 0;
IDENTIFICADORES
76
L A B O R A T O R I O D E B A N C O D E D A D O S
77
L A B O R A T O R I O D E B A N C O D E D A D O S
ATRIBUTO %TYPE
78
L A B O R A T O R I O D E B A N C O D E D A D O S
DBMS_OUTPUT.PUT_LINE
COMENTÁRIOS
OPERADORES EM PL/SQL
79
L A B O R A T O R I O D E B A N C O D E D A D O S
OPERADOR DESCRIÇÃO
**, ^, NOT Exponenciação
NOT Negação
:= Atribuição
+,-,*,/ Adição, subtração, multiplicação e divisão
|| Concatenação
=, !=,<,>,>=,<=, IS NULL, Comparação
LIKE, BETWEEN, IN
AND Conjunção
OR Inclusão
@ Acesso remoto
; Finalizar instrução
/ Executar bloco
80
L A B O R A T O R I O D E B A N C O D E D A D O S
A maior parte das funções SQL, estão disponíveis no PL/SQL, com exceção
das seguintes:
• DECODE;
• Funções de grupo: MIN, AVG, MAX, COUNT e SUM. Estas funções de
aplicam a grupos de linhas em uma tabela e por isso estão disponíveis
apenas em instruções SQL em bloco PL/SQL. Exemplo: v_total :=
SUM(numero_tabela);
Obs.: Também podemos utilizar o TO_CHAR, TO_DATE e TO_NUMBER para
converter tipos de dados.
...
X BINARY_INTEGER;
BEGIN Escopo
...
DECLARE Escopo
Y NUMBER;
BEGIN
...
END;
...
END;
81
L A B O R A T O R I O D E B A N C O D E D A D O S
EXERCÍCIOS PRÁTICOS
1. Criar um bloco anônimo que entre com dois valores e exiba a somatória entre
eles;
3. Criar um bloco anônimo que entre com o nome, o cargo e o salário e exiba o valor
a ser descontado de vale transporte (6%);
4. Criar um bloco anônimo que entre com três notas e exiba a média aritmética das
mesmas;
5. Criar um bloco anônimo que entre com o nome de uma mercadoria, o valor desta
mercadoria e o percentual de aumento. Exibir o novo valor desta mercadoria.
6. Elabore um bloco PL/SQL que compute a remuneração total por um ano. O salário
anual e a porcentagem do bônus anual são repassados ao bloco PL/SQL pelas
variáveis de substituição e os benefícios precisam ser convertidos de um número
inteiro para um decimal (exemplo 15 para 0.15). Se o salário for nulo, defina-o
para zero antes de computar a remuneração total. Execute o bloco PL/SQL. Obs.:
utilizar a função NVL. Obs.: Utilizar as tabelas do usuário HR: EMPLOYEES,
DEPARTMENTS.
82
L A B O R A T O R I O D E B A N C O D E D A D O S
INSTRUÇÕES PL/SQL
SELECT INTO
Recupera dados do banco de dados com SELECT, atribuindo colunas que
DEVEM ser especificadas para cada variável declarada. Retornando somente uma
linha, se retornar mais de uma linha ou nenhuma ocorre um erro. Sintaxe:
SELECT coluna, coluna2,.., colunan
INTO {nome_variavel | nome_registro, variavel2,..,variaveln11}
FROM tabela WHERE condição;
Exemplo:
DECLARE
v_deptno NUMBER(2);
v_loc NUMBER (15);
BEGIN
SELECT departament_id, location_id
INTO v_deptno, v_loc
FROM departments
WHERE department_name = ‘Sales’;
END;
83
L A B O R A T O R I O D E B A N C O D E D A D O S
EXERCÍCIOS PRÁTICOS
84
L A B O R A T O R I O D E B A N C O D E D A D O S
9. Criar um bloco anônimo que caso o cliente seja pessoa física dar um desconto
de 10% no total da nota emitida.
Obs.: deverá ser inserido os dados da NOTA_FISCAL.
10.Criar um bloco que entre com um valor em real a cotação do dólar do dia e
exiba o valor convertido em dólar. Teste: cotação do dia 15/01/2019: R$
3,72.
85
L A B O R A T O R I O D E B A N C O D E D A D O S
ESTRUTURAS DE CONTROLE
INSTRUÇÃO IF
Sintaxe:
IF condição THEN
Instrução;
[ELSIF condição THE
instrução;]
[ELSE
instrução;]
END IF;
86
L A B O R A T O R I O D E B A N C O D E D A D O S
Observações:
Usamos o ELSE quando a condição for falsa ou nula.
O END-IF finaliza a estrutura condicional.
Podemos em uma instrução ter vários ELSIF’s, porém somente um ELSE.
Exemplo:
DECLARE
v_valor NUMBER(14,2) := :VALOR;
v_forma VARCHAR2(15) := :FORMA;
BEGIN
IF v_forma = ‘DINHEIRO’ THEN
v_valor := v_valor – (v_valor*0.2);
ELSIF v_forma = ‘CHEQUE’ THEN
v_valor := v_valor – (v_valor*0.15);
ELSE
DBMS_OUTPUT.PUT_LINE12(´Não há desconto!’);
END IF;
DBMS_OUTPUT.PUT_LINE (‘Valor a pagar é de ‘ || v_valor);
END;
/
LOOPS (LAÇOS)
Obs.: Para este tópico criar a tabela abaixo:
CREATE TABLE loop
(numero NUMBER(3),
Tipo VARCHAR(20));
LOOP
É o formato mais simples. Delimita uma sequência de instruções entre as
palavras-chaves LOOP e END-LOOP. Sempre que o fluxo de execução atinge a
instrução END LOOP, o controle retorna à instrução LOOP correspondente acima.
Um loop básico permite a execução de sua instrução pelo menos uma vez, mesmo
que a condição já esteja atendida no momento em que o loop foi informado. Sem
a instrução EXIT WHEN13, o loop seria infinito. Sintaxe:
LOOP
Comandos;
EXIT WHEN condição;
END LOOP;
12
Para este comando ser realizado é necessário ser habilitado com SET SERVEROUTPUT ON.
13 Na versão 11G podemos ter o comando CONTINUE WHEN além do comando EXIT WHEN.
87
L A B O R A T O R I O D E B A N C O D E D A D O S
FOR
Possui a mesma estrutura de um loop básico. Além disso, ele tem uma
instrução para controle no início da palavra chave LOOP para determinar o numero
de iterações que o PL/SQL executa. Sintaxe:
FOR contador IN [REVERSE] início.. fim LOOP
comandos;
END LOOP;
WHILE
Usado para repetir uma seqüência de instruções até a condição para
controle. Não ser mais verdadeira. A condição é avaliada ao início de cada iteração.
O loop terminará quando a condição for falsa. Se a condição for falsa no início do
loop, nenhuma iteração futura será executada. Sintaxe:
LOOP
Comandos;
88
L A B O R A T O R I O D E B A N C O D E D A D O S
EXERCÍCIOS PRÁTICOS
1. Criar um bloco PL/SQL que apresente todos os anos bissextos entre 2000 e
2100. Um ano será bissexto quando for possível dividir este ano por 4, mas não
por 100 ou quando puder ser dividido por 400.
2. Criar um bloco que de acordo com o salário informado, exiba o valor de INSS
conforme a tabela abaixo:
89
L A B O R A T O R I O D E B A N C O D E D A D O S
3. Crie um bloco anônimo que altere o bloco anônimo para que informe se o
número é par ou ímpar.
90
L A B O R A T O R I O D E B A N C O D E D A D O S
CURSORES EXPLÍCITOS
CURSORES IMPLÍCITOS
CURSORES EXPLÍCITOS
Nã
o
Si
DECLARE OPEN FETCH ID m CLOSE
?
DECLARANDO O CURSOR
92
L A B O R A T O R I O D E B A N C O D E D A D O S
ABRINDO O CURSOR
Abre o cursor para executar uma consulta e identificar o conjunto ativo que
consiste em todas as linhas que atendem aos critérios de pesquisa da consulta. O
cursor aponta agora para a primeira linha do conjunto ativo.
Sintaxe: OPEN nome_cursor;
Exemplo: OPEN emp_cursor;
93
L A B O R A T O R I O D E B A N C O D E D A D O S
…
END LOOP;
END;
FECHANDO O CURSOR
A instrução CLOSE desativa o cursor e o conjunto ativo se torna indefinido.
Feche o cursor após completar o processamento da instrução SELECT. Essa
etapa permite que o cursor seja reaberto se necessário, assim, podemos
estabelecer um conjunto ativo, várias vezes. Sintaxe: CLOSE nome_cursor;
Observações:
• Caso queira extrair dados de um cursor que esteja fechado será criada uma
exceção INVALID_CURSOR;
• Podem terminar um bloco sem fechar o cursor, porém existe um limite
máximo de cursores abertos por usuário que é determinado pelo parâmetro
OPEN_CURSORS no campo de parâmetros do banco de dados. (Por default
é 50).
Exemplo: ….
FOR i IN 1..10 LOOP
FETCH emp_cursor INTO v_id, v_nome;
…
END LOOP;
CLOSE emp_cursor;
END;
94
L A B O R A T O R I O D E B A N C O D E D A D O S
ATRIBUTO %ISOPEN
Podemos extrair linhas somente quando o cursor está aberto. Use o atributo de
cursor %ISOPEN para determinar se o cursor está aberto, se necessário. Extrai as
linhas através de um loop. Use os atributos de cursor para determinar o momento
para sair do loop. Use o atributo de cursor %ROWCOUNT para recuperar um número
exato de linhas, extrair as linhas em um loop FOR numérico ou extrair as linhas em
um loop simples e determinar o momento para sair do loop. Exemplo:
IF NOT emp_cursor%ISOPEN THEN
OPEN emp_cursor;
END IF;
LOOP
FETCH emp_cursor…
95
L A B O R A T O R I O D E B A N C O D E D A D O S
EXERCÍCIOS PRÁTICOS
96
L A B O R A T O R I O D E B A N C O D E D A D O S
EXCEÇÕES
14Clausula de manipulação de exceção opcional que captura exceções não especificadas (não
tratadas). É sempre o último handler de exceção.
97
L A B O R A T O R I O D E B A N C O D E D A D O S
v_largura INTEGER;
v_altura INTEGER := 2;
v_area INTEGER := 6;
BEGIN
-- configura a largura igual a área dividida pela altura
v_largura := v_area / v_altura;
DBMS_OUTPUT.PUT_LINE(‘v_largura: ‘ || v_largura);
EXCEPTION
WHEN ZERO_DIVIDE THEN
DBMS_OUTPUT.PUT_LINE(‘Divisão por zero...’);
END;
98
L A B O R A T O R I O D E B A N C O D E D A D O S
exceções de forma
implícita.
Uma condição que o Declare dentro da seção
Erro definido pelo desenvolvedor determina declarativa e crie
usuário. seja anormal. exceções de forma
explícita.
99
L A B O R A T O R I O D E B A N C O D E D A D O S
EXCEÇÃO PREDEFINIDA
Somente uma exceção é criada e tratada a qualquer momento.
Sintaxe: BEGIN
EXCEPTION
WHEN NO_DATA_FOUND THEN
Instruções;
WHEN TOO_MANY_ROWS THEN
Instruções;
WHEN OTHERS THEN
Instruções;
END;
100
L A B O R A T O R I O D E B A N C O D E D A D O S
EXCEÇÃO ZERO_DIVIDE
Figura 25 - Mensagem de erro de uma exceção não tratada (feito pelo autor).
EXCEÇÃO DUP_VAL_ON_INDEX
Tentativa de armazenar valores duplicados em uma coluna com índice
exclusivo. Exemplo:
BEGIN
INSERT INTO customers(customer_id, first_name,last_name)
VALUES (1, ‘Greg’, ‘Green’);
EXCEPTION
WHEN DUP_VAL_ON_INDEX THEN
DBMS_OUTPUT.PUT_LINE(‘Valor Duplicado’);
END;
EXCEÇÃO INVALID_NUMBER
Tentativa de converter uma string de caractere inválida em um número.
Exemplo: Converte a string 123X em um número
BEGIN
INSERT INTO customers(customer_id, first_name,last_name)
101
L A B O R A T O R I O D E B A N C O D E D A D O S
EXCEÇÃO OTHERS
Usada para tratar todas as exceções. Exemplo:
BEGIN
DBMS_OUTPUT.PUT_LINE(1/0);
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(‘Ocorreu uma exceção...’);
END;
Como OTHERS significa todas exceções, se tivermos o tratamento de mais
um tipo, ela deverá ser a última exceção a ser tratada. Exemplo:
BEGIN
DBMS_OUTPUT.PUT_LINE(1/0);
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(‘Ocorreu uma exceção...’);
WHEN ZERO_DIVIDE THEN
DBMS_OUTPUT.PUT_LINE(‘Divisão por zero...’);
END;
102
L A B O R A T O R I O D E B A N C O D E D A D O S
FUNÇÃO DESCRIÇÃO
SQLCODE Retornar um valor numérico do código de erro, podemos atribuir a
uma variável NUMBER
SQLERRM Retorna os dados de caracteres que contém a mensagem
associada ao número do erro.
Exemplo de Valores do SQLCODE
• 0 → Nenhuma exceção encontrada;
• 1 → Exceção definida pelo usuário;
• +100 → Exceção NO_DATA_FOUND
• Número negativo→ Outro número de erro do Oracle.
DECLARE
v_error_codigo NUMBER.
103
L A B O R A T O R I O D E B A N C O D E D A D O S
V_error_mensagem VARCHAR(255);
BEGIN
...
EXCEPTION
...
WHEN OTHERS THEN
ROLLBACK;
v_error_codigo := SQLCODE;
v_error_mensagem := SQLERRM;
INSERT INTO errors
VALUES (v_error_codigo, v_error_mensagem);
END;
104
L A B O R A T O R I O D E B A N C O D E D A D O S
PROCEDIMENTO RAISE_APPLICATION_ERROR
EXERCÍCIOS PRÁTICOS
1. Crie um bloco PL/SQL que imprima o número de funcionários que recebem mais
ou menos que R$ 500,00 de salário.
a) Se não houver funcionário nessa faixa de salário, imprima uma mensagem
para o usuário indicado que é esse o caso. Use uma exceção para esse caso.
b) Se houver um ou mais funcionários dentro dessa faixa, a mensagem deverá
indicar quantos funcionários estão naquela faixa salarial.
c) Trate quaisquer outras exceções com um handler de exceção apropriado. A
mensagem deve indicar que ocorreu algum outro erro.
105
L A B O R A T O R I O D E B A N C O D E D A D O S
PROCEDURES
Um procedimento é um bloco PL/SQL nomeado que pode obter parâmetros16 e
que pode ser chamado. Ou seja, um procedimento é usado para executar uma ação e
possui cabeçalho, seção para declaração, seção para execução e uma seção para
tratamento de exceção.
Os procedimentos promovem a reutilização e a manutenção. Uma vez validados,
podem ser usados em qualquer número de aplicações. Se a definição for alterada,
somente o procedimento será afetado, simplificando assim a manutenção. Sintaxe:
CREATE [OR REPLACE] PROCEDURE nome_do_procedimento
(parâmetro1 [modo1] tipo_de_dados1,
Parâmetro2 [modo2] tipo_de_dados2, ...)
IS
Bloco;
MODOS DE PARÂMETRO
TIPO DESCRIÇÃO
Especifica um valor constante do ambiente de chamada
IN para o procedimento.
Especifica um valor de procedimento para o ambiente de
OUT chamada.
Especifica um valor de ambiente de chamada para o
procedimento e um valor possivelmente diferente do
IN OUT procedimento de volta para o ambiente de chamada
usando o mesmo parâmetro.
PARÂMETRO IN
É o parâmetro DEFAULT.
Seu valor é especificado para um subprograma e este parâmetro age como uma
constante e pode ser variável inicializada, constante, expressão ou literal.
Exemplo: Criar um procedimento que atualize o salário em 10% do funcionário
informado (owner: HR):
CREATE OR REPLACE PROCEDURE aumento
(v_id IN employees.employee_id%TYPE) IS
BEGIN
UPDATE employees
SET salary := salary * 1.10
WHERE employee_id = v_id;
COMMIT;
END;
106
L A B O R A T O R I O D E B A N C O D E D A D O S
EXECUÇÃO DA PROCEDURE
SHOW ERRORS
Obs.: podemos utilizar o comando SHOW ERRORS para consultar os erros
de compilação no ambiente SQL * PLUS. Exemplo (owner: LOJA):
CREATE PROCEDURE update_product_price(
p_product_id IN products.product_id%TYPE,
p_factor IN NUMBER)
AS
v_product_count INTEGER;
BEGIN
-- conta o número de produtos com o valor de product_id fornecido
-- sera 1 se o produto existir
SELECT COUNT(*)
INTO v_product_count
FROM products
WHERE product_id = p_product_id;
-- se o produto existir (v_product_count = 1) então
-- atualiza seu preço
IF v_product_count = 1 THEN
UPDATE products
SET price = price * p_factor
WHERE product_id = p_product_id;
COMMIT;
END IF;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
END update_product_price;
107
L A B O R A T O R I O D E B A N C O D E D A D O S
PARÂMETRO OUT
Executar o procedimento:
EXECUTE dado_func(7369, :g_nome, :g_salario)
Visualizar o conteúdo:
PRINT g_nome
PARÂMETRO IN OUT
PRINT g_telefone
108
L A B O R A T O R I O D E B A N C O D E D A D O S
PARÂMETRO DEFAULT
Exemplo:
CREATE OR REPLACE PROCECURE adiciona_depto
(v_nome IN departments.department_name%TYPE DEFAULT ‘CPD’,
v_loc IN departments.location_id DEFAULT 100) IS
BEGIN
INSERT INTO departments
(department_id, department_name, location_id)
VALUES (seq_dept.NEXTVAL, v_nome, v_loc);
END;
/
ESPECIFICAR PARÂMETROS
Exemplo:
BEGIN
adiciona_depto(‘CPD’, 150);
adiciona_depto(v_nome => ‘DP’, v_loc => 200);
adiciona_depto(120);
END;
DECLARANDO SUBPROGRAMAS
Esta tabela deverá ser criada contendo as colunas usuário VARCHAR(20), data DATE e obs
18
VARCHAR(50)
109
L A B O R A T O R I O D E B A N C O D E D A D O S
REMOVENDO PROCEDIMENTOS
110
L A B O R A T O R I O D E B A N C O D E D A D O S
EXERCÍCIOS PRÁTICOS
4. Criar a procedure PRC_FOLHA que entre com a data e insira na tabela FOLHA
o id do empregado, o salario, o vale transporte calculado (6%) sobre o salário
e o salário líquido (salário – vale transporte).
111
L A B O R A T O R I O D E B A N C O D E D A D O S
FUNCTIONS
Função é um bloco PL/SQL nomeado que pode obter parâmetros e ser chamado.
Em resumo, um procedimento é usado para calcular um valor. Funções e
procedimentos são estruturados da mesma forma, com a diferença que uma função
deve retornar um valor ao ambiente de chamada. Como um procedimento, uma
função também possui cabeçalho, parte declarativa, parte executável e uma parte
para tratamento de exceções opcional. Uma função deve ter uma cláusula RETURN no
cabeçalho e pelo menos uma instrução RETURN na seção executável. As funções
promovem a reutilização e a manutenção. Uma vez validadas, podem ser usadas em
qualquer número de aplicações. Se a definição for alterada, somente a função será
afetada, o que simplifica bastante a manutenção.
As funções podem ser chamadas como parte de uma expressão SQL ou parte de
uma expressão PL/SQL. Em expressão SQL, uma função deve obedecer a
determinadas regras para controlar os efeitos colaterais. Em uma expressão PL/SQL,
o identificador da função age como uma variável cujo valor depende dos parâmetros
especificados para ela. Sintaxe:
CREATE [OR REPLACE] FUNCTION nome_função
(parametro1 [modo1] tipodedados1,
(parametro2 [modo2] tipodedados2...)
RETURN tipodedados
IS
Bloco PL/SQL;
Uma função é um bloco PL/SQL que retorna um valor. Crie novas funções com a
instrução CREATE FUNCTION, que podem declarar uma lista de parâmetros, devem
retornar um valor e definir as ações a serem executadas pelo bloco PL/SQL padrão.
Utilize SHOW ERRORS para consultar os erros de compilação.
PARAMETRO DESCRIÇÃO
REPLACE Caso a função exista, ela será substituída pela nova versão
RETURN Não deve incluir um tamanho no seu tipo de dados.
112
L A B O R A T O R I O D E B A N C O D E D A D O S
113
L A B O R A T O R I O D E B A N C O D E D A D O S
• Os parâmetros para uma função PL/SQL chamada a partir de uma instrução SQL
devem usar notação posicional. A notação nomeada não é suportada;
REMOVENDO FUNÇÕES
Quando uma função não é mais utilizada podemos removê-la do servidor através
do comando: DROP FUNCTION nome_função.
Exemplo: DROP FUNCTION reajuste_salario.
114
L A B O R A T O R I O D E B A N C O D E D A D O S
PROCEDIMENTO OU FUNÇÃO
Um procedimento é criado para armazenar uma série de ações para execução
futura. Um procedimento pode conter zero ou mais parâmetros que podem ser
transferidos do ambiente de chamada e para ele, mas não tem que retornar um valor.
Crie uma função quando quiser calcular um valor, que pode ser retornado ao
ambiente de chamada. Ela pode conter zero ou mais argumentos que são transferidos
para o ambiente que a chamou e deve sempre retornar um único valor.
Possui os seguintes benefícios:
• Desempenho melhorado;
• Manutenção melhorada;
• Segurança de dados e integridade melhorada.
PROCEDURE FUNCTION
Executa como instrução PL/SQL. Chamar como parte de uma expressão.
Tipo de dados sem RETURN Deve possuir um tipo de dados RETURN.
Pode retornar nenhum ou muitos Deve retornar um único valor.
valores.
Procedure Function
Parâmetro IN Parâmetro IN
Parâmetro OUT
Parâmetro IN OUT Is
Ambiente
de
Begin
Is Exception
Chamada
Begin End;
Exception
End;
EXEMPLO DE FUNÇÃO
CREATE OR REPLACE FUNCTION soma_numeros(telefone IN VARCHAR2)
RETURN NUMBER IS
s NUMBER(4) := 0;
soma NUMBER(4):= 0;
BEGIN
FOR x IN 1..15 LOOP
IF Substr(telefone, x, 1) IN ('0', '1', '2', '3','4', '5','6', '7','8', '9')
THEN s := To_Number(Substr(telefone, x, 1));
soma := soma + s;
END IF;
END LOOP;
RETURN soma;
END soma_numeros;
115
L A B O R A T O R I O D E B A N C O D E D A D O S
EXERCÍCIOS PRÁTICOS
1. Criar uma função chamada FUNCAO_CARGO que retorna o título do cargo
informado.
2. Criar uma função chamada PRIMO que recebe um número inteiro e retorna a
informação se este número é primo ou não. Obs. Números primos são diviseis
somente por eles mesmos e por um.
3. Criar uma função chamada ANUAL_COMP para retornar o salário anual quando
especificado um salário mensal e comissão de um empregado. Obs. A função
deve tratar valores nulos.
4. Criar uma função chamada FNC_PIS que calcule o valor de pis a receber:
Para calcular PIS o trabalhador deve informar a remuneração mensal e a
quantidade de meses trabalhados, é importante salientar que para ter direito
o trabalhador deve ter recebido em média até 2 salários mínimos de
remuneração mensal no ano-base considerado. Por exemplo: Para calcular PIS
2019 o ano-base é 2018, portanto o valor do salário mínimo para efeito do
cálculo é de R$ 954,00, portanto o trabalhador deve ter recebido até R$
1.908,00, equivalente a 2 salários mínimos. Para calcular PIS é multiplicada a
remuneração mensal pela quantidade de meses trabalhados, depois dividido
pelos meses trabalhados, a remuneração média deve ser inferior a 2 salários
mínimos, sendo assim o trabalhador terá direito ao abono salarial do PIS.
5. Criar uma função chamada FNC_INSS que de acordo com um salário informado
retorna o valor a ser descontado do INSS:
116
L A B O R A T O R I O D E B A N C O D E D A D O S
117
L A B O R A T O R I O D E B A N C O D E D A D O S
PACKAGES
Uma especificação existe sem um corpo, mas um corpo não vive sem uma
especificação. Se tiver incorporado um procedimento independente a um pacote,
deverá eliminá-lo.
118
L A B O R A T O R I O D E B A N C O D E D A D O S
CRIANDO O PACOTE
ESPECIFICAÇÃO
Sintaxe:
CREATE [OR REPLACE] PACKAGE nome_pacote IS
Tipo de dados especificação de um subprograma
END nome_pacote;
Exemplo:
CREATE OR REPLACE PACKAGE comissao_pacote IS
PROCEDURE calcula_comissao (v_percentual IN NUMBER);
END comissao_pk;
CORPO
Sintaxe:
CREATE [OR REPLACE] PACKAGE BODY nome_pacote IS
Tipo de dados especificação de um subprograma e corpo.
END nome_pacote;
Exemplo:
CREATE OR REPLACE PACKAGE BODY comissao_pacote IS
FUNCTION valida_comissao
(v_percentual IN NUMBER)
RETURN BOOLEAN
IS
v_maior_comissao NUMBER;
BEGIN
SELECT MAX(commission_pct)
INTO v_maior_comissao
FROM employees;
IF v_percentual > v_maior_comissao THEN
RETURN(FALSE);
ELSE
RETURN(TRUE).
END IF;
END valida_comissao;
PROCEDURE calcula_comissao(v_percentual IN NUMBER)
IS
p_comissao NUMBER:= 0.10;
119
L A B O R A T O R I O D E B A N C O D E D A D O S
BEGIN
IF valida_comissao(v_percentual) THEN
P_comissao := v_percentual;
ELSE
RAISE_APPLICATION_ERROR(-20210, ‘ Comissão Inválida’);
END IF;
END calcula_comissao;
END comissao_pacote;
120
L A B O R A T O R I O D E B A N C O D E D A D O S
v_product_count INTEGER;
BEGIN
-- conta o número de produtos com o valor de
-- product_id fornecido (sera 1 se o produto existir)
SELECT COUNT(*)
INTO v_product_count
FROM products
WHERE product_id = p_product_id;
-- se o produto existir (v_product_count = 1) então
-- atualiza o produto
IF v_product_count = 1 THEN
UPDATE products
SET price = price * p_factor
WHERE product_id = p_product_id;
COMMIT;
END IF;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
END update_product_price;
END product_package;
/
REMOVENDO PACOTES
• ESPECIFICAÇÃO: DROP PACKAGE nome_pacote;
• CORPO: DROP PACKAGE BODY nome_pacote;
121
L A B O R A T O R I O D E B A N C O D E D A D O S
03. Com base nas procedures e functions criadas nas tarefas 08 e 09, criar uma
package chamada PK_TAREFA11 contendo na especificação o cabeçalho das
procedures e no corpo contendo o código das procedures e das functions.
122
L A B O R A T O R I O D E B A N C O D E D A D O S
TRIGGERS
123
L A B O R A T O R I O D E B A N C O D E D A D O S
TEMPO DE GATILHO
TIPOS DE GATILHO
Sintaxe:
CREATE [OR REPLACE] TRIGGER nome_gatilho
Tempo
evento1 OR evento2
ON nome_tabela
Corpo do Gatilho;
Onde:
• Tempo – indica o tempo de disparo (BEFORE ou AFTER);
• Evento – indica a operação DML (INSERT, UPDATE, DELETE)
124
L A B O R A T O R I O D E B A N C O D E D A D O S
125
L A B O R A T O R I O D E B A N C O D E D A D O S
Exemplo: Criar uma trigger na tabela EMP para adicionar linhas a uma tabela
do usuário, AUDIT_EMP, fazendo log das atividades com a tabela EMPLOYEES:
Primeiro, vamos criar a tabela AUDIT_EMP_TABLE:
CREATE TABLE audit_EMP_TABLE
(user_name VARCHAR2(30),
timestamp DATE,
id NUMBER,
old_last_name VARCHAR2 (30),
new_last_name VARCHAR2(30),
old_title VARCHAR2(30),
new_title VARCHAR2(30),
old_salary NUMBER(14,2),
new_salary NUMBER(14,2));
126
L A B O R A T O R I O D E B A N C O D E D A D O S
TRIGGER INSTEAD OF
São assim chamados por ser usado para modificar dados nos quais a
instrução DML foi emitida em uma view não-atualizada automaticamente. A trigger
é disparada ao invés de executar a instrução DML.
VANTAGEM: Quando a view é formada por mais de uma tabela.
Sintaxe:
CREATE [OR REPLACE] TRIGGER nome_trigger
INSTEAD OF
Evento1 [OR evento2 OR evento3]
ON nome_tabela
[REFERECING OLD AS antigo | NEW AS novo]
[FOR EACH ROW]
corpo_trigger;
127
L A B O R A T O R I O D E B A N C O D E D A D O S
ALTERANDO TRIGGERS
• ATIVAR/REATIVAR:
ALTER TRIGGER nome_trigger DISABLE / ENABLE
APAGANDO TRIGGERS
EVENTOS DDL
CREATE
ALTER
DROP
TRIGGER BODY – completa o bloco PL/SQL
Os gatilhos DDL só serão disparados se o objeto a ser criado for: function,
índice, package, procedure, sequence, sinonym, table, trigger, view ou user.
128
L A B O R A T O R I O D E B A N C O D E D A D O S
A seguir temos uma lista de eventos DDL que podem disparar uma trigger:
129
L A B O R A T O R I O D E B A N C O D E D A D O S
22Mutante significa algo que está sendo modificado ou alterado. O erro de uma tabela mutante
é o ORA-04091 que ocorre quando uma trigger tenta verificar ou alterar uma tabela que está
sofrendo uma alteração.
130
L A B O R A T O R I O D E B A N C O D E D A D O S
v_host log_dml.estacao%TYPE;
BEGIN
SELECT SYS_CONTEXT(‘userenv’, ‘session_user’),
SYS_CONTEXT(‘userenv’, ‘os_user’),
SYS_CONTEXT(‘userenv’, ‘host’)
INTO v_usuario, v_os, v_host
FROM dual;
IF INSERTING THEN
INSERT INTO log_dml
VALUES (seq_log.NEXTVAL, sysdate, ‘EMPLOYEES’, v_usuario,
v_os, v_host, ‘INSERT’, ‘FALHA’);
END IF;
IF UPDATING THEN
INSERT INTO log_dml
VALUES (seq_log.NEXTVAL, sysdate, ‘EMPLOYEES’, v_usuario,
v_os, v_host, ‘UPDATE’, ‘FALHA’);
END IF;
IF DELETING THEN
INSERT INTO log_dml
VALUES (seq_log.NEXTVAL, sysdate, ‘EMPLOYEES’, v_usuario,
v_os, v_host, ‘DELETE’, ‘FALHA’);
END IF;
COMMIT;
END;
/
131
L A B O R A T O R I O D E B A N C O D E D A D O S
Podemos ainda melhorar esta trigger para que seja utilizada em qualquer
tipo de objeto.
Para isto, altere o nome da coluna tabela para objeto:
ALTER TABLE log_dml
RENAME COLUMN tabela TO objeto;
EXERCÍCIOS PRÁTICOS
Obs.: Executar o script PRODUCT.SQL
1. Somente serão permitidas alterações nos dados das tabelas durante o horário
comercial, das 7:30 as 12:30, de segunda à sexta-feira.
a) Crie um procedimento armazenado chamado SECURE_DML que não funcione
fora desse horário, devolvendo a mensagem: “Fora do horário comercial”.
132
L A B O R A T O R I O D E B A N C O D E D A D O S
UTL_FILE
133
L A B O R A T O R I O D E B A N C O D E D A D O S
COMANDOS UTL_FILE
Procedimentos
da package Funcionalidade
UTL_FILE
abre um arquivo para entrada ou saída, criando um arquivo
FOPEN
de saída caso o arquivo especificado não exista
IS_OPEN indica se determinado arquivo está ou não aberto
FCLOSE fecha um arquivo
FCLOSE_ALL fecha todos os arquivos abertos
GET_LINE lê uma linha de um arquivo aberto
escreve uma linha no arquivo. Não acrescenta
PUT
automaticamente o caractere de fim de linha
escreve uma linha no arquivo, acrescentando
PUT_LINE
automaticamente o caractere de fim de linha
inclui o caractere de fim de linha no arquivo, o que irá gerar
NEW_LINE
uma nova linha em branco
FFLUSH escreve, fisicamente, todas as pendências para um arquivo
Exceções package
Controle
UTL_FILE
INVALID_PATH diretório ou nome de arquivo inválido
INVALID_MODE o parâmetro de modo de abertura é inválido
INVALID_FILEHANDLE especificador de arquivo inválido
o arquivo não pode ser aberto ou a operação é
INVALID_OPERATION
inválida
ocorreu um erro do sistema operacional durante a
READ_ERROR
leitura de um arquivo
ocorreu um erro do sistema operacional durante a
WRITE_ERROR
gravação de um arquivo
INTERNAL_ERROR erro não especificado no PL/SQL
134
L A B O R A T O R I O D E B A N C O D E D A D O S
135
L A B O R A T O R I O D E B A N C O D E D A D O S
PASSOS:
1. Conectar com o usuário SYSTEM: CONNECT SYSTEM/SENHA;
2. Criar diretório: CREATE DIRECTORY DIRETORIO AS ‘C:\DIRETORIO’;
3. Ir no Windows Explorer e criar uma pasta chamada DIRETÓRIO na unidade
C;
4. Conceder privilégio de leitura e gravação no diretório criado:
GRANT READ, WRITE ON DIRECTORY DIRETORIO TO HR;
5. Conectar com o usuário HR: CONNECT HR/HR;
6. Criar o procedimento abaixo:
DECLARE
V_LINHA VARCHAR2(2000) := ‘‘;
V_ARQUIVO UTL_FILE.FILE_TYPE;
BEGIN
V_ARQUIVO := UTL_FILE.FOPEN(‘DIRETORIO’, ‘ARQUIVO.TXT’, ‘W’);
FOR i in 1..5 LOOP
V_LINHA := ‘LINHA ‘ || i || ‘!!’;
UTL_FILE.PUT_LINE(V_ARQUIVO, V_LINHA);
END LOOP;
UTL_FILE.FCLOSE(V_ARQUIVO);
END;
7. Vá a unidade C:\DIRETÓRIO e visualize o conteúdo do arquivo.
136
L A B O R A T O R I O D E B A N C O D E D A D O S
Vamos gravar nomes dos clientes em um arquivo XML. Para isto vamos
conectar como SYSTEM e conceder o privilégio de CREATE ANY DIRECTORY para
o usuário LOJA:
Agora, conectar com o usuário loja (senha loja) e criar um objeto de diretório
c:\TEMP_FILES:
137
L A B O R A T O R I O D E B A N C O D E D A D O S
XMLQUERY()
Usada para construir ou consultar códigos XML, passando uma expressão
XQueryXML, que é uma linguagem de consulta que permite construir e consultar
código XML, retornando o resultado da avaliação da expressão. Exemplo: Criar strings
XML para produtos e tipos de produto.
139
L A B O R A T O R I O D E B A N C O D E D A D O S
Obs.: Utiliza métodos do pacote PL/SQL DBMS_XDB para excluir e criar arquivos
de recursos XML no XML DB Repository do Oracle – é uma área de armazenamento
para dados XML dentro do banco de dados:
CREATE OR REPLACE PROCEDURE create_xml_resources AS
v_result BOOLEAN;
-- cria string contendo código XML para produtos
v_products VARCHAR2(300):=
‘<?xml version="1.0"?>‘ ||
‘<products>‘ ||
‘<product product_id="1" product_type_id="1" name="Modern Science"‘ ||
‘ price="19.95"/>‘ ||
‘<product product_id="2" product_type_id="1" name="Chemistry"‘ || ‘
price="30"/>‘ ||
‘<product product_id="3" product_type_id="2" name="Supernova"‘ || ‘
price="25.99"/>‘ ||
‘</products>‘;
-- cria string contendo código XML para tipos de produtos
v_product_types VARCHAR2(300):=
‘<?xml version="1.0"?>‘ ||
‘<product_types>‘ ||
‘<product_type product_type_id="1" name="Book"/>‘ ||
‘<product_type product_type_id="2" name="Video"/>‘ ||
‘</product_types>‘;
BEGIN
-- exclui o recurso existente para produtos
DBMS_XDB.DELETERESOURCE(‘/public/products.xml’,
DBMS_XDB.DELETE_RECURSIVE_FORCE);
-- cria um recurso para produtos
v_result := DBMS_XDB.CREATERESOURCE(‘/public/products.xml’,
v_products);
-- exclui o recurso existente para tipos de produtos
DBMS_XDB.DELETERESOURCE(‘/public/product_types.xml’,
DBMS_XDB.DELETE_RECURSIVE_FORCE);
-- cria um recurso pra tipos de produtos
v_result :=DBMS_XDB.CREATERESOURCE(‘/public/product_types.xml’,
v_product_types);
END create_xml_resources;
/
EXERCÍCIOS PRÁTICOS
Crie um procedimento chamado XML_EMPREGADO que consulta na tabela
EMPLOYEES recuperando o nome, salário e o cargo dos funcionários.
23 Necessário ter cadastro no site da Oracle, porém é gratuito.
24 Necessário ter cadastro no site da Oracle, porém é gratuito.
140