Este documento apresenta exemplos de uso de operações de junção em SQL, incluindo INNER JOIN, LEFT JOIN e RIGHT JOIN. É explicado como essas operações podem ser usadas para combinar dados de múltiplas tabelas e recuperar informações relacionadas.
1) O documento apresenta uma série de exercícios de programação em COBOL para serem desenvolvidos, incluindo programas para realizar cálculos aritméticos, ler e processar dados de arquivos, imprimir relatórios com quebras de página e totalizações. 2) Os exercícios envolvem temas como entrada e saída de dados, laços, condicionais, arquivos, manuseio de registros e formatação de saída. 3) São fornecidos detalhes sobre os layouts dos arquivos de
1) A linguagem C foi criada em 1972 por Dennis Ritchie e Ken Thompson no laboratório Bell. 2) Um programa em C consiste de uma ou mais funções, sendo a função principal chamada de main. 3) A função printf é usada para saída de dados formatados no monitor, enquanto puts imprime uma string seguida de quebra de linha.
O documento discute a administração de bancos de dados. Ele introduz o tópico, definindo banco de dados e explicando a importância dos sistemas de banco de dados nas organizações. Também descreve os profissionais envolvidos como projetistas, analistas, administradores e usuários de bancos de dados.
O documento discute os comandos DML (Data Manipulation Language) para inserção, alteração e exclusão de dados em bancos de dados. Especificamente, cobre os comandos INSERT para inserção de dados, UPDATE para alteração de dados, e DELETE para exclusão de dados. Fornece exemplos detalhados sobre como usar cada um desses comandos no SQL Server.
O documento descreve a linguagem de programação COBOL, incluindo suas divisões, regras básicas e estruturas. COBOL é uma linguagem orientada para negócios criada em 1959 que utiliza palavras em inglês em vez de códigos. Os programas COBOL consistem em 4 divisões obrigatórias (IDENTIFICATION, ENVIRONMENT, DATA e PROCEDURE) que descrevem respectivamente a identificação, ambiente, dados e procedimentos do programa.
Este documento explica os diferentes tipos de junções em SQL. Ele descreve junções de produto cartesiano, que combinam todas as linhas de duas tabelas; junções internas, que combinam linhas que possuem campos correspondentes; e junções externas, que mantêm linhas mesmo sem correspondências. O documento fornece exemplos de left, right e full outer joins.
O documento discute comandos SQL para pesquisas em múltiplas tabelas, incluindo união de tabelas usando cláusulas WHERE para combinar chaves primárias e estrangeiras. Exemplos demonstram uniões regulares (inner join) entre duas ou mais tabelas para responder perguntas sobre clientes, pedidos, produtos e vendedores.
1) O documento apresenta uma série de exercícios de programação em COBOL para serem desenvolvidos, incluindo programas para realizar cálculos aritméticos, ler e processar dados de arquivos, imprimir relatórios com quebras de página e totalizações. 2) Os exercícios envolvem temas como entrada e saída de dados, laços, condicionais, arquivos, manuseio de registros e formatação de saída. 3) São fornecidos detalhes sobre os layouts dos arquivos de
1) A linguagem C foi criada em 1972 por Dennis Ritchie e Ken Thompson no laboratório Bell. 2) Um programa em C consiste de uma ou mais funções, sendo a função principal chamada de main. 3) A função printf é usada para saída de dados formatados no monitor, enquanto puts imprime uma string seguida de quebra de linha.
O documento discute a administração de bancos de dados. Ele introduz o tópico, definindo banco de dados e explicando a importância dos sistemas de banco de dados nas organizações. Também descreve os profissionais envolvidos como projetistas, analistas, administradores e usuários de bancos de dados.
O documento discute os comandos DML (Data Manipulation Language) para inserção, alteração e exclusão de dados em bancos de dados. Especificamente, cobre os comandos INSERT para inserção de dados, UPDATE para alteração de dados, e DELETE para exclusão de dados. Fornece exemplos detalhados sobre como usar cada um desses comandos no SQL Server.
O documento descreve a linguagem de programação COBOL, incluindo suas divisões, regras básicas e estruturas. COBOL é uma linguagem orientada para negócios criada em 1959 que utiliza palavras em inglês em vez de códigos. Os programas COBOL consistem em 4 divisões obrigatórias (IDENTIFICATION, ENVIRONMENT, DATA e PROCEDURE) que descrevem respectivamente a identificação, ambiente, dados e procedimentos do programa.
Este documento explica os diferentes tipos de junções em SQL. Ele descreve junções de produto cartesiano, que combinam todas as linhas de duas tabelas; junções internas, que combinam linhas que possuem campos correspondentes; e junções externas, que mantêm linhas mesmo sem correspondências. O documento fornece exemplos de left, right e full outer joins.
O documento discute comandos SQL para pesquisas em múltiplas tabelas, incluindo união de tabelas usando cláusulas WHERE para combinar chaves primárias e estrangeiras. Exemplos demonstram uniões regulares (inner join) entre duas ou mais tabelas para responder perguntas sobre clientes, pedidos, produtos e vendedores.
1. O documento discute a linguagem SQL e seus complementos para consultas, manipulação e agregação de dados em bancos de dados relacionais. Ele apresenta exemplos do uso de comandos como SELECT, DISTINCT, ORDER BY, COUNT, SUM, AVG, MIN, MAX e GROUP BY.
2. Também aborda os comandos básicos de manipulação de dados INSERT, UPDATE e DELETE.
3. O objetivo é fornecer uma introdução aos principais recursos da linguagem SQL para consultas, agregação e manipulação de dados.
Uma estrutura é uma coleção de uma ou mais variáveis, possivelmente de tipos diferentes, colocadas juntas sob um único nome para manipulação conveniente. Por exemplo, para representar um aluno são necessárias as informações nome, matrícula, conceito. Ao invés de criar três variáveis, é possível criar uma única variável contendo três campos. Em C/C++, usa-se a construção struct para representar esse tipo de dado.
O documento descreve 8 operações relacionais no SQL: seleção, projeção, produto cartesiano, união, interseção, diferença e junções (equi-join, inner join e outer join). Estas operações permitem manipular e relacionar dados entre tabelas usando comandos SQL como SELECT, WHERE e JOIN.
O documento explica o que são funções analíticas no SQL, suas vantagens em relação a outras funções, sintaxe e exemplos de funções como ROW_NUMBER, RANK, DENSE_RANK, FIRST_VALUE e LAST_VALUE. Demonstra como essas funções permitem agregar valores e ordenar linhas de dados de forma flexível.
Este documento descreve um sistema de recursos humanos para automatizar os processos de uma empresa. Ele inclui procedimentos, funções, visualizações e gatilhos para inserir, atualizar e gerar relatórios sobre funcionários, departamentos, projetos e benefícios.
O documento descreve os principais comandos DML do MySQL para selecionar dados de uma tabela, incluindo SELECT, WHERE, ORDER BY, funções como COUNT e AVG, e operadores como BETWEEN e LIKE. Ele também fornece exemplos de como usar esses comandos em consultas a uma tabela Funcionários e exercícios relacionados.
ALGORITMO "Soma de dois números"
VAR
num1, num2, resultado: INTEIRO
INICIO
ESCREVA("Digite o primeiro número: ")
LEIA(num1)
ESCREVA("Digite o segundo número: ")
LEIA(num2)
resultado <- num1 + num2
ESCREVA("A soma é: ",resultado)
FIMALGORITMO
ALGORITMO "Média de notas"
VAR
n1, n2, n3, n4, media: DECIMAL
INICIO
ESCREVA("Digite a primeira nota: ")
LEIA(n1
O documento apresenta os principais conceitos de programação em Python, incluindo estruturas de programa, variáveis, entrada e saída de dados, operadores aritméticos e lógicos, estruturas de seleção e repetição e funções.
O documento fornece uma introdução ao programa Microsoft Excel, descrevendo suas principais funcionalidades como a gestão de dados em folhas de cálculo, formatação de células, uso de fórmulas e funções, e exemplos. É destacado o uso de Excel para facilitar a organização e cálculo de grandes conjuntos de informações com dependências entre dados.
Este documento fornece instruções sobre como usar a instrução SELECT no SQL para selecionar dados de bancos de dados. A instrução SELECT permite recuperar dados de tabelas usando cláusulas como FROM, WHERE, GROUP BY e ORDER BY. Além disso, explica outras cláusulas como HAVING, AS e WITH OWNERACCESS OPTION.
Este documento apresenta funções do Excel para contagem, soma e busca de dados em planilhas. A função CONTSE conta células que atendem a um critério, SOMASE soma valores que atendem a critérios, e PROCV busca e retorna valores de células na mesma linha de um intervalo. Exemplos demonstram o uso dessas funções para análise de dados de funcionários por departamento e salário.
1) O documento descreve comandos SQL para criação de bancos de dados, tabelas, consultas e funções.
2) Inclui exemplos de criação de tabelas, inserção de dados, consultas com WHERE, GROUP BY, JOIN, FUNÇÕES como SUM, COUNT, entre outros.
3) Apresenta exemplos de criação de stored procedures e uso de parâmetros.
1) O documento discute operadores como TOP e TABLESAMPLE para limitar o número de linhas retornadas por consultas SELECT e como eles funcionam.
2) Também aborda subconsultas, que permitem executar consultas SELECT dentro de outras consultas, e diferencia entre subconsultas correlacionadas e não-correlacionadas.
3) Por fim, explica como consultas correlacionadas e não-correlacionadas são executadas, com a consulta interior dependendo ou não da exterior.
O documento discute boas práticas e refatoração de código, incluindo o uso de interfaces, herança, strings, nomes significativos, métodos pequenos e comentários.
O documento apresenta uma aula sobre procedimentos e funções na linguagem C ministrada pelo professor Mauro Jansen. A aula introduz os conceitos de procedimentos, funções, vetores, matrizes e registros (estruturas) em C.
O documento discute o conceito de processador de algoritmos e fornece exemplos para ilustrar como algoritmos podem ser escritos de forma a serem compreendidos por diferentes tipos de processadores, desde seres humanos até máquinas. Também aborda a importância de se conhecer as capacidades do processador ao se elaborar um algoritmo.
Este documento discute dicionários de dados, árvores de decisão e tabelas de decisão. Ele define esses termos e explica seus componentes e usos, além de fornecer exemplos de como cada um pode ser construído e aplicado.
O documento apresenta um resumo de 5 aulas sobre a linguagem de programação C. A primeira aula introduz conceitos básicos como variáveis, constantes, operadores e expressões. A segunda aula aborda estruturas de controle de fluxo e arrays. A terceira aula trata de ponteiros e funções. A quarta aula discute diretivas de compilação e entrada/saída padronizada. A quinta e última aula apresenta tópicos avançados como tipos de dados definidos pelo usuário.
1. O documento discute a linguagem SQL e seus complementos para consultas, manipulação e agregação de dados em bancos de dados relacionais. Ele apresenta exemplos do uso de comandos como SELECT, DISTINCT, ORDER BY, COUNT, SUM, AVG, MIN, MAX e GROUP BY.
2. Também aborda os comandos básicos de manipulação de dados INSERT, UPDATE e DELETE.
3. O objetivo é fornecer uma introdução aos principais recursos da linguagem SQL para consultas, agregação e manipulação de dados.
Uma estrutura é uma coleção de uma ou mais variáveis, possivelmente de tipos diferentes, colocadas juntas sob um único nome para manipulação conveniente. Por exemplo, para representar um aluno são necessárias as informações nome, matrícula, conceito. Ao invés de criar três variáveis, é possível criar uma única variável contendo três campos. Em C/C++, usa-se a construção struct para representar esse tipo de dado.
O documento descreve 8 operações relacionais no SQL: seleção, projeção, produto cartesiano, união, interseção, diferença e junções (equi-join, inner join e outer join). Estas operações permitem manipular e relacionar dados entre tabelas usando comandos SQL como SELECT, WHERE e JOIN.
O documento explica o que são funções analíticas no SQL, suas vantagens em relação a outras funções, sintaxe e exemplos de funções como ROW_NUMBER, RANK, DENSE_RANK, FIRST_VALUE e LAST_VALUE. Demonstra como essas funções permitem agregar valores e ordenar linhas de dados de forma flexível.
Este documento descreve um sistema de recursos humanos para automatizar os processos de uma empresa. Ele inclui procedimentos, funções, visualizações e gatilhos para inserir, atualizar e gerar relatórios sobre funcionários, departamentos, projetos e benefícios.
O documento descreve os principais comandos DML do MySQL para selecionar dados de uma tabela, incluindo SELECT, WHERE, ORDER BY, funções como COUNT e AVG, e operadores como BETWEEN e LIKE. Ele também fornece exemplos de como usar esses comandos em consultas a uma tabela Funcionários e exercícios relacionados.
ALGORITMO "Soma de dois números"
VAR
num1, num2, resultado: INTEIRO
INICIO
ESCREVA("Digite o primeiro número: ")
LEIA(num1)
ESCREVA("Digite o segundo número: ")
LEIA(num2)
resultado <- num1 + num2
ESCREVA("A soma é: ",resultado)
FIMALGORITMO
ALGORITMO "Média de notas"
VAR
n1, n2, n3, n4, media: DECIMAL
INICIO
ESCREVA("Digite a primeira nota: ")
LEIA(n1
O documento apresenta os principais conceitos de programação em Python, incluindo estruturas de programa, variáveis, entrada e saída de dados, operadores aritméticos e lógicos, estruturas de seleção e repetição e funções.
O documento fornece uma introdução ao programa Microsoft Excel, descrevendo suas principais funcionalidades como a gestão de dados em folhas de cálculo, formatação de células, uso de fórmulas e funções, e exemplos. É destacado o uso de Excel para facilitar a organização e cálculo de grandes conjuntos de informações com dependências entre dados.
Este documento fornece instruções sobre como usar a instrução SELECT no SQL para selecionar dados de bancos de dados. A instrução SELECT permite recuperar dados de tabelas usando cláusulas como FROM, WHERE, GROUP BY e ORDER BY. Além disso, explica outras cláusulas como HAVING, AS e WITH OWNERACCESS OPTION.
Este documento apresenta funções do Excel para contagem, soma e busca de dados em planilhas. A função CONTSE conta células que atendem a um critério, SOMASE soma valores que atendem a critérios, e PROCV busca e retorna valores de células na mesma linha de um intervalo. Exemplos demonstram o uso dessas funções para análise de dados de funcionários por departamento e salário.
1) O documento descreve comandos SQL para criação de bancos de dados, tabelas, consultas e funções.
2) Inclui exemplos de criação de tabelas, inserção de dados, consultas com WHERE, GROUP BY, JOIN, FUNÇÕES como SUM, COUNT, entre outros.
3) Apresenta exemplos de criação de stored procedures e uso de parâmetros.
1) O documento discute operadores como TOP e TABLESAMPLE para limitar o número de linhas retornadas por consultas SELECT e como eles funcionam.
2) Também aborda subconsultas, que permitem executar consultas SELECT dentro de outras consultas, e diferencia entre subconsultas correlacionadas e não-correlacionadas.
3) Por fim, explica como consultas correlacionadas e não-correlacionadas são executadas, com a consulta interior dependendo ou não da exterior.
O documento discute boas práticas e refatoração de código, incluindo o uso de interfaces, herança, strings, nomes significativos, métodos pequenos e comentários.
O documento apresenta uma aula sobre procedimentos e funções na linguagem C ministrada pelo professor Mauro Jansen. A aula introduz os conceitos de procedimentos, funções, vetores, matrizes e registros (estruturas) em C.
O documento discute o conceito de processador de algoritmos e fornece exemplos para ilustrar como algoritmos podem ser escritos de forma a serem compreendidos por diferentes tipos de processadores, desde seres humanos até máquinas. Também aborda a importância de se conhecer as capacidades do processador ao se elaborar um algoritmo.
Este documento discute dicionários de dados, árvores de decisão e tabelas de decisão. Ele define esses termos e explica seus componentes e usos, além de fornecer exemplos de como cada um pode ser construído e aplicado.
O documento apresenta um resumo de 5 aulas sobre a linguagem de programação C. A primeira aula introduz conceitos básicos como variáveis, constantes, operadores e expressões. A segunda aula aborda estruturas de controle de fluxo e arrays. A terceira aula trata de ponteiros e funções. A quarta aula discute diretivas de compilação e entrada/saída padronizada. A quinta e última aula apresenta tópicos avançados como tipos de dados definidos pelo usuário.
O Que é Um Ménage à Trois?
A sociedade contemporânea está passando por grandes mudanças comportamentais no âmbito da sexualidade humana, tendo inversão de valores indescritíveis, que assusta as famílias tradicionais instituídas na Palavra de Deus.
Caderno de Resumos XVIII ENPFil UFU, IX EPGFil UFU E VII EPFEM.pdfenpfilosofiaufu
Caderno de Resumos XVIII Encontro de Pesquisa em Filosofia da UFU, IX Encontro de Pós-Graduação em Filosofia da UFU e VII Encontro de Pesquisa em Filosofia no Ensino Médio
Folheto | Centro de Informação Europeia Jacques Delors (junho/2024)Centro Jacques Delors
Estrutura de apresentação:
- Apresentação do Centro de Informação Europeia Jacques Delors (CIEJD);
- Documentação;
- Informação;
- Atividade editorial;
- Atividades pedagógicas, formativas e conteúdos;
- O CIEJD Digital;
- Contactos.
Para mais informações, consulte o portal Eurocid:
- https://eurocid.mne.gov.pt/quem-somos
Autor: Centro de Informação Europeia Jacques Delors
Fonte: https://infoeuropa.mne.gov.pt/Nyron/Library/Catalog/winlibimg.aspx?doc=48197&img=9267
Versão em inglês [EN] também disponível em:
https://infoeuropa.mne.gov.pt/Nyron/Library/Catalog/winlibimg.aspx?doc=48197&img=9266
Data de conceção: setembro/2019.
Data de atualização: maio-junho 2024.
Egito antigo resumo - aula de história.pdfsthefanydesr
O Egito Antigo foi formado a partir da mistura de diversos povos, a população era dividida em vários clãs, que se organizavam em comunidades chamadas nomos. Estes funcionavam como se fossem pequenos Estados independentes.
Por volta de 3500 a.C., os nomos se uniram formando dois reinos: o Baixo Egito, ao Norte e o Alto Egito, ao Sul. Posteriormente, em 3200 a.C., os dois reinos foram unificados por Menés, rei do alto Egito, que tornou-se o primeiro faraó, criando a primeira dinastia que deu origem ao Estado egípcio.
Começava um longo período de esplendor da civilização egípcia, também conhecida como a era dos grandes faraós.
Slides Lição 10, Central Gospel, A Batalha Do Armagedom, 1Tr24.pptxLuizHenriquedeAlmeid6
Slideshare Lição 10, Central Gospel, A Batalha Do Armagedom, 1Tr24, Pr Henrique, EBD NA TV, Revista ano 11, nº 1, Revista Estudo Bíblico Jovens E Adultos, Central Gospel, 2º Trimestre de 2024, Professor, Tema, Os Grandes Temas Do Fim, Comentarista, Pr. Joá Caitano, estudantes, professores, Ervália, MG, Imperatriz, MA, Cajamar, SP, estudos bíblicos, gospel, DEUS, ESPÍRITO SANTO, JESUS CRISTO, Com. Extra Pr. Luiz Henrique, 99-99152-0454, Canal YouTube, Henriquelhas, @PrHenrique
Slides Lição 11, Central Gospel, Os Mortos Em CRISTO, 2Tr24.pptxLuizHenriquedeAlmeid6
Slideshare Lição 11, Central Gospel, Os Mortos Em Cristo, 1Tr24, Pr Henrique, EBD NA TV, Revista ano 11, nº 1, Revista Estudo Bíblico Jovens E Adultos, Central Gospel, 2º Trimestre de 2024, Professor, Tema, Os Grandes Temas Do Fim, Comentarista, Pr. Joá Caitano, estudantes, professores, Ervália, MG, Imperatriz, MA, Cajamar, SP, estudos bíblicos, gospel, DEUS, ESPÍRITO SANTO, JESUS CRISTO, Com. Extra Pr. Luiz Henrique, 99-99152-0454, Canal YouTube, Henriquelhas, @PrHenrique
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
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
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
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
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
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
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
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;
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
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
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
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
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)
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
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
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
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
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
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
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