SlideShare uma empresa Scribd logo
Universidade Presbiteriana Mackenzie 
1 
Banco de Dados – Aula 02 
Linguagem SQL 
SELECT com várias tabelas 
(inner join, left join e right join) 
Prof. Jamilson Bispo dos Santos
2 
Introdução 
Considere o seguinte Banco de Dados para esta aula: 
 Departamento = {Cod_Depto, Nome_Depto} 
 Funcionario = {Cod_Func, Nome_Func, Salario, Cod_Depto} 
- Cod_depto é chave estrangeira que referencia o atributo 
Cod_depto da tabela Departamento 
 Projeto = {Cod_Proj, Nome_Proj, Duracao} 
 Func_Proj = {Cod_Func, Cod_Proj, Horas_Trab} 
- Cod_Func é chave estrangeira que referencia o atributo 
Cod_Func da tabela Funcionario 
- Cod_Proj é chave estrangeira que referencia o atributo 
Cod_Proj da tabela Projeto
3 
SELECT
4 
Introdução 
 A junção de várias tabelas pode ser feita na 
cláusula WHERE, colocando-se os nomes de 
todas as tabelas envolvidas na cláusula 
FROM
5 
Introdução 
 Exemplo (junção na cláusula WHERE): Obtenha o 
nome de cada funcionário e o nome do departamento 
que cada um pertence. 
SELECT F.Nome_Func, D.Nome_Depto 
FROM Funcionario F, Departamento D 
WHERE (F.Cod_depto = D.Cod_depto); 
Nome_Func Nome_Depto 
Joao da Silva Vendas 
Marcio Santana Pesquisa 
Maria Castro Marketing 
Mario Souza Marketing 
Sergio Santos Vendas
6 
INNER JOIN
7 
INNER JOIN 
 No padrão SQL:2003, a operação de junção de 
várias tabelas pode ser expressa diretamente na 
cláusula FROM, em vez de ser expressa nas 
cláusulas FROM e WHERE
8 
INNER JOIN 
 Para executar uma operação de junção na cláusula 
FROM, utilize as palavras-chave INNER JOIN e as 
condições de junção são indicadas pela palavra-chave 
ON, dentro da cláusula FROM (observe que a condição 
de junção não aparece mais na cláusula WHERE).
9 
INNER JOIN 
 Exemplo (INNER JOIN): Obtenha o nome de cada 
funcionário e o nome do departamento que cada um 
pertence 
SELECT F.Nome_Func, D.Nome_Depto 
FROM Funcionario F INNER JOIN Departamento D 
ON F.Cod_depto = D.Cod_depto; Nome_Func Nome_Depto 
Joao da Silva Vendas 
Marcio Santana Pesquisa 
Maria Castro Marketing 
Mario Souza Marketing 
Sergio Santos Vendas
10 
JUNÇÃO EXTERNA
11 
Junção Externa 
 Uma junção entre duas tabelas gera um resultado 
onde tem-se linhas que se combinam sobre a coluna 
de junção 
 O operador de junção externa gera o resultado da 
junção (as linhas combinadas) mais as linhas não 
combinadas
12 
Junção Externa 
 Uma junção externa de um lado gera um resultado 
com as linhas combinadas mais as linhas não 
combinadas com base em uma das tabelas 
 A linguagem SQL utiliza as palavras-chave LEFT JOIN 
e RIGHT JOIN para produzir a junção externa de um 
lado
13 
JUNÇÃO EXTERNA 
LEFT JOIN
Junção Externa – LEFT JOIN 
14 
 A palavra-chave LEFT JOIN gera um resultado 
contendo as linhas combinadas e as linhas não 
combinadas da tabela da esquerda
Junção Externa – LEFT JOIN 
 Exemplo (LEFT JOIN): Obtenha os nomes de todos 
os departamentos da empresa, com os nomes dos 
funcionários que trabalham em cada um. 
15 
SELECT D.Nome_Depto, F.Nome_func 
FROM Departamento D LEFT JOIN Funcionario F 
ON D.Cod_depto = F.Cod_depto 
ORDER BY D.Nome_Depto; 
Nome_Depto Nome_func 
Dados 
Vendas Joao da Silva 
Pesquisa Marcio Santana 
Marketing Maria Castro 
Marketing Mario Souza 
Vendas Sergio Santos
Junção Externa – LEFT JOIN 
 Exemplo (LEFT JOIN): Obtenha os nomes de todos 
os departamentos da empresa, com os nomes dos 
funcionários que trabalham em cada um. 
16 
SELECT D.Nome_Depto, F.Nome_func 
FROM Departamento D LEFT JOIN Funcionario F 
ON D.Cod_depto = F.Cod_depto 
ORDER BY D.Nome_Depto; 
Nome_Depto Nome_func 
Dados 
Vendas Joao da Silva 
Pesquisa Marcio Santana 
Marketing Maria Castro 
Marketing Mario Souza 
Vendas Sergio Santos 
Observe que o 
departamento “Dados” 
não tem funcionário, 
mas apareceu no 
resultado
17 
JUNÇÃO EXTERNA 
RIGHT JOIN
Junção Externa – RIGHT JOIN 
18 
 A palavra-chave RIGHT JOIN gera um resultado 
contendo as linhas combinadas e as linhas não 
combinadas da tabela da direita 
 Assim, o resultado de uma junção externa de um lado 
depende da direção (DIREITA ou ESQUERDA) e da 
posição dos nomes das tabelas
Junção Externa – RIGHT JOIN 
 Exemplo (RIGHT JOIN): Obtenha os nomes de todos 
os departamentos da empresa, com os nomes dos 
funcionários que trabalham em cada um. 
19 
SELECT D.Nome_Depto, F.Nome_func 
FROM Funcionario F RIGHT JOIN Departamento D 
ON D.Cod_depto = F.Cod_depto 
ORDER BY D.Nome_Depto; 
Nome_Depto Nome_func 
Dados 
Vendas Joao da Silva 
Pesquisa Marcio Santana 
Marketing Maria Castro 
Marketing Mario Souza 
Vendas Sergio Santos
Junção Externa – RIGHT JOIN 
 Observe que os exemplos anteriores, utilizando LEFT 
JOIN e RIGHT JOIN, trazem o mesmo resultado, com 
alterações apenas na ordem em que as tabelas 
aparecem na cláusula FROM. 
20
Exemplos de LEFT JOIN e RIGHT JOIN 
 Exemplo: Obtenha os nomes de todos os 
departamentos da empresa e a quantidade de 
funcionários pertencentes a cada um deles (retorne 
mesmo aqueles departamentos onde não têm 
funcionários) 
 Observe os exemplos a seguir utilizando LEFT JOIN e 
RIGHT JOIN 
21
Exemplos de LEFT JOIN e RIGHT JOIN 
22 
 LEFT JOIN 
SELECT D.Nome_Depto, 
COUNT(F.Cod_func) AS Total_Empregados 
FROM Departamento D LEFT JOIN Funcionario F 
ON D.Cod_depto = F.Cod_depto 
GROUP BY D.Nome_Depto; 
Nome_Depto Total_Empregados 
Dados 0 
Marketing 2 
Pesquisa 1 
Vendas 2
Exemplos de LEFT JOIN e RIGHT JOIN 
23 
 RIGHT JOIN 
SELECT D.Nome_Depto, 
COUNT(F.Cod_func) AS Total_Empregados 
FROM Funcionario F RIGHT JOIN Departamento D 
ON D.Cod_depto = F.Cod_depto 
GROUP BY D.Nome_Depto; 
Nome_Depto Total_Empregados 
Dados 0 
Marketing 2 
Pesquisa 1 
Vendas 2
Universidade Presbiteriana Mackenzie 
24 
FIM !!! J 
Banco de Dados – Aula 10 
Linguagem SQL 
SELECT com várias tabelas 
(inner join, left join e right join) 
Texto Original da 
Profa. Elisângela Botelho Gracias
Universidade Presbiteriana Mackenzie 
1 
Banco de Dados – Aula 03 
Linguagem SQL 
(Structured Query Language) 
Comando SELECT com Sub-Select 
Prof. Jamilson Bispo dos Santos
Banco de Dados Exemplo 
2
Exemplo de Banco de Dados 
3 
Considere o seguinte modelo relacional : 
PECA = {PeNro, PeNome, PePreco, PeCor} 
FORNECEDOR = {FNro, FNome, FCidade, FCateg} 
PROJETO = {PNro, PNome, PDuracao, PCusto} 
FORNECE_PARA = {PeNro, FNro, PNro, Quant} 
- PeNro é chave estrangeira que referencia a tabela Peca 
- FNro é chave estrangeira que referencia a tabela Fornecedor 
- PNro é chave estrangeira que referencia a tabela Projeto
4
5 
SELECT 
 Exemplo1 (sub-select): Obtenha o nome das peças 
utilizadas no projeto P5. 
PeNome 
SELECT Peca.PeNome 
FROM Peca 
WHERE Peca.PeNro IN (SELECT Fornece_para.PeNro 
Limpador 
FROM Fornece_para 
WHERE Fornece_para.PNro = ‘P5’);
6 
SELECT 
 Exemplo2 (sub-select): Obtenha o nome das peças 
cujo preco é superior ao preço médio das peças. 
PPreco 
SELECT Peca.PeNome 
Cinto 
FROM Peca 
Painel 
WHERE Peca.PePreco > (SELECT AVG(Peca.PePreco) 
FROM Peca);
7 
SELECT 
 Exemplo3 (sub-select): Obtenha, sem repetição e em 
ordem crescente, o nome dos fornecedores que 
forneceram peças para algum projeto. 
SELECT DISTINCT Fornecedor.FNome 
FROM Fornecedor 
WHERE Fornecedor.FNro IN (SELECT Fornece_para.FNro 
FROM Fornece_para) 
ORDER BY Fornecedor.FNome ASC; 
FNome 
CM 
Equipament 
Kirurgic 
Piloto 
Plastec
8 
SELECT 
Exemplo4 (sub-select): Obtenha os nomes das peças utilizadas 
nos projetos com duração maior que 3 meses. 
SELECT DISTINCT Peca.PeNome 
FROM Peca 
WHERE Peca.PeNro IN 
(SELECT Fornece_para.PeNro 
FROM Fornece_para 
WHERE Fornece_para.PNro IN 
PeNome 
Painel 
(SELECT Projeto.PNro 
FROM Projeto 
WHERE Projeto.PDuracao >3));
9 
SELECT 
 Exemplo5 (sub-select): Obtenha os nomes das peças fornecidas 
por algum fornecedor de Piracicaba. 
SELECT DISTINCT Peca.PeNome 
FROM Peca 
WHERE Peca.PeNro IN 
(SELECT PeNro 
FROM Fornece_para 
WHERE FNro IN 
PeNome 
Limpador 
(SELECT FNro 
FROM Fornecedor 
WHERE FCidade = ‘Piracicaba’));
10 
SELECT 
 Exemplo6 (sub-select): Obtenha os nomes das peças que não 
são fornecidas por fornecedores da categoria A. 
SELECT DISTINCT Peca.PeNome 
FROM Peca 
WHERE Peca.PeNro IN 
(SELECT PeNro 
FROM Fornece_para 
WHERE FNro NOT IN 
PeNome 
Cinto 
Volante 
Painel 
(SELECT FNro 
FROM Fornecedor 
WHERE FCategoria = ‘A’));
PNome Total 
Sea 7 
11 
SELECT 
 Exemplo7 (sub-select): Obtenha o nome de cada projeto e o total de 
peças utilizadas em cada um, mas desde que esse total seja maior que o 
total de peças utilizadas no projeto ‘Paraiso’. 
SELECT P.PNome, SUM(FP.Quant) AS Total 
FROM Fornece_para FP, Projeto P 
WHERE (FP.PNro = P.PNro) 
GROUP BY P.PNome 
HAVING SUM(FP.Quant) > (SELECT SUM(FP.Quant) 
FROM Fornece_para FP, Projeto P 
WHERE (P.PNome = ‘Paraiso’) AND (FP.PNro = P.PNro));
12 
SELECT 
 Exemplo8 (UPDATE com sub-select): Atualize para 10 a 
quantidade da peça “Volante” fornecida pelo fornecedor F2 
para o projeto P2. 
UPDATE Fornece_para 
SET Quant = 10 
WHERE (FNro = ‘F2’) AND (PNro = ‘P2’) 
AND PeNro IN (SELECT PeNro 
FROM Peca 
WHERE (PeNome = ‘Volante’));
Universidade Presbiteriana Mackenzie 
13 
FIM !!! J 
Banco de Dados – Aula 09 
Linguagem SQL 
(Structured Query Language) 
Comando SELECT com Sub-Select 
Texto original da 
Profa. Elisângela Botelho Gracias
Universidade Presbiteriana Mackenzie 
1 
Banco de Dados – Aula 01 
Linguagem SQL - 
Operadores 
Prof. Jamilson Bispo dos Santos
2 
OPERADORES 
 Você pode combinar várias consultas usando o conjunto de 
operadores UNION, UNION ALL, INTERSECT e MINUS. 
Todos os operadores de conjunto têm a mesma 
precedência. Se uma instrução SQL contém vários 
operadores de conjunto, a SGBD geralmente avalia da 
esquerda para a direita se não houver parênteses 
especificar explicitamente outra ordem.
3 
UNION 
 O operador UNION retorna somente linhas distintas que 
aparecem em qualquer resultado, enquanto o operador 
UNION ALL retorna todas as linhas. O operador UNION ALL 
não elimina duplicados linhas selecionadas:
4 
UNION 
Exemplo: 
select id_empregado, nome_empregado from 
empregado_mensalista 
union all 
select id_empregado, nome_empregado from 
empregado_horista
5 
INTERSECT 
 Retorna apenas as linhas retornados pelas duas 
consultas:
6 
INTERSECT 
Exemplo: 
select id_cargo from empregado_horista 
intersect 
select id_cargo from empregado_mensalista;
7 
MINUS 
 Retorna apenas as linhas retornados pela primeira 
consulta mas não pela segunda:
8 
INTERSECT 
Exemplo: 
select id_produto from estoque_central 
minus 
select id_produto from estoque_loja
Universidade Presbiteriana Mackenzie 
Desenvolvimento em BD – Aula5 
9 
FIM !!! J 
Linguagem SQL - 
OPERADORES 
Prof. Jamilson Bispo dos Santos
Universidade Presbiteriana Mackenzie 
1 
Banco de Dados - Aula 04 
Prof. Jamilson Bispo dos Santos
2 
Visão 
 Uma visão (view) é uma tabela lógica que não 
ocupa lugar no banco de dados, pois seus dados 
não estão fisicamente armazenados sob ela 
 Uma visão pode ser composta por colunas e 
agrupamentos de uma ou mais tabelas
3 
Visão 
 Resumindo, uma visão é resultado de uma 
consulta 
 Em uma visão é permitido selecionar, atualizar, 
excluir e incluir dados. Entretanto, visões que 
contenham JOIN, GROUP BY, DISTINCT e 
EXPRESSÕES somente permitem seleções
4 
Visão 
 Uma visão é criada por uma consulta que usa 
tabelas de origem ou tabelas base para extrair os 
dados 
 As tabelas base podem ser tabelas ou outras 
visões 
 A definição de uma visão é armazenada no 
dicionário de dados que guarda a consulta que 
gerou a visão
5 
Visão - Vantagens
6 
Visão - Vantagens 
 Uma das grandes vantagens é poder restringir a 
visualização do conteúdo de uma tabela por meio 
da limitação das colunas que são exibidas e das 
linhas que são filtradas
7 
Visão - Vantagens 
 Uma tabela de uso geral pode ser quebrada em 
visões específicas para determinados usuários 
 Assim, uma tabela com dados de empregados pode 
exibir apenas o nome e o telefone para usuários em 
geral, e outra, nome do empregado e o valor do 
salário apenas para usuários que recebam permissão 
para isso
8 
Visão - Vantagens 
 Outra vantagem seria a simplificação da execução 
de um comando SELECT que envolveria diversos 
campos de muitas tabelas
Visão – CREATE VIEW 
9
10 
Visão – CREATE VIEW 
 CREATE [OR REPLACE] VIEW nome_view AS 
SELECT ... 
WITH READ ONLY;
11 
Visão – CREATE VIEW 
 OR REPLACE: 
 recria uma visão já existente. Ela funciona como uma 
substituta ao inexistente comando ALTER VIEW e deve 
ser usada para alterar uma visão existente sem a 
necessidade de apagar e dar a permissão a privilégios
12 
Visão – CREATE VIEW 
 WITH READ ONLY: 
 especifica que os comandos DELETE, INSERT ou 
UPDATE não podem ser executados na visão
13 
Visão – CREATE VIEW 
 Considere a criação das tabelas Funcionario e 
Departamento e a inserção de dados nas 
mesmas
14 
Visão – CREATE VIEW 
DROP TABLE Funcionario CASCADE CONSTRAINT; 
DROP TABLE Departamento CASCADE CONSTRAINT; 
CREATE TABLE Departamento 
(Cod_Depto integer, 
Nome_Depto varchar(20), 
PRIMARY KEY(Cod_Depto)); 
CREATE TABLE Funcionario 
(Cod_Func integer, 
Nome_Func varchar(20), 
Salario integer, 
Cod_Depto integer, 
PRIMARY KEY(Cod_Func), 
FOREIGN KEY(Cod_Depto) REFERENCES Departamento (Cod_Depto));
15 
Visão – CREATE VIEW 
INSERT INTO Departamento VALUES (1, ’Marketing’); 
INSERT INTO Departamento VALUES (2, ’Vendas’); 
INSERT INTO Departamento VALUES (3, ’Dados’); 
INSERT INTO Departamento VALUES (4, ’Pesquisa’); 
INSERT INTO Funcionario VALUES (101, ’Joao da Silva’, 2000, 2); 
INSERT INTO Funcionario VALUES (102, ’Mario Souza’, 1500, 1); 
INSERT INTO Funcionario VALUES (103, ’Sergio Santos’, 2400, 2); 
INSERT INTO Funcionario VALUES (104, ’Maria Castro’, 1200, 1); 
INSERT INTO Funcionario VALUES (105, ’Marcio Santana’, 1400, 4);
16 
Visão – CREATE VIEW 
 Exemplo: 
CREATE OR REPLACE VIEW Funcionario_Depto AS 
SELECT F.Nome_Func, F.Salario, D.Nome_Depto 
FROM Funcionario F, Departamento D 
WHERE F.Cod_Depto = D.Cod_Depto 
WITH READ ONLY;
17 
Visão – CREATE VIEW 
 Uma visão pode ser visualizada por um select, 
da mesma forma que uma tabela: 
SELECT * 
FROM Funcionario_Depto;
18 
Visão – DROP VIEW
19 
Visão – DROP VIEW 
 Para eliminar uma visão, use o comando DROP 
VIEW seguido do nome dessa visão. As tabelas 
base não são afetadas por esse comando 
DROP VIEW nome da visão;
Visão – Alterando dados 
20
21 
Visão – Alterando dados 
 Uma visão que possua apenas colunas de uma 
tabela pode ser modificada sem restrições e, logo 
em seguida, exibidas na tabela base (desde que a 
visão não seja somente leitura)
22 
Visão – Alterando dados 
 Já uma visão composta por colunas de várias 
tabelas, pode ser modificada desde que o comando 
SELECT que a criou não possua: 
 operador DISTINCT; as funções AVG, COUNT, MAX, MIN, 
SUM; as operações UNION, INTERSECT, MINUS e as 
cláusulas GROUP BY, HAVING
23 
Visão – Alterando dados 
 Se essas restrições forem respeitadas, pode-se usar 
os comandos UPDATE, INSERT ou DELETE para 
modificar os dados de uma das tabelas base que a 
compõem
24 
Visão 
Visualizando as informações
Visão – Visualizando as informações 
 Algumas informações sobre as visões criadas são 
armazenadas em uma tabela de controle, 
atualizada automaticamente 
25 
 Essa tabela é a user_views
Visão – Visualizando as informações 
26 
 Para conhecer a definição dos dados da 
tabela user_views, utilize o comando 
describe 
DESCRIBE user_views;
Visão – Visualizando as informações 
27 
 Para ver as colunas nome e texto do comando 
que monta a visão, use as colunas view_name e 
text 
SELECT view_name, text 
FROM user_views;
28 
Visão Materializada
29 
Visão Materializada 
 As visões materializadas (materialized views) 
também são associadas a comandos SELECT, no 
entanto, seu conteúdo fica armazenado em uma 
tabela no banco de dados 
 Esse tipo de visão é aplicado a visões com comando 
SELECT de alta complexidade, degradando a 
performance das consultas
30 
Visão Materializada 
 As visões materializadas podem ser utilizadas com 
o objetivo de sumarizar e/ou pré-calcular dados 
com base em dados de outras tabelas 
 Esse uso é especialmente interessante em 
aplicações de Data Warehouse
Visões do Dicionário de Dados 
31 
 Dicionário de Dados é uma peça importante 
constituída de um conjunto de tabelas que 
fornecem informações sobre banco de dados 
 Todas essas tabelas são usadas apenas para 
leitura
Visões do Dicionário de Dados 
 Estas tabelas possuem informações do tipo: 
 Definições de todos os objetos de esquema do 
banco de dados, como tabelas, visões, 
procedures, triggers, dentre outras 
32 
 Os nomes dos usuários, os privilégios e os 
papéis de cada um
Visões do Dicionário de Dados 
 O dicionário de dados é uma peça vital para o 
funcionamento do Oracle 
 Durante sua operação, o Oracle lê o dicionário de 
dados para se assegurar de que os objetos do 
esquema existem e que os usuários possuem 
permissão para acessá-los 
33
Visões do Dicionário de Dados 
34 
 As visões do dicionário são identificadas por prefixos: 
 USER: visões do usuário 
 ALL: visões expandidas do usuário 
 DBA: visões do administrador do banco de dados
Visões do Dicionário de Dados 
35 
 Visões do tipo USER 
 As informações desse tipo são associadas a informações 
e objetos de um usuário 
 Por exemplo: para retornar todos os objetos de um 
usuário, deve ser usada a visão USER_OBJECTS: 
SELECT object_name, object_type 
FROM user_objects;
Visões do Dicionário de Dados 
36 
 Visões do tipo ALL 
 Essas visões permitem a visualização de informações 
expandidas do usuário, lhe dando a oportunidade de 
obter dados, dentro de suas permissões, sobre o banco 
de dados 
 Por exemplo: para visualizar todos os objetos dos quais 
o usuário possui permissão de acesso, deve ser usada a 
visão ALL_OBJECTS
Visões do Dicionário de Dados 
37 
 Visões do tipo DBA 
 As visões com esse prefixo mostram uma visão 
geral do banco de dados e devem ser 
consultadas, em teoria, apenas por DBA’s
Visões do Dicionário de Dados 
 A seguir, serão mostradas algumas visões 
presentes no dicionário de dados, sendo que cada 
uma contém informações detalhadas sobre cada 
um dos objetos já estudados 
38
Visões do Dicionário de Dados 
39 
Visão Finalidade 
ALL_OBJECTS, 
USER_OBJECTS 
Mostra todos os objetos do 
usuário 
ALL_CATALOG, 
USER_CATALOG 
Retorna o nome e o tipo dos 
objetos do usuário 
ALL_TABLES, USER_TABLES Retorna as tabelas do usuário 
ALL_TAB_COLUMNS, 
USER_TAB_COLUMNS 
Retorna informações sobre as 
colunas das tabelas do 
usuário
Visões do Dicionário de Dados 
40 
Visão Finalidade 
ALL_VIEWS, USER_VIEWS Retorna as visões do usuário 
ALL_TRIGGERS, 
USER_TRIGGERS 
Retorna as triggers do 
usuário 
ALL_PROCEDURES, 
USER_PROCEDURES 
Retorna as procedures do 
usuário
41 
Bibliografia 
 FANDERUFF, D. Dominando o Oracle 
9i: Modelagem e Desenvolvimento. São 
Paulo: Pearson Education do Brasil, 
2003. 
 RAMALHO, J. A. Oracle 9i. São Paulo: 
Berkeley Brasil, 2002
Universidade Presbiteriana Mackenzie 
42 
FIM !!! J 
Banco de Dados - Aula 14 
Texto original da 
Profa. Elisângela Botelho Gracias
Universidade Presbiteriana Mackenzie 
Banco de Dados II 
Introdução 
Jamilson Bispo dos Santos 
Faculdade de Computação e Informática
Tópicos Abordados 
• Reconhecimento de uma bloco PL/SQL e suas sessões 
• Descrever o significado das variáveis 
• Declarar variáveis PL/SQL 
• Executar um Bloco PL/SQL 
2
Bloco PL/SQL 
DECLARE 
Variáveis, cursores 
BEGIN 
comandos SQL 
comando PL/SQL 
EXCEPTION 
Ações quando ocorrer erro 
END; mandatório
Bloco PL/SQL 
DECLARE 
Variáveis, cursores 
BEGIN 
comandos SQL 
comando PL/SQL 
EXCEPTION 
Ações quando ocorrer erro 
END; mandatório
Bloco PL/SQL 
• Seção de declaração (Declare) 
• Contem todos as variáveis, constantes cursores e exceções 
definidas pelo usuário que são referenciadas na seção de 
execução 
• Seção de execução (Begin) 
• Contem os comando SQL para manipular os dados no banco de 
dados e os comando PL/SQL para manipular os dados no bloco 
• Seção de Exceções (Exception) 
• Especifica as ações a serem tomadas quando um erro ou uma 
condição anormal acontecer no seção de execução. 
<Título da Aula> 5
Executando um Bloco PL/SQL 
DECLARE 
v_table_name varchar(40); 
v_table_spacename varchar(40); 
BEGIN 
SELECT table_name, tablespace_name 
INTO v_table_name, v_table_spacename 
FROM user_tables 
where table_name = 'ALUNO' ; 
END;
Executando um Bloco PL/SQL 
DECLARE 
v_table_name varchar(40); 
v_table_spacename varchar(40); 
v_OutputStr varchar(200) := ''; 
BEGIN 
SELECT table_name, tablespace_name 
INTO v_table_name, v_table_spacename 
FROM user_tables 
where table_name = 'ALUNO' ; 
v_OutputStr := 'Bloco Anonimo '; 
DBMS_OUTPUT.PUT_LINE(v_OutputStr); 
v_OutputStr := 'Tabela '||v_table_name; 
DBMS_OUTPUT.PUT_LINE(v_OutputStr); 
v_OutputStr := 'Tablespace '||v_table_spacename; 
DBMS_OUTPUT.PUT_LINE(v_OutputStr); 
END;
Tipos de Bloco 
PROCEDURE name 
IS 
BEGIN 
EXCEPTIONS 
END; 
FUNCTION name 
IS 
BEGIN 
RETURN valor 
EXCEPTIONS 
END;
Construções 
Programas Descrição Disponivel 
Bloco Anonimo 
Bloco PL/SQL anonimos que são coocados dentro de uam aplicação ou 
executados interativamente 
Todos os ambiente PL/SQL 
Aplication Procedure ou 
functions Blocos PL/SQL armazenados no servidor Oracle Forms Developer ; 
podem aceirar parametros e podem ser invocados repetidamente pelo 
nome 
Oracle Forms Developer 
Stored Procedure ou 
Functions 
Blocos PL/SQL nomeados e armazenados no Oracle server; podem 
aceitar parametros e podem ser invocados repetidamente pelo nome 
Oracle Server 
Packages Modulos PL/SQL que agrupam procedures, functions e identificadores Oracle Server, Oracle Forms Developer 
Triggers Blocos BP/SQL que são associados com um tabela do banco de dados e 
são executadas automaticamente quando evento de atualização é 
executado 
Oracle Server 
Application Triggers Estão associados a um evento de um aplicativo e disparados 
automaticamente 
Oracle Server, Oracle Forms Developer 
Tipos de objetos Tipos de dados compostos definidos pelo usuario que encapsula uma 
estrutura de dados, juntamente com as funções e os procedimentos 
necessários para manipular os dados 
Oracle Server, Oracle Forms Developer
Variáveis 
• Variáveis podem ser usadas para: 
– Dados temporários 
– Manipulação de valores armazenados 
– Reusabilidade 
– Fácil manutenção 
<Título da Aula> 10
Variáveis 
• Variáveis podem ser usadas para: 
– Armazenamento temporários dos dados 
• Dados pode ser armazenados temporariamente em 
uma ou mais variáveis para serem utilizados na entrada 
dos dados e para serem processados depois. 
– Manipulação de valores armazenados 
• Variáveis podem ser usados para cálculos e 
manipulação de dados sem acesso ao banco de dados. 
<Título da Aula> 11
Variáveis 
• Variáveis podem ser usadas para: 
– Reusabilidade 
• Depois de serem declaradas as variáveis podem ser 
usadas repetidamente na aplicação simplesmente 
sendo referenciadas em outros comandos, incluindo 
outras comando de declaração 
– Fácil manutenção 
• Quando usar %TYPE e %ROWTYPE você declara 
variáveis com base na declaração da definição da 
coluna no banco de dados. Isto proporciona uma 
independência reduzindo custos de manutenção. 
<Título da Aula> 12
Manipulando Variáveis em PL/SQL 
• Declarar e inicializar variáveis na declaração da seção 
• Assinalar um novo valor para a variável na seção de execução 
• Passar valor através de parâmetro 
• Visualizar resultado através de variáveis de saída 
<Título da Aula> 13
Tipos de Variáveis 
• Variáveis PL/SQL 
– Escalar 
• Tipos escalares armazenam um valor único. Os tipo de dados 
principais são aqueles que correspondem ao tipos de colunas nas 
tabelas do banco de dados, inclusive valores booleanos. 
– Composite 
• Tipos de dados composite , como os registros, permitem que grupos 
de campos sejam definidos e manipulados no bloco PL/SQL. 
– Reference 
• Tipos de dados reference manipulam valores do tipo ponteiros 
– LOB 
• Tipo de dados que especificam a localização de objetos do tipo large 
<Título da Aula> 14
Tipos de Variáveis 
• Variáveis não PL/SQL 
– Variáveis não‐PL / SQL incluem variáveis declaras 
em uma linguagem hospedeira. 
<Título da Aula> 15
Declaração de Variáveis PL/SQL 
• Sintaxe: 
Identificador [constant] tipo de dados [NOT NULL] 
[:= | DEFAULT expr]; 
• Exemplos 
DECLARE 
v_data DATE: 
v_depto NUMBER(2) NOT NULL := 10; 
v_cidade VARCHAR2(20) := ‘São Paulo’; 
<Título da Aula> 16
Inicialização de Variáveis PL/SQL 
• Operador de atribuição (:=) 
• Palavra chave DEFAULT 
• Constrant NOT NULL 
Sintaxe 
identificador := expr; 
Exemplos 
v_data :=‘01‐JAN‐2014’; 
v_depto :=‘RH’; 
<Título da Aula> 17
Inicialização de Variáveis PL/SQL 
set serveroutput on size 4000 
DECLARE 
v_bonus number(8, 2); 
BEGIN 
SELECT salario * 0.10 
INTO v_bonus 
FROM funcionario 
WHERE cod_func = 101; 
DBMS_OUTPUT.PUT_LINE('BONUS '|| v_bonus); 
END;
Tipos de dados Escalar 
• CHAR [(tamanho máximo)] 
• VARCHAR2 (tamanho máximo) 
• LONG 
• LONG RAW 
• NUMBER [precisão, escala] 
• BINARY_INTEGER 
• PLS_INTEGER 
• BOOLEAN 
<Título da Aula> 19
Tipos escalares 
Tipo de Dado Descrição 
Char [(tamanho maximo)] Tipo básico para dados caracteres de no máximo 32.767 bytes. O valor default é 1. 
varchar2(tamanho maximo) Tipo básico para dados caracteres de tamanho variável de no máximo 32.767 bytes. 
LONG 
Tipo básico para dados caracteres de tamanho variável de no máximo 32.767 bytes. Usar o tipo LONG 
para armazenar strings de tamanho variável. 
LONG RAW Tipo básico para dados binários 
NUMBER [(PRECISÃO, ESCALA)] Tipo numerico com precisão p e escala s. A previsão p pode variar de 1 ate 38. A escala pode variar de ‐ 
84 ate 127 
BYNARY_INTEGER Tipo básico para inteiros entre ‐2.147.483.647 até 2.147.483.647 
PLS_INTEGER Tipo básico para inteiros entre ‐2.147.483.647 até 2.147.483.647. O tipo PLS_INTEGER reque menos 
memoria e é mais rápido do que variáveis NUMBER 
BOOLEN Tipo básico que armazena um dos três possíveis valores usados operações logicas: TRUE, FALSE ou 
NULL
Tipos escalares 
Tipo de Dado Descrição 
Char [(tamanho maximo)] Tipo básico para dados caracteres de no máximo 32.767 bytes. O valor default é 1. 
varchar2(tamanho maximo) Tipo básico para dados caracteres de tamanho variável de no máximo 32.767 bytes. 
LONG 
Tipo básico para dados caracteres de tamanho variável de no máximo 32.767 bytes. Usar o tipo LONG 
para armazenar strings de tamanho variável. 
LONG RAW Tipo básico para dados binários 
NUMBER [(PRECISÃO, ESCALA)] Tipo numerico com precisão p e escala s. A previsão p pode variar de 1 ate 38. A escala pode variar de ‐ 
84 ate 127 
BYNARY_INTEGER Tipo básico para inteiros entre ‐2.147.483.647 até 2.147.483.647 
PLS_INTEGER Tipo básico para inteiros entre ‐2.147.483.647 até 2.147.483.647. O tipo PLS_INTEGER reque menos 
memoria e é mais rápido do que variáveis NUMBER 
BOOLEN Tipo básico que armazena um dos três possíveis valores usados operações logicas: TRUE, FALSE ou 
NULL
Referencias bibliográficas 
• KORTH, H., SILBERSCHATZ, A., F., SUDARSHAN, 
S. Sistema de Bancos de Dados, 6 ed., 
Campus, 2006. 
• ELMASRI, R., NAVATHE, S. Sistemas de Banco 
de Dados. 6 ed., Pearson Addison‐Wesley, 
2005 
• DATE, C. J. Introdução a sistemas de banco de 
• dados. Rio de Janeiro: Editora Campus, 2004. 
22
Obrigado 
Profa. Elisângela Botelho Gracias 
elisangela.botelho@mackenzie.br 
Prof. Jamilson Bispo dos Santos 
jamilson.santos@mackenzie.br 
23
1 
Universidade Presbiteriana Mackenzie 
Banco de Dados – Aula 05 
Linguagem PL/SQL 
Prof. Jamilson Bispo dos Santos
2 
Roteiro da Apresentação 
 Introdução 
 Estrutura de um Bloco PL/SQL 
 Funcionamento do PL/SQL 
 Integrando SQL em um programa PL/SQL
3 
Roteiro da Apresentação 
 Introdução 
 Estrutura de um Bloco PL/SQL 
 Funcionamento do PL/SQL 
 Integrando SQL em um programa PL/SQL
4 
Introdução 
 PL/SQL (Program Languagem SQL) é uma 
extensão da linguagem SQL 
 Pode-se dizer que é um dialeto da linguagem SQL 
especializado no banco de dados Oracle 
 É uma linguagem procedural
5 
Introdução 
 Por meio da PL/SQL, pode-se criar objetos de 
esquema, tais como: 
 Stored procedures 
 Triggers
6 
Introdução 
 Stored procedures 
 Stored procedure, ou procedimento armazenado, é um 
programa PL/SQL que pode ser acionado por uma 
aplicação, por um trigger ou uma ferramenta Oracle
7 
Introdução 
 Triggers 
 É um programa PL/SQL armazenado no banco de dados 
e que é executado imediatamente antes ou após os 
comandos INSERT, UPDATE e DELETE 
 A diferença principal entre um trigger e uma procedure 
está no fato de que as procedures são executadas 
através de uma chamada feita pelo usuário, enquanto os 
triggers são acionados pelo banco de dados
8 
Roteiro da Apresentação 
 Introdução 
 Estrutura de um Bloco PL/SQL 
 Funcionamento do PL/SQL 
 Integrando SQL em um programa PL/SQL
9 
Estrutura de um Bloco PL/SQL 
 A linguagem PL/SQL utiliza o conceito de bloco 
estruturado 
 Um bloco PL/SQL é composto por procedures e 
funções 
 A estrutura de um bloco PL/SQL é composta por 
uma área de declaração, uma área de comandos e 
uma área de exceções
Estrutura de um Bloco PL/SQL 
10 
DECLARE 
declarações 
BEGIN 
estruturas executáveis (comandos) e outros blocos PL/SQL 
BEGIN 
EXCEPTION 
tratamento de exceções (pode conter outros blocos) 
END; 
END;
Estrutura de um Bloco PL/SQL 
11 
 Seção de declaração (DECLARE): todos os 
objetos são declarados 
 Seção de execução: os comandos PL/SQL são 
colocados 
 Seção de exceção (EXCEPTION): os erros 
são tratados
Estrutura de um Bloco PL/SQL 
12 
DECLARE 
qtdade_itens NUMBER(5); 
BEGIN 
SELECT quant INTO qtdade_itens 
FROM estoque 
WHERE produto = ‘raquete de tenis’ 
FOR UPDATE OF quant; 
IF (quant > 0) THEN 
UPDATE estoque 
SET quant = quant – 1 
WHERE (produto = ‘raquete de tenis’); 
INSERT 
INTO compras 
VALUES (‘raquete de tenis comprada’, sysdate); 
ELSE 
INSERT 
INTO compras 
VALUES (‘raquete de tenis em falta’, sysdate); 
END IF; 
END;
Estrutura de um Bloco PL/SQL 
13 
 O exemplo anterior faz o seguinte: 
 Cria uma variável chamada qtdade_itens, usada para 
armazenar a quantidade de itens disponível no estoque 
 Essa variável é preenchida com o conteúdo do campo 
quant da tabela estoque 
 Depois, através da estrutura IF ELSE, o campo quant é 
atualizado em função da disponibilidade de raquetes 
 Se houver disponibilidade, é criado um conteúdo para a 
tabela compras
Estrutura de um Bloco PL/SQL 
14 
 Seção de Declaração 
 Seção de Execução 
 Seção de Exceção
Estrutura de um Bloco PL/SQL 
15 
 Seção de Declaração 
 Seção de Execução 
 Seção de Exceção
16 
Seção de Declaração 
 A primeira seção do bloco PL/SQL, seção de 
Declaração, é opcional 
 Contudo, se o bloco usar variáveis ou constantes, 
todas elas devem ser previamente declaradas 
antes de serem utilizadas em comandos
17 
Seção de Declaração 
 Esta seção é iniciada pela palavra-chave DECLARE 
e o desenvolvedor pode realizar as seguintes 
tarefas: 
 Declarar o nome de um identificador 
 Declarar o tipo do identificador (constante ou variável) 
 Declarar o tipo de dado do identificador 
 Atribuir (inicializar) um conteúdo ao identificador
18 
Seção de Declaração 
Variáveis e Constantes 
 A linguagem PL/SQL permite a declaração de 
variáveis e constantes que podem ser usadas em 
comandos SQL contidos em procedures e funções 
 Todas as variáveis e constantes usadas devem ser 
previamente declaradas
19 
Seção de Declaração 
Variáveis e Constantes 
 As variáveis podem ter qualquer tipo de dado 
válido pela linguagem SQL e Oracle: 
 Char 
 Varchar2 
 Number 
 Date, etc. 
 Exemplo de declaração de uma variável: 
DECLARE 
qtdade_itens NUMBER(5);
20 
Seção de Declaração 
Variáveis e Constantes 
 A declaração de uma constante é parecida com a 
de uma variável, tendo apenas que adicionar a 
palavra-chave CONSTANT após o seu nome 
 Exemplo: 
DECLARE 
qtdade_itens NUMBER(5); 
valor_fixo CONSTANT NUMBER(9) := 40000;
Estrutura de um Bloco PL/SQL 
21 
 Seção de Declaração 
 Seção de Execução 
 Seção de Exceção
22 
Seção de Execução 
 A seção de execução do bloco PL/SQL é iniciada 
com a declaração BEGIN 
 Esta seção pode conter: 
 Comando SQL 
 Comandos de controles lógicos 
 Comandos de atribuição, dentre outros.
Estrutura de um Bloco PL/SQL 
23 
 Seção de Declaração 
 Seção de Execução 
 Seção de Exceção
24 
Seção de Exceção 
 Na seção de exceção do bloco PL/SQL, o 
desenvolvedor pode usar comandos para tratar um 
erro que eventualmente ocorra durante a execução 
de um programa PL/SQL 
 Pode-se criar uma rotina que execute 
procedimentos corretivos ao detectar um erro, 
evitando, assim, que o sistema fique interrompido
25 
Roteiro da Apresentação 
 Introdução 
 Estrutura de um Bloco PL/SQL 
 Funcionamento do PL/SQL 
 Integrando SQL em um programa PL/SQL
26 
Funcionamento do PL/SQL 
 O PL/SQL executa os comandos procedurais e 
repassa os comandos SQL para o servidor Oracle 
processar 
 A criação de blocos PL/SQL pode ser feita por meio 
de qualquer editor de texto 
 Para executar um programa ou um script PL/SQL 
pode-se utilizar o SQL*Plus ou SQL Worsheet, que 
permite criar, armazenar e executar blocos PL/SQL
27 
Funcionamento do PL/SQL 
 Como a maioria das linguagens procedurais, o 
PL/SQL possui comandos para controlar o fluxo de 
execução do programa 
 São eles que fazem a diferença, realizando 
desvios, analisando condições e permitindo a 
tomada de decisões
28 
Funcionamento do PL/SQL 
 As principais estruturas de controle do PL/SQL 
podem ser divididas em: 
 Estruturas de controles condicionais 
 Estruturas de controles seqüenciais 
 Estruturas de controles de repetição ou 
interação
29 
Funcionamento do PL/SQL 
Estruturas de Controle 
 Comando IF ... THEN 
 Comando LOOP 
 Comando FOR ... LOOP 
 Comando WHILE 
 Comando CASE
30 
Funcionamento do PL/SQL 
Estruturas de Controle 
 Comando IF ... THEN 
 Comando LOOP 
 Comando FOR ... LOOP 
 Comando WHILE 
 Comando CASE
31 
Estruturas de Controle 
Comando IF ... THEN 
 O comando IF ... THEN tem por função avaliar 
uma condição e executar uma ou mais linhas de 
comandos, somente se essa condição analisada for 
verdadeira 
 Esse comando possui 2 variações
32 
Estruturas de Controle 
Comando IF ... THEN 
 Sintaxe1 
IF <condição> THEN 
<comando1>; 
<comandoN>; 
END IF;
33 
Estruturas de Controle 
Comando IF ... THEN 
 Os comandos que se encontram entre a cláusula 
THEN e END IF serão executados apenas se a 
<condição> for verdadeira
34 
Estruturas de Controle 
Comando IF ... THEN 
 Exemplo: 
IF salario >= 5000 THEN 
UPDATE Empregado 
SET salario = salario * 1.2; 
END IF;
35 
Estruturas de Controle 
Comando IF ... THEN 
 Sintaxe2 
IF <condição> THEN 
<comando1>; 
ELSIF <condição2> THEN 
<comando2>; 
ELSIF <condição3> THEN 
<comando3>; 
ELSE 
<comando4>; 
END IF;
36 
Estruturas de Controle 
Comando IF ... THEN 
 Na estrutura da sintaxe2, mais de uma condição 
pode ser analisada e, conseqüentemente, diversas 
ações podem ser executadas 
 O PL/SQL usa a cláusula ELSIF, e não ELSEIF, 
como outras linguagens 
 Um comando pode ter inúmeras cláusulas ELSIF, 
mas pode possuir apenas uma cláusula ELSE
37 
Estruturas de Controle 
Comando IF ... THEN 
 Nesta estrutura, caso a condição principal for falsa, 
a primeira cláusula ELSIF será analisada e: 
 se for verdadeira, os comandos a seguir serão 
executados até que seja encontrada outra cláusula 
ELSIF ou ELSE 
 se for falsa, o programa testa a segunda, e assim 
sucessivamente. Ao encontrar uma condição verdadeira, 
são executados seus comandos, e o programa continua 
após a linha do comando END IF
38 
Estruturas de Controle 
Comando IF ... THEN 
 Exemplo: 
IF salario < 2000 THEN 
UPDATE Empregado SET salario = salario * 1.2; 
ELSIF salario < 3000 THEN 
UPDATE Empregado SET salario = salario * 1.3; 
ELSE 
UPDATE Empregado SET salario = salario * 1.4; 
END IF;
39 
Funcionamento do PL/SQL 
Estruturas de Controle 
 Comando IF ... THEN 
 Comando LOOP 
 Comando FOR ... LOOP 
 Comando WHILE 
 Comando CASE
40 
Estruturas de Controle 
Comando LOOP 
 O comando LOOP inicializa um grupo de comandos 
indefinidamente ou até que uma condição force a 
“quebra” do loop e desvie a execução do programa 
para outro lugar 
 Ele é usado em conjunto com o comando EXIT, 
responsável pela parada de execução do loop
41 
Estruturas de Controle 
Comando LOOP 
 Sintaxe 
LOOP 
<comandos> 
EXIT 
<comandos> 
END LOOP;
42 
Estruturas de Controle 
Comando LOOP 
 Sintaxe (outra versão) 
LOOP 
<comandos> 
EXIT WHEN <condição> 
<comandos> 
END LOOP;
43 
Estruturas de Controle 
Comando LOOP 
 Exemplo: 
I := 1; 
LOOP 
I := I + 1; 
<comandos> 
IF I >= 30 THEN 
EXIT; 
END IF; 
<comandos> 
END LOOP;
44 
Estruturas de Controle 
Comando LOOP 
 Exemplo (outra versão): 
I := 1; 
LOOP 
I := I + 1; 
<comandos> 
EXIT WHEN I >= 30; 
<comandos> 
END LOOP;
45 
Funcionamento do PL/SQL 
Estruturas de Controle 
 Comando IF ... THEN 
 Comando LOOP 
 Comando FOR ... LOOP 
 Comando WHILE 
 Comando CASE
46 
Estruturas de Controle 
Comando FOR ... LOOP 
 O comando FOR ... LOOP é uma variação do 
comando LOOP 
 Aqui os comandos são executados 
automaticamente até que uma condição avaliada 
retorne falsa
47 
Estruturas de Controle 
Comando FOR ... LOOP 
 Sintaxe 
FOR <contador> IN [REVERSE] <valor_inicial> .. 
<valor_final> 
LOOP 
<comandos> 
END LOOP;
48 
Estruturas de Controle 
Comando FOR ... LOOP 
 Exemplo: 
FOR j IN 1 .. 10 
LOOP 
<comandos> 
END LOOP;
49 
Estruturas de Controle 
Comando FOR ... LOOP 
 Neste exemplo, o comando FOR inicializa uma 
variável de controle chamada “j”, cujo valor 
inicial é 1 
 Os <comandos> serão executados até encontrar 
o END LOOP. Nesse momento, o controle volta 
para o comando FOR, que incrementa a variável 
e analisa a condição mestra, ou seja, se o valor 
de j é menor que o valor final
50 
Estruturas de Controle 
Comando FOR ... LOOP 
 A cláusula REVERSE faz com que o contador 
comece no valor mais alto e seja decrescido até 
atingir o valor mais baixo
51 
Funcionamento do PL/SQL 
Estruturas de Controle 
 Comando IF ... THEN 
 Comando LOOP 
 Comando FOR ... LOOP 
 Comando WHILE 
 Comando CASE
52 
Estruturas de Controle 
Comando WHILE 
 Outro controle de execução possível é o uso do 
comando WHILE 
 Essa estrutura analisa uma condição e, somente se 
ela for verdadeira, executa os comandos contidos 
dentro dessa estrutura
53 
Estruturas de Controle 
Comando WHILE 
 Sintaxe 
WHILE <condição> LOOP 
<comandos> 
END LOOP;
54 
Estruturas de Controle 
Comando WHILE 
 Exemplo: 
x := 1 
WHILE x < 20 LOOP 
<comandos> 
x := x+1; 
END LOOP;
55 
Funcionamento do PL/SQL 
Estruturas de Controle 
 Comando IF ... THEN 
 Comando LOOP 
 Comando FOR ... LOOP 
 Comando WHILE 
 Comando CASE
56 
Estruturas de Controle 
Comando CASE 
 O comando CASE permite avaliar uma expressão e 
retornar um resultado entre várias alternativas 
disponíveis
57 
Estruturas de Controle 
Comando CASE 
 Sintaxe 
CASE <expressão> 
WHEN <expressão1> THEN <resultado1> 
WHEN <expressão2> THEN <resultado2> 
... 
WHEN <expressãoN> THEN <resultadoN> 
[ELSE <resultadoN+1>] 
END;
58 
Estruturas de Controle 
Comando CASE 
 Exemplo: 
resultado := 
CASE nota 
WHEN ‘A’ THEN ‘Excelente’ 
WHEN ‘B’ THEN ‘Muito Bom’ 
WHEN ‘C’ THEN ‘Bom’ 
WHEN ‘D’ THEN ‘Razoável’ 
WHEN ‘E’ THEN ‘Fraco’ 
ELSE ‘Sem chance’ 
END;
59 
Roteiro da Apresentação 
 Introdução 
 Estrutura de um Bloco PL/SQL 
 Funcionamento do PL/SQL 
 Integrando SQL em um programa PL/SQL
60 
Integrando SQL em um 
programa PL/SQL 
 Comandos do tipo SQL podem ser inseridos 
dentro da seção de execução de um bloco PL/SQL 
e executados quase sem diferença 
 A maior novidade é que o desenvolvedor pode 
usar uma variável/constante declarada na seção 
de declaração 
 Com isso, além de usar o nome de colunas, o 
conteúdo de variáveis pode também ser 
manipulado pelos comandos SQL
61 
Integrando SQL em um 
programa PL/SQL 
 Criação da tabela Temp1 no seu esquema para 
utilizar as estruturas de controle e a criação de 
variáveis (utilize a Planilha do SQL*PLUS): 
CREATE TABLE Temp1 
(Codigo INTEGER, 
Data DATE, 
PRIMARY KEY(Codigo));
62 
Integrando SQL em um 
programa PL/SQL 
 Comando WHILE: 
DECLARE 
i int := 0; 
BEGIN 
WHILE i <= 10 LOOP 
INSERT 
INTO Temp1 (Codigo, Data) 
VALUES (i, sysdate); 
i := i + 1; 
END LOOP; 
END;
63 
Integrando SQL em um 
programa PL/SQL 
 Para ver o resultado utilize o comando 
SELECT: 
SELECT * 
FROM Temp1;
64 
Integrando SQL em um 
programa PL/SQL 
 Este próximo exemplo é bem semelhante ao 
anterior, só que é utilizado o comando FOR para 
executar o loop 
 Sua vantagem é que não é necessário controlar o 
incremento da variável de contador por meio da 
programação
65 
Integrando SQL em um 
programa PL/SQL 
 Comando FOR: 
DECLARE 
i int := 20; 
BEGIN 
FOR i IN 20 .. 30 LOOP 
INSERT 
INTO Temp1 (Codigo, Data) 
VALUES (i, sysdate); 
END LOOP; 
END;
66 
Integrando SQL em um 
programa PL/SQL 
 Para visualizar o resultado dos novos 
dados inseridos utilize o comando SELECT: 
SELECT * 
FROM Temp1 
WHERE (codigo > 10);
67 
Integrando SQL em um 
programa PL/SQL 
 Este exemplo utiliza o exemplo anterior, mas 
acrescenta um teste condicional 
 Ele insere apenas os registros cujo código seja 
múltiplo de 3 
 Para isso, utilize a função MOD
68 
Integrando SQL em um 
programa PL/SQL 
 Comando FOR e teste condicional: 
DECLARE 
i int := 40; 
BEGIN 
FOR i IN 40 .. 50 LOOP 
IF MOD(i,3) = 0 THEN 
INSERT 
INTO Temp1 (Codigo, Data) 
VALUES (i, sysdate); 
END IF; 
END LOOP; 
END;
69 
Integrando SQL em um 
programa PL/SQL 
 Para visualizar o resultado dos novos 
dados inseridos utilize o comando SELECT: 
SELECT * 
FROM Temp1 
WHERE (codigo >30);
70 
Integrando SQL em um 
programa PL/SQL 
 Este exemplo também utiliza o exemplo anterior, 
mas o comando IF tem uma cláusula ELSE 
 Se o valor de i for múltiplo de 3, o registro será 
inserido normalmente, com o valor de i e a data 
do sistema 
 Caso contrário, é feito um cálculo para que seja 
gravado o valor de i*5 no primeiro campo e a 
data do sistema somada ao valor de i no 
segundo campo
71 
Integrando SQL em um 
programa PL/SQL 
 Comando FOR e teste condicional com ELSE: 
DECLARE 
i int := 60; 
BEGIN 
FOR i IN 60 .. 70 LOOP 
IF MOD(i,3) = 0 THEN 
INSERT 
INTO Temp1 (Codigo, Data) 
VALUES (i, sysdate); 
ELSE 
INSERT 
INTO Temp1 (Codigo, Data) 
VALUES (i*5, sysdate+i); 
END IF; 
END LOOP; 
END;
72 
Integrando SQL em um 
programa PL/SQL 
 Para visualizar o resultado dos novos 
dados inseridos utilize o comando SELECT: 
SELECT * 
FROM Temp1 
WHERE (codigo>=60);
73 
Bibliografia 
 FANDERUFF, D. Dominando o Oracle 9i: 
Modelagem e Desenvolvimento. São 
Paulo: Pearson Education do Brasil, 2003. 
 RAMALHO, J. A. Oracle 9i. São Paulo: 
Berkeley Brasil, 2002
Universidade Presbiteriana Mackenzie 
74 
FIM !!! J 
Banco de Dados – Aula 11 
Linguagem PL/SQL 
Texto original da 
Profa. Elisângela Botelho Gracias
Universidade Presbiteriana Mackenzie 
1 
Banco de Dados - Aula 06 
Procedure 
Prof. Jamilson Bispo dos Santos
2 
Roteiro da Apresentação 
 Procedure 
 CREATE PROCEDURE 
 Excluindo uma Procedure
3 
Roteiro da Apresentação 
 Procedure 
 CREATE PROCEDURE 
 Excluindo uma Procedure
4 
Procedure 
 Conceito de Procedure 
 Uma stored procedure é um grupo de comandos 
SQL e PL/SQL que executam uma determinada 
tarefa
5 
Procedure 
 Ao contrário de um trigger, que é executado 
automaticamente quando um evento de disparo 
ocorre, uma procedure precisa ser chamada a 
partir de um programa ou ser executada 
manualmente pelo usuário
6 
Roteiro da Apresentação 
 Procedure 
 CREATE PROCEDURE 
 Excluindo uma Procedure
7 
CREATE PROCEDURE 
CREATE [OR REPLACE] PROCEDURE nome_da_procedure 
(Argumento1 modo Tipo_de_Dados, 
Argumento2 modo Tipo_de_Dados, 
ArgumentoN modo Tipo_de_Dados) 
IS 
variáveis locais, constantes, ... 
BEGIN 
Bloco PL/SQL 
END nome_da_procedure;
8 
CREATE PROCEDURE 
 OR REPLACE: recria uma procedure já existente, 
sem ter que eliminá-la 
 Argumento: é o nome da variável que será 
enviada ou retornada do ambiente chamador 
para a procedure e pode ser passada em um dos 
3 modos (IN, OUT, IN OUT)
9 
CREATE PROCEDURE 
 IN: especifica que se deve determinar um valor 
para o argumento quando o procedimento for 
chamado 
 OUT: especifica que o procedimento devolve um 
valor para esse argumento quando o procedimento 
for chamado 
 IN OUT: especifica que se deve determinar um 
valor para o argumento quando o procedimento 
for chamado, e que o procedimento devolve um 
valor ao seu ambiente de chamada após sua 
execução
10 
CREATE PROCEDURE 
 Tipo_de_dados: é o tipo de dado do argumento, 
que são especificados sem comprimento, precisão 
ou escala (por exemplo VARCHAR). O Oracle 
deriva o comprimento, precisão ou escala de um 
argumento do ambiente a partir do qual o 
procedimento é chamado
11 
CREATE PROCEDURE 
 BLOCO PL/SQL: é o bloco PL/SQL que o Oracle 
executa
12 
CREATE PROCEDURE 
 Exemplo1: 
 deseja-se criar uma procedure que aumente o 
salário de todos os empregados em 10% 
 para este exemplo crie a seguinte tabela 
Funcionarios com os atributos: Cod_func, 
Nome_Func, Salario e Cod_Depto (insira alguns 
dados nesta tabela)
13 
CREATE PROCEDURE 
CREATE TABLE Funcionarios 
(Cod_Func integer, 
Nome_Func varchar(20), 
Salario integer, 
Cod_Depto integer, 
PRIMARY KEY(Cod_Func)); 
INSERT INTO Funcionarios VALUES (1, ’Joao’, 2000, 2); 
INSERT INTO Funcionarios VALUES (2, ’Ana’, 2500, 1);
14 
CREATE PROCEDURE 
CREATE OR REPLACE PROCEDURE Aumento_Salario 
IS 
BEGIN 
UPDATE Funcionarios 
SET Salario = Salario * 1.1; 
END Aumento_Salario;
15 
CREATE PROCEDURE 
 A execução de uma procedure é feita por meio de 
uma chamada ao seu nome 
 Pode ser feita dentro de um trigger ou de outra 
procedure, bastando especificar o nome da 
procedure 
 A partir do SQL*Plus, uma procedure pode ser 
chamada por meio do comando EXECUTE 
 Exemplo: EXECUTE Aumento_Salario;
16 
CREATE PROCEDURE 
 Observe, agora, os dados da tabela Funcionarios 
SELECT * 
FROM Funcionarios;
17 
CREATE PROCEDURE 
 Exemplo2 (procedure com parâmetros): 
 deseja-se criar uma procedure que aumente os 
salários dos funcionários 
 só que desta vez os salários serão aumentados 
somente para os funcionários de um 
determinado departamento e com um 
percentual diferente
18 
CREATE PROCEDURE 
CREATE OR REPLACE PROCEDURE Aumento_Salario_Depto 
(vdepto IN Funcionarios.Cod_Depto%type, 
percentual number) 
IS 
BEGIN 
UPDATE Funcionarios 
SET Salario = Salario * (1 + percentual/100) 
WHERE (Cod_Depto = vdepto); 
END Aumento_Salario_Depto;
19 
CREATE PROCEDURE 
 Executando a procedure criada no exemplo2: 
 EXECUTE Aumento_Salario_Depto(1,20); 
 A execução desta procedure com os argumentos 
acima fará o seguinte: aumentará em 20% os 
salários dos empregados que são do 
departamento de código = 1
20 
CREATE PROCEDURE 
 Observe, novamente, como os dados dos 
funcionários cujo cod_depto = 1 foram atualizados: 
SELECT * 
FROM Funcionarios 
WHERE (Cod_depto = 1);
21 
Roteiro da Apresentação 
 Procedure 
 CREATE PROCEDURE 
 Excluindo uma Procedure
22 
Excluindo uma Procedure 
 Para excluir uma procedure deve ser usado o 
comando: 
 DROP PROCEDURE nome_da_procedure; 
 Exemplo: DROP PROCEDURE Aumenta_Salario;
23 
Bibliografia 
 FANDERUFF, D. Dominando o Oracle 9i: 
Modelagem e Desenvolvimento. São 
Paulo: Pearson Education do Brasil, 2003. 
 RAMALHO, J. A. Oracle 9i. São Paulo: 
Berkeley Brasil, 2002
Universidade Presbiteriana Mackenzie 
24 
FIM !!! J 
Banco de Dados - Aula 13 
Procedure 
Texto original da 
Profa. Elisângela Botelho Gracias
Universidade Presbiteriana Mackenzie 
Banco de Dados II - Aula 06 
Funções 
Profa. Elisângela Botelho Gracias 
Faculdade de Computação e Informática 
1
2 
Funções 
• Funções são subprogramas que tem por objetivo 
retornar algum resultado ou valor 
• A função pode ser invocada por meio de um 
comando SELECT e também usada em cálculos 
como outra função do Oracle (já que ela sempre 
retorna um valor)
3 
Funções 
• Uma função é muito parecida com uma stored 
procedure 
• A principal diferença entre ambas está no fato 
de que uma função, obrigatoriamente, deve 
retornar um valor por meio da cláusula RETURN
4 
CREATE FUNCTION 
CREATE [OR REPLACE] FUNCTION nome_da_funcao 
(Argumento1 IN Tipo_de_Dados, 
Argumento2 IN Tipo_de_Dados, 
ArgumentoN IN Tipo_de_Dados) 
RETURN Tipo_de_Dado 
IS 
declarações 
BEGIN 
Bloco PL/SQL 
END nome_da_funcao;
5 
CREATE FUNCTION 
• OR REPLACE: recria uma função já existente, sem ter 
que eliminá-la 
• Argumento: é o nome do argumento da função, ou 
seja, é o nome da variável que será enviada para a 
função. Nunca utilize para um argumento um nome 
de um atributo de uma tabela que esteja utilizando 
nesta função 
• IN: especifica que se deve determinar um valor para o 
argumento quando a função for chamada
6 
CREATE FUNCTION 
• Tipo_de_dados: é o tipo de dado do argumento, que 
são especificados sem comprimento, precisão ou escala 
(por exemplo: VARCHAR). O Oracle deriva o 
comprimento, precisão ou escala de um argumento do 
ambiente a partir do qual a função é utilizada 
– Uma outra forma de atribuir o tipo de dado a um 
argumento é herdar o tipo de dados de um atributo 
de uma tabela da seguinte maneira: 
nome_tabela.nome_atributo%type
7 
CREATE FUNCTION 
• RETURN Tipo_de_Dado: especifica o tipo de dado do 
valor de retorno da função 
• BLOCO PL/SQL: é o bloco PL/SQL que o Oracle executa
8 
CREATE FUNCTION 
Considere o seguinte Banco de Dados para os exemplos desta aula: 
Departamento = {Cod_Depto, Nome_Depto} 
Funcionario = {Cod_Func, Nome_Func, Salario, Cod_Depto} 
- Cod_depto é chave estrangeira que referencia o atributo 
Cod_depto da tabela Departamento 
Projeto = {Cod_Proj, Nome_Proj, Duracao} 
Func_Proj = {Cod_Func, Cod_Proj, Horas_Trab} 
- Cod_Func é chave estrangeira que referencia o atributo Cod_Func 
da tabela Funcionario 
- Cod_Proj é chave estrangeira que referencia o atributo Cod_Proj 
da tabela Projeto
9
10 
SELECT
11 
-- Script de Criação do BD Projeto 
DROP TABLE Func_Proj CASCADE CONSTRAINT; 
DROP TABLE Projeto CASCADE CONSTRAINT; 
DROP TABLE Funcionario CASCADE CONSTRAINT; 
DROP TABLE Departamento CASCADE CONSTRAINT; 
CREATE TABLE Departamento 
(Cod_Depto INTEGER, 
Nome_Depto VARCHAR(20) NOT NULL, 
PRIMARY KEY(Cod_Depto)); 
CREATE TABLE Funcionario 
(Cod_Func INTEGER, 
Nome_Func VARCHAR(20) NOT NULL, 
Salario INTEGER NOT NULL, 
Cod_Depto INTEGER NOT NULL, 
PRIMARY KEY(Cod_Func), 
FOREIGN KEY (Cod_Depto) REFERENCES Departamento (Cod_Depto)); 
CREATE TABLE Projeto 
(Cod_Proj INTEGER, 
Nome_Proj VARCHAR(20) NOT NULL, 
Duracao INTEGER NOT NULL, 
PRIMARY KEY(Cod_Proj)); 
CREATE TABLE Func_Proj 
(Cod_Func INTEGER, 
Cod_Proj INTEGER, 
Horas_Trab INTEGER, 
PRIMARY KEY(Cod_Func, Cod_Proj), 
FOREIGN KEY (Cod_Func) REFERENCES Funcionario(Cod_Func), 
FOREIGN KEY (Cod_Proj) REFERENCES Projeto(Cod_Proj));
12 
INSERT INTO Departamento (Cod_Depto, Nome_Depto) VALUES (1, 'Marketing'); 
INSERT INTO Departamento (Cod_Depto, Nome_Depto) VALUES (2, 'Vendas'); 
INSERT INTO Departamento (Cod_Depto, Nome_Depto) VALUES (3, 'Dados'); 
INSERT INTO Departamento (Cod_Depto, Nome_Depto) VALUES (4, 'Pesquisa'); 
INSERT INTO Funcionario (Cod_Func, Nome_Func, Salario, Cod_Depto) VALUES (101, 'Joao da Silva ', 2000, 2); 
INSERT INTO Funcionario (Cod_Func, Nome_Func, Salario, Cod_Depto) VALUES (102, 'Mario Souza', 1500, 1); 
INSERT INTO Funcionario (Cod_Func, Nome_Func, Salario, Cod_Depto) VALUES (103, 'Sergio Santos', 2400, 2); 
INSERT INTO Funcionario (Cod_Func, Nome_Func, Salario, Cod_Depto) VALUES (104, 'Maria Castro', 1200, 1); 
INSERT INTO Funcionario (Cod_Func, Nome_Func, Salario, Cod_Depto) VALUES (105, 'Marcio Santana', 1400, 4); 
INSERT INTO Projeto (Cod_Proj, Nome_Proj, Duracao) VALUES (1001, 'SistemaA', 2); 
INSERT INTO Projeto (Cod_Proj, Nome_Proj, Duracao) VALUES (1002, 'SistemaB', 6); 
INSERT INTO Projeto (Cod_Proj, Nome_Proj, Duracao) VALUES (1003, 'SistemaX', 4); 
INSERT INTO Func_Proj (Cod_Func, Cod_Proj, Horas_Trab) VALUES (101, 1001, 24); 
INSERT INTO Func_Proj (Cod_Func, Cod_Proj, Horas_Trab) VALUES (101, 1002, 160); 
INSERT INTO Func_Proj (Cod_Func, Cod_Proj, Horas_Trab) VALUES (102, 1001, 56); 
INSERT INTO Func_Proj (Cod_Func, Cod_Proj, Horas_Trab) VALUES (102, 1003, 45); 
INSERT INTO Func_Proj (Cod_Func, Cod_Proj, Horas_Trab) VALUES (103, 1001, 86); 
INSERT INTO Func_Proj (Cod_Func, Cod_Proj, Horas_Trab) VALUES (103, 1003, 64); 
INSERT INTO Func_Proj (Cod_Func, Cod_Proj, Horas_Trab) VALUES (104, 1001, 46); 
COMMIT;
13 
CREATE FUNCTION 
• Exemplo1: 
– deseja-se criar uma função que retorne a quantidade 
de funcionários de um determinado departamento 
– para isso, a função receberá como argumento o 
código do departamento que será totalizado
14 
CREATE FUNCTION 
CREATE OR REPLACE FUNCTION Total_Emp_Depto 
(vdepto IN Funcionario.Cod_Depto%type) 
RETURN INTEGER 
IS 
emptotal INTEGER; 
BEGIN 
SELECT COUNT(*) INTO emptotal 
FROM Funcionario 
WHERE (Cod_Depto = vdepto); 
RETURN emptotal; 
END Total_Emp_Depto;
15 
CREATE FUNCTION 
CREATE OR REPLACE FUNCTION Total_Emp_Depto 
(vdepto IN Funcionario.Cod_Depto%type) 
RETURN INTEGER 
IS 
emptotal INTEGER; 
BEGIN 
SELECT COUNT(*) INTO emptotal 
FROM Funcionario 
WHERE (Cod_Depto = vdepto); 
RETURN emptotal; 
END Total_Emp_Depto; 
Não se esquecer de 
retornar o valor da 
função
16 
CREATE FUNCTION 
• Se a função não foi compilada com sucesso 
(corretamente) ou contém erros, pode-se utilizar 
o seguinte comando para que o Oracle aponte o 
erro: SHOW ERRORS;
17 
CREATE FUNCTION 
• No exemplo anterior, é inserido apenas o código do 
departamento como argumento da função 
• Em seguida, é especificado que a função retorna um 
dado do tipo integer 
• É criada uma variável chamada emptotal, que receberá 
o total de funcionários do departamento
18 
Utilizando uma Função 
• Para exibir o resultado de uma função, deve-se utilizar o 
comando SELECT, especificando o nome da função que 
está sendo pesquisada na tabela DUAL (que é uma 
tabela do sistema), juntamente com o(s) valor(es) do(s) 
argumento(s) da função 
• Exemplo: 
SELECT Total_Emp_Depto(1) 
FROM DUAL;
19 
CREATE FUNCTION 
• Exemplo2: 
– deseja-se criar uma função que retorne o total gasto 
em salário pago aos funcionários de um 
determinado departamento (será passado o nome 
do departamento) 
– para isso, a função receberá como argumento o 
nome do departamento que deseja-se saber o total 
gasto com salário pago aos funcionários
20 
CREATE FUNCTION 
CREATE OR REPLACE FUNCTION Total_Salario_Depto 
(ndepto IN Departamento.Nome_Depto%type) 
RETURN INTEGER 
IS 
total INTEGER; 
BEGIN 
SELECT SUM(F.Salario) INTO total 
FROM Funcionario F INNER JOIN Departamento D 
ON (F.Cod_Depto = D.Cod_Depto) 
WHERE (D.Nome_Depto = ndepto) ; 
RETURN total; 
END Total_Salario_Depto;
CREATE FUNCTION 
CREATE OR REPLACE FUNCTION Total_Salario_Depto 
(ndepto IN Departamento.Nome_Depto%type) 
RETURN INTEGER 
IS 
total INTEGER; 
BEGIN 
SELECT SUM(F.Salario) INTO total 
FROM Funcionario F INNER JOIN Departamento D 
ON (F.Cod_Depto = D.Cod_Depto) 
WHERE (D.Nome_Depto = ndepto) ; 
RETURN total; 
END Total_Salario_Depto; 
21
22 
CREATE FUNCTION 
• No exemplo anterior, é inserido apenas o nome do 
departamento como argumento da função 
• Em seguida, é especificado que a função retorna um 
dado do tipo INTEGER 
• É criada uma variável chamada total, que receberá a 
soma dos salários pagos em um determinado 
departamento
Utilizando uma Função 
• É possível utilizar a função criada em uma consulta, como, por 
exemplo: selecione o nome de cada departamento e o total 
gasto em salário em cada departamento, mas retorne somente 
os departamentos que gastam mais que o departamento de 
‘Marketing’. 
SELECT D.Nome_Depto, SUM(F.Salario) 
FROM Funcionario F INNER JOIN Departamento D 
ON (F.Cod_Depto = D.Cod_Depto) 
GROUP BY D.Nome_Depto 
HAVING SUM(F.Salario) > Total_Salario_Depto ('Marketing'); 
23
Executando uma Função 
• É possível utilizar a função criada em uma consulta, como, por 
exemplo: selecione o nome de cada departamento e o total 
Utilizando a função 
gasto em salário em cada departamento, mas retorne somente 
Total_Salario_Depto, 
os departamentos que gastam mais que o departamento de 
criada anteriormente, 
‘Marketing’. 
SELECT D.Nome_Depto, SUM(na F.consulta 
Salario) 
FROM Funcionario F INNER JOIN Departamento D 
ON (F.Cod_Depto = D.Cod_Depto) 
GROUP BY D.Nome_Depto 
HAVING SUM(F.Salario) > Total_Salario_Depto ('Marketing'); 
24
25 
Excluindo uma Função 
• Para excluir uma função deve ser usado: 
DROP FUNCTION nome_da_funcao; 
• Exemplo: DROP FUNCTION Total_Salario_Depto;
26 
EXERCÍCIO RESOLVIDO 
• Crie uma função que retorne o quanto um 
funcionário irá receber pelo número de horas 
trabalhadas, considerando que serão passados, 
como argumentos, o nome do funcionário e o 
valor de cada hora trabalhada
27 
CREATE OR REPLACE FUNCTION Total_Pago 
(nfunc IN VARCHAR, 
valor IN INTEGER) 
RETURN INTEGER 
IS 
total INTEGER; 
vcodfunc INTEGER; 
BEGIN 
SELECT Cod_Func INTO vcodfunc 
FROM Funcionario 
WHERE (Nome_Func = nfunc) ; 
SELECT SUM(Horas_Trab) * valor INTO total 
FROM Func_Proj 
WHERE (Cod_Func = vcodfunc ) ; 
RETURN total; 
END Total_Pago;
28 
CREATE OR REPLACE FUNCTION Total_Pago 
(nfunc IN VARCHAR, 
valor IN INTEGER) 
RETURN INTEGER 
IS 
total INTEGER; 
vcodfunc INTEGER; 
BEGIN 
SELECT Cod_Func INTO vcodfunc 
FROM Funcionario 
WHERE (Nome_Func = nfunc) ; 
SELECT SUM(Horas_Trab) * valor INTO total 
FROM Func_Proj 
WHERE (Cod_Func = vcodfunc ) ; 
RETURN total; 
END Total_Pago; 
Argumentos da função 
Tipo de dado que será retornado 
Variáveis locais 
SELECT para retornar o 
código do funcionário 
Retorno do 
valor da função 
SELECT para retornar 
o total a ser pago ao 
funcionário
29 
EXERCÍCIO RESOLVIDO 
• Para exibir o resultado de uma função, deve-se utilizar o 
comando SELECT na tabela Dual: 
SELECT Total_Pago('Mario Souza', 50) 
FROM DUAL;
30 
EXERCÍCIOS 
1) Crie uma função que retorne o nome do departamento 
que um determinado funcionário pertence, considerando 
que será passado, como argumento, somente o nome do 
funcionário. 
1) Crie uma função que retorne o total de horas utilizadas 
pelos funcionários em um determinado projeto, 
considerando que será passado, como argumento, 
somente o nome do projeto.
31 
Bibliografia 
• FANDERUFF, D. Dominando o Oracle 9i: 
Modelagem e Desenvolvimento. São 
Paulo: Pearson Education do Brasil, 2003. 
• RAMALHO, J. A. Oracle 9i. São Paulo: 
Berkeley Brasil, 2002
Obrigado 
Profa. Elisângela Botelho Gracias 
elisangela.botelho@mackenzie.br 
32
Universidade Presbiteriana Mackenzie 
Banco de Dados II - Aula 07 
Trigger 
Profa. Elisângela Botelho Gracias 
Faculdade de Computação e Informática 
1
2 
Roteiro da Apresentação 
• Trigger 
• CREATE TRIGGER 
• Alteração de um trigger 
• Ativação/Desativação de um trigger 
• Exclusão de um trigger
3 
Roteiro da Apresentação 
• Trigger 
• CREATE TRIGGER 
• Alteração de um trigger 
• Ativação/Desativação de um trigger 
• Exclusão de um trigger
4 
Trigger 
• Conceito de Triggers 
– São blocos PL/SQL disparados automaticamente e 
implicitamente sempre que ocorre um evento 
associado a uma tabela ou visão (INSERT, UPDATE ou 
DELETE)
5 
Trigger 
• O nome trigger, que significa gatilho em inglês, traduz 
bem o seu funcionamento 
• Ele é disparado quando os comando INSERT, UPDATE 
ou DELETE são executados 
• A principal aplicação de um trigger é a criação de 
consistências e restrições de acesso ao banco de dados
6 
Trigger 
• Os triggers podem ser utilizados para: 
– Implementação de regras de negócios 
– Geração de valores calculados 
– Manutenção da integridade referencial dos dados 
– Replicação de dados 
– Manutenção de registro histórico de alterações ocorridas 
no banco de dados
7 
Trigger 
• Os triggers podem ser utilizados para (continuação): 
– Criar o conteúdo de uma coluna derivada de outras 
colunas 
– Criar mecanismos de validação que envolvam pesquisas 
em múltiplas tabelas 
– Atualizar outras tabelas em função de inclusão ou 
alteração da tabela atual, etc.
8 
Trigger 
• Um trigger está associado a uma tabela e, em alguns 
casos, a uma visão 
• Quando uma visão é utilizada, os triggers da tabela 
base são normalmente acionados
9 
Trigger 
• Um trigger pode fazer o papel de uma restrição 
(constraint) para forçar alguma regra de integridade 
• Mas se uma tarefa puder ser feita tanto com triggers 
quanto com uma restrição já implementada no banco, 
use a restrição como primeira opção
Trigger 
• Os triggers, neste caso, deveriam ser usados apenas 
quando uma regra de integridade referencial não puder 
ser executada usando as restrições conhecidas, como: 
– NOT NULL, PRIMARY KEY, FOREIGN KEY, etc. 
10
Trigger 
• Os triggers oferecem um mecanismo poderoso para 
tratar as alterações em um banco de dados, mas eles 
devem ser usados com muito cuidado 
• Isso porque o efeito de vários triggers pode ser muito 
complexo e a execução de um trigger pode ativar outro 
trigger, e este ativa o trigger anterior novamente, 
gerando uma recursão 
11
12 
Trigger 
• Tempo do trigger: 
– O tempo do trigger indica quando ele será disparado 
em relação à execução do evento 
– Os tempos podem ser BEFORE (antes do evento) ou 
AFTER (depois do evento)
13 
Trigger 
• Evento de disparo do trigger: 
– O evento de disparo indica qual a operação de 
manipulação de dados efetuada sobre uma tabela 
(ou visão) que vai disparar o trigger 
– Os eventos de disparo podem ser: INSERT, UPDATE 
ou DELETE
14 
Trigger 
• O tipo de trigger indica quantas vezes ele poderá ser 
disparado em uma tabela 
– Comando: associada ao comando como um todo, é 
acionada antes ou depois de um evento 
– Linha: acionada uma vez para cada linha afetada 
pelo evento ao qual o trigger estiver associado
15 
Trigger 
• Regras para a criação de triggers: 
– O número máximo de triggers possíveis para uma 
tabela é doze, ou seja, todas as combinações 
possíveis entre tempos, eventos de disparo e tipos 
de triggers 
– Não é permitida a criação de triggers com o mesmo 
tempo, evento de disparo e tipo de trigger para 
uma mesma tabela (ou visão)
16 
Roteiro da Apresentação 
• Trigger 
• CREATE TRIGGER 
• Alteração de um trigger 
• Ativação/Desativação de um trigger 
• Exclusão de um trigger
17 
CREATE TRIGGER 
CREATE [OR REPLACE] TRIGGER nome_da_trigger 
BEFORE/AFTER 
DELETE OR INSERT OR UPDATE [OF nome_coluna1, 
nome_coluna2, ...] 
ON nome_da_tabela 
[FOR EACH ROW] 
[REFERENCING, OLD AS nome NEW AS nome] 
[WHEN condição] 
BLOCO PL/SQL
18 
CREATE TRIGGER 
• OR REPLACE: recria um trigger já existente, sem ter que 
eliminá-lo 
• BEFORE: faz o Oracle disparar o trigger antes de 
executar o comando de disparo 
• AFTER: faz o Oracle disparar o trigger após a execução 
do comando de disparo
19 
CREATE TRIGGER 
• DELETE: faz o Oracle disparar o trigger sempre que um 
comando DELETE eliminar uma linha da tabela 
• INSERT: faz o Oracle disparar o trigger sempre que um 
comando INSERT adicionar uma linha à tabela 
• UPDATE: faz o Oracle disparar o trigger sempre que um 
comando UPDATE alterar um valor em uma das colunas 
especificadas na cláusula OF. Se não for especificado 
nenhum atributo, sempre que ocorrer qualquer 
atualização, o trigger será disparado
20 
CREATE TRIGGER 
• ON: especifica o nome da tabela (ou visão) 
• REFERENCING: especifica nomes de correlação 
• FOR EACH ROW: designa um trigger como um trigger 
de linha. O Oracle dispara um trigger de linha para cada 
linha que for afetada por um comando de disparo
21 
CREATE TRIGGER 
• WHEN: utilizada para restringir as linhas que irão 
disparar o trigger (ou seja, uma condição que precisa 
ser atendida para o Oracle disparar o trigger) 
• BLOCO PL/SQL: é o bloco PL/SQL que o Oracle executa
22 
CREATE TRIGGER 
• Referências aos valores dos atributos da tabela 
que disparou o trigger, dentro de um trigger: 
– Dentro de um trigger é possível acessar o valor de 
um atributo de uma linha, podendo-se obter tanto o 
valor antigo (:old) quanto o novo valor (:new) 
– Para o comando INSERT, os valores dos atributos que 
serão gravados devem ser precedidos por 
:new.nome_do_atributo
CREATE TRIGGER 
• Referências aos valores dos atributos da tabela 
que disparou o trigger, dentro de um trigger: 
– Para o comando DELETE, os valores dos atributos da 
linha que está sendo processada devem ser 
precedidos por :old.nome_do_atributo 
– Para o comando UPDATE, o valor original que está 
gravado é acessado por :old.nome_do_atributo e os 
novos valores que serão gravados devem ser 
precedidos por :new.nome_do_atributo 
23
24 
CREATE TRIGGER 
• Dentro dos triggers são disponibilizados 
predicados para testar o evento que dispara o 
trigger e realizar uma ação de acordo com cada 
um deles. Esses predicados são: 
– inserting: retorna true se o trigger foi disparado por 
um comando INSERT 
– updating: retorna true se o trigger foi disparado por 
um comando UPDATE 
– deleting: retorna true se o trigger foi disparado por 
um comando DELETE
25 
CREATE TRIGGER 
Considere o seguinte Banco de Dados para os exemplos desta aula: 
Departamento = {Cod_Depto, Nome_Depto} 
Funcionario = {Cod_Func, Nome_Func, Salario, Cod_Depto} 
- Cod_depto é chave estrangeira que referencia o atributo 
Cod_depto da tabela Departamento 
Projeto = {Cod_Proj, Nome_Proj, Duracao} 
Func_Proj = {Cod_Func, Cod_Proj, Horas_Trab} 
- Cod_Func é chave estrangeira que referencia o atributo Cod_Func 
da tabela Funcionario 
- Cod_Proj é chave estrangeira que referencia o atributo Cod_Proj 
da tabela Projeto
26
27 
CREATE TRIGGER 
• Inicialmente, este banco de dados está vazio, 
mas ao longo desta aula iremos inserir dados 
para observar o comportamento dos triggers 
que serão criados
28 
-- Script de Criação do BD Projeto 
DROP TABLE Func_Proj CASCADE CONSTRAINT; 
DROP TABLE Projeto CASCADE CONSTRAINT; 
DROP TABLE Funcionario CASCADE CONSTRAINT; 
DROP TABLE Departamento CASCADE CONSTRAINT; 
CREATE TABLE Departamento 
(Cod_Depto INTEGER, 
Nome_Depto VARCHAR(20) NOT NULL, 
PRIMARY KEY(Cod_Depto)); 
CREATE TABLE Funcionario 
(Cod_Func INTEGER, 
Nome_Func VARCHAR(20) NOT NULL, 
Salario INTEGER NOT NULL, 
Cod_Depto INTEGER NOT NULL, 
PRIMARY KEY(Cod_Func), 
FOREIGN KEY (Cod_Depto) REFERENCES Departamento (Cod_Depto)); 
CREATE TABLE Projeto 
(Cod_Proj INTEGER, 
Nome_Proj VARCHAR(20) NOT NULL, 
Duracao INTEGER NOT NULL, 
PRIMARY KEY(Cod_Proj)); 
CREATE TABLE Func_Proj 
(Cod_Func INTEGER, 
Cod_Proj INTEGER, 
Horas_Trab INTEGER, 
PRIMARY KEY(Cod_Func, Cod_Proj), 
FOREIGN KEY (Cod_Func) REFERENCES Funcionario(Cod_Func), 
FOREIGN KEY (Cod_Proj) REFERENCES Projeto(Cod_Proj));
29 
CREATE TRIGGER 
• Crie mais uma tabela, Criacao_Depto, que será 
utilizada no próximo exemplo1 de trigger: 
CREATE TABLE Criacao_Depto( 
Cod_Depto INTEGER, 
Nome_Depto VARCHAR(40), 
Dt_criacao DATE, 
PRIMARY KEY(Cod_Depto));
30 
CREATE TRIGGER 
• Exemplo1: 
– deseja-se criar um trigger que será disparado 
quando um novo departamento for inserido 
– quando este evento ocorrer, o trigger deverá inserir 
uma nova linha na tabela Criacao_Depto com o 
código e nome do novo departamento e a data que 
ele foi inserido no banco de dados
31 
CREATE TRIGGER 
CREATE OR REPLACE TRIGGER Depto_Criacao 
AFTER 
INSERT 
ON Departamento 
FOR EACH ROW 
BEGIN 
INSERT 
INTO Criacao_Depto(Cod_depto,Nome_Depto,Dt_criacao) 
VALUES (:new.Cod_Depto,:new.Nome_Depto,sysdate); 
END;
32 
CREATE TRIGGER 
CREATE OR REPLACE TRIGGER Depto_Criacao 
AFTER 
INSERT 
Novo valor do código 
Novo valor do nome do 
do departamento que 
departamento que 
ON Departamento 
acabou de ser 
acabou de ser inserido 
FOR EACH ROW 
inserido na tabela 
na tabela 
Departamento 
Departamento 
BEGIN 
INSERT 
INTO Criacao_Depto(Cod_depto,Nome_Depto,Dt_criacao) 
VALUES (:new.Cod_Depto,:new.Nome_Depto,sysdate); 
END;
33 
CREATE TRIGGER 
• Se o trigger não for compilado com sucesso 
(corretamente) ou contém erros, pode-se utilizar 
o seguinte comando, para que o Oracle aponte o 
erro: SHOW ERRORS;
34 
CREATE TRIGGER 
• Se você inserir um novo departamento na tabela 
Departamento, observe o que acontecerá com a 
tabela Criacao_Depto!! 
• Será que o trigger criado realmente está 
funcionando?
35 
CREATE TRIGGER 
• Insira um novo departamento na tabela 
Departamento: 
INSERT 
INTO Departamento (Cod_Depto,Nome_Depto) 
VALUES (5, 'Desenvolvimento');
36 
CREATE TRIGGER 
• Observe, agora, os dados inseridos na tabela 
Criacao_Depto pelo trigger: 
SELECT * 
FROM Criacao_Depto;
37 
CREATE TRIGGER 
• Crie as tabelas Total_Horas e Historico_Salario que serão 
utilizadas no próximo exemplo2 : 
CREATE TABLE Total_Horas ( 
Cod_Func INTEGER, 
Total INTEGER, 
PRIMARY KEY(Cod_Func)); 
CREATE TABLE Historico_Salario ( 
Cod_Func INTEGER, 
Salario_Antigo INTEGER, 
Salario_Atual INTEGER, 
PRIMARY KEY(Cod_Func, Salario_Antigo, Salario_Atual));
38 
CREATE TRIGGER 
• Exemplo2: 
– crie um trigger que deverá ser disparado quando um novo 
funcionário for inserido ou quando o salário for atualizado 
– se um novo funcionário for inserir, esse trigger deverá inserir 
uma nova linha na tabela Total_Horas com o código do 
funcionário e zero para o total de horas, já que ele acabou de 
ser inserido no banco de dados
39 
CREATE TRIGGER 
• Exemplo2: 
– se o salário do funcionário for atualizado, esse trigger deverá 
inserir uma nova linha na tabela Historio_Salario com o 
código do funcionário, o valor do salário antes da atualização 
e o novo salário (após a atualização)
40 
CREATE TRIGGER 
CREATE OR REPLACE TRIGGER Insere_Func 
BEFORE 
INSERT OR UPDATE OF Salario 
ON Funcionario 
FOR EACH ROW 
BEGIN 
IF inserting THEN 
INSERT 
INTO Total_Horas (Cod_Func, Total) 
VALUES (:new.Cod_func, 0); 
ELSIF updating THEN 
INSERT 
INTO Historico_Salario (Cod_Func, Salario_Antigo, Salario_Atual) 
VALUES (:old.Cod_func, :old.Salario, :new.Salario); 
END IF; 
END;
41 
CREATE TRIGGER 
CREATE OR REPLACE TRIGGER Insere_Func 
BEFORE 
INSERT OR UPDATE OF Salario 
ON Funcionario 
FOR EACH ROW 
BEGIN 
IF inserting THEN 
INSERT 
INTO Total_Horas (Cod_Func, Total) 
VALUES (:new.Cod_func, 0); 
ELSIF updating THEN 
INSERT 
INTO Historico_Salario (Cod_Func, Salario_Antigo, Salario_Atual) 
VALUES (:old.Cod_func, :old.Salario, :new.Salario); 
END IF; 
END; 
O trigger vai ser disparado somente 
quando houver a inserção de um 
funcionário ou a atualização do 
salário na tabela Funcionario 
Se o trigger foi disparado pela 
inserção, uma nova linha será 
inserida na tabela Total_Horas 
Se o trigger foi disparado pela 
atualização do salário, uma nova 
linha será inserida na tabela 
Historico_Salario
42 
CREATE TRIGGER 
• Se você inserir um ou mais funcionários na 
tabela Funcionário, observe o que acontecerá 
com a tabela Total_Horas!!! 
• Será que o trigger criado realmente está 
funcionando?
43 
CREATE TRIGGER 
• Insira alguns departamentos e, logo após, alguns 
funcionários: 
INSERT INTO Departamento (Cod_Depto, Nome_Depto) VALUES (1, 'Marketing'); 
INSERT INTO Departamento (Cod_Depto, Nome_Depto) VALUES (2, 'Vendas'); 
INSERT INTO Departamento (Cod_Depto, Nome_Depto) VALUES (3, 'Dados'); 
INSERT INTO Departamento (Cod_Depto, Nome_Depto) VALUES (4, 'Pesquisa'); 
INSERT INTO Funcionario (Cod_Func, Nome_Func, Salario, Cod_Depto) VALUES (101, 'Joao da Silva ', 2000, 2); 
INSERT INTO Funcionario (Cod_Func, Nome_Func, Salario, Cod_Depto) VALUES (102, 'Mario Souza', 1500, 1); 
INSERT INTO Funcionario (Cod_Func, Nome_Func, Salario, Cod_Depto) VALUES (103, 'Sergio Santos', 2400, 2); 
INSERT INTO Funcionario (Cod_Func, Nome_Func, Salario, Cod_Depto) VALUES (104, 'Maria Castro', 1200, 1); 
INSERT INTO Funcionario (Cod_Func, Nome_Func, Salario, Cod_Depto) VALUES (105, 'Marcio Santana', 1400, 4);
44 
CREATE TRIGGER 
• Observe, agora: 
– os dados inseridos na tabela Criacao_Depto devido 
ao trigger do exemplo1 
SELECT * 
FROM Criacao_Depto; 
– os dados inseridos na tabela Total_Horas pelo trigger 
criado anteriormente 
SELECT * 
FROM Total_Horas;
45 
CREATE TRIGGER 
• Atualize o salário de algum funcionário: 
UPDATE Funcionario 
SET Salario = 7000 
WHERE (Cod_Func = 103); 
• Observe, agora, os dados inseridos na tabela 
Historico_Salario devido ao trigger criado anteriormente: 
SELECT * 
FROM Historico_Salario;
46 
CREATE TRIGGER 
• Crie a tabela Qtdade_Func que será utilizada no 
próximo exemplo3 de trigger: 
CREATE TABLE Qtdade_Func ( 
Cod_Proj INTEGER, 
Qtdade INTEGER, 
PRIMARY KEY(Cod_Proj) 
);
47 
CREATE TRIGGER 
• Exemplo3: 
– crie um trigger que deverá ser disparado quando um novo 
projeto for inserido 
– esse trigger deverá inserir uma nova linha na tabela 
Qtdade_Func com o código do projeto e zero para o total de 
funcionários, já que ele acabou de ser inserido no banco de 
dados
48 
CREATE TRIGGER 
CREATE OR REPLACE TRIGGER Insere_Proj 
AFTER 
INSERT 
ON Projeto 
FOR EACH ROW 
BEGIN 
INSERT 
INTO Qtdade_Func (Cod_Proj, Qtdade) 
VALUES (:new.Cod_proj, 0); 
END;
49 
CREATE TRIGGER 
• Se você inserir um ou mais projetos na tabela 
Projeto, observe o que acontecerá com a tabela 
Qtdade_Func!!! 
• Será que o trigger criado realmente está 
funcionando?
50 
CREATE TRIGGER 
• Insira alguns projetos: 
INSERT INTO Projeto (Cod_Proj, Nome_Proj, Duracao) VALUES (1001, 'SistemaA', 2); 
INSERT INTO Projeto (Cod_Proj, Nome_Proj, Duracao) VALUES (1002, 'SistemaB', 6); 
INSERT INTO Projeto (Cod_Proj, Nome_Proj, Duracao) VALUES (1003, 'SistemaX', 4);
51 
CREATE TRIGGER 
• Observe, agora, os dados inseridos na tabela 
Qtdade_Func devido ao trigger criado anteriormente: 
SELECT * 
FROM Qtdade_Func;
52 
CREATE TRIGGERE 
• Exemplo4: 
– deseja-se criar um trigger que deve ser disparado 
quando uma nova linha for inserida na tabela 
Func_Proj
53 
CREATE TRIGGERE 
• Exemplo4: 
– se for inserida uma nova linha, então o trigger deve: 
• atualizar o atributo Total da tabela Qtdade_Func em 
mais 1, para aquele código de projeto inserido 
• a mesma coisa deve ser feita para a tabela Total_Horas, 
ou seja, atualizar a quantidade total de horas que 
aquele funcionário trabalhou nos projetos
54 
CREATE TRIGGER 
CREATE OR REPLACE TRIGGER Atualiza_Qtdade 
AFTER 
INSERT 
ON Func_Proj 
FOR EACH ROW 
BEGIN 
UPDATE Total_Horas 
SET Total = Total + :new.Horas_Trab 
WHERE (Cod_Func = :new.Cod_Func); 
UPDATE Qtdade_Func 
SET Qtdade = Qtdade + 1 
WHERE (Cod_Proj = :new.Cod_Proj); 
END;
55 
CREATE TRIGGER 
• Se você inserir uma linha ou mais na tabela 
Func_Proj, observe o que acontecerá com as 
tabelas Qtdade_Func e Total_Horas!!! 
• Será que o trigger criado realmente está 
funcionando?
56 
CREATE TRIGGER 
• Insira algumas linhas na tabela Func_Proj: 
INSERT INTO Func_Proj (Cod_Func, Cod_Proj, Horas_Trab) VALUES (101, 1001, 24); 
INSERT INTO Func_Proj (Cod_Func, Cod_Proj, Horas_Trab) VALUES (101, 1002, 160); 
INSERT INTO Func_Proj (Cod_Func, Cod_Proj, Horas_Trab) VALUES (102, 1001, 56); 
INSERT INTO Func_Proj (Cod_Func, Cod_Proj, Horas_Trab) VALUES (102, 1003, 45); 
INSERT INTO Func_Proj (Cod_Func, Cod_Proj, Horas_Trab) VALUES (103, 1001, 86); 
INSERT INTO Func_Proj (Cod_Func, Cod_Proj, Horas_Trab) VALUES (103, 1003, 64); 
INSERT INTO Func_Proj (Cod_Func, Cod_Proj, Horas_Trab) VALUES (104, 1001, 46);
57 
CREATE TRIGGER 
• Observe, agora, os dados inseridos nas tabelas 
Total_Horas e Qtdade_Func pelo trigger: 
SELECT * 
FROM Total_Horas; 
SELECT * 
FROM Qtdade_Func;
58 
Roteiro da Apresentação 
• Trigger 
• CREATE TRIGGER 
• Alteração de um trigger 
• Ativação/Desativação de um trigger 
• Exclusão de um trigger
59 
Alteração de um Trigger 
• Um trigger não pode ser alterado diretamente 
• Para alterá-lo, deve-se recriá-lo com o comando CREATE 
OR REPLACE TRIGGER 
• Se esse trigger teve privilégios concedidos para outros 
usuários, eles permanecem válidos enquanto o trigger 
existir (mesmo que ele tenha sido recriado)
60 
Roteiro da Apresentação 
• Trigger 
• CREATE TRIGGER 
• Alteração de um trigger 
• Ativação/Desativação de um trigger 
• Exclusão de um trigger
Ativação/Desativação de um Trigger 
• Quando um trigger é criado, ele fica automaticamente 
ativo 
• Para desativar a execução do trigger, deve-se utilizar o 
comando ALTER TRIGGER com a cláusula DISABLE e para 
reativá-lo, a cláusula ENABLE 
• Sintaxe: 
61 
ALTER TRIGGER nome_trigger DISABLE/ENABLE;
62 
Roteiro da Apresentação 
• Trigger 
• CREATE TRIGGER 
• Alteração de um trigger 
• Ativação/Desativação de um trigger 
• Exclusão de um trigger
63 
Exclusão de um Trigger 
• Para excluir um trigger, deve ser usado o comando 
DROP TRIGGER nome_do_trigger; 
• Esse comando remove a estrutura do trigger e retira os 
privilégios concedidos a outros usuários
64 
Exclusão de um Trigger 
• Para visualizar os triggers criados por um 
usuário, use a visão user_triggers do dicionário 
de dados 
SELECT TRIGGER_NAME 
FROM user_triggers; 
SELECT TRIGGER_NAME, TRIGGER_BODY 
FROM user_triggers;
65 
SELECT
66 
Bibliografia 
• FANDERUFF, D. Dominando o Oracle 9i: 
Modelagem e Desenvolvimento. São 
Paulo: Pearson Education do Brasil, 2003. 
• RAMALHO, J. A. Oracle 9i. São Paulo: 
Berkeley Brasil, 2002
Obrigado 
Profa. Elisângela Botelho Gracias 
elisangela.botelho@mackenzie.br 
67
Universidade Presbiteriana MMaacckkeennzziiee 
BBaannccoo ddee DDaaddooss 
CCCCuuuurrrrssssoooorrrr -- CCCCoooonnnnttttrrrroooolllleeee ddddeeee PPPPrrrroooocccceeeessssssssaaaammmmeeeennnnttttoooo 
JJaammiillssoonn BBiissppoo ddooss SSaannttooss 
Faculdade de Computação e Informática 
São Paulo, 01 de fevereiro de 2011
Controle de Processamento 
• Introdução 
• Cursor explicito 
• Cursor implícito 
Controle de Processamento 2
Introdução 
• Oracle aloca uma área de memória conhecida 
como área de contexto para processar uma 
instrução SQL 
• Cursor é um handle ou uumm ppoonntteeiirroo ppaarraa aa 
área de contexto 
• Com o cursor um programa PL/SQL pode 
controlar a área de contexto 
Controle de Processamento 3
Introdução 
• TIPOS DE CURSORES 
– Explícitos 
–– IImmppllíícciittooss 
Controle de Processamento 4
Introdução 
• Oracle usa cursores implícitos para analisar e 
executar os comandos SQL 
• Cursores explícitos são declarados 
explicitamente ppeelloo pprrooggrraammaaddoorr 
Controle de Processamento 5
Introdução 
• Usando atributos do cursor SQL, você pode 
testar o resultado de suas instruções SQL 
SQL%ROWCOUNT Numero de linhas afetadas pelo 
ultimo comando SQL 
SQL%FOUND Boolean que informa se alguma 
linha foi afetada ultimo comando 
SQL 
SQL%NOTFOUND Boolean que informa se nenhuma 
de linhas afetada pelo ultimo 
comando SQL 
SQL%ISOPEN Boolean que informa se o cursor 
esta aberto 
Controle de Processamento 6
Introdução 
SET SERVEROUTPUT ON 4000 
CREATE OR REPLACE PROCEDURE Aumento_Salario 
IS 
v_linhas_atualizadas VARCHAR2(40); 
BEGIN 
UPDATE Funcionarios 
SET Salario = Salario * 1.1; 
v_linhas_atualizadas:=(SQL%ROWCOUNT||' linhas atualizadas '); 
dbms_output.put_line(v_linhas_atualizadas); 
END Aumento_Salario; 
EXEC Aumento_Salario; 
Controle de Processamento 7
Cursor Explicito 
• Consulta que retornam nenhum ou mais de 
uma linha 
• Cursor deve ser declarado explicitamente na 
áárreeaa ddee ddeeccllaarraaççõõeess 
• Não pode ter o mesmo nome da tabela 
Controle de Processamento 8
Cursor Explicito 
• PROCESSAMENTO DE CURSOR EXPLICITO 
– Declarar o cursor 
– Abrir o cursor 
– Buscar os resultados nas vvaarriiáávveeiiss ddee PPLL//SSQQLL 
– Processar a(s) linha (s) 
– Fechar o cursor 
Controle de Processamento 9
Cursor Explicito 
• FUNCIONAMENTO DO CURSOR 
Teste 
fim 
dados 
Declare Open Fetch Close 
Controle de Processamento 10 
Cria uma 
SQL área 
Identifica o 
grupo de 
dados 
Acessa 
cada linha 
Testa fim de 
linhas 
existentes 
Libera o 
grupo de 
dados
Cursor Explicito 
• DECLARANDO O CURSOR 
CURSOR <nome do cursor> is <comando select> 
– Não incluir a clausula INTO no select 
Controle de Processamento 11
Cursor Explicito 
DECLARE 
CURSOR funcionario_cursor IS 
SELECT nome_func, salario FROM Funcionarios; 
CURSOR funcionario_cursor_01 IS 
SELECT * FROM Funcionarios; 
BEGIN 
Controle de Processamento 12
Cursor Explicito 
• ABRINDO O CURSOR 
OPEN <nome do cursor>; 
– Abrir o cursor para executar o select 
– Caso não retorne linha, nenhum exceção será informada 
– Utilizar os atributos do cursor depois do Fetch 
Controle de Processamento 13
Cursor Explicito 
• Buscando dados do Cursor 
FETCH <nome do cursor> INTO 
variavel1, variavel2 ,.. | <nome registro> 
– Recupera os valores da linha corrente 
– Teste se o cursor contem linhas 
– Nome do registro pode ser recuperado utilizando %ROWTYPE 
Controle de Processamento
Cursor Explicito 
set serveroutput on 
DECLARE 
v_cod_func Funcionarios.cod_func%TYPE; 
v_nome_func Funcionarios.nome_func%TYPE; 
v_salario Funcionarios.salario% TYPE; 
CURSOR funcionario_cursor IS 
SELECT cod_func, nome_func, salario FROM Funcionarios; 
BEGIN 
OPEN funcionario_cursor; 
FOR i IN 1..2 LOOP 
FETCH funcionario_cursor INTO 
v_cod_func, v_nome_func, v_salario; 
DBMS_OUTPUT.PUT_LINE(TO_CHAR(v_cod_func)||' '|| 
v_nome_func||' '|| 
v_salario); 
Controle de Processamento 15 
END LOOP; 
END;
Cursor Explicito 
• Buscando dados do Cursor 
FETCH <nome do cursor> INTO 
variavel1, variavel2 ,.. || <<nnoommee rreeggiissttrroo>> 
EXIT WHEN <condição>; 
Controle de Processamento
Cursor Explicito 
set serveroutput on 
DECLARE 
v_cod_func Funcionarios.cod_func%TYPE; 
v_nome_func Funcionarios.nome_func%TYPE; 
v_salario Funcionarios.salario% TYPE; 
CURSOR funcionario_cursor IS 
SELECT cod_func, nome_func, salario FROM Funcionarios; 
BEGIN 
OPEN funcionario_cursor; 
LOOP 
FETCH funcionario_cursor INTO 
v_cod_func, v_nome_func, v_salario; 
EXIT WHEN funcionario_cursor%NOTFOUND; 
DBMS_OUTPUT.PUT_LINE(TO_CHAR(v_cod_func)||' '|| 
v_nome_func||' '|| 
v_salario); 
Controle de Processamento 17 
END LOOP; 
END;
Cursor Explicito 
• Usando atributos do cursor explicito, você 
pode testar o resultado de suas instruções SQL 
%ROWCOUNT Numero de linhas afetadas pelo 
ultimo comando SQL 
%FOUND Boolean que informa se alguma 
linha foi afetada ultimo comando 
SQL 
%NOTFOUND Boolean que informa se nenhuma 
de linhas afetada pelo ultimo 
comando SQL 
%ISOPEN Boolean que informa se o cursor 
esta aberto 
Controle de Processamento 18
Cursor Explicito 
• Uso do atributo %ISOPEN 
– Verificar se o cursor esta aberto antes de executar 
o FETCH 
– Se o cursor não o estiver aabbeerrttoo oo FFEETTCCHH nnããoo 
funciona 
Controle de Processamento
Cursor Explicito 
set serveroutput on 
DECLARE 
v_cod_func Funcionarios.cod_func%TYPE; 
v_nome_func Funcionarios.nome_func%TYPE; 
v_salario Funcionarios.salario% TYPE; 
CURSOR funcionario_cursor IS 
SELECT cod_func, nome_func, salario FROM Funcionarios; 
BEGIN 
IF NOT funcionario_cursor%ISOPEN THEN 
OPEN funcionario_cursor; 
END IF; 
LOOP 
FETCH funcionario_cursor INTO 
v_cod_func, v_nome_func, v_salario; 
EXIT WHEN funcionario_cursor%NOTFOUND; 
DBMS_OUTPUT.PUT_LINE(TO_CHAR(v_cod_func)||' '|| 
v_nome_func||' '|| 
v_salario); 
Controle de Processamento 20 
END LOOP; 
END;
Cursor Explicito 
• Registro e cursor 
set serveroutput on 
DECLARE 
CURSOR funcionario_cursor IS 
SELECT cod_func, nome_func, salario FROM Funcionarios; 
func_registro funcionario_cursor%ROWTYPE; 
BEGIN 
IF NOT funcionario_ccuurrssoorr%%IISSOOPPEENN TTHHEENN 
OPEN funcionario_cursor; 
END IF; 
LOOP 
FETCH funcionario_cursor INTO func_registro; 
EXIT WHEN funcionario_cursor%NOTFOUND; 
DBMS_OUTPUT.PUT_LINE(TO_CHAR(func_registro.cod_func)||' '|| 
func_registro.nome_func||' '|| 
func_registro.salario); 
END LOOP; 
CLOSE funcionario_cursor; 
END; 
Controle de Processamento 21
Cursor Explicito 
• FOR LOOP 
FOR <nome do registro> IN <nome do cursor> 
LOOP 
<comandos> 
END LOOP; 
– Registro é declarado implicitamente 
– Open, fetch e close do cursor realizados implicitamente 
Controle de Processamento 22
Cursor Explicito 
set serveroutput on 
DECLARE 
CURSOR funcionario_cursor IS 
SELECT cod_func, nome_func, salario FROM Funcionarios; 
func_registro funcionario_cursor%ROWTYPE; 
BEGIN 
FOR func_registro IN funcionario_ccuurrssoorr LLOOOOPP 
DBMS_OUTPUT.PUT_LINE(TO_CHAR(func_registro.cod_func)||' '|| 
func_registro.nome_func||' '|| 
func_registro.salario); 
END LOOP; 
END; 
Controle de Processamento 23
Cursor Explicito 
• FECHANDO O CURSOR 
CLOSE <nome do cursor>; 
– Fechar o cursor sempre depois de completar o 
processamento das linhas 
Controle de Processamento 24
Bibliografia 
• Oracle 9i Programação PL/SQL 
– Scott Urman, Ed. Campus 
• Dominando oo OOrraaccllee 99ii 
– Damaris Fanderuff, Ed. Pearson 
Controle de Processamento 25
Obrigado 
Jamilson BBiissppoo ddooss SSaannttooss 
jamilson@mackenzie.br 
26
Universidade Presbiteriana Mackenzie 
Package 
Jamilson Bispo dos Santos 
Faculdade de Computação e Informática 
São Paulo, 14 de Novembro de 2009
Tópicos Abordados 
• Introdução 
• Criação de Packages 
• Utilização de Packages 
• Exclusão de Packages 
<Título da Aula> 2
Introdução 
• Conceito 
Áreas de armazenamento de sub-programa, 
constantes e variáveis 
• Composto 
Especificação 
Corpo 
3
Introdução 
• Especificação 
Interface com a aplicação 
Declaração de tipos de variáveis, 
constantes, exceções, cursores 
• Corpo 
Define cursor e sub programa 
4
Introdução 
5
Introdução 
Escopo da Construção Descrição Colocação dentro do pacote 
Publico Pode ser referenciada a 
partir de qualquer 
ambiente de servidor 
Oracle 
Declarados dentro da 
especificação do pacote e 
pode ser definida dentro do 
corpo do pacote 
Privado Pode ser referenciado 
apenas por outras 
construções que fazem 
parte do mesmo pacote 
Declarada e definida dentro 
do corpo do pacote 
6
Introdução 
Visibilidade Construção Descrição 
Local Uma variável definida dentro de um subprograma que 
não é visível para usuários externos 
Privado (local para o pacote) variável: você pode definir 
variável em um corpo 
do pacote. Estas variáveis podem ser 
acessadass somente por outros objetos no mesmo 
pacote. Eles não são visíveis para quaisquer 
subprogramas ou objetos fora do pacote 
Global Uma variável ou subprograma que pode ser 
referenciado (e alterada) fora do pacote e é visível aos 
usuários externos. Itens globais do pacote devem ser 
declarados na especificação do pacote. 
7
Introdução 
Restrições 
• Não chamar um pacote dentro de outro pacote; 
• Pacote não pode receber parâmetros, somente as 
rotinas declaradas; 
• Variáveis Bind não pode ser utilizada por pacotes; 
• Não utilizar variáveis definidas dentro do pacote; 
• Pacote não pode ser chamado diretamente, 
utilizar script onde utilize as rotinas do pacote. 
8
Criação da Especificação do Package 
CREATE [ OR REPLACE] PACKAGE nome_package 
IS | AS 
tipo publico, declaração de itens 
especificação de subprogramas 
END nome_package 
9
jahundredsound
jahundredsound
jahundredsound
jahundredsound
jahundredsound
jahundredsound
jahundredsound
jahundredsound
jahundredsound

Mais conteúdo relacionado

Semelhante a jahundredsound

Sql02
Sql02Sql02
Sql02
Tecksantos
 
Aula 5 - Programação 1
Aula 5 - Programação 1Aula 5 - Programação 1
Aula 5 - Programação 1
Isaac Barros
 
Estruturas em C++ (struct)
Estruturas em C++ (struct)Estruturas em C++ (struct)
Estruturas em C++ (struct)
Márcio Rizzatto
 
SQL - Operações Relacionais
SQL - Operações RelacionaisSQL - Operações Relacionais
SQL - Operações Relacionais
Mariana Hiyori
 
3º Fast Show - SQL Analytics
3º Fast Show - SQL Analytics3º Fast Show - SQL Analytics
3º Fast Show - SQL Analytics
qualidatavix
 
Projeto Integrador 2
Projeto Integrador 2Projeto Integrador 2
Projeto Integrador 2
r7c4rd0
 
Sql - Comandos dml do mysql - parte 1
Sql - Comandos dml do mysql - parte 1Sql - Comandos dml do mysql - parte 1
Sql - Comandos dml do mysql - parte 1
Arley Rodrigues
 
Aula02_Vars_Ident_Ent_Saida_Algoritmos.pptx
Aula02_Vars_Ident_Ent_Saida_Algoritmos.pptxAula02_Vars_Ident_Ent_Saida_Algoritmos.pptx
Aula02_Vars_Ident_Ent_Saida_Algoritmos.pptx
aronoliveira3
 
Fundamentos de Programação
Fundamentos de ProgramaçãoFundamentos de Programação
Fundamentos de Programação
Diego Silveira Costa Nascimento
 
Manual 2 Excel.pdf
Manual 2 Excel.pdfManual 2 Excel.pdf
Manual 2 Excel.pdf
ssuser7bf558
 
Principais instruções em sql
Principais instruções em sqlPrincipais instruções em sql
Principais instruções em sql
Charleston Anjos
 
Aula 23 - Excel 2010
Aula 23 - Excel 2010Aula 23 - Excel 2010
Aula 23 - Excel 2010
Renan Oliveira Baptista
 
MYSQL - TLBDII
MYSQL - TLBDIIMYSQL - TLBDII
C#4 - Parte 2 - COM interop e variância
C#4 - Parte 2 - COM interop e variânciaC#4 - Parte 2 - COM interop e variância
C#4 - Parte 2 - COM interop e variância
Giovanni Bassi
 
BD I - Aula 14 A - Limitando Conj Dados e Sub Selects
BD I - Aula 14 A - Limitando Conj Dados e Sub SelectsBD I - Aula 14 A - Limitando Conj Dados e Sub Selects
BD I - Aula 14 A - Limitando Conj Dados e Sub Selects
Rodrigo Kiyoshi Saito
 
Beljug2010
Beljug2010Beljug2010
Beljug2010
UFPA
 
Linguagem c parte 2
Linguagem c parte 2Linguagem c parte 2
Linguagem c parte 2
Mauro Pereira
 
Aula 2 - Programação 1
Aula 2 - Programação 1Aula 2 - Programação 1
Aula 2 - Programação 1
Isaac Barros
 
Tema 7 a_dicionario_de_dados_arvore_e_ta
Tema 7 a_dicionario_de_dados_arvore_e_taTema 7 a_dicionario_de_dados_arvore_e_ta
Tema 7 a_dicionario_de_dados_arvore_e_ta
Pedro A. Uamusse
 
Aula01
Aula01Aula01
Aula01
vdlos
 

Semelhante a jahundredsound (20)

Sql02
Sql02Sql02
Sql02
 
Aula 5 - Programação 1
Aula 5 - Programação 1Aula 5 - Programação 1
Aula 5 - Programação 1
 
Estruturas em C++ (struct)
Estruturas em C++ (struct)Estruturas em C++ (struct)
Estruturas em C++ (struct)
 
SQL - Operações Relacionais
SQL - Operações RelacionaisSQL - Operações Relacionais
SQL - Operações Relacionais
 
3º Fast Show - SQL Analytics
3º Fast Show - SQL Analytics3º Fast Show - SQL Analytics
3º Fast Show - SQL Analytics
 
Projeto Integrador 2
Projeto Integrador 2Projeto Integrador 2
Projeto Integrador 2
 
Sql - Comandos dml do mysql - parte 1
Sql - Comandos dml do mysql - parte 1Sql - Comandos dml do mysql - parte 1
Sql - Comandos dml do mysql - parte 1
 
Aula02_Vars_Ident_Ent_Saida_Algoritmos.pptx
Aula02_Vars_Ident_Ent_Saida_Algoritmos.pptxAula02_Vars_Ident_Ent_Saida_Algoritmos.pptx
Aula02_Vars_Ident_Ent_Saida_Algoritmos.pptx
 
Fundamentos de Programação
Fundamentos de ProgramaçãoFundamentos de Programação
Fundamentos de Programação
 
Manual 2 Excel.pdf
Manual 2 Excel.pdfManual 2 Excel.pdf
Manual 2 Excel.pdf
 
Principais instruções em sql
Principais instruções em sqlPrincipais instruções em sql
Principais instruções em sql
 
Aula 23 - Excel 2010
Aula 23 - Excel 2010Aula 23 - Excel 2010
Aula 23 - Excel 2010
 
MYSQL - TLBDII
MYSQL - TLBDIIMYSQL - TLBDII
MYSQL - TLBDII
 
C#4 - Parte 2 - COM interop e variância
C#4 - Parte 2 - COM interop e variânciaC#4 - Parte 2 - COM interop e variância
C#4 - Parte 2 - COM interop e variância
 
BD I - Aula 14 A - Limitando Conj Dados e Sub Selects
BD I - Aula 14 A - Limitando Conj Dados e Sub SelectsBD I - Aula 14 A - Limitando Conj Dados e Sub Selects
BD I - Aula 14 A - Limitando Conj Dados e Sub Selects
 
Beljug2010
Beljug2010Beljug2010
Beljug2010
 
Linguagem c parte 2
Linguagem c parte 2Linguagem c parte 2
Linguagem c parte 2
 
Aula 2 - Programação 1
Aula 2 - Programação 1Aula 2 - Programação 1
Aula 2 - Programação 1
 
Tema 7 a_dicionario_de_dados_arvore_e_ta
Tema 7 a_dicionario_de_dados_arvore_e_taTema 7 a_dicionario_de_dados_arvore_e_ta
Tema 7 a_dicionario_de_dados_arvore_e_ta
 
Aula01
Aula01Aula01
Aula01
 

Último

PowerPoint Newton gostava de Ler - Saber em Gel.pdf
PowerPoint Newton gostava de Ler - Saber em Gel.pdfPowerPoint Newton gostava de Ler - Saber em Gel.pdf
PowerPoint Newton gostava de Ler - Saber em Gel.pdf
1000a
 
Leonardo da Vinci .pptx
Leonardo da Vinci                  .pptxLeonardo da Vinci                  .pptx
Leonardo da Vinci .pptx
TomasSousa7
 
Pintura Romana .pptx
Pintura Romana                     .pptxPintura Romana                     .pptx
Pintura Romana .pptx
TomasSousa7
 
atividade 8º ano entrevista - com tirinha
atividade 8º ano entrevista - com tirinhaatividade 8º ano entrevista - com tirinha
atividade 8º ano entrevista - com tirinha
Suzy De Abreu Santana
 
Forças e leis de Newton 2024 - parte 1.pptx
Forças e leis de Newton 2024 - parte 1.pptxForças e leis de Newton 2024 - parte 1.pptx
Forças e leis de Newton 2024 - parte 1.pptx
Danielle Fernandes Amaro dos Santos
 
“A classe operária vai ao paraíso os modos de produzir e trabalhar ao longo ...
“A classe operária vai ao paraíso  os modos de produzir e trabalhar ao longo ...“A classe operária vai ao paraíso  os modos de produzir e trabalhar ao longo ...
“A classe operária vai ao paraíso os modos de produzir e trabalhar ao longo ...
AdrianoMontagna1
 
Redação e Leitura_7º ano_58_Produção de cordel .pptx
Redação e Leitura_7º ano_58_Produção de cordel .pptxRedação e Leitura_7º ano_58_Produção de cordel .pptx
Redação e Leitura_7º ano_58_Produção de cordel .pptx
DECIOMAURINARAMOS
 
A QUESTÃO ANTROPOLÓGICA: O QUE SOMOS OU QUEM SOMOS.pdf
A QUESTÃO ANTROPOLÓGICA: O QUE SOMOS OU QUEM SOMOS.pdfA QUESTÃO ANTROPOLÓGICA: O QUE SOMOS OU QUEM SOMOS.pdf
A QUESTÃO ANTROPOLÓGICA: O QUE SOMOS OU QUEM SOMOS.pdf
AurelianoFerreirades2
 
O que é um Ménage a Trois Contemporâneo .pdf
O que é um Ménage a Trois Contemporâneo .pdfO que é um Ménage a Trois Contemporâneo .pdf
O que é um Ménage a Trois Contemporâneo .pdf
Pastor Robson Colaço
 
1_10_06_2024_Criança e Cultura Escrita, Ana Maria de Oliveira Galvão.pdf
1_10_06_2024_Criança e Cultura Escrita, Ana Maria de Oliveira Galvão.pdf1_10_06_2024_Criança e Cultura Escrita, Ana Maria de Oliveira Galvão.pdf
1_10_06_2024_Criança e Cultura Escrita, Ana Maria de Oliveira Galvão.pdf
SILVIAREGINANAZARECA
 
Caderno de Resumos XVIII ENPFil UFU, IX EPGFil UFU E VII EPFEM.pdf
Caderno de Resumos XVIII ENPFil UFU, IX EPGFil UFU E VII EPFEM.pdfCaderno de Resumos XVIII ENPFil UFU, IX EPGFil UFU E VII EPFEM.pdf
Caderno de Resumos XVIII ENPFil UFU, IX EPGFil UFU E VII EPFEM.pdf
enpfilosofiaufu
 
Folheto | Centro de Informação Europeia Jacques Delors (junho/2024)
Folheto | Centro de Informação Europeia Jacques Delors (junho/2024)Folheto | Centro de Informação Europeia Jacques Delors (junho/2024)
Folheto | Centro de Informação Europeia Jacques Delors (junho/2024)
Centro Jacques Delors
 
Rimas, Luís Vaz de Camões. pptx
Rimas, Luís Vaz de Camões.          pptxRimas, Luís Vaz de Camões.          pptx
Rimas, Luís Vaz de Camões. pptx
TomasSousa7
 
Egito antigo resumo - aula de história.pdf
Egito antigo resumo - aula de história.pdfEgito antigo resumo - aula de história.pdf
Egito antigo resumo - aula de história.pdf
sthefanydesr
 
Funções e Progressões - Livro completo prisma
Funções e Progressões - Livro completo prismaFunções e Progressões - Livro completo prisma
Funções e Progressões - Livro completo prisma
djincognito
 
QUIZ - HISTÓRIA 9º ANO - PRIMEIRA REPÚBLICA_ERA VARGAS.pptx
QUIZ - HISTÓRIA  9º ANO - PRIMEIRA REPÚBLICA_ERA VARGAS.pptxQUIZ - HISTÓRIA  9º ANO - PRIMEIRA REPÚBLICA_ERA VARGAS.pptx
QUIZ - HISTÓRIA 9º ANO - PRIMEIRA REPÚBLICA_ERA VARGAS.pptx
AntonioVieira539017
 
Slides Lição 10, Central Gospel, A Batalha Do Armagedom, 1Tr24.pptx
Slides Lição 10, Central Gospel, A Batalha Do Armagedom, 1Tr24.pptxSlides Lição 10, Central Gospel, A Batalha Do Armagedom, 1Tr24.pptx
Slides Lição 10, Central Gospel, A Batalha Do Armagedom, 1Tr24.pptx
LuizHenriquedeAlmeid6
 
Slides Lição 11, Central Gospel, Os Mortos Em CRISTO, 2Tr24.pptx
Slides Lição 11, Central Gospel, Os Mortos Em CRISTO, 2Tr24.pptxSlides Lição 11, Central Gospel, Os Mortos Em CRISTO, 2Tr24.pptx
Slides Lição 11, Central Gospel, Os Mortos Em CRISTO, 2Tr24.pptx
LuizHenriquedeAlmeid6
 
Introdução à Sociologia: caça-palavras na escola
Introdução à Sociologia: caça-palavras na escolaIntrodução à Sociologia: caça-palavras na escola
Introdução à Sociologia: caça-palavras na escola
Professor Belinaso
 
Treinamento NR 38 - CORPO PRINCIPAL da NORMA.pptx
Treinamento NR 38 - CORPO PRINCIPAL da NORMA.pptxTreinamento NR 38 - CORPO PRINCIPAL da NORMA.pptx
Treinamento NR 38 - CORPO PRINCIPAL da NORMA.pptx
MarcosPaulo777883
 

Último (20)

PowerPoint Newton gostava de Ler - Saber em Gel.pdf
PowerPoint Newton gostava de Ler - Saber em Gel.pdfPowerPoint Newton gostava de Ler - Saber em Gel.pdf
PowerPoint Newton gostava de Ler - Saber em Gel.pdf
 
Leonardo da Vinci .pptx
Leonardo da Vinci                  .pptxLeonardo da Vinci                  .pptx
Leonardo da Vinci .pptx
 
Pintura Romana .pptx
Pintura Romana                     .pptxPintura Romana                     .pptx
Pintura Romana .pptx
 
atividade 8º ano entrevista - com tirinha
atividade 8º ano entrevista - com tirinhaatividade 8º ano entrevista - com tirinha
atividade 8º ano entrevista - com tirinha
 
Forças e leis de Newton 2024 - parte 1.pptx
Forças e leis de Newton 2024 - parte 1.pptxForças e leis de Newton 2024 - parte 1.pptx
Forças e leis de Newton 2024 - parte 1.pptx
 
“A classe operária vai ao paraíso os modos de produzir e trabalhar ao longo ...
“A classe operária vai ao paraíso  os modos de produzir e trabalhar ao longo ...“A classe operária vai ao paraíso  os modos de produzir e trabalhar ao longo ...
“A classe operária vai ao paraíso os modos de produzir e trabalhar ao longo ...
 
Redação e Leitura_7º ano_58_Produção de cordel .pptx
Redação e Leitura_7º ano_58_Produção de cordel .pptxRedação e Leitura_7º ano_58_Produção de cordel .pptx
Redação e Leitura_7º ano_58_Produção de cordel .pptx
 
A QUESTÃO ANTROPOLÓGICA: O QUE SOMOS OU QUEM SOMOS.pdf
A QUESTÃO ANTROPOLÓGICA: O QUE SOMOS OU QUEM SOMOS.pdfA QUESTÃO ANTROPOLÓGICA: O QUE SOMOS OU QUEM SOMOS.pdf
A QUESTÃO ANTROPOLÓGICA: O QUE SOMOS OU QUEM SOMOS.pdf
 
O que é um Ménage a Trois Contemporâneo .pdf
O que é um Ménage a Trois Contemporâneo .pdfO que é um Ménage a Trois Contemporâneo .pdf
O que é um Ménage a Trois Contemporâneo .pdf
 
1_10_06_2024_Criança e Cultura Escrita, Ana Maria de Oliveira Galvão.pdf
1_10_06_2024_Criança e Cultura Escrita, Ana Maria de Oliveira Galvão.pdf1_10_06_2024_Criança e Cultura Escrita, Ana Maria de Oliveira Galvão.pdf
1_10_06_2024_Criança e Cultura Escrita, Ana Maria de Oliveira Galvão.pdf
 
Caderno de Resumos XVIII ENPFil UFU, IX EPGFil UFU E VII EPFEM.pdf
Caderno de Resumos XVIII ENPFil UFU, IX EPGFil UFU E VII EPFEM.pdfCaderno de Resumos XVIII ENPFil UFU, IX EPGFil UFU E VII EPFEM.pdf
Caderno de Resumos XVIII ENPFil UFU, IX EPGFil UFU E VII EPFEM.pdf
 
Folheto | Centro de Informação Europeia Jacques Delors (junho/2024)
Folheto | Centro de Informação Europeia Jacques Delors (junho/2024)Folheto | Centro de Informação Europeia Jacques Delors (junho/2024)
Folheto | Centro de Informação Europeia Jacques Delors (junho/2024)
 
Rimas, Luís Vaz de Camões. pptx
Rimas, Luís Vaz de Camões.          pptxRimas, Luís Vaz de Camões.          pptx
Rimas, Luís Vaz de Camões. pptx
 
Egito antigo resumo - aula de história.pdf
Egito antigo resumo - aula de história.pdfEgito antigo resumo - aula de história.pdf
Egito antigo resumo - aula de história.pdf
 
Funções e Progressões - Livro completo prisma
Funções e Progressões - Livro completo prismaFunções e Progressões - Livro completo prisma
Funções e Progressões - Livro completo prisma
 
QUIZ - HISTÓRIA 9º ANO - PRIMEIRA REPÚBLICA_ERA VARGAS.pptx
QUIZ - HISTÓRIA  9º ANO - PRIMEIRA REPÚBLICA_ERA VARGAS.pptxQUIZ - HISTÓRIA  9º ANO - PRIMEIRA REPÚBLICA_ERA VARGAS.pptx
QUIZ - HISTÓRIA 9º ANO - PRIMEIRA REPÚBLICA_ERA VARGAS.pptx
 
Slides Lição 10, Central Gospel, A Batalha Do Armagedom, 1Tr24.pptx
Slides Lição 10, Central Gospel, A Batalha Do Armagedom, 1Tr24.pptxSlides Lição 10, Central Gospel, A Batalha Do Armagedom, 1Tr24.pptx
Slides Lição 10, Central Gospel, A Batalha Do Armagedom, 1Tr24.pptx
 
Slides Lição 11, Central Gospel, Os Mortos Em CRISTO, 2Tr24.pptx
Slides Lição 11, Central Gospel, Os Mortos Em CRISTO, 2Tr24.pptxSlides Lição 11, Central Gospel, Os Mortos Em CRISTO, 2Tr24.pptx
Slides Lição 11, Central Gospel, Os Mortos Em CRISTO, 2Tr24.pptx
 
Introdução à Sociologia: caça-palavras na escola
Introdução à Sociologia: caça-palavras na escolaIntrodução à Sociologia: caça-palavras na escola
Introdução à Sociologia: caça-palavras na escola
 
Treinamento NR 38 - CORPO PRINCIPAL da NORMA.pptx
Treinamento NR 38 - CORPO PRINCIPAL da NORMA.pptxTreinamento NR 38 - CORPO PRINCIPAL da NORMA.pptx
Treinamento NR 38 - CORPO PRINCIPAL da NORMA.pptx
 

jahundredsound

  • 1. Universidade Presbiteriana Mackenzie 1 Banco de Dados – Aula 02 Linguagem SQL SELECT com várias tabelas (inner join, left join e right join) Prof. Jamilson Bispo dos Santos
  • 2. 2 Introdução Considere o seguinte Banco de Dados para esta aula:  Departamento = {Cod_Depto, Nome_Depto}  Funcionario = {Cod_Func, Nome_Func, Salario, Cod_Depto} - Cod_depto é chave estrangeira que referencia o atributo Cod_depto da tabela Departamento  Projeto = {Cod_Proj, Nome_Proj, Duracao}  Func_Proj = {Cod_Func, Cod_Proj, Horas_Trab} - Cod_Func é chave estrangeira que referencia o atributo Cod_Func da tabela Funcionario - Cod_Proj é chave estrangeira que referencia o atributo Cod_Proj da tabela Projeto
  • 4. 4 Introdução  A junção de várias tabelas pode ser feita na cláusula WHERE, colocando-se os nomes de todas as tabelas envolvidas na cláusula FROM
  • 5. 5 Introdução  Exemplo (junção na cláusula WHERE): Obtenha o nome de cada funcionário e o nome do departamento que cada um pertence. SELECT F.Nome_Func, D.Nome_Depto FROM Funcionario F, Departamento D WHERE (F.Cod_depto = D.Cod_depto); Nome_Func Nome_Depto Joao da Silva Vendas Marcio Santana Pesquisa Maria Castro Marketing Mario Souza Marketing Sergio Santos Vendas
  • 7. 7 INNER JOIN  No padrão SQL:2003, a operação de junção de várias tabelas pode ser expressa diretamente na cláusula FROM, em vez de ser expressa nas cláusulas FROM e WHERE
  • 8. 8 INNER JOIN  Para executar uma operação de junção na cláusula FROM, utilize as palavras-chave INNER JOIN e as condições de junção são indicadas pela palavra-chave ON, dentro da cláusula FROM (observe que a condição de junção não aparece mais na cláusula WHERE).
  • 9. 9 INNER JOIN  Exemplo (INNER JOIN): Obtenha o nome de cada funcionário e o nome do departamento que cada um pertence SELECT F.Nome_Func, D.Nome_Depto FROM Funcionario F INNER JOIN Departamento D ON F.Cod_depto = D.Cod_depto; Nome_Func Nome_Depto Joao da Silva Vendas Marcio Santana Pesquisa Maria Castro Marketing Mario Souza Marketing Sergio Santos Vendas
  • 11. 11 Junção Externa  Uma junção entre duas tabelas gera um resultado onde tem-se linhas que se combinam sobre a coluna de junção  O operador de junção externa gera o resultado da junção (as linhas combinadas) mais as linhas não combinadas
  • 12. 12 Junção Externa  Uma junção externa de um lado gera um resultado com as linhas combinadas mais as linhas não combinadas com base em uma das tabelas  A linguagem SQL utiliza as palavras-chave LEFT JOIN e RIGHT JOIN para produzir a junção externa de um lado
  • 13. 13 JUNÇÃO EXTERNA LEFT JOIN
  • 14. Junção Externa – LEFT JOIN 14  A palavra-chave LEFT JOIN gera um resultado contendo as linhas combinadas e as linhas não combinadas da tabela da esquerda
  • 15. Junção Externa – LEFT JOIN  Exemplo (LEFT JOIN): Obtenha os nomes de todos os departamentos da empresa, com os nomes dos funcionários que trabalham em cada um. 15 SELECT D.Nome_Depto, F.Nome_func FROM Departamento D LEFT JOIN Funcionario F ON D.Cod_depto = F.Cod_depto ORDER BY D.Nome_Depto; Nome_Depto Nome_func Dados Vendas Joao da Silva Pesquisa Marcio Santana Marketing Maria Castro Marketing Mario Souza Vendas Sergio Santos
  • 16. Junção Externa – LEFT JOIN  Exemplo (LEFT JOIN): Obtenha os nomes de todos os departamentos da empresa, com os nomes dos funcionários que trabalham em cada um. 16 SELECT D.Nome_Depto, F.Nome_func FROM Departamento D LEFT JOIN Funcionario F ON D.Cod_depto = F.Cod_depto ORDER BY D.Nome_Depto; Nome_Depto Nome_func Dados Vendas Joao da Silva Pesquisa Marcio Santana Marketing Maria Castro Marketing Mario Souza Vendas Sergio Santos Observe que o departamento “Dados” não tem funcionário, mas apareceu no resultado
  • 17. 17 JUNÇÃO EXTERNA RIGHT JOIN
  • 18. Junção Externa – RIGHT JOIN 18  A palavra-chave RIGHT JOIN gera um resultado contendo as linhas combinadas e as linhas não combinadas da tabela da direita  Assim, o resultado de uma junção externa de um lado depende da direção (DIREITA ou ESQUERDA) e da posição dos nomes das tabelas
  • 19. Junção Externa – RIGHT JOIN  Exemplo (RIGHT JOIN): Obtenha os nomes de todos os departamentos da empresa, com os nomes dos funcionários que trabalham em cada um. 19 SELECT D.Nome_Depto, F.Nome_func FROM Funcionario F RIGHT JOIN Departamento D ON D.Cod_depto = F.Cod_depto ORDER BY D.Nome_Depto; Nome_Depto Nome_func Dados Vendas Joao da Silva Pesquisa Marcio Santana Marketing Maria Castro Marketing Mario Souza Vendas Sergio Santos
  • 20. Junção Externa – RIGHT JOIN  Observe que os exemplos anteriores, utilizando LEFT JOIN e RIGHT JOIN, trazem o mesmo resultado, com alterações apenas na ordem em que as tabelas aparecem na cláusula FROM. 20
  • 21. Exemplos de LEFT JOIN e RIGHT JOIN  Exemplo: Obtenha os nomes de todos os departamentos da empresa e a quantidade de funcionários pertencentes a cada um deles (retorne mesmo aqueles departamentos onde não têm funcionários)  Observe os exemplos a seguir utilizando LEFT JOIN e RIGHT JOIN 21
  • 22. Exemplos de LEFT JOIN e RIGHT JOIN 22  LEFT JOIN SELECT D.Nome_Depto, COUNT(F.Cod_func) AS Total_Empregados FROM Departamento D LEFT JOIN Funcionario F ON D.Cod_depto = F.Cod_depto GROUP BY D.Nome_Depto; Nome_Depto Total_Empregados Dados 0 Marketing 2 Pesquisa 1 Vendas 2
  • 23. Exemplos de LEFT JOIN e RIGHT JOIN 23  RIGHT JOIN SELECT D.Nome_Depto, COUNT(F.Cod_func) AS Total_Empregados FROM Funcionario F RIGHT JOIN Departamento D ON D.Cod_depto = F.Cod_depto GROUP BY D.Nome_Depto; Nome_Depto Total_Empregados Dados 0 Marketing 2 Pesquisa 1 Vendas 2
  • 24. Universidade Presbiteriana Mackenzie 24 FIM !!! J Banco de Dados – Aula 10 Linguagem SQL SELECT com várias tabelas (inner join, left join e right join) Texto Original da Profa. Elisângela Botelho Gracias
  • 25. Universidade Presbiteriana Mackenzie 1 Banco de Dados – Aula 03 Linguagem SQL (Structured Query Language) Comando SELECT com Sub-Select Prof. Jamilson Bispo dos Santos
  • 26. Banco de Dados Exemplo 2
  • 27. Exemplo de Banco de Dados 3 Considere o seguinte modelo relacional : PECA = {PeNro, PeNome, PePreco, PeCor} FORNECEDOR = {FNro, FNome, FCidade, FCateg} PROJETO = {PNro, PNome, PDuracao, PCusto} FORNECE_PARA = {PeNro, FNro, PNro, Quant} - PeNro é chave estrangeira que referencia a tabela Peca - FNro é chave estrangeira que referencia a tabela Fornecedor - PNro é chave estrangeira que referencia a tabela Projeto
  • 28. 4
  • 29. 5 SELECT  Exemplo1 (sub-select): Obtenha o nome das peças utilizadas no projeto P5. PeNome SELECT Peca.PeNome FROM Peca WHERE Peca.PeNro IN (SELECT Fornece_para.PeNro Limpador FROM Fornece_para WHERE Fornece_para.PNro = ‘P5’);
  • 30. 6 SELECT  Exemplo2 (sub-select): Obtenha o nome das peças cujo preco é superior ao preço médio das peças. PPreco SELECT Peca.PeNome Cinto FROM Peca Painel WHERE Peca.PePreco > (SELECT AVG(Peca.PePreco) FROM Peca);
  • 31. 7 SELECT  Exemplo3 (sub-select): Obtenha, sem repetição e em ordem crescente, o nome dos fornecedores que forneceram peças para algum projeto. SELECT DISTINCT Fornecedor.FNome FROM Fornecedor WHERE Fornecedor.FNro IN (SELECT Fornece_para.FNro FROM Fornece_para) ORDER BY Fornecedor.FNome ASC; FNome CM Equipament Kirurgic Piloto Plastec
  • 32. 8 SELECT Exemplo4 (sub-select): Obtenha os nomes das peças utilizadas nos projetos com duração maior que 3 meses. SELECT DISTINCT Peca.PeNome FROM Peca WHERE Peca.PeNro IN (SELECT Fornece_para.PeNro FROM Fornece_para WHERE Fornece_para.PNro IN PeNome Painel (SELECT Projeto.PNro FROM Projeto WHERE Projeto.PDuracao >3));
  • 33. 9 SELECT  Exemplo5 (sub-select): Obtenha os nomes das peças fornecidas por algum fornecedor de Piracicaba. SELECT DISTINCT Peca.PeNome FROM Peca WHERE Peca.PeNro IN (SELECT PeNro FROM Fornece_para WHERE FNro IN PeNome Limpador (SELECT FNro FROM Fornecedor WHERE FCidade = ‘Piracicaba’));
  • 34. 10 SELECT  Exemplo6 (sub-select): Obtenha os nomes das peças que não são fornecidas por fornecedores da categoria A. SELECT DISTINCT Peca.PeNome FROM Peca WHERE Peca.PeNro IN (SELECT PeNro FROM Fornece_para WHERE FNro NOT IN PeNome Cinto Volante Painel (SELECT FNro FROM Fornecedor WHERE FCategoria = ‘A’));
  • 35. PNome Total Sea 7 11 SELECT  Exemplo7 (sub-select): Obtenha o nome de cada projeto e o total de peças utilizadas em cada um, mas desde que esse total seja maior que o total de peças utilizadas no projeto ‘Paraiso’. SELECT P.PNome, SUM(FP.Quant) AS Total FROM Fornece_para FP, Projeto P WHERE (FP.PNro = P.PNro) GROUP BY P.PNome HAVING SUM(FP.Quant) > (SELECT SUM(FP.Quant) FROM Fornece_para FP, Projeto P WHERE (P.PNome = ‘Paraiso’) AND (FP.PNro = P.PNro));
  • 36. 12 SELECT  Exemplo8 (UPDATE com sub-select): Atualize para 10 a quantidade da peça “Volante” fornecida pelo fornecedor F2 para o projeto P2. UPDATE Fornece_para SET Quant = 10 WHERE (FNro = ‘F2’) AND (PNro = ‘P2’) AND PeNro IN (SELECT PeNro FROM Peca WHERE (PeNome = ‘Volante’));
  • 37. Universidade Presbiteriana Mackenzie 13 FIM !!! J Banco de Dados – Aula 09 Linguagem SQL (Structured Query Language) Comando SELECT com Sub-Select Texto original da Profa. Elisângela Botelho Gracias
  • 38. Universidade Presbiteriana Mackenzie 1 Banco de Dados – Aula 01 Linguagem SQL - Operadores Prof. Jamilson Bispo dos Santos
  • 39. 2 OPERADORES  Você pode combinar várias consultas usando o conjunto de operadores UNION, UNION ALL, INTERSECT e MINUS. Todos os operadores de conjunto têm a mesma precedência. Se uma instrução SQL contém vários operadores de conjunto, a SGBD geralmente avalia da esquerda para a direita se não houver parênteses especificar explicitamente outra ordem.
  • 40. 3 UNION  O operador UNION retorna somente linhas distintas que aparecem em qualquer resultado, enquanto o operador UNION ALL retorna todas as linhas. O operador UNION ALL não elimina duplicados linhas selecionadas:
  • 41. 4 UNION Exemplo: select id_empregado, nome_empregado from empregado_mensalista union all select id_empregado, nome_empregado from empregado_horista
  • 42. 5 INTERSECT  Retorna apenas as linhas retornados pelas duas consultas:
  • 43. 6 INTERSECT Exemplo: select id_cargo from empregado_horista intersect select id_cargo from empregado_mensalista;
  • 44. 7 MINUS  Retorna apenas as linhas retornados pela primeira consulta mas não pela segunda:
  • 45. 8 INTERSECT Exemplo: select id_produto from estoque_central minus select id_produto from estoque_loja
  • 46. Universidade Presbiteriana Mackenzie Desenvolvimento em BD – Aula5 9 FIM !!! J Linguagem SQL - OPERADORES Prof. Jamilson Bispo dos Santos
  • 47. Universidade Presbiteriana Mackenzie 1 Banco de Dados - Aula 04 Prof. Jamilson Bispo dos Santos
  • 48. 2 Visão  Uma visão (view) é uma tabela lógica que não ocupa lugar no banco de dados, pois seus dados não estão fisicamente armazenados sob ela  Uma visão pode ser composta por colunas e agrupamentos de uma ou mais tabelas
  • 49. 3 Visão  Resumindo, uma visão é resultado de uma consulta  Em uma visão é permitido selecionar, atualizar, excluir e incluir dados. Entretanto, visões que contenham JOIN, GROUP BY, DISTINCT e EXPRESSÕES somente permitem seleções
  • 50. 4 Visão  Uma visão é criada por uma consulta que usa tabelas de origem ou tabelas base para extrair os dados  As tabelas base podem ser tabelas ou outras visões  A definição de uma visão é armazenada no dicionário de dados que guarda a consulta que gerou a visão
  • 51. 5 Visão - Vantagens
  • 52. 6 Visão - Vantagens  Uma das grandes vantagens é poder restringir a visualização do conteúdo de uma tabela por meio da limitação das colunas que são exibidas e das linhas que são filtradas
  • 53. 7 Visão - Vantagens  Uma tabela de uso geral pode ser quebrada em visões específicas para determinados usuários  Assim, uma tabela com dados de empregados pode exibir apenas o nome e o telefone para usuários em geral, e outra, nome do empregado e o valor do salário apenas para usuários que recebam permissão para isso
  • 54. 8 Visão - Vantagens  Outra vantagem seria a simplificação da execução de um comando SELECT que envolveria diversos campos de muitas tabelas
  • 56. 10 Visão – CREATE VIEW  CREATE [OR REPLACE] VIEW nome_view AS SELECT ... WITH READ ONLY;
  • 57. 11 Visão – CREATE VIEW  OR REPLACE:  recria uma visão já existente. Ela funciona como uma substituta ao inexistente comando ALTER VIEW e deve ser usada para alterar uma visão existente sem a necessidade de apagar e dar a permissão a privilégios
  • 58. 12 Visão – CREATE VIEW  WITH READ ONLY:  especifica que os comandos DELETE, INSERT ou UPDATE não podem ser executados na visão
  • 59. 13 Visão – CREATE VIEW  Considere a criação das tabelas Funcionario e Departamento e a inserção de dados nas mesmas
  • 60. 14 Visão – CREATE VIEW DROP TABLE Funcionario CASCADE CONSTRAINT; DROP TABLE Departamento CASCADE CONSTRAINT; CREATE TABLE Departamento (Cod_Depto integer, Nome_Depto varchar(20), PRIMARY KEY(Cod_Depto)); CREATE TABLE Funcionario (Cod_Func integer, Nome_Func varchar(20), Salario integer, Cod_Depto integer, PRIMARY KEY(Cod_Func), FOREIGN KEY(Cod_Depto) REFERENCES Departamento (Cod_Depto));
  • 61. 15 Visão – CREATE VIEW INSERT INTO Departamento VALUES (1, ’Marketing’); INSERT INTO Departamento VALUES (2, ’Vendas’); INSERT INTO Departamento VALUES (3, ’Dados’); INSERT INTO Departamento VALUES (4, ’Pesquisa’); INSERT INTO Funcionario VALUES (101, ’Joao da Silva’, 2000, 2); INSERT INTO Funcionario VALUES (102, ’Mario Souza’, 1500, 1); INSERT INTO Funcionario VALUES (103, ’Sergio Santos’, 2400, 2); INSERT INTO Funcionario VALUES (104, ’Maria Castro’, 1200, 1); INSERT INTO Funcionario VALUES (105, ’Marcio Santana’, 1400, 4);
  • 62. 16 Visão – CREATE VIEW  Exemplo: CREATE OR REPLACE VIEW Funcionario_Depto AS SELECT F.Nome_Func, F.Salario, D.Nome_Depto FROM Funcionario F, Departamento D WHERE F.Cod_Depto = D.Cod_Depto WITH READ ONLY;
  • 63. 17 Visão – CREATE VIEW  Uma visão pode ser visualizada por um select, da mesma forma que uma tabela: SELECT * FROM Funcionario_Depto;
  • 64. 18 Visão – DROP VIEW
  • 65. 19 Visão – DROP VIEW  Para eliminar uma visão, use o comando DROP VIEW seguido do nome dessa visão. As tabelas base não são afetadas por esse comando DROP VIEW nome da visão;
  • 67. 21 Visão – Alterando dados  Uma visão que possua apenas colunas de uma tabela pode ser modificada sem restrições e, logo em seguida, exibidas na tabela base (desde que a visão não seja somente leitura)
  • 68. 22 Visão – Alterando dados  Já uma visão composta por colunas de várias tabelas, pode ser modificada desde que o comando SELECT que a criou não possua:  operador DISTINCT; as funções AVG, COUNT, MAX, MIN, SUM; as operações UNION, INTERSECT, MINUS e as cláusulas GROUP BY, HAVING
  • 69. 23 Visão – Alterando dados  Se essas restrições forem respeitadas, pode-se usar os comandos UPDATE, INSERT ou DELETE para modificar os dados de uma das tabelas base que a compõem
  • 70. 24 Visão Visualizando as informações
  • 71. Visão – Visualizando as informações  Algumas informações sobre as visões criadas são armazenadas em uma tabela de controle, atualizada automaticamente 25  Essa tabela é a user_views
  • 72. Visão – Visualizando as informações 26  Para conhecer a definição dos dados da tabela user_views, utilize o comando describe DESCRIBE user_views;
  • 73. Visão – Visualizando as informações 27  Para ver as colunas nome e texto do comando que monta a visão, use as colunas view_name e text SELECT view_name, text FROM user_views;
  • 75. 29 Visão Materializada  As visões materializadas (materialized views) também são associadas a comandos SELECT, no entanto, seu conteúdo fica armazenado em uma tabela no banco de dados  Esse tipo de visão é aplicado a visões com comando SELECT de alta complexidade, degradando a performance das consultas
  • 76. 30 Visão Materializada  As visões materializadas podem ser utilizadas com o objetivo de sumarizar e/ou pré-calcular dados com base em dados de outras tabelas  Esse uso é especialmente interessante em aplicações de Data Warehouse
  • 77. Visões do Dicionário de Dados 31  Dicionário de Dados é uma peça importante constituída de um conjunto de tabelas que fornecem informações sobre banco de dados  Todas essas tabelas são usadas apenas para leitura
  • 78. Visões do Dicionário de Dados  Estas tabelas possuem informações do tipo:  Definições de todos os objetos de esquema do banco de dados, como tabelas, visões, procedures, triggers, dentre outras 32  Os nomes dos usuários, os privilégios e os papéis de cada um
  • 79. Visões do Dicionário de Dados  O dicionário de dados é uma peça vital para o funcionamento do Oracle  Durante sua operação, o Oracle lê o dicionário de dados para se assegurar de que os objetos do esquema existem e que os usuários possuem permissão para acessá-los 33
  • 80. Visões do Dicionário de Dados 34  As visões do dicionário são identificadas por prefixos:  USER: visões do usuário  ALL: visões expandidas do usuário  DBA: visões do administrador do banco de dados
  • 81. Visões do Dicionário de Dados 35  Visões do tipo USER  As informações desse tipo são associadas a informações e objetos de um usuário  Por exemplo: para retornar todos os objetos de um usuário, deve ser usada a visão USER_OBJECTS: SELECT object_name, object_type FROM user_objects;
  • 82. Visões do Dicionário de Dados 36  Visões do tipo ALL  Essas visões permitem a visualização de informações expandidas do usuário, lhe dando a oportunidade de obter dados, dentro de suas permissões, sobre o banco de dados  Por exemplo: para visualizar todos os objetos dos quais o usuário possui permissão de acesso, deve ser usada a visão ALL_OBJECTS
  • 83. Visões do Dicionário de Dados 37  Visões do tipo DBA  As visões com esse prefixo mostram uma visão geral do banco de dados e devem ser consultadas, em teoria, apenas por DBA’s
  • 84. Visões do Dicionário de Dados  A seguir, serão mostradas algumas visões presentes no dicionário de dados, sendo que cada uma contém informações detalhadas sobre cada um dos objetos já estudados 38
  • 85. Visões do Dicionário de Dados 39 Visão Finalidade ALL_OBJECTS, USER_OBJECTS Mostra todos os objetos do usuário ALL_CATALOG, USER_CATALOG Retorna o nome e o tipo dos objetos do usuário ALL_TABLES, USER_TABLES Retorna as tabelas do usuário ALL_TAB_COLUMNS, USER_TAB_COLUMNS Retorna informações sobre as colunas das tabelas do usuário
  • 86. Visões do Dicionário de Dados 40 Visão Finalidade ALL_VIEWS, USER_VIEWS Retorna as visões do usuário ALL_TRIGGERS, USER_TRIGGERS Retorna as triggers do usuário ALL_PROCEDURES, USER_PROCEDURES Retorna as procedures do usuário
  • 87. 41 Bibliografia  FANDERUFF, D. Dominando o Oracle 9i: Modelagem e Desenvolvimento. São Paulo: Pearson Education do Brasil, 2003.  RAMALHO, J. A. Oracle 9i. São Paulo: Berkeley Brasil, 2002
  • 88. Universidade Presbiteriana Mackenzie 42 FIM !!! J Banco de Dados - Aula 14 Texto original da Profa. Elisângela Botelho Gracias
  • 89. Universidade Presbiteriana Mackenzie Banco de Dados II Introdução Jamilson Bispo dos Santos Faculdade de Computação e Informática
  • 90. Tópicos Abordados • Reconhecimento de uma bloco PL/SQL e suas sessões • Descrever o significado das variáveis • Declarar variáveis PL/SQL • Executar um Bloco PL/SQL 2
  • 91. Bloco PL/SQL DECLARE Variáveis, cursores BEGIN comandos SQL comando PL/SQL EXCEPTION Ações quando ocorrer erro END; mandatório
  • 92. Bloco PL/SQL DECLARE Variáveis, cursores BEGIN comandos SQL comando PL/SQL EXCEPTION Ações quando ocorrer erro END; mandatório
  • 93. Bloco PL/SQL • Seção de declaração (Declare) • Contem todos as variáveis, constantes cursores e exceções definidas pelo usuário que são referenciadas na seção de execução • Seção de execução (Begin) • Contem os comando SQL para manipular os dados no banco de dados e os comando PL/SQL para manipular os dados no bloco • Seção de Exceções (Exception) • Especifica as ações a serem tomadas quando um erro ou uma condição anormal acontecer no seção de execução. <Título da Aula> 5
  • 94. Executando um Bloco PL/SQL DECLARE v_table_name varchar(40); v_table_spacename varchar(40); BEGIN SELECT table_name, tablespace_name INTO v_table_name, v_table_spacename FROM user_tables where table_name = 'ALUNO' ; END;
  • 95. Executando um Bloco PL/SQL DECLARE v_table_name varchar(40); v_table_spacename varchar(40); v_OutputStr varchar(200) := ''; BEGIN SELECT table_name, tablespace_name INTO v_table_name, v_table_spacename FROM user_tables where table_name = 'ALUNO' ; v_OutputStr := 'Bloco Anonimo '; DBMS_OUTPUT.PUT_LINE(v_OutputStr); v_OutputStr := 'Tabela '||v_table_name; DBMS_OUTPUT.PUT_LINE(v_OutputStr); v_OutputStr := 'Tablespace '||v_table_spacename; DBMS_OUTPUT.PUT_LINE(v_OutputStr); END;
  • 96. Tipos de Bloco PROCEDURE name IS BEGIN EXCEPTIONS END; FUNCTION name IS BEGIN RETURN valor EXCEPTIONS END;
  • 97. Construções Programas Descrição Disponivel Bloco Anonimo Bloco PL/SQL anonimos que são coocados dentro de uam aplicação ou executados interativamente Todos os ambiente PL/SQL Aplication Procedure ou functions Blocos PL/SQL armazenados no servidor Oracle Forms Developer ; podem aceirar parametros e podem ser invocados repetidamente pelo nome Oracle Forms Developer Stored Procedure ou Functions Blocos PL/SQL nomeados e armazenados no Oracle server; podem aceitar parametros e podem ser invocados repetidamente pelo nome Oracle Server Packages Modulos PL/SQL que agrupam procedures, functions e identificadores Oracle Server, Oracle Forms Developer Triggers Blocos BP/SQL que são associados com um tabela do banco de dados e são executadas automaticamente quando evento de atualização é executado Oracle Server Application Triggers Estão associados a um evento de um aplicativo e disparados automaticamente Oracle Server, Oracle Forms Developer Tipos de objetos Tipos de dados compostos definidos pelo usuario que encapsula uma estrutura de dados, juntamente com as funções e os procedimentos necessários para manipular os dados Oracle Server, Oracle Forms Developer
  • 98. Variáveis • Variáveis podem ser usadas para: – Dados temporários – Manipulação de valores armazenados – Reusabilidade – Fácil manutenção <Título da Aula> 10
  • 99. Variáveis • Variáveis podem ser usadas para: – Armazenamento temporários dos dados • Dados pode ser armazenados temporariamente em uma ou mais variáveis para serem utilizados na entrada dos dados e para serem processados depois. – Manipulação de valores armazenados • Variáveis podem ser usados para cálculos e manipulação de dados sem acesso ao banco de dados. <Título da Aula> 11
  • 100. Variáveis • Variáveis podem ser usadas para: – Reusabilidade • Depois de serem declaradas as variáveis podem ser usadas repetidamente na aplicação simplesmente sendo referenciadas em outros comandos, incluindo outras comando de declaração – Fácil manutenção • Quando usar %TYPE e %ROWTYPE você declara variáveis com base na declaração da definição da coluna no banco de dados. Isto proporciona uma independência reduzindo custos de manutenção. <Título da Aula> 12
  • 101. Manipulando Variáveis em PL/SQL • Declarar e inicializar variáveis na declaração da seção • Assinalar um novo valor para a variável na seção de execução • Passar valor através de parâmetro • Visualizar resultado através de variáveis de saída <Título da Aula> 13
  • 102. Tipos de Variáveis • Variáveis PL/SQL – Escalar • Tipos escalares armazenam um valor único. Os tipo de dados principais são aqueles que correspondem ao tipos de colunas nas tabelas do banco de dados, inclusive valores booleanos. – Composite • Tipos de dados composite , como os registros, permitem que grupos de campos sejam definidos e manipulados no bloco PL/SQL. – Reference • Tipos de dados reference manipulam valores do tipo ponteiros – LOB • Tipo de dados que especificam a localização de objetos do tipo large <Título da Aula> 14
  • 103. Tipos de Variáveis • Variáveis não PL/SQL – Variáveis não‐PL / SQL incluem variáveis declaras em uma linguagem hospedeira. <Título da Aula> 15
  • 104. Declaração de Variáveis PL/SQL • Sintaxe: Identificador [constant] tipo de dados [NOT NULL] [:= | DEFAULT expr]; • Exemplos DECLARE v_data DATE: v_depto NUMBER(2) NOT NULL := 10; v_cidade VARCHAR2(20) := ‘São Paulo’; <Título da Aula> 16
  • 105. Inicialização de Variáveis PL/SQL • Operador de atribuição (:=) • Palavra chave DEFAULT • Constrant NOT NULL Sintaxe identificador := expr; Exemplos v_data :=‘01‐JAN‐2014’; v_depto :=‘RH’; <Título da Aula> 17
  • 106. Inicialização de Variáveis PL/SQL set serveroutput on size 4000 DECLARE v_bonus number(8, 2); BEGIN SELECT salario * 0.10 INTO v_bonus FROM funcionario WHERE cod_func = 101; DBMS_OUTPUT.PUT_LINE('BONUS '|| v_bonus); END;
  • 107. Tipos de dados Escalar • CHAR [(tamanho máximo)] • VARCHAR2 (tamanho máximo) • LONG • LONG RAW • NUMBER [precisão, escala] • BINARY_INTEGER • PLS_INTEGER • BOOLEAN <Título da Aula> 19
  • 108. Tipos escalares Tipo de Dado Descrição Char [(tamanho maximo)] Tipo básico para dados caracteres de no máximo 32.767 bytes. O valor default é 1. varchar2(tamanho maximo) Tipo básico para dados caracteres de tamanho variável de no máximo 32.767 bytes. LONG Tipo básico para dados caracteres de tamanho variável de no máximo 32.767 bytes. Usar o tipo LONG para armazenar strings de tamanho variável. LONG RAW Tipo básico para dados binários NUMBER [(PRECISÃO, ESCALA)] Tipo numerico com precisão p e escala s. A previsão p pode variar de 1 ate 38. A escala pode variar de ‐ 84 ate 127 BYNARY_INTEGER Tipo básico para inteiros entre ‐2.147.483.647 até 2.147.483.647 PLS_INTEGER Tipo básico para inteiros entre ‐2.147.483.647 até 2.147.483.647. O tipo PLS_INTEGER reque menos memoria e é mais rápido do que variáveis NUMBER BOOLEN Tipo básico que armazena um dos três possíveis valores usados operações logicas: TRUE, FALSE ou NULL
  • 109. Tipos escalares Tipo de Dado Descrição Char [(tamanho maximo)] Tipo básico para dados caracteres de no máximo 32.767 bytes. O valor default é 1. varchar2(tamanho maximo) Tipo básico para dados caracteres de tamanho variável de no máximo 32.767 bytes. LONG Tipo básico para dados caracteres de tamanho variável de no máximo 32.767 bytes. Usar o tipo LONG para armazenar strings de tamanho variável. LONG RAW Tipo básico para dados binários NUMBER [(PRECISÃO, ESCALA)] Tipo numerico com precisão p e escala s. A previsão p pode variar de 1 ate 38. A escala pode variar de ‐ 84 ate 127 BYNARY_INTEGER Tipo básico para inteiros entre ‐2.147.483.647 até 2.147.483.647 PLS_INTEGER Tipo básico para inteiros entre ‐2.147.483.647 até 2.147.483.647. O tipo PLS_INTEGER reque menos memoria e é mais rápido do que variáveis NUMBER BOOLEN Tipo básico que armazena um dos três possíveis valores usados operações logicas: TRUE, FALSE ou NULL
  • 110. Referencias bibliográficas • KORTH, H., SILBERSCHATZ, A., F., SUDARSHAN, S. Sistema de Bancos de Dados, 6 ed., Campus, 2006. • ELMASRI, R., NAVATHE, S. Sistemas de Banco de Dados. 6 ed., Pearson Addison‐Wesley, 2005 • DATE, C. J. Introdução a sistemas de banco de • dados. Rio de Janeiro: Editora Campus, 2004. 22
  • 111. Obrigado Profa. Elisângela Botelho Gracias elisangela.botelho@mackenzie.br Prof. Jamilson Bispo dos Santos jamilson.santos@mackenzie.br 23
  • 112. 1 Universidade Presbiteriana Mackenzie Banco de Dados – Aula 05 Linguagem PL/SQL Prof. Jamilson Bispo dos Santos
  • 113. 2 Roteiro da Apresentação  Introdução  Estrutura de um Bloco PL/SQL  Funcionamento do PL/SQL  Integrando SQL em um programa PL/SQL
  • 114. 3 Roteiro da Apresentação  Introdução  Estrutura de um Bloco PL/SQL  Funcionamento do PL/SQL  Integrando SQL em um programa PL/SQL
  • 115. 4 Introdução  PL/SQL (Program Languagem SQL) é uma extensão da linguagem SQL  Pode-se dizer que é um dialeto da linguagem SQL especializado no banco de dados Oracle  É uma linguagem procedural
  • 116. 5 Introdução  Por meio da PL/SQL, pode-se criar objetos de esquema, tais como:  Stored procedures  Triggers
  • 117. 6 Introdução  Stored procedures  Stored procedure, ou procedimento armazenado, é um programa PL/SQL que pode ser acionado por uma aplicação, por um trigger ou uma ferramenta Oracle
  • 118. 7 Introdução  Triggers  É um programa PL/SQL armazenado no banco de dados e que é executado imediatamente antes ou após os comandos INSERT, UPDATE e DELETE  A diferença principal entre um trigger e uma procedure está no fato de que as procedures são executadas através de uma chamada feita pelo usuário, enquanto os triggers são acionados pelo banco de dados
  • 119. 8 Roteiro da Apresentação  Introdução  Estrutura de um Bloco PL/SQL  Funcionamento do PL/SQL  Integrando SQL em um programa PL/SQL
  • 120. 9 Estrutura de um Bloco PL/SQL  A linguagem PL/SQL utiliza o conceito de bloco estruturado  Um bloco PL/SQL é composto por procedures e funções  A estrutura de um bloco PL/SQL é composta por uma área de declaração, uma área de comandos e uma área de exceções
  • 121. Estrutura de um Bloco PL/SQL 10 DECLARE declarações BEGIN estruturas executáveis (comandos) e outros blocos PL/SQL BEGIN EXCEPTION tratamento de exceções (pode conter outros blocos) END; END;
  • 122. Estrutura de um Bloco PL/SQL 11  Seção de declaração (DECLARE): todos os objetos são declarados  Seção de execução: os comandos PL/SQL são colocados  Seção de exceção (EXCEPTION): os erros são tratados
  • 123. Estrutura de um Bloco PL/SQL 12 DECLARE qtdade_itens NUMBER(5); BEGIN SELECT quant INTO qtdade_itens FROM estoque WHERE produto = ‘raquete de tenis’ FOR UPDATE OF quant; IF (quant > 0) THEN UPDATE estoque SET quant = quant – 1 WHERE (produto = ‘raquete de tenis’); INSERT INTO compras VALUES (‘raquete de tenis comprada’, sysdate); ELSE INSERT INTO compras VALUES (‘raquete de tenis em falta’, sysdate); END IF; END;
  • 124. Estrutura de um Bloco PL/SQL 13  O exemplo anterior faz o seguinte:  Cria uma variável chamada qtdade_itens, usada para armazenar a quantidade de itens disponível no estoque  Essa variável é preenchida com o conteúdo do campo quant da tabela estoque  Depois, através da estrutura IF ELSE, o campo quant é atualizado em função da disponibilidade de raquetes  Se houver disponibilidade, é criado um conteúdo para a tabela compras
  • 125. Estrutura de um Bloco PL/SQL 14  Seção de Declaração  Seção de Execução  Seção de Exceção
  • 126. Estrutura de um Bloco PL/SQL 15  Seção de Declaração  Seção de Execução  Seção de Exceção
  • 127. 16 Seção de Declaração  A primeira seção do bloco PL/SQL, seção de Declaração, é opcional  Contudo, se o bloco usar variáveis ou constantes, todas elas devem ser previamente declaradas antes de serem utilizadas em comandos
  • 128. 17 Seção de Declaração  Esta seção é iniciada pela palavra-chave DECLARE e o desenvolvedor pode realizar as seguintes tarefas:  Declarar o nome de um identificador  Declarar o tipo do identificador (constante ou variável)  Declarar o tipo de dado do identificador  Atribuir (inicializar) um conteúdo ao identificador
  • 129. 18 Seção de Declaração Variáveis e Constantes  A linguagem PL/SQL permite a declaração de variáveis e constantes que podem ser usadas em comandos SQL contidos em procedures e funções  Todas as variáveis e constantes usadas devem ser previamente declaradas
  • 130. 19 Seção de Declaração Variáveis e Constantes  As variáveis podem ter qualquer tipo de dado válido pela linguagem SQL e Oracle:  Char  Varchar2  Number  Date, etc.  Exemplo de declaração de uma variável: DECLARE qtdade_itens NUMBER(5);
  • 131. 20 Seção de Declaração Variáveis e Constantes  A declaração de uma constante é parecida com a de uma variável, tendo apenas que adicionar a palavra-chave CONSTANT após o seu nome  Exemplo: DECLARE qtdade_itens NUMBER(5); valor_fixo CONSTANT NUMBER(9) := 40000;
  • 132. Estrutura de um Bloco PL/SQL 21  Seção de Declaração  Seção de Execução  Seção de Exceção
  • 133. 22 Seção de Execução  A seção de execução do bloco PL/SQL é iniciada com a declaração BEGIN  Esta seção pode conter:  Comando SQL  Comandos de controles lógicos  Comandos de atribuição, dentre outros.
  • 134. Estrutura de um Bloco PL/SQL 23  Seção de Declaração  Seção de Execução  Seção de Exceção
  • 135. 24 Seção de Exceção  Na seção de exceção do bloco PL/SQL, o desenvolvedor pode usar comandos para tratar um erro que eventualmente ocorra durante a execução de um programa PL/SQL  Pode-se criar uma rotina que execute procedimentos corretivos ao detectar um erro, evitando, assim, que o sistema fique interrompido
  • 136. 25 Roteiro da Apresentação  Introdução  Estrutura de um Bloco PL/SQL  Funcionamento do PL/SQL  Integrando SQL em um programa PL/SQL
  • 137. 26 Funcionamento do PL/SQL  O PL/SQL executa os comandos procedurais e repassa os comandos SQL para o servidor Oracle processar  A criação de blocos PL/SQL pode ser feita por meio de qualquer editor de texto  Para executar um programa ou um script PL/SQL pode-se utilizar o SQL*Plus ou SQL Worsheet, que permite criar, armazenar e executar blocos PL/SQL
  • 138. 27 Funcionamento do PL/SQL  Como a maioria das linguagens procedurais, o PL/SQL possui comandos para controlar o fluxo de execução do programa  São eles que fazem a diferença, realizando desvios, analisando condições e permitindo a tomada de decisões
  • 139. 28 Funcionamento do PL/SQL  As principais estruturas de controle do PL/SQL podem ser divididas em:  Estruturas de controles condicionais  Estruturas de controles seqüenciais  Estruturas de controles de repetição ou interação
  • 140. 29 Funcionamento do PL/SQL Estruturas de Controle  Comando IF ... THEN  Comando LOOP  Comando FOR ... LOOP  Comando WHILE  Comando CASE
  • 141. 30 Funcionamento do PL/SQL Estruturas de Controle  Comando IF ... THEN  Comando LOOP  Comando FOR ... LOOP  Comando WHILE  Comando CASE
  • 142. 31 Estruturas de Controle Comando IF ... THEN  O comando IF ... THEN tem por função avaliar uma condição e executar uma ou mais linhas de comandos, somente se essa condição analisada for verdadeira  Esse comando possui 2 variações
  • 143. 32 Estruturas de Controle Comando IF ... THEN  Sintaxe1 IF <condição> THEN <comando1>; <comandoN>; END IF;
  • 144. 33 Estruturas de Controle Comando IF ... THEN  Os comandos que se encontram entre a cláusula THEN e END IF serão executados apenas se a <condição> for verdadeira
  • 145. 34 Estruturas de Controle Comando IF ... THEN  Exemplo: IF salario >= 5000 THEN UPDATE Empregado SET salario = salario * 1.2; END IF;
  • 146. 35 Estruturas de Controle Comando IF ... THEN  Sintaxe2 IF <condição> THEN <comando1>; ELSIF <condição2> THEN <comando2>; ELSIF <condição3> THEN <comando3>; ELSE <comando4>; END IF;
  • 147. 36 Estruturas de Controle Comando IF ... THEN  Na estrutura da sintaxe2, mais de uma condição pode ser analisada e, conseqüentemente, diversas ações podem ser executadas  O PL/SQL usa a cláusula ELSIF, e não ELSEIF, como outras linguagens  Um comando pode ter inúmeras cláusulas ELSIF, mas pode possuir apenas uma cláusula ELSE
  • 148. 37 Estruturas de Controle Comando IF ... THEN  Nesta estrutura, caso a condição principal for falsa, a primeira cláusula ELSIF será analisada e:  se for verdadeira, os comandos a seguir serão executados até que seja encontrada outra cláusula ELSIF ou ELSE  se for falsa, o programa testa a segunda, e assim sucessivamente. Ao encontrar uma condição verdadeira, são executados seus comandos, e o programa continua após a linha do comando END IF
  • 149. 38 Estruturas de Controle Comando IF ... THEN  Exemplo: IF salario < 2000 THEN UPDATE Empregado SET salario = salario * 1.2; ELSIF salario < 3000 THEN UPDATE Empregado SET salario = salario * 1.3; ELSE UPDATE Empregado SET salario = salario * 1.4; END IF;
  • 150. 39 Funcionamento do PL/SQL Estruturas de Controle  Comando IF ... THEN  Comando LOOP  Comando FOR ... LOOP  Comando WHILE  Comando CASE
  • 151. 40 Estruturas de Controle Comando LOOP  O comando LOOP inicializa um grupo de comandos indefinidamente ou até que uma condição force a “quebra” do loop e desvie a execução do programa para outro lugar  Ele é usado em conjunto com o comando EXIT, responsável pela parada de execução do loop
  • 152. 41 Estruturas de Controle Comando LOOP  Sintaxe LOOP <comandos> EXIT <comandos> END LOOP;
  • 153. 42 Estruturas de Controle Comando LOOP  Sintaxe (outra versão) LOOP <comandos> EXIT WHEN <condição> <comandos> END LOOP;
  • 154. 43 Estruturas de Controle Comando LOOP  Exemplo: I := 1; LOOP I := I + 1; <comandos> IF I >= 30 THEN EXIT; END IF; <comandos> END LOOP;
  • 155. 44 Estruturas de Controle Comando LOOP  Exemplo (outra versão): I := 1; LOOP I := I + 1; <comandos> EXIT WHEN I >= 30; <comandos> END LOOP;
  • 156. 45 Funcionamento do PL/SQL Estruturas de Controle  Comando IF ... THEN  Comando LOOP  Comando FOR ... LOOP  Comando WHILE  Comando CASE
  • 157. 46 Estruturas de Controle Comando FOR ... LOOP  O comando FOR ... LOOP é uma variação do comando LOOP  Aqui os comandos são executados automaticamente até que uma condição avaliada retorne falsa
  • 158. 47 Estruturas de Controle Comando FOR ... LOOP  Sintaxe FOR <contador> IN [REVERSE] <valor_inicial> .. <valor_final> LOOP <comandos> END LOOP;
  • 159. 48 Estruturas de Controle Comando FOR ... LOOP  Exemplo: FOR j IN 1 .. 10 LOOP <comandos> END LOOP;
  • 160. 49 Estruturas de Controle Comando FOR ... LOOP  Neste exemplo, o comando FOR inicializa uma variável de controle chamada “j”, cujo valor inicial é 1  Os <comandos> serão executados até encontrar o END LOOP. Nesse momento, o controle volta para o comando FOR, que incrementa a variável e analisa a condição mestra, ou seja, se o valor de j é menor que o valor final
  • 161. 50 Estruturas de Controle Comando FOR ... LOOP  A cláusula REVERSE faz com que o contador comece no valor mais alto e seja decrescido até atingir o valor mais baixo
  • 162. 51 Funcionamento do PL/SQL Estruturas de Controle  Comando IF ... THEN  Comando LOOP  Comando FOR ... LOOP  Comando WHILE  Comando CASE
  • 163. 52 Estruturas de Controle Comando WHILE  Outro controle de execução possível é o uso do comando WHILE  Essa estrutura analisa uma condição e, somente se ela for verdadeira, executa os comandos contidos dentro dessa estrutura
  • 164. 53 Estruturas de Controle Comando WHILE  Sintaxe WHILE <condição> LOOP <comandos> END LOOP;
  • 165. 54 Estruturas de Controle Comando WHILE  Exemplo: x := 1 WHILE x < 20 LOOP <comandos> x := x+1; END LOOP;
  • 166. 55 Funcionamento do PL/SQL Estruturas de Controle  Comando IF ... THEN  Comando LOOP  Comando FOR ... LOOP  Comando WHILE  Comando CASE
  • 167. 56 Estruturas de Controle Comando CASE  O comando CASE permite avaliar uma expressão e retornar um resultado entre várias alternativas disponíveis
  • 168. 57 Estruturas de Controle Comando CASE  Sintaxe CASE <expressão> WHEN <expressão1> THEN <resultado1> WHEN <expressão2> THEN <resultado2> ... WHEN <expressãoN> THEN <resultadoN> [ELSE <resultadoN+1>] END;
  • 169. 58 Estruturas de Controle Comando CASE  Exemplo: resultado := CASE nota WHEN ‘A’ THEN ‘Excelente’ WHEN ‘B’ THEN ‘Muito Bom’ WHEN ‘C’ THEN ‘Bom’ WHEN ‘D’ THEN ‘Razoável’ WHEN ‘E’ THEN ‘Fraco’ ELSE ‘Sem chance’ END;
  • 170. 59 Roteiro da Apresentação  Introdução  Estrutura de um Bloco PL/SQL  Funcionamento do PL/SQL  Integrando SQL em um programa PL/SQL
  • 171. 60 Integrando SQL em um programa PL/SQL  Comandos do tipo SQL podem ser inseridos dentro da seção de execução de um bloco PL/SQL e executados quase sem diferença  A maior novidade é que o desenvolvedor pode usar uma variável/constante declarada na seção de declaração  Com isso, além de usar o nome de colunas, o conteúdo de variáveis pode também ser manipulado pelos comandos SQL
  • 172. 61 Integrando SQL em um programa PL/SQL  Criação da tabela Temp1 no seu esquema para utilizar as estruturas de controle e a criação de variáveis (utilize a Planilha do SQL*PLUS): CREATE TABLE Temp1 (Codigo INTEGER, Data DATE, PRIMARY KEY(Codigo));
  • 173. 62 Integrando SQL em um programa PL/SQL  Comando WHILE: DECLARE i int := 0; BEGIN WHILE i <= 10 LOOP INSERT INTO Temp1 (Codigo, Data) VALUES (i, sysdate); i := i + 1; END LOOP; END;
  • 174. 63 Integrando SQL em um programa PL/SQL  Para ver o resultado utilize o comando SELECT: SELECT * FROM Temp1;
  • 175. 64 Integrando SQL em um programa PL/SQL  Este próximo exemplo é bem semelhante ao anterior, só que é utilizado o comando FOR para executar o loop  Sua vantagem é que não é necessário controlar o incremento da variável de contador por meio da programação
  • 176. 65 Integrando SQL em um programa PL/SQL  Comando FOR: DECLARE i int := 20; BEGIN FOR i IN 20 .. 30 LOOP INSERT INTO Temp1 (Codigo, Data) VALUES (i, sysdate); END LOOP; END;
  • 177. 66 Integrando SQL em um programa PL/SQL  Para visualizar o resultado dos novos dados inseridos utilize o comando SELECT: SELECT * FROM Temp1 WHERE (codigo > 10);
  • 178. 67 Integrando SQL em um programa PL/SQL  Este exemplo utiliza o exemplo anterior, mas acrescenta um teste condicional  Ele insere apenas os registros cujo código seja múltiplo de 3  Para isso, utilize a função MOD
  • 179. 68 Integrando SQL em um programa PL/SQL  Comando FOR e teste condicional: DECLARE i int := 40; BEGIN FOR i IN 40 .. 50 LOOP IF MOD(i,3) = 0 THEN INSERT INTO Temp1 (Codigo, Data) VALUES (i, sysdate); END IF; END LOOP; END;
  • 180. 69 Integrando SQL em um programa PL/SQL  Para visualizar o resultado dos novos dados inseridos utilize o comando SELECT: SELECT * FROM Temp1 WHERE (codigo >30);
  • 181. 70 Integrando SQL em um programa PL/SQL  Este exemplo também utiliza o exemplo anterior, mas o comando IF tem uma cláusula ELSE  Se o valor de i for múltiplo de 3, o registro será inserido normalmente, com o valor de i e a data do sistema  Caso contrário, é feito um cálculo para que seja gravado o valor de i*5 no primeiro campo e a data do sistema somada ao valor de i no segundo campo
  • 182. 71 Integrando SQL em um programa PL/SQL  Comando FOR e teste condicional com ELSE: DECLARE i int := 60; BEGIN FOR i IN 60 .. 70 LOOP IF MOD(i,3) = 0 THEN INSERT INTO Temp1 (Codigo, Data) VALUES (i, sysdate); ELSE INSERT INTO Temp1 (Codigo, Data) VALUES (i*5, sysdate+i); END IF; END LOOP; END;
  • 183. 72 Integrando SQL em um programa PL/SQL  Para visualizar o resultado dos novos dados inseridos utilize o comando SELECT: SELECT * FROM Temp1 WHERE (codigo>=60);
  • 184. 73 Bibliografia  FANDERUFF, D. Dominando o Oracle 9i: Modelagem e Desenvolvimento. São Paulo: Pearson Education do Brasil, 2003.  RAMALHO, J. A. Oracle 9i. São Paulo: Berkeley Brasil, 2002
  • 185. Universidade Presbiteriana Mackenzie 74 FIM !!! J Banco de Dados – Aula 11 Linguagem PL/SQL Texto original da Profa. Elisângela Botelho Gracias
  • 186. Universidade Presbiteriana Mackenzie 1 Banco de Dados - Aula 06 Procedure Prof. Jamilson Bispo dos Santos
  • 187. 2 Roteiro da Apresentação  Procedure  CREATE PROCEDURE  Excluindo uma Procedure
  • 188. 3 Roteiro da Apresentação  Procedure  CREATE PROCEDURE  Excluindo uma Procedure
  • 189. 4 Procedure  Conceito de Procedure  Uma stored procedure é um grupo de comandos SQL e PL/SQL que executam uma determinada tarefa
  • 190. 5 Procedure  Ao contrário de um trigger, que é executado automaticamente quando um evento de disparo ocorre, uma procedure precisa ser chamada a partir de um programa ou ser executada manualmente pelo usuário
  • 191. 6 Roteiro da Apresentação  Procedure  CREATE PROCEDURE  Excluindo uma Procedure
  • 192. 7 CREATE PROCEDURE CREATE [OR REPLACE] PROCEDURE nome_da_procedure (Argumento1 modo Tipo_de_Dados, Argumento2 modo Tipo_de_Dados, ArgumentoN modo Tipo_de_Dados) IS variáveis locais, constantes, ... BEGIN Bloco PL/SQL END nome_da_procedure;
  • 193. 8 CREATE PROCEDURE  OR REPLACE: recria uma procedure já existente, sem ter que eliminá-la  Argumento: é o nome da variável que será enviada ou retornada do ambiente chamador para a procedure e pode ser passada em um dos 3 modos (IN, OUT, IN OUT)
  • 194. 9 CREATE PROCEDURE  IN: especifica que se deve determinar um valor para o argumento quando o procedimento for chamado  OUT: especifica que o procedimento devolve um valor para esse argumento quando o procedimento for chamado  IN OUT: especifica que se deve determinar um valor para o argumento quando o procedimento for chamado, e que o procedimento devolve um valor ao seu ambiente de chamada após sua execução
  • 195. 10 CREATE PROCEDURE  Tipo_de_dados: é o tipo de dado do argumento, que são especificados sem comprimento, precisão ou escala (por exemplo VARCHAR). O Oracle deriva o comprimento, precisão ou escala de um argumento do ambiente a partir do qual o procedimento é chamado
  • 196. 11 CREATE PROCEDURE  BLOCO PL/SQL: é o bloco PL/SQL que o Oracle executa
  • 197. 12 CREATE PROCEDURE  Exemplo1:  deseja-se criar uma procedure que aumente o salário de todos os empregados em 10%  para este exemplo crie a seguinte tabela Funcionarios com os atributos: Cod_func, Nome_Func, Salario e Cod_Depto (insira alguns dados nesta tabela)
  • 198. 13 CREATE PROCEDURE CREATE TABLE Funcionarios (Cod_Func integer, Nome_Func varchar(20), Salario integer, Cod_Depto integer, PRIMARY KEY(Cod_Func)); INSERT INTO Funcionarios VALUES (1, ’Joao’, 2000, 2); INSERT INTO Funcionarios VALUES (2, ’Ana’, 2500, 1);
  • 199. 14 CREATE PROCEDURE CREATE OR REPLACE PROCEDURE Aumento_Salario IS BEGIN UPDATE Funcionarios SET Salario = Salario * 1.1; END Aumento_Salario;
  • 200. 15 CREATE PROCEDURE  A execução de uma procedure é feita por meio de uma chamada ao seu nome  Pode ser feita dentro de um trigger ou de outra procedure, bastando especificar o nome da procedure  A partir do SQL*Plus, uma procedure pode ser chamada por meio do comando EXECUTE  Exemplo: EXECUTE Aumento_Salario;
  • 201. 16 CREATE PROCEDURE  Observe, agora, os dados da tabela Funcionarios SELECT * FROM Funcionarios;
  • 202. 17 CREATE PROCEDURE  Exemplo2 (procedure com parâmetros):  deseja-se criar uma procedure que aumente os salários dos funcionários  só que desta vez os salários serão aumentados somente para os funcionários de um determinado departamento e com um percentual diferente
  • 203. 18 CREATE PROCEDURE CREATE OR REPLACE PROCEDURE Aumento_Salario_Depto (vdepto IN Funcionarios.Cod_Depto%type, percentual number) IS BEGIN UPDATE Funcionarios SET Salario = Salario * (1 + percentual/100) WHERE (Cod_Depto = vdepto); END Aumento_Salario_Depto;
  • 204. 19 CREATE PROCEDURE  Executando a procedure criada no exemplo2:  EXECUTE Aumento_Salario_Depto(1,20);  A execução desta procedure com os argumentos acima fará o seguinte: aumentará em 20% os salários dos empregados que são do departamento de código = 1
  • 205. 20 CREATE PROCEDURE  Observe, novamente, como os dados dos funcionários cujo cod_depto = 1 foram atualizados: SELECT * FROM Funcionarios WHERE (Cod_depto = 1);
  • 206. 21 Roteiro da Apresentação  Procedure  CREATE PROCEDURE  Excluindo uma Procedure
  • 207. 22 Excluindo uma Procedure  Para excluir uma procedure deve ser usado o comando:  DROP PROCEDURE nome_da_procedure;  Exemplo: DROP PROCEDURE Aumenta_Salario;
  • 208. 23 Bibliografia  FANDERUFF, D. Dominando o Oracle 9i: Modelagem e Desenvolvimento. São Paulo: Pearson Education do Brasil, 2003.  RAMALHO, J. A. Oracle 9i. São Paulo: Berkeley Brasil, 2002
  • 209. Universidade Presbiteriana Mackenzie 24 FIM !!! J Banco de Dados - Aula 13 Procedure Texto original da Profa. Elisângela Botelho Gracias
  • 210. Universidade Presbiteriana Mackenzie Banco de Dados II - Aula 06 Funções Profa. Elisângela Botelho Gracias Faculdade de Computação e Informática 1
  • 211. 2 Funções • Funções são subprogramas que tem por objetivo retornar algum resultado ou valor • A função pode ser invocada por meio de um comando SELECT e também usada em cálculos como outra função do Oracle (já que ela sempre retorna um valor)
  • 212. 3 Funções • Uma função é muito parecida com uma stored procedure • A principal diferença entre ambas está no fato de que uma função, obrigatoriamente, deve retornar um valor por meio da cláusula RETURN
  • 213. 4 CREATE FUNCTION CREATE [OR REPLACE] FUNCTION nome_da_funcao (Argumento1 IN Tipo_de_Dados, Argumento2 IN Tipo_de_Dados, ArgumentoN IN Tipo_de_Dados) RETURN Tipo_de_Dado IS declarações BEGIN Bloco PL/SQL END nome_da_funcao;
  • 214. 5 CREATE FUNCTION • OR REPLACE: recria uma função já existente, sem ter que eliminá-la • Argumento: é o nome do argumento da função, ou seja, é o nome da variável que será enviada para a função. Nunca utilize para um argumento um nome de um atributo de uma tabela que esteja utilizando nesta função • IN: especifica que se deve determinar um valor para o argumento quando a função for chamada
  • 215. 6 CREATE FUNCTION • Tipo_de_dados: é o tipo de dado do argumento, que são especificados sem comprimento, precisão ou escala (por exemplo: VARCHAR). O Oracle deriva o comprimento, precisão ou escala de um argumento do ambiente a partir do qual a função é utilizada – Uma outra forma de atribuir o tipo de dado a um argumento é herdar o tipo de dados de um atributo de uma tabela da seguinte maneira: nome_tabela.nome_atributo%type
  • 216. 7 CREATE FUNCTION • RETURN Tipo_de_Dado: especifica o tipo de dado do valor de retorno da função • BLOCO PL/SQL: é o bloco PL/SQL que o Oracle executa
  • 217. 8 CREATE FUNCTION Considere o seguinte Banco de Dados para os exemplos desta aula: Departamento = {Cod_Depto, Nome_Depto} Funcionario = {Cod_Func, Nome_Func, Salario, Cod_Depto} - Cod_depto é chave estrangeira que referencia o atributo Cod_depto da tabela Departamento Projeto = {Cod_Proj, Nome_Proj, Duracao} Func_Proj = {Cod_Func, Cod_Proj, Horas_Trab} - Cod_Func é chave estrangeira que referencia o atributo Cod_Func da tabela Funcionario - Cod_Proj é chave estrangeira que referencia o atributo Cod_Proj da tabela Projeto
  • 218. 9
  • 220. 11 -- Script de Criação do BD Projeto DROP TABLE Func_Proj CASCADE CONSTRAINT; DROP TABLE Projeto CASCADE CONSTRAINT; DROP TABLE Funcionario CASCADE CONSTRAINT; DROP TABLE Departamento CASCADE CONSTRAINT; CREATE TABLE Departamento (Cod_Depto INTEGER, Nome_Depto VARCHAR(20) NOT NULL, PRIMARY KEY(Cod_Depto)); CREATE TABLE Funcionario (Cod_Func INTEGER, Nome_Func VARCHAR(20) NOT NULL, Salario INTEGER NOT NULL, Cod_Depto INTEGER NOT NULL, PRIMARY KEY(Cod_Func), FOREIGN KEY (Cod_Depto) REFERENCES Departamento (Cod_Depto)); CREATE TABLE Projeto (Cod_Proj INTEGER, Nome_Proj VARCHAR(20) NOT NULL, Duracao INTEGER NOT NULL, PRIMARY KEY(Cod_Proj)); CREATE TABLE Func_Proj (Cod_Func INTEGER, Cod_Proj INTEGER, Horas_Trab INTEGER, PRIMARY KEY(Cod_Func, Cod_Proj), FOREIGN KEY (Cod_Func) REFERENCES Funcionario(Cod_Func), FOREIGN KEY (Cod_Proj) REFERENCES Projeto(Cod_Proj));
  • 221. 12 INSERT INTO Departamento (Cod_Depto, Nome_Depto) VALUES (1, 'Marketing'); INSERT INTO Departamento (Cod_Depto, Nome_Depto) VALUES (2, 'Vendas'); INSERT INTO Departamento (Cod_Depto, Nome_Depto) VALUES (3, 'Dados'); INSERT INTO Departamento (Cod_Depto, Nome_Depto) VALUES (4, 'Pesquisa'); INSERT INTO Funcionario (Cod_Func, Nome_Func, Salario, Cod_Depto) VALUES (101, 'Joao da Silva ', 2000, 2); INSERT INTO Funcionario (Cod_Func, Nome_Func, Salario, Cod_Depto) VALUES (102, 'Mario Souza', 1500, 1); INSERT INTO Funcionario (Cod_Func, Nome_Func, Salario, Cod_Depto) VALUES (103, 'Sergio Santos', 2400, 2); INSERT INTO Funcionario (Cod_Func, Nome_Func, Salario, Cod_Depto) VALUES (104, 'Maria Castro', 1200, 1); INSERT INTO Funcionario (Cod_Func, Nome_Func, Salario, Cod_Depto) VALUES (105, 'Marcio Santana', 1400, 4); INSERT INTO Projeto (Cod_Proj, Nome_Proj, Duracao) VALUES (1001, 'SistemaA', 2); INSERT INTO Projeto (Cod_Proj, Nome_Proj, Duracao) VALUES (1002, 'SistemaB', 6); INSERT INTO Projeto (Cod_Proj, Nome_Proj, Duracao) VALUES (1003, 'SistemaX', 4); INSERT INTO Func_Proj (Cod_Func, Cod_Proj, Horas_Trab) VALUES (101, 1001, 24); INSERT INTO Func_Proj (Cod_Func, Cod_Proj, Horas_Trab) VALUES (101, 1002, 160); INSERT INTO Func_Proj (Cod_Func, Cod_Proj, Horas_Trab) VALUES (102, 1001, 56); INSERT INTO Func_Proj (Cod_Func, Cod_Proj, Horas_Trab) VALUES (102, 1003, 45); INSERT INTO Func_Proj (Cod_Func, Cod_Proj, Horas_Trab) VALUES (103, 1001, 86); INSERT INTO Func_Proj (Cod_Func, Cod_Proj, Horas_Trab) VALUES (103, 1003, 64); INSERT INTO Func_Proj (Cod_Func, Cod_Proj, Horas_Trab) VALUES (104, 1001, 46); COMMIT;
  • 222. 13 CREATE FUNCTION • Exemplo1: – deseja-se criar uma função que retorne a quantidade de funcionários de um determinado departamento – para isso, a função receberá como argumento o código do departamento que será totalizado
  • 223. 14 CREATE FUNCTION CREATE OR REPLACE FUNCTION Total_Emp_Depto (vdepto IN Funcionario.Cod_Depto%type) RETURN INTEGER IS emptotal INTEGER; BEGIN SELECT COUNT(*) INTO emptotal FROM Funcionario WHERE (Cod_Depto = vdepto); RETURN emptotal; END Total_Emp_Depto;
  • 224. 15 CREATE FUNCTION CREATE OR REPLACE FUNCTION Total_Emp_Depto (vdepto IN Funcionario.Cod_Depto%type) RETURN INTEGER IS emptotal INTEGER; BEGIN SELECT COUNT(*) INTO emptotal FROM Funcionario WHERE (Cod_Depto = vdepto); RETURN emptotal; END Total_Emp_Depto; Não se esquecer de retornar o valor da função
  • 225. 16 CREATE FUNCTION • Se a função não foi compilada com sucesso (corretamente) ou contém erros, pode-se utilizar o seguinte comando para que o Oracle aponte o erro: SHOW ERRORS;
  • 226. 17 CREATE FUNCTION • No exemplo anterior, é inserido apenas o código do departamento como argumento da função • Em seguida, é especificado que a função retorna um dado do tipo integer • É criada uma variável chamada emptotal, que receberá o total de funcionários do departamento
  • 227. 18 Utilizando uma Função • Para exibir o resultado de uma função, deve-se utilizar o comando SELECT, especificando o nome da função que está sendo pesquisada na tabela DUAL (que é uma tabela do sistema), juntamente com o(s) valor(es) do(s) argumento(s) da função • Exemplo: SELECT Total_Emp_Depto(1) FROM DUAL;
  • 228. 19 CREATE FUNCTION • Exemplo2: – deseja-se criar uma função que retorne o total gasto em salário pago aos funcionários de um determinado departamento (será passado o nome do departamento) – para isso, a função receberá como argumento o nome do departamento que deseja-se saber o total gasto com salário pago aos funcionários
  • 229. 20 CREATE FUNCTION CREATE OR REPLACE FUNCTION Total_Salario_Depto (ndepto IN Departamento.Nome_Depto%type) RETURN INTEGER IS total INTEGER; BEGIN SELECT SUM(F.Salario) INTO total FROM Funcionario F INNER JOIN Departamento D ON (F.Cod_Depto = D.Cod_Depto) WHERE (D.Nome_Depto = ndepto) ; RETURN total; END Total_Salario_Depto;
  • 230. CREATE FUNCTION CREATE OR REPLACE FUNCTION Total_Salario_Depto (ndepto IN Departamento.Nome_Depto%type) RETURN INTEGER IS total INTEGER; BEGIN SELECT SUM(F.Salario) INTO total FROM Funcionario F INNER JOIN Departamento D ON (F.Cod_Depto = D.Cod_Depto) WHERE (D.Nome_Depto = ndepto) ; RETURN total; END Total_Salario_Depto; 21
  • 231. 22 CREATE FUNCTION • No exemplo anterior, é inserido apenas o nome do departamento como argumento da função • Em seguida, é especificado que a função retorna um dado do tipo INTEGER • É criada uma variável chamada total, que receberá a soma dos salários pagos em um determinado departamento
  • 232. Utilizando uma Função • É possível utilizar a função criada em uma consulta, como, por exemplo: selecione o nome de cada departamento e o total gasto em salário em cada departamento, mas retorne somente os departamentos que gastam mais que o departamento de ‘Marketing’. SELECT D.Nome_Depto, SUM(F.Salario) FROM Funcionario F INNER JOIN Departamento D ON (F.Cod_Depto = D.Cod_Depto) GROUP BY D.Nome_Depto HAVING SUM(F.Salario) > Total_Salario_Depto ('Marketing'); 23
  • 233. Executando uma Função • É possível utilizar a função criada em uma consulta, como, por exemplo: selecione o nome de cada departamento e o total Utilizando a função gasto em salário em cada departamento, mas retorne somente Total_Salario_Depto, os departamentos que gastam mais que o departamento de criada anteriormente, ‘Marketing’. SELECT D.Nome_Depto, SUM(na F.consulta Salario) FROM Funcionario F INNER JOIN Departamento D ON (F.Cod_Depto = D.Cod_Depto) GROUP BY D.Nome_Depto HAVING SUM(F.Salario) > Total_Salario_Depto ('Marketing'); 24
  • 234. 25 Excluindo uma Função • Para excluir uma função deve ser usado: DROP FUNCTION nome_da_funcao; • Exemplo: DROP FUNCTION Total_Salario_Depto;
  • 235. 26 EXERCÍCIO RESOLVIDO • Crie uma função que retorne o quanto um funcionário irá receber pelo número de horas trabalhadas, considerando que serão passados, como argumentos, o nome do funcionário e o valor de cada hora trabalhada
  • 236. 27 CREATE OR REPLACE FUNCTION Total_Pago (nfunc IN VARCHAR, valor IN INTEGER) RETURN INTEGER IS total INTEGER; vcodfunc INTEGER; BEGIN SELECT Cod_Func INTO vcodfunc FROM Funcionario WHERE (Nome_Func = nfunc) ; SELECT SUM(Horas_Trab) * valor INTO total FROM Func_Proj WHERE (Cod_Func = vcodfunc ) ; RETURN total; END Total_Pago;
  • 237. 28 CREATE OR REPLACE FUNCTION Total_Pago (nfunc IN VARCHAR, valor IN INTEGER) RETURN INTEGER IS total INTEGER; vcodfunc INTEGER; BEGIN SELECT Cod_Func INTO vcodfunc FROM Funcionario WHERE (Nome_Func = nfunc) ; SELECT SUM(Horas_Trab) * valor INTO total FROM Func_Proj WHERE (Cod_Func = vcodfunc ) ; RETURN total; END Total_Pago; Argumentos da função Tipo de dado que será retornado Variáveis locais SELECT para retornar o código do funcionário Retorno do valor da função SELECT para retornar o total a ser pago ao funcionário
  • 238. 29 EXERCÍCIO RESOLVIDO • Para exibir o resultado de uma função, deve-se utilizar o comando SELECT na tabela Dual: SELECT Total_Pago('Mario Souza', 50) FROM DUAL;
  • 239. 30 EXERCÍCIOS 1) Crie uma função que retorne o nome do departamento que um determinado funcionário pertence, considerando que será passado, como argumento, somente o nome do funcionário. 1) Crie uma função que retorne o total de horas utilizadas pelos funcionários em um determinado projeto, considerando que será passado, como argumento, somente o nome do projeto.
  • 240. 31 Bibliografia • FANDERUFF, D. Dominando o Oracle 9i: Modelagem e Desenvolvimento. São Paulo: Pearson Education do Brasil, 2003. • RAMALHO, J. A. Oracle 9i. São Paulo: Berkeley Brasil, 2002
  • 241. Obrigado Profa. Elisângela Botelho Gracias elisangela.botelho@mackenzie.br 32
  • 242. Universidade Presbiteriana Mackenzie Banco de Dados II - Aula 07 Trigger Profa. Elisângela Botelho Gracias Faculdade de Computação e Informática 1
  • 243. 2 Roteiro da Apresentação • Trigger • CREATE TRIGGER • Alteração de um trigger • Ativação/Desativação de um trigger • Exclusão de um trigger
  • 244. 3 Roteiro da Apresentação • Trigger • CREATE TRIGGER • Alteração de um trigger • Ativação/Desativação de um trigger • Exclusão de um trigger
  • 245. 4 Trigger • Conceito de Triggers – São blocos PL/SQL disparados automaticamente e implicitamente sempre que ocorre um evento associado a uma tabela ou visão (INSERT, UPDATE ou DELETE)
  • 246. 5 Trigger • O nome trigger, que significa gatilho em inglês, traduz bem o seu funcionamento • Ele é disparado quando os comando INSERT, UPDATE ou DELETE são executados • A principal aplicação de um trigger é a criação de consistências e restrições de acesso ao banco de dados
  • 247. 6 Trigger • Os triggers podem ser utilizados para: – Implementação de regras de negócios – Geração de valores calculados – Manutenção da integridade referencial dos dados – Replicação de dados – Manutenção de registro histórico de alterações ocorridas no banco de dados
  • 248. 7 Trigger • Os triggers podem ser utilizados para (continuação): – Criar o conteúdo de uma coluna derivada de outras colunas – Criar mecanismos de validação que envolvam pesquisas em múltiplas tabelas – Atualizar outras tabelas em função de inclusão ou alteração da tabela atual, etc.
  • 249. 8 Trigger • Um trigger está associado a uma tabela e, em alguns casos, a uma visão • Quando uma visão é utilizada, os triggers da tabela base são normalmente acionados
  • 250. 9 Trigger • Um trigger pode fazer o papel de uma restrição (constraint) para forçar alguma regra de integridade • Mas se uma tarefa puder ser feita tanto com triggers quanto com uma restrição já implementada no banco, use a restrição como primeira opção
  • 251. Trigger • Os triggers, neste caso, deveriam ser usados apenas quando uma regra de integridade referencial não puder ser executada usando as restrições conhecidas, como: – NOT NULL, PRIMARY KEY, FOREIGN KEY, etc. 10
  • 252. Trigger • Os triggers oferecem um mecanismo poderoso para tratar as alterações em um banco de dados, mas eles devem ser usados com muito cuidado • Isso porque o efeito de vários triggers pode ser muito complexo e a execução de um trigger pode ativar outro trigger, e este ativa o trigger anterior novamente, gerando uma recursão 11
  • 253. 12 Trigger • Tempo do trigger: – O tempo do trigger indica quando ele será disparado em relação à execução do evento – Os tempos podem ser BEFORE (antes do evento) ou AFTER (depois do evento)
  • 254. 13 Trigger • Evento de disparo do trigger: – O evento de disparo indica qual a operação de manipulação de dados efetuada sobre uma tabela (ou visão) que vai disparar o trigger – Os eventos de disparo podem ser: INSERT, UPDATE ou DELETE
  • 255. 14 Trigger • O tipo de trigger indica quantas vezes ele poderá ser disparado em uma tabela – Comando: associada ao comando como um todo, é acionada antes ou depois de um evento – Linha: acionada uma vez para cada linha afetada pelo evento ao qual o trigger estiver associado
  • 256. 15 Trigger • Regras para a criação de triggers: – O número máximo de triggers possíveis para uma tabela é doze, ou seja, todas as combinações possíveis entre tempos, eventos de disparo e tipos de triggers – Não é permitida a criação de triggers com o mesmo tempo, evento de disparo e tipo de trigger para uma mesma tabela (ou visão)
  • 257. 16 Roteiro da Apresentação • Trigger • CREATE TRIGGER • Alteração de um trigger • Ativação/Desativação de um trigger • Exclusão de um trigger
  • 258. 17 CREATE TRIGGER CREATE [OR REPLACE] TRIGGER nome_da_trigger BEFORE/AFTER DELETE OR INSERT OR UPDATE [OF nome_coluna1, nome_coluna2, ...] ON nome_da_tabela [FOR EACH ROW] [REFERENCING, OLD AS nome NEW AS nome] [WHEN condição] BLOCO PL/SQL
  • 259. 18 CREATE TRIGGER • OR REPLACE: recria um trigger já existente, sem ter que eliminá-lo • BEFORE: faz o Oracle disparar o trigger antes de executar o comando de disparo • AFTER: faz o Oracle disparar o trigger após a execução do comando de disparo
  • 260. 19 CREATE TRIGGER • DELETE: faz o Oracle disparar o trigger sempre que um comando DELETE eliminar uma linha da tabela • INSERT: faz o Oracle disparar o trigger sempre que um comando INSERT adicionar uma linha à tabela • UPDATE: faz o Oracle disparar o trigger sempre que um comando UPDATE alterar um valor em uma das colunas especificadas na cláusula OF. Se não for especificado nenhum atributo, sempre que ocorrer qualquer atualização, o trigger será disparado
  • 261. 20 CREATE TRIGGER • ON: especifica o nome da tabela (ou visão) • REFERENCING: especifica nomes de correlação • FOR EACH ROW: designa um trigger como um trigger de linha. O Oracle dispara um trigger de linha para cada linha que for afetada por um comando de disparo
  • 262. 21 CREATE TRIGGER • WHEN: utilizada para restringir as linhas que irão disparar o trigger (ou seja, uma condição que precisa ser atendida para o Oracle disparar o trigger) • BLOCO PL/SQL: é o bloco PL/SQL que o Oracle executa
  • 263. 22 CREATE TRIGGER • Referências aos valores dos atributos da tabela que disparou o trigger, dentro de um trigger: – Dentro de um trigger é possível acessar o valor de um atributo de uma linha, podendo-se obter tanto o valor antigo (:old) quanto o novo valor (:new) – Para o comando INSERT, os valores dos atributos que serão gravados devem ser precedidos por :new.nome_do_atributo
  • 264. CREATE TRIGGER • Referências aos valores dos atributos da tabela que disparou o trigger, dentro de um trigger: – Para o comando DELETE, os valores dos atributos da linha que está sendo processada devem ser precedidos por :old.nome_do_atributo – Para o comando UPDATE, o valor original que está gravado é acessado por :old.nome_do_atributo e os novos valores que serão gravados devem ser precedidos por :new.nome_do_atributo 23
  • 265. 24 CREATE TRIGGER • Dentro dos triggers são disponibilizados predicados para testar o evento que dispara o trigger e realizar uma ação de acordo com cada um deles. Esses predicados são: – inserting: retorna true se o trigger foi disparado por um comando INSERT – updating: retorna true se o trigger foi disparado por um comando UPDATE – deleting: retorna true se o trigger foi disparado por um comando DELETE
  • 266. 25 CREATE TRIGGER Considere o seguinte Banco de Dados para os exemplos desta aula: Departamento = {Cod_Depto, Nome_Depto} Funcionario = {Cod_Func, Nome_Func, Salario, Cod_Depto} - Cod_depto é chave estrangeira que referencia o atributo Cod_depto da tabela Departamento Projeto = {Cod_Proj, Nome_Proj, Duracao} Func_Proj = {Cod_Func, Cod_Proj, Horas_Trab} - Cod_Func é chave estrangeira que referencia o atributo Cod_Func da tabela Funcionario - Cod_Proj é chave estrangeira que referencia o atributo Cod_Proj da tabela Projeto
  • 267. 26
  • 268. 27 CREATE TRIGGER • Inicialmente, este banco de dados está vazio, mas ao longo desta aula iremos inserir dados para observar o comportamento dos triggers que serão criados
  • 269. 28 -- Script de Criação do BD Projeto DROP TABLE Func_Proj CASCADE CONSTRAINT; DROP TABLE Projeto CASCADE CONSTRAINT; DROP TABLE Funcionario CASCADE CONSTRAINT; DROP TABLE Departamento CASCADE CONSTRAINT; CREATE TABLE Departamento (Cod_Depto INTEGER, Nome_Depto VARCHAR(20) NOT NULL, PRIMARY KEY(Cod_Depto)); CREATE TABLE Funcionario (Cod_Func INTEGER, Nome_Func VARCHAR(20) NOT NULL, Salario INTEGER NOT NULL, Cod_Depto INTEGER NOT NULL, PRIMARY KEY(Cod_Func), FOREIGN KEY (Cod_Depto) REFERENCES Departamento (Cod_Depto)); CREATE TABLE Projeto (Cod_Proj INTEGER, Nome_Proj VARCHAR(20) NOT NULL, Duracao INTEGER NOT NULL, PRIMARY KEY(Cod_Proj)); CREATE TABLE Func_Proj (Cod_Func INTEGER, Cod_Proj INTEGER, Horas_Trab INTEGER, PRIMARY KEY(Cod_Func, Cod_Proj), FOREIGN KEY (Cod_Func) REFERENCES Funcionario(Cod_Func), FOREIGN KEY (Cod_Proj) REFERENCES Projeto(Cod_Proj));
  • 270. 29 CREATE TRIGGER • Crie mais uma tabela, Criacao_Depto, que será utilizada no próximo exemplo1 de trigger: CREATE TABLE Criacao_Depto( Cod_Depto INTEGER, Nome_Depto VARCHAR(40), Dt_criacao DATE, PRIMARY KEY(Cod_Depto));
  • 271. 30 CREATE TRIGGER • Exemplo1: – deseja-se criar um trigger que será disparado quando um novo departamento for inserido – quando este evento ocorrer, o trigger deverá inserir uma nova linha na tabela Criacao_Depto com o código e nome do novo departamento e a data que ele foi inserido no banco de dados
  • 272. 31 CREATE TRIGGER CREATE OR REPLACE TRIGGER Depto_Criacao AFTER INSERT ON Departamento FOR EACH ROW BEGIN INSERT INTO Criacao_Depto(Cod_depto,Nome_Depto,Dt_criacao) VALUES (:new.Cod_Depto,:new.Nome_Depto,sysdate); END;
  • 273. 32 CREATE TRIGGER CREATE OR REPLACE TRIGGER Depto_Criacao AFTER INSERT Novo valor do código Novo valor do nome do do departamento que departamento que ON Departamento acabou de ser acabou de ser inserido FOR EACH ROW inserido na tabela na tabela Departamento Departamento BEGIN INSERT INTO Criacao_Depto(Cod_depto,Nome_Depto,Dt_criacao) VALUES (:new.Cod_Depto,:new.Nome_Depto,sysdate); END;
  • 274. 33 CREATE TRIGGER • Se o trigger não for compilado com sucesso (corretamente) ou contém erros, pode-se utilizar o seguinte comando, para que o Oracle aponte o erro: SHOW ERRORS;
  • 275. 34 CREATE TRIGGER • Se você inserir um novo departamento na tabela Departamento, observe o que acontecerá com a tabela Criacao_Depto!! • Será que o trigger criado realmente está funcionando?
  • 276. 35 CREATE TRIGGER • Insira um novo departamento na tabela Departamento: INSERT INTO Departamento (Cod_Depto,Nome_Depto) VALUES (5, 'Desenvolvimento');
  • 277. 36 CREATE TRIGGER • Observe, agora, os dados inseridos na tabela Criacao_Depto pelo trigger: SELECT * FROM Criacao_Depto;
  • 278. 37 CREATE TRIGGER • Crie as tabelas Total_Horas e Historico_Salario que serão utilizadas no próximo exemplo2 : CREATE TABLE Total_Horas ( Cod_Func INTEGER, Total INTEGER, PRIMARY KEY(Cod_Func)); CREATE TABLE Historico_Salario ( Cod_Func INTEGER, Salario_Antigo INTEGER, Salario_Atual INTEGER, PRIMARY KEY(Cod_Func, Salario_Antigo, Salario_Atual));
  • 279. 38 CREATE TRIGGER • Exemplo2: – crie um trigger que deverá ser disparado quando um novo funcionário for inserido ou quando o salário for atualizado – se um novo funcionário for inserir, esse trigger deverá inserir uma nova linha na tabela Total_Horas com o código do funcionário e zero para o total de horas, já que ele acabou de ser inserido no banco de dados
  • 280. 39 CREATE TRIGGER • Exemplo2: – se o salário do funcionário for atualizado, esse trigger deverá inserir uma nova linha na tabela Historio_Salario com o código do funcionário, o valor do salário antes da atualização e o novo salário (após a atualização)
  • 281. 40 CREATE TRIGGER CREATE OR REPLACE TRIGGER Insere_Func BEFORE INSERT OR UPDATE OF Salario ON Funcionario FOR EACH ROW BEGIN IF inserting THEN INSERT INTO Total_Horas (Cod_Func, Total) VALUES (:new.Cod_func, 0); ELSIF updating THEN INSERT INTO Historico_Salario (Cod_Func, Salario_Antigo, Salario_Atual) VALUES (:old.Cod_func, :old.Salario, :new.Salario); END IF; END;
  • 282. 41 CREATE TRIGGER CREATE OR REPLACE TRIGGER Insere_Func BEFORE INSERT OR UPDATE OF Salario ON Funcionario FOR EACH ROW BEGIN IF inserting THEN INSERT INTO Total_Horas (Cod_Func, Total) VALUES (:new.Cod_func, 0); ELSIF updating THEN INSERT INTO Historico_Salario (Cod_Func, Salario_Antigo, Salario_Atual) VALUES (:old.Cod_func, :old.Salario, :new.Salario); END IF; END; O trigger vai ser disparado somente quando houver a inserção de um funcionário ou a atualização do salário na tabela Funcionario Se o trigger foi disparado pela inserção, uma nova linha será inserida na tabela Total_Horas Se o trigger foi disparado pela atualização do salário, uma nova linha será inserida na tabela Historico_Salario
  • 283. 42 CREATE TRIGGER • Se você inserir um ou mais funcionários na tabela Funcionário, observe o que acontecerá com a tabela Total_Horas!!! • Será que o trigger criado realmente está funcionando?
  • 284. 43 CREATE TRIGGER • Insira alguns departamentos e, logo após, alguns funcionários: INSERT INTO Departamento (Cod_Depto, Nome_Depto) VALUES (1, 'Marketing'); INSERT INTO Departamento (Cod_Depto, Nome_Depto) VALUES (2, 'Vendas'); INSERT INTO Departamento (Cod_Depto, Nome_Depto) VALUES (3, 'Dados'); INSERT INTO Departamento (Cod_Depto, Nome_Depto) VALUES (4, 'Pesquisa'); INSERT INTO Funcionario (Cod_Func, Nome_Func, Salario, Cod_Depto) VALUES (101, 'Joao da Silva ', 2000, 2); INSERT INTO Funcionario (Cod_Func, Nome_Func, Salario, Cod_Depto) VALUES (102, 'Mario Souza', 1500, 1); INSERT INTO Funcionario (Cod_Func, Nome_Func, Salario, Cod_Depto) VALUES (103, 'Sergio Santos', 2400, 2); INSERT INTO Funcionario (Cod_Func, Nome_Func, Salario, Cod_Depto) VALUES (104, 'Maria Castro', 1200, 1); INSERT INTO Funcionario (Cod_Func, Nome_Func, Salario, Cod_Depto) VALUES (105, 'Marcio Santana', 1400, 4);
  • 285. 44 CREATE TRIGGER • Observe, agora: – os dados inseridos na tabela Criacao_Depto devido ao trigger do exemplo1 SELECT * FROM Criacao_Depto; – os dados inseridos na tabela Total_Horas pelo trigger criado anteriormente SELECT * FROM Total_Horas;
  • 286. 45 CREATE TRIGGER • Atualize o salário de algum funcionário: UPDATE Funcionario SET Salario = 7000 WHERE (Cod_Func = 103); • Observe, agora, os dados inseridos na tabela Historico_Salario devido ao trigger criado anteriormente: SELECT * FROM Historico_Salario;
  • 287. 46 CREATE TRIGGER • Crie a tabela Qtdade_Func que será utilizada no próximo exemplo3 de trigger: CREATE TABLE Qtdade_Func ( Cod_Proj INTEGER, Qtdade INTEGER, PRIMARY KEY(Cod_Proj) );
  • 288. 47 CREATE TRIGGER • Exemplo3: – crie um trigger que deverá ser disparado quando um novo projeto for inserido – esse trigger deverá inserir uma nova linha na tabela Qtdade_Func com o código do projeto e zero para o total de funcionários, já que ele acabou de ser inserido no banco de dados
  • 289. 48 CREATE TRIGGER CREATE OR REPLACE TRIGGER Insere_Proj AFTER INSERT ON Projeto FOR EACH ROW BEGIN INSERT INTO Qtdade_Func (Cod_Proj, Qtdade) VALUES (:new.Cod_proj, 0); END;
  • 290. 49 CREATE TRIGGER • Se você inserir um ou mais projetos na tabela Projeto, observe o que acontecerá com a tabela Qtdade_Func!!! • Será que o trigger criado realmente está funcionando?
  • 291. 50 CREATE TRIGGER • Insira alguns projetos: INSERT INTO Projeto (Cod_Proj, Nome_Proj, Duracao) VALUES (1001, 'SistemaA', 2); INSERT INTO Projeto (Cod_Proj, Nome_Proj, Duracao) VALUES (1002, 'SistemaB', 6); INSERT INTO Projeto (Cod_Proj, Nome_Proj, Duracao) VALUES (1003, 'SistemaX', 4);
  • 292. 51 CREATE TRIGGER • Observe, agora, os dados inseridos na tabela Qtdade_Func devido ao trigger criado anteriormente: SELECT * FROM Qtdade_Func;
  • 293. 52 CREATE TRIGGERE • Exemplo4: – deseja-se criar um trigger que deve ser disparado quando uma nova linha for inserida na tabela Func_Proj
  • 294. 53 CREATE TRIGGERE • Exemplo4: – se for inserida uma nova linha, então o trigger deve: • atualizar o atributo Total da tabela Qtdade_Func em mais 1, para aquele código de projeto inserido • a mesma coisa deve ser feita para a tabela Total_Horas, ou seja, atualizar a quantidade total de horas que aquele funcionário trabalhou nos projetos
  • 295. 54 CREATE TRIGGER CREATE OR REPLACE TRIGGER Atualiza_Qtdade AFTER INSERT ON Func_Proj FOR EACH ROW BEGIN UPDATE Total_Horas SET Total = Total + :new.Horas_Trab WHERE (Cod_Func = :new.Cod_Func); UPDATE Qtdade_Func SET Qtdade = Qtdade + 1 WHERE (Cod_Proj = :new.Cod_Proj); END;
  • 296. 55 CREATE TRIGGER • Se você inserir uma linha ou mais na tabela Func_Proj, observe o que acontecerá com as tabelas Qtdade_Func e Total_Horas!!! • Será que o trigger criado realmente está funcionando?
  • 297. 56 CREATE TRIGGER • Insira algumas linhas na tabela Func_Proj: INSERT INTO Func_Proj (Cod_Func, Cod_Proj, Horas_Trab) VALUES (101, 1001, 24); INSERT INTO Func_Proj (Cod_Func, Cod_Proj, Horas_Trab) VALUES (101, 1002, 160); INSERT INTO Func_Proj (Cod_Func, Cod_Proj, Horas_Trab) VALUES (102, 1001, 56); INSERT INTO Func_Proj (Cod_Func, Cod_Proj, Horas_Trab) VALUES (102, 1003, 45); INSERT INTO Func_Proj (Cod_Func, Cod_Proj, Horas_Trab) VALUES (103, 1001, 86); INSERT INTO Func_Proj (Cod_Func, Cod_Proj, Horas_Trab) VALUES (103, 1003, 64); INSERT INTO Func_Proj (Cod_Func, Cod_Proj, Horas_Trab) VALUES (104, 1001, 46);
  • 298. 57 CREATE TRIGGER • Observe, agora, os dados inseridos nas tabelas Total_Horas e Qtdade_Func pelo trigger: SELECT * FROM Total_Horas; SELECT * FROM Qtdade_Func;
  • 299. 58 Roteiro da Apresentação • Trigger • CREATE TRIGGER • Alteração de um trigger • Ativação/Desativação de um trigger • Exclusão de um trigger
  • 300. 59 Alteração de um Trigger • Um trigger não pode ser alterado diretamente • Para alterá-lo, deve-se recriá-lo com o comando CREATE OR REPLACE TRIGGER • Se esse trigger teve privilégios concedidos para outros usuários, eles permanecem válidos enquanto o trigger existir (mesmo que ele tenha sido recriado)
  • 301. 60 Roteiro da Apresentação • Trigger • CREATE TRIGGER • Alteração de um trigger • Ativação/Desativação de um trigger • Exclusão de um trigger
  • 302. Ativação/Desativação de um Trigger • Quando um trigger é criado, ele fica automaticamente ativo • Para desativar a execução do trigger, deve-se utilizar o comando ALTER TRIGGER com a cláusula DISABLE e para reativá-lo, a cláusula ENABLE • Sintaxe: 61 ALTER TRIGGER nome_trigger DISABLE/ENABLE;
  • 303. 62 Roteiro da Apresentação • Trigger • CREATE TRIGGER • Alteração de um trigger • Ativação/Desativação de um trigger • Exclusão de um trigger
  • 304. 63 Exclusão de um Trigger • Para excluir um trigger, deve ser usado o comando DROP TRIGGER nome_do_trigger; • Esse comando remove a estrutura do trigger e retira os privilégios concedidos a outros usuários
  • 305. 64 Exclusão de um Trigger • Para visualizar os triggers criados por um usuário, use a visão user_triggers do dicionário de dados SELECT TRIGGER_NAME FROM user_triggers; SELECT TRIGGER_NAME, TRIGGER_BODY FROM user_triggers;
  • 307. 66 Bibliografia • FANDERUFF, D. Dominando o Oracle 9i: Modelagem e Desenvolvimento. São Paulo: Pearson Education do Brasil, 2003. • RAMALHO, J. A. Oracle 9i. São Paulo: Berkeley Brasil, 2002
  • 308. Obrigado Profa. Elisângela Botelho Gracias elisangela.botelho@mackenzie.br 67
  • 309. Universidade Presbiteriana MMaacckkeennzziiee BBaannccoo ddee DDaaddooss CCCCuuuurrrrssssoooorrrr -- CCCCoooonnnnttttrrrroooolllleeee ddddeeee PPPPrrrroooocccceeeessssssssaaaammmmeeeennnnttttoooo JJaammiillssoonn BBiissppoo ddooss SSaannttooss Faculdade de Computação e Informática São Paulo, 01 de fevereiro de 2011
  • 310. Controle de Processamento • Introdução • Cursor explicito • Cursor implícito Controle de Processamento 2
  • 311. Introdução • Oracle aloca uma área de memória conhecida como área de contexto para processar uma instrução SQL • Cursor é um handle ou uumm ppoonntteeiirroo ppaarraa aa área de contexto • Com o cursor um programa PL/SQL pode controlar a área de contexto Controle de Processamento 3
  • 312. Introdução • TIPOS DE CURSORES – Explícitos –– IImmppllíícciittooss Controle de Processamento 4
  • 313. Introdução • Oracle usa cursores implícitos para analisar e executar os comandos SQL • Cursores explícitos são declarados explicitamente ppeelloo pprrooggrraammaaddoorr Controle de Processamento 5
  • 314. Introdução • Usando atributos do cursor SQL, você pode testar o resultado de suas instruções SQL SQL%ROWCOUNT Numero de linhas afetadas pelo ultimo comando SQL SQL%FOUND Boolean que informa se alguma linha foi afetada ultimo comando SQL SQL%NOTFOUND Boolean que informa se nenhuma de linhas afetada pelo ultimo comando SQL SQL%ISOPEN Boolean que informa se o cursor esta aberto Controle de Processamento 6
  • 315. Introdução SET SERVEROUTPUT ON 4000 CREATE OR REPLACE PROCEDURE Aumento_Salario IS v_linhas_atualizadas VARCHAR2(40); BEGIN UPDATE Funcionarios SET Salario = Salario * 1.1; v_linhas_atualizadas:=(SQL%ROWCOUNT||' linhas atualizadas '); dbms_output.put_line(v_linhas_atualizadas); END Aumento_Salario; EXEC Aumento_Salario; Controle de Processamento 7
  • 316. Cursor Explicito • Consulta que retornam nenhum ou mais de uma linha • Cursor deve ser declarado explicitamente na áárreeaa ddee ddeeccllaarraaççõõeess • Não pode ter o mesmo nome da tabela Controle de Processamento 8
  • 317. Cursor Explicito • PROCESSAMENTO DE CURSOR EXPLICITO – Declarar o cursor – Abrir o cursor – Buscar os resultados nas vvaarriiáávveeiiss ddee PPLL//SSQQLL – Processar a(s) linha (s) – Fechar o cursor Controle de Processamento 9
  • 318. Cursor Explicito • FUNCIONAMENTO DO CURSOR Teste fim dados Declare Open Fetch Close Controle de Processamento 10 Cria uma SQL área Identifica o grupo de dados Acessa cada linha Testa fim de linhas existentes Libera o grupo de dados
  • 319. Cursor Explicito • DECLARANDO O CURSOR CURSOR <nome do cursor> is <comando select> – Não incluir a clausula INTO no select Controle de Processamento 11
  • 320. Cursor Explicito DECLARE CURSOR funcionario_cursor IS SELECT nome_func, salario FROM Funcionarios; CURSOR funcionario_cursor_01 IS SELECT * FROM Funcionarios; BEGIN Controle de Processamento 12
  • 321. Cursor Explicito • ABRINDO O CURSOR OPEN <nome do cursor>; – Abrir o cursor para executar o select – Caso não retorne linha, nenhum exceção será informada – Utilizar os atributos do cursor depois do Fetch Controle de Processamento 13
  • 322. Cursor Explicito • Buscando dados do Cursor FETCH <nome do cursor> INTO variavel1, variavel2 ,.. | <nome registro> – Recupera os valores da linha corrente – Teste se o cursor contem linhas – Nome do registro pode ser recuperado utilizando %ROWTYPE Controle de Processamento
  • 323. Cursor Explicito set serveroutput on DECLARE v_cod_func Funcionarios.cod_func%TYPE; v_nome_func Funcionarios.nome_func%TYPE; v_salario Funcionarios.salario% TYPE; CURSOR funcionario_cursor IS SELECT cod_func, nome_func, salario FROM Funcionarios; BEGIN OPEN funcionario_cursor; FOR i IN 1..2 LOOP FETCH funcionario_cursor INTO v_cod_func, v_nome_func, v_salario; DBMS_OUTPUT.PUT_LINE(TO_CHAR(v_cod_func)||' '|| v_nome_func||' '|| v_salario); Controle de Processamento 15 END LOOP; END;
  • 324. Cursor Explicito • Buscando dados do Cursor FETCH <nome do cursor> INTO variavel1, variavel2 ,.. || <<nnoommee rreeggiissttrroo>> EXIT WHEN <condição>; Controle de Processamento
  • 325. Cursor Explicito set serveroutput on DECLARE v_cod_func Funcionarios.cod_func%TYPE; v_nome_func Funcionarios.nome_func%TYPE; v_salario Funcionarios.salario% TYPE; CURSOR funcionario_cursor IS SELECT cod_func, nome_func, salario FROM Funcionarios; BEGIN OPEN funcionario_cursor; LOOP FETCH funcionario_cursor INTO v_cod_func, v_nome_func, v_salario; EXIT WHEN funcionario_cursor%NOTFOUND; DBMS_OUTPUT.PUT_LINE(TO_CHAR(v_cod_func)||' '|| v_nome_func||' '|| v_salario); Controle de Processamento 17 END LOOP; END;
  • 326. Cursor Explicito • Usando atributos do cursor explicito, você pode testar o resultado de suas instruções SQL %ROWCOUNT Numero de linhas afetadas pelo ultimo comando SQL %FOUND Boolean que informa se alguma linha foi afetada ultimo comando SQL %NOTFOUND Boolean que informa se nenhuma de linhas afetada pelo ultimo comando SQL %ISOPEN Boolean que informa se o cursor esta aberto Controle de Processamento 18
  • 327. Cursor Explicito • Uso do atributo %ISOPEN – Verificar se o cursor esta aberto antes de executar o FETCH – Se o cursor não o estiver aabbeerrttoo oo FFEETTCCHH nnããoo funciona Controle de Processamento
  • 328. Cursor Explicito set serveroutput on DECLARE v_cod_func Funcionarios.cod_func%TYPE; v_nome_func Funcionarios.nome_func%TYPE; v_salario Funcionarios.salario% TYPE; CURSOR funcionario_cursor IS SELECT cod_func, nome_func, salario FROM Funcionarios; BEGIN IF NOT funcionario_cursor%ISOPEN THEN OPEN funcionario_cursor; END IF; LOOP FETCH funcionario_cursor INTO v_cod_func, v_nome_func, v_salario; EXIT WHEN funcionario_cursor%NOTFOUND; DBMS_OUTPUT.PUT_LINE(TO_CHAR(v_cod_func)||' '|| v_nome_func||' '|| v_salario); Controle de Processamento 20 END LOOP; END;
  • 329. Cursor Explicito • Registro e cursor set serveroutput on DECLARE CURSOR funcionario_cursor IS SELECT cod_func, nome_func, salario FROM Funcionarios; func_registro funcionario_cursor%ROWTYPE; BEGIN IF NOT funcionario_ccuurrssoorr%%IISSOOPPEENN TTHHEENN OPEN funcionario_cursor; END IF; LOOP FETCH funcionario_cursor INTO func_registro; EXIT WHEN funcionario_cursor%NOTFOUND; DBMS_OUTPUT.PUT_LINE(TO_CHAR(func_registro.cod_func)||' '|| func_registro.nome_func||' '|| func_registro.salario); END LOOP; CLOSE funcionario_cursor; END; Controle de Processamento 21
  • 330. Cursor Explicito • FOR LOOP FOR <nome do registro> IN <nome do cursor> LOOP <comandos> END LOOP; – Registro é declarado implicitamente – Open, fetch e close do cursor realizados implicitamente Controle de Processamento 22
  • 331. Cursor Explicito set serveroutput on DECLARE CURSOR funcionario_cursor IS SELECT cod_func, nome_func, salario FROM Funcionarios; func_registro funcionario_cursor%ROWTYPE; BEGIN FOR func_registro IN funcionario_ccuurrssoorr LLOOOOPP DBMS_OUTPUT.PUT_LINE(TO_CHAR(func_registro.cod_func)||' '|| func_registro.nome_func||' '|| func_registro.salario); END LOOP; END; Controle de Processamento 23
  • 332. Cursor Explicito • FECHANDO O CURSOR CLOSE <nome do cursor>; – Fechar o cursor sempre depois de completar o processamento das linhas Controle de Processamento 24
  • 333. Bibliografia • Oracle 9i Programação PL/SQL – Scott Urman, Ed. Campus • Dominando oo OOrraaccllee 99ii – Damaris Fanderuff, Ed. Pearson Controle de Processamento 25
  • 334. Obrigado Jamilson BBiissppoo ddooss SSaannttooss jamilson@mackenzie.br 26
  • 335. Universidade Presbiteriana Mackenzie Package Jamilson Bispo dos Santos Faculdade de Computação e Informática São Paulo, 14 de Novembro de 2009
  • 336. Tópicos Abordados • Introdução • Criação de Packages • Utilização de Packages • Exclusão de Packages <Título da Aula> 2
  • 337. Introdução • Conceito Áreas de armazenamento de sub-programa, constantes e variáveis • Composto Especificação Corpo 3
  • 338. Introdução • Especificação Interface com a aplicação Declaração de tipos de variáveis, constantes, exceções, cursores • Corpo Define cursor e sub programa 4
  • 340. Introdução Escopo da Construção Descrição Colocação dentro do pacote Publico Pode ser referenciada a partir de qualquer ambiente de servidor Oracle Declarados dentro da especificação do pacote e pode ser definida dentro do corpo do pacote Privado Pode ser referenciado apenas por outras construções que fazem parte do mesmo pacote Declarada e definida dentro do corpo do pacote 6
  • 341. Introdução Visibilidade Construção Descrição Local Uma variável definida dentro de um subprograma que não é visível para usuários externos Privado (local para o pacote) variável: você pode definir variável em um corpo do pacote. Estas variáveis podem ser acessadass somente por outros objetos no mesmo pacote. Eles não são visíveis para quaisquer subprogramas ou objetos fora do pacote Global Uma variável ou subprograma que pode ser referenciado (e alterada) fora do pacote e é visível aos usuários externos. Itens globais do pacote devem ser declarados na especificação do pacote. 7
  • 342. Introdução Restrições • Não chamar um pacote dentro de outro pacote; • Pacote não pode receber parâmetros, somente as rotinas declaradas; • Variáveis Bind não pode ser utilizada por pacotes; • Não utilizar variáveis definidas dentro do pacote; • Pacote não pode ser chamado diretamente, utilizar script onde utilize as rotinas do pacote. 8
  • 343. Criação da Especificação do Package CREATE [ OR REPLACE] PACKAGE nome_package IS | AS tipo publico, declaração de itens especificação de subprogramas END nome_package 9