Escolar Documentos
Profissional Documentos
Cultura Documentos
Banco Oracle
Banco Oracle
1.1
1.2
1.3
Projeo
Unio
Interseo
Diferena
Produto
Juno
Projeo
Unio
2
Interseo
Diferena
Produto
Joo
Jos
Manoel
Pintor
Escritor
Joo
Joo
Jos
Jos
Manoel
Manoel
Pintor
Escritor
Pintor
Escritor
Pintor
Escritor
Juno
Joo
Jos
Maria
Ana
1.4
10
10
20
30
10
20
30
40
Vendas
Pesq.
Cont.
Secret.
Joo
Jos
Maria
Ana
10
10
20
30
10
10
20
30
Vendas
Vendas
Pesq.
Cont.
Arquitetura do Oracle
Background Processes
Users
Control Files
Data Files
O SGBD:
Estruturas de memria:
System Global Area (SGA) uma regio compartilhada de memria alocada pelo
SGBD Oracle, que contm dados e informaes de controle. Quanto maior for a SGA
melhor ser o desempenho do Oracle. Os dados da SGA so compartilhados por
todos os usurios que esto acessando o banco de dados. As informaes
4
Control Files
2.2
realizar clculos
concatenar colunas
ordenar linhas
O utilitrio SQL*PLUS
O SQL*PLUS uma interface atravs da qual os comandos SQL podem ser entrados e
executados. O SQL*PLUS possui outros comandos, que permitem formatar a sada dos
comandos SQL, alm de fornecer facilidades para editar e salvar comandos SQL.
Para ativar o SQL*PLUS digite SQLPLUS na linha de comando do MS-DOS, e pressione a
tecla Enter. Quando o SQLPLUS solicitar para entrar com o nome do usurio digite
ALUNO1, e quando for solicitada a senha fornea ALUNO1 novamente.
As linhas de comando do SQL*PLUS so prefixadas por: SQL>. As linhas de continuao
so numeradas. Todo o curso est baseado na utilizao desta ferramenta pelos participantes.
Os comandos podem ser escritos em uma ou mais linhas.
2.3
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.
2.4
Expresses aritmticas
Uma expresso a combinao de um ou mais valores, operadores e funes, que resultam
em um valor calculado.
As expresses aritmticas podem conter nomes de colunas, constantes numricas, e
operadores aritmticos. Os operadores so + - * e / , para soma, subtrao, multiplicao e
diviso, respectivamente.
No exemplo abaixo calcula-se o salrio anual multiplicando-se o salrio mensal por doze.
SQL> SELECT ENAME, SAL*12, COMM
2 FROM EMP
ENAME
SAL*12 COMM
---------- ------- ------SMITH
9600
ALLEN
19200
300
WARD
15000
500
JONES
35700
MARTIN
15000 1400
BLAKE
34200
CLARK
29400
SCOTT
36000
KING
60000
TURNER
18000
0
ADAMS
13200
JAMES
11400
FORD
36000
MILLER
15600
Parnteses podem ser utilizados para especificar a ordem na qual os operadores sero
executados. Se, por exemplo, for necessrio somar 250 ao salrio antes de multiplicar por 12,
devemos escrever:
SQL> SELECT ENAME, (SAL+250)*12
2 FROM EMP
ENAME
(SAL+250)*12
---------- ------------
SMITH
ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
SCOTT
KING
TURNER
ADAMS
JAMES
FORD
MILLER
2.5
12600
22200
18000
38700
18000
37200
32400
39000
63000
21000
16200
14400
39000
18600
Nota: somente na clusula SELECT o Alis pode ser usado, nas outras clusulas no.
2.6
O operador de concatenao
O operador de concatenao (||) permite juntar colunas, expresses aritmticas, ou valores
constantes, para criar uma expresso do tipo caracter. Colunas dos dois lados do operador
so combinadas para formar uma s coluna.
9
Para combinar o nmero do empregado com o nome do empregado em uma coluna apenas,
utilizando EMPREGADO como ttulo, devemos escrever:
SQL> SELECT EMPNO||ENAME EMPREGADO
2 FROM EMP
EMPREGADO
-------------------------------------------------7369SMITH
7499ALLEN
7521WARD
7566JONES
7654MARTIN
7698BLAKE
7782CLARK
7788SCOTT
7839KING
7844TURNER
7876ADAMS
7900JAMES
7902FORD
7934MILLER
14 rows selected.
2.7
Literais
Um literal qualquer caracter, expresso, ou nmero, incluido na clusula SELECT, que no
um nome ou Alis da coluna.
O literal da clusula SELECT listado em todas as linhas mostradas pelo comando. Literais
dos tipos data e caracter devem ser envoltos por apstrofos ('). Literais numricos no
precisam de apstrofos.
O comando abaixo contm literal concatenado com colunas, e um Alis para a primeira
coluna.
SQL> COLUMN EMPREGADO FORMAT A20
SQL> SELECT EMPNO||'-'||ENAME EMPREGADO,
2 'TRABALHA NO DEPARTAMENTO',
3 DEPTNO
4 FROM EMP
EMPREGADO
'TRABALHANODEPARTAMENTO' DEPTNO
-------------------- ------------------------ ------7369-SMITH
TRABALHA NO DEPARTAMENTO
20
7499-ALLEN
TRABALHA NO DEPARTAMENTO
30
7521-WARD
TRABALHA NO DEPARTAMENTO
30
7566-JONES
TRABALHA NO DEPARTAMENTO
20
7654-MARTIN
TRABALHA NO DEPARTAMENTO
30
7698-BLAKE
TRABALHA NO DEPARTAMENTO
30
7782-CLARK
TRABALHA NO DEPARTAMENTO
10
7788-SCOTT
TRABALHA NO DEPARTAMENTO
20
7839-KING
TRABALHA NO DEPARTAMENTO
10
10
7844-TURNER
7876-ADAMS
7900-JAMES
7902-FORD
7934-MILLER
TRABALHA NO DEPARTAMENTO
TRABALHA NO DEPARTAMENTO
TRABALHA NO DEPARTAMENTO
TRABALHA NO DEPARTAMENTO
TRABALHA NO DEPARTAMENTO
30
20
30
20
10
14 rows selected.
2.8
Para calcular o resultado corretamente, deve ser utilizada a expresso NVL, que converte um
valor nulo em um valor no nulo, conforme mostrado abaixo:
SQL> SELECT ENAME, SAL*12+NVL(COMM, 0) SALARIO_ANUAL
2 FROM EMP
ENAME
SALARIO_ANUAL
---------- ------------SMITH
9600
ALLEN
19500
WARD
15500
JONES
35700
MARTIN
16400
BLAKE
34200
CLARK
29400
SCOTT
36000
11
KING
TURNER
ADAMS
JAMES
FORD
MILLER
60000
18000
13200
11400
36000
15600
14 rows selected.
uma expresso
b)
um valor no nulo
Para eliminar as linhas duplicadas, deve ser includa a palavra DISTINCT aps o SELECT.
SQL> SELECT DISTINCT DEPTNO
2 FROM EMP
DEPTNO
------10
12
20
30
Para reverter esta ordem, pode ser utilizada a palavra DESC aps o nome da coluna, na
clusula ORDER BY.
Para listarmos os funcionrios mais novos antes dos mais antigos fazemos:
SQL> SELECT ENAME, JOB, HIREDATE
2 FROM EMP
3 ORDER BY HIREDATE DESC
ENAME
JOB
HIREDATE
---------- --------- --------JAMES
CLERK
23-JUL-84
KING
PRESIDENT 09-JUL-84
BLAKE
MANAGER 11-JUN-84
TURNER
SALESMAN 04-JUN-84
ADAMS
CLERK
04-JUN-84
CLARK
MANAGER 14-MAY-84
WARD
SALESMAN 26-MAR-84
SCOTT
ANALYST 05-MAR-84
MARTIN
SALESMAN 05-DEC-83
FORD
ANALYST 05-DEC-83
MILLER
CLERK
21-NOV-83
JONES
MANAGER 31-OCT-83
ALLEN
SALESMAN 15-AUG-83
SMITH
CLERK
13-JUN-83
possvel efetuar a ordenao por mais de uma coluna, sendo algumas em ordem ascendente
e outras em ordem descendente.
SQL> SELECT DEPTNO, JOB, ENAME
2 FROM EMP
3 ORDER BY DEPTNO, SAL DESC
DEPTNO JOB
ENAME
------- --------- ---------10 PRESIDENT KING
10 MANAGER CLARK
10 CLERK
MILLER
20 ANALYST SCOTT
20 ANALYST FORD
20 MANAGER JONES
20 CLERK
ADAMS
20 CLERK
SMITH
30 MANAGER BLAKE
30 SALESMAN ALLEN
30 SALESMAN TURNER
30 SALESMAN WARD
30 SALESMAN MARTIN
30 CLERK
JAMES
Critrios de pesquisa
14
igual
maior
maior ou igual
menor
menor ou igual
diferente (^= ou !=)
Para listar os nomes, nmeros, cargos e departamentos de todos os funcionrios com cargo
CLERK, usamos:
SQL> SELECT ENAME, EMPNO, JOB, DEPTNO
2 FROM EMP
3 WHERE JOB = CLERK'
ENAME
EMPNO JOB
---------- ------- --------- ------SMITH
7369 CLERK
ADAMS
7876 CLERK
JAMES
7900 CLERK
MILLER
7934 CLERK
DEPTNO
20
20
30
10
Para listar o nome e o nmero dos departamentos com nmero maior que 20, usamos:
SQL> SELECT DNAME, DEPTNO
2 FROM DEPT
3 WHERE DEPTNO > 20
DNAME
DEPTNO
-------------- ------SALES
30
OPERATIONS
40
15
MARTIN
1250
1400
Existem quatro operadores SQL, que operam sobre todos os tipos de dados.
BETWEEN...AND...
IN(lista)
LIKE
IS NULL
SAL
MGR
------800 7902
3000 7566
1100 7788
3000 7566
16
Para listar os nomes de todos os empregados que contm exatamente 4 letras, usamos:
SQL> SELECT ENAME
2 FROM EMP
3 WHERE ENAME LIKE '____' (quatro caracteres de sublinhado)
ENAME
---------WARD
KING
FORD
no igual
no igual a
no maior do que
fora da faixa especificada
fora da lista especificada
no semelhante ao modelo
no nulo
Para listar os empregados com salrios fora da faixa de 1000 a 2000, usamos:
SQL> SELECT ENAME, SAL
2 FROM EMP
3 WHERE SAL NOT BETWEEN 1000 AND 2000
ENAME
SAL
---------- ------SMITH
800
JONES
2975
BLAKE
2850
CLARK
2450
SCOTT
3000
KING
5000
JAMES
950
FORD
3000
8 rows selected.
17
Para listar todos os CLERKs com salrio entre 1000 e 2000, usamos:
SQL> SELECT EMPNO, ENAME, JOB, SAL
2 FROM EMP
3 WHERE SAL BETWEEN 1000 AND 2000
4 AND JOB = 'CLERK'
EMPNO ENAME
JOB
------- ---------- --------- ------7876 ADAMS
CLERK
7934 MILLER
CLERK
SAL
1100
1300
Para listar os funcionrios que so CLERK, ou que recebem entre 1000 e 2000, usamos:
SQL> SELECT EMPNO, ENAME, JOB, SAL
2 FROM EMP
3 WHERE SAL BETWEEN 1000 AND 2000
4 OR JOB = CLERK'
EMPNO ENAME
JOB
SAL
------- ---------- --------- ------7369 SMITH
CLERK
800
7499 ALLEN
SALESMAN
1600
7521 WARD
SALESMAN
1250
7654 MARTIN
SALESMAN
1250
7844 TURNER
SALESMAN
1500
7876 ADAMS
CLERK
1100
7900 JAMES
CLERK
950
7934 MILLER
CLERK
1300
Quando aparecem tanto ANDs quanto ORs em uma expresso lgica, todos os ANDs so
processados antes que os ORs sejam processados.
Uma vez que AND tem precedncia sobre OR, a consulta abaixo retorna todos os gerentes
com salrio maior do que 1500, e todos os vendedores.
SQL> SELECT EMPNO, ENAME, JOB, SAL, DEPTNO
2 FROM EMP
3 WHERE SAL > 1500
4 AND JOB = 'MANAGER'
5 OR JOB = 'SALESMAN'
EMPNO ENAME
JOB
SAL DEPTNO
------- ---------- --------- ------- ------7499 ALLEN
SALESMAN
1600
30
7521 WARD
SALESMAN
1250
30
7566 JONES
MANAGER
2975
20
7654 MARTIN
SALESMAN
1250
30
7698 BLAKE
MANAGER
2850
30
7782 CLARK
MANAGER
2450
10
7844 TURNER
SALESMAN
1500
30
Para selecionar todos os vendedores e gerentes com salrio superior a 1500, usamos:
SQL> SELECT EMPNO, ENAME, JOB, SAL, DEPTNO
2 FROM EMP
3 WHERE SAL > 1500
4 AND ( JOB = 'MANAGER' OR JOB = SALESMAN' )
19
EMPNO ENAME
JOB
SAL DEPTNO
------- ---------- --------- ------- ------7499 ALLEN
SALESMAN
1600
30
7566 JONES
MANAGER
2975
20
7698 BLAKE
MANAGER
2850
30
7782 CLARK
MANAGER
2450
10
Neste caso os parnteses so desnecessrios, uma vez que o AND processa primeiro.
2.14
2.15
Exerccios
a) Selecionar todas as informaes da tabela SALGRADE
GRADE LOSAL HISAL
------- ------- ------1
700 1200
2 1201 1400
3 1401 2000
4 2001 3000
20
3001
9999
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
ADAMS
JAMES
FORD
MILLER
13200
11400
36000
15600
l) Mostrar o nome, o salrio anual e comisso, de todos os vendedores com salrio mensal
maior do que a comisso. O resultado deve ser ordenado com os maiores salrios na frente.
Se dois ou mais empregados tiverem o mesmo salrio, deve ser ordenado pelo nome do
funcionrio.
ENAME
SALARIO_ANUAL COMM
---------- ------------- ------ALLEN
19200
300
TURNER
18000
0
WARD
15000
500
2.16
23
24
3.2
3.3
25
4.2
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.
4.2.9 RTRIM(coluna | literal, 'caracteres')
Remove os caracteres indicados direita da coluna ou do literal. Se nenhum caracter for
especificado, sero eliminados os espaos direita.
SQL> SELECT DNAME,
2 RTRIM(DNAME,'G'), RTRIM(DNAME,'GHS'), RTRIM(DNAME,'N')
3 FROM DEPT
DNAME
RTRIM(DNAME,'G') RTRIM(DNAME,'GHS') RTRIM(DNAME,'N')
-------------- ---------------- ------------------ ---------------ACCOUNTING
ACCOUNTIN
ACCOUNTIN
ACCOUNTING
RESEARCH
RESEARCH
RESEARC
RESEARCH
SALES
SALES
SALE
SALES
OPERATIONS
OPERATIONS
OPERATION
OPERATIONS
28
LENGTH(DNAME)
No exemplo abaixo foram trocados "A" por "I", e "R" por "T", nos cargos.
SQL> SELECT JOB, TRANSLATE(JOB,'AR','IT')
2 FROM EMP
3 WHERE DEPTNO = 10
JOB
TRANSLATE(JOB,'AR','IT')
--------- -----------------------------MANAGER MINIGET
PRESIDENT PTESIDENT
CLERK
CLETK
29
2 FROM EMP
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.
30
ACCOUNTING
RESEARCH
SALES
OPERATIONS
4.3
10
8
0
1
2
10
Funes numricas
SELECT LN(95)
FROM DUAL
LN(95)
---------4.55387689
SIGN(COMM-SAL)
Salrios maiores do que a comisso podem ser listados conforme mostrado abaixo:
SQL> SELECT ENAME, SAL, COMM
2 FROM EMP
3 WHERE SIGN(SAL-COMM) = 1
ENAME
SAL
COMM
---------- ----------------- ----------------ALLEN
1600
300
WARD
1250
500
TURNER
1500
0
33
3 WHERE DEPTNO = 30
SAL
COMM
COMM-SAL
ABS(COMM-SAL)
----------------- ----------------- ----------------- ----------------1600
300
-1300
1300
1250
500
-750
750
1250
1400
150
150
2850
1500
0
-1500
1500
950
4.4
COSH(0)
TANH(.5)
---------1 .462117157
Exerccios
34
c) Listar uma lista contendo todos os empregados com um identificador composto pelas duas
primeiras letras de seus cargos, os dois dgitos do meio de seus nmeros de matrcula, e o
cdigo 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
MILLER
AN90F630
CL93M460
d) Faa uma procura no sensitiva a letras maisculas ou minsculas por um cargo fornecido
pelo usurio.
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 ocorrncia 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
37
5.2
5.2.1 SYSDATE
SYSDATE uma pseudo-coluna que retorna a data e a hora corrente. A tabela SYS.DUAL
pblica, contm 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 expresso. Abaixo a tabela SYS.DUAL foi utilizada para retornar a data corrente.
SQL> SELECT SYSDATE
2 FROM SYS.DUAL
SYSDATE
--------25-OCT-94
38
MONTHS_BETWEEN(SYSDATE,HIREDATE) MONTHS_BETWEEN('01-JAN-84','05-NOV88'
-------------------------------- -------------------------------------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)
Retorna a data do ltimo dia do ms da data especificada.
SQL> SELECT SYSDATE, LAST_DAY(SYSDATE), HIREDATE,
2 LAST_DAY(HIREDATE), LAST_DAY('15-FEB-88')
3 FROM EMP
39
4 WHERE DEPTNO = 20
5.2.7 ROUND(data)
ROUND(data, 'MONTH')
ROUND(data, 'YEAR')
ROUND(data) retorna a data com a indicao da hora como sendo zero horas (meia noite).
At o meio dia retorna a mesma data, aps o meio dia retorna o dia seguinte. Esta funo
til quando so comparadas datas com horas diferentes.
ROUND(data, 'MONTH') retorna o primeiro dia do ms da data, se a data estiver na
primeira quinzena, ou retorna o primeiro dia do ms seguinte, se a data estiver na segunda
quinzena.
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.
SQL> SELECT SYSDATE, ROUND(SYSDATE,'MONTH'), ROUND(SYSDATE,'YEAR')
2 FROM SYS.DUAL
SYSDATE ROUND(SYSDATE,'MONTH') ROUND(SYSDATE,'YEAR')
--------- ---------------------- --------------------25-OCT-94 01-NOV-94
01-JAN-95
5.2.7 TRUNC(data)
TRUNC(data, 'MONTH')
TRUNC(data, 'YEAR')
TRUNC(data) retorna a data com o tempo indicando zero horas.
TRUNC(data,'MONTH') retorna o primeiro dia do ms da data.
TRUNC(data,'YEAR') retorna o primeiro dia do ano da data.
SQL> SELECT SYSDATE, TRUNC(SYSDATE,'MONTH'), TRUNC(SYSDATE,'YEAR')
2 FROM SYS.DUAL
SYSDATE TRUNC(SYSDATE,'MONTH') TRUNC(SYSDATE,'YEAR')
--------- ---------------------- --------------------25-OCT-94 01-OCT-94
01-JAN-94
5.3
Funes de converso
Significado
40
CC ou SCC
YYYY ou SYYYY
YYY, YY, Y
Y,YYY
YEAR ou SYEAR
BC ou AD
B.C. ou A.D.
Q
MM
Month
MON
WW ou W
DDD, DD, D
DAY
DY
J
AM ou PM
A.M. ou P.M.
HH ou HH12
HH24
MI
SS
SSSS
/., etc...
"..."
Notas:
1 - O prefixo 'fm' (fill mode) antes de MONTH ou DAY suprime os espaos direita
2 - O sufixo 'TH' produz nmeros ordinais ("DDTH" para "4TH")
3 - O sufixo 'SP' produz nmeros por extenso ("DDSP" para "FOUR")
4 - O sufixo 'SPTH' para nmeros ordinais por extenso ("DDSPTH" para "FOURTH")
5 - Os cdigos so sensitivos a caracteres maisculos e minsculos
5.3.2 TO_CHAR(nmero|data,['formato'])
Converte nmero ou data em caracter no formato especificado.
SQL> SELECT TO_CHAR(SYSDATE,'DAY, DDTH MONTH YYYY')
2 FROM SYS.DUAL
TO_CHAR(SYSDATE,'DAYDDTHMONTHYYYY')
----------------------------------TUESDAY ,25TH OCTOBER 1994
A funo TO_CHAR pode ser usada para extrair a hora do dia apenas.
SQL> SELECT TO_CHAR(SYSDATE, 'HH:MI:SS')
2 FROM SYS.DUAL
TO_CHAR(SYSDATE,'HH:MI:SS')
--------------------------08:39:51
A funo TO_CHAR pode ser usada para converter nmeros em caracteres aplicando a
formatao desejada.
SQL> SELECT TO_CHAR(SAL,'$9,999')
2 FROM EMP
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.
Significado
posio numrica (um 9 para cada nmero)
zeros esquerda
cifro esquerda
ponto decimal na posio especificada
vrgula na posio especificada
sinal de menos direita
nmeros negativos entre parnteses
notao cientfica
multiplicar por 10 elevado a n, sendo n o
nmero de 9 direita de V
42
Exemplo
999999
099999
$99999
999999.99
999,999
099999MI
999999PR
99.999EEEE
9999V99
1234
001234
$1234
1234.00
1,234
1234(1234)
1.234E+03
123400
B9999.99
1234.00
5.3.4 TO_NUMBER(cadeia_de_caracteres)
Converte a cadeia de caracteres, que deve conter um nmero, em um valor numrico.
SQL> SELECT EMPNO, ENAME, JOB, SAL
2 FROM EMP
3 WHERE SAL > TO_NUMBER('1500')
EMPNO ENAME
JOB
SAL
----- ---------- --------- ------7499 ALLEN
SALESMAN
1600
7566 JONES
MANAGER
2975
7698 BLAKE
MANAGER
2850
7782 CLARK
MANAGER
2450
7788 SCOTT
ANALYST
3000
7839 KING
PRESIDENT 5000
7902 FORD
ANALYST
3000
7 rows selected.
5.3.5 TO_DATE('cadeia_de_caracteres','formato')
Retorna a data contida na cadeia de caracteres conforme o formato especificado. Se o
formato for omitido ser assumido DD-MON-YY.
SQL> SELECT EMPNO, ENAME, HIREDATE
2 FROM EMP
3 WHERE HIREDATE = TO_DATE('June 4,1984','Month dd,yyyy')
EMPNO ENAME
HIREDATE
----- ---------- --------7844 TURNER
04-JUN-84
7876 ADAMS
04-JUN-84
5.4
5.4.1 DECODE(coluna|expresso,pes1,res1,[pes2,res2,...],default)
Funciona como uma estrutura CASO, substituindo as pesquisas pelos resultados. A coluna ou
expresso comparada com os argumentos de pesquisa, e se houver igualdade o resultado
correspondente retornado. Se no houver igualdade, o valor default retornado.
Argumentos:
coluna|expresso
pes1
res1
pes2
res2
default
Notas:
-coluna ou expresso podem ser de qualquer tipo de dados.
-pes(quisa) deve ter o mesmo tipo de dados da coluna ou expresso
-O valor retornado sempre do mesmo tipo do terceiro argumento (resultado1)
No exemplo abaixo o cargo CLERK transformado em WORKER, o cargo MANAGER
transformado em BOSS, e os demais cargos so transformados em UNDEFINED.
SQL> SELECT ENAME, JOB,
2 DECODE(JOB, 'CLERK','WORKER','MANAGER','BOSS','UNDEFINED')
3 DECODED_JOB
4 FROM EMP
ENAME
JOB
DECODED_JOB
---------- --------- ----------SMITH
CLERK
WORKER
ALLEN
SALESMAN UNDEFINED
WARD
SALESMAN UNDEFINED
JONES
MANAGER BOSS
MARTIN
SALESMAN UNDEFINED
BLAKE
MANAGER BOSS
CLARK
MANAGER BOSS
SCOTT
ANALYST UNDEFINED
KING
PRESIDENT UNDEFINED
TURNER
SALESMAN UNDEFINED
ADAMS
CLERK
WORKER
JAMES
CLERK
WORKER
FORD
ANALYST UNDEFINED
MILLER
CLERK
WORKER
O exemplo abaixo causa um erro porque ename (caracter) tem tipo diferente do terceiro
argumento sal (numrico).
SQL> SELECT * FROM EMP
2 ORDER BY DECODE(2,1,SAL,2,ENAME,SAL)
*
ERROR: ORA-01722: invalid number
no rows selected
45
5.4.5 VSIZE(coluna|valor)
Retorna o nmero de bytes utilizado internamente pelo Oracle para representar o valor.
SQL> SELECT DEPTNO, VSIZE(DEPTNO), VSIZE(HIREDATE),
2 VSIZE(SAL), VSIZE(ENAME)
3 FROM EMP
4 WHERE DEPTNO = 10
DEPTNO VSIZE(DEPTNO) VSIZE(HIREDATE)
VSIZE(SAL)
------- --------------- --------------- --------------- --------------10
2
7
3
5
10
2
7
2
4
10
2
7
2
6
VSIZE(ENAME)
5.5
Exerccios
a) Mostrar o nome e a data de admisso dos empregados do departamento 20. Utilize o alis
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
b) Exibir o nome de cada empregado, juntamente com a data de admisso e a data de reviso
do salrio. Assuma a data de reviso um ano aps a data de admisso. Classificar a sada em
ordem ascendente da data de reviso do salrio.
ENAME
HIREDATE REVISAO
---------- --------- --------SMITH
13-JUN-83 13-JUN-84
ALLEN
15-AUG-83 15-AUG-84
JONES
31-OCT-83 31-OCT-84
MILLER
21-NOV-83 21-NOV-84
MARTIN
05-DEC-83 05-DEC-84
FORD
05-DEC-83 05-DEC-84
SCOTT
05-MAR-84 05-MAR-85
WARD
26-MAR-84 26-MAR-85
CLARK
14-MAY-84 14-MAY-85
TURNER
04-JUN-84 04-JUN-85
ADAMS
04-JUN-84 04-JUN-85
BLAKE
11-JUN-84 11-JUN-85
KING
09-JUL-84 09-JUL-85
JAMES
23-JUL-84 23-JUL-85
c) Imprimir uma lista de empregados mostrando o salrio, se este for superior a 1500. Se o
salrio 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 so numricos, e se o caracter do meio uma '/'. Imprima a expresso
'SIM' se for vlido, e 'NAO' se no for vlido. Experimente as expresses '12/34','01/1a','e
'99\88'.
VALOR VALIDO?
----- ------12/34 SIM
48
5.6
49
6.2
Funes disponveis
Funo
AVG
([DISTINCT|ALL]n)
COUNT
([DISTINCT|ALL]exp*)
MAX
([DISTINCT|ALL]exp)
MIN
([DISTINCT|ALL]exp)
STDDEV
([DISTINCT|ALL]n)
SUM
([DISTINCT|ALL]n)
VARIANCE
([DISTINCT|ALL]n)
Valor retornado
Valor mdio de 'n', ignorando os valores nulos.
Nmero de ocorrncias no nulas da expresso. O '*' obriga
a contagem total, incluindo valores duplicados e nulos.
Valor mximo da expresso.
Valor mnimo da expresso.
Desvio padro de 'n', ignorando os valores nulos.
Soma dos valores de 'n', ignorando os valores nulos.
Varincia de 'n', ignorando os valores nulos.
Note que toda a tabela EMP foi tratada como um nico grupo.
Uma funo de grupo pode ser aplicada sobre um subconjunto das linhas usando a clusula
WHERE.
50
6.4
A clusula GROUP BY
A clusula GROUP BY utilizada para dividir as linhas das tabelas em grupos. Funes de
grupo podem ser utilizadas para retornar informaes sumarizadas para cada grupo.
Para calcular o salrio mdio de cada cargo:
SQL> SELECT JOB, AVG(SAL)
2 FROM EMP
3 GROUP BY JOB
JOB
AVG(SAL)
--------- ----------------ANALYST
3000
CLERK
1037.5
MANAGER 2758.333333333333
PRESIDENT
5000
SALESMAN
1400
6.5
51
6.6
6.7
52
Lembre-se que quando funes de grupo so includas na clusula SELECT, todas as colunas
que no contm funo de grupo devem aparecer na clusula GROUP BY.
O exemplo abaixo mostra o erro causado pela utilizao da funo de grupo MIN(SAL), sem
haver a clusula GROUP BY em DEPTNO:
SQL> SELECT DEPTNO, MIN(SAL)
2 FROM EMP
SELECT DEPTNO, MIN(SAL)
*
ERROR at line 1:
ORA-00937: not a single-group group function
A clusula HAVING
Somente os grupos que atendem as condies especificadas na clusula HAVING so
selecionados. A clusula HAVING opera sobre a clusula GROUP BY de maneira semelhante
a que a clusula WHERE opera sobre a clusula SELECT.
Para mostrar o salrio mdio dos departamento que possuem mais de trs funcionrios:
SQL> SELECT DEPTNO, AVG(SAL)
2 FROM EMP
3 GROUP BY DEPTNO
4 HAVING COUNT(*) > 3
DEPTNO
AVG(SAL)
----------------- ----------------20
2175
30 1566.666666666667
53
Embora a clusula HAVING possa ser escrita antes da clusula GROUP BY, a leitura tornase mais fcil quando a clusula HAVING aparece aps a clusula GROUP BY. Os grupos so
formados e as funes de grupo so calculadas antes da clusula HAVING ser aplicada.
A clusula WHERE no pode ser usada para restringir os grupos a serem retornados. A
clusula WHERE na declarao abaixa ilegal:
SQL> SELECT DEPTNO, AVG(SAL)
2 FROM EMP
3 WHERE AVG(SAL) > 2000
4 GROUP BY DEPTNO
WHERE AVG(SAL) > 2000
*
ERROR at line 3:
ORA-00934: group function is not allowed here
6.9
lista_de_colunas
lista_de_tabelas
54
WHERE
GROUP BY
HAVING
ORDER BY
condies_de_linha
lista_de_colunas
condies_de_grupo
lista_de_colunas
So avaliados:
WHERE
para ficar somente as linhas que atendem a clusula
GROUP BY para montagem dos grupos
HAVING
para ficar somente os grupos que atendem a clusula
6.10
Exerccios
a) Encontrar o menor salrio entre todos os empregados.
MENOR
----------------800
e) Encontrar o salrio mdio e a remunerao total mdia de cada tipo de cargo, lembrandose que os vendedores recebem comisso.
JOB
SALARIO_MEDIO REMUNERACAO_MEDIA
--------- ----------------- ----------------ANALYST
3000
36000
CLERK
1037.5
12450
MANAGER 2758.333333333333
33100
PRESIDENT
5000
60000
SALESMAN
1400
17237
55
----------------4200
56
6.11
57
7.2
Junes equivalentes
Para levantar, manualmente, o nome do departamento em que um funcionrio trabalha,
primeiro seria levantado na tabela EMP o nmero do departamento do empregado, e, em
seguida, seria levantado na tabela DEPT o nome correspondente ao nmero do
departamento. Este relacionamento entre as duas tabelas chamado de juno equivalente
(equi-join), uma vez o nmero do departamento nas duas tabelas o mesmo.
A condio de juno especificada na clusula WHERE usando o operador '='.
SQL> SELECT ENAME, JOB, DNAME
2 FROM EMP, DEPT
3 WHERE EMP.DEPTNO = DEPT.DEPTNO
ENAME
JOB
DNAME
---------- --------- -------------CLARK
MANAGER ACCOUNTING
KING
PRESIDENT ACCOUNTING
MILLER
CLERK
ACCOUNTING
SMITH
CLERK
RESEARCH
ADAMS
CLERK
RESEARCH
FORD
ANALYST RESEARCH
SCOTT
ANALYST RESEARCH
JONES
MANAGER RESEARCH
ALLEN
SALESMAN SALES
BLAKE
MANAGER SALES
MARTIN
SALESMAN SALES
JAMES
CLERK
SALES
TURNER
SALESMAN SALES
WARD
SALESMAN SALES
As linhas da tabela EMP foram combinadas com as linhas da tabela DEPT para obteno dos
nmeros 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, porm este procedimento s
obrigatrio quando existe ambigidade.
SQL> SELECT DEPT.DEPTNO, ENAME, JOB, DNAME
2 FROM EMP, DEPT
3 WHERE EMP.DEPTNO = DEPT.DEPTNO
58
4 ORDER BY DEPT.DEPTNO
DEPTNO ENAME
JOB
DNAME
------- ---------- --------- -------------10 CLARK
MANAGER ACCOUNTING
10 KING
PRESIDENT ACCOUNTING
10 MILLER
CLERK
ACCOUNTING
20 SMITH
CLERK
RESEARCH
20 ADAMS
CLERK
RESEARCH
20 FORD
ANALYST RESEARCH
20 SCOTT
ANALYST RESEARCH
20 JONES
MANAGER RESEARCH
30 ALLEN
SALESMAN SALES
30 BLAKE
MANAGER SALES
30 MARTIN
SALESMAN SALES
30 JAMES
CLERK
SALES
30 TURNER
SALESMAN SALES
30 WARD
SALESMAN SALES
14 rows selected.
Alis para nomes de tabelas podem ser usado de forma semelhante que foi usada para alis
de nomes de colunas. O nome do alis escrito aps o nome da tabela. No exemplo abaixo
foi utilizado o alis 'E' para a tabela EMP, e o alis 'D' para a tabela DEPT.
SQL> SELECT E.ENAME, D.DEPTNO, D.DNAME
2 FROM EMP E, DEPT D
3 WHERE E.DEPTNO = D.DEPTNO
4 ORDER BY D.DEPTNO
ENAME
DEPTNO DNAME
---------- ------- -------------CLARK
10 ACCOUNTING
KING
10 ACCOUNTING
MILLER
10 ACCOUNTING
SMITH
20 RESEARCH
ADAMS
20 RESEARCH
FORD
20 RESEARCH
SCOTT
20 RESEARCH
JONES
20 RESEARCH
ALLEN
30 SALES
BLAKE
30 SALES
MARTIN
30 SALES
JAMES
30 SALES
TURNER
30 SALES
WARD
30 SALES
14 rows selected.
7.3
Produto
Quando a condio de juno invlida ou omitida completamente, o resultado um
Produto Cartesiano, e todas as combinaes de linha sero retornadas.
O Produto tende a gerar um grande nmero de linhas, e o resultado raramente til.
7.4
Junes no equivalentes
59
7.5
7.6
Sumrio da Sintaxe
SELECT
FROM
WHERE
AND
OR
GROUP BY
HAVING
ORDER BY
7.7
Exerccios
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.
c) Listar o nome, o local de trabalho e o departamento dos empregados com salrio 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.
61
JONES
BLAKE
CLARK
SCOTT
FORD
KING
MANAGER
MANAGER
MANAGER
ANALYST
ANALYST
PRESIDENT
2975
2850
2450
3000
3000
5000
4
4
4
4
4
5
14 rows selected.
h) Listar os seguintes detalhes para os empregados que ganham 36.000 por ano ou que so
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
63
8.2
Junes externas
Se uma linha no satisfaz a condio de juno, ento a linha no mostrada no resultado da
consulta. De fato, quando fazemos a juno equivalente (equi-join) das tabelas EMP e DEPT,
o departamento 40 no aparece, uma vez que no h nenhum empregado lotado neste
departamento.
As linhas excludas podem ser retornadas se um operador de juno externa (outer join) for
utilizado na condio de juno. O operador um sinal de '+' colocado entre parnteses, que
deve ser ficar ao lado da tabela onde as informaes que no seriam includas devem
aparecer.
No exemplo o operador est colocado ao lado da tabela DEPT, forando listar os dados dos
departamentos mesmo que no haja correspondncia em EMP.
SQL> SELECT E.ENAME, D.DEPTNO, D.DNAME
2 FROM EMP E, DEPT D
3 WHERE E.DEPTNO (+) = D.DEPTNO
4 AND D.DEPTNO IN (30,40)
ENAME
DEPTNO DNAME
---------- ------- -------------ALLEN
30 SALES
BLAKE
30 SALES
MARTIN
30 SALES
JAMES
30 SALES
TURNER
30 SALES
WARD
30 SALES
40 OPERATIONS
7 rows selected.
O operador de juno externa (outer join) s pode aparecer em um dos lados da expresso,
causando uma juno externa esquerda (left outer join), ou uma juno externa direita (right
outer join). A juno externa completa (outer join) no implementada diretamente pelo
Oracle.
8.3
64
Note que EMP aparece na clusula FROM duas vezes, uma com o alis 'E', para os
empregados, e outra com o alis 'G', para os gerentes.
8.4
Junes verticais
Os operadores UNION, INTERSECT e MINUS so 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 Unio
O operador UNION retorna todas as linhas distintas das consultas unidas por este operador.
No exemplo so listados todos os cargos dos departamentos 10 e 30 sem repetio.
SQL> SELECT JOB
2 FROM EMP
3 WHERE DEPTNO = 10
4 UNION
5 SELECT JOB
6 FROM EMP
7 WHERE DEPTNO = 30
JOB
--------CLERK
MANAGER
PRESIDENT
SALESMAN
8.4.2 Interseo
O operador INTERSECT retorna apenas as linhas comuns s duas consultas. Para listar os
cargos existentes tanto no departamento 10 quanto no departamento 30:
SQL> SELECT JOB
2 FROM EMP
3 WHERE DEPTNO = 10
4 INTERSECT
5 SELECT JOB
6 FROM EMP
65
7 WHERE DEPTNO = 30
JOB
--------CLERK
MANAGER
8.4.3 Subtrao
O operador MINUS retorna as linhas presentes na primeira consulta mas no presentes na
segunda consulta. Para listar os cargos existentes no departamento 10 mas no existentes no
departamento 30:
SQL> SELECT JOB
2 FROM EMP
3 WHERE DEPTNO = 10
4 MINUS
5 SELECT JOB
6 FROM EMP
7 WHERE DEPTNO = 30
JOB
--------PRESIDENT
8.5
Mltiplas junes verticais podem ser utilizadas, com parnteses, se necessrio, para
alterar a ordem de execuo.
Exerccios
a) Listar os departamentos que no possuem empregados.
DEPTNO DNAME
------- -------------40 OPERATIONS
GER_NUM GER_NOME
---------7566 JONES
7566 JONES
7698 BLAKE
7698 BLAKE
7698 BLAKE
7698 BLAKE
7698 BLAKE
7782 CLARK
7788 SCOTT
7839 KING
7839 KING
7839 KING
7902 FORD
13 rows selected.
GER_NUM GER_NOME
---------7566 JONES
7566 JONES
7698 BLAKE
7698 BLAKE
7698 BLAKE
7698 BLAKE
7698 BLAKE
7782 CLARK
7788 SCOTT
67
7566
7782
7698
7369
7839
JONES
CLARK
BLAKE
SMITH
KING
7839 KING
7839 KING
7839 KING
7902 FORD
14 rows selected.
68
8.6
69
9.2
coluna1, coluna2
tabela
coluna1 = (SELECT coluna FROM tabela WHERE condio)
Consultas aninhadas so muito teis quando necessrio selecionar linhas de uma tabela sob
uma condio que depende dos dados da prpria tabela.
9.3
Antes da consulta interna que retorna apenas um valor, podem ser usados os operadores =,
<, >, <=, >=, <>.
70
9.4
O cargo de BLAKE obtido pela consulta interna e utilizado pela consulta principal.
9.5
Note que a consulta interna tem uma clusula 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 no indica o departamento, no havendo assim qualquer
correspondncia entre o salrio retornado e o departamento do funcionrio.
Para haver correspondncia entre o salrio e o departamento a consulta foi escrita
novamente:
SQL> SELECT ENAME, SAL, DEPTNO
2 FROM EMP
3 WHERE (SAL,DEPTNO) IN
4 (SELECT MIN(SAL), DEPTNO FROM EMP GROUP BY DEPTNO)
ENAME
SAL DEPTNO
---------- ------- ------SMITH
800
20
JAMES
950
30
MILLER
1300
10
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 condio de procura esto entre parnteses e so
separadas por vrgulas.
As colunas listadas na consulta interna devem estar na mesma ordem das colunas esquerda
da condio de procura.
As colunas retornadas pela consulta interna devem ser em mesmo nmero e do mesmo tipo
de dados das colunas esquerda da condio de procura.
Se uma consulta interna retornar mais de uma linha e a condio de procura utilizar um
operador de uma linha apenas gera o erro mostrado abaixo:
SQL> SELECT ENAME, SAL, DEPTNO
2 FROM EMP
3 WHERE SAL =
4 (SELECT MIN(SAL) FROM EMP GROUP BY DEPTNO)
ERROR:
ORA-01427: single-row subquery returns more than one row
no rows selected
9.6
72
BLAKE
CLARK
ALLEN
TURNER
MILLER
WARD
MARTIN
ADAMS
2850 MANAGER
30
2450 MANAGER
10
1600 SALESMAN
30
1500 SALESMAN
30
1300 CLERK
10
1250 SALESMAN
30
1250 SALESMAN
30
1100 CLERK
20
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.
SQL> SELECT ENAME, SAL, JOB, DEPTNO
2 FROM EMP
3 WHERE SAL > ALL
4 (SELECT DISTINCT SAL FROM EMP WHERE DEPTNO = 30)
5 ORDER BY SAL DESC
ENAME
SAL JOB
DEPTNO
---------- ------- --------- ------KING
5000 PRESIDENT
10
SCOTT
3000 ANALYST
20
FORD
3000 ANALYST
20
JONES
2975 MANAGER
20
73
JOB
AVG(SAL)
--------- -------PRESIDENT
5000
9.8
9.9
9.10
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 presena de uma coluna da consulta
principal na consulta interna.
Passos para executar uma consulta interna correlacionada:
Para encontrar os empregados que recebem mais do que o salrio mdio de seus
departamentos:
SQL> SELECT EMPNO, ENAME, SAL, DEPTNO
2 FROM EMP E
3 WHERE SAL >
4 (SELECT AVG(SAL) FROM EMP WHERE DEPTNO = E.DEPTNO)
5 ORDER BY DEPTNO
EMPNO ENAME
SAL DEPTNO
------- ---------- ------- ------7839 KING
5000
10
7566 JONES
2975
20
74
7788
7902
7499
7698
SCOTT
FORD
ALLEN
BLAKE
3000
3000
1600
2850
20
20
30
30
9.11
Consulta principal
Consulta Interna
O operador EXISTS
O operador EXISTS freqentemente usado com consultas aninhadas correlacionadas,
testando se o valor existe. Se o valor existir, retorna verdadeiro, caso contrrio retorna falso.
Para listar todas as empregados com ao menos um funcionrio subordinado:
SQL> SELECT EMPNO, ENAME, JOB, DEPTNO
2 FROM EMP E
3 WHERE EXISTS
4 (SELECT EMPNO FROM EMP WHERE EMP.MGR = E.EMPNO)
5 ORDER BY EMPNO
EMPNO ENAME
JOB
DEPTNO
------- ---------- --------- ------7566 JONES
MANAGER
20
7698 BLAKE
MANAGER
30
7782 CLARK
MANAGER
10
7788 SCOTT
ANALYST
20
7839 KING
PRESIDENT
10
7902 FORD
ANALYST
20
6 rows selected.
Note que neste exemplo a consulta interna no precisa retornar nada, porm a clusula
SELECT precisa de uma coluna, mesmo que seja um literal.
9.12
Exerccios
a) Listar os empregados com o maior salrio por cargo, em ordem descendente de salrio.
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 salrio por cargo, em ordem ascendente de salrio.
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 salrio e o nmero do departamento dos funcionrios que recebem acima
da mdia de seus departamentos. Ordenar pelo nmero 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 exerccio d para mostrar o salrio mdio do departamento junto com as outras
informaes.
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 funcionrio contratado mais
recentemente
ENAME
HIREDATE MAIOR_DATA
---------- --------- ----------
77
ADAMS
ALLEN
BLAKE
CLARK
FORD
JAMES
JONES
KING
MARTIN
MILLER
SCOTT
SMITH
TURNER
WARD
04-JUN-84
15-AUG-83
11-JUN-84
14-MAY-84
05-DEC-83
23-JUL-84 *
31-OCT-83
09-JUL-84
05-DEC-83
21-NOV-83
05-MAR-84
13-JUN-83
04-JUN-84
26-MAR-84
14 rows selected.
78
9.13
79
80
10.2
COLUMN
Atravs do comando COLUMN podem ser alteradas propriedades das colunas.
Notas:
SIGNIFICADO
alfanumrico, largura n.
posio numrica, como 999999.
coloca zeros esquerda, como 099999.
cifro flutuante, como $999999.
ponto decimal, como 999999.99.
vrgula, como 999,999.
sinal de menos direita, como 999999MI.
nmero negativo entre parnteses, como 999999PR.
notao cientfica, como 99.9999EEEE.
multiplicar por 10**n, como 9999V99.
valores zero em branco, como B9999.99.
COLUMN
COLUMN
COLUMN
COLUMN
COLUMN
COLUMN
82
2 FROM EMP
Num. Salario
Remuneracao
Dept.
Cargo Emp.
Mensal Comissao
Total
----- --------- ----- ---------- ---------- ----------020 CLERK
7369
800.00 Sem com.
9,600.00
030 SALESMAN 7499 1,600.00
300.00 19,500.00
030 SALESMAN 7521 1,250.00
500.00 15,500.00
020 MANAGER 7566 2,975.00 Sem com.
35,700.00
030 SALESMAN 7654 1,250.00 1,400.00 16,400.00
030 MANAGER 7698 2,850.00 Sem com.
34,200.00
010 MANAGER 7782 2,450.00 Sem com.
29,400.00
020 ANALYST 7788 3,000.00 Sem com.
36,000.00
010 PRESIDENT 7839 5,000.00 Sem com.
60,000.00
030 SALESMAN 7844 1,500.00
0.00 18,000.00
020 CLERK
7876 1,100.00 Sem com.
13,200.00
030 CLERK
7900
950.00 Sem com.
11,400.00
020 ANALYST 7902 3,000.00 Sem com.
36,000.00
010 CLERK
7934 1,300.00 Sem com.
15,600.00
10.5
page
RELATORIO DA EMPRESA
Produzido pelo DP
Num. Salario
Remuneracao
Dept.
Cargo Emp.
Mensal Comissao
Total
----- --------- ----- ---------- ---------- ----------020 CLERK
7369
800.00 Sem com.
9,600.00
030 SALESMAN 7499 1,600.00
300.00 19,500.00
030 SALESMAN 7521 1,250.00
500.00 15,500.00
020 MANAGER 7566 2,975.00 Sem com.
35,700.00
030 SALESMAN 7654 1,250.00 1,400.00 16,400.00
030 MANAGER 7698 2,850.00 Sem com.
34,200.00
010 MANAGER 7782 2,450.00 Sem com.
29,400.00
020 ANALYST 7788 3,000.00 Sem com.
36,000.00
010 PRESIDENT 7839 5,000.00 Sem com.
60,000.00
030 SALESMAN 7844 1,500.00
0.00 18,000.00
020 CLERK
7876 1,100.00 Sem com.
13,200.00
030 CLERK
7900
950.00 Sem com.
11,400.00
020 ANALYST 7902 3,000.00 Sem com.
36,000.00
010 CLERK
7934 1,300.00 Sem com.
15,600.00
83
10.6
COMM
REM
9600
300 19500
500 15500
35700
1400 16400
34200
29400
36000
60000
0 18000
13200
11400
36000
15600
14 rows selected.
84
11.2
TAB n
FORMAT
Descrio
Posicionar a impresso na coluna 'n' na linha corrente. Volta atrs
se a coluna tiver sido passada.
Saltar 'n' linhas. Se 'n' for omitido salta 1 linha. Se n=0 volta para
o comeo da linha corrente.
Alinha esquerda, no centro, ou direita da linha corrente. Os
itens de dados que seguem esta clusula, at o fim do comando ou
at a prxima ocorrncia de uma destas clusulas, so alinhados
como um grupo. As clusulas LEFT e CENTER se baseiam no
comando SET LINESIZE para calcular a posio dos itens de
dados.
Avana ou recua a posio de impresso 'n' caracteres. O valor de
'n' deve ser negativo para haver o recuo.
Define o formato dos itens de dados que seguem a clusula, at o
fim do comando ou at a prxima ocorrncia desta clusula. A
especificao do formato para os ttulos semelhante a
especificao do formato para as colunas. Somente uma
especificao de formato est ativa a cada instante. Se o tipo de
dado for conflitante com o formato, o formato no tem efeito
para este item. Se no houver nenhuma clusula FORMAT ativa,
os valores numricos so impressos de acordo com o comando
SET NUMFORMAT, ou na ausncia deste com o formato padro.
Valores de data so impressos no formato padro.
Descrio
Nmero da pagina corrente.
Nmero da linha corrente.
Nome do usurio.
Cdigo do erro mais recente.
O exemplo a seguir mostra algumas das opes disponveis para TTITLE e BTITLE:
SQL> TTITLE LEFT FORMAT 0999 'Pagina: 'SQL.PNO > RIGHT 'Produzido por: Contabilidade' SKIP 2 > CENTER 'Relatorio Confidencial de Vendas' SKIP > CENTER '--------------------------------' SKIP 2
SQL> BTITLE CENTER 'FIM DO RELATORIO' SKIP -
85
>
CENTER '----------------'
ENAME
JOB
SAL COMM
---------- --------- ------- ------ALLEN
SALESMAN
1600
300
WARD
SALESMAN
1250
500
MARTIN
SALESMAN
1250 1400
TURNER
SALESMAN
1500
0
FIM DO RELATORIO
---------------SQL> TTITLE OFF
SQL> BTITLE OFF
11.3
A clusula NEW_VALUE
Esta clusula permite armazenar os valores das colunas em variveis do SQL*PLUS. As
variveis podem ser usadas para modificar um comando SQL dinamicamente, exibir valores
nos cabealhos e passar um valor de um comando SQL para outro.
SQL> COLUMN SYSDATE NEW_VALUE HOJE NOPRINT
SQL> SELECT SYSDATE
2 FROM SYS.DUAL
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
SQL> SELECT SYSDATE
2 FROM SYS.DUAL
Data: 31-OCT-94
Pagina: 1
Usuario: ALUNO1
Um relatorio com a data reformatada no titulo
SQL> TTITLE OFF
A clusula COLUMN SYSDATE NEW_VALUE HOJE NOPRINT faz com que sempre que
a coluna com nome SYSDATE seja selecionada, seu valor passe para a varivel HOJE. A
clusula NOPRINT impede a impresso da varivel SYSDATE como um relatrio separado.
O comando SELECT SYSDATE FROM SYS.DUAL faz com que SYSDATE seja
selecionada a partir da tabela SYS.DUAL, que uma tabela que contm apenas uma linha, e
vai retornar, portanto, apenas um valor.
86
O comando TTITLE LEFT 'Data: ' HOJE faz referncia a varivel HOJE, definida e com
valor atribudo pela clusula NEW_VALUE. Desta forma, SYSDATE impressa no
cabealho atravs da varivel HOJE.
No exemplo abaixo, a varivel MAIOR_SALARIO_MEDIO utilizada para passar um valor
de uma consulta para a outra.
SQL> COL MAIOR_SALARIO_MEDIO NEW_VALUE MAIOR_SALARIO_MEDIO
SQL> SELECT MAX(AVG(SAL)) MAIOR_SALARIO_MEDIO
2 FROM EMP
3 GROUP BY JOB
MAIOR_SALARIO_MEDIO
------------------5000
SQL> SELECT JOB
2 FROM EMP
3 GROUP BY JOB
4 HAVING AVG(SAL) = &MAIOR_SALARIO_MEDIO
old 4: HAVING AVG(SAL) = &MAIOR_SALARIO_MEDIO
new 4: HAVING AVG(SAL) = 5000
JOB
--------PRESIDENT
11.4
SKIP n
DUP[LICATE]
Exemplos:
SQL> BREAK ON REPORT ON DEPTNO PAGE ON JOB SKIP 2
SQL> BREAK ON REPORT ON DEPTNO PAGE ON JOB DUP
SQL> CLEAR BREAKS
breaks cleared
SQL> BREAK
no break(s) defined
87
page 1
RELATORIO DA COMPANHIA
Produzido pelo Departamento Pessoal
Emp.
Salario Comissao Remuneracao
Dept.
Cargo Num.
Mensal
Y-T-D
Total
----- --------- ----- ----------- ----------- ------------010 CLERK
7934 1,300.00 Sem Com.
15,600.00
MANAGER 7782 2,450.00 Sem Com.
29,400.00
PRESIDENT 7839 5,000.00 Sem Com.
60,000.00
020 ANALYST 7788 3,000.00 Sem Com.
36,000.00
7902 3,000.00 Sem Com.
36,000.00
CLERK
7369
800.00 Sem Com.
9,600.00
7876 1,100.00 Sem Com.
13,200.00
MANAGER 7566 2,975.00 Sem Com.
35,700.00
030 CLERK
7900
950.00 Sem Com.
11,400.00
MANAGER 7698 2,850.00 Sem Com.
34,200.00
SALESMAN 7499 1,600.00
300.00
19,500.00
7654 1,250.00 1,400.00
16,400.00
7844 1,500.00
0.00
18,000.00
7521 1,250.00
500.00
15,500.00
*** CONFIDENCIAL ***
SQL> CLEAR COLUMNS
columns cleared
SQL> TTITLE OFF
SQL> BTITLE OFF
SQL> CLEAR BREAKS
breaks cleared
11.5
Clculo de sumrios
O comando COMPUTE realiza clculos baseados nas quebras estabelecidas pelo comando
BREAK.
COMPUTE clusulas OF colunas ON quebras
Clusulas
AVG
COU[NT]
Descrio
calcula a mdia
conta os valores no nulos
88
Tipo da coluna
nmero
qualquer
MAX[IMUM]
MIN[IMUM]
NUM[BER]
STD
SUM
VAR[IANCE]
valor mximo
valor mnimo
nmero de linhas
desvio padro
soma os valores no nulos
calcula a varincia
nmero ou caracter
nmero ou caracter
qualquer
nmero
nmero
nmero
Pode haver vrios comandos COMPUTE ativos ao mesmo tempo, mas geralmente mais
fcil especificar tudo em um nico comando, como, por exemplo:
SQL> COMPUTE SUM AVG OF SAL COMM ON DEPTNO REPORT
OF
OF
OF
OF
SAL ON DEPTNO
SAL ON REPORT
COMM ON DEPTNO
COMM ON REPORT
page 1
Relatorio da Companhia
Produzido pelo Departamento Pessoal
Emp.
Salario COMISSAO Remuneracao
Dept.
Cargo Num.
Mensal
Y-T-D
Total
------ --------- ----- ----------- ----------- ------------00010 CLERK
7934 1,300.00 Sem Com.
15,600.00
MANAGER 7782 2,450.00 Sem Com.
29,400.00
PRESIDENT 7839 5,000.00 Sem Com.
60,000.00
****** *********
----------- ----------avg
2,916.67
89
sum
8,750.00
0.00
7900
950.00 Sem Com.
11,400.00
7698 2,850.00 Sem Com.
34,200.00
7499 1,600.00
300.00
19,500.00
1,250.00 1,400.00
16,400.00
1,500.00
0.00
18,000.00
1,250.00
500.00
15,500.00
----------- ----------1,566.67
550.00
9,400.00 2,200.00
----------- ----------2,073.21
550.00
29,025.00 2,200.00
*** CONFIDENCIAL ***
14 rows selected.
SQL> CLEAR COLUMN
columns cleared
SQL> CLEAR BREAKS
breaks cleared
SQL> CLEAR COMPUTE
computes cleared
SQL> TTITLE OFF
SQL> BTITLE OFF
11.6
Relatrio matricial
Suponha que se deseje produzir um relatrio sumarizando os salrios por cargo e por
departamento, como mostrado abaixo:
Mon Oct 31
page
Relatorio da Companhia
JOB
Departamento 10 Departamento 20 Departamento 30 Total por Cargo
--------- --------------- --------------- --------------- --------------ANALYST
.00
6,000.00
.00
6,000.00
CLERK
1,300.00
1,900.00
950.00
4,150.00
MANAGER
2,450.00
2,975.00
2,850.00
8,275.00
PRESIDENT
5,000.00
.00
.00
5,000.00
SALESMAN
.00
.00
5,600.00
5,600.00
--------------- --------------- --------------- --------------sum
8,750.00
10,875.00
9,400.00
29,025.00
Confidencial
90
A tabela EMP tem todas as informaes necessrias para produzir o relatrio. Abaixo esto
descritas as etapas a serem seguidas para a obteno do relatrio:
a) Listar as informaes necessrias contidas na tabela EMP, ou seja, JOB, SAL e DEPTNO.
SQL> SELECT JOB, SAL, DEPTNO
2 FROM EMP
JOB
SAL DEPTNO
--------- ------- ------CLERK
800
20
SALESMAN
1600
30
SALESMAN
1250
30
MANAGER
2975
20
SALESMAN
1250
30
MANAGER
2850
30
MANAGER
2450
10
ANALYST
3000
20
PRESIDENT 5000
10
SALESMAN
1500
30
CLERK
1100
20
CLERK
950
30
ANALYST
3000
20
CLERK
1300
10
14 rows selected.
SET PAGES 16
COLUMN D10 HEADING 'Departamento 10' FORMAT 99,999.99
COLUMN D20 HEADING 'Departamento 20' FORMAT 99,999.99
COLUMN D30 HEADING 'Departamento 30' FORMAT 99,999.99
COLUMN TBJ HEADING 'Total por Cargo' FORMAT 999,999.99
BREAK ON REPORT
COMPUTE SUM OF D10 D20 D30 TBJ ON REPORT
TTITLE 'Relatorio da Companhia'
BTITLE 'Confidencial'
/
Mon Oct 31
page
Relatorio da Companhia
JOB
Departamento 10 Departamento 20 Departamento 30 Total por Cargo
--------- --------------- --------------- --------------- --------------ANALYST
.00
6,000.00
.00
6,000.00
CLERK
1,300.00
1,900.00
950.00
4,150.00
MANAGER
2,450.00
2,975.00
2,850.00
8,275.00
PRESIDENT
5,000.00
.00
.00
5,000.00
SALESMAN
.00
.00
5,600.00
5,600.00
--------------- --------------- --------------- ---------------
92
sum
8,750.00
10,875.00
9,400.00
29,025.00
Confidencial
SQL> TTITLE OFF
SQL> BTITLE OFF
SQL> CLEAR COLUMN
columns cleared
SQL> CLEAR BREAKS
breaks cleared
SQL> CLEAR COMPUTE
computes cleared
11.7
93
11.8
Exerccios
a) Produza o relatrio mostrado abaixo
Mon Oct 31
page 1
RELATORIO DOS EMPREGADOS
EMP.
DATA SALARIO
COM.
DEPARTAMENTO CARGO
NUM. NOME
ADM.
MENSAL ANUAL
TOTAL
------------ --------- ----- -------- ----- --------- -------- ----------ACCOUNTING CLERK
7934 MILLER 11/83 1,300.00
0.00 15,600.00
MANAGER 7782 CLARK 05/84 2,450.00
0.00 29,400.00
PRESIDENT 7839 KING
07/84 5,000.00
0.00 60,000.00
************ *********
--------- -------- ----------sum
8,750.00
0.00 105,000.00
RESEARCH
CLERK
7900 JAMES 07/84 950.00
0.00 11,400.00
MANAGER 7698 BLAKE 06/84 2,850.00
0.00 34,200.00
SALESMAN 7499 ALLEN 08/83 1,600.00 300.00 19,500.00
7654 MARTIN 12/83 1,250.00 1,400.00 16,400.00
7844 TURNER 06/84 1,500.00
0.00 18,000.00
7521 WARD
03/84 1,250.00 500.00 15,500.00
************ *********
--------- -------- ----------sum
9,400.00 2,200.00 115,000.00
--------- -------- ----------29,025.00 2,200.00 350,500.00
sum
CONFIDENCIAL
SQL> TTITLE OFF
SQL> BTITLE OFF
SQL> SET FEEDBACK ON
SQL> SET PAGESIZE 24
SQL> CLEAR BREAKS
breaks cleared
SQL> CLEAR COMPUTES
computes cleared
94
sum
CONFIDENCIAL
SQL> TTITLE OFF
SQL> BTITLE OFF
SQL> SET FEEDBACK ON
SQL> SET PAGESIZE 24
SQL> CLEAR BREAKS
breaks cleared
SQL> CLEAR COMPUTES
computes cleared
95
11.9
96
97
12.2
KING (EMPNO=7839)
|
------------------------------------- (MGR=7839)
|
|
|
CLARK
JONES
BLAKE
|
|
|
|
-------------------------------------|
| |
|
|
|
|
|
MILLER
SCOTT FORD ALLEN WARD MARTIN TURNER JAMES
| |
ADAMS SMITH
98
20
7566 JONES
7788 SCOTT
7876 ADAMS
7902 FORD
7369 SMITH
MANAGER
ANALYST
CLERK
ANALYST
CLERK
2975
3000
1100
3000
800
2
3
3
3
3
3
30
7698 BLAKE
MANAGER
2850
7499 ALLEN
SALESMAN
1600
7521 WARD
SALESMAN
1250
7654 MARTIN
SALESMAN
1250
7844 TURNER
SALESMAN
1500
7900 JAMES
CLERK
950
2
3
10
7782 CLARK
7934 MILLER
MANAGER
2450
CLERK
1300
Comando
Descrio
SELECT
FROM
WHERE
CONNECT BY
PRIOR
START WITH
ORDER BY
99
20
7566 JONES
7788 SCOTT
7876 ADAMS
7902 FORD
7369 SMITH
MANAGER
ANALYST
CLERK
ANALYST
CLERK
2975
3000
1100
3000
800
2
3
3
3
3
3
30
7698 BLAKE
MANAGER
2850
7499 ALLEN
SALESMAN
1600
7521 WARD
SALESMAN
1250
7654 MARTIN
SALESMAN
1250
7844 TURNER
SALESMAN
1500
7900 JAMES
CLERK
950
12.3
Excluindo um n da rvore
As clusulas WHERE e CONNECT BY podem ser usadas para podar a rvore, isto ,
controlar os ns que so mostrados.
JONES
|
---------------|
|
SCOTT
FORD
|
|
ADAMS
SMITH
100
20
7566 JONES
7876 ADAMS
7902 FORD
7369 SMITH
MANAGER
2975
CLERK
1100
ANALYST
3000
CLERK
800
2
3
3
3
3
3
30
7698 BLAKE
MANAGER
2850
7499 ALLEN
SALESMAN
1600
7521 WARD
SALESMAN
1250
7654 MARTIN
SALESMAN
1250
7844 TURNER
SALESMAN
1500
7900 JAMES
CLERK
950
2
3
10
7782 CLARK
7934 MILLER
MANAGER
2450
CLERK
1300
13 rows selected.
101
20
7566 JONES
7902 FORD
7369 SMITH
MANAGER
2975
ANALYST
3000
CLERK
800
2
3
3
3
3
3
30
7698 BLAKE
MANAGER
2850
7499 ALLEN
SALESMAN
1600
7521 WARD
SALESMAN
1250
7654 MARTIN
SALESMAN
1250
7844 TURNER
SALESMAN
1500
7900 JAMES
CLERK
950
2
3
10
7782 CLARK
7934 MILLER
MANAGER
2450
CLERK
1300
12 rows selected.
12.4
12.5
Terminologia
Ingls
Portugus
Descrio
NODE
ROOT
Raiz
PARENT
Pai
CHILD
TERMINAL NODE
LEAF
BRANCH
Filho
Folha
Ramo ou Galho
Exerccios
a) Mostrar a organizao do departamento 20.
102
13.2
13.3
13.4
Nomes dos objetos do banco de dados (tabelas, vises, ndices, sinnimos, seqncias.)
13.5
Os nomes das vises refletem o tipo de uso para o qual elas foram criadas. As vises so
classificadas em trs grupos distinguidos pelos prefixos USER, ALL e DBA.
Classe
USER_xxx
ALL_xxx
DBA_xxx
Descrio
Vises que qualquer usurio pode acessar, contendo
informaes relativas aos objetos do prprio usurio.
Vises que qualquer usurio pode acessar, contendo
informaes relativas tanto aos objetos do prprio usurio,
quanto informaes sobre os objetos aos quais foram
concedidos privilgios ao usurio.
Vises que s podem ser acessadas pelos usurios com
privilgio de administrador do banco de dados
Existem ainda algumas vises que no possuem nenhum destes trs prefixos. Abaixo
mostrada a relao das vises do dicionrio de dados, juntamente com suas descries:
Viso
DICTIONARY
DICT_COLUMNS
TABLE_PRIVILEGES
Viso
ALL_CATALOG
ALL_COL_COMMENTS
ALL_COL_PRIVS
ALL_COL_PRIVS_MADE
ALL_COL_PRIVS_RECD
ALL_CONSTRAINTS
ALL_CONS_COLUMNS
ALL_DB_LINKS
ALL_DEF_AUDIT_OPTS
ALL_DEPENDENCIES
ALL_ERRORS
ALL_INDEXES
ALL_IND_COLUMNS
Descrio
Description of data dictionary tables and
views
Description of columns in data dictionary
tables and views
Grants on objects for which the user is the
grantor, grantee, or owner, or PUBLIC is the
grantee
Descrio
All tables, views, synonyms, sequences
accessible to the user
Comments on columns of accessible tables
and views
Grants on columns for which the user is the
grantor, grantee, owner, or an enabled role or
PUBLIC is the grantee
Grants on columns for which the user is
owner or grantor
Grants on columns for which the user,
PUBLIC or enabled role is the grantee
Constraint definitions on accessible tables
Information about accessible columns in
constraint definitions
Database links accessible to the user
Auditing options for newly created objects
Dependencies to and from objects accessible
to the user
Current errors on stored objects that user is
allowed to create
Descriptions of indexes on tables accessible to
the user
COLUMNs comprising INDEXes on
accessible TABLES
104
ALL_OBJECTS
ALL_SEQUENCES
ALL_SNAPSHOTS
ALL_SOURCE
ALL_SYNONYMS
ALL_TABLES
ALL_TAB_COLUMNS
ALL_TAB_COMMENTS
ALL_TAB_PRIVS
ALL_TAB_PRIVS_MADE
ALL_TAB_PRIVS_RECD
ALL_TRIGGERS
ALL_TRIGGER_COLS
ALL_USERS
ALL_VIEWS
Viso
DBA_2PC_NEIGHBORS
DBA_2PC_PENDING
DBA_AUDIT_EXISTS
DBA_AUDIT_OBJECT
DBA_AUDIT_STATEMENT
DBA_AUDIT_TRAIL
DBA_CATALOG
DBA_CLUSTERS
DBA_CLU_COLUMNS
DBA_COL_COMMENTS
DBA_COL_PRIVS
DBA_CONSTRAINTS
DBA_CONS_COLUMNS
DBA_DATA_FILES
DBA_DB_LINKS
Descrio
information about incoming and outgoing
connections for pending transactions
info about distributed transactions awaiting
recovery
Lists audit trail entries produced by AUDIT
NOT EXISTS and AUDIT EXISTS
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
Audit trail records concerning grant, revoke,
audit, noaudit and alter system
All audit trail entries
All database Tables, Views, Synonyms,
Sequences
Description of all clusters in the database
Mapping of table columns to cluster columns
Comments on columns of all tables and views
All grants on columns in the database
Constraint definitions on all tables
Information about accessible columns in
constraint definitions
Information about database files
All database links in the database
105
DBA_DEPENDENCIES
DBA_ERRORS
DBA_TAB_PRIVS
DBA_TRIGGERS
DBA_TRIGGER_COLS
DBA_TS_QUOTAS
DBA_USERS
DBA_VIEWS
Viso
USER_AUDIT_OBJECT
Descrio
Audit trail records for statements concerning
DBA_EXP_FILES
DBA_EXP_OBJECTS
DBA_EXP_VERSION
DBA_EXTENTS
DBA_FREE_SPACE
DBA_INDEXES
DBA_IND_COLUMNS
DBA_OBJECTS
DBA_OBJECT_SIZE
DBA_OBJ_AUDIT_OPTS
DBA_PRIV_AUDIT_OPTS
DBA_PROFILES
DBA_ROLES
DBA_ROLE_PRIVS
DBA_ROLLBACK_SEGS
DBA_SEGMENTS
DBA_SEQUENCES
DBA_SNAPSHOTS
DBA_SNAPSHOT_LOGS
DBA_SOURCE
DBA_STMT_AUDIT_OPTS
DBA_SYNONYMS
DBA_SYS_PRIVS
DBA_TABLES
DBA_TABLESPACES
DBA_TAB_COLUMNS
DBA_TAB_COMMENTS
106
USER_AUDIT_STATEMENT
USER_AUDIT_TRAIL
USER_CATALOG
USER_CLUSTERS
USER_CLU_COLUMNS
USER_COL_COMMENTS
USER_COL_PRIVS
USER_COL_PRIVS_MADE
USER_COL_PRIVS_RECD
USER_CONSTRAINTS
USER_CONS_COLUMNS
USER_DB_LINKS
USER_DEPENDENCIES
USER_ERRORS
USER_EXTENTS
USER_FREE_SPACE
USER_INDEXES
USER_IND_COLUMNS
USER_OBJECTS
USER_OBJECT_SIZE
USER_OBJ_AUDIT_OPTS
USER_RESOURCE_LIMITS
USER_ROLE_PRIVS
USER_SEGMENTS
USER_SEQUENCES
USER_SNAPSHOTS
USER_SNAPSHOT_LOGS
USER_SOURCE
USER_SYNONYMS
USER_SYS_PRIVS
USER_TABLES
USER_TABLESPACES
USER_TAB_COLUMNS
USER_TAB_COMMENTS
USER_TAB_PRIVS
USER_TAB_PRIVS_MADE
USER_TAB_PRIVS_RECD
USER_TRIGGERS
USER_TRIGGER_COLS
USER_TS_QUOTAS
USER_USERS
USER_VIEWS
the user
Grants on objects for which the user is the
owner, grantor or grantee
All grants on objects owned by the user
Grants on objects for which the user is the
grantee
Triggers owned by the user
Column usage in user's triggers
Tablespace quotas for the user
Information about the current user
Text of views owned by the user
108
SYS
ALL_USERS
VIEW
SYS
ALL_VIEWS
VIEW
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
136 rows selected.
109
TABLE_OWNER
TABLE_NAME
TABLE_TYPE
UNIQUENESS
TABLESPACE_NAME
INI_TRANS
MAX_TRANS
INITIAL_EXTENT
NEXT_EXTENT
MIN_EXTENTS
MAX_EXTENTS
PCT_INCREASE
PCT_FREE
STATUS
Esta consulta s pode ser realizada por um usurio com privilgio de DBA.
SQL> CONNECT SYSTEM
Connected.
SQL> DESCRIBE DBA_COL_COMMENTS
Name
Null? Type
------------------------------- -------- ---OWNER
NOT NULL CHAR(30)
TABLE_NAME
NOT NULL CHAR(30)
COLUMN_NAME
NOT NULL CHAR(30)
COMMENTS
CHAR(255)
13.7
Exerccios
a) Mostrar as seguintes informaes para a tabela EMP:
Coluna
Nulo? Tipo
------------------------------- -------- -------------EMPNO
NOT NULL NUMBER(4)
ENAME
VARCHAR2(10)
JOB
VARCHAR2(9)
MGR
NUMBER(4)
HIREDATE
DATE
110
SAL
COMM
DEPTNO
NUMBER(7,2)
NUMBER(7,2)
NUMBER(2)
111
14.2
14.3
O nome deve comear por uma letra, de "A" a "Z", ou de "a" a "z".
O nome pode conter letras, nmeros, e o caractere especial sublinhado (_). Os caracteres
"$" e "# tambm podem ser usado, mas seu uso desaconselhado.
O nome da tabela no pode ser igual ao de outra tabela, sinnimo ou viso, a no ser que
pertenam a usurios diferentes.
14.4
Vlido
Sim
No, comea com nmero.
Sim
No, contm espao.
No, palavra reservada.
Sim, mas nome no diz nada.
14.5
Usar uma regra consistente para atribuir nomes. Uma regra pode ser, todas as tabelas do
sistema financeiro comeam com FIN_.
RAW(n)
LONG RAW
ROWID
MLSLABEL
NUMBER(p,s)
DATE
FLOAT
Dado
7456123,89
Contedo
Caracteres alfanumricos com at 'n' caracteres. Coluna de
tamanho constante independente do que est armazenado.
Mximo de 255 caracteres.
Caracteres alfanumricos com at 'n' caracteres. No Oracle 6
sinnimo de CHAR, e pode ter no mximo 255 caracteres.
Caracteres alfanumricos com at 'n caracteres. Introduzida no
Oracle 7, o tamanho armazenado varia de acordo com o contedo
da coluna, e pode ter at 2000 caracteres.
Caracteres alfanumricos com at 2 GigaBytes (2**31 - 1). S
pode haver uma coluna LONG por tabela. No pode ser indexada.
No podem ser especificadas restries de integridade, exceto
NOT NULL.
Dados binrios, como som e imagem, at 255 bytes. No podem
ser executadas funes de manipulao de caracteres sobre
colunas RAW. Tem as mesmas restries de LONG. No existe
converso de caracteres, como, por exemplo, ANSI x PC850.
Semelhante a RAW, porm podendo armazenar at 2 GigaBytes.
Caracteres hexadecimais representando o endereo nico de uma
linha em uma tabela.
Formato binrio to rtulo do sistema operacional. Usado com o
Trusted ORACLE.
Nmero com a preciso 'p' e a escala 's'. A preciso 'p' pode variar
de 1 a 38. A escala 's' pode variar de -84 a +127
Data vlida, desde 1 de janeiro de 4712 AC, at 31 de dezembro
de 4712 DC. Para cada coluna DATA so armazenados o Sculo,
o Ano, o Ms, o Dia, a Hora, o Minuto e o Segundo.
Nmero de ponto flutuante com preciso decimal de 38 dgitos,
ou preciso binria de 126 dgitos.
Especificao
NUMBER
113
Valor armazenado
7456123,89
7456123,89
7456123,89
7456123,89
7456123,8
7456123,8
7456123,89
7456123,8
14.6
NUMBER(9)
NUMBER(9,2)
NUMBER(9,1)
NUMBER(6)
NUMBER(15,1)
NUMBER(7,-2)
NUMBER(7,2)
14.7
ORACLE
CHAR(n)
VARCHAR(n)
NUMBER(p,s)
NUMBER(38)
NUMBER
14.8
7456124
7456123,89
7456123,9
preciso excedida
7456123,8
7456100
preciso excedida
ORACLE
CHAR(n)
VARCHAR(n)
LONG
NUMBER(p,s)
NUMBER(38)
NUMBER
DATE
DATE
Criao de tabelas
Restrio
Descrio
114
CONSTRAINT
nome_da_restrio
NULL
NOT NULL
UNIQUE
PRIMARY KEY
FOREIGN KEY
(coluna...)
REFERENCES
tabela(col(s))
CHECK condio
DISABLE
(ENABLE)
EXCEPTIONS
INTO
115
Tabela DEPT com nome do departamento nico definido como restrio 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))
DNAME
LOC
CONSTRAINT CHECK_DEPTNO
CHECK (DEPTNO BETWEEN 10 AND 99)
DISABLE,
CHAR(14)
CONSTRAINT CHECK_DNAME
CHECK(DNAME=UPPER(DNAME))
DISABLE,
CHAR(13)
CONSTRAINT CHECK_LOC
CHECK (LOC IN ('DALLAS','BOSTON',...))
DISABLE)
NOT NULL,
116
MGR
HIREDATE
SAL
COMM
DEPTNO
CONSTRAINT
14.9
117
EMPNO ENAME
JOB
MGR HIREDATE
SAL COMM DEPTNO
------- ---------- --------- ------- --------- ------- ------- ------7369 SMITH
CLERK
7902 13-JUN-83
800
20
7499 ALLEN
SALESMAN
7698 15-AUG-83 1600
300
30
7521 WARD
SALESMAN
7698 26-MAR-84 1250
500
30
7566 JONES
MANAGER
7839 31-OCT-83 2975
20
7654 MARTIN
SALESMAN
7698 05-DEC-83 1250 1400
30
7698 BLAKE
MANAGER
7839 11-JUN-84 2850
30
7782 CLARK
MANAGER
7839 14-MAY-84 2450
10
7788 SCOTT
ANALYST
7566 05-MAR-84 3000
20
7839 KING
PRESIDENT
09-JUL-84 5000
10
7844 TURNER
SALESMAN
7698 04-JUN-84 1500
0
30
7876 ADAMS
CLERK
7788 04-JUN-84 1100
20
7900 JAMES
CLERK
7698 23-JUL-84
950
30
7902 FORD
ANALYST
7566 05-DEC-83 3000
20
7934 MILLER
CLERK
7782 21-NOV-83 1300
10
14 rows selected.
Como pode ser visto, as duas tabelas tem exatamente a mesma estrutura e o mesmo
contedo.
Tabelas tambm podem ser criadas a partir da juno de outras tabelas.
SQL> CREATE TABLE SALARIOS_DOS_EMPREGADOS
2 (NOME, SALARIO, FAIXA)
3 AS
4 SELECT ENAME, SAL, GRADE
5 FROM
EMP, SALGRADE
6 WHERE
SAL BETWEEN LOSAL AND HISAL
Table created.
SQL> DESCRIBE SALARIOS_DOS_EMPREGADOS
Name
Null? Type
------------------------------- -------- ---NOME
CHAR(10)
SALARIO
NUMBER(7,2)
FAIXA
NUMBER
SQL> SELECT *
2 FROM SALARIOS_DOS_EMPREGADOS
NOME
SALARIO FAIXA
---------- ------- ------SMITH
800
1
ADAMS
1100
1
JAMES
950
1
WARD
1250
2
MARTIN
1250
2
MILLER
1300
2
ALLEN
1600
3
TURNER
1500
3
JONES
2975
4
BLAKE
2850
4
CLARK
2450
4
SCOTT
3000
4
FORD
3000
4
118
KING
5000
14 rows selected.
Para alterar a tabela empregados e garantir todos tenham salrio inferior a 5000:
SQL> ALTER TABLE EMPREGADOS
2 ADD (CHECK(SAL<=5000))
Table altered.
119
DEPTNO
NOME_DA_ESPOSA
14.14 Exerccios
a) Criar as seguintes tabelas:
Tabela: PROJECTS
PROJID
P_DESC
P_START_DATE
NUMBER
CHARACTER
DATE
4
20
120
NOT NULL
P_END_DATE
BUDGET_AMOUNT
MAX_NO_STAFF
DATE
NUMBER
NUMBER
Tabela: ASSIGNMENTS
PROJID
EMPNO
A_START_DATE
A_END_DATE
BILL_RATE
ASSIGN_TYPE
NUMBER
NUMBER
DATE
DATE
NUMBER
CHAR
7,2
2
4
4
NOT NULL
NOT NULL
4,2
2
NUMBER
121
122
TABLE_NAME
TABLE_TYPE COMMENTS
--------------- ----------- -----------------------------------------ASSIGNMENTS
TABLE
ASSIGNMENTS FOR ANY EMPLOYEE ON A PROJECT
PROJECTS
TABLE
UNIQUE PROJECT DETAILS
123
15.2
Quando os novos valores so 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 no haver necessidade de alterar o programa quando uma
nova coluna for adicionada tabela.
Para inserir um novo departamento.
SQL> INSERT INTO DEPARTMENT ( DEPTNO, DNAME, LOC )
2 VALUES (50, 'MARKETING', 'SAN JOSE' )
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.
SQL> INSERT INTO DEPARTMENT ( DEPTNO, DNAME, LOC )
2 VALUES ( 70, NULL, 'DETROIT' )
1 row created.
124
Para os exemplos de insero de valores de data e hora ser criada a tabela Employee a partir
da tabela Emp.
SQL> CREATE TABLE EMPLOYEE
2 AS
3 SELECT *
4 FROM EMP
Table created.
Quando uma data inserida, o formato DD-MON-YY geralmente usado. Com este
formato, o sculo padro o sculo 20 (19xx). O campo data tambm contm informao de
hora, que quando no especificada assume o valor padro de zero horas (00:00:00).
Se for necessrio especificar a data em outro sculo, ou for necessrio especificar a hora, a
funo TO_DATE utilizada.
SQL> INSERT INTO EMPLOYEE
2 ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO )
3 VALUES (
4 7658,
5 'CODD',
6 'ANALYST',
7 7566,
125
Para exemplo de insero de valores a partir de uma outra tabela ser criada a tabela
SALARY_GRADE a partir da tabela SALGRADE.
SQL> CREATE TABLE SALARY_GRADE
2 AS
3 SELECT * FROM SALGRADE
4 WHERE GRADE=0
Table created.
Como no existe nenhum departamento com nmero zero na tabela SALGRADE, no foi
includa nenhuma linha na tabela SALARY_GRADE durante a criao.
SQL> SELECT *
2 FROM SALARY_GRADE
no rows selected
15.3
nome_da_tabela [alis]
coluna, [,coluna...] = {expresso ou sub-consulta}
condio]
126
4 HIREDATE
= SYSDATE,
5 SAL
= SAL*1.1
6 WHERE ENAME = 'SCOTT'
1 row updated.
15.4
127
12 rows deleted.
Apesar de no possuir nenhuma linha, a tabela Employee ainda existe, para elimin-la
utilizado o comando da linguagem de definio de dados (DDL) DROP TABLE.
SQL> DROP TABLE EMPLOYEE
Table dropped.
15.5
Exerccios
a) Inserir as seguintes linhas na tabela PROJECTS
PROJID
P_DESC
P_START_DATE
P_END_DATE
BUDGET_AMOUNT
MAX_NO_STAFF
1
WRITE C030 COURSE
02-JAN-88
07-JAN-88
500
1
2
PROOF READ NOTES
01-JAN-89
10-JAN-89
600
1
1
7369
01-JAN-88
03-JAN-88
50.00
WR
15
1
7902
04-JAN-88
07-JAN-88
55.00
WR
20
128
2
7844
01-JAN-89
10-JAN-89
45.50
PF
30
15.6
129
16.2
COMMIT ou ROLLBACK
comando de DDL
Erros
Falha de mquina
Efetivando as mudanas
Para tornar as mudanas no banco de dados permanentes, elas devem ser efetivadas. O
comando COMMIT utilizado para efetivar as mudanas, e o comando ROLLBACK
utilizado para descartar as mudanas.
Os comandos emitidos entre dois comandos COMMIT definem uma transao.
At que o comando Commit seja executado, as mudanas so vistas apenas pelo usurio que
as efetuou, os demais usurios enxergam a situao anterior as modificaes.
130
16.4
Removendo mudanas
Mudanas no efetivadas podem ser descartadas atravs do comando ROLLBACK.
O comando ROLLBACK retorna os dados ao estado em que se encontrava
aps o ltimo COMMIT.
16.5
Falhas do sistema
Quando uma transao interrompida por um erro, como, por exemplo, uma falha do
sistema, toda a transao descartada (Rolled back). Este procedimento previne que os erros
causem mudanas no desejadas aos dados.
O Rollback automtico mais freqentemente 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 operao no permitida na
tabela de outro usurio, no interrompem uma transao, nem causam um Rollback
automtico, porque estes erros so detectados na fase de 'parse' do comando (quando o
comando lido e verificado), e no durante a fase de execuo.
16.6
16.7
Controlando transaes
Os seguintes comandos SQL so utilizados para controlar uma transao:
16.8
COMMIT [WORK]
SAVEPOINT nome_do_savepoint
ROLLBACK [WORK]
ROLLBACK TO nome_do_savepoint
COMMIT [WORK]
Termina a transao
SAVEPOINT savepoint_name
Permite guardar o trabalho at um determinado ponto, para que mais tarde seja
possvel desfaz-lo totalmente, ou apenas at este determinado ponto.
Fim da transao
Desfaz as alteraes
Se uma nica declarao de DML falha, somente esta transao desfeita. Esta caracterstica
chamada de Rollback a nvel de declarao, e permite que se efetue tanto o Rollback
quanto o Commit das transaes anteriores a transao que falhou.
Se a transao for de DDL, o Commit executado antes da transao no permite o Rollback
das transaes anteriores.
Oracle realiza um Rollback a nvel de declarao atravs da criao de um SavePoint
implcito antes de cada transao de DML. Este SavePoint no acessvel diretamente pelo
usurio.
Quando feito um ROLLBACK TO SAVEPOINT:
mantm o SavePoint at onde foi feito o Rollback, mas perde os SavePoints criados
aps o SavePoint para o qual o Rollback foi feito.
133
DEPTNO DNAME
LOC
------- -------------- ------------10 ACCOUNTING
NEW YORK
20 RESEARCH
DALLAS
30 SALES
CHICAGO
40 OPERATIONS
BOSTON
Para desfazer o erro da ltima declarao, mas sem desfazer a incluso do departamento 50.
SQL> ROLLBACK TO INSERT_DONE
Rollback complete.
135
Rollback complete.
necessrio se garantir uma consistncia de leitura tanto para os usurios que esto
gravando quanto para os usurios que esto lendo do banco de dados. Os usurios que esto
lendo no devem enxergar os dados que esto em processo de alterao. Os usurios que
esto gravando devem enxergar os dados da forma como foram alterados, mesmo que as
mudanas no tenham ainda sido efetivadas.
A finalidade da consistncia de leitura garantir que cada usurio veja os dados da forma
como existiam antes do ltimo Commit.
A consistncia de leitura implementada mantendo-se uma cpia parcial do banco de dados
nos segmentos de Rollback.
136
Quando uma insero, uma atualizao ou uma eliminao feita no banco de dados, o
Oracle faz uma cpia dos dados antes das mudanas, e guarda esta cpia no Segmento de
Rollback.
Todos os usurios que efetuam leituras, exceto aquele que causou as mudanas, enxergam o
banco de dados como ele existia antes das mudanas, atravs da cpia mantida nos
Segmentos de Rollback.
Antes das mudanas serem efetivadas, somente o usurio que modificou os dados enxerga o
banco de dados com as modificaes incorporadas.
Aps a efetivao das mudanas, todos os usurios passam a enxergar os dados com as
mudanas efetuadas, e os Segmentos de Rollback so liberados.
Quando ocorre um Rollback, os dados gravados nos Segmentos de Rollback so escritos de
volta nas tabelas.
16.16 Transaes somente de leitura
Por padro, o modelo de consistncia do Oracle garante que os resultados de um comando
so consistentes. Entretanto, em algumas situaes, pode ser necessrio processar vrias
consultas em dados de vrias tabelas e garantir que os dados so consistentes, ou seja, os
resultados produzidos pela consulta uma tabela so consistentes com os resultados das
consultas a qualquer outra tabela.
A declarao SQL SET TRANSACTION READ ONLY utilizada para iniciar uma
transao de leitura apenas.
A consistncia de leitura que READ ONLY prov implementada da mesma maneira que a
consistncia nvel de declarao - usando segmentos de rollback. Cada declarao por
padro enxerga uma viso consistente dos dados na hora em que a declarao foi feita. Esta
funcionalidade muito til para relatrios que processam mltiplas consultas enquanto os
usurios atualizam as mesmas tabelas.
Notas:
A declarao SET TRANSACTION READ ONLY deve ser a primeira da transao.
Somente consultas so permitidas na transao.
COMMIT, ROLLBACK ou uma declarao DDL terminam a transao. Com DDL
nenhuma indicao dada que a transao terminou.
Durante a transao, todas as consultas se referem ao mesmo instantneo (snapshot)
do banco de dados (mudanas efetivadas antes da transao comear).
Outros usurios podem continuar a atualizar os dados.
Exemplo:
137
138
17.2
Introduo ao bloqueio
Uma das maiores tarefas de um sistema gerenciador de banco de dados (SGBD) controlar a
concorrncia, ou seja, o acesso aos mesmos dados por vrios usurios. Sem um controle
correto de concorrncia os dados podem ser atualizados incorretamente ou fora de
seqncia, comprometendo, portanto, a integridade dos dados.
Oracle resolve os problemas resultantes das atualizaes concorrentes atravs de bloqueios.
Bloqueios de tabelas e linhas so uma parte essencial para manter a consistncia e a
integridade do banco de dados.
Bloqueios so usados para:
proteger os dados
controlar os usurios
Qualquer estratgia de bloqueio deve balancear os objetivos de mxima concorrncia, isto ,
permitir o maior nmero de usurios no sistema, com relao a mxima proteo dos dados.
17.3
O que um bloqueio
O bloqueio o mecanismo que usado para controlar o acesso aos dados em um sistema
multi-usurio, prevenindo que dois usurios atualizem o mesmo dado ao mesmo tempo.
17.4
17.6
Tipos de bloqueios
Nveis de bloqueio
Bloqueio a nvel de tabela - toda a tabela bloqueada.
Bloqueio a nvel de linha - somente as linhas da tabela so bloqueadas.
17.8
Nveis de Bloqueio
Severidade
Pode ser adquirido por mais de um usurio para a mesma
tabela ao mesmo tempo. Permite o compartilhamento do
recurso dependendo da operao.
Pode ser adquirido por apenas um usurio de cada vez. O
primeiro usurio a adquirir um bloqueio exclusivo o
nico que pode atualizar at o bloqueio exclusivo ser
liberado.
Descrio
140
Nvel de Linha
Row Locks (TX)
Nvel de Tabela
Table Locks (TM)
Descrio
- Indica que a transao tem inteno de atualizar linhas
da tabela.
- Adquirido quando um dos comandos SELECT FOR
UPDATE ou LOCK TABLE IN ROW SHARE MODE
executado.
- o menos restritivo dos bloqueios, permitindo o maior
grau de concorrncia para a tabela.
- Permite: consultas, inseres, atualizaes , eliminao e
bloqueio de linhas da mesma tabela.
- No permite: LOCK TABLE IN EXCLUSIVE MODE.
Row Exclusive (RX) - Indica que a transao atualizou uma ou mais linhas da
tabela.
- automaticamente adquirido quando um dos comandos
INSERT, UPDATE, DELETE ou LOCK TABLE IN
ROW EXCLUSIVE MODE executado.
- um pouco mais restritivo do que Row Share.
- Permite: consultas, inseres, atualizaes,, eliminao e
bloqueios de linhas na mesma tabela.
- No permite: LOCK TABLE IN SHARE MODE,
LOCK TABLE IN SHARE EXCLUSIVE MODE e
LOCK TABLE IN EXCLUSIVE MODE.
Share Lock (S)
- ativado pelo comando LOCK TABLE IN SHARE
MODE.
- Permite: consultas, SELECT FOR UPDATE e LOCK
TABLE IN SHARE MODE.
- No permite: INSERT, DELETE, UPDATE, LOCK
TABLE IN SHARE ROW EXCLUSIVE MODE, LOCK
TABLE IN EXCLUSIVE MODE, LOCK TABLE IN
ROW EXCLUSIVE MODE.
Share Row Exclusive - ativado pelo comando LOCK TABLE IN SHARE
(SRX)
ROW EXCLUSIVE MODE.
141
Exclusive (X)
A tabela abaixo indica os modos de bloqueio adquiridos pelos comandos SQL e as operaes
que estes bloqueios permitem e proibem.
DECLARAO SQL
SELECT
INSERT
UPDATE
DELETE
SELECT FOR UPDATE
LOCK TABLE IN ROW SHARE
MODE
LOCK TABLE IN ROW EXCLUSIVE
MODE
LOCK TABLE IN SHARE MODE
LOCK TABLE IN SHARE ROW
EXCLUSIVE MODE
LOCK TABLE IN EXCLUSIVE
MODE
17.9
Modo
de lock
da
tabela
none
RX
RX
RX
RS
RS
RS
RX
SRX X
S
S
S*
S*
S*
S
S
S
S*
S*
S*
S
S
N
N
N
S*
S
S
N
N
N
S*
S
S
N
N
N
N
N
RX
S
SRX
S
S
N
N
Y
N
N
N
N
N
Bloqueios implcitos
Relao dos bloqueios adquiridos automaticamente pelo Oracle:
Comando
SELECT
INSERT
UPDATE
DELETE
SELECT FOR UPDATE
DDL
LINHA
X
X
X
X
-
TABELA
RX
RX
RX
RS
RX
Comando
LOCK TABLE tabela IN ROW SHARE MODE
LOCK TABLE tabela IN ROW EXCLUSIVE MODE
LOCK TABLE tabela IN SHARE MODE
LOCK TABLE tabela IN SHARE EXCLUSIVE MODE
LOCK TABLE tabela IN EXCLUSIVE MODE
Bloqueio
RS
RX
S
SRX
X
ROWID
00004C90.0001.0001
Descrio:
Bloco:
00004C90
Linha do bloco:
0001
Arquivo do banco de dados: 0001
Exemplo:
COLUMN ROWID NEW_VALUE ROW_IDENT
SELECT ENAME, JOB, HIREDATE, SAL, ROWID
FROM EMP
WHERE ENAME = SCOTT
FOR UPDATE OF JOB, HIREDATE, SAL
UPDATE EMP
SET JOB = SALESMAN, HIREDATE = SYSDATE, SAL = 1.1 * SAL
WHERE ROWID = &ROW_IDENT
Transao A:
UPDATE EMP SET SAL = 1200 WHERE ENAME = LEWIS
Transao B:
UPDATE DEPT SET LOC = LONDON WHERE DEPTNO = 20
Transao A:
UPDATE DEPT SET LOC = RICHMOND WHERE DEPTNO = 20
Transao B:
UPDATE EMP SET SAL = 1750 WHERE ENAME = LEWIS
Desta forma:
a transao A s pode prosseguir aps a transao B liberar a linha da tabela DEPT
bloqueada
a transao B s pode prosseguir quando a transao A liberar a linha da tabela
EMP bloqueada
ou seja, temos um caso de DEADLOCK.
Deadlocks podem ocorrer sempre que dois ou mais usurios esto acessando as mesmas
tabelas do banco de dados. Ocorre quando o usurio A est aguardando a liberao de uma
linha bloqueada pelo usurio B, e o usurio B est na mesma situao com relao ao
usurio A.
Esta situao pode ser evitada quando os dois usurios acessando a mesma tabela o fazem na
mesma ordem. Desta forma um segue o outro, no havendo Deadlock.
Quando o acesso feito a mais de uma tabela, deve ser estabelecida uma ordem de acesso s
tabelas para todas as aplicaes. Pode ser criado para isto uma tabela no banco de dados,
com uma identificao nica de sua ordem de acesso. As tabelas de menor ordem so
acessadas primeiro.
TABELA
-----------------EMP
DEPT
SALGRADE
LOCK
---------RS
RS
X
SEQNCIA
-----------------2
1
10
144
Captulo 18 - Vises
18.1
18.2
18.3
18.4
Sintaxe:
CREATE VIEW nome_da_view [(coluna1, coluna2,...)]
AS
SELECT clusula_select
[WITH CHECK OPTION [CONSTRAINT nome_da_restrio]]
Para criar uma viso simples chamada D10EMP, a partir da tabela EMP, contendo certos
detalhes dos funcionrios do departamento 10:
SQL> CREATE VIEW D10EMP
2 AS
3 SELECT EMPNO, ENAME, DEPTNO
4 FROM EMP
5 WHERE DEPTNO = 10
6 WITH CHECK OPTION
View created.
Para criar uma viso complexa, chamada DEPT_SUMMARY, contendo funes de grupo e
dados de mais de uma tabela:
CREATE VIEW DEPT_SUMMARY ( NAME, MINSAL, MAXSAL, AVGSAL )
AS
SELECT DNAME, MIN(SAL), MAX(SAL), AVG(SAL)
FROM EMP, DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO
GROUP BY DNAME
Note que nomes alternativos para as colunas foram especificados na viso, o que necessrio
quando os itens da clusula Select no esto de acordo com as regras para nomes de colunas,
ou se alguma coluna derivada de uma funo ou expresso.
Quando um alis utilizado para o nome da coluna na clusula Select, no necessrio
colocar um nome para a coluna na clusula Create View.
CREATE VIEW DEPT20
AS
SELECT ENAME, SAL*12 ANNSAL
FROM EMP
WHERE DEPTNO = 20
146
18.5
A viso EMP_DETAILS restringe o acesso aos dados do prprio usurio, no perodo das 7
s 17 horas, de segunda a sexta-feira.
SQL> CREATE VIEW EMP_DETAILS
2 AS
3 SELECT EMPNO, ENAME, JOB, DEPTNO
4 FROM EMP
5 WHERE ENAME = USER
6 AND TO_CHAR(SYSDATE,'HH24') BETWEEN 7 AND 17
7 AND TO_CHAR(SYSDATE,'D') BETWEEN 2 AND 6
8 WITH CHECK OPTION
View created.
147
EMP_DATA
EMP_DETAILS
SALES
148
PRODUCT.PRODID,
DESCRIP PRODNA
18.6
18.7
Eliminao de vises
As vises so eliminadas atravs do comando DROP VIEW nome_da_viso.
SQL> DROP VIEW D10EMP
View dropped.
SQL> DROP VIEW EMPLOYEES
View dropped.
SQL> DROP VIEW EMP_DATA
View dropped.
SQL> DROP VIEW EMP_DETAILS
View dropped.
149
18.8
Exerccios
a) Criar uma viso que produza o seguinte resultado.
SQL> SELECT * FROM AGGREGATES
DEPTNO AVERAGE MAXIMUM MINIMUM
SUM NO_SALS NO_COMMS
------- ------- ------- ------- ------- ------- -------10 2916.67 5000 1300 8750
3
0
20 2175 3000
800 10875
5
0
30 1566.67 2850
950 9400
6
4
c) Criar uma viso que garanta as seguintes restries ao se inserir dados na tabela
ASSIGNMENTS:
-
value
value
value
value
value
for
for
for
for
for
id: 1
empno: 7566
start: 01-JAN-89
end: 01-JAN-88
bill_r: 40.00
150
151
18.9
152
Captulo 19 - ndices
19.1
19.2
19.3
19.4
Tipos de ndices
UNIQUE
Garante que os valores especificados para a(s) coluna(s) so nicos.
NON UNIQUE
o padro, usado para melhorar o tempo de acesso.
SINGLE COLUMN
ndice composto de apenas uma coluna.
CONCATENATED
ndice composto de at 16 colunas.
19.5
19.7
*
EMP
ENAME = JONES
No exemplo abaixo o ndice no utilizado porque a coluna ENAME parte de uma funo:
SELECT
FROM
WHERE
*
EMP
UPPER(ENAME) = JONES
*
EMP
HIREDATE+7 = 01-JAN-84
ndices e Junes
Se no existirem ndices nas colunas utilizadas para realizar a juno equivalente, o Oracle
obrigado a realizar uma operao de SORT/MERGE para responder a consulta. Isto significa
que cada tabela ordenada separadamente, e depois as duas so unidas de acordo com a
condio de juno.
19.9
19.10 Exerccios
a) Criar um ndice nico na coluna PROJID da tabela PROJECTS. Teste o ndice inserindo
um valor para PROJID j existente.
b) Criar um ndice no nico na coluna PROJID da tabela ASSIGNMENTS.
c) Consulte o dicionrio de dados para obter as informaes de seus ndices.
155
b) CREATE
ON
INDEX ASG_PROJID
ASSIGNMENTS(PROJID)
c) SELECT *
FROM
USER_INDEXES
156
20.2
O gerador de seqncias
O gerador de seqncias do Oracle utilizado para gerar automaticamente seqncias de
nmeros para as linhas das tabelas.
Para gerar os nmeros seqenciais automaticamente, primeiro a seqncia deve ser definida
utilizando a declarao CREATE SEQUENCE, conforme a sintaxe mostrada abaixo:
CREATE SEQUENCE [esquema.]nome-da-seqncia
[INCREMENTED BY n]
[START WITH n]
[MAXVALUE n | NOMAXVALUE]
[MINVALUE n | NOMINVALUE]
esquema
identificao do dono da seqncia.
nome-da-seqncia
nome vlido para a seqncia.
INCREMENT WITH
incremento positivo ou negativo. Padro: 1.
START WITH
primeiro nmero a ser gerado. Padro: 1.
MINVALUE|NOMINVALUE
menor valor a ser gerado. Padro: 1 para seqncias
ascendentes, 10**27-1 para seqncias descendentes.
MAXVALUE|NOMAXVALUE
maior valor a ser gerado. Padro: 1 para seqncias
descendentes, 10**27-1 para seqncias ascendentes.
Para um usurio poder criar uma seqncia deve possuir o privilgio de resource. O
comando mostrada abaixo cria uma seqncia para a coluna DEPTNO da tabela DEPT.
CREATE SEQUENCE DEPT_SEQ
INCREMENT BY 10
START WITH 10
MAXVALUE 10000
20.1
DEPT_SEQ.NEXTVAL
SYS.DUAL
NEXTVAL
------10
157
SELECT
FROM
DEPT_SEQ.NEXTVAL
SYS.DUAL
NEXTVAL
------20
20.2
Notas:
Somente os nmeros a serem gerados no futuro so alterados pelo comando Alter
Sequence. Os nmeros que j foram gerados no so alterados.
Validaes so realizadas. No pode ser especificado, por exemplo, um novo valor
mximo menor que o valor corrente.
O parmetro START WITH no pode ser alterado pelo comando Alter Sequence.
A seqncia deve ser eliminada e recriada para ser iniciada com um novo nmero.
20.4
20.5
Listando seqncias
As vises USER_SEQUENCES ou ALL_SEQUENCES podem ser utilizadas para descobrir
as seqncias existentes.
160
ENAME
SMITH
ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
SCOTT
KING
TURNER
ADAMS
JAMES
FORD
MILLER
JOB
CLERK
SALESMAN
SALESMAN
MANAGER
SALESMAN
MANAGER
MANAGER
ANALYST
PRESIDENT
SALESMAN
CLERK
CLERK
ANALYST
CLERK
MGR
7902
7698
7698
7839
7698
7839
7839
7566
7698
7788
7698
7566
7782
HIREDATE
13-JUN-83
15-AUG-83
26-MAR-83
31-OCT-83
05-DEC-83
11-JUN-84
14-MAY-84
05-MAR-84
09-JUL-84
04-JUN-84
04-JUN-84
23-JUL-84
05-DEC-83
21-NOV-83
SAL
800
1600
1250
2975
1250
2850
2450
3000
5000
1500
1100
950
3000
1300
DNAME
ACCOUNTING
RESEARCH
SALES
OPERATIONS
LOC
NEW YORK
DALLAS
CHICAGO
BOSTON
LOSAL
700
1201
1401
2001
3001
161
HISAL
1200
1400
2000
3000
9999
COMM
300
50
1400
DEPTNO
20
30
30
20
30
30
10
20
10
30
20
30
20
10
162
163
8.5 EXERCCIOS.............................................................................................................................................................
8.6 RESPOSTAS DOS EXERCCIOS.....................................................................................................................................
CAPTULO 9: CONSULTAS ANINHADAS.....................................................................................................................
9.1 OBJETIVOS DESTE CAPTULO.....................................................................................................................................
9.2 DEFINIO DE CONSULTAS ANINHADAS......................................................................................................................
9.3 CONSULTAS INTERNAS QUE RETORNAM APENAS UM VALOR.........................................................................................
9.4 COMO AS CONSULTAS ANINHADAS SO EXECUTADAS..................................................................................................
9.5 CONSULTAS INTERNAS QUE RETORNAM MAIS DE UM VALOR........................................................................................
9.6 OPERADORES ANY E ALL........................................................................................................................................
9.7 CLUSULA HAVING COM CONSULTAS ANINHADAS....................................................................................................
9.8 ORDENAO EM CONSULTAS ANINHADAS..................................................................................................................
9.9 LIMITE PARA O ANINHAMENTO..................................................................................................................................
9.10 CONSULTA INTERNA CORRELACIONADA...................................................................................................................
9.11 O OPERADOR EXISTS............................................................................................................................................
9.12 EXERCCIOS............................................................................................................................................................
9.13 RESPOSTA DOS EXERCCIOS.....................................................................................................................................
CAPTULO 10: GERAO DE RELATRIOS.............................................................................................................
10.1 OBJETIVOS DESTE CAPTULO...................................................................................................................................
10.2 CONJUNTO DE COMANDOS SET DO SQL*PLUS......................................................................................................
10.3 COLUMN.............................................................................................................................................................
10.3.1 Formato de exibio para as colunas...................................................................................................................
10.3.2 Outras opes de exibio das colunas.................................................................................................................
10.4 EXEMPLO DE FORMATAO DE COLUNAS.................................................................................................................
10.5 EXEMPLO DE FORMATAO DE TTULO....................................................................................................................
10.6 EXEMPLO DE REMOO DA FORMATAO................................................................................................................
CAPTULO 11: GERAO DE RELATRIOS - PARTE 2..........................................................................................
11.1 OBJETIVOS DESTE CAPTULO...................................................................................................................................
11.2 PROPRIEDADES DOS CABEALHOS E DOS RODAPS...................................................................................................
11.3 A CLUSULA NEW_VALUE...................................................................................................................................
11.4 QUEBRAS NOS RELATRIOS.....................................................................................................................................
11.5 CLCULO DE SUMRIOS..........................................................................................................................................
11.6 RELATRIO MATRICIAL............................................................................................................................................
11.7 ARQUIVO DE COMANDOS PARA O SQL*PLUS..........................................................................................................
11.8 EXERCCIOS............................................................................................................................................................
11.9 RESPOSTAS DOS EXERCCIOS....................................................................................................................................
CAPTULO 12: HIERARQUIAS - CAMINHANDO NA RVORE..............................................................................
12.1 OBJETIVOS DESTE CAPTULO...................................................................................................................................
12.2 QUANDO POSSVEL CAMINHAR NA RVORE...........................................................................................................
12.3 EXCLUINDO UM N DA RVORE...............................................................................................................................
12.4 TERMINOLOGIA......................................................................................................................................................
12.5 EXERCCIOS............................................................................................................................................................
CAPTULO 13: DICIONRIO DE DADOS.....................................................................................................................
13.1 OBJETIVOS DESTE CAPTULO...................................................................................................................................
13.2 O QUE O DICIONRIO DE DADOS...........................................................................................................................
13.3 INFORMAES CONTIDAS NO DICIONRIO DE DADOS................................................................................................
13.4 TABELAS DO DICIONRIO DE DADOS........................................................................................................................
13.5 VISES DO DICIONRIO DE DADOS..........................................................................................................................
13.6 EXEMPLOS DE UTILIZAO DO DICIONRIO DE DADOS.............................................................................................
13.7 EXERCCIOS............................................................................................................................................................
CAPTULO 14: LINGUAGEM DE DEFINIO DE DADOS......................................................................................
14.1 OBJETIVOS DESTE CAPTULO...................................................................................................................................
14.2 ESTRUTURA DE DADOS DO ORACLE........................................................................................................................
14.3 CRIANDO UMA TABELA...........................................................................................................................................
14.4 RECOMENDAES SOBRE OS NOMES DAS TABELAS...................................................................................................
14.5 TIPO DE DADO DAS COLUNAS..................................................................................................................................
14.6 RELAO ENTRE OS TIPOS DE DADOS ANSI E DO ORACLE.......................................................................................
14.7 RELAO ENTRE OS TIPOS DE DADOS DO SQL/DS E DO ORACLE.............................................................................
164
165
18.8 EXERCCIOS............................................................................................................................................................
18.9 RESPOSTAS DOS EXERCCIOS....................................................................................................................................
CAPTULO 19 - NDICES..................................................................................................................................................
19.1 OBJETIVOS DESTE CAPTULO...................................................................................................................................
19.2 FINALIDADES DOS NDICES......................................................................................................................................
19.3 ESTRUTURA DOS NDICES........................................................................................................................................
19.4 TIPOS DE NDICES...................................................................................................................................................
19.5 CRIAO DOS NDICES............................................................................................................................................
19.5.1 Criao de um ndice para melhorar o acesso.....................................................................................................
19.5.2 Criao de um ndice para garantir unicidade.....................................................................................................
19.6 ELIMINAO DOS NDICES.......................................................................................................................................
19.7 QUANDO UM NDICE UTILIZADO...........................................................................................................................
19.8 NDICES E JUNES................................................................................................................................................
19.9 SUGESTES PARA CRIAO DOS NDICES..................................................................................................................
19.10 EXERCCIOS..........................................................................................................................................................
19.11 RESPOSTAS DOS EXERCCIOS..................................................................................................................................
CAPTULO 20: SEQNCIAS.........................................................................................................................................
20.1 OBJETIVOS DESTE CAPTULO...................................................................................................................................
20.2 O GERADOR DE SEQNCIAS...................................................................................................................................
20.1 GERAO DE NMEROS SEQENCIAIS COM NEXTVAL............................................................................................
20.1 VALOR ATUAL DA SEQNCIA.................................................................................................................................
20.2 REGRAS PARA UTILIZAR CURRVAL E NEXTVAL...................................................................................................
20.3 ALTERANDO UMA SEQNCIA..................................................................................................................................
20.4 CONCEDENDO PRIVILGIOS EM SEQNCIAS............................................................................................................
20.5 ELIMINANDO UMA SEQNCIA................................................................................................................................
20.6 LISTANDO SEQNCIAS...........................................................................................................................................
APNDICE A - TABELAS DO CURSO............................................................................................................................
166