Академический Документы
Профессиональный Документы
Культура Документы
Existem modelos alternativos para se implementar um SGBD, sendo que os mais comuns
são hierárquico, rede, listas invertidas e relacional.
• tabelas
• colunas
• linhas
1
Os operadores relacionais são:
Seleção/Restrição
Projeção
União
2
Interseção
Diferença
3
Produto
Junção
Background Processes
Banco de Dados
Servers
O SGBD:
Estruturas de memória:
System Global Area (SGA) é uma região compartilhada de memória alocada pelo
SGBD Oracle, que contém dados e informações de controle. Quanto maior for a
SGA melhor será o desempenho do Oracle. Os dados da SGA são compartilhados
por todos os usuários que estão acessando o banco de dados. As informações
4
armazenadas na SGA estão divididas por tipo de estrutura de memória, incluindo
‘database buffers’, ‘redo log buffers’ e ‘shared poll’.
Program Global Area (PGA) é uma área de memória que contém dados e
informações de controle para um processo servidor. Uma PGA é criada pelo Oracle
quando um processo servidor é iniciado.
Processos:
O Banco de dados:
5
Capítulo 2: Introdução às Consultas
2.1 Objetivos deste capítulo
Este capítulo faz uma introdução à linguagem de consulta utilizada para acessar o Banco de
Dados Oracle. Em particular, são discutidas as declarações utilizadas para:
• realizar cálculos
• concatenar colunas
• ordenar linhas
O SQL*PLUS é uma interface através da qual os comandos SQL podem ser entrados e
executados. O SQL*PLUS possui outros comandos, que permitem formatar a saída dos
comandos SQL, além de fornecer facilidades para editar e salvar comandos SQL.
Para listar os números de todos os departamentos, nomes dos empregados e números dos
gerentes da tabela EMP, digita-se:
6
DEPTNO ENAME MGR
------- ---------- -------
20 SMITH 7902
30 ALLEN 7698
30 WARD 7698
20 JONES 7839
30 MARTIN 7698
30 BLAKE 7839
10 CLARK 7839
20 SCOTT 7566
10 KING
30 TURNER 7698
20 ADAMS 7788
30 JAMES 7698
20 FORD 7566
10 MILLER 7782
14 rows selected.
SQL> SELECT *
2 FROM EMP
14 rows selected.
No exemplo abaixo calcula-se o salário anual multiplicando-se o salário mensal por doze.
7
2 FROM EMP
ENAME SAL+250*12
---------- ----------
SMITH 3800
ALLEN 4600
WARD 4250
JONES 5975
MARTIN 4250
BLAKE 5850
CLARK 5450
SCOTT 6000
KING 8000
TURNER 4500
ADAMS 4100
JAMES 3950
FORD 6000
MILLER 4300
Parênteses podem ser utilizados para especificar a ordem na qual os operadores serão
executados. Se, por exemplo, for necessário somar 250 ao salário antes de multiplicar por
12, devemos escrever:
ENAME (SAL+250)*12
8
---------- ------------
SMITH 12600
ALLEN 22200
WARD 18000
JONES 38700
MARTIN 18000
BLAKE 37200
CLARK 32400
SCOTT 39000
KING 63000
TURNER 21000
ADAMS 16200
JAMES 14400
FORD 39000
MILLER 18600
Para mostrar como título da coluna SALARIO ANUAL no lugar de SAL*12, podemos
escrever:
14 rows selected.
Nota: somente na cláusula SELECT o Aliás pode ser usado, nas outras cláusulas não.
9
O operador de concatenação (||) permite juntar colunas, expressões aritméticas, ou valores
constantes, para criar uma expressão do tipo caracter. Colunas dos dois lados do operador
são combinadas para formar uma só coluna.
Para combinar o número do empregado com o nome do empregado em uma coluna apenas,
utilizando EMPREGADO como título, devemos escrever:
EMPREGADO
--------------------------------------------------
7369SMITH
7499ALLEN
7521WARD
7566JONES
7654MARTIN
7698BLAKE
7782CLARK
7788SCOTT
7839KING
7844TURNER
7876ADAMS
7900JAMES
7902FORD
7934MILLER
14 rows selected.
2.7 Literais
O literal da cláusula SELECT é listado em todas as linhas mostradas pelo comando. Literais
dos tipos data e caracter devem ser envoltos por apóstrofos ('). Literais numéricos não
precisam de apóstrofos.
O comando abaixo contém literal concatenado com colunas, e um Aliás para a primeira
coluna.
14 rows selected.
Se em uma linha não existir valor para uma determinada coluna, este valor é dito como
sendo nulo.
Um valor nulo é um valor que não está disponível, é desconhecido, ou não é aplicável. Um
valor nulo não é o mesmo que zero. Zero é um número.
ENAME SALARIO_ANUAL
---------- -------------
SMITH
ALLEN 19500
WARD 15500
JONES
MARTIN 16400
BLAKE
CLARK
SCOTT
KING
TURNER 18000
ADAMS
JAMES
FORD
MILLER
14 rows selected.
Para calcular o resultado corretamente, deve ser utilizada a expressão NVL, que converte
um valor nulo em um valor não nulo, conforme mostrado abaixo:
ENAME SALARIO_ANUAL
---------- -------------
SMITH 9600
ALLEN 19500
WARD 15500
JONES 35700
MARTIN 16400
11
BLAKE 34200
CLARK 29400
SCOTT 36000
KING 60000
TURNER 18000
ADAMS 13200
JAMES 11400
FORD 36000
MILLER 15600
14 rows selected.
a) uma expressão
NVL(ColunaData, ‘01-jan-84')
NVL(ColunaNumero, 9)
NVL(ColunaCaracter, ‘alfanumérico')
A não ser que seja especificado o contrário, as linhas duplicadas não são eliminadas dos
resultados das consultas.
DEPTNO
-------
20
30
30
20
30
30
10
20
10
30
20
30
20
10
Para eliminar as linhas duplicadas, deve ser incluída a palavra DISTINCT após o SELECT.
12
DEPTNO
-------
10
20
30
DEPTNO JOB
------- ---------
10 CLERK
10 MANAGER
10 PRESIDENT
20 ANALYST
20 CLERK
20 MANAGER
30 CLERK
30 MANAGER
30 SALESMAN
Acima estão mostradas todas as combinações diferentes de departamentos e cargos.
Normalmente, a ordem das linhas retornadas por uma consulta é indefinida. A cláusula
ORDER BY pode ser usada para ordenar linhas. Se for usada, ORDER BY deve ser sempre
a última cláusula de um comando SELECT.
14 rows selected.
13
- Números: menores primeiro
- Data: mais cedo primeiro
- Caracteres: ordem alfabética
Para reverter esta ordem, pode ser utilizada a palavra DESC após o nome da coluna, na
cláusula ORDER BY.
Para listarmos os funcionários mais novos antes dos mais antigos fazemos:
É possível efetuar a ordenação por mais de uma coluna, sendo algumas em ordem
ascendente e outras em ordem descendente.
- Um nome de coluna
- Um operador de comparação
- Um nome de coluna, constante, ou lista de valores
= igual
> maior
>= maior ou igual
< menor
<= menor ou igual
<> diferente (^= ou !=)
Para listar os nomes, números, cargos e departamentos de todos os funcionários com cargo
CLERK, usamos:
Para listar o nome e o número dos departamentos com número maior que 20, usamos:
DNAME DEPTNO
-------------- -------
SALES 30
OPERATIONS 40
Existem quatro operadores SQL, que operam sobre todos os tipos de dados.
ENAME SAL
---------- -------
ALLEN 1600
WARD 1250
MARTIN 1250
TURNER 1500
ADAMS 1100
MILLER 1300
Usando o operador LIKE é possível selecionar linhas de acordo com modelo fornecido. O
símbolo "%" representa qualquer seqüência de zero ou mais caracteres. O símbolo "_"
(sublinhado) representa qualquer um caracter, mas apenas um, no mínimo e no máximo.
Para listarmos todos os empregados cujos nomes começam com a letra "S", usamos:
ENAME
----------
SMITH
SCOTT
16
Para listar os nomes de todos os empregados que contém exatamente 4 letras, usamos:
ENAME
----------
WARD
KING
FORD
ENAME MGR
---------- -------
KING
Para listar os empregados com salários fora da faixa de 1000 a 2000, usamos:
ENAME SAL
---------- -------
SMITH 800
JONES 2975
BLAKE 2850
CLARK 2450
SCOTT 3000
KING 5000
JAMES 950
FORD 3000
17
8 rows selected.
Para listar os empregados cujos cargos não começam com a letra M, usamos:
ENAME JOB
---------- ---------
SMITH CLERK
ALLEN SALESMAN
WARD SALESMAN
MARTIN SALESMAN
SCOTT ANALYST
KING PRESIDENT
TURNER SALESMAN
ADAMS CLERK
JAMES CLERK
FORD ANALYST
MILLER CLERK
ENAME MGR
---------- -------
SMITH 7902
ALLEN 7698
WARD 7698
JONES 7839
MARTIN 7698
BLAKE 7839
CLARK 7839
SCOTT 7566
TURNER 7698
ADAMS 7788
JAMES 7698
FORD 7566
MILLER 7782
Os operadores AND e OR podem ser utilizados para criar expressões lógicas compostas.
Nos exemplos abaixo as condições são as mesmas, porém os predicados são diferentes.
18
Para listar todos os CLERKs com salário entre 1000 e 2000, usamos:
Para listar os funcionários que são CLERK, ou que recebem entre 1000 e 2000, usamos:
Quando aparecem tanto ANDs quanto ORs em uma expressão lógica, todos os ANDs são
processados antes que os ORs sejam processados.
Uma vez que AND tem precedência sobre OR, a consulta abaixo retorna todos os gerentes
com salário maior do que 1500, e todos os vendedores.
Para selecionar todos os vendedores e gerentes com salário superior a 1500, usamos:
c) AND
d) OR
SQL> SELECT *
2 FROM EMP
3 WHERE JOB = ‘MANAGER' OR (JOB = ‘CLERK' AND DEPTNO = 10)
Neste caso os parênteses são desnecessários, uma vez que o AND processa primeiro.
2.15 Exercícios
20
4 2001 3000
5 3001 9999
14 rows selected.
6 rows selected.
DEPTNO DNAME
------- --------------
10 ACCOUNTING
40 OPERATIONS
20 RESEARCH
30 SALES
21
f) Listar os detalhes dos empregados dos departamentos 10 e 20 em ordem alfabética de
nome.
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
------- ---------- --------- ------- --------- ------- ------- -------
7876 ADAMS CLERK 7788 04-JUN-84 1100 20
7782 CLARK MANAGER 7839 14-MAY-84 2450 10
7902 FORD ANALYST 7566 05-DEC-83 3000 20
7566 JONES MANAGER 7839 31-OCT-83 2975 20
7839 KING PRESIDENT 09-JUL-84 5000 10
7934 MILLER CLERK 7782 21-NOV-83 1300 10
7788 SCOTT ANALYST 7566 05-MAR-84 3000 20
7369 SMITH CLERK 7902 13-JUN-83 800 20
22
SCOTT 36000
KING 60000
TURNER 18000
ADAMS 13200
JAMES 11400
FORD 36000
MILLER 15600
l) Mostrar o nome, o salário anual e comissão, de todos os vendedores com salário mensal
maior do que a comissão. O resultado deve ser ordenado com os maiores salários na frente.
Se dois ou mais empregados tiverem o mesmo salário, deve ser ordenado pelo nome do
funcionário.
ENAME SALARIO_ANUAL COMM
---------- ------------- -------
ALLEN 19200 300
TURNER 18000 0
WARD 15000 500
a) SQL> SELECT *
2 FROM SALGRADE
b) SQL> SELECT *
2 FROM EMP
c) SQL> SELECT ENAME, DEPTNO, SAL
2 FROM EMP
3 WHERE SAL BETWEEN 1000 AND 2000
23
d) SQL> SELECT DEPTNO, DNAME
2 FROM DEPT
3 ORDER BY DNAME
e) SQL> SELECT DISTINCT JOB
2 FROM EMP
f) SQL> SELECT *
2 FROM EMP
3 WHERE DEPTNO IN(10,20)
4 ORDER BY ENAME
g) SQL> SELECT ENAME, JOB
2 FROM EMP
3 WHERE JOB = ‘CLERK'
4 AND DEPTNO = 20
h) SQL> SELECT ENAME
2 FROM EMP
3 WHERE ENAME LIKE '%TH%'
4 OR ENAME LIKE '%LL%'
i) SQL> SELECT ENAME, JOB, SAL
2 FROM EMP
3 WHERE MGR IS NOT NULL
j) SQL> SELECT ENAME, SAL*12+NVL(COMM,0) REMUNERACAO
2 FROM EMP
k) SQL> SELECT ENAME, DEPTNO, HIREDATE
2 FROM EMP
3 WHERE HIREDATE LIKE '%83'
l) SQL> SELECT ENAME, SAL*12 SALARIO_ANUAL, COMM
2 FROM EMP
3 WHERE SAL > COMM
4 AND JOB = 'SALESMAN'
5 ORDER BY SAL DESC, ENAME
m) SQL> SELECT ENAME||' TEM A POSICAO DE '||JOB||
2 ' NO DEPARTAMENTO '||DEPTNO||
3 ' DESDE '||HIREDATE "QUEM, O QUE, QUANDO"
4 FROM EMP
24
Capítulo 3: Variáveis de Substituição
3.1 Objetivos deste capítulo
Descrever as variáveis de substituição e como estas são usadas nas declarações SQL.
Quando são utilizados dois "&" na variável, o SQL*PLUS solicita o valor da variável
apenas uma vez, guardando este valor para uso subseqüente.
Exemplo: &&NUMERO_DO_DEPARTAMENTO
25
Capítulo 4: Funções Numéricas e de Caracteres
4.1 Objetivos deste capítulo
LOWER(DNAME) LOWER('CURSODESQL')
-------------- --------------------
accounting curso de sql
research curso de sql
sales curso de sql
operations curso de sql
ENAME
----------
SMITH
INITCAP(DNAME) INITCAP(LOC)
-------------------- --------------------
Accounting New York
Research Dallas
Sales Chicago
Operations Boston
26
No exemplo abaixo, as três colunas são preenchidas à esquerda até um total de 20
caracteres. A primeira coluna foi preenchida com asteriscos, a segunda com espaços, e a
terceira com pontos. Note que a terceira coluna é numérica.
27
DNAME INSTR(DNAME,'A') INSTR(DNAME,'ES') INSTR(DNAME,'C',1,2)
------------ ---------------- ----------------- --------------------
ACCOUNTING 1 0 3
RESEARCH 5 2 0
SALES 2 4 0
OPERATIONS 5 0 0
No exemplo acima, na segunda coluna foram removidas as letras "A" à esquerda dos nomes
dos departamentos. Na terceira coluna foram removidas tanto a letra "A" quanto a letra "S".
Na quarta coluna foram removidas as letras "A", "S", "O" e "P" à esquerda.
Retorna uma seqüência de caracteres que representa o som das palavras contidas na coluna
ou no literal.
ENAME SOUNDEX(ENAME)
---------- --------------------
FORD F630
28
4.2.11 LENGTH(coluna | literal)
No exemplo abaixo foram trocados os caracteres "C" por "P" nos nomes dos funcionários.
ENAME TRANSLATE(ENAME,'C','P')
---------- -------------------------
CLARK PLARK
KING KING
MILLER MILLER
No exemplo abaixo foram trocados "A" por "I", e "R" por "T", nos cargos.
JOB TRANSLATE(JOB,'AR','IT')
--------- ------------------------------
MANAGER MINIGET
PRESIDENT PTESIDENT
CLERK CLETK
JOB REPLACE(JOB,'SALESMAN','VENDEDOR')
--------- ----------------------------------------
CLERK CLERK
SALESMAN VENDEDOR
SALESMAN VENDEDOR
MANAGER MANAGER
SALESMAN VENDEDOR
MANAGER MANAGER
MANAGER MANAGER
ANALYST ANALYST
PRESIDENT PRESIDENT
SALESMAN VENDEDOR
CLERK CLERK
CLERK CLERK
ANALYST ANALYST
CLERK CLERK
14 rows selected.
ENAME REPLACE(ENAME,'CO','PX')
---------- ------------------------
SMITH SMITH
ALLEN ALLEN
WARD WARD
JONES JONES
MARTIN MARTIN
BLAKE BLAKE
CLARK CLARK
SCOTT SPXTT <--------------
KING KING
TURNER TURNER
ADAMS ADAMS
JAMES JAMES
FORD FORD
MILLER MILLER
14 rows selected.
As funções que operam sobre uma única linha podem ser aninhadas, sendo que neste caso as
funções internas são executadas antes das externas.
DNAME LENGTH(DNAME)LENGTH(DNAME)-LENGTH(TRANSLATE(DNAME,'AS','A'))
---------- ------------------------------------------------------------
30
ACCOUNTING 10 0
RESEARCH 8 1
SALES 5 2
OPERATIONS 10 1
SELECT EXP(4)
FROM DUAL
EXP(4)
----------
54.59815
1 row selected.
SELECT LOG(10,100)
FROM DUAL
LOG(10,100)
-----------
2
1 row selected.
32
SELECT LN(95)
FROM DUAL
LN(95)
----------
4.55387689
Retorna -1 se o valor da coluna ou do literal for negativo, retorna 0 se for igual a zero, ou
retorna 1 se for maior do que zero.
Salários maiores do que a comissão podem ser listados conforme mostrado abaixo:
SELECT SIN(30*3.141592654/180),
COS(60*3.141592654/180),
TAN(45*3.141592654/180)
FROM DUAL
4.4 Exercícios
34
a) Listar o número do departamento, o nome do funcionário, e o salário com aumento de
15% expresso em número inteiro.
DEPTNO ENAME PCTSAL
----------------- ---------- -----------------
20 SMITH 920
30 ALLEN 1840
30 WARD 1438
20 JONES 3421
30 MARTIN 1438
30 BLAKE 3278
10 CLARK 2818
20 SCOTT 3450
10 KING 5750
30 TURNER 1725
20 ADAMS 1265
30 JAMES 1093
20 FORD 3450
10 MILLER 1495
EMPREGADO_E_CARGO
--------------------
SMITH CLERK
ALLEN SALESMAN
WARD SALESMAN
JONES MANAGER
MARTIN SALESMAN
BLAKE MANAGER
CLARK MANAGER
SCOTT ANALYST
KING PRESIDENT
TURNER SALESMAN
ADAMS CLERK
JAMES CLERK
FORD ANALYST
MILLER CLERK
14 rows selected.
c) Listar uma lista contendo todos os empregados com um identificador composto pelas
duas primeiras letras de seus cargos, os dois dígitos do meio de seus números de matrícula,
e o código sonoro de seus nomes.
NOME CODIGO
---------- --------
SMITH CL36S530
ALLEN SA49A450
WARD SA52W630
JONES MA56J520
MARTIN SA65M635
BLAKE MA69B420
CLARK MA78C462
SCOTT AN78S300
KING PR83K520
TURNER SA84T656
ADAMS CL87A352
JAMES CL90J520
35
FORD AN90F630
MILLER CL93M460
d) Faça uma procura não sensitiva a letras maiúsculas ou minúsculas por um cargo
fornecido pelo usuário.
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ---------- --------- ----- --------- ----- ----- ------
7369 SMITH CLERK 7902 13-JUN-83 800 20
7876 ADAMS CLERK 7788 04-JUN-84 1100 20
7900 JAMES CLERK 7698 23-JUL-84 950 30
7934 MILLER CLERK 7782 21-NOV-83 1300 10
f) Encontrar a primeira ocorrência da letra "L" nos nomes dos empregados e substituir pela
letra "X".
ENAME PRIMEIRA_OCORRENCIA_
---------- --------------------
SMITH SMITH
ALLEN AXLEN
WARD WARD
JONES JONES
MARTIN MARTIN
BLAKE BXAKE
CLARK CXARK
SCOTT SCOTT
KING KING
TURNER TURNER
ADAMS ADAMS
JAMES JAMES
FORD FORD
MILLER MIXLER
14 rows selected.
36
4.5 Respostas dos exercícios
a)
SQL> SELECT DEPTNO, ENAME, ROUND (SAL*1.15) PCTSAL
2 FROM EMP
b)
SQL> SELECT RPAD(ENAME,10)||LPAD(JOB,10) EMPREGADO_E_CARGO
2 FROM EMP
c)
SQL> SELECT ENAME NOME,
2 SUBSTR(JOB,1,2)||SUBSTR(EMPNO,2,2)||SOUNDEX(ENAME) CODIGO
3 FROM EMP
d)
SQL> SELECT *
2 FROM EMP
3 WHERE UPPER(JOB) = UPPER ('&JOB')
Enter value for job: clerk
old 3: WHERE UPPER(JOB) = UPPER ('&JOB')
new 3: WHERE UPPER(JOB) = UPPER ('clerk')
e)
SQL> SELECT LPAD(' ',(20-LENGTH(DNAME))/2)||DNAME DEPARTAMENTO
2 FROM DEPT
f)
SQL> SELECT ENAME,
2 TRANSLATE(SUBSTR(ENAME,1,INSTR(ENAME,'L')),'L','X')||
3 SUBSTR(ENAME,INSTR(ENAME,'L')+1) PRIMEIRA_OCORRENCIA_DE_L
4 FROM EMP
37
Capítulo 5: Funções de Data e de Conversão
5.1 Objetivos deste capítulo
Este capítulo mostra as funções do Oracle que manipulam datas e fazem a conversão de tipo
de dados.
5.2.1 SYSDATE
SYSDATE é uma pseudo-coluna que retorna a data e a hora corrente. A tabela SYS.DUAL
é pública, contém apenas uma coluna chamada DUMMY, e uma linha com o valor 'X'. Esta
tabela é útil para retornar um único valor de uma constante, de uma pseudo-coluna, ou de
uma expressão. Abaixo a tabela SYS.DUAL foi utilizada para retornar a data corrente.
SYSDATE
---------
25-OCT-94
5.2.3 MONTHS_BETWEEN(data1,data2)
38
MONTHS_BETWEEN(SYSDATE,HIREDATE) MONTHS_BETWEEN('01-JAN-84','05-NOV-
88'
-------------------------------- --------------------------------------
136.3985293458781 -58.1290322580645
134.3340132168459 -58.1290322580645
126.9791745071685 -58.1290322580645
131.8178841845878 -58.1290322580645
130.6565938620072 -58.1290322580645
124.4630454749104 -58.1290322580645
125.366271281362 -58.1290322580645
127.6565938620072 -58.1290322580645
123.5275616039427 -58.1290322580645
124.6888519265233 -58.1290322580645
124.6888519265233 -58.1290322580645
123.0759487007168 -58.1290322580645
130.6565938620072 -58.1290322580645
131.1404648297491 -58.1290322580645
14 rows selected.
5.2.6 LAST_DAY(data)
5.2.7 ROUND(data)
ROUND(data, 'MONTH')
ROUND(data, 'YEAR')
ROUND(data) retorna a data com a indicação da hora como sendo zero horas (meia noite).
Até o meio dia retorna a mesma data, após o meio dia retorna o dia seguinte. Esta função é
útil quando são comparadas datas com horas diferentes.
ROUND(data, 'YEAR') retorna o primeiro dia do ano da data, se a data estiver no primeiro
semestre, ou retorna o primeiro dia do ano seguinte, se a data estiver no segundo semestre.
5.2.7 TRUNC(data)
TRUNC(data, 'MONTH')
TRUNC(data, 'YEAR')
Formato Significado
40
CC ou SCC Século; S prefixa datas Antes de Cristo com "-"
YYYY ou SYYYY Ano; S prefixa datas Antes de Cristo com "-"
YYY, YY, Y Últimos 3,2,1 dígitos do ano
Y,YYY Ano com vírgula separando os milhares
YEAR ou SYEAR Ano por extenso. S prefixa datas Antes de Cristo com
"-"
BC ou AD Indicador de Antes ou Depois de Cristo
B.C. ou A.D. Idêntico a BC/AD com pontos
Q Quarto do ano (trimestre)
MM Mês
Month Mês por extenso, com 9 caracteres, espaços à direita
MON Nome do mês, com 3 caracteres
WW ou W Semana do ano ou do mês
DDD, DD, D Dia do ano, do mês, ou da semana
DAY Dia por extenso, com 9 caracteres, espaços à direita
DY Nome do dia, abreviado com 3 caracteres
J Dia Juliano (dias desde 31/12/4713 AC)
AM ou PM Indicador de meridiano
A.M. ou P.M. Indicador de meridiano com pontos
HH ou HH12 Hora do dia no intervalo 1 a 12
HH24 Hora do dia no intervalo 0 a 23
MI Minuto
SS Segundo
SSSS Segundos após à meia noite (0-86399)
/., etc... Pontuação reproduzida no resultado
"..." Caracteres entre aspas reproduzido no resultado
Notas:
1 - O prefixo 'fm' (fill mode) antes de MONTH ou DAY suprime os espaços à direita
4 - O sufixo 'SPTH' para números ordinais por extenso ("DDSPTH" para "FOURTH")
5.3.2 TO_CHAR(número|data,['formato'])
TO_CHAR(SYSDATE,'DAYDDTHMONTHYYYY')
-----------------------------------
TUESDAY ,25TH OCTOBER 1994
TO_CHAR(SYSDATE,'FMDAY,DDTHMONTHYYYY')
--------------------------------------
Tuesday, 25th October 1994
A função TO_CHAR pode ser usada para extrair a hora do dia apenas.
TO_CHAR(SYSDATE,'HH:MI:SS')
---------------------------
08:39:51
A função TO_CHAR pode ser usada para converter números em caracteres aplicando a
formatação desejada.
TO_CHAR(SAL,'$9,999')
---------------------
$800
$1,600
$1,250
$2,975
$1,250
$2,850
$2,450
$3,000
$5,000
$1,500
$1,100
$950
$3,000
$1,300
14 rows selected.
5.3.4 TO_NUMBER(cadeia_de_caracteres)
7 rows selected.
5.3.5 TO_DATE('cadeia_de_caracteres','formato')
5.4.1 DECODE(coluna|expressão,pes1,res1,[pes2,res2,...],default)
Funciona como uma estrutura CASO, substituindo as pesquisas pelos resultados. A coluna
ou expressão é comparada com os argumentos de pesquisa, e se houver igualdade o
resultado correspondente é retornado. Se não houver igualdade, o valor default é retornado.
Argumentos:
43
Notas:
GRADE BONUS
----- -----
1 15%
2 10%
3 8%
4 5%
5 5%
O exemplo abaixo causa um erro porque ename (caracter) tem tipo diferente do terceiro
argumento sal (numérico).
no rows selected
14 rows selected.
GREATEST(1000,2000) GREATEST(SAL,COMM)
------------------- ------------------
2000 1600
2000 1250
2000 1400
2000
2000 1500
2000
6 rows selected.
45
5.4.4 LEAST(coluna|valor, coluna|valor,...)
LEAST(1000,2000) LEAST(SAL,COMM)
----------------- -----------------
1000 300
1000 500
1000 1250
1000
1000 0
1000
5.4.5 VSIZE(coluna|valor)
Retorna o número de bytes utilizado internamente pelo Oracle para representar o valor.
ENAME NVL(TO_CHAR(MGR),'NAOGERENCIAVEL')
---------- ----------------------------------
KING NAO GERENCIAVEL
SYSDATE
TO_CHAR(NEXT_DAY(ADD_MONTHS(SYSDATE,2),'FRIDAY'),'DAYDDMONTHYYYY')
--------- --------------------------------------------------------
25-OCT-94 Friday 30 December 1994
5.5 Exercícios
a) Mostrar o nome e a data de admissão dos empregados do departamento 20. Utilize o aliás
DATA_DE_ADMISSAO para o nome da coluna.
46
ENAME DATA_DE_ADMISSAO
---------- ---------------------------
SMITH June, Thirteenth 1983
JONES October, Thirty-First 1983
SCOTT March, Fifth 1984
ADAMS June, Fourth 1984
FORD December, Fifth 1983
c) Imprimir uma lista de empregados mostrando o salário, se este for superior a 1500. Se o
salário for inferior a 1500 deve ser exibido ABAIXO DE 1500, e se for igual a 1500 deve
ser exibido NO LIMITE.
ENAME SALARIO
---------- --------------
ADAMS ABAIXO DE 1500
ALLEN 1600
BLAKE 2850
CLARK 2450
FORD 3000
JAMES ABAIXO DE 1500
JONES 2975
KING 5000
MARTIN ABAIXO DE 1500
MILLER ABAIXO DE 1500
SCOTT 3000
SMITH ABAIXO DE 1500
TURNER NO LIMITE
WARD ABAIXO DE 1500
d) Escreva uma consulta que retorne o dia da semana para qualquer data entrada no formato
DD.MM.YY.
DIA
--------
SATURDAY
47
e) Escreva uma consulta que retorne o tempo que o empregado está trabalhando para a
empresa.
ENAME TEMPO DE SERVICO
---------- ----------------
KING 10 ANOS 3 MESES
f) Dada uma cadeia de caracteres no formato 'nn/nn', verifique se os dois primeiros e os dois
últimos caracteres são numéricos, e se o caracter do meio é uma '/'. Imprima a expressão
'SIM' se for válido, e 'NAO' se não for válido. Experimente as expressões '12/34','01/1a','e
'99\88'.
VALOR VALIDO?
----- -------
12/34 SIM
g) Empregados admitidos até o dia 15, inclusive, são pagos na última sexta-feira do mês.
Empregados admitidos após o dia 15 são pagos na última sexta-feira do mês seguinte.
Imprima uma relação contendo os nome dos empregados, as datas de admissão, e a primeira
data de pagamento.
14 rows selected.
48
5.6 Respostas dos exercícios
ou
49
Capitulo 6: Funções de Grupo
6.1 Objetivos deste capítulo
Este capítulo explica como informações sumarizadas (média, máximo, mínimo,...) podem
ser obtidas para grupo de linhas.
As funções vistas anteriormente operavam sobre cada linha, enquanto que as funções
mostradas neste capítulo operam sobre um grupo de linhas.
Podem ser fornecidas expressões dos tipos caracter, número ou data quando 'exp' estiver
indicado. Quando 'n' estiver indicado, somente valores numéricos são aceitos.
AVG(SAL)
-----------------
2073.214285714286
Note que toda a tabela EMP foi tratada como um único grupo.
50
Uma função de grupo pode ser aplicada sobre um subconjunto das linhas usando a cláusula
WHERE.
MIN(SAL)
-----------------
800
COUNT(*)
-----------------
5
A cláusula GROUP BY é utilizada para dividir as linhas das tabelas em grupos. Funções de
grupo podem ser utilizadas para retornar informações sumarizadas para cada grupo.
JOB AVG(SAL)
--------- -----------------
ANALYST 3000
CLERK 1037.5
MANAGER 2758.333333333333
PRESIDENT 5000
SALESMAN 1400
A cláusula WHERE pode ser utilizada para excluir linhas, antes que estas sejam grupadas.
JOB AVG(SAL)
--------- -----------------
ANALYST 3000
51
CLERK 1037.5
PRESIDENT 5000
SALESMAN 1400
6.6 Grupos dentro de grupos
Os grupos podem conter subgrupos, fornecendo resultados para grupos dentro de grupos.
9 rows selected.
A declaração abaixo mostra o salário máximo para cada tipo de cargo. O resultado não é
muito significativo pois não mostra o cargo, mas mostra que não há obrigação de listar as
colunas pelas quais o grupamento é realizado.
MAX(SAL)
-----------------
3000
1300
2975
5000
1600
Também não há necessidade de colocar as colunas a serem grupadas antes das outras:
MAX(SAL) JOB
----------------- ---------
3000 ANALYST
1300 CLERK
2975 MANAGER
5000 PRESIDENT
52
1600 SALESMAN
Lembre-se que quando funções de grupo são incluídas na cláusula SELECT, todas as
colunas que não contém função de grupo devem aparecer na cláusula GROUP BY.
O exemplo abaixo mostra o erro causado pela utilização da função de grupo MIN(SAL),
sem haver a cláusula GROUP BY em DEPTNO:
DEPTNO MIN(SAL)
----------------- -----------------
10 1300
20 800
30 950
Para mostrar o salário médio dos departamento que possuem mais de três funcionários:
JOB MAX(SAL)
--------- -----------------
53
ANALYST 3000
PRESIDENT 5000
Embora a cláusula HAVING possa ser escrita antes da cláusula GROUP BY, a leitura torna-
se mais fácil quando a cláusula HAVING aparece após a cláusula GROUP BY. Os grupos
são formados e as funções de grupo são calculadas antes da cláusula HAVING ser aplicada.
A cláusula WHERE não pode ser usada para restringir os grupos a serem retornados. A
cláusula WHERE na declaração abaixa é ilegal:
DEPTNO AVG(SAL)
----------------- -----------------
10 2916.666666666667
20 2175
JOB AVG(SAL)
--------- -----------------
ANALYST 3000
CLERK 1037.5
PRESIDENT 5000
54
SELECT lista_de_colunas
FROM lista_de_tabelas
WHERE condições_de_linha
GROUP BY lista_de_colunas
HAVING condições_de_grupo
ORDER BY lista_de_colunas
São avaliados:
6.10 Exercícios
e) Encontrar o salário médio e a remuneração total média de cada tipo de cargo, lembrando-
se que os vendedores recebem comissão.
JOB SALARIO_MEDIO REMUNERACAO_MEDIA
--------- ----------------- -----------------
ANALYST 3000 36000
CLERK 1037.5 12450
MANAGER 2758.333333333333 33100
PRESIDENT 5000 60000
SALESMAN 1400 17237
56
6.11 Respostas dos exercícios
a)
SQL> SELECT MIN(SAL) MENOR
2 FROM EMP
b)
SQL> SELECT MAX(SAL), MIN(SAL), AVG(SAL)
2 FROM EMP
c)
SQL> SELECT JOB CARGO, MAX(SAL) MAIOR, MIN(SAL) MENOR
2 FROM EMP
3 GROUP BY JOB
d)
SQL> SELECT COUNT(*) GERENTES
2 FROM EMP
3 WHERE JOB = 'MANAGER'
e)
SQL> SELECT JOB, AVG(SAL) SALARIO_MEDIO,
2 AVG(SAL*12+NVL(COMM,0)) REMUNERACAO_MEDIA
3 FROM EMP
4 GROUP BY JOB
f)
SQL> SELECT MAX(SAL)-MIN(SAL) DIFERENCA
2 FROM EMP
g)
SQL> SELECT DEPTNO, COUNT(*)
2 FROM EMP
3 GROUP BY DEPTNO
4 HAVING COUNT(*) > 3
h)
SQL> SELECT EMPNO
2 FROM EMP
3 GROUP BY EMPNO
4 HAVING COUNT(*) > 1
i)
SQL> SELECT MGR, MIN(SAL)
2 FROM EMP
3 GROUP BY MGR
4 HAVING MIN(SAL) >= 1000
5 ORDER BY MIN(SAL)
57
Capítulo 7: Extraindo dados de mais de uma tabela
7.1 Objetivos deste capítulo
Mostrar como obter informações de mais de uma tabela através das junções.
Linhas de uma tabela podem ser juntadas com linhas de outra tabela, de acordo com valores
comuns existentes em colunas correspondentes. Os dois principais tipos de junção são:
As linhas da tabela EMP foram combinadas com as linhas da tabela DEPT para obtenção
dos números dos departamentos.
O nome da tabela é colocado antes do nome da coluna, para diferenciar colunas com mesmo
nome em tabelas diferentes.
Todas as colunas podem ser prefixadas com o nome da tabela, porém este procedimento só
é obrigatório quando existe ambigüidade.
14 rows selected.
Aliás para nomes de tabelas podem ser usado de forma semelhante à que foi usada para aliás
de nomes de colunas. O nome do aliás é escrito após o nome da tabela. No exemplo abaixo
foi utilizado o aliás 'E' para a tabela EMP, e o aliás 'D' para a tabela DEPT.
14 rows selected.
7.3 Produto
59
O relacionamento entre as tabelas EMP e SALGRADE formam uma junção não
equivalente, uma vez que não existe nenhuma coluna comum às duas tabelas. No exemplo, a
função BETWEEN ... AND ... faz o relacionamento entre as duas tabelas.
7.7 Exercícios
a) Mostrar o nome dos empregados e dos departamentos onde trabalham, ordenados pelo
nome do departamento.
ENAME DNAME
---------- --------------
CLARK ACCOUNTING
KING ACCOUNTING
MILLER ACCOUNTING
SMITH RESEARCH
ADAMS RESEARCH
FORD RESEARCH
SCOTT RESEARCH
60
JONES RESEARCH
ALLEN SALES
BLAKE SALES
MARTIN SALES
JAMES SALES
TURNER SALES
WARD SALES
14 rows selected.
14 rows selected.
c) Listar o nome, o local de trabalho e o departamento dos empregados com salário superior
a 1500.
ENAME LOCAL DNAME
---------- ------------- --------------
CLARK NEW YORK ACCOUNTING
KING NEW YORK ACCOUNTING
JONES DALLAS RESEARCH
SCOTT DALLAS RESEARCH
FORD DALLAS RESEARCH
ALLEN CHICAGO SALES
BLAKE CHICAGO SALES
7 rows selected.
14 rows selected.
10 rows selected.
h) Listar os seguintes detalhes para os empregados que ganham 36.000 por ano ou que são
Clerks.
ENAME JOB SALARIO_ANUAL DEPTNO DNAME GRADE
---------- --------- ------------- ------- -------------- -------
MILLER CLERK 15600 10 ACCOUNTING 2
SMITH CLERK 9600 20 RESEARCH 1
ADAMS CLERK 13200 20 RESEARCH 1
JAMES CLERK 11400 30 SALES 1
62
7.8 Solução dos exercícios
a)
SQL> SELECT ENAME, DNAME
2 FROM EMP, DEPT
3 WHERE EMP.DEPTNO = DEPT.DEPTNO
b)
SQL> SELECT ENAME, E.DEPTNO, DNAME
2 FROM EMP E, DEPT D
3 WHERE E.DEPTNO = D.DEPTNO
c)
SQL> SELECT ENAME, LOC LOCAL, DNAME
2 FROM EMP, DEPT
3 WHERE EMP.DEPTNO = DEPT.DEPTNO
4 AND SAL > 1500
d)
SQL> SELECT ENAME, JOB, SAL, GRADE
2 FROM EMP, SALGRADE
3 WHERE SAL BETWEEN LOSAL AND HISAL
e)
SQL> SELECT ENAME, JOB, SAL, GRADE
2 FROM EMP, SALGRADE
3 WHERE SAL BETWEEN LOSAL AND HISAL AND GRADE = 3
f)
SQL> SELECT ENAME, SAL, LOC LOCAL
2 FROM EMP, DEPT
3 WHERE EMP.DEPTNO = DEPT.DEPTNO
4 AND LOC='DALLAS'
g)
SQL> SELECT ENAME, JOB, SAL, GRADE, DNAME
2 FROM EMP, SALGRADE, DEPT
3 WHERE EMP.DEPTNO = DEPT.DEPTNO
4 AND SAL BETWEEN LOSAL AND HISAL
5 AND JOB != 'CLERK'
6 ORDER BY SAL DESC
h)
SQL> SELECT ENAME, JOB, SAL*12+NVL(COMM,0) SALARIO_ANUAL,
2 D.DEPTNO, DNAME, GRADE
3 FROM EMP E, SALGRADE, DEPT D
4 WHERE E.DEPTNO = D.DEPTNO AND SAL BETWEEN LOSAL AND HISAL
5 AND (SAL*12+NVL(COMM,0)=3600
6 OR JOB = 'CLERK')
7 ORDER BY E.JOB
63
Capítulo 8: Outros métodos de junção
8.1 Objetivos deste capítulo
Se uma linha não satisfaz a condição de junção, então a linha não é mostrada no resultado
da consulta. De fato, quando fazemos a junção equivalente (equi-join) das tabelas EMP e
DEPT, o departamento 40 não aparece, uma vez que não há nenhum empregado lotado
neste departamento.
As linhas excluídas podem ser retornadas se um operador de junção externa (outer join) for
utilizado na condição de junção. O operador é um sinal de '+' colocado entre parênteses, que
deve ser ficar ao lado da tabela onde as informações que não seriam incluídas devem
aparecer.
No exemplo o operador está colocado ao lado da tabela DEPT, forçando listar os dados dos
departamentos mesmo que não haja correspondência em EMP.
7 rows selected.
O operador de junção externa (outer join) só pode aparecer em um dos lados da expressão,
causando uma junção externa esquerda (left outer join), ou uma junção externa direita (right
outer join). A junção externa completa (outer join) não é implementada diretamente pelo
Oracle.
É possível utilizar rótulos nas tabelas (aliases) para fazer a junção de uma tabela com ela
mesmo, como se fossem duas tabelas distintas.
No exemplo abaixo são mostrados todos os funcionários que recebem menos que seus
gerentes.
64
4 WHERE E.MGR = G.EMPNO AND E.SAL < G.SAL
EMP_NOME EMP_SAL GER_NOME GER_SAL
---------- ------- ---------- -------
ALLEN 1600 BLAKE 2850
WARD 1250 BLAKE 2850
JAMES 950 BLAKE 2850
TURNER 1500 BLAKE 2850
MARTIN 1250 BLAKE 2850
MILLER 1300 CLARK 2450
ADAMS 1100 SCOTT 3000
JONES 2975 KING 5000
CLARK 2450 KING 5000
BLAKE 2850 KING 5000
SMITH 800 FORD 3000
11 rows selected.
Note que EMP aparece na cláusula FROM duas vezes, uma com o aliás 'E', para os
empregados, e outra com o aliás 'G', para os gerentes.
Os operadores UNION, INTERSECT e MINUS são úteis para construir consultas que se
referem a tabelas diferentes. Estes operadores combinam os resultados de dois ou mais
SELECTs em um único resultado.
8.4.1 União
O operador UNION retorna todas as linhas distintas das consultas unidas por este operador.
No exemplo são listados todos os cargos dos departamentos 10 e 30 sem repetição.
JOB
---------
CLERK
MANAGER
PRESIDENT
SALESMAN
8.4.2 Interseção
O operador INTERSECT retorna apenas as linhas comuns às duas consultas. Para listar os
cargos existentes tanto no departamento 10 quanto no departamento 30:
JOB
---------
CLERK
MANAGER
8.4.3 Subtração
O operador MINUS retorna as linhas presentes na primeira consulta mas não presentes na
segunda consulta. Para listar os cargos existentes no departamento 10 mas não existentes no
departamento 30:
JOB
---------
PRESIDENT
Como as colunas das tabelas podem ter nomes diferentes quando usamos UNION,
INTERSECT e MINUS, o nome da coluna não pode ser usado na cláusula ORDER BY
quando estes operadores são utilizados. Ao invés do nome deve ser usado o número da
coluna, como mostrado abaixo:
• Linhas duplicadas são automaticamente eliminadas (DISTINCT não pode ser usado).
66
• Os nomes das colunas da primeira consulta são os que aparecem no resultado.
• Múltiplas junções verticais podem ser utilizadas, com parênteses, se necessário, para
alterar a ordem de execução.
8.5 Exercícios
13 rows selected.
c) Alterar a solução do exercício b para mostrar KING que não possui gerente.
14 rows selected.
9 rows selected.
68
8.6 Respostas dos exercícios
a)
SQL> SELECT D.DEPTNO, DNAME
2 FROM EMP E, DEPT D
3 WHERE E.DEPTNO (+) = D.DEPTNO
4 AND E.EMPNO IS NULL
b)
SQL> SELECT EMPS.EMPNO, EMPS.ENAME,
2 GERS.EMPNO GER_NUM, GERS.ENAME GER_NOME
3 FROM EMP EMPS, EMP GERS
4 WHERE EMPS.MGR = GERS.EMPNO
c)
SQL> SELECT EMPS.EMPNO, EMPS.ENAME,
2 GERS.EMPNO GER_NUM, GERS.ENAME GER_NOME
3 FROM EMP EMPS, EMP GERS
4 WHERE EMPS.MGR = GERS.EMPNO (+)
d)
SQL> SELECT JOB
2 FROM EMP
3 WHERE HIREDATE BETWEEN '01-JAN-83' AND '30-JUN-83'
4 INTERSECT
5 SELECT JOB
6 FROM EMP
7 WHERE HIREDATE BETWEEN '01-JAN-84' AND '30-JUN-84'
e)
SQL> SELECT E.ENAME EMPREGADO, E.HIREDATE,
2 M.ENAME GERENTE, M.HIREDATE
3 FROM EMP E, EMP M
4 WHERE E.MGR = M.EMPNO AND E.HIREDATE < M.HIREDATE
f)
SQL> SELECT DEPTNO, DNAME
2 FROM DEPT
3 MINUS
4 SELECT EMP.DEPTNO, DNAME
5 FROM EMP, DEPT
6 WHERE EMP.DEPTNO = DEPT.DEPTNO
69
Capítulo 9: Consultas aninhadas
9.1 Objetivos deste capítulo
Uma consulta aninhada, ou subconsulta, é aquela que está contida dentro de uma outra
consulta, e que retorna valores intermediários.
Por exemplo:
Consultas aninhadas são muito úteis quando é necessário selecionar linhas de uma tabela
sob uma condição que depende dos dados da própria tabela.
Para encontrar o empregado com o menor salário da empresa são necessárias duas etapas:
MIN(SAL)
--------
800
Antes da consulta interna que retorna apenas um valor, podem ser usados os operadores =,
<, >, <=, >=, <>.
70
9.4 Como as consultas aninhadas são executadas
Uma declaração SELECT pode ser considerada como um bloco de consulta. No exemplo
anterior, haviam dois blocos de consulta: um principal e outro interno. O bloco interno é
executado primeiro, produzindo o resultado: 800. Em seguida o bloco principal é executado,
utilizando o valor retornado pelo bloco interno.
ENAME JOB
---------- ---------
JONES MANAGER
BLAKE MANAGER
CLARK MANAGER
O cargo de BLAKE é obtido pela consulta interna e utilizado pela consulta principal.
Note que a consulta interna tem uma cláusula GROUP BY, e portanto retorna mais de um
valor. Neste caso o operador IN deve ser usado para tratar a lista de valores.
O resultado da consulta interna não indica o departamento, não havendo assim qualquer
correspondência entre o salário retornado e o departamento do funcionário.
71
Nesta nova consulta, é retornado um par de colunas que é comparado com um par de
colunas da consulta principal.
Note que as colunas à esquerda da condição de procura estão entre parênteses e são
separadas por vírgulas.
As colunas listadas na consulta interna devem estar na mesma ordem das colunas à esquerda
da condição de procura.
As colunas retornadas pela consulta interna devem ser em mesmo número e do mesmo tipo
de dados das colunas à esquerda da condição de procura.
Se uma consulta interna retornar mais de uma linha e a condição de procura utilizar um
operador de uma linha apenas gera o erro mostrado abaixo:
no rows selected
no rows selected
Os operadores ANY e ALL podem ser utilizados quando as consultas internas retornam
mais de uma valor. Estes operadores são usados nas cláusulas WHERE e HAVING em
conjunção com os operadores lógicos (=, <, >, >=, <=, <>).
ANY compara o valor com cada valor retornado pela consulta interna.
Para mostrar os empregados que recebem mais do que o menor salário do departamento 30:
12 rows selected.
Quando usamos ANY geralmente usamos DISTINCT para reduzir a lista de valores a serem
comparados.
ALL compara o valor com todos os valores retornados pela consulta interna.
A consulta abaixo encontra os empregados que ganham mais do que todos os empregados
do departamento 30.
DEPTNO AVG(SAL)
------- --------
10 2916.67
20 2175
• é executada para cada uma das linhas consideradas candidatas na consulta principal.
Estas propriedades causam a consulta interna ser processada de maneira diferente de uma
consulta aninhada comum.
Uma consulta interna correlacionada é identificada pela presença de uma coluna da consulta
principal na consulta interna.
Para encontrar os empregados que recebem mais do que o salário médio de seus
departamentos:
• Consulta principal
• Consulta Interna
6 rows selected.
75
SQL> SELECT EMPNO, ENAME, DEPTNO
2 FROM EMP
3 WHERE NOT EXISTS
4 (SELECT DEPTNO FROM DEPT WHERE DEPT.DEPTNO = EMP.DEPTNO)
no rows selected
DEPTNO DNAME
------- --------------
40 OPERATIONS
Note que neste exemplo a consulta interna não precisa retornar nada, porém a cláusula
SELECT precisa de uma coluna, mesmo que seja um literal.
9.12 Exercícios
a) Listar os empregados com o maior salário por cargo, em ordem descendente de salário.
ENAME JOB SAL
---------- --------- -------
KING PRESIDENT 5000
SCOTT ANALYST 3000
FORD ANALYST 3000
JONES MANAGER 2975
ALLEN SALESMAN 1600
MILLER CLERK 1300
b) Listar os empregados com os menores salário por cargo, em ordem ascendente de salário.
ENAME JOB SAL
---------- --------- -------
SMITH CLERK 800
WARD SALESMAN 1250
MARTIN SALESMAN 1250
CLARK MANAGER 2450
SCOTT ANALYST 3000
FORD ANALYST 3000
KING PRESIDENT 5000
7 rows selected.
76
d) Listar o nome, o salário e o número do departamento dos funcionários que recebem
acima da média de seus departamentos. Ordenar pelo número do departamento.
ENAME SALARIO DEPTNO
---------- ------- -------
KING 5000 10
JONES 2975 20
SCOTT 3000 20
FORD 3000 20
ALLEN 1600 30
BLAKE 2850 30
i) Modificar o exercício d para mostrar o salário médio do departamento junto com as outras
informações.
NOME SALARIO DEPARTAMENTO MEDIA_DEPT
---------- ----------- ------------ -----------
ALLEN 1,600.00 30 1,566.67
BLAKE 2,850.00 30
JONES 2,975.00 20 2,175.00
FORD 3,000.00 20
SCOTT 3,000.00 20
KING 5,000.00 10 2,916.67
6 rows selected.
j) Escreva uma consulta que mostre um '*' junto do funcionário contratado mais
recentemente
ENAME HIREDATE MAIOR_DATA
---------- --------- ----------
77
ADAMS 04-JUN-84
ALLEN 15-AUG-83
BLAKE 11-JUN-84
CLARK 14-MAY-84
FORD 05-DEC-83
JAMES 23-JUL-84 *
JONES 31-OCT-83
KING 09-JUL-84
MARTIN 05-DEC-83
MILLER 21-NOV-83
SCOTT 05-MAR-84
SMITH 13-JUN-83
TURNER 04-JUN-84
WARD 26-MAR-84
14 rows selected.
78
9.13 Resposta dos exercícios
a)
SQL> SELECT ENAME, JOB, SAL
2 FROM EMP
3 WHERE (SAL,JOB) IN
4 (SELECT MAX(SAL), JOB FROM EMP GROUP BY JOB)
5 ORDER BY SAL DESC
b)
SQL> SELECT ENAME, JOB, SAL
2 FROM EMP
3 WHERE (SAL,JOB) IN
4 (SELECT MIN(SAL), JOB FROM EMP GROUP BY JOB)
5 ORDER BY SAL
c)
SQL> SELECT DEPTNO, ENAME, HIREDATE
2 FROM EMP
3 WHERE (HIREDATE,DEPTNO) IN
4 (SELECT MAX(HIREDATE), DEPTNO FROM EMP GROUP BY DEPTNO)
5 ORDER BY HIREDATE
d)
SQL> SELECT ENAME, SAL SALARIO, DEPTNO
2 FROM EMP E
3 WHERE SAL >
4 (SELECT AVG(SAL) FROM EMP WHERE DEPTNO = E.DEPTNO)
5 ORDER BY DEPTNO
e)
SQL> SELECT DEPTNO, DNAME
2 FROM DEPT D
3 WHERE NOT EXISTS
4 (SELECT 'qualquer coisa' FROM EMP WHERE DEPTNO = D.DEPTNO)
f)
SQL> DEFINE REM = SAL*12+NVL(COMM,0)
SQL> SELECT DEPTNO, SUM(&REM) MAIOR_DESPESA
2 FROM EMP
3 GROUP BY DEPTNO
4 HAVING SUM(&REM) =
5 (SELECT MAX(SUM(&REM)) FROM EMP GROUP BY DEPTNO)
old 1: SELECT DEPTNO, SUM(&REM) MAIOR_DESPESA
new 1: SELECT DEPTNO, SUM(SAL*12+NVL(COMM,0)) MAIOR_DESPESA
old 4: HAVING SUM(&REM) =
new 4: HAVING SUM(SAL*12+NVL(COMM,0)) =
old 5: (SELECT MAX(SUM(&REM)) FROM EMP GROUP BY DEPTNO)
new 5: (SELECT MAX(SUM(SAL*12+NVL(COMM,0))) FROM EMP GROUP BY DEPTNO)
g)
SQL> SELECT ENAME, SAL
2 FROM EMP E
3 WHERE 3 > (SELECT COUNT(*) FROM EMP WHERE E.SAL < SAL)
h)
SQL> COLUMN ANO FORMAT A4
SQL> COLUMN NUMBER_OF_EMPS FORMAT 9 HEADING 'NUMERO DE EMPREGADOS'
79
SQL> SELECT TO_CHAR(HIREDATE,'YYYY') ANO,
2 COUNT(EMPNO) NUMBER_OF_EMPS
3 FROM EMP
4 GROUP BY TO_CHAR(HIREDATE,'YYYY')
5 HAVING COUNT(EMPNO) =
6 (SELECT MAX(COUNT(EMPNO))
7 FROM EMP
8 GROUP BY TO_CHAR(HIREDATE,'YYYY'))
i)
SQL> COLUMN SALARIO FORMAT 999,999.99
SQL> COLUMN MEDIA_DEPT LIKE SALARIO
SQL> BREAK ON DEPTNO ON MEDIA_DEPT
SQL> SELECT E.ENAME NOME, E.SAL SALARIO,
2 E.DEPTNO DEPARTAMENTO, AVG(A.SAL) MEDIA_DEPT
3 FROM EMP A, EMP E
4 WHERE E.DEPTNO = A.DEPTNO
5 AND E.SAL >
6 (SELECT AVG(SAL) FROM EMP WHERE DEPTNO = E.DEPTNO)
7 GROUP BY E.ENAME, E.SAL, E.DEPTNO
8 ORDER BY AVG(A.SAL)
j)
SQL> SELECT ENAME, HIREDATE, '*' MAIOR_DATA
2 FROM EMP
3 WHERE HIREDATE = (SELECT MAX(HIREDATE) FROM EMP)
4 UNION
5 SELECT ENAME, HIREDATE, ' '
6 FROM EMP
7 WHERE HIREDATE < (SELECT MAX(HIREDATE) FROM EMP)
80
Capítulo 10: Geração de relatórios
10.1 Objetivos deste capítulo
10.3 COLUMN
Notas:
81
• Uma vez emitido, o comando permanece válido até o fim da sessão, se não for
eliminado.
FORMATO SIGNIFICADO
An alfanumérico, largura n.
9 posição numérica, como 999999.
0 coloca zeros à esquerda, como 099999.
$ cifrão flutuante, como $999999.
. ponto decimal, como 999999.99.
, vírgula, como 999,999.
MI sinal de menos à direita, como 999999MI.
PR número negativo entre parênteses, como 999999PR.
EEEE notação científica, como 99.9999EEEE.
V multiplicar por 10**n, como 9999V99.
B valores zero em branco, como B9999.99.
83
*** CONFIDENCIAL ***
10.6 Exemplo de remoção da formatação
14 rows selected.
84
Capítulo 11: Geração de Relatórios - Parte 2
11.1 Objetivos deste capítulo
Os comandos TTITLE e BTITLE podem incluir diversas cláusulas, como mostrado abaixo:
Cláusula Descrição
COL n Posicionar a impressão na coluna 'n' na linha corrente. Volta atrás
se a coluna tiver sido passada.
SKIP n Saltar 'n' linhas. Se 'n' for omitido salta 1 linha. Se n=0 volta para
o começo da linha corrente.
LEFT Alinha à esquerda, no centro, ou à direita da linha corrente. Os
CENTER itens de dados que seguem esta cláusula, até o fim do comando
RIGHT ou até a próxima ocorrência de uma destas cláusulas, são
alinhados como um grupo. As cláusulas LEFT e CENTER se
baseiam no comando SET LINESIZE para calcular a posição dos
itens de dados.
TAB n Avança ou recua a posição de impressão 'n' caracteres. O valor de
'n' deve ser negativo para haver o recuo.
FORMAT Define o formato dos itens de dados que seguem a cláusula, até o
fim do comando ou até a próxima ocorrência desta cláusula. A
especificação do formato para os títulos é semelhante a
especificação do formato para as colunas. Somente uma
especificação de formato está ativa a cada instante. Se o tipo de
dado for conflitante com o formato, o formato não tem efeito
para este item. Se não houver nenhuma cláusula FORMAT ativa,
os valores numéricos são impressos de acordo com o comando
SET NUMFORMAT, ou na ausência deste com o formato
padrão. Valores de data são impressos no formato padrão.
Variável Descrição
SQL.PNO Número da pagina corrente.
SQL.LNO Número da linha corrente.
SQL.USER Nome do usuário.
SQL.SQLCODE Código do erro mais recente.
O exemplo a seguir mostra algumas das opções disponíveis para TTITLE e BTITLE:
85
> CENTER '----------------'
FIM DO RELATORIO
----------------
SQL> TTITLE LEFT 'Data:' HOJE RIGHT FORMAT 999 'Pagina:' SQL.PNO SKIP -
> LEFT 'Usuario: ' SQL.USER SKIP -
> CENTER 'Um relatorio com a data reformatada no titulo' SKIP 2
A cláusula COLUMN SYSDATE NEW_VALUE HOJE NOPRINT faz com que sempre
que a coluna com nome SYSDATE seja selecionada, seu valor passe para a variável HOJE.
A cláusula NOPRINT impede a impressão da variável SYSDATE como um relatório
separado.
O comando SELECT SYSDATE FROM SYS.DUAL faz com que SYSDATE seja
selecionada a partir da tabela SYS.DUAL, que é uma tabela que contém apenas uma linha, e
vai retornar, portanto, apenas um valor.
86
O comando TTITLE LEFT 'Data: ' HOJE faz referência a variável HOJE, definida e com
valor atribuído pela cláusula NEW_VALUE. Desta forma, SYSDATE é impressa no
cabeçalho através da variável HOJE.
No exemplo abaixo, a variável MAIOR_SALARIO_MEDIO é utilizada para passar um
valor de uma consulta para a outra.
MAIOR_SALARIO_MEDIO
-------------------
5000
JOB
---------
PRESIDENT
O comando BREAK pode ser utilizado para quebrar os relatórios em sessões. Quando se faz
uma quebra por uma coluna, os valores duplicados da coluna são omitidos. Como a quebra
ocorre toda vez que o valor da coluna muda, o resultado deve ser ordenado pelas colunas
com quebra especificada. Somente existe um comando BREAK ativo de cada vez, portanto
todas as quebras devem ser especificadas no mesmo comando.
Exemplos:
O comando COMPUTE realiza cálculos baseados nas quebras estabelecidas pelo comando
BREAK.
88
MAX[IMUM] valor máximo número ou caracter
MIN[IMUM] valor mínimo número ou caracter
NUM[BER] número de linhas qualquer
STD desvio padrão número
SUM soma os valores não nulos número
VAR[IANCE] calcula a variância número
Pode haver vários comandos COMPUTE ativos ao mesmo tempo, mas geralmente é mais
fácil especificar tudo em um único comando, como, por exemplo:
SQL> COMPUTE
no computes currently defined
----------- -----------
avg 2,073.21 550.00
sum 29,025.00 2,200.00
14 rows selected.
Suponha que se deseje produzir um relatório sumarizando os salários por cargo e por
departamento, como mostrado abaixo:
Confidencial
90
A tabela EMP tem todas as informações necessárias para produzir o relatório. Abaixo estão
descritas as etapas a serem seguidas para a obtenção do relatório:
14 rows selected.
14 rows selected.
91
c) Sumarizar os campos de acordo com o grupo do cargo e o departamento.
92
--------------- --------------- --------------- ---------------
sum 8,750.00 10,875.00 9,400.00 29,025.00
Confidencial
d) Adicionar os comandos
SET
COLUMN
TTILE
BTITLE
BREAK
COMPUTE
...
SELECT ...
/
TTITLE OFF
BTITLE OFF
CLEAR BREAKS
CLEAR COMPUTES
CLEAR COLUMNS
...
e) Salvar o arquivos
93
11.8 Exercícios
CONFIDENCIAL
94
b) Produza o relatório abaixo. O número do departamento deve ser solicitado em tempo de
execução.
CONFIDENCIAL
95
11.9 Respostas dos exercícios
a)
SQL> SET ECHO OFF
SQL> SET PAGESIZE 37
SQL> SET FEEDBACK OFF
SQL> SET LINESIZE 78
SQL> TTITLE 'R E L A T O R I O D O S E M P R E G A D O S'
SQL> BTITLE 'CONFIDENCIAL'
SQL> DEFINE COMM = 'NVL(COMM,0)'
SQL> COL A FORMAT A12 HEADING 'DEPARTAMENTO' TEMP
SQL> COL B FORMAT A9 HEADING 'CARGO' TEMP
SQL> COL C FORMAT 9999 HEADING 'EMP.|NUM.' TEMP
SQL> COL D FORMAT A8 HEADING 'NOME' TEMP
SQL> COL E FORMAT A5 HEADING 'DATA|ADM.' TEMP
SQL> COL F FORMAT B99,999.99 HEADING 'SALARIO|MENSAL' TEMP
SQL> COL G FORMAT 9,990.99 HEADING 'COM.|ANUAL' TEMP
SQL> COL H FORMAT 999,999.99 HEADING 'TOTAL' TEMP
SQL> BREAK ON REPORT ON A SKIP 2 ON B
SQL> COMPUTE SUM OF F G H ON REPORT A
SQL> SELECT DNAME A, JOB B, EMPNO C, ENAME D,
2 TO_CHAR(HIREDATE,'MM/YY') E, SAL F, &COMM G, SAL*12+&COMM H
3 FROM EMP E, DEPT D
4 WHERE E.DEPTNO = D.DEPTNO
5 ORDER BY DNAME, JOB
old 2: TO_CHAR(HIREDATE,'MM/YY') E, SAL F, &COMM G, SAL*12+&COMM H
new 2: TO_CHAR(HIREDATE,'MM/YY') E, SAL F, NVL(COMM,0) G,
SAL*12+NVL(COMM,0) H
b)
SQL> SET ECHO OFF
SQL> SET PAGESIZE 37
SQL> SET FEEDBACK OFF
SQL> SET LINESIZE 78
SQL> TTITLE'R E L A T O R I O D O S E M P R E G A D O S'
SQL> BTITLE 'CONFIDENCIAL'
SQL> DEFINE COMM = 'NVL(COMM,0)'
SQL> ACCEPT DEPTNO NUMBER PROMPT 'NUMERO DO DEPARTAMENTO:'
NUMERO DO DEPARTAMENTO:30
SQL> COL A FORMAT A12 HEADING 'DEPARTAMENTO' TEMP
SQL> COL B FORMAT A9 HEADING 'CARGO' TEMP
SQL> COL C FORMAT 9999 HEADING 'EMP.|NUM.' TEMP
SQL> COL D FORMAT A8 HEADING 'NOME' TEMP
SQL> COL E FORMAT A5 HEADING 'DATA|ADM.' TEMP
SQL> COL F FORMAT B99,999.99 HEADING 'SALARIO|MENSAL' TEMP
SQL> COL G FORMAT 9,990.99 HEADING 'COMISSAO|ANUAL' TEMP
SQL> COL H FORMAT 999,999.99 HEADING 'TOTAL' TEMP
SQL> BREAK ON REPORT ON A SKIP 2 ON B
SQL> COMPUTE SUM OF F G H ON REPORT A
SQL> SELECT DNAME A, JOB B, EMPNO C, ENAME D,
2 TO_CHAR(HIREDATE,'MM/YY') E, SAL F, &COMM G, SAL*12+&COMM H
3 FROM EMP E, DEPT D
4 WHERE E.DEPTNO = D.DEPTNO
5 AND E.DEPTNO = &DEPTNO
6 ORDER BY DNAME, JOB
96
old 5: AND E.DEPTNO = &DEPTNO
new 5: AND E.DEPTNO = 30
97
Capítulo 12: Hierarquias - Caminhando na Árvore
12.1 Objetivos deste capítulo
A tabela EMP tem uma estrutura em forma de árvore, indicando os gerentes de cada
funcionário.
KING (EMPNO=7839)
|
------------------------------------- (MGR=7839)
| | |
CLARK JONES BLAKE
| | |
| ------ ---------------------------------
| | | | | | | |
MILLER SCOTT FORD ALLEN WARD MARTIN TURNER JAMES
| |
ADAMS SMITH
Quando uma navegação na árvore é executada, não espere ver o resultado na forma da
figura acima, o resultado é uma tabela.
98
LEVEL DEPTNO EMPNO ENAME JOB SAL
------- ------- ------- ---------- --------- -------
1 10 7839 KING PRESIDENT 5000
Comando Descrição
SELECT A cláusula SELECT padrão, incluindo a pseudo coluna
LEVEL que mostra a distância do nó à raiz.
FROM Só pode conter uma tabela.
WHERE Restringe as linhas pesquisadas durante a navegação.
CONNECT BY Especifica as colunas onde existe o relacionamento entre as
linhas. Esta cláusula é obrigatório para caminhar na árvore.
PRIOR Estabelece a direção para caminhar na árvore.
1) PRIOR expressão operador_de_comparação expressão
2) expressão operador_de_comparação PRIOR expressão
Se PRIOR aparece antes de MGR, então os valores de
MGR são pesquisados primeiro, e depois os valores
equivalentes de EMP, ou seja, pesquisa da raiz para o topo.
Se PRIOR aparece antes de EMP a árvore é percorrido do
topo para a raiz.
START WITH Especifica onde começa a pesquisa. Não pode ser usado na
forma 'START at a LEVEL'. Esta cláusula é opcional.
ORDER BY É a última cláusula, como sempre.
A cláusula ORDER BY pode ser usada para ordenar as linhas retornadas. O comando
abaixo é totalmente legítimo:
99
LEVEL DEPTNO EMPNO ENAME JOB SAL
------- ------- ------- ---------- --------- -------
1 10 7839 KING PRESIDENT 5000
2 7782 CLARK MANAGER 2450
3 7934 MILLER CLERK 1300
As cláusulas WHERE e CONNECT BY podem ser usadas para podar a árvore, isto é,
controlar os nós que são mostrados.
JONES
|
----------------
| |
SCOTT FORD
| |
ADAMS SMITH
13 rows selected.
Quando a cláusula CONNECT BY é utilizada para eliminar o nó, toda a sua ramificação é
eliminada.
JONES
|
----------------
| |
SCOTT FORD
| |
ADAMS SMITH
101
LEVEL DEPTNO EMPNO ENAME JOB SAL
------- ------- ------- ---------- --------- -------
1 10 7839 KING PRESIDENT 5000
12 rows selected.
12.4 Terminologia
12.5 Exercícios
102
Capítulo 13: Dicionário de Dados
13.1 Objetivos deste capítulo
No dicionário de dados são permitidas apenas consultas por parte dos usuários. O conjunto
de tabelas e visões é fixo, e o conteúdo é atualizado automaticamente pelo Oracle, quando
um comando da linguagem de definição de dados (DDL), ou outros comandos, são
executados.
O dicionário de dados é criado quando o banco de dados é criado, sendo uma peça crítica no
funcionamento do gerenciador do banco de dados, que utiliza as informações contidas no
dicionário de dados para gerenciar o próprio banco de dados.
• Nomes dos objetos do banco de dados (tabelas, visões, índices, sinônimos, seqüências.)
Todas as tabelas do dicionário de dados pertencem ao usuário SYS, e não são acessadas
diretamente porque as informações armazenadas nestas tabelas são de difícil compreensão.
103
Os nomes das visões refletem o tipo de uso para o qual elas foram criadas. As visões são
classificadas em três grupos distinguidos pelos prefixos USER, ALL e DBA.
Classe Descrição
USER_xxx Visões que qualquer usuário pode acessar, contendo
informações relativas aos objetos do próprio usuário.
ALL_xxx Visões que qualquer usuário pode acessar, contendo
informações relativas tanto aos objetos do próprio usuário,
quanto informações sobre os objetos aos quais foram
concedidos privilégios ao usuário.
DBA_xxx Visões que só podem ser acessadas pelos usuários com
privilégio de administrador do banco de dados
Existem ainda algumas visões que não possuem nenhum destes três prefixos. Abaixo é
mostrada a relação das visões do dicionário de dados, juntamente com suas descrições:
Visão Descrição
DICTIONARY Description of data dictionary tables and
views
DICT_COLUMNS Description of columns in data dictionary
tables and views
TABLE_PRIVILEGES Grants on objects for which the user is the
grantor, grantee, or owner, or PUBLIC is the
grantee
Visão Descrição
ALL_CATALOG All tables, views, synonyms, sequences
accessible to the user
ALL_COL_COMMENTS Comments on columns of accessible tables
and views
ALL_COL_PRIVS Grants on columns for which the user is the
grantor, grantee, owner, or an enabled role or
PUBLIC is the grantee
ALL_COL_PRIVS_MADE Grants on columns for which the user is
owner or grantor
ALL_COL_PRIVS_RECD Grants on columns for which the user,
PUBLIC or enabled role is the grantee
ALL_CONSTRAINTS Constraint definitions on accessible tables
ALL_CONS_COLUMNS Information about accessible columns in
constraint definitions
ALL_DB_LINKS Database links accessible to the user
ALL_DEF_AUDIT_OPTS Auditing options for newly created objects
ALL_DEPENDENCIES Dependencies to and from objects accessible
to the user
ALL_ERRORS Current errors on stored objects that user is
allowed to create
ALL_INDEXES Descriptions of indexes on tables accessible
to the user
ALL_IND_COLUMNS COLUMNs comprising INDEXes on
accessible TABLES
ALL_OBJECTS Objects accessible to the user
104
ALL_SEQUENCES Description of SEQUENCEs accessible to
the user
ALL_SNAPSHOTS Snapshots the user can look at
ALL_SOURCE Current source on stored objects that user is
allowed to create
ALL_SYNONYMS All synonyms accessible to the user
ALL_TABLES Description of tables accessible to the user
ALL_TAB_COLUMNS Columns of all tables, views and clusters
ALL_TAB_COMMENTS Comments on tables and views accessible to
the user
ALL_TAB_PRIVS Grants on objects for which the user is the
grantor, grantee, owner, or an enabled role or
PUBLIC is the grantee
ALL_TAB_PRIVS_MADE User's grants and grants on user's objects
ALL_TAB_PRIVS_RECD Grants on objects for which the user,
PUBLIC or enabled role is the grantee
ALL_TRIGGERS Triggers accessible to the current user
ALL_TRIGGER_COLS Column usage in user's triggers or in triggers
on user's tables
ALL_USERS Information about all users of the database
ALL_VIEWS Text of views accessible to the user
Visão Descrição
DBA_2PC_NEIGHBORS information about incoming and outgoing
connections for pending transactions
DBA_2PC_PENDING info about distributed transactions awaiting
recovery
DBA_AUDIT_EXISTS Lists audit trail entries produced by AUDIT
NOT EXISTS and AUDIT EXISTS
DBA_AUDIT_OBJECT Audit trail records for statements concerning
objects, specifically: table, cluster, view,
index, sequence, [public] database link,
[public] synonym, procedure, trigger,
rollback segment, tablespace, role, user
DBA_AUDIT_STATEMENT Audit trail records concerning grant, revoke,
audit, noaudit and alter system
DBA_AUDIT_TRAIL All audit trail entries
DBA_CATALOG All database Tables, Views, Synonyms,
Sequences
DBA_CLUSTERS Description of all clusters in the database
DBA_CLU_COLUMNS Mapping of table columns to cluster columns
DBA_COL_COMMENTS Comments on columns of all tables and
views
DBA_COL_PRIVS All grants on columns in the database
DBA_CONSTRAINTS Constraint definitions on all tables
DBA_CONS_COLUMNS Information about accessible columns in
constraint definitions
DBA_DATA_FILES Information about database files
DBA_DB_LINKS All database links in the database
DBA_DEPENDENCIES Dependencies to and from objects
105
DBA_ERRORS Current errors on all stored objects in the
database
DBA_EXP_FILES Description of export files
DBA_EXP_OBJECTS Objects that have been incrementally
exported
DBA_EXP_VERSION Version number of the last export session
DBA_EXTENTS Extents comprising all segments in the
database
DBA_FREE_SPACE Free extents in all tablespaces
DBA_INDEXES Description for all indexes in the database
DBA_IND_COLUMNS COLUMNs comprising INDEXes on all
TABLEs and CLUSTERs
DBA_OBJECTS All objects in the database
DBA_OBJECT_SIZE Sizes, in bytes, of various pl/sql objects
DBA_OBJ_AUDIT_OPTS Auditing options for all tables and views
DBA_PRIV_AUDIT_OPTS Describes current system privileges being
audited across the system and by user
DBA_PROFILES Display all profiles and their limits
DBA_ROLES All Roles which exist in the database
DBA_ROLE_PRIVS Roles granted to users and roles
DBA_ROLLBACK_SEGS Description of rollback segments
DBA_SEGMENTS Storage allocated for all database segments
DBA_SEQUENCES Description of all SEQUENCEs in the
database
DBA_SNAPSHOTS All snapshots in the database
DBA_SNAPSHOT_LOGS All snapshot logs in the database
DBA_SOURCE Source of all stored objects in the database
DBA_STMT_AUDIT_OPTS Describes current system auditing options
across the system and by user
DBA_SYNONYMS All synonyms in the database
DBA_SYS_PRIVS System privileges granted to users and roles
DBA_TABLES Description of all tables in the database
DBA_TABLESPACES Description of all tablespaces
DBA_TAB_COLUMNS Columns of all tables, views and clusters
DBA_TAB_COMMENTS Comments on all tables and views in the
database
DBA_TAB_PRIVS All grants on objects in the database
DBA_TRIGGERS All triggers in the database
DBA_TRIGGER_COLS Column usage in all triggers
DBA_TS_QUOTAS Tablespace quotas for all users
DBA_USERS Information about all users of the database
DBA_VIEWS Text of all views in the database
Visão Descrição
USER_AUDIT_OBJECT Audit trail records for statements concerning
objects, specifically: table, cluster, view,
106
index, sequence, [public] database link,
[public] synonym, procedure, trigger,
rollback segment, tablespace, role, user
USER_AUDIT_STATEMENT Audit trail records concerning grant, revoke,
audit, noaudit and alter system
USER_AUDIT_TRAIL Audit trail entries relevant to the user
USER_CATALOG Tables, Views, Synonyms and Sequences
owned by the user
USER_CLUSTERS Descriptions of user's own clusters
USER_CLU_COLUMNS Mapping of table columns to cluster columns
USER_COL_COMMENTS Comments on columns of user's tables and
views
USER_COL_PRIVS Grants on columns for which the user is the
owner, grantor or grantee
USER_COL_PRIVS_MADE All grants on columns of objects owned by
the user
USER_COL_PRIVS_RECD Grants on columns for which the user is the
grantee
USER_CONSTRAINTS Constraint definitions on user's own tables
USER_CONS_COLUMNS Information about accessible columns in
constraint definitions
USER_DB_LINKS Database links owned by the user
USER_DEPENDENCIES Dependencies to and from a users objects
USER_ERRORS Current errors on stored objects owned by the
user
USER_EXTENTS Extents comprising segments owned by the
user
USER_FREE_SPACE Free extents in tablespaces accessible to the
user
USER_INDEXES Description of the user's own indexes
USER_IND_COLUMNS COLUMNs comprising user's INDEXes or
on user's TABLES
USER_OBJECTS Objects owned by the user
USER_OBJECT_SIZE Sizes, in bytes, of various pl/sql objects
USER_OBJ_AUDIT_OPTS Auditing options for user's own tables and
views
USER_RESOURCE_LIMITS Display resource limit of the user
USER_ROLE_PRIVS Roles granted to current user
USER_SEGMENTS Storage allocated for all database segments
USER_SEQUENCES Description of the user's own SEQUENCEs
USER_SNAPSHOTS Snapshots the user can look at
USER_SNAPSHOT_LOGS All snapshot logs owned by the user
USER_SOURCE Source of stored objects accessible to the user
USER_SYNONYMS The user's private synonyms
USER_SYS_PRIVS System privileges granted to current user
USER_TABLES Description of the user's own tables
USER_TABLESPACES Description of accessible tablespaces
USER_TAB_COLUMNS Columns of user's tables, views and clusters
USER_TAB_COMMENTS Comments on the tables and views owned by
the user
USER_TAB_PRIVS Grants on objects for which the user is the
107
owner, grantor or grantee
USER_TAB_PRIVS_MADE All grants on objects owned by the user
USER_TAB_PRIVS_RECD Grants on objects for which the user is the
grantee
USER_TRIGGERS Triggers owned by the user
USER_TRIGGER_COLS Column usage in user's triggers
USER_TS_QUOTAS Tablespace quotas for the user
USER_USERS Information about the current user
USER_VIEWS Text of views owned by the user
SQL> SELECT *
2 FROM ACCESSIBLE_TABLES
3 ORDER BY 1,2
108
SYS AUDIT_ACCESS VIEW
SYS AUDIT_ACTIONS TABLE
SYS AUDIT_CONNECT VIEW
SYS AUDIT_TRAIL VIEW
SYS CATALOG VIEW
SYS CLUSTERCOLUMNS VIEW
SYS CLUSTERS VIEW
..............................................
SYS USER_AUDIT_CONNECT VIEW
SYS USER_AUDIT_RESOURCE VIEW
SYS USER_AUDIT_TRAIL VIEW
..............................................
SYS USER_TS_QUOTAS VIEW
SYS USER_USERS VIEW
SYS USER_VIEWS VIEW
SYS V4EXPCLUS VIEW
SYS V4EXPCOL VIEW
SYS V4EXPEXTENTS VIEW
SYS V4EXPINDEX VIEW
SYS V4EXPSPACE VIEW
SYS V4EXPSYN VIEW
SYS V4EXPTAB VIEW
SYS V4EXPTABAUTH VIEW
SYS V4EXPUSER VIEW
SYS V4EXPVIEW VIEW
SYSTEM HELP TABLE
6 rows selected.
109
TABLE_TYPE CHAR(11)
UNIQUENESS CHAR(9)
TABLESPACE_NAME NOT NULL CHAR(30)
INI_TRANS NOT NULL NUMBER
MAX_TRANS NOT NULL NUMBER
INITIAL_EXTENT NUMBER
NEXT_EXTENT NUMBER
MIN_EXTENTS NOT NULL NUMBER
MAX_EXTENTS NOT NULL NUMBER
PCT_INCREASE NOT NULL NUMBER
PCT_FREE NOT NULL NUMBER
STATUS CHAR(17)
Esta consulta só pode ser realizada por um usuário com privilégio de DBA.
SQL> CONNECT SYSTEM
Connected.
13.7 Exercícios
111
Capítulo 14: Linguagem de Definição de Dados
14.1 Objetivos deste capítulo
Apresentar os comandos utilizados para criar, alterar, trocar de nome, adicionar comentários
e remover tabelas.
Tabelas podem ser criadas a qualquer momento, mesmo com usuários acessando o banco de
dados.
Não existe a necessidade de se especificar o tamanho das tabelas. As tabelas ocupam novos
segmentos quando necessário.
• O nome deve começar por uma letra, de "A" a "Z", ou de "a" a "z".
• O nome pode conter letras, números, e o caractere especial sublinhado (_). Os caracteres
"$" e "#” também podem ser usado, mas seu uso é desaconselhado.
• O nome da tabela não pode ser igual ao de outra tabela, sinônimo ou visão, a não ser que
pertençam a usuários diferentes.
Nome Válido
EMP85 Sim
85EMP Não, começa com número.
LUCRO_BRUTO Sim
LUCRO BRUTO Não, contém espaço.
UPDATE Não, palavra reservada.
TABELA1 Sim, mas nome não diz nada.
112
• Usar nomes descritivos para as tabelas, colunas, índices e outros objetos.
• Usar uma regra consistente para atribuir nomes. Uma regra pode ser, todas as tabelas do
sistema financeiro começam com FIN_.
Tipo Conteúdo
CHAR(n) Caracteres alfanuméricos com até 'n' caracteres. Coluna de
tamanho constante independente do que está armazenado.
Máximo de 255 caracteres.
VARCHAR(n) Caracteres alfanuméricos com até 'n' caracteres. No Oracle 6 é
sinônimo de CHAR, e pode ter no máximo 255 caracteres.
VARCHAR2(n) Caracteres alfanuméricos com até 'n’ caracteres. Introduzida no
Oracle 7, o tamanho armazenado varia de acordo com o conteúdo
da coluna, e pode ter até 2000 caracteres.
LONG Caracteres alfanuméricos com até 2 GigaBytes (2**31 - 1). Só
pode haver uma coluna LONG por tabela. Não pode ser
indexada. Não podem ser especificadas restrições de integridade,
exceto NOT NULL.
RAW(n) Dados binários, como som e imagem, até 255 bytes. Não podem
ser executadas funções de manipulação de caracteres sobre
colunas RAW. Tem as mesmas restrições de LONG. Não existe
conversão de caracteres, como, por exemplo, ANSI x PC850.
LONG RAW Semelhante a RAW, porém podendo armazenar até 2 GigaBytes.
ROWID Caracteres hexadecimais representando o endereço único de uma
linha em uma tabela.
MLSLABEL Formato binário to rótulo do sistema operacional. Usado com o
Trusted ORACLE.
NUMBER(p,s) Número com a precisão 'p' e a escala 's'. A precisão 'p' pode
variar de 1 a 38. A escala 's' pode variar de -84 a +127
DATE Data válida, desde 1 de janeiro de 4712 AC, até 31 de dezembro
de 4712 DC. Para cada coluna DATA são armazenados o Século,
o Ano, o Mês, o Dia, a Hora, o Minuto e o Segundo.
FLOAT Número de ponto flutuante com precisão decimal de 38 dígitos,
ou precisão binária de 126 dígitos.
113
7456123,89 NUMBER(9) 7456124
7456123,89 NUMBER(9,2) 7456123,89
7456123,89 NUMBER(9,1) 7456123,9
7456123,8 NUMBER(6) precisão excedida
7456123,8 NUMBER(15,1) 7456123,8
7456123,89 NUMBER(7,-2) 7456100
7456123,8 NUMBER(7,2) precisão excedida
ANSI ORACLE
CHARACTER(n), CHAR(n) CHAR(n)
CHARACTER VARYING(n), CHAR VARYING(n) VARCHAR(n)
NUMERIC(p,s), DECIMAL(p,s), DEC(p,s) NUMBER(p,s)
INTEGER, INT, SMALLINT NUMBER(38)
FLOAT(b), DOUBLE PRECISION, REAL NUMBER
Restrição Descrição
CONSTRAINT Especifica o nome da restrição. É opcional. Quando
nome_da_restrição omitido o nome padrão tem a forma de SYS_Cn, onde 'n' é
um número inteiro atribuído pelo Oracle que identifica
114
unicamente a restrição.
NULL Especifica se a coluna pode ou não conter valores nulos.
NOT NULL
UNIQUE Designa uma coluna, ou uma combinação de colunas, como
chave única. Cada coluna deve ser declarada como NOT
NULL, e não podem ser chave primária.
PRIMARY KEY Designa uma coluna, ou uma combinação de colunas, como
chave primária. As colunas devem ser declaradas como
NOT NULL e não podem ter a restrição UNIQUE. Se a
chave primária contiver apenas uma coluna pode ser
declarada na restrição da coluna. Se a chave primária
contiver múltiplas colunas deve ser declarada na restrição
da tabela.
FOREIGN KEY Identifica a(s) coluna(s) como chave estrangeira .
(coluna...) REFERENCES identifica a chave primária ou chave única
REFERENCES que é referenciada.
tabela(col(s))
CHECK condição Especifica a condição que uma coluna deve satisfazer para
a linha ser aceita na tabela. Só pode se referenciar a
colunas da mesma tabela. Uma restrição de coluna só pode
referenciar a uma coluna, porém uma restrição de tabela
pode referenciar múltiplas colunas.
DISABLE Desativa (ativa) uma restrição de integridade. O padão é a
(ENABLE) restrição ativa.
EXCEPTIONS Identifica a tabela na qual o ORACLE armazena as
INTO informações sobre as linhas que violaram as restrições de
integridade. A tabela deve existir antes desta condição ser
especificada.
ALTER TABLE EMP MODIFY (SAL NUMBER CONTRAINT NN_SAL NOT NULL)
Tabela DEPT com nome do departamento único definido como restrição de tabela.
CREATE TABLE DEPT (
DEPTNO NUMBER(2) NOT NULL,
DNAME CHAR(14),
LOC CHAR(13),
CONSTRAINT UNQ_DNAME UNIQUE (DNAME)
USING INDEX PCTFREE 20 TABLESDPACE TBLSP_DEPT
STORAGE (INITIAL 8K NEXT 6K))
116
SAL NUMBER(7,2),
COMM NUMBER(7,2),
DEPTNO NUMBER(2) NOT NULL,
CONSTRAINT FK_DEPTNO REFERENCES DEPT(DEPTNO) ON DELETE CASCADE)
É possível criar uma tabela a partir de outra tabela já existente, através do comando:
AS SELECT...
Exemplo:
Table created.
14 rows selected.
Como pode ser visto, as duas tabelas tem exatamente a mesma estrutura e o mesmo
conteúdo.
Table created.
SQL> SELECT *
2 FROM SALARIOS_DOS_EMPREGADOS
118
14 rows selected.
Table altered.
Para alterar a tabela empregados e garantir todos tenham salário inferior a 5000:
Table altered.
Table altered.
119
14.11 Trocando o nome de uma tabela
Os nomes dos objetos do banco de dados podem ser trocado através do comando:
A descrição das tabelas e das colunas pode ser armazenada no dicionário de dados através
do comando COMMENT.
Comment created.
Comment created.
14.14 Exercícios
Tabela: PROJECTS
PROJID NUMBER 4 NOT NULL
P_DESC CHARACTER 20
P_START_DATE DATE
P_END_DATE DATE
BUDGET_AMOUNT NUMBER 7,2
120
MAX_NO_STAFF NUMBER 2
Tabela: ASSIGNMENTS
PROJID NUMBER 4 NOT NULL
EMPNO NUMBER 4 NOT NULL
A_START_DATE DATE
A_END_DATE DATE
BILL_RATE NUMBER 4,2
ASSIGN_TYPE CHAR 2
HOURS NUMBER 2
121
14.15 Respostas dos exercícios
a)
SQL> CREATE TABLE PROJECTS (
2 PROJID NUMBER(4) NOT NULL,
3 P_DESC CHAR(20),
4 P_START_DATE DATE,
5 P_END_DATE DATE,
6 BUDGET_AMOUNT NUMBER(7,2),
7 MAX_NO_STAFF NUMBER(2))
b)
SQL> ALTER TABLE ASSIGNMENTS
2 ADD (HOURS NUMBER(2))
c)
SQL> COMMENT ON TABLE PROJECTS IS 'UNIQUE PROJECT DETAILS'
d)
SQL> COMMENT ON COLUMN PROJECTS.PROJID IS -
> 'UNIQUE IDENTIFIER FOR A PROJECT'
e)
SQL> DESCRIBE USER_COL_COMMENTS
Name Null? Type
------------------------------- -------- ----
TABLE_NAME NOT NULL CHAR(30)
COLUMN_NAME NOT NULL CHAR(30)
COMMENTS CHAR(255)
f)
SQL> SELECT * FROM USER_COL_COMMENTS WHERE COMMENTS IS NOT NULL
g)
SQL> DESCRIBE USER_TAB_COMMENTS
Name Null? Type
------------------------------- -------- ---------
TABLE_NAME NOT NULL CHAR(30)
TABLE_TYPE CHAR(11)
COMMENTS CHAR(255)
h)
SQL> SELECT * FROM USER_TAB_COMMENTS WHERE COMMENTS IS NOT NULL
122
TABLE_NAME TABLE_TYPE COMMENTS
--------------- ----------- ------------------------------------------
ASSIGNMENTS TABLE ASSIGNMENTS FOR ANY EMPLOYEE ON A PROJECT
PROJECTS TABLE UNIQUE PROJECT DETAILS
123
Capítulo 15: Linguagem de Manipulação de Dados
15.1 Objetivos deste capítulo
Os exemplos serão efetuados sobre a tabela Department criada a partir da tabela Dept.
Table created.
Quando os novos valores são inseridos em todas as colunas da tabela, na mesma ordem das
colunas da tabela, a lista de colunas pode ser omitida. É recomendado que a lista de colunas
seja sempre especificada, para não haver necessidade de alterar o programa quando uma
nova coluna for adicionada à tabela.
1 row created.
1 row created.
Em vez que omitir o nome do departamento na lista de colunas, pode ser especificado o
valor nulo para o nome do departamento, o resultado é o mesmo.
1 row created.
Podem ser utilizadas variáveis de substituição para fornecimento dos valores.
1 row created.
1 row created.
SQL> SELECT *
2 FROM DEPARTMENT
3 ORDER BY DEPTNO
9 rows selected.
Para os exemplos de inserção de valores de data e hora será criada a tabela Employee a
partir da tabela Emp.
Table created.
Quando uma data é inserida, o formato DD-MON-YY é geralmente usado. Com este
formato, o século padrão é o século 20 (19xx). O campo data também contém informação
de hora, que quando não é especificada assume o valor padrão de zero horas (00:00:00).
Se for necessário especificar a data em outro século, ou for necessário especificar a hora, a
função TO_DATE é utilizada.
125
8 TO_DATE('24/06/2084 9:30','DD/MM/YYYY HH:MI'),
9 3000,
10 NULL,
11 20)
1 row created.
Para exemplo de inserção de valores a partir de uma outra tabela será criada a tabela
SALARY_GRADE a partir da tabela SALGRADE.
Table created.
Como não existe nenhum departamento com número zero na tabela SALGRADE, não foi
incluída nenhuma linha na tabela SALARY_GRADE durante a criação.
SQL> SELECT *
2 FROM SALARY_GRADE
no rows selected
1 row created.
SQL> SELECT *
2 FROM SALARY_GRADE
1 row updated.
5 rows updated.
ENAME JOB
---------- ---------
CODD ANALYST
FORD ANALYST
ADAMS CLERK
JAMES CLERK
MILLER CLERK
SMITH CLERK
BLAKE MANAGER
CLARK MANAGER
JONES MANAGER
KING PRESIDENT
ALLEN VENDEDOR
MARTIN VENDEDOR
SCOTT VENDEDOR
TURNER VENDEDOR
WARD VENDEDOR
15 rows selected.
3 rows deleted.
no rows selected
Apesar de não possuir nenhuma linha, a tabela Employee ainda existe, para eliminá-la é
utilizado o comando da linguagem de definição de dados (DDL) DROP TABLE.
Table dropped.
15.5 Exercícios
PROJID 1 2
P_DESC WRITE C030 COURSE PROOF READ NOTES
P_START_DATE 02-JAN-88 01-JAN-89
P_END_DATE 07-JAN-88 10-JAN-89
BUDGET_AMOUNT 500 600
MAX_NO_STAFF 1 1
PROJID 1 1 2
EMPNO 7369 7902 7844
A_START_DATE 01-JAN-88 04-JAN-88 01-JAN-89
A_END_DATE 03-JAN-88 07-JAN-88 10-JAN-89
BILL_RATE 50.00 55.00 45.50
ASSIGN_TYPE WR WR PF
HOURS 15 20 30
128
15.6 Respostas dos exercícios
a)
SQL> INSERT INTO PROJECTS
2
(PROJID,P_DESC,P_START_DATE,P_END_DATE,BUDGET_AMOUNT,MAX_NO_STAFF)
3 VALUES
4 (1,'WRITE C030 COURSE','02-JAN-88','07-JAN-88',500,2)
b)
SQL> INSERT INTO ASSIGNMENTS
2 (PROJID,EMPNO,A_START_DATE,A_END_DATE,BILL_RATE,ASSIGN_TYPE,HOURS)
3 VALUES
4 (1,7369,'01-JAN-88','03-JAN-88',50.00,'WR',15)
c)
SQL> UPDATE ASSIGNMENTS
2 SET ASSIGN_TYPE = 'WT'
3 WHERE ASSIGN_TYPE = 'WR'
129
Capítulo 16: Processamento de transações
16.1 Objetivos deste capítulo
As transações não podem ficar pela metade no banco de dados, ou todas as transações de
uma unidade lógica de trabalho são efetivadas, ou nenhuma é efetivada no banco de dados.
Não pode haver o caso em que umas são efetivadas e outras não.
Uma transação começa com o primeiro comando de DML ou DDL executado, e termina
com um dos seguintes comandos.
• COMMIT ou ROLLBACK
• comando de DDL
• Erros
• Falha de máquina
Após o fim de uma transação, a próxima declaração SQL inicia uma nova transação
automaticamente.
Para tornar as mudanças no banco de dados permanentes, elas devem ser efetivadas. O
comando COMMIT é utilizado para efetivar as mudanças, e o comando ROLLBACK é
utilizado para descartar as mudanças.
Até que o comando Commit seja executado, as mudanças são vistas apenas pelo usuário que
as efetuou, os demais usuários enxergam a situação anterior as modificações.
Quando uma transação é interrompida por um erro, como, por exemplo, uma falha do
sistema, toda a transação é descartada (Rolled back). Este procedimento previne que os
erros causem mudanças não desejadas aos dados.
O Rollback automático é mais freqüentemente causado por falhas no sistema, tais como
falta de luz ou queda do sistema operacional. Erros causados pela entrada de comandos, tais
como digitar o nome errado para uma coluna ou tentar realizar uma operação não permitida
na tabela de outro usuário, não interrompem uma transação, nem causam um Rollback
automático, porque estes erros são detectados na fase de 'parse' do comando (quando o
comando é lido e verificado), e não durante a fase de execução.
O Oracle garante a consistência dos dados baseado nas transações. Transações fornecem
mais flexibilidade e controle para trabalhar com os dados. Por exemplo, quando um valor é
debitado de uma conta e creditado em outra, esta operação é uma transação, que deve ser
totalmente efetivada (Commit), ou descartada (Rollback), não pode haver o caso em que
existe o débito sem que haja o crédito correspondente.
• COMMIT [WORK]
• SAVEPOINT nome_do_savepoint
• ROLLBACK [WORK]
• ROLLBACK TO nome_do_savepoint
• Termina a transação
131
• Deve ser executada explicitamente e não implicitamente, caso contrário em caso de
término anormal do programa a última transação é desfeita (Rollback).
• Permite guardar o trabalho até um determinado ponto, para que mais tarde seja
possível desfazê-lo totalmente, ou apenas até este determinado ponto.
- Fim da transação
- Desfaz as alterações
132
Se uma única declaração de DML falha, somente esta transação é desfeita. Esta
característica é chamada de Rollback a nível de declaração, e permite que se efetue tanto o
Rollback quanto o Commit das transações anteriores a transação que falhou.
Se a transação for de DDL, o Commit executado antes da transação não permite o Rollback
das transações anteriores.
• mantém o SavePoint até onde foi feito o Rollback, mas perde os SavePoints criados
após o SavePoint para o qual o Rollback foi feito.
16.13 Autocommit
Com SET AUTOCOMMIT OFF, o próprio usuário tem que executar o comando COMMIT
manualmente.
SQL> COMMIT
Commit complete.
133
DEPTNO DNAME LOC
------- -------------- -------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
1 row created.
Savepoint created.
5 rows updated.
Para desfazer o erro da última declaração, mas sem desfazer a inclusão do departamento 50.
Rollback complete.
134
SQL> SELECT * FROM DEPARTMENT
1 row updated.
SQL> COMMIT
Commit complete.
5 rows deleted.
no rows selected
SQL> ROLLBACK
135
Rollback complete.
Quando se apaga as linhas da tabela não há retorno com efetivação automática habilitada.
SQL> DELETE FROM DEPARTMENT
Commit complete.
5 rows deleted.
SQL> ROLLBACK
Rollback complete.
no rows selected
É necessário se garantir uma consistência de leitura tanto para os usuários que estão
gravando quanto para os usuários que estão lendo do banco de dados. Os usuários que estão
lendo não devem enxergar os dados que estão em processo de alteração. Os usuários que
estão gravando devem enxergar os dados da forma como foram alterados, mesmo que as
mudanças não tenham ainda sido efetivadas.
A finalidade da consistência de leitura é garantir que cada usuário veja os dados da forma
como existiam antes do último Commit.
136
Quando uma inserção, uma atualização ou uma eliminação é feita no banco de dados, o
Oracle faz uma cópia dos dados antes das mudanças, e guarda esta cópia no Segmento de
Rollback.
Todos os usuários que efetuam leituras, exceto aquele que causou as mudanças, enxergam o
banco de dados como ele existia antes das mudanças, através da cópia mantida nos
Segmentos de Rollback.
Antes das mudanças serem efetivadas, somente o usuário que modificou os dados enxerga o
banco de dados com as modificações incorporadas.
Após a efetivação das mudanças, todos os usuários passam a enxergar os dados com as
mudanças efetuadas, e os Segmentos de Rollback são liberados.
Quando ocorre um Rollback, os dados gravados nos Segmentos de Rollback são escritos de
volta nas tabelas.
A declaração SQL “SET TRANSACTION READ ONLY” é utilizada para iniciar uma
transação de leitura apenas.
A consistência de leitura que READ ONLY provê é implementada da mesma maneira que a
consistência à nível de declaração - usando segmentos de rollback. Cada declaração por
padrão enxerga uma visão consistente dos dados na hora em que a declaração foi feita. Esta
funcionalidade é muito útil para relatórios que processam múltiplas consultas enquanto os
usuários atualizam as mesmas tabelas.
Notas:
Exemplo:
137
SQL> SET TRANSACTION READ ONLY
Transaction set.
SQL> COMMIT
Commit complete.
138
Capítulo 17: Concorrência e Bloqueio
17.1 Objetivos deste capítulo
• Bloqueio padrão.
Uma das maiores tarefas de um sistema gerenciador de banco de dados (SGBD) é controlar
a concorrência, ou seja, o acesso aos mesmos dados por vários usuários. Sem um controle
correto de concorrência os dados podem ser atualizados incorretamente ou fora de
seqüência, comprometendo, portanto, a integridade dos dados.
Bloqueios de tabelas e linhas são uma parte essencial para manter a consistência e a
integridade do banco de dados.
• proteger os dados
• controlar os usuários
O bloqueio é o mecanismo que é usado para controlar o acesso aos dados em um sistema
multi-usuário, prevenindo que dois usuários atualizem o mesmo dado ao mesmo tempo.
Bloqueios são ativados sempre que um usuário começa a realizar alterações no banco de
dados.
O Oracle permite que qualquer número de usuários leiam os dados ao mesmo tempo, porque
os bloqueios não são necessários para a leitura.
139
Usuários consultando dados nunca bloqueiam usuários modificando dados, e
usuários modificando dados nunca bloqueiam usuários lendo dados.
140
Nível de Linha - Um bloqueio exclusivo é adquirido para cada linha
“Row Locks (TX)” modificada pelos comandos INSERT, UPDATE,
DELETE ou SELECT FOR UPDATE.
- Uma linha é sempre bloqueada de forma exclusiva, para
não permitir outros usuários atualizar a mesma linha ao
mesmo tempo.
- Bloqueios de linha são sempre adquiridos
automaticamente pelo Oracle quando um dos comandos
listados anteriormente é executado.
Nível de Tabela - Existem diversos modos de bloqueio para tabelas.
“Table Locks (TM)” - Um bloqueio para a tabela é adquirido quando a tabela
é modificada pelos comandos INSERT, UPDATE,
DELETE, SELECT FOR UPDATE ou LOCK TABLE.
- As operações de DML necessitam de bloqueio a nível
de tabela para impedir comandos de DDL serem
executados sobre uma tabela sendo modificada.
Modo
de lock
DECLARAÇÃO SQL da RS RX S SRX X
tabela
SELECT none S S S S S
INSERT RX S S N N N
UPDATE RX S* S* N N N
DELETE RX S* S* N N N
SELECT FOR UPDATE RS S* S* S* S* N
LOCK TABLE IN ROW SHARE RS S S S S N
MODE
LOCK TABLE IN ROW RX S S N N N
EXCLUSIVE MODE
LOCK TABLE IN SHARE MODE S S N Y N N
LOCK TABLE IN SHARE ROW SRX S N N N N
EXCLUSIVE MODE
LOCK TABLE IN EXCLUSIVE X N N N N N
MODE
Comando Bloqueio
142
LOCK TABLE tabela IN ROW SHARE MODE RS
LOCK TABLE tabela IN ROW EXCLUSIVE MODE RX
LOCK TABLE tabela IN SHARE MODE S
LOCK TABLE tabela IN SHARE EXCLUSIVE MODE SRX
LOCK TABLE tabela IN EXCLUSIVE MODE X
O processo de efetivação pode ser acelerado utilizando ROWID para localizar as linhas
dentro das tabelas. ROWID é uma pseudo-coluna que tem um valor único para cada linha da
tabela. ROWID contém o endereço da linha, sendo, portanto, o meio mais rápido de acesso
à uma linha.
ROWID 00004C90.0001.0001
Descrição:
Bloco: 00004C90
Linha do bloco: 0001
Arquivo do banco de dados: 0001
Exemplo:
UPDATE EMP
SET JOB = ‘SALESMAN’, HIREDATE = SYSDATE, SAL = 1.1 * SAL
WHERE ROWID = ‘&ROW_IDENT’
143
• Transação A:
• Transação B:
• Transação A:
• Transação B:
Desta forma:
Deadlocks podem ocorrer sempre que dois ou mais usuários estão acessando as mesmas
tabelas do banco de dados. Ocorre quando o usuário ‘A’ está aguardando a liberação de uma
linha bloqueada pelo usuário ‘B’, e o usuário ‘B’ está na mesma situação com relação ao
usuário ‘A’.
Esta situação pode ser evitada quando os dois usuários acessando a mesma tabela o fazem
na mesma ordem. Desta forma um segue o outro, não havendo Deadlock.
Quando o acesso é feito a mais de uma tabela, deve ser estabelecida uma ordem de acesso às
tabelas para todas as aplicações. Pode ser criado para isto uma tabela no banco de dados,
com uma identificação única de sua ordem de acesso. As tabelas de menor ordem são
acessadas primeiro.
144
Capítulo 18 - Visões
18.1 Objetivos deste capítulo
• Uma visão é como uma janela através da qual os dados das tabelas podem ser
vistos e alterados.
• Uma visão não tem dados próprios. Os dados são manipulados a partir das
tabelas base.
145
Sintaxe:
Para criar uma visão simples chamada D10EMP, a partir da tabela EMP, contendo certos
detalhes dos funcionários do departamento 10:
View created.
SQL> SELECT *
2 FROM D10EMP
Para criar uma visão complexa, chamada DEPT_SUMMARY, contendo funções de grupo e
dados de mais de uma tabela:
Note que nomes alternativos para as colunas foram especificados na visão, o que é
necessário quando os itens da cláusula Select não estão de acordo com as regras para nomes
de colunas, ou se alguma coluna é derivada de uma função ou expressão.
Quando um aliás é utilizado para o nome da coluna na cláusula Select, não é necessário
colocar um nome para a coluna na cláusula Create View.
View created.
A visão EMP_DETAILS restringe o acesso aos dados do próprio usuário, no período das 7
às 17 horas, de segunda a sexta-feira.
View created.
View created.
147
Quando a visão é criada, o comando SELECT não é executado, o comando
SELECT é simplesmente armazenado no dicionário de dados.
Quando os dados são acessados através da visão, são realizadas as seguintes operações:
• Maxdata
• Arraysize
• Long
SQL> SELECT *
2 FROM USER_VIEWS
148
PRODUCT.PRODID,
DESCRIP PRODNA
As seguintes restrições se aplicam quando os dados são alterados através das visões:
• Junção.
• Funções de grupo.
• Cláusula DISTINCT.
• Coluna ROWNUM.
• Sub-consulta correlacionada.
View dropped.
View dropped.
View dropped.
View dropped.
149
18.8 Exercícios
c) Criar uma visão que garanta as seguintes restrições ao se inserir dados na tabela
ASSIGNMENTS:
old 3: (&ID,&EMPNO,'&START','&END','&BILL_R','&ASGT',&HOURS)
new 3: (1,7566,'01-JAN-89','01-JAN-88','40.00','ED',20)
(1,7566,'01-JAN-89','01-JAN-88','40.00','ED',20)
*
ERROR at line 3:
ORA-01402: view WITH CHECK OPTION where-clause violation
SQL> /
Enter value for id: 2
Enter value for empno: 7698
Enter value for start: 01-FEB-89
Enter value for end: 20-FEB-89
Enter value for bill_r: 55.00
Enter value for asgt: WT
Enter value for hours: 30
old 3: (&ID,&EMPNO,'&START','&END','&BILL_R','&ASGT',&HOURS)
new 3: (2,7698,'01-FEB-89','20-FEB-89','55.00','WT',30)
1 row created.
SQL> /
Enter value for id: 2
Enter value for empno: 8000
Enter value for start: 01-MAR-89
Enter value for end: 31-DEC-89
Enter value for bill_r: 69.00
Enter value for asgt: ED
Enter value for hours: 40
old 3: (&ID,&EMPNO,'&START','&END','&BILL_R','&ASGT',&HOURS)
new 3: (2,8000,'01-MAR-89','31-DEC-89','69.00','ED',40)
(2,8000,'01-MAR-89','31-DEC-89','69.00','ED',40)
*
ERROR at line 3:
ORA-01402: view WITH CHECK OPTION where-clause violation
151
18.9 Respostas dos exercícios
a)
SQL> CREATE VIEW AGGREGATES
2 (DEPTNO, AVERAGE, MAXIMUM, MINIMUM, SUM, NO_SALS, NO_COMMS)
3 AS
4 SELECT DEPTNO, AVG(SAL), MAX(SAL), MIN(SAL),
5 SUM(SAL), COUNT(SAL), COUNT(COMM)
6 FROM EMP
7 GROUP BY DEPTNO
b)
SQL> COLUMN MAXIMUM FORMAT 99,999
SQL> COLUMN MINIMUM LIKE MAXIMUM
SQL> COLUMN AVERAGE LIKE MAXIMUM
SQL> COLUMN SAL LIKE MAXIMUM
SQL> COLUM JOB FORMAT A9
SQL> COLUMN ENAME FORMAT A6
SQL> SELECT EMP.EMPNO, ENAME, JOB, SAL, HIREDATE,
2 MINIMUM, MAXIMUM, AVERAGE
3 FROM EMP, AGGREGATES AGG
4 WHERE EMP.DEPTNO = AGG.DEPTNO
5 AND EMP.EMPNO = &EMPNO
Enter value for empno: 7902
old 5: AND EMP.EMPNO = &EMPNO
new 5: AND EMP.EMPNO = 7902
c)
SQL> CREATE VIEW ASG_VAL
2 AS
3 SELECT PROJID, EMPNO, A_START_DATE, A_END_DATE,
4 BILL_RATE, ASSIGN_TYPE, HOURS
5 FROM ASSIGNMENTS
6 WHERE A_START_DATE < A_END_DATE
7 AND PROJID < 2000
8 AND BILL_RATE <= DECODE(ASSIGN_TYPE, 'PF', 50, 'WT', 60, 70)
9 AND ASSIGN_TYPE IN ('PF', 'WT', 'ED')
10 AND EMPNO IN (SELECT EMPNO FROM EMP)
11 WITH CHECK OPTION
d)
SQL> INSERT INTO ASG_VAL
2 VALUES
3 (&ID,&EMPNO,'&START','&END','&BILL_R','&ASGT',&HOURS)
e)
SQL> SELECT VIEW_NAME, TEXT
2 FROM USER_VIEWS
3 WHERE VIEW_NAME = ‘ASG_VAL’
VIEW_NAME TEXT
--------------- --------------------------------------------------
ASG_VAL SELECT PROJID, EMPNO, A_START_DATE, A_END_DATE,
BILL_RATE, ASSIGN_TYPE, HOURS
FR........
152
Capítulo 19 - Índices
19.1 Objetivos deste capítulo
Os índices são criados, normalmente, pelos donos das tabelas, mas qualquer usuário que
tenha privilégio de índice sobre a tabela também pode criar índices para a tabela.
Uma vez criado, o índice será utilizado pelo Oracle, sempre que for possível, para acelerar o
acesso aos dados. Note que os índices são utilizados automaticamente, sem requerer
qualquer ação por parte do usuário, que nem precisa saber da existência dos índices.
O Oracle utiliza árvores binárias balanceadas para os índices, o que garante o mesmo tempo,
aproximadamente, para o acesso a qualquer linha da tabela, independente de sua posição. O
tempo de acesso também é bastante independente do volume de dados indexados.
UNIQUE
NON UNIQUE
SINGLE COLUMN
CONCATENATED
Para criar um índice chamado ENAME_IDX para melhorar o tempo de acesso das consultas
feitas através do nome do funcionário:
O Oracle decide quando é apropriado utilizar um índice. O Oracle sabe quais colunas estão
indexadas e o tipo do índice, e decide de acordo com regras específicas.
A consulta mostrada abaixo não utiliza índice porque não possui cláusula Where.
SELECT *
FROM EMP
WHERE ENAME = ‘JONES’
SELECT *
FROM EMP
WHERE UPPER(ENAME) = ‘JONES’
No exemplo abaixo o índice não é utilizado porque a coluna é parte de uma expressão:
SELECT *
FROM EMP
WHERE HIREDATE+7 = ‘01-JAN-84’
Se não existirem índices nas colunas utilizadas para realizar a junção equivalente, o Oracle é
obrigado a realizar uma operação de SORT/MERGE para responder a consulta. Isto
significa que cada tabela é ordenada separadamente, e depois as duas são unidas de acordo
com a condição de junção.
As colunas que são utilizadas habitualmente na cláusula Where devem ser indexadas.
Não devem ser utilizados mais de 3 índices por tabela para não prejudicar as operações
realizadas através das operações de DML.
19.10 Exercícios
a) Criar um índice único na coluna PROJID da tabela PROJECTS. Teste o índice inserindo
um valor para PROJID já existente.
155
19.11 Respostas dos exercícios
c) SELECT *
FROM USER_INDEXES
156
Capítulo 20: Seqüências
20.1 Objetivos deste capítulo
Para gerar os números seqüenciais automaticamente, primeiro a seqüência deve ser definida
utilizando a declaração CREATE SEQUENCE, conforme a sintaxe mostrada abaixo:
Para um usuário poder criar uma seqüência deve possuir o privilégio de ‘resource’. O
comando mostrada abaixo cria uma seqüência para a coluna DEPTNO da tabela DEPT.
SELECT DEPT_SEQ.NEXTVAL
FROM SYS.DUAL
NEXTVAL
-------
10
157
SELECT DEPT_SEQ.NEXTVAL
FROM SYS.DUAL
NEXTVAL
-------
20
Notas:
A coluna NEXTVAL é mais útil em comandos de DML. Por exemplo, quando são inseridas
linhas na tabela, a seqüência pode ser utilizada para gerar valores únicos para a chave
primária.
Para se referir ao valor atual da seqüência, pode ser utilizada a pseudo-coluna CURRVAL.
Toda vez que a pseudo-coluna NEXTVAL é utilizada, o valor gerado é armazenado em
CURRVAL, que só pode ser utilizada após NEXTVAL ser referenciado na sessão atual do
usuário.
Em visões.
Com as cláusulas Order By, Group By, Connect By, ou Having da declaração
SELECT.
Seqüências são tratadas de maneira similar às tabelas, podendo ser alteradas e eliminadas. O
dono de uma seqüência pode conceder privilégios a outros usuários.
Notas:
Somente os números a serem gerados no futuro são alterados pelo comando Alter
Sequence. Os números que já foram gerados não são alterados.
Validações são realizadas. Não pode ser especificado, por exemplo, um novo valor
máximo menor que o valor corrente.
O parâmetro START WITH não pode ser alterado pelo comando Alter Sequence.
A seqüência deve ser eliminada e recriada para ser iniciada com um novo número.
159
Apenas o dono da seqüência e o DBA podem utilizar este comando.
160
Apêndice A - Tabelas do Curso
161
CAPÍTULO 1: CONCEITOS DE BANCO DE DADOS.........................................................................................1
1.1 OBJETIVOS DESTE CAPÍTULO..................................................................................................................................1
1.2 SISTEMA DE GERENCIAMENTO DE BANCO DE DADOS..................................................................................................1
1.3 BANCO DE DADOS RELACIONAL..............................................................................................................................1
1.4 ARQUITETURA DO ORACLE....................................................................................................................................4
CAPÍTULO 2: INTRODUÇÃO ÀS CONSULTAS.................................................................................................6
2.1 OBJETIVOS DESTE CAPÍTULO..................................................................................................................................6
2.2 O UTILITÁRIO SQL*PLUS..................................................................................................................................6
2.3 CONSTRUÇÃO BÁSICA DE UMA CONSULTA.................................................................................................................6
2.4 EXPRESSÕES ARITMÉTICAS.....................................................................................................................................7
2.5 NOMES ALTERNATIVOS PARA TÍTULOS DE COLUNAS.....................................................................................................9
2.6 O OPERADOR DE CONCATENAÇÃO............................................................................................................................9
2.7 LITERAIS.........................................................................................................................................................10
2.8 MANUSEIO DE VALORES NULOS............................................................................................................................11
2.9 ELIMINAÇÃO DE LINHAS DUPLICADAS.....................................................................................................................12
2.10 ORDENAÇÃO DAS LINHAS..................................................................................................................................13
2.11 CRITÉRIOS DE PESQUISA....................................................................................................................................14
2.12 CONSULTAS COM CONDIÇÕES MÚLTIPLAS..............................................................................................................18
2.13 PRECEDÊNCIA DOS OPERADORES..........................................................................................................................20
2.14 RESUMO DO COMANDO SELECT......................................................................................................................20
2.15 EXERCÍCIOS....................................................................................................................................................20
2.16 RESPOSTAS DOS EXERCÍCIOS..............................................................................................................................23
CAPÍTULO 3: VARIÁVEIS DE SUBSTITUIÇÃO..............................................................................................25
3.1 OBJETIVOS DESTE CAPÍTULO.................................................................................................................................25
3.2 VARIÁVEIS DE SUBSTITUIÇÃO COM UM "&"............................................................................................................25
3.3 VARIÁVEIS DE SUBSTITUIÇÃO COM DOIS "&"..........................................................................................................25
CAPÍTULO 4: FUNÇÕES NUMÉRICAS E DE CARACTERES.......................................................................26
4.1 OBJETIVOS DESTE CAPÍTULO.................................................................................................................................26
4.2 FUNÇÕES QUE MANIPULAM CARACTERES ................................................................................................................26
4.2.1 LOWER(coluna | literal)...............................................................................................................................26
4.2.2 UPPER(coluna | literal)...............................................................................................................................26
4.2.3 INITCAP(coluna | literal).............................................................................................................................26
4.2.4 LPAD(coluna | literal, tamanho, 'caracter')................................................................................................26
4.2.5 RPAD(coluna | literal, tamanho, 'caracter')................................................................................................27
4.2.6 SUBSTR(coluna | literal, posição, comprimento)........................................................................................27
4.2.7 INSTR(coluna | literal, ‘seqüência de caracteres', posição, n)...................................................................27
4.2.8 LTRIM(coluna | literal, 'caracteres')...........................................................................................................28
4.2.9 RTRIM(coluna | literal, 'caracteres')...........................................................................................................28
4.2.10 SOUNDEX(coluna | literal)........................................................................................................................28
4.2.11 LENGTH(coluna | literal)...........................................................................................................................29
4.2.12 TRANSLATE(coluna | literal, de, para).....................................................................................................29
4.2.13 REPLACE(coluna | literal, de, para).........................................................................................................29
4.2.14 Funções aninhadas.....................................................................................................................................30
4.3 FUNÇÕES NUMÉRICAS.........................................................................................................................................31
4.3.1 ROUND(coluna | literal, n)..........................................................................................................................31
4.3.2 TRUNC(coluna | literal, n)...........................................................................................................................31
4.3.3 CEIL(coluna | literal)...................................................................................................................................31
4.3.4 FLOOR(coluna | literal)...............................................................................................................................31
4.3.5 POWER(coluna | literal, n)..........................................................................................................................32
4.3.6 EXP(coluna | literal).....................................................................................................................................32
4.3.7 LOG(base, coluna | literal)...........................................................................................................................32
4.3.8 LN(coluna | literal).......................................................................................................................................32
4.3.9 SQRT(coluna | literal)..................................................................................................................................33
4.3.10 SIGN(coluna | literal).................................................................................................................................33
4.3.11 ABS(coluna | literal)...................................................................................................................................33
4.3.12 MOD(valor1, valor2)..................................................................................................................................34
4.3.13 Funções trigonométricas............................................................................................................................34
4.3.14 Funções hiperbólicas..................................................................................................................................34
4.4 EXERCÍCIOS......................................................................................................................................................34
162
4.5 RESPOSTAS DOS EXERCÍCIOS ................................................................................................................................37
163
8.5 EXERCÍCIOS......................................................................................................................................................67
8.6 RESPOSTAS DOS EXERCÍCIOS................................................................................................................................69
CAPÍTULO 9: CONSULTAS ANINHADAS.........................................................................................................70
9.1 OBJETIVOS DESTE CAPÍTULO.................................................................................................................................70
9.2 DEFINIÇÃO DE CONSULTAS ANINHADAS...................................................................................................................70
9.3 CONSULTAS INTERNAS QUE RETORNAM APENAS UM VALOR.........................................................................................70
9.4 COMO AS CONSULTAS ANINHADAS SÃO EXECUTADAS.................................................................................................71
9.5 CONSULTAS INTERNAS QUE RETORNAM MAIS DE UM VALOR........................................................................................71
9.6 OPERADORES ANY E ALL................................................................................................................................72
9.7 CLÁUSULA HAVING COM CONSULTAS ANINHADAS................................................................................................73
9.8 ORDENAÇÃO EM CONSULTAS ANINHADAS................................................................................................................74
9.9 LIMITE PARA O ANINHAMENTO..............................................................................................................................74
9.10 CONSULTA INTERNA CORRELACIONADA.................................................................................................................74
9.11 O OPERADOR EXISTS....................................................................................................................................75
9.12 EXERCÍCIOS....................................................................................................................................................76
9.13 RESPOSTA DOS EXERCÍCIOS................................................................................................................................79
CAPÍTULO 10: GERAÇÃO DE RELATÓRIOS..................................................................................................81
10.1 OBJETIVOS DESTE CAPÍTULO...............................................................................................................................81
10.2 CONJUNTO DE COMANDOS SET DO SQL*PLUS..................................................................................................81
10.3 COLUMN...................................................................................................................................................81
10.3.1 Formato de exibição para as colunas........................................................................................................82
10.3.2 Outras opções de exibição das colunas.....................................................................................................82
10.4 EXEMPLO DE FORMATAÇÃO DE COLUNAS..............................................................................................................82
10.5 EXEMPLO DE FORMATAÇÃO DE TÍTULO.................................................................................................................83
10.6 EXEMPLO DE REMOÇÃO DA FORMATAÇÃO.............................................................................................................84
CAPÍTULO 11: GERAÇÃO DE RELATÓRIOS - PARTE 2..............................................................................85
11.1 OBJETIVOS DESTE CAPÍTULO...............................................................................................................................85
11.2 PROPRIEDADES DOS CABEÇALHOS E DOS RODAPÉS...................................................................................................85
11.3 A CLÁUSULA NEW_VALUE..........................................................................................................................86
11.4 QUEBRAS NOS RELATÓRIOS................................................................................................................................87
11.5 CÁLCULO DE SUMÁRIOS....................................................................................................................................88
11.6 RELATÓRIO MATRICIAL.....................................................................................................................................90
11.7 ARQUIVO DE COMANDOS PARA O SQL*PLUS.....................................................................................................93
11.8 EXERCÍCIOS....................................................................................................................................................94
11.9 RESPOSTAS DOS EXERCÍCIOS..............................................................................................................................96
CAPÍTULO 12: HIERARQUIAS - CAMINHANDO NA ÁRVORE..................................................................98
12.1 OBJETIVOS DESTE CAPÍTULO...............................................................................................................................98
12.2 QUANDO É POSSÍVEL CAMINHAR NA ÁRVORE.........................................................................................................98
12.3 EXCLUINDO UM NÓ DA ÁRVORE........................................................................................................................100
12.4 TERMINOLOGIA.............................................................................................................................................102
12.5 EXERCÍCIOS..................................................................................................................................................102
CAPÍTULO 13: DICIONÁRIO DE DADOS........................................................................................................103
13.1 OBJETIVOS DESTE CAPÍTULO.............................................................................................................................103
13.2 O QUE É O DICIONÁRIO DE DADOS.....................................................................................................................103
13.3 INFORMAÇÕES CONTIDAS NO DICIONÁRIO DE DADOS..............................................................................................103
13.4 TABELAS DO DICIONÁRIO DE DADOS...................................................................................................................103
13.5 VISÕES DO DICIONÁRIO DE DADOS.....................................................................................................................103
13.6 EXEMPLOS DE UTILIZAÇÃO DO DICIONÁRIO DE DADOS............................................................................................108
13.7 EXERCÍCIOS..................................................................................................................................................110
CAPÍTULO 14: LINGUAGEM DE DEFINIÇÃO DE DADOS.........................................................................112
14.1 OBJETIVOS DESTE CAPÍTULO.............................................................................................................................112
14.2 ESTRUTURA DE DADOS DO ORACLE..................................................................................................................112
14.3 CRIANDO UMA TABELA...................................................................................................................................112
14.4 RECOMENDAÇÕES SOBRE OS NOMES DAS TABELAS................................................................................................112
14.5 TIPO DE DADO DAS COLUNAS...........................................................................................................................113
14.6 RELAÇÃO ENTRE OS TIPOS DE DADOS ANSI E DO ORACLE....................................................................................114
14.7 RELAÇÃO ENTRE OS TIPOS DE DADOS DO SQL/DS E DO ORACLE...........................................................................114
164
14.8 CRIAÇÃO DE TABELAS.....................................................................................................................................114
14.8.1 Sintaxe do comando:.................................................................................................................................114
14.8.2 Criação das tabelas do curso:..................................................................................................................115
14.8.3 Exemplos de restrições.............................................................................................................................116
14.9 CRIANDO UMA TABELA A PARTIR DE OUTRA TABELA.............................................................................................117
14.10 ALTERANDO UMA TABELA.............................................................................................................................119
14.11 TROCANDO O NOME DE UMA TABELA...............................................................................................................120
14.12 DESCRIÇÃO DAS TABELAS E COLUNAS..............................................................................................................120
14.13 REMOVENDO TABELAS..................................................................................................................................120
14.14 EXERCÍCIOS................................................................................................................................................120
CAPÍTULO 15: LINGUAGEM DE MANIPULAÇÃO DE DADOS.................................................................124
15.1 OBJETIVOS DESTE CAPÍTULO.............................................................................................................................124
15.2 INSERINDO NOVAS LINHAS EM UMA TABELA.........................................................................................................124
15.3 ATUALIZANDO LINHAS EM UMA TABELA..............................................................................................................126
15.4 ELIMINANDO LINHAS DE UMA TABELA................................................................................................................127
15.5 EXERCÍCIOS..................................................................................................................................................128
15.6 RESPOSTAS DOS EXERCÍCIOS............................................................................................................................129
CAPÍTULO 16: PROCESSAMENTO DE TRANSAÇÕES...............................................................................130
16.1 OBJETIVOS DESTE CAPÍTULO.............................................................................................................................130
16.2 O QUE É UMA TRANSAÇÃO...............................................................................................................................130
16.3 EFETIVANDO AS MUDANÇAS.............................................................................................................................130
16.4 REMOVENDO MUDANÇAS.................................................................................................................................130
16.5 FALHAS DO SISTEMA.......................................................................................................................................131
16.6 O SIGNIFICADO DE UMA TRANSAÇÃO..................................................................................................................131
16.7 CONTROLANDO TRANSAÇÕES............................................................................................................................131
16.8 COMMIT [WORK]...................................................................................................................................131
16.9 SAVEPOINT SAVEPOINT_NAME....................................................................................................................132
16.10 ROLLBACK[WORK] TO [SAVEPOINT] SAVEPOINT_NAME........................................................................132
16.11 ROLLBACK A NÍVEL DE DECLARAÇÃO...............................................................................................................132
16.12 ROLLBACKS IMPLÍCITOS................................................................................................................................133
16.13 AUTOCOMMIT.............................................................................................................................................133
16.14 EXEMPLO DE UTILIZAÇÃO DE COMMIT E ROLLBACK.................................................................................133
16.15 CONSISTÊNCIA DE LEITURA............................................................................................................................136
16.16 TRANSAÇÕES SOMENTE DE LEITURA.................................................................................................................137
CAPÍTULO 17: CONCORRÊNCIA E BLOQUEIO..........................................................................................139
17.1 OBJETIVOS DESTE CAPÍTULO.............................................................................................................................139
17.2 INTRODUÇÃO AO BLOQUEIO..............................................................................................................................139
17.3 O QUE É UM BLOQUEIO...................................................................................................................................139
17.4 QUANDO OS BLOQUEIOS SÃO NECESSÁRIOS..........................................................................................................139
17.5 QUANDO OS BLOQUEIOS SÃO LIBERADOS.............................................................................................................140
17.6 TIPOS DE BLOQUEIOS......................................................................................................................................140
17.6.1 Bloqueios do dicionário de dados (DDL)................................................................................................140
17.6.2 Bloqueios da manipulação de dados (DML)............................................................................................140
17.7 NÍVEIS DE BLOQUEIO......................................................................................................................................140
17.8 DESCRIÇÃO DOS BLOQUEIOS.............................................................................................................................140
17.9 BLOQUEIOS IMPLÍCITOS...................................................................................................................................142
17.10 BLOQUEIOS EXPLÍCITOS.................................................................................................................................142
17.11 IDENTIFICAÇÃO DA LINHA E BLOQUEIO..............................................................................................................143
17.12 IMPASSE (DEADLOCK)..................................................................................................................................143
CAPÍTULO 18 - VISÕES.......................................................................................................................................145
18.1 OBJETIVOS DESTE CAPÍTULO.............................................................................................................................145
18.2 O QUE É UMA VISÃO......................................................................................................................................145
18.3 CLASSIFICAÇÃO DAS VISÕES.............................................................................................................................145
18.3.1 Visões simples...........................................................................................................................................145
18.3.2 Visões complexas......................................................................................................................................145
18.4 O COMANDO CREATE VIEW......................................................................................................................145
18.5 USANDO UMA VISÃO PARA OPERAÇÕES DE DML.................................................................................................146
18.6 ALTERANDO DADOS ATRAVÉS DAS VISÕES...........................................................................................................149
18.7 ELIMINAÇÃO DE VISÕES...................................................................................................................................149
165
18.8 EXERCÍCIOS..................................................................................................................................................150
18.9 RESPOSTAS DOS EXERCÍCIOS............................................................................................................................152
CAPÍTULO 19 - ÍNDICES.....................................................................................................................................153
19.1 OBJETIVOS DESTE CAPÍTULO.............................................................................................................................153
19.2 FINALIDADES DOS ÍNDICES...............................................................................................................................153
19.3 ESTRUTURA DOS ÍNDICES.................................................................................................................................153
19.4 TIPOS DE ÍNDICES..........................................................................................................................................153
19.5 CRIAÇÃO DOS ÍNDICES....................................................................................................................................153
19.5.1 Criação de um índice para melhorar o acesso........................................................................................154
19.5.2 Criação de um índice para garantir unicidade........................................................................................154
19.6 ELIMINAÇÃO DOS ÍNDICES................................................................................................................................154
19.7 QUANDO UM ÍNDICE É UTILIZADO......................................................................................................................154
19.8 ÍNDICES E JUNÇÕES........................................................................................................................................155
19.9 SUGESTÕES PARA CRIAÇÃO DOS ÍNDICES.............................................................................................................155
19.10 EXERCÍCIOS................................................................................................................................................155
19.11 RESPOSTAS DOS EXERCÍCIOS...........................................................................................................................156
CAPÍTULO 20: SEQÜÊNCIAS.............................................................................................................................157
20.1 OBJETIVOS DESTE CAPÍTULO.............................................................................................................................157
20.2 O GERADOR DE SEQÜÊNCIAS............................................................................................................................157
20.1 GERAÇÃO DE NÚMEROS SEQÜENCIAIS COM NEXTVAL.......................................................................................157
20.1 VALOR ATUAL DA SEQÜÊNCIA..........................................................................................................................158
20.2 REGRAS PARA UTILIZAR CURRVAL E NEXTVAL.........................................................................................158
20.3 ALTERANDO UMA SEQÜÊNCIA...........................................................................................................................159
20.4 CONCEDENDO PRIVILÉGIOS EM SEQÜÊNCIAS.........................................................................................................159
20.5 ELIMINANDO UMA SEQÜÊNCIA..........................................................................................................................159
20.6 LISTANDO SEQÜÊNCIAS...................................................................................................................................160
APÊNDICE A - TABELAS DO CURSO..............................................................................................................161
166