Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Ricardo Terra
rterrabh [at] gmail.com
Ph.D. (UFMG/UWaterloo),
Post-Ph.D. (INRIA/Universit Lille 1)
Background
Acadmico: UFLA (desde 2014), UFSJ (1 ano), FUMEC (3 anos), UNIPAC (1 ano), FAMINAS (3 anos)
Profissional: DBA Eng. (1 ano), Synos (2 anos), Stefanini (1 ano)
n Baixando o Oracle XE
q Registrar-se na Oracle
q Ir ao endereco
http://www.oracle.com/technology/software/products/database/xe/index.html
n Instalando o Oracle XE
q Depois que j baixar o instalador do Oracle, basta execut-lo e seguir os passos
n Voc dever registrar o cadastro de uma senha para o usurio system
q Dica:
n Geralmente o prprio instalador j o configura como servio do Windows, porm, como o
mesmo muito pesado, v em Servios e configure o servio OracleXETNSListener e
OracleServiceXE para iniciar manualmente
n Assim, quando voc precisar utilizar o banco de dados, basta ir na opo Start Database
disponvel no menu iniciar
n Baixando o SQL*Plus
q O SQL*Plus largamente utilizado por DBAs e desenvolvedores para a interao
com a base de dados. Usando o SQL*Plus, voc pode executar todas as
instrues SQL e programas PL/SQL, formatar resultados de consultas e
administrar a base de dados
q Ir ao endereo
http://www.oracle.com/technology/software/products/database/oracle10g/htdocs/
10201winsoft.html
q Baixar Oracle Database 10g Client Release 2 (10.2.0.1.0)
n Instalar pela opo Runtime.
n Configurando o SQL*Plus
q Depois de instalado, basta entrar no Net Configuration Assistant.
n Selecione Configurao do Nome do Servio de Rede Local
n Selecione Adicionar
n Em nome do servio: xe
n Selecione TCP
n Em nome do host deve ser inserido o IP ou hostname onde encontra-se instalado o
Oracle
n Realize o teste
q Talvez seja necessrio alterar o login para o teste
q Com isto, o SQL*Plus j estar funcionando perfeitamente.
n Um banco de dados pode ter vrios usurios, cada qual com seu esquema,
que nada mais do que uma coleo lgica de objetos de banco de dados,
como tabelas e ndices. Por sua vez, esses objetos referem-se s estruturas
fsicas dos dados, que so armazenados nos datafiles das tablespaces.
n Usurios
q SYS
n Usurio que conhecido como o proprietrio do dicionrio. Ele possui todas as tabelas
bases e vises de acesso ao usurio de um dicionrio de dados.
n Nenhum usurio deve alterar (UPDATE, DELETE ou INSERT) qualquer linha ou objetos
de esquema contidos no esquema SYS, pois tal ao pode comprometer a integridade
dos dados.
q SYSTEM
n Usurio do DBA.
n Pode-se dizer que o SYSTEM um pouco mais fraco que o SYS.
n Responsvel pela criao de tabelas e vises adicionais que exibem informaes
administrativas e/ou so utilizadas pelas ferramentas da Oracle.
n Nunca deve-se criar tabelas no esquema SYSTEM de interesse de usurios particulares.
q HR
n Esquema de exemplo.
n O proprietrio da tabela dual o SYS, mas ela pode ser acessada por qualquer
usurio.
n CONNECT <usuario>/<senha>@<nome_do_servico>
q Conecta em dado usurio.
n DISCONNECT
q Comita alteraes pendentes na base de dados e desconecta o usurio do
Oracle, porm no encerra o SQL*Plus.
n EXIT ou QUIT
q Desconecta o usurio do Oracle e encerra o SQL*Plus.
n @<caminho_do_arquivo>
q Executa todo o arquivo de script
q Dica:
n Caso queira inserir um comentrio em um script basta inseri-lo entre /* e */.
n PAUSE <texto>
q Exibe a mensagem e espera at que o usurio digite ENTER.
n PROMPT <texto>
q Exibe a mensagem.
n Dica interessante:
q A seta para cima no volta aos comandos, para isto, no SQL*Plus, basta
selecionar o texto que voc deseja e, antes de soltar o boto esquerdo, aperte o
boto direito. Assim, ele copiar o texto que voc selecionou.
q Inteiro
n Nmero sem casas decimais.
q Ex.: -2 43 0
q Nmero
n Nmeros inteiros e nmeros decimais.
q Ex.: 32 -2,55 3,14159 23e-10
q Intervalo
n Especifica um perodo de tempo em termos de anos e meses ou de dias e
segundos.
q A lista de colunas pode ser substituida por asterisco (*), que indica a
exibio de todas as colunas.
n select * from HR.JOBS;
n Exemplo:
q select JOB_TITLE AS CARGO", MIN_SALARY AS "SALRIO BASE" from HR.JOBS;
equivalente a
q select JOB_TITLE CARGO", MIN_SALARY "SALRIO BASE" from HR.JOBS;
n Exemplos:
q select FIRST_NAME, SALARY from HR.EMPLOYEES order by SALARY desc
equivale a
q Lgicos:
n AND OR NOT
q A utilizao dos operadores lgicos
utiliza a precedncia de parnteses
como em linguagens de programao.
q NOT
n s vezes, no portugus falado dizemos, por exemplo, que queremos todos os
funcionrios que no esto no departamento 30.
q OR
n Existem outros casos que queremos todos os funcionrios que esto no
departamento 30 ou que ganham mais de 17.000.
n NOT IN
q Para retornar os usurio que no esto nos departamentos de uma
determinada lista utilizamos:
n select * from RH.EMPREGADO where ID_DEPARTAMENTO NOT IN (10,30,50)
equivalente a
n select * from RH.EMPREGADO where ID_DEPARTAMENTO != ALL (10,30,50)
q Exemplo:
n select * from RH.EMPREGADO where PRIMEIRO_NOME like 'Alex%'
q Seleciona os empregados cujo nome inicia-se com Alex.
q Basta utilizar a funo to_date que veremos mais frente, porm segue um
exemplo para j ir experimentando.
q O Oracle garante que todo dado dentro deste tipo ter sempre o mesmo
tamanho.
n Se for menor, completado com espaos.
n Se for maior, um erro levantado.
q Exemplos:
n NUMBER(6,2) -9999.99 a 9999.99
n NUMBER(2,0) -99 a 99
q Este tipo pode ser convertido para outras formas de visualizao, mas
existe vrias funes e propriedades especiais que permite sua
manipulao e clculos simples.
q Exemplos:
n select 'Eu ' || 'amo ' || 'Oracle' as "FRASE" from DUAL;
q Exemplos:
n 5+6 11
n mod(4*2, 3) 2
n upper(Jos || oliveira) JOS OLIVEIRA
n sqrt( mod( (4*4)+3, 5) ) 2
q Sintaxe:
n CASE <expressao>
WHEN <valor de comparao> THEN <valor de retorno>
ELSE <valor de retorno>
END
q Ex.:
n select PRIMEIRO_NOME || ' ' || ULTIMO_NOME as "NOME COMPLETO",
NVL(PERCENTUAL_COMISSAO,0) AS "COMISSAO (%)"
from RH.EMPREGADO order by 2 desc
n A idia passar uma viso sobre cada uma delas, porm a sintaxe
destas funes dever ser estudada nas bibliografias da disciplina.
Funo Descrio
ASCII Retorna o cdigo na tabela ASCII equivalente ao caractere informado.
CHR Retorna o caractere dado o cdigo da tabela ASCII.
CONCAT Concatena duas strings, assim como o operador ||.
INITCAP Retorna uma string com a primeira letra de cada palavra em mauscula.
INSTR Encontra a posio numrica inicial de uma string dentro de uma outra string.
INSTRB Assim com INSTR, porm conta bytes ao invs de caracteres.
LENGTH Retorna o tamanho de uma string em caracteres.
LENGTHB Retorna o tamanho de uma string em bytes.
LOWER Converte toda a string para minscula.
LPAD Complementa esquerda uma string at um tamanho especificado usando um
caractere especfico.
Funo Descrio
LTRIM Retira espaos esquerda de uma string.
RPAD Complementa direita uma string at um tamanho especificado usando um
caractere especfico.
RTRIM Retira espaos direita de uma string.
REPLACE Realiza pesquisa e substituio de substring.
SUBSTR Retorna uma parte de uma string especificada pelo posio numrica dos
caracteres.
SUBSTRB Retorna uma parte de uma string especificada pelo posio numrica dos
bytes.
SOUNDEX Retorna a representao fontica de uma string.
TRANSLATE Realiza pesquisa e substituio de caracteres.
TRIM Retira espaos direita e esquerda de uma string.
UPPER Converte toda a string para maiscula.
Funo Descrio
ABS Retorna o valor absoluto.
ACOS Retorna o arco-cosseno.
ASIN Retorna o arco-seno.
ATAN Retorna o arco-tangente.
ATAN2 Retorna o arco-tangente. Recebe dois parmetros.
BITAND Retorna o resultado de uma operao AND nos bits de dois parmetros.
CEIL Retorna o prximo inteiro superior.
COS Retorna o cosseno.
COSH Retorna o cosseno hiperblico.
EXP Retorna a base de um logaritmo natural elevada a uma potncia.
Funo Descrio
FLOOR Retorna o prximo inteiro inferior.
LN Retorna o logaritmo natural.
LOG Retorna o logaritmo.
MOD Retorna o mdulo (resto) de uma operao de diviso.
POWER Retorna um nmero elevado a uma potncia.
ROUND Arredonda o nmero.
SIGN Retorna o signal: negativo, positivo ou zero.
SIN Retorna o seno.
SINH Retorna o seno hiperblico.
SQRT Retorna a raiz quadrada de um nmero
Funo Descrio
TAN Retorna a tangente.
TANH Retorna a tangente hiperblica.
TRUNC Retorna o nmero truncado.
Funo Descrio
ADD_MONTHS Adiciona um nmero de meses a uma data.
CURRENT_DATE Retorna a data corrente.
CURRENT_TIMESTAMP Retorna a data e hora corrente.
DBTIMEZONE Retorna o fuso horrio do banco de dados.
EXTRACT Retorna um componente de uma data.
FROM_TZ Retorna uma data e hora com o fuso horrio dado.
LAST_DAY Retorna o ltimo dia do ms.
LOCALTIMESTAMP Retorna a data e hora corrente do fuso horrio da sesso.
MONTHS_BETWEEN Retorna o nmero de meses entre duas datas.
NEW_TIME Retorna a data e hora em um diferente fuso horrio.
Funo Descrio
NEXT_DAY Retorna o prximo dia da semana de um dada data.
ROUND Arredonda a data/hora.
SESSIONTIMEZONE Retorna o fuso horrio do sesso corrente.
SYS_EXTRACT_UTC Retorna o UTC (GMT) de uma data/hora.
SYSDATE Retorna a data corrente.
SYSTIMESTAMP Retorna a data e hora corrente.
TRUNC Trunca uma data para uma dada granularidade.
TZ_OFFSET Retorna a diferena da UTC de uma determinada localizao.
Funo Descrio
ASCIISTR Converte caracteres para ASCII.
BIN_TO_NUM Converte uma string de bits para um nmero.
CAST Converte tipos.
CHARTOROWID Converte um caractere para um tipo ROWID.
COMPOSE Converte para UNICODE.
CONVERT Converte de um conjunto de caracteres para outro.
DECOMPOSE Decompe um string UNICODE.
HEXTORAW Converte um hexadecimal para um raw.
NUMTODSINTERVAL Converte um nmero para um intervalo de dias por segundo.
NUMTOYMINTERVAL Converte um nmero para um intervalo de anos por ms.
Funo Descrio
RAWTOHEX Converte um raw para um hexadecimal.
ROWIDTOCHAR Converte um ROWID para um caractere.
TO_CHAR Converte e formata uma data em uma string.
TO_DATE Converte uma string para uma data, especificando o formato.
TO_DSINTERVAL Converte uma string para um intervalo dias por segundo.
TO_MULTIBYTE Converte um caractere de um nico byte para seu correspondente
multibyte.
TO_NUMBER Converte uma string numrica para um nmero, especificado o
formato.
TO_SINGLE_BYTE Converte um caractere multibyte para seu correspondente nico
byte.
TO_YMINTERVAL Converte uma string para um intervalo anos por ms.
UNISTR Converte UCS2 Unicode.
Funo Descrio
BFILENAME Retorna o localizador BFILE para o especificado diretrio e
arquivo.
COALESCE Retorna o primeiro no-nulo em uma lista.
DECODE Instruo case em uma nica linha (uma funo if.. ento.. else)
DUMP Retorna uma substring raw na codificao especificada.
EMPTY_BLOB Retorna um localizador BLOB vazio.
EMPTY_CLOB Retorna um localizador CLOB vazio.
GREATEST Organiza os argumentos e retorna o maior.
LEAST Organiza os argumentos e retorna o menor.
NULLIF Retorna NULL se duas expresses so iguais.
SYS_CONNECT_BY_PATH Retorna valores da raiz at os nodos de uma consulta usando
CONNECT BY.
Funo Descrio
SYS_CONTEXT Retorna vrios atributos de sesso, tais como endereo IP,
terminal e usurio corrente.
UID Retorna o ID numrico do usurio da sesso corrente.
USER Retorna o nome do usurio da sesso corrente.
USERENV No mais utilizado. Substitudo por SYS_CONTEXT.
VSIZE Retorna o tamanho interno em bytes de uma expresso.
n Aplicabilidade
q A maioria das funes de agregao podem ser aplicadas em todos os
valores (ALL) ou somente em valores distintos (DISTINCT).
q Ex.:
n Soma de todos os salrios
q select sum(SALARIO) from RH.EMPREGADO
ou
q select sum(all SALARIO) from RH.EMPREGADO
MEDIA MEDIA MEDIA DISTINTA CONTAGEM CONTAGEM DISTINTA SOMA SOMA DISTINTA
---------- ---------- -------------- ---------- ----------------- ---------- -------------
19333.3333 19333.3333 20500 3 2 58000 41000
q Exemplo:
n select count(*) from EMPREGADO
q Seleciona o nmero de empregados.
q A clusula GROUP BY como o prprio nome diz trabalha nos dados que
esto agrupados. Como j visto, quando a mesma no especificada, o
agrupamente padro por todo o resultado.
q Por exemplo, seria interessante buscar o menor e o maior salrio por cada
departamento, a mdia salarial por funo, o nmero de pases por cada
regio, entre outros. Para isto, devemos aplicar um funo de agregao e
agrup-la por algum campo.
ID_FUNCAO AVG(SALARIO)
---------- ------------
AC_ACCOUNT 8300
AC_MGR 12000
AD_ASST 4400
AD_PRES 24000
...
SA_MAN 12200
SA_REP 8350
SH_CLERK 3215
ST_CLERK 2785
ST_MAN 7280
ID_REGIAO COUNT(ID_PAIS)
---------- --------------
1 8
2 5
3 6
4 6
q Este filtro no pode ser feito na clusula WHERE, pois ele um filtro sobre as linhas
agrupadas.
q Por exemplo, exibir a mdia salarial dos empregados de cada departamento cuja
mdia salarial seja superior a 8.000,00. O filtro no sobre a tabela de
DEPARTAMENTO, mas sim, sobre o agrupamento feito sobre esta tabela.
ID_DEPARTAMENTO AVG(SALARIO)
--------------- ------------
70 10000
110 10150
90 19333.3333
q Observe como a ordenao pode ser feita pelo resultado da funo de agregao.
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 100
Junes Simples
n Uma juno simples conhecida como inner join, pois ela retorna
somente as linhas que satisfazem as condies de juno.
q Um exemplo seria a busca do cdigo e nome dos departamentos e suas
respectivas cidades. Esta informao no consta em uma nica tabela,
bastando uma juno simples.
n select RH.DEPARTAMENTO.ID_DEPARTAMENTO,
RH.DEPARTAMENTO.NOME_DEPARTAMENTO,
RH.LOCALIZACAO.CIDADE
from RH.DEPARTAMENTO, RH.LOCALIZACAO
where RH.DEPARTAMENTO.ID_LOCALIZACAO = RH.LOCALIZACAO.ID_LOCALIZACAO
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 101
Junes Complexa
n Uma juno complexa uma juno simples que contm na
clusula WHERE, alm da condio de juno, uma outra condio
para filtrar as linhas retornadas.
q Um exemplo seria a busca do cdigo e nome dos departamentos e suas
respectivas cidades fora dos Estados Unidos.
n select RH.DEPARTAMENTO.ID_DEPARTAMENTO,
RH.DEPARTAMENTO.NOME_DEPARTAMENTO,
RH.LOCALIZACAO.CIDADE
from RH.DEPARTAMENTO, RH.LOCALIZACAO
where RH.DEPARTAMENTO.ID_LOCALIZACAO = RH.LOCALIZACAO.ID_LOCALIZACAO
and RH.LOCALIZACAO.ID_PAIS != 'US'
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 102
Criando aliases para tabelas
n Antes de iniciar nosso estudo sobre consultas em mltiplas tabelas,
indispensvel o conhecimento sobre apelidar tabelas.
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 103
Sintaxe ANSI
n A diferena entre a sintaxe de juno tradicional do Oracle e a sintaxe
ANSI/ISO SQL1999 que na ANSI, o tipo de juno especificado
explicitamente na clusula FROM.
q JOIN ... ON
n <nome-da-tabela> [INNER] JOIN <nome-da-tabela> ON <condio>
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 104
NATURAL JOIN
n No natural join, a juno realizada por todas as colunas que possuem
o mesmo nome em ambas as tabelas.
n Sintaxe:
q <nome-da-tabela> NATURAL [INNER] JOIN <nome-da-tabela>
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 105
JOIN ... USING
n Neste tipo de juno, a juno realizada pelas colunas indicadas e
que possuem o mesmo nome em ambas as tabelas.
n Sintaxe:
q <nome-da-tabela> [INNER] JOIN <nome-da-tabela> USING (<colunas>)
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 106
JOIN ... USING
n Vamos refazer o exemplo da busca do cdigo e nome dos
departamentos e suas respectivas cidades.
q select ID_DEPARTAMENTO, NOME_DEPARTAMENTO, CIDADE
from RH.DEPARTAMENTO join RH.LOCALIZACAO
using (ID_LOCALIZACAO)
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 107
JOIN ... ON
n Quando no se tem nomes de colunas comuns entre tabelas para fazer
uma juno ou deseja-se especificar condies de junes arbitrrias,
este o tipo de juno a ser utilizado.
n Sintaxe:
q <nome-da-tabela> [INNER] JOIN <nome-da-tabela> ON <condio>
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 108
JOIN ... ON
n Vamos refazer o exemplo da busca do cdigo e nome dos
departamentos e suas respectivas cidades.
q select d.ID_DEPARTAMENTO, d.NOME_DEPARTAMENTO, l.CIDADE
from RH.DEPARTAMENTO d join RH.LOCALIZACAO l
on (d.ID_LOCALIZACAO = l.ID_LOCALIZACAO)
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 109
Junes em mltiplas tabelas
n Uma juno em mltiplas tabelas uma juno em mais de duas
tabelas.
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 110
Junes em mltiplas tabelas
n Vamos fazer o exemplo da busca do primeiro nome do empregado,
nome do seu departamento, nome da cidade do seu departamento.
q select e.PRIMEIRO_NOME, d.NOME_DEPARTAMENTO, l.CIDADE
from RH.EMPREGADO e
JOIN RH.DEPARTAMENTO d
on (e.ID_DEPARTAMENTO = d.ID_DEPARTAMENTO)
JOIN RH.LOCALIZACAO l
on (d.ID_LOCALIZACAO = l.ID_LOCALIZACAO)
n Perguntas:
q Ser que poderia utilizar NATURAL JOIN ou JOIN ... USING ao invs de
JOIN ... ON?
q Outra pergunta: Ser que poderia misturar NATURAL JOIN, JOIN ... USING,
JOIN ... ON e, at mesmo, juno tradicional em uma mesma consulta?
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 111
Junes cartesianas
n Uma juno cartesiana ocorre quando os dados so selecionados de
duas ou mais tabelas e no h uma condio de juno especificada.
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 112
Junes cartesianas
n Um exemplo seria buscar o nome da regio e o nome do pas daqueles
pases que comeam com I.
q select r.NOME_REGIAO, p.NOME_PAIS
from RH.REGIAO r, RH.PAIS p
where p.NOME_PAIS like 'I%'
ou
select r.NOME_REGIAO, p.NOME_PAIS
from RH.REGIAO r cross join RH.PAIS p
where p.NOME_PAIS like 'I%'
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 113
Junes cartesianas
NOME_REGIAO NOME_PAIS
------------------------- ----------------------------------------
Europe Israel
Americas Israel
Asia Israel
Middle East and Africa Israel
Europe India
Americas India
Asia India
Middle East and Africa India
Europe Italy
Americas Italy
Asia Italy
Middle East and Africa Italy
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 114
OUTER JOINS
n At agora, nos vimos inner joins, que retornam somente as linhas
correspondentes entre ambas as tabelas, e produtos cartesianos, que
retornam uma combinao de todas as linhas de ambas as tabelas.
n Para o problema acima, existe a juno do tipo outer join. Ele retorna
valores baseados nas condies de inner join, como trs tambm
linhas no relacionadas de um ou dos dois lados das tabelas.
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 115
OUTER JOINS
n Na sintaxe tradicional do Oracle, o smbolo + envolvido por parnteses,
denota um outer join na consulta.
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 116
OUTER JOINS
n O exemplo da pgina anterior pode ser reescrito das seguintes formas:
q select p.NOME_PAIS, l.CIDADE
from RH.PAIS p left outer join RH.LOCALIZACAO l
on p.ID_PAIS = l.ID_PAIS
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 117
OUTER JOINS
n Um exemplo inverso buscar a lista de todas as cidades que possuem
departamentos e os seus pases. Caso a cidade no esteja vinculada a
um pas, deseja-se exib-la mesmo assim.
q select p.NOME_PAIS, l.CIDADE from RH.PAIS p, RH.LOCALIZACAO l
where p.ID_PAIS (+) = l.ID_PAIS
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 118
OUTER JOINS
n O exemplo da pgina anterior pode ser reescrito das seguintes formas:
q select p.NOME_PAIS, l.CIDADE
from RH.PAIS p right outer join RH.LOCALIZACAO l
on p.ID_PAIS = l.ID_PAIS
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 119
OUTER JOINS
n Um exemplo que envolva os dois lados, isto , inverso buscar a lista
de todas as cidades que possuem departamentos e os todos os pases.
Caso a cidade no esteja vinculada a um pas ou caso o pas no
tenha nenhum departamento localizado, deseja-se exib-lo mesmo
assim.
q select p.NOME_PAIS, l.CIDADE from RH.PAIS p, RH.LOCALIZACAO l
where p.ID_PAIS (+) = l.ID_PAIS (+)
n ERRO. No funciona. Deve-se utilizar o full outer join.
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 120
SELF JOINS
n Um self-join uma juno na prpria tabela. Certamente um resultado
de um auto-relacionamento.
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 121
Aula 06 - Complementar
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 122
Esquema HOMEM x MULHER
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 123
Esquema HOMEM x MULHER
n Tabela HOMEM
ID_HOMEM NOME_HOMEM ID_MULHER
---------- ------------------------------ ----------
10 Anderson
20 Jander 1
30 Rogrio 2
n Tabela MULHER
ID_MULHER NOME_MULHER
---------- ------------------------------
1 Edna
2 Stefanny
3 Cssia
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 124
INNER JOINS
n Selecionar os casamentos:
q select h.NOME_HOMEM, m.NOME_MULHER
from HOMEM h, MULHER m
where h.ID_MULHER = m.ID_MULHER
n Resultado:
NOME_HOMEM NOME_MULHER
------------------------------ ------------------------------
Jander Edna
Rogrio Stefanny
n Tambm pode ser feito com NATURAL JOIN, JOIN ... USING e
JOIN ... ON conforme poder ser visto no prximo slide.
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 125
INNER JOINS
n NATURAL JOIN
q select h.NOME_HOMEM, m.NOME_MULHER
from HOMEM h natural join MULHER m
n JOIN ... ON
q select h.NOME_HOMEM, m.NOME_MULHER
from HOMEM h join MULHER m
ON (h.ID_MULHER = m.ID_MULHER)
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 126
Produto Cartesiano
n Simular todos os casamentos possveis:
q select h.NOME_HOMEM, m.NOME_MULHER
from HOMEM h, MULHER m
ou
q select h.NOME_HOMEM, m.NOME_MULHER
from HOMEM h cross join MULHER m
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 127
Produto Cartesiano
n Resultado:
NOME_HOMEM NOME_MULHER
------------------------------ ------------------------------
Anderson Edna
Anderson Stefanny
Anderson Cssia
Jander Edna
Jander Stefanny
Jander Cssia
Rogrio Edna
Rogrio Stefanny
Rogrio Cssia
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 128
OUTER JOINS
n Selecionar os casamentos, caso no haja homens casados
tambm desejvel exib-los:
q select h.NOME_HOMEM, m.NOME_MULHER
from HOMEM h, MULHER m
where h.ID_MULHER = m.ID_MULHER (+)
n Resultado:
NOME_HOMEM NOME_MULHER
------------------------------ ------------------------------
Anderson
Jander Edna
Rogrio Stefanny
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 129
OUTER JOINS
n Selecionar os casamentos, caso no haja mulheres casadas
tambm desejvel exib-las:
q select h.NOME_HOMEM, m.NOME_MULHER
from HOMEM h, MULHER m
where h.ID_MULHER (+) = m.ID_MULHER
n Resultado:
NOME_HOMEM NOME_MULHER
------------------------------ ------------------------------
Jander Edna
Rogrio Stefanny
Cssia
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 130
OUTER JOINS
n Alm da smbolo (+), um outer join pode ser feito por NATURAL
OUTER JOIN, OUTER JOIN ... USING e OUTER JOIN ... ON.
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 131
OUTER JOINS
n E se deseja-se selecionar todos casamentos e caso no hajam
homens ou mulheres casados tambm desejvel exib-los:
q select h.NOME_HOMEM, m.NOME_MULHER
from HOMEM h natural full outer join MULHER m
n Resultado:
NOME_HOMEM NOME_MULHER
------------------------------ ------------------------------
Anderson
Jander Edna
Rogrio Stefanny
Cssia
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 132
Aula 07
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 133
Esquema RH (traduo do HR)
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 134
Operadores de Conjunto
n Operadores de conjuntos (set operators) podem ser usados para
selecionar dados de tabelas mltiplas.
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 135
Operadores de Conjunto
n So os operadores de conjunto:
Operador Descrio
UNION Retorna todas as linhas no repetidas
selecionadas por cada consulta.
UNION ALL Retorna todas as linhas, inclusive duplicadas,
selecionadas por cada consulta.
INTERSECT Retorna linhas selecionadas por ambas as
consultas.
MINUS Retorna linha nicas selecionadas pela primeira
consulta, porm que no foram selecionadas na
segunda consulta.
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 136
Operadores de Conjunto
n Para entender melhor vamos tomar como base as seguintes
consultas:
q Selecionar o ltimo nome dos q Selecionar o ltimo nome dos
empregados que trabalham no empregados que comeam com K.
departamento 90. n select e.ULTIMO_NOME
n select e.ULTIMO_NOME from RH.EMPREGADO e
from RH.EMPREGADO e where e.ULTIMO_NOME like 'K%'
where e.ID_DEPARTAMENTO = 90
q Resultado: q Resultado:
ULTIMO_NOME ULTIMO_NOME
------------------------- -------------------------
King King
Kochhar Kochhar
De Haan Khoo
Kaufling
King
Kumar
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 137
UNION
n Une todas as linhas no repetidas de cada consulta.
q select e.ULTIMO_NOME from RH.EMPREGADO e
where e.ID_DEPARTAMENTO = 90
UNION
select e.ULTIMO_NOME from RH.EMPREGADO e
where e.ULTIMO_NOME like 'K%
q Resultado:
ULTIMO_NOME
-------------------------
De Haan
Kaufling
Khoo
King
Kochhar
Kumar
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 138
UNION ALL
n Une todas as linhas, inclusive duplicadas, de cada consulta.
q select e.ULTIMO_NOME from RH.EMPREGADO e
where e.ID_DEPARTAMENTO = 90
UNION ALL
select e.ULTIMO_NOME from RH.EMPREGADO e
where e.ULTIMO_NOME like 'K%
q Resultado:
ULTIMO_NOME
-------------------------
King
Kochhar
De Haan
King
Kochhar
Khoo
Kaufling
King
Kumar
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 139
INTERSECT
n Faz a interseo entre as linhas de cada consulta, isto , retorna
linhas comuns de ambas as consultas.
q select e.ULTIMO_NOME from RH.EMPREGADO e
where e.ID_DEPARTAMENTO = 90
INTERSECT
select e.ULTIMO_NOME from RH.EMPREGADO e
where e.ULTIMO_NOME like 'K%'
q Resultado:
ULTIMO_NOME
-------------------------
King
Kochhar
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 140
MINUS
n Realiza a subtrao entre as linhas da primeira consulta com as
linhas da segunda consulta, isto , retorna as linhas da primeira
consulta que no aparecem na segunda consulta.
q select e.ULTIMO_NOME from RH.EMPREGADO e
where e.ID_DEPARTAMENTO = 90
MINUS
select e.ULTIMO_NOME from RH.EMPREGADO e
where e.ULTIMO_NOME like 'K%'
q Resultado:
ULTIMO_NOME
-------------------------
De Haan
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 141
SUBQUERIES
n Uma subquery um consulta dentro de uma consulta.
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 142
SUBQUERIES
n Existem vrios tipos de subqueries tais como:
q nested subquery
n Traduo: subquery aninhada
n So subqueries utilizadas na clusula WHERE.
q correlated subquery
n Traduo: subquery correlacionada
n So subqueries que utilizam colunas da consulta "pai". Para cada linha
processada da consulta "pai", a correlated subquery avaliada novamente.
q scalar subquery
n Traduo: subquery escalar
n So subqueries que podem ser usadas em qualquer lugar onde um nome de
uma coluna ou um expresso podem ser utilizadas.
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 143
SUBQUERIES
n Buscar o primeiro e o ltimo nome e o salrio do empregado com o
maior salrio.
q select e.PRIMEIRO_NOME, e.ULTIMO_NOME, e.SALARIO
from RH.EMPREGADO e
where e.SALARIO =
(select max(SALARIO) from RH.EMPREGADO)
q Resultado:
PRIMEIRO_NOME ULTIMO_NOME SALARIO
-------------------- ------------------------- ----------
Steven King 24000
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 144
SUBQUERIES
n Buscar o primeiro e o ltimo nome dos empregados e o cdigo do
departamento cujo nome do departamento comece com a letra 'A'.
q select e.PRIMEIRO_NOME, e.ULTIMO_NOME, e.ID_DEPARTAMENTO
from RH.EMPREGADO e
where e.ID_DEPARTAMENTO IN
(select ID_DEPARTAMENTO from RH.DEPARTAMENTO
where NOME_DEPARTAMENTO like 'A%')
q Resultado:
PRIMEIRO_NOME ULTIMO_NOME ID_DEP
-------------------- ------------------------- ----------
Jennifer Whalen 10
Shelley Higgins 110
William Gietz 110
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 145
SUBQUERIES
n Buscar o cdigo do departamento, o primeiro e o ltimo nome e o
salrio do empregado com o maior salrio do seu departamento.
q select e.ID_DEPARTAMENTO,
e.PRIMEIRO_NOME, e.ULTIMO_NOME, e.SALARIO
from RH.EMPREGADO e
where e.SALARIO =
(select max(ei.SALARIO) from RH.EMPREGADO ei
where ei.ID_DEPARTAMENTO = e.ID_DEPARTAMENTO)
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 146
SUBQUERIES
q Resultado:
ID_DEP PRIMEIRO_NOME ULTIMO_NOME SALARIO
---------- -------------------- ------------------------- ----------
90 Steven King 24000
60 Alexander Hunold 9000
100 Nancy Greenberg 12000
30 Den Raphaely 11000
50 Adam Fripp 8200
80 John Russell 14000
10 Jennifer Whalen 4400
20 Michael Hartstein 13000
40 Susan Mavris 6500
70 Hermann Baer 10000
110 Shelley Higgins 12000
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 147
Aula 08
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 148
Esquema Acadmico Simples
Modelo ER
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 149
Esquema Acadmico Simples
Modelo Relacional (abstraindo domnios)
PROFESSOR (cpf, nome, salario, titulacao)
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 150
Instrues DML
n DML (Data Manipulation Language) um subconjunto do SQL que
empregado para manipular dados.
Instruo Propsito
INSERT Adicionar linhas uma tabela.
UPDATE Modificar os valores armazenados em uma tabela.
MERGE Atualizar ou inserir linhas de uma tabela em outra.
DELETE Remover linhas de uma tabela.
SELECT FOR UPDATE Bloqueia outras sesses de realizar DML nas linhas
selecionadas.
LOCK TABLE Bloqueia outras sesses de realizar DML em uma tabela.
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 151
Insert
n A instruo INSERT usada para adicionar linha em uma ou mais
tabelas.
q As linhas podem ser adicionada com valores especificados ou podem
ser criadas por dados existentes utilizando uma subquery.
n Sintaxes:
q insert into <TABELA> (<lista-de-colunas>) values (<lista-de-valores>)
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 152
Insert
n Exemplos:
q insert into PROFESSOR (CPF,NOME,SALARIO,TITULACAO)
values (11111111111, 'RICARDO TERRA', 1.99, 'ESPECIALISTA');
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 153
Update
n A instruo UPDATE usada para modificar linhas existentes em
uma tabela.
n Sintaxe:
q update <TABELA>
set <coluna1> = <valor1>, <coluna2> = <valor2>, ...
[where <condies>]
n Exemplos:
q update PROFESSOR set SALARIO = 1.1*SALARIO
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 154
Delete
n A instruo DELETE usada para remover linhas de uma tabela.
n Sintaxe:
q delete [from] <TABELA>
[where <condies>]
n Exemplos:
q delete from PROFESSOR
n exclui todos os professores
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 155
Truncate
n Quando se deseja apagar todas as linhas de uma tabela, deve ser
considerado o uso da instruo TRUNCATE.
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 156
Truncate
n Para sua execuo no poder haver FKs ativas.
n Sintaxe:
q truncate table ALUNO;
n Exemplo:
q alter table ALUNO_DISCIPLINA disable constraint fk_aluno;
truncate table ALUNO;
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 157
Truncate
n Algumas diferenas do TRUNCATE para o DELETE:
q O TRUNCATE mais rpido tanto em largas ou pequenas tabelas. O
DELETE gerar informao de recuperao (como um desfazer), ao
contrrio do TRUNCATE que no gera este tipo de informao.
q No ativa triggers.
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 158
Truncate
n Mesmo sendo uma instruo DDL, realizar o TRUNCATE de uma
tabela diferente de remov-la (DROP TABLE) e cri-la (CREATE
TABLE) novamente.
n O TRUNCATE no faz:
q Invalidar objetos dependentes.
q Exclui ndices, triggers ou restries de integridade referencial.
q Requer que privilgios sejam garantidos novamente.
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 159
Transao
n Uma transao representa uma unidade atmica de trabalho.
q Todas as operaes so aplicadas ou nenhuma delas.
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 160
Transao
n Por padro, uma transao aberta logo que a primeira instruo
seja efetuada. Ao criar um script altamente recomendvel inserir
todas as operaes em um bloco BEGIN e END.
q O SQL*Plus possui a configurao AUTOCOMMIT ativada, para
desativ-la, basta:
n SET AUTOCOMMIT OFF
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 161
Transao
n Exemplo:
BEGIN
update CONTA set SALDO - 50 where NUMERO = 100;
COMMIT;
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 162
Selecionando linhas FOR UPDATE
n A instruo SELECT FOR UPDATE utilizada para bloquear linhas
especficas, impedindo que outras sesses alterem ou excluam
estas linhas.
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 163
Selecionando linhas FOR UPDATE
n Exemplo:
declare l_professor PROFESSOR%rowtype;
BEGIN
select * into linha_professor from PROFESSOR
where TITULACAO = 'ESPECIALISTA' FOR UPDATE;
COMMIT;
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 164
Bloqueando uma tabela
n A instruo LOCK usada para bloquear toda uma tabela,
impedindo outras sesses de executar a maioria ou todas as DML
na tabela bloqueada.
n Sintaxe:
q LOCK TABLE professor IN EXCLUSIVE MODE
n O EXCLUSIVE MODE impede qualquer outra sesso de adquirir qualquer
compartilhamento ou bloqueio nesta tabela.
n Alm do EXCLUSIVE MODE, existem diversos modos de bloquear uma
tabela.
n Deadlocks
q Ocorre quando duas transaes aguardam um desbloqueio e cada uma
delas est esperando o desbloqueio da outra. Oracle detecta?
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 165
Aula 09
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 166
Esquema Acadmico Simples
Modelo ER
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 167
Esquema Acadmico Simples
Modelo Relacional
PROFESSOR (cpf, nome, salario, titulacao)
dom(cpf) = numrico(11) NN
dom(nome) = alfabtico(60) NN
dom(salario) = numrico(9,2) NN
dom(titulacao) = alfabtico(40) NN
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 168
Esquema Acadmico Simples
Modelo Relacional
DISCIPLINA (codigo, nome, carga_horaria, cpf_professor)
dom(codigo) = numrico(3) NN
dom(nome) = alfanumrico(40) NN
dom(carga_horaria) = numrico(3) NN
dom(cpf_professor) = numrico(11) NN
DISCIPLINA [cpf_professor] PROFESSOR [cpf]
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 169
Tipos de dados
n Os tipos de dados existentes na linguagem SQL variam de acordo
com a verso e o fabricante. O conjunto de tipos de dados evoluem
junto com a evoluo da informtica. A primeira verso, surgida por
volta de 1970, no possuia tipos de dados para armazenamento de
informaes multimdia como som, imagem, vdeo; to comuns nos
dias de hoje. A maioria dos SGBDs incorporaram esses novos tipos
de dados s suas verses da linguagem SQL.
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 170
Tipos de dados
n CHAR(<size>)
q uma string alfanumrica de tamanho fixo, que possui um tamanho
mximo em bytes (2000).
n VARCHAR2(<size>)
q uma string alfanumrica de tamanho varivel, que possui um
tamanho mximo em bytes (4000).
n NUMBER(<p>,<s>)
q O tipo NUMBER armazena nmeros com uma preciso de p dgitos
tendo uma escala de s dgitos reservados para as casas decimais.
n DATE
q o tipo utilizado para armazenar informao de data e hora.
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 171
Criando tabelas
n Voc pode pensar em uma tabela como uma planilha com linhas e
colunas. Esta a estrutura que armazena dados em uma base de
dados relacional.
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 172
Criando tabelas
n A instruo CREATE TABLE uma instruo com vrias opes.
q Exemplo da sintaxe mais simples de criao de tabela:
create table ALUNO (
MATRICULA number(6),
NOME varchar2(60),
DATA_NASCIMENTO date
)
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 173
Criando tabelas
n Algumas recomendaes e regras para nomenclatura de nomes de
tabelas e colunas:
q Tente fazer nomes de tabelas e colunas o mais descritivo possvel.
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 174
Criando tabelas
n Exemplo:
q create table Abc ( q create table "Abc" (
COL1 number COL1 number
); );
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 175
Criando tabelas: valor padro
n Na criao ou alterao de uma tabela, pode-se especificar valores
padres para colunas.
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 176
Criando tabelas: valor padro
n Exemplo:
create table ALUNO (
MATRICULA number(6),
NOME varchar2(60) DEFAULT 'ANNIMO',
DATA_NASCIMENTO date DEFAULT SYSDATE
);
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 177
Criando tabelas: anulabilidade
n Uma coluna pode ser obrigatria ou opcional.
n Exemplo:
create table ALUNO (
MATRICULA number(6) NOT NULL,
NOME varchar2(60) NOT NULL,
DATA_NASCIMENTO date NULL
);
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 178
Criando tabelas: chave primria
n Uma tabela sempre possui uma chave primria.
n Uma tabela s possui uma chave primria (pode ser mais de uma
coluna) que nica e nunca nula.
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 179
Criando tabelas: chave primria
n Exemplo da criao de uma chave primria junto ao create table:
create table ALUNO (
MATRICULA number(6) NOT NULL,
NOME varchar2(60) NOT NULL,
DATA_NASCIMENTO date NULL,
CONSTRAINT pk_aluno PRIMARY KEY (MATRICULA)
);
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 180
Criando tabelas: chave primria
n Exemplo da criao de uma chave primria utilizando alter table:
create table ALUNO (
MATRICULA number(6) NOT NULL,
NOME varchar2(60) NOT NULL,
DATA_NASCIMENTO date NULL
);
q Isto , voc cria a tabela sem chave primria e depois a altera inserido a
restrio de chave primria.
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 181
Criando tabelas: comentrios
n O propsito da tabela ou da coluna pode ser documentado na base
de dados usando a instruo COMMENT.
n Exemplos:
COMMENT ON TABLE ALUNO IS
'Tabela de Armazenamento de Alunos';
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 182
Criando tabelas: comentrios
n Para ver os comentrios de uma tabela:
q select TABLE_NAME, COMMENTS
from USER_TAB_COMMENTS
where TABLE_NAME = 'ALUNO';
TABLE_NAME COMMENTS
------------ ---------------------------------
ALUNO Tabela de Armazenamento de Alunos
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 183
Criando tabelas: comentrios
n Para ver os comentrios das colunas de uma tabela:
q select TABLE_NAME, COLUMN_NAME, COMMENTS
from USER_COL_COMMENTS
where TABLE_NAME = 'ALUNO';
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 184
Criando tabelas: a partir de outra tabela
n Voc pode criar uma tabela utilizando uma consulta em uma ou
mais tabelas ou vises existentes.
n Sintaxe:
q CREATE TABLE <nome-da-tabela> AS SELECT <consulta>
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 185
Criando tabelas: a partir de outra tabela
n Exemplo:
q CREATE TABLE RH.REGIAO AS
select REGION_ID as "ID_REGIAO", REGION_NAME as
"NOME_REGIAO" from HR.REGIONS
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 186
Destruindo tabelas
n Destruir uma tabela simples, bastando utilizar a instruo DROP
TABLE.
n Sintaxe:
q DROP TABLE <tabela> [CASCADE CONSTRAINTS]
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 187
Destruindo tabelas
n Caso existam restries de integridade referencial de outras tabelas
que referenciam a uma chave primria ou nica desta tabela, voc
dever especificar o CASCADE CONSTRAINTS.
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 188
Aula 10
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 189
Gerenciando restries
n Restries so criadas em um banco de dados para garantir uma
regra de negcio no banco de dados e para especificar
relacionamentos entre vrias tabelas.
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 190
Gerenciando restries
n Oracle suporta cinco tipos de restries de integridade:
NOT NULL Previne valores nulos em colunas. Por padro, o Oracle
permite valores NULL em qualquer coluna.
PRIMARY KEY Identifica unicamente cada linha de uma tabela e previne
valores nulos. Uma tabela pode somente possuir uma
nica chave primria.
FOREIGN KEY Estabelece um relacionamento pai-filho entre tabelas por
utilizao de colunas comuns. Uma chave estrangeira
em uma tabela referencia a uma chave primria ou nica
de uma outra tabela.
UNIQUE Garante a unicidade de valores para as colunas
especificadas.
CHECK Verifica se a condio especificada satisfeita.
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 191
Criando restries
n Existem vrias sintaxes para criao de uma chave estrangeira,
porm vamos aprender a cri-la:
q junto com a instruo create table;
q utilizando a instruo alter table.
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 192
Criando restries: chave estrangeira
n Uma restrio de chave estrangeira (foreign key) garante que uma
ou mais colunas em uma tabela tenham valores no-nulos
correspondentes em alguma chave primria ou nica no banco de
dados.
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 193
Criando restries: chave estrangeira
n Exemplo da criao de uma chave estrangeira junto ao create
table:
create table DISCIPLINA(
CODIGO number(3) not null PRIMARY KEY,
NOME varchar2(40) not null,
CARGA_HORARIA number(3) not null,
CPF_PROFESSOR number(11) not null,
CONSTRAINT fk_professor
FOREIGN KEY (CPF_PROFESSOR)
REFERENCES PROFESSOR(CPF)
);
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 194
Criando restries: chave estrangeira
n Exemplo da criao de uma chave estrangeira utilizando alter
table:
create table DISCIPLINA(
CODIGO number(3) not null PRIMARY KEY,
NOME varchar2(40) not null,
CARGA_HORARIA number(3) not null,
CPF_PROFESSOR number(11) not null
);
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 195
Criando restries: chave estrangeira
n Independente da sintaxe de criao, existe uma clusula opcional a
ser inserida na sintaxe da restrio:
q [ON DELETE {CASCADE | SET NULL} ]
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 196
Criando restries: chave estrangeira
n Exemplo 1:
alter table CIDADE add constraint FK_ESTADO
foreign key (ID_ESTADO) references ESTADO (ID)
ON DELETE CASCADE;
n Exemplo 2:
alter table CIDADE add constraint FK_ESTADO
foreign key (ID_ESTADO) references ESTADO (ID)
ON DELETE SET NULL;
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 197
Criando restries: chave nica
n Uma restrio de chave nica protege uma ou mais colunas em
uma tabela, garantindo que registros tenham valores repetidos.
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 198
Criando restries: chave nica
n Exemplo da criao de uma chave nica junto ao create table:
create table DISCIPLINA(
CODIGO number(3) not null PRIMARY KEY,
NOME varchar2(40) not null,
CARGA_HORARIA number(3) not null,
CPF_PROFESSOR number(11) not null,
CONSTRAINT fk_professor
FOREIGN KEY (CPF_PROFESSOR)
REFERENCES PROFESSOR(CPF),
CONSTRAINT un_nome_disciplina UNIQUE (nome)
);
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 199
Criando restries: chave nica
n Exemplo da criao de uma chave estrangeira utilizando alter
table:
create table DISCIPLINA(
CODIGO number(3) not null PRIMARY KEY,
NOME varchar2(40) not null,
CARGA_HORARIA number(3) not null,
CPF_PROFESSOR number(11) not null
);
q Isto , voc cria a tabela sem chave nica e depois a altera inserido a
restrio de chave nica.
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 200
Criando restries: verificao
n Uma restrio de verificao (check) especifica uma condio
booleana que deve ser sempre satisfeita.
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 201
Criando restries: verificao
n Exemplo da criao de uma restrio de verificao junto ao create
table:
create table DISCIPLINA(
CODIGO number(3) not null PRIMARY KEY,
NOME varchar2(40) not null,
CARGA_HORARIA number(3) not null,
CPF_PROFESSOR number(11) not null,
CONSTRAINT fk_professor
FOREIGN KEY (CPF_PROFESSOR)
REFERENCES PROFESSOR(CPF),
CONSTRAINT un_nome_disciplina UNIQUE (nome),
CONSTRAINT ck_carga_horaria
CHECK (carga_horaria between 80 and 160)
);
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 202
Criando restries: verificao
n Exemplo da criao de uma restrio de verificao utilizando alter
table:
create table DISCIPLINA(
CODIGO number(3) not null PRIMARY KEY,
NOME varchar2(40) not null,
CARGA_HORARIA number(3) not null,
CPF_PROFESSOR number(11) not null
);
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 203
Adiando verificao de restries
n Por padro, o Oracle verifica se um dado conforma com a restrio
logo que a instruo executada.
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 204
Adiando verificao de restries
n Observe o seguinte DER:
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 205
Adiando verificao de restries
n Observe a seguinte DML:
create table DEPARTAMENTO(
CODIGO number(3) not null PRIMARY KEY,
NOME varchar2(60) not null,
CPF_GERENTE number(11) not null
);
create table EMPREGADO(
CPF number(11) not null PRIMARY KEY,
NOME varchar2(60) not null,
CODIGO_DEPTO number(3) not null
);
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 206
Adiando verificao de restries
n Observe a seguinte DML:
alter table DEPARTAMENTO add constraint fk_depto_gerente
FOREIGN KEY (CPF_GERENTE) references EMPREGADO(CPF)
INITIALLY DEFERRED DEFERRABLE;
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 207
Adiando verificao de restries
n Observe o bloco transacional abaixo:
BEGIN
insert into DEPARTAMENTO (CODIGO, NOME, CPF_GERENTE)
values (1,'Departamento Qualquer',12345678901);
COMMIT;
END;
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 208
Ativando e desativando restries
n Quando se cria uma restrio, ela est automaticamente ativa (a
no ser que voc a crie utilizando a clusula DISABLE).
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 209
Ativando e desativando restries
n Exemplos de desativao:
q ALTER TABLE professor DISABLE CONSTRAINT ck_salario;
n Desabilita a verificao de salrio.
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 210
Ativando e desativando restries
n Exemplos de ativao:
q ALTER TABLE professor ENABLE CONSTRAINT ck_salario;
n Ativa a verificao de salrio.
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 211
Destruindo restries
n Restries so destrudas usando a instruo ALTER TABLE.
Qualquer restrio pode ser destruda pela espeficao do seu
nome.
q ALTER TABLE disciplina DROP CONSTRAINT ck_carga_horaria;
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 212
Aula 11
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 213
Esquema Venda
Modelo ER
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 214
Esquema Venda
Modelo Relacional
CLIENTE ( cpf-ou-cnpj , titulo-eleitor , nome , cidade , estado , pais)
dom(cpf-ou-cnpj) = numrico(14) NN
dom(titulo-eleitor) = numrico(8) NN, com ttulo de eleitor nico
dom(nome) = alfabtico(60) NN
dom(cidade) = alfabtico(60) NN
dom(estado) = alfabtico(2) NN, deve ser MG, RJ ou SP
dom(pais) = albabtico(60)
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 215
Esquema Venda
Modelo Relacional
COMPRA ( cpf-ou-cnpj , id-produto , data , qtde )
dom(cpf-ou-cnpj) = numrico(14) NN
dom(id-produto) = numrico(2) NN
dom(data) = data NN
dom(qtde) = numrico(1) NN, com o valor 1 como padro
COMPRA [cpf-ou-cnpj] r CLIENTE [cpf-ou-cnpj]
COMPRA [id-produto] r PRODUTO [id-produto]
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 216
Renomeando tabelas
n A instruo RENAME usada para renomear uma tabela e outros
objetos, como vises, sinnimos ou sequncias.
n Sintaxe:
q RENAME nome-antigo TO novo-nome;
n Exemplo:
q RENAME funcionario TO empregado;
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 217
Modificando Tabelas
n Aps a criao de uma tabela, existem vrios motivos pelos quais
voc tenha que modific-la.
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 218
Renomeando colunas
n A instruo ALTER TABLE utilizada para renomear colunas.
n Sintaxe:
q ALTER TABLE nome-tabela
RENAME COLUMN nome-antigo TO novo-nome;
n Exemplo:
q ALTER TABLE empregado
RENAME COLUMN pnome TO primeiro_nome;
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 219
Adicionando colunas
n s vezes pode ser necessria adicionar colunas a uma tabela j
existente.
n Sintaxe:
q ALTER TABLE nome-tabela
ADD definio-da-coluna;
n Exemplo:
q ALTER TABLE empregado
ADD salario number(8,2) null;
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 220
Adicionando colunas
n Pode-se adicionar vrias colunas ao mesmo tempo, bastando
apenas demarcar as colunas por parnteses e separar cada uma
das colunas por vrgula.
n Exemplo:
q ALTER TABLE empregado
ADD ( salario number(8,2) null , bonus number(6,2) null )
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 221
Adicionando colunas
n Se a coluna for NOT NULL, como pode-se preencher as linhas existentes
com valor NULL?
q Uma soluo adicionar a coluna com um valor padro (o salrio
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 222
Adicionando colunas
q Uma outra soluo seria adicion-la como NULL, atualizar o salrio de
todos os empregados (colocando valores no-nulos) e ento modificar a
coluna para NOT NULL.
n Ex.:
q ALTER TABLE empregado
ADD salario number(8,2) null;
... (srie de atualizaes) ...
ALTER TABLE empregado
MODIFY salario not null;
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 223
Modificando colunas
n s vezes pode ser necessria modificar colunas de uma tabela j
existente.
n Sintaxe:
q ALTER TABLE nome-tabela
MODIFY nome-da-coluna novos-atributos;
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 224
Modificando colunas
n Exemplo:
q Alterando o tipo de dado:
n ALTER TABLE empregado MODIFY salario number(10,2);
q Alterando a anulabilidade:
n ALTER TABLE empregado MODIFY salario null;
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 225
Modificando colunas
n Existem algumas regras a serem seguidas para a alterao das
definies de colunas:
q Voc pode aumentar o tamanho de uma coluna texto e a preciso de
uma coluna numrica. Se a coluna for CHAR e a tabela possuir diversas
linhas ir demandar um tempo superior, pois todos as linhas tero que
serem preenchidas com espaos em branco.
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 226
Destruindo colunas
n s vezes uma coluna no faz mais sentido e deseja-se retir-la da
tabela.
n Sintaxe:
q ALTER TABLE nome-tabela
DROP nome-da-coluna [CASCADE CONSTRAINTS];
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 227
Destruindo colunas
n Destruir uma coluna de uma tabela com muitos registros pode levar
um tempo considervel.
n Sintaxe:
q ALTER TABLE nome-tabela
SET UNUSED COLUMN nome-da-coluna
[CASCADE CONSTRAINTS];
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 228
Destruindo colunas
n Exemplo:
q ALTER TABLE empregado
SET UNUSED COLUMN titulo_eleitor;
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 229
Aula 12
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 230
Esquema RH (traduo do HR)
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 231
Criando vises
n Uma viso uma representao lgica de dados de uma ou mais
tabelas ou vises. Pode-se pensar em uma viso como uma
consulta (query) armazenada no banco de dados.
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 232
Criando vises
n Exemplo:
q O departamento 90 o departamento Executivo, portanto segue uma
viso simplificada sobre os seus funcionrios:
n create view EXECUTIVO as
select PRIMEIRO_NOME || ' ' || ULTIMO_NOME as "NOME", EMAIL
from RH.EMPREGADO
where ID_DEPARTAMENTO = 90;
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 233
Criando vises
n Vises podem ser baseadas em consultas mais sofisticadas,
envolvendo junes, funes, agrupamentos, subqueries, etc.
q Observe a seguinte viso. Ela retorna a quantidade de funcionrios por
funo de cada departamento daquelas funes que possuem mais de
dois funcionrios ordenadas pelo departamento, depois pela funo e
depois pela quantidade uma consulta muito utilizada.
n create view REL_DEPTO_FUNCAO as
select d.NOME_DEPARTAMENTO as "DEPARTAMENTO",
f.DESCRICAO_FUNCAO as "FUNO",
to_char(count(e.ID_EMPREGADO),'000') as "QUANTIDADE"
from RH.DEPARTAMENTO d inner join RH.EMPREGADO e
using (ID_DEPARTAMENTO)
inner join RH.FUNCAO f using (ID_FUNCAO)
group by d.NOME_DEPARTAMENTO, f.DESCRICAO_FUNCAO
having count(e.ID_EMPREGADO) > 2 order by 1, 2, 3
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 234
Criando vises
q Como uma consulta largamente utilizada, agora basta realizar a
seguinte consulta que retornar o resultado esperado:
n select * from REL_DEPTO_FUNCAO;
DEPARTAMENTO FUNO QUAN
-------------------- -------------------- ----
Finance Accountant 005
IT Programmer 005
Purchasing Purchasing Clerk 005
Sales Sales Manager 005
Sales Sales Representative 029
Shipping Shipping Clerk 020
Shipping Stock Clerk 020
Shipping Stock Manager 005
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 235
Criando vises somente leitura
n Ao criar uma viso, instrues DML podem ser executadas nela.
Por exemplo, pode-se inserir, atualizar, excluir dados de uma viso,
o que ir modificar as tabelas base envolvidas.
q Existem uma srie de regras para que possa realizar instrues DML
em uma viso.
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 236
Criando vises somente leitura
q Exemplo:
n create view ASSALARIADO as
select PRIMEIRO_NOME || ' ' || ULTIMO_NOME as "NOME",
SALARIO as "SALARIO"
from RH.EMPREGADO
WITH READ ONLY
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 237
Criando vises materializadas
n Uma viso materializada uma viso que armazena os resultados
de uma consulta.
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 238
Criando vises materializadas
q Exemplo:
n create materialized view FUNCIONARIO
REFRESH FORCE
START WITH SYSDATE
NEXT SYSDATE + 1
WITH PRIMARY KEY
as select * from RH.EMPREGADO@banco_dados_remoto
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 239
Modificando vises
n Para alterar uma definio de uma viso, deve-se utilizar a
instruo CREATE VIEW com a opo OR REPLACE.
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 240
Destruindo vises
n Para destruir uma uma viso, deve-se utilizar a instruo DROP
VIEW.
n Exemplo:
q drop view ASSALARIADO
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 241
Outras operaes em vises
n Existem vrias outras coisas que podem ser feitas em uma viso
como:
q Criar vises com erros (opo FORCE)
n compilar ou recompilar
n validar e invalidar
n adicionar ou destruir restries
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 242
Utilizando vises
n Uma viso pode ser utilizada na maioria dos locais onde uma tabela
utilizada, tal como em consultas e instrues DML.
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 243
Utilizando vises
n Se certas condies so respeitadas, maioria das vises baseadas
em uma nica tabela e muitas das vises baseadas em junes
podem ser utilizadas para inserir, atualizar e deletar dados da(s)
tabela(s) base.
q Para verificar quais instrues DML podem ser realizadas em uma dada
viso, basta:
n select COLUMN_NAME, UPDATABLE, INSERTABLE, DELETABLE
from USER_UPDATABLE_COLUMNS
where OWNER = '<nome-usurio>' and
TABLE_NAME='<nome-tabela>'
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 244
Utilizando vises
n So utilizaes comuns de vises:
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 245
Aula 13
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 246
Esquema Acadmico Simples
Modelo ER
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 247
Esquema Acadmico Simples
Modelo Relacional
PROFESSOR (cpf, nome, salario, titulacao)
dom(cpf) = numrico(11) NN
dom(nome) = alfabtico(60) NN
dom(salario) = numrico(9,2) NN
dom(titulacao) = alfabtico(40) NN
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 248
Esquema Acadmico Simples
Modelo Relacional
DISCIPLINA (codigo, nome, carga_horaria, cpf_professor)
dom(codigo) = numrico(3) NN
dom(nome) = alfanumrico(40) NN
dom(carga_horaria) = numrico(3) NN
dom(cpf_professor) = numrico(11) NN
DISCIPLINA [cpf_professor] PROFESSOR [cpf]
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 249
Outros objetos do banco de dados
n Uma base de dados do Oracle contem muito mais do que simples
tabelas e vises:
q Sequncias podem ser utilizadas para gerar chaves artificiais;
q Sinnimos provm apelidos (alias) para objetos;
q Vrios tipos de ndices podem ser inseridos para melhorar o
desempenho de consultas.
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 250
Sequncias
n Uma sequncia do Oracle um gerador nominado de nmeros
sequnciais.
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 251
Criando sequncias
n Sintaxe:
q CREATE SEQUENCE [esquema].<nome-da-sequncia>
[START WITH integer]
[INCREMENT BY integer]
[MINVALUE integer | NOMINVALUE]
[MAXVALUE integer | NOMAXVALUE]
[CYCLE | NOCYCLE]
[CACHE integer | NOCACHE]
[ORDER | NOORDER]
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 252
Criando sequncias
n START WITH
q Define o valor inicial da sequncia. Por padro MAXVALUE para
sequncias descendentes (-1) e MINVALUE para ascendentes (1).
n INCREMENT BY
q Define a quantidade que aumenta ou diminui entre nmeros. O padro
1. Para sequncias descendentes, basta inserir um valor negativo.
n MINVALUE
q Define o menor valor que a sequncia ir gerar. O padro
NOMINVALUE. (1 para sequncias descendentes e -1026 para as
ascendentes.
n MAXVALUE
q Define o maior valor que a sequncia ir gerar. O padro
NOMAXVALUE. (-1 para sequncias descendentes e 1027 para as
ascendentes.
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 253
Criando sequncias
n CYCLE
q Configura a sequncia para repetir nmeros aps alcanar o limite.
n NOCYCLE
q Configura a sequncia para no repetir nmeros aps alcanar o limite.
Este o padro. Quando tentar gerar MAXVALUE+1, uma exceo ser
lanada.
n CACHE
q Define o tamanho do bloco de nmeros da sequncia armazenados na
memria. O padro 20.
n NOCACHE
q Fora o dicionrio de dados a atualizar a sequncia para cada nmero
gerado, garantindo que nenhum espao existir entre os nmeros
gerados, porm o desempenho inferior.
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 254
Criando sequncias
n ORDER
q Garante que os nmeros da sequncia sejam gerados pela ordem de
requisio.
n NOORDER
q No garante que os nmeros da sequncia sejam gerados pela ordem
de requisio. Esta a opo padro.
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 255
Criando sequncias
n Exemplo de uma sequncia ascendente:
q create sequence SQ_MATRICULA_ALUNO;
corresponde a
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 256
Destruindo sequncias
n Sintaxe:
q drop sequence <nome-da-sequncia>
n Exemplo:
q drop sequence SQ_MATRICULA_ALUNO
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 257
Usando sequncias
n Para acessar o prximo nmero na sequncia, voc simplesmente
seleciona, usando a pseudo-coluna NEXTVAL.
q Ex.:
n select SQ_MATRICULA_ALUNO.NEXTVAL from dual;
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 258
Usando sequncias
n Exemplo de usos:
q Inserindo um novo aluno:
n insert into ALUNO (matricula, nome, data_nascimento)
values (sq_matricula_aluno.nextval, 'Aluno', sysdate)
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 259
Alterando sequncias
n Voc no pode simplesmente alterar a sequncia e ajustar o seu
NEXTVAL. Para isto existem as seguintes solues:
q Destru-la e recri-la.
n Invalidar todos os objetos dependentes e perder as permisses
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 260
Sequncias
n Para ver as sequncias existentes e suas propriedades, basta:
q select * from USER_SEQUENCES;
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 261
Sinnimos
n Sinnimo um apelido para um outro objeto do banco de dados.
n Sintaxe de criao:
q create synonym <nome-sinnimo> for <[esquema].<nome-objeto>>
q Ex.:
n create synonym EMPREGADO for RH.EMPREGADO
n Sintaxe de destruio:
q Ex.:
n drop synonym EMPREGADO
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 262
ndices
n Os ndices so estruturas de dados que podem oferecer um melhor
desempenho na obteno de linhas especficas do que o full-table
scan (escaneamento completo da tabela) que o padro.
n Pensamento:
q Um bilho de empregados. Crio os ndices e depois insiro todos os
empregados ou insiro todos os empregados e depois crio os ndices?
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 263
ndices
n Os ndices podem ser nicos (UNIQUE) ou no nicos.
n Pensamentos:
q Qual possui melhor desempenho?
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 264
Criando ndices
n Sintaxe:
q CREATE [UNIQUE] INDEX <nome-ndice> ON
<nome-tabela> ( <nome-coluna> [, <nome-coluna>... ] )
n Exemplo:
q create index IX_DATA_NASCIMENTO on
ALUNO (DATA_NASCIMENTO)
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 265
Destruindo ndices
n Sintaxe:
q DROP INDEX <nome-ndice>
n Exemplo:
q drop index IX_DATA_NASCIMENTO
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 266
Aula 14
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 267
Acesso de usurio e segurana
n O Oracle prov vrios mtodos para controle de acesso de
usurios. Quando se cria um usurio, pode-se especificar como ele
autenticado e tambm ajustar vrios de seus atributos.
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 268
Criando e alterando usurios
n A instruo CREATE USER empregada para a criao de
usurios (tambm conhecidos como conta ou esquema) e pode,
opcionalmente, designar certos atributos adicionais ao usurio.
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 269
Criando usurios
n A sintaxe para criao de usurios :
q CREATE USER <nome-do-usurio> IDENTIFIED BY <senha-do-usurio>
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 270
Designando atributos usurios
n Atributos da conta so atribuidos com a prpria instruo CREATE
como com a instruo ALTER USER.
q A instruo CREATE USER deve conter minimamente o usurio e a
clusula da senha.
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 271
Designando atributos usurios
n Segue exemplos dos mais utilizados:
q Alterando senha:
n ALTER USER <usurio> IDENTIFIED BY <senha>
q Vinculando a um profile:
n ALTER USER <usurio> PROFILE <nome-do-perfil>
q Vinculando a um role:
n ALTER USER <usurio> DEFAULT ROLE <nome-do-papel>
q Somente funciona com usurios administradores e s com a instruo ALTER
USER.
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 272
Designando atributos usurios
q Expirando senha:
n ALTER USER <usurio> PASSWORD EXPIRE
q Travando um usurio:
n ALTER USER <usurio> ACCOUNT LOCK
q Para destravar, basta substituir LOCK por UNLOCK
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 273
Usando controle de licena de usurios
n O Oracle fornece vrios tipos de licena de funcionamento. Para
que se respeite a licena de uso adquirida, o Oracle inclui alguns
mecanismos de controle.
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 274
Criando e usando roles
n Um role um instrumento para administrar privilgios. Os privilgios
podem ser garantidos a um role e este role ser garantido a um
usurio ou, at mesmo, a um outro role.
q No servem para nenhum outro propsito a no ser um agrupamento de
privilgios para facilitar a administrao de privilgios.
n Sintaxe:
q CREATE ROLE <nome-do-papel>;
n Pode-se inserir uma senha para o role, se isto for feito ela deve ser ativada
para seu funcionamento.
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 275
Criando e usando roles
n Exemplo:
q CREATE ROLE permissao_aluno;
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 276
Criando e usando profiles
n Profiles permitem gerenciar grupos de usurios por limitar recursos
de processamento ou polticas de senha.
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 277
Criando e usando profiles
n Sintaxe:
q [CREATE | ALTER] PROFILE <nome-do-perfil> LIMIT <restrio>
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 278
Criando e usando profiles
n Exemplo:
q CREATE PROFILE aluno LIMIT SESSIONS_PER_USER 1;
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 279
Garantindo e revogando privilgios
n Privilgios permitem um usurio acessar objetos ou executar
programas que so de um outro usurio ou executar operaes de
nvel de sistema, como criar e destruir objetos.
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 280
Garantindo e revogando privilgios
n O Oracle tem trs tipos de privilgios:
q Privilgios de objetos (Object privileges)
n So permisses em objetos de esquemas, como tabelas, vises, funes e
bibliotecas.
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 281
Privilgios de objetos
n Privilgios de objetos:
q ALTER
q DELETE
q EXECUTE
q INDEX
q INSERT
q SELECT
q UPDATE
q ALL
q Outros privilgios:
n READ REFERENCE
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 282
Privilgios de sistema
n Privilgios de sistema:
q CLUSTER SEQUENCE
q DATABASE SESSION
q INDEX SYNONYM
q PROCEDURE TABLE
q PROFILE TABLESPACE
q ROLE USER
q ROLLBACK SEGMENT VIEW
q Outros privilgios:
n ANALYSE AUDIT COMMENT
n PRIVILEGE ROLE
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 283
Atribuindo privilgios
n Quando se deseja atribuir um ou mais privilgios para um usurio
ou um role, deve ser utilizada a instruo GRANT.
n SINTAXES:
q GRANT <privilegio-de-objeto> TO <usurio|role|PUBLIC>
[WITH GRANT OPTION]
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 284
Atribuindo privilgios de objetos
n Exemplos de atribuio de privilgios de objetos:
q GRANT SELECT ON rh.empregado TO joazinho
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 285
Atribuindo privilgios de objetos
n Privilgios de objetos podem ser garantidos com WITH GRANT
OPTION, que permite ao garantido garantir estes privilgios para
qualquer outro usurio ou role.
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 286
Atribuindo privilgios de objetos
n Por exemplo, se o usurio RH conceder consulta a tabela FUNCAO
ao Joozinho usando WITH GRANT OPTION, Joozinho pode
conceder consulta a essa mesma tabela a Mariazinha:
q conn rh/rh@xe;
GRANT SELECT ON rh.funcao TO joaozinho WITH GRANT OPTION;
conn joaozinho/joaozinho@xe;
GRANT SELECT ON rh.funcao TO mariazinha;
conn mariazinha/mariazinha@xe;
select * from rh.funcao;
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 287
Atribuindo privilgios de objetos
n Entendimento 1:
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 288
Atribuindo privilgios de objetos
n Entendimento 2:
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 289
Atribuindo privilgios de sistema
n Exemplos de atribuio de privilgios de sistema:
q GRANT CREATE SESSION TO joaozinho
GRANT CREATE SEQUENCE TO joaozinho
GRANT CREATE SYNONYM TO joaozinho
GRANT CREATE TABLE TO joaozinho
GRANT CREATE ANY TABLE TO joaozinho
GRANT DROP TABLE TO joaozinho
GRANT DROP ANY TABLE TO joaozinho
GRANT CREATE PROCEDURE TO joaozinho
GRANT EXECUTE ANY PROCEDURE TO joaozinho
GRANT CREATE USER TO joaozinho
GRANT DROP USER TO joaozinho
GRANT CREATE VIEW TO joaozinho
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 290
Atribuindo privilgios de sistema
n Existe trs roles que abrangem vrios privilgios de sistema e
facilitam em muito a concesso de vrias permisses:
q CONNECT
n Contm somente o privilgio CREATE SESSION.
q RESOURCE
n Contm os seguintes privilgios:
q CREATE CLUSTER, CREATE INDEXTYPE, CREATE OPERATOR, CREATE
PROCEDURE, CREATE SEQUENCE, CREATE TABLE, CREATE TRIGGER,
CREATE TYPE.
q DBA
n Contm os privilgios comuns de um administrador do banco de dados.
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 291
Atribuindo privilgios de sistema
n Privilgios de sistema podem ser garantidos com WITH ADMIN
OPTION, que permite ao garantido garantir estes privilgios de
sistema para qualquer outro usurio ou role.
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 292
Atribuindo privilgios de sistema
n Por exemplo, se o usurio RH conceder criao de viso ao
Joozinho usando WITH ADMIN OPTION, Joozinho pode
conceder criao de viso a Mariazinha:
q conn rh/rh@xe;
GRANT CREATE VIEW TO joaozinho WITH ADMIN OPTION;
conn joaozinho/joaozinho@xe;
GRANT CREATE VIEW TO mariazinha;
conn mariazinha/mariazinha@xe;
create view DUPLO as select * from dual;
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 293
Atribuindo privilgios de sistema
n Entendimento:
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 294
Revogando privilgios
n Quando se deseja revogar um ou mais privilgios para um usurio
ou um role, deve ser utilizada a instruo REVOKE.
n SINTAXE:
q REVOKE <privilegio-de-objeto-ou-sistema> FROM <usurio|role|PUBLIC>
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 295
Revogando privilgios
n Exemplos de revogao de privilgios de sistema:
q REVOKE CREATE SESSION FROM joaozinho
q REVOKE CREATE SEQUENCE FROM joaozinho
q REVOKE CREATE SYNONYM FROM joaozinho
q REVOKE CREATE TABLE FROM joaozinho
q REVOKE CREATE ANY TABLE FROM joaozinho
q REVOKE DROP TABLE FROM joaozinho
q REVOKE DROP ANY TABLE FROM joaozinho
q REVOKE CREATE PROCEDURE FROM joaozinho
q REVOKE EXECUTE ANY PROCEDURE FROM joaozinho
q REVOKE CREATE USER FROM joaozinho
q REVOKE DROP USER FROM joaozinho
q REVOKE CREATE VIEW FROM joaozinho
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 296
Aula 15
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 297
Sistema da Locadora: MR s/atributos
ATOR ( id_ator , nome_real , nome_artistico , dt_nascimento )
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 298
Sistema da Locadora: MR s/atributos
LOCACAO ( id_filme , numero , id_cliente , dt_locacao , dt_devolucao_prevista,
dt_devolucao_efetiva)
LOCACAO [id_filme , numero] DVD [id_filme , numero]
LOCACAO [id_cliente] CLIENTE [id_cliente]
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 299
Vises, permisses e otimizaes
n Hoje vamos trabalhar com vises, permisses e otimizaes
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 300
Cronograma da aula
1. Criar trs tipos de usurios:
n Administrador, cliente e atendente
5. Criar sinnimos
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 301
Para o cliente
n Criao da viso somente leitura VW_DADOS_CLIENTE
q Exibir o ID_CLIENTE, CPF, NOME, TIPO, TELEFONE, ENDERECO e o
NOME_TITULAR (este ltimo caso seja dependente)
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 302
Para o cliente
n Criao da viso somente leitura VW_RELATORIO_FILMES
q Exibir o NOME_FILME, CATEGORIA, NOME_ARTISTICO (caso no exista
exibir o NOME_REAL), QTDE e QTDE_DISP
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 303
Para o cliente
n As seguintes permisses devem ser concedidas:
q Em todas as vises criadas para o cliente
n R (Retrieve)
q Pois somente poder consultar
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 304
Para o atendente
n Criao da viso somente leitura VW_RELATORIO_FILMES_COMPLETO
q Exibir o NOME_FILME, CATEGORIA, NOME_REAL, NOME_ARTISTICO
QTDE e QTDE_DISP
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 305
Para o atendente
n As seguintes permisses devem ser concedidas:
q Em LOCACAO
n CRUD (Create, Retrieve, Update e Delete)
q Pois o atendente deve gerenciar as locaes
q Em FUNCIONARIO
n R
q Pois o atendente somente poder consultar essa tabela para se logar
q Em SQ_CLIENTE e SQ_ENDERECO
n Acesso
q Pois o atendente deve utilizar essas sequncias para as atividades acima mencionadas
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 306
Para o atendente
n Sinnimos para todas as vises criadas para o atendentes foram criados:
q create SYNONYM VW_RELATORIO_FILMES_COMPLETO FOR
LOC_ADM.VW_RELATORIO_FILMES_COMPLETO;
q create SYNONYM VW_SITUACAO_DVDS FOR LOC_ADM.VW_SITUACAO_DVDS;
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 307
Como ficou?
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 308
Otimizao
n Observando as vises criadas e as responsabilidades tanto do cliente
quanto do atendente, quais ndices seriam apropriados para criao e
porque?
q CPF e SENHA do FUNCIONRIO
n create index ix_login_funcionario on FUNCIONARIO(CPF,SENHA);
q ID_CLIENTE em LOCACAO
n create index ix_locacao_cliente on LOCACAO(ID_CLIENTE);
q ID_TITULAR em DEPENDENTE
n create index ix_dependente_titular on DEPENDENTE(ID_TITULAR);
q ...
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 309
Otimizao
q ID_CATEGORIA em FILME
n create index ix_filme_categoria on FILME(ID_CATEGORIA);
q NOME em CLIENTE
n create index ix_nome_cliente on CLIENTE(NOME);
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 310
Aula 16
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 311
Triggers
n Triggers so procedimentos que podem ser gravados em Java, PL/
SQL ou C. So executados (ou disparados) implicitamente quando
uma tabela modificada, um objeto criado ou ocorrem algumas
aes de usurio ou de sistema de banco de dados
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 312
Triggers
n Uma trigger composta por quatro partes:
q Momento
q Evento
q Tipo
q Corpo
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 313
Triggers - momento
n Momento define quando uma trigger ir ser acionada. Pode ser:
q BEFORE (tabela)
q AFTER (tabela)
q INSTEAD OF (view)
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 314
Triggers - momento
n BEFORE indica que os comandos PL/SQL do corpo da trigger
sero executados ANTES dos dados da tabela serem alterados.
Normalmente usamos BEFORE nos casos em que precisamos
incializar variveis globais, validar regras de negcios, alterar o
valor de flags ou para salvar o valor de uma coluna antes de
alterarmos o valor delas. Exemplo:
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 315
Triggers - momento
n AFTER indica que os comando PL/SQL do corpo da trigger ser
executado APS os dados da tabela serem alterados.
Normalmente usamos AFTER para completar os dados de outras
tabelas e para completar a atividade de outra trigger de momento
BEFORE. Exemplo:
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 316
Triggers - momento
n INSTEAD OF indica que a trigger ir ser executada no lugar da
instruo que disparou a trigger. Literalmente, a instruo
substituda pela trigger
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 317
Triggers - momento
n Dois detalhes muito importantes sobre INSTEAD OF:
q S funcionam com views
q sempre de linha. Ser considerado assim, mesmo que "FOR EACH
ROW" for omitido
n Exemplo:
CREATE OR REPLACE TRIGGER novo_func
INSTEAD OF INSERT ON vemp
FOR EACH ROW
WHEN ...
.
.
END;
/
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 318
Triggers - evento
n O evento define qual a instruo DML que aciona/disparar a
trigger. Pode ser:
q INSERT
q UPDATE
q DELETE
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 319
Triggers - evento
n Exemplo:
CREATE OR REPLACE TRIGGER novo_func
AFTER INSERT ON emp
.
.
END;
/
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 320
Triggers - tipo
n O tipo define quantas vezes uma trigger ser executa. A trigger
pode ser executada uma vez para a instruo que a disparou ou ser
disparada para cada linha afetada pela instruo que a disparou.
Pode ser:
q Instruo (STATEMENT)
q Linha (ROW)
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 321
Triggers - tipo
n Quando a trigger for do tipo instruo ela ser disparada uma vez
para cada evento de trigger, mesmo que nenhuma linha tenha sido
afetada. So teis para aquelas trigger que eventualmente no
alteram dados ou para situaes onde o que queremos uma
resposta da trigger, por exemplo, em uma restrio complexa de
negcio. Por DEFAULT toda trigger deste tipo. Exemplo:
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 322
Triggers - tipo
n Quando a trigger for do tipo linha, a trigger ser executada toda vez
que a tabela for afetada pelo evento da trigger. Se nenhuma linha
for afetada a trigger no ser executada. So muito teis quando a
ao da trigger depende dos dados afetados pelo evento da trigger.
Exemplo:
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 323
Triggers - corpo
n O corpo define a ao que uma trigger ir executar quando
acionada. O corpo de uma trigger composto por um bloco PL/
SQL, a chamada de uma PROCEDURE ou por um procedimento
JAVA. Por definio, o tamanho de uma trigger no pode
ultrapassar 32K
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 324
Triggers - corpo
n Sintaxe bsica:
CREATE [OR REPLACE] TRIGGER [schema.] nome_da_trigger
[BEFORE|AFTER]
[DELETE|OR INSERT|OR UPDATE[OF coluna]]
ON [schema.] nome_da_tabela_ou_da_view
[REFERENCING [OLD [AS] OLD] [NEW [AS] NEW]
[FOR EACH ROW|STATEMENT]
[WHEN [condio]]
BLOCO PL/SQL
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 325
Triggers exemplos prticos
n Antes de trabalharmos com triggers em tabelas, vamos entender o
seu funcionamento com alguns eventos de sistema, tais como:
q AFTER SERVERERROR
q AFTER LOGON
q BEFORE LOGOFF
q AFTER STARTUP
q BEFORE SHUTDOWN
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 326
Triggers exemplos prticos
n O prximo exemplo ir auditar o nome do usurio e a data e hora
que ele realizou login no sistema
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 327
Triggers exemplos prticos
n Observe como ficaria a nossa trigger de auditoria:
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 328
Triggers exemplos prticos
n A trigger pode apresentar problemas no momento de sua criao e
exibir mensagem como a abaixo:
Warning: Trigger created with compilation errors.
LINE/COL ERROR
-------- -----------------------------------------------
2/3 PL/SQL: SQL Statement ignored
2/19 PL/SQL: ORA-00942: table or view does not exist
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 329
Triggers exemplos prticos
n Caso no seja logo em seguida, voc pode a qualquer momento
realizar o comando "SHOW ERRORS TRIGGER nome_da_trigger":
SQL> SHOW ERRORS TRIGGER audita_login;
No errors.
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 330
Triggers exemplos prticos
n At mesmo o corpo da trigger pode ser acessado pela
USER_TRIGGERS:
SELECT trigger_name, trigger_type, triggering_event,
table_name, referencing_names,
status, trigger_body
FROM user_triggers
WHERE trigger_name = 'NOME_DA_TRIGGER';
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 331
Triggers exemplos prticos
n Caso descubra que no precisa mais da trigger existe duas formas
de tratar a situao: elimin-la ou desabilit-la.
n Eliminando a trigger:
q drop trigger NOME_DA_TRIGGER
n Desabilitando:
q alter trigger NOME_DA_TRIGGER disable
n Habilitando:
q alter trigger NOME_DA_TRIGGER enable
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 332
Triggers exemplos prticos
n Vamos continuar com nossos exemplos prticos. Existe uma tabela
chamada RELATORIO que possui uma nica linha e possui um
campo QTDE_FUNCIONARIO e TOTAL_SALARIO. Observe:
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 333
Triggers exemplos prticos
n Suponha que exista a seguinte tabela:
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 334
Triggers exemplos prticos
n Portanto, para iniciar a tabela RELATORIO basta:
insert into RELATORIO
(ID_RELATORIO, QTDE_FUNCIONARIO, TOTAL_SALARIO)
values
(1,
(select count(*) from FUNCIONARIO),
(select nvl(sum(SALARIO),0) from FUNCIONARIO)
);
n Como manter este relatrio sempre atualizado sem ter que ficar
sempre contando todos os funcionrios e somando todos os
salrios?
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 335
Triggers exemplos prticos
n Manteremos a quantidade de funcionrios sempre atualizada se:
q ao inserir mais um funcionrio, incrementarmos a quantidade
q ao excluir um funcionrio, decrementarmos a quantidade
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 336
Triggers exemplos prticos
n Manteremos a quantidade de funcionrios sempre atualizada se:
q ao inserir mais um funcionrio, incrementarmos a quantidade
q ao excluir um funcionrio, decrementarmos a quantidade
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 337
Triggers exemplos prticos
n Manteremos o total de salrio sempre atualizado se:
create or replace trigger TRIGGER_TOTAL_SALARIO
AFTER INSERT OR DELETE OR UPDATE OF SALARIO ON FUNCIONARIO
FOR EACH ROW
begin
IF INSERTING THEN
update RELATORIO
set TOTAL_SALARIO = TOTAL_SALARIO + :NEW.SALARIO;
ELSIF DELETING THEN
update RELATORIO
set TOTAL_SALARIO = TOTAL_SALARIO - :OLD.SALARIO;
ELSIF UPDATING THEN
update RELATORIO
set TOTAL_SALARIO = TOTAL_SALARIO -
:OLD.SALARIO + :NEW.SALARIO;
END IF;
end;
/
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 338
Triggers exemplos prticos
n Teste:
[1 0 0 ] (select * from RELATORIO)
insert into FUNCIONARIO values (1, 'A', 43.9);
[1 1 43.9 ]
insert into FUNCIONARIO values (2, 'B', 106.1);
[1 2 150.0 ]
insert into FUNCIONARIO values (3, 'C', 40.0);
[1 3 190.0 ]
update FUNCIONARIO set SALARIO = 116.1
where ID_FUNCIONARIO = 2;
[1 3 200.0 ]
delete from FUNCIONARIO where ID_FUNCIONARIO = 3;
[1 2 160.0 ]
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 339
Triggers exemplos prticos
n Solucionando herana por disjuno:
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 340
Triggers exemplos prticos
n Restrio por chave estrangeira no suficiente:
create table FUNCIONARIO (
ID_FUNCIONARIO number(3) not null,
NOME varchar2(60) not null,
constraint PK_FUNCIONARIO primary key (ID_FUNCIONARIO)
);
create table CHEFE (
ID_CHEFE number(3) not null,
SALARIO number(8,2) not null,
constraint PK_CHEFE primary key (ID_CHEFE),
constraint fk_chefe FOREIGN KEY (ID_CHEFE)
references FUNCIONARIO(ID_FUNCIONARIO)
);
create table PEAO (
ID_PEAO number(3) not null,
CARGA_TRABALHO number(3) not null,
constraint PK_PEAO primary key (ID_PEAO),
constraint fk_peao FOREIGN KEY (ID_PEAO)
references FUNCIONARIO(ID_FUNCIONARIO)
);
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 341
Triggers exemplos prticos
n Manteremos a integridade de disjuno se:
q Ao vincular um funcionrio como CHEFE, garantir que ele no seja PEO
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 342
Triggers exemplos prticos
n Manteremos a integridade de disjuno se:
q Ao vincular um funcionrio como PEO, garantir que ele no seja CHEFE
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 343
Referncia Bibliogrfica
n DAWES, Chip; THOMAS, Biju. OCA/OCP: Introduction to Oracle9i SQL.
So Francisco: Sibex, 2002.
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 344
Referncia Bibliogrfica
n Oracle PL/SQL Tutorial: Index. Disponvel em: <http://www.java2s.com/
Tutorial/Oracle/0180__Index/0020__Create-Index.htm>. Acesso em: 06 jun.
2008.
Ricardo Terra (rterrabh [at] gmail.com) Apostila Oracle Outubro, 2008 345