Escolar Documentos
Profissional Documentos
Cultura Documentos
1.1
1.2
Projeo
Unio
Interseo
Diferena
Produto
Juno
Projeo
Unio
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
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
ENAME
MGR
---------- ------SMITH
7902
ALLEN
7698
WARD
7698
JONES
7839
MARTIN
7698
BLAKE
7839
CLARK
7839
SCOTT
7566
KING
TURNER
7698
ADAMS
7788
JAMES
7698
FORD
7566
MILLER
7782
14 rows selected.
ENAME
---------SMITH
ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
SCOTT
KING
TURNER
ADAMS
JAMES
FORD
MILLER
JOB
MGR HIREDATE
SAL
COMM DEPTNO
--------- ------- --------- ------- ------- ------CLERK
7902 13-JUN-83
800
20
SALESMAN
7698 15-AUG-83
1600
300
30
SALESMAN
7698 26-MAR-84
1250
500
30
MANAGER
7839 31-OCT-83
2975
20
SALESMAN
7698 05-DEC-83
1250
1400
30
MANAGER
7839 11-JUN-84
2850
30
MANAGER
7839 14-MAY-84
2450
10
ANALYST
7566 05-MAR-84
3000
20
PRESIDENT
09-JUL-84
5000
10
SALESMAN
7698 04-JUN-84
1500
0
30
CLERK
7788 04-JUN-84
1100
20
CLERK
7698 23-JUL-84
950
30
ANALYST
7566 05-DEC-83
3000
20
CLERK
7782 21-NOV-83
1300
10
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
12600
ALLEN
22200
WARD
18000
JONES
38700
MARTIN
18000
BLAKE
CLARK
SCOTT
KING
TURNER
ADAMS
JAMES
FORD
MILLER
2.5
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.
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>
SQL>
2
3
4
EMPREGADO
-------------------7369-SMITH
7499-ALLEN
7521-WARD
7566-JONES
7654-MARTIN
7698-BLAKE
7782-CLARK
7788-SCOTT
7839-KING
7844-TURNER
7876-ADAMS
7900-JAMES
7902-FORD
7934-MILLER
'TRABALHANODEPARTAMENTO' DEPTNO
------------------------ ------TRABALHA NO DEPARTAMENTO
20
TRABALHA NO DEPARTAMENTO
30
TRABALHA NO DEPARTAMENTO
30
TRABALHA NO DEPARTAMENTO
20
TRABALHA NO DEPARTAMENTO
30
TRABALHA NO DEPARTAMENTO
30
TRABALHA NO DEPARTAMENTO
10
TRABALHA NO DEPARTAMENTO
20
TRABALHA NO DEPARTAMENTO
10
TRABALHA NO DEPARTAMENTO
30
TRABALHA NO DEPARTAMENTO
20
TRABALHA NO DEPARTAMENTO
30
TRABALHA NO DEPARTAMENTO
20
TRABALHA NO DEPARTAMENTO
10
14 rows selected.
2.8
Se em uma linha no existir valor para uma determinada coluna, este valor dito como
sendo nulo.
Um valor nulo um valor que no est disponvel, desconhecido, ou no aplicvel. Um
valor nulo no o mesmo que zero. Zero um nmero.
Se o valor de qualquer coluna envolvida em uma expresso for nulo, o resultado da
expresso tambm ser nulo. No exemplo abaixo, somente aparecem os salrios anuais dos
vendedores, pois somente estes tem comisso no nula.
SQL> SELECT ENAME, SAL*12+COMM SALARIO_ANUAL
2 FROM EMP
ENAME
SALARIO_ANUAL
---------- ------------SMITH
ALLEN
19500
WARD
15500
JONES
MARTIN
16400
BLAKE
CLARK
SCOTT
KING
TURNER
18000
ADAMS
JAMES
FORD
MILLER
14 rows selected.
Para calcular o resultado corretamente, deve ser utilizada a 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
KING
60000
TURNER
18000
ADAMS
13200
JAMES
11400
FORD
36000
MILLER
15600
14 rows selected.
uma expresso
11
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
20
30
JOB
--------CLERK
MANAGER
PRESIDENT
ANALYST
CLERK
MANAGER
12
30 CLERK
30 MANAGER
30 SALESMAN
JOB
SAL*12 DEPTNO
--------- ------- ------CLERK
13200
20
SALESMAN
19200
30
MANAGER
34200
30
MANAGER
29400
10
ANALYST
36000
20
CLERK
11400
30
MANAGER
35700
20
PRESIDENT
60000
10
SALESMAN
15000
30
CLERK
15600
10
ANALYST
36000
20
CLERK
9600
20
SALESMAN
18000
30
SALESMAN
15000
30
14 rows selected.
JOB
--------CLERK
PRESIDENT
MANAGER
SALESMAN
CLERK
MANAGER
HIREDATE
--------23-JUL-84
09-JUL-84
11-JUN-84
04-JUN-84
04-JUN-84
14-MAY-84
13
WARD
SCOTT
MARTIN
FORD
MILLER
JONES
ALLEN
SMITH
SALESMAN
ANALYST
SALESMAN
ANALYST
CLERK
MANAGER
SALESMAN
CLERK
26-MAR-84
05-MAR-84
05-DEC-83
05-DEC-83
21-NOV-83
31-OCT-83
15-AUG-83
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
------10
10
10
20
20
20
20
20
30
30
30
30
30
30
JOB
--------PRESIDENT
MANAGER
CLERK
ANALYST
ANALYST
MANAGER
CLERK
CLERK
MANAGER
SALESMAN
SALESMAN
SALESMAN
SALESMAN
CLERK
ENAME
---------KING
CLARK
MILLER
SCOTT
FORD
JONES
ADAMS
SMITH
BLAKE
ALLEN
TURNER
WARD
MARTIN
JAMES
Critrios de pesquisa
Os critrios de pesquisa so informados na clusula WHERE, que corresponde ao operador
Restrio da lgebra relacional. Nesta clusula esto estabelecidos os critrios necessrios
para uma linha poder ser selecionada.
A clusula WHERE pode comparar valores em colunas, valores literais, expresses
aritmticas, ou funes. Trs elementos so sempre necessrios:
- Um nome de coluna
- Um operador de comparao
- Um nome de coluna, constante, ou lista de valores
Existem dois tipos de operadores: lgicos e SQL.
Os operadores lgicos testam as seguintes condies:
=
>
>=
<
<=
igual
maior
maior ou igual
menor
menor ou igual
14
<>
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
DEPTNO
---------- ------- --------- ------SMITH
7369 CLERK
20
ADAMS
7876 CLERK
20
JAMES
7900 CLERK
30
MILLER
7934 CLERK
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
Existem quatro operadores SQL, que operam sobre todos os tipos de dados.
BETWEEN...AND...
IN(lista)
LIKE
IS NULL
15
ENAME
SAL
MGR
---------- ------- ------SMITH
800
7902
SCOTT
3000
7566
ADAMS
1100
7788
FORD
3000
7566
Para listar os nomes de todos os empregados que contm exatamente 4 letras, usamos:
SQL> SELECT ENAME
2 FROM EMP
3 WHERE ENAME LIKE '____'
ENAME
---------WARD
KING
FORD
16
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.
JOB
--------CLERK
SALESMAN
SALESMAN
SALESMAN
ANALYST
PRESIDENT
SALESMAN
CLERK
CLERK
ANALYST
CLERK
17
ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
SCOTT
TURNER
ADAMS
JAMES
FORD
MILLER
7698
7698
7839
7698
7839
7839
7566
7698
7788
7698
7566
7782
EMPNO
------7876
7934
ENAME
---------ADAMS
MILLER
JOB
SAL
--------- ------CLERK
1100
CLERK
1300
Para listar os funcionrios que so CLERK, ou que recebem entre 1000 e 2000, usamos:
SQL>
2
3
4
EMPNO
------7369
7499
7521
7654
7844
7876
7900
7934
ENAME
---------SMITH
ALLEN
WARD
MARTIN
TURNER
ADAMS
JAMES
MILLER
JOB
SAL
--------- ------CLERK
800
SALESMAN
1600
SALESMAN
1250
SALESMAN
1250
SALESMAN
1500
CLERK
1100
CLERK
950
CLERK
1300
Quando aparecem tanto ANDs quanto ORs em uma expresso lgica, todos os ANDs so
processados antes que os ORs sejam processados.
18
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>
2
3
4
5
EMPNO
------7499
7521
7566
7654
7698
7782
7844
ENAME
---------ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
TURNER
JOB
SAL DEPTNO
--------- ------- ------SALESMAN
1600
30
SALESMAN
1250
30
MANAGER
2975
20
SALESMAN
1250
30
MANAGER
2850
30
MANAGER
2450
10
SALESMAN
1500
30
Para selecionar todos os vendedores e gerentes com salrio superior a 1500, usamos:
SQL>
2
3
4
EMPNO
------7499
7566
7698
7782
ENAME
---------ALLEN
JONES
BLAKE
CLARK
JOB
SAL DEPTNO
--------- ------- ------SALESMAN
1600
30
MANAGER
2975
20
MANAGER
2850
30
MANAGER
2450
10
19
7698 BLAKE
7782 CLARK
7934 MILLER
MANAGER
MANAGER
CLERK
7839 11-JUN-84
7839 14-MAY-84
7782 21-NOV-83
2850
2450
1300
30
10
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
5
3001
9999
ENAME
---------SMITH
ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
SCOTT
KING
TURNER
ADAMS
JAMES
FORD
MILLER
JOB
MGR HIREDATE
SAL
COMM DEPTNO
--------- ------- --------- ------- ------- ------CLERK
7902 13-JUN-83
800
20
SALESMAN
7698 15-AUG-83
1600
300
30
SALESMAN
7698 26-MAR-84
1250
500
30
MANAGER
7839 31-OCT-83
2975
20
SALESMAN
7698 05-DEC-83
1250
1400
30
MANAGER
7839 11-JUN-84
2850
30
MANAGER
7839 14-MAY-84
2450
10
ANALYST
7566 05-MAR-84
3000
20
PRESIDENT
09-JUL-84
5000
10
SALESMAN
7698 04-JUN-84
1500
0
30
CLERK
7788 04-JUN-84
1100
20
CLERK
7698 23-JUL-84
950
30
ANALYST
7566 05-DEC-83
3000
20
CLERK
7782 21-NOV-83
1300
10
14 rows selected.
DEPTNO
------10
40
20
30
DNAME
-------------ACCOUNTING
OPERATIONS
RESEARCH
SALES
ENAME
---------ADAMS
CLARK
FORD
JONES
KING
MILLER
SCOTT
SMITH
JOB
MGR HIREDATE
SAL
COMM DEPTNO
--------- ------- --------- ------- ------- ------CLERK
7788 04-JUN-84
1100
20
MANAGER
7839 14-MAY-84
2450
10
ANALYST
7566 05-DEC-83
3000
20
MANAGER
7839 31-OCT-83
2975
20
PRESIDENT
09-JUL-84
5000
10
CLERK
7782 21-NOV-83
1300
10
ANALYST
7566 05-MAR-84
3000
20
CLERK
7902 13-JUN-83
800
20
JOB
--------CLERK
CLERK
JOB
SAL
--------- ------CLERK
800
SALESMAN
1600
SALESMAN
1250
MANAGER
2975
SALESMAN
1250
MANAGER
2850
MANAGER
2450
ANALYST
3000
SALESMAN
1500
CLERK
1100
CLERK
950
21
FORD
MILLER
ANALYST
CLERK
3000
1300
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
22
2.16
23
3.2
EMPNO
------7782
7839
7934
3.3
ENAME
SAL
---------- ------CLARK
2450
KING
5000
MILLER
1300
24
4.2
LOWER('CURSODESQL')
-------------------curso de sql
curso de sql
curso de sql
curso de sql
INITCAP(LOC)
-------------------New York
Dallas
Chicago
Boston
25
RPAD(DNAME,20)
-------------------ACCOUNTING
RESEARCH
SALES
OPERATIONS
RPAD(DEPTNO,20,'.')
-------------------10..................
20..................
30..................
40..................
SUBSTR(DNAME,2)
--------------CCOUNTING
ESEARCH
ALES
PERATIONS
SUBSTR(DNAME,3,5)
-------------------COUNT
SEARC
LES
ERATI
26
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
LTRIM(DNAME,'A')
---------------CCOUNTING
RESEARCH
SALES
OPERATIONS
LTRIM(DNAME,'AS')
----------------CCOUNTING
RESEARCH
LES
OPERATIONS
LTRIM(DNAME,'ASOP')
------------------CCOUNTING
RESEARCH
LES
ERATIONS
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
-------------ACCOUNTING
RESEARCH
SALES
OPERATIONS
RTRIM(DNAME,'G')
---------------ACCOUNTIN
RESEARCH
SALES
OPERATIONS
RTRIM(DNAME,'GHS')
-----------------ACCOUNTIN
RESEARC
SALE
OPERATION
RTRIM(DNAME,'N')
---------------ACCOUNTING
RESEARCH
SALES
OPERATIONS
27
TRANSLATE(ENAME,'C','P')
------------------------PLARK
KING
MILLER
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
--------MANAGER
PRESIDENT
CLERK
TRANSLATE(JOB,'AR','IT')
-----------------------------MINIGET
PTESIDENT
CLETK
28
JOB
--------CLERK
SALESMAN
SALESMAN
MANAGER
SALESMAN
MANAGER
MANAGER
ANALYST
PRESIDENT
SALESMAN
CLERK
CLERK
ANALYST
CLERK
REPLACE(JOB,'SALESMAN','VENDEDOR')
---------------------------------------CLERK
VENDEDOR
VENDEDOR
MANAGER
VENDEDOR
MANAGER
MANAGER
ANALYST
PRESIDENT
VENDEDOR
CLERK
CLERK
ANALYST
CLERK
14 rows selected.
REPLACE(ENAME,'CO','PX')
-----------------------SMITH
ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
SPXTT
<-------------KING
TURNER
ADAMS
JAMES
FORD
MILLER
14 rows selected.
29
4.3
Funes numricas
4.3.1 ROUND(coluna | literal, n)
Arredonda o valor da coluna ou do literal na n-sima casa decimal. Se n for negativo
eqivale s dezenas. Se n for omitido eqivale a um nmero inteiro.
SQL> SELECT ROUND(45.923,1), ROUND(45.923), ROUND(42.323,-1),
ROUND(SAL/32,2)
2 FROM EMP
3 WHERE DEPTNO = 10
ROUND(45.923,1)
ROUND(45.923) ROUND(42.323,-1)
ROUND(SAL/32,2)
----------------- ----------------- ----------------- ----------------45.9
46
40
76.56
45.9
46
40
156.25
45.9
46
40
40.63
30
31
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
32
SQL>
2
3
4
SAL
COMM
MOD(SAL,COMM)
MOD(100,40)
----------------- ----------------- ----------------- ----------------1500
0
1500
20
1600
300
100
20
1250
500
250
20
1250
1400
1250
20
2850
20
950
20
COS(60*3.1
---------.5
TAN(45*3.1
---------1
4.4
COSH(0)
------1
TANH(.5)
---------.462117157
Exerccios
a) Listar o nmero do departamento, o nome do funcionrio, e o salrio com aumento de
15% expresso em nmero inteiro.
DEPTNO
----------------20
30
30
20
30
30
10
20
10
30
20
30
20
10
ENAME
PCTSAL
---------- ----------------SMITH
920
ALLEN
1840
WARD
1438
JONES
3421
MARTIN
1438
BLAKE
3278
CLARK
2818
SCOTT
3450
KING
5750
TURNER
1725
ADAMS
1265
JAMES
1093
FORD
3450
MILLER
1495
33
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
---------SMITH
ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
SCOTT
KING
TURNER
ADAMS
JAMES
FORD
MILLER
CODIGO
-------CL36S530
SA49A450
SA52W630
MA56J520
SA65M635
MA69B420
MA78C462
AN78S300
PR83K520
SA84T656
CL87A352
CL90J520
AN90F630
CL93M460
d) Faa uma procura no sensitiva a letras maisculas ou minsculas por um cargo fornecido
pelo usurio.
EMPNO
----7369
7876
7900
7934
ENAME
---------SMITH
ADAMS
JAMES
MILLER
JOB
MGR HIREDATE
SAL COMM DEPTNO
--------- ----- --------- ----- ----- -----CLERK
7902 13-JUN-83
800
20
CLERK
7788 04-JUN-84 1100
20
CLERK
7698 23-JUL-84
950
30
CLERK
7782 21-NOV-83 1300
10
34
f) Encontrar a primeira ocorrncia da letra "L" nos nomes dos empregados e substituir pela
letra "X".
ENAME
---------SMITH
ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
SCOTT
KING
TURNER
ADAMS
JAMES
FORD
MILLER
PRIMEIRA_OCORRENCIA_
-------------------SMITH
AXLEN
WARD
JONES
MARTIN
BXAKE
CXARK
SCOTT
KING
TURNER
ADAMS
JAMES
FORD
MIXLER
14 rows selected.
35
4.5
SELECT ENAME,
TRANSLATE(SUBSTR(ENAME,1,INSTR(ENAME,'L')),'L','X')||
SUBSTR(ENAME,INSTR(ENAME,'L')+1) PRIMEIRA_OCORRENCIA_DE_L
FROM EMP
36
5.2
HIREDATE+7
---------20-JUN-83
18-JUN-84
11-JUN-84
11-JUN-84
HIREDATE-7
---------06-JUN-83
04-JUN-84
28-MAY-84
28-MAY-84
SYSDATE-HIREDATE
----------------4152.351851851852
3788.351851851852
3795.351851851852
3795.351851851852
SELECT MONTHS_BETWEEN(SYSDATE,HIREDATE),
MONTHS_BETWEEN('01-JAN-84','05-NOV-88')
FROM EMP
WHERE MONTHS_BETWEEN(SYSDATE,HIREDATE) > 59
37
MONTHS_BETWEEN(SYSDATE,HIREDATE) MONTHS_BETWEEN('01-JAN-84','05-NOV-88'
-------------------------------- -------------------------------------136.3985293458781
-58.1290322580645
134.3340132168459
-58.1290322580645
126.9791745071685
-58.1290322580645
131.8178841845878
-58.1290322580645
130.6565938620072
-58.1290322580645
124.4630454749104
-58.1290322580645
125.366271281362
-58.1290322580645
127.6565938620072
-58.1290322580645
123.5275616039427
-58.1290322580645
124.6888519265233
-58.1290322580645
124.6888519265233
-58.1290322580645
123.0759487007168
-58.1290322580645
130.6565938620072
-58.1290322580645
131.1404648297491
-58.1290322580645
14 rows selected.
ADD_MONTHS(HIREDATE,3)
---------------------13-SEP-83
31-JAN-84
05-JUN-84
04-SEP-84
05-MAR-84
ADD_MONTHS(HIREDATE,-3)
----------------------13-MAR-83
31-JUL-83
05-DEC-83
04-MAR-84
05-SEP-83
NEXT_DAY(HIREDATE,'FRIDAY')
--------------------------18-MAY-84
13-JUL-84
25-NOV-83
NEXT_DAY(HIREDATE,6)
-------------------18-MAY-84
13-JUL-84
25-NOV-83
5.2.6 LAST_DAY(data)
Retorna a data do ltimo dia do ms da data especificada.
SQL>
2
3
4
38
SYSDATE
--------25-OCT-94
25-OCT-94
25-OCT-94
25-OCT-94
25-OCT-94
LAST_DAY
(SYSDATE)
---------31-OCT-94
31-OCT-94
31-OCT-94
31-OCT-94
31-OCT-94
HIREDATE
--------13-JUN-83
31-OCT-83
05-MAR-84
04-JUN-84
05-DEC-83
LAST_DAY
(HIREDATE)
---------30-JUN-83
31-OCT-83
31-MAR-84
30-JUN-84
31-DEC-83
LAST_DAY
('15-FEB-88')
------------29-FEB-88
29-FEB-88
29-FEB-88
29-FEB-88
29-FEB-88
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
5.3.1 Formatos de Data
Formato
CC ou SCC
YYYY ou SYYYY
YYY, YY, Y
Significado
Sculo; S prefixa datas Antes de Cristo com "-"
Ano; S prefixa datas Antes de Cristo com "-"
ltimos 3,2,1 dgitos do ano
39
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
mostrar resultados zero como espaos, no
como 0.
41
Exemplo
999999
099999
$99999
999999.99
999,999
099999MI
999999PR
99.999EEEE
9999V99
B9999.99
1234
001234
$1234
1234.00
1,234
1234(1234)
1.234E+03
123400
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
----7499
7566
7698
7782
7788
7839
7902
ENAME
---------ALLEN
JONES
BLAKE
CLARK
SCOTT
KING
FORD
JOB
SAL
--------- ------SALESMAN
1600
MANAGER
2975
MANAGER
2850
MANAGER
2450
ANALYST
3000
PRESIDENT
5000
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
----7844
7876
5.4
ENAME
---------TURNER
ADAMS
HIREDATE
--------04-JUN-84
04-JUN-84
Notas:
42
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
DECODED_JOB
----------WORKER
UNDEFINED
UNDEFINED
BOSS
UNDEFINED
BOSS
BOSS
UNDEFINED
UNDEFINED
UNDEFINED
WORKER
WORKER
UNDEFINED
WORKER
BONUS
----15%
10%
8%
5%
5%
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
43
JOB
SAL SALARIO_DECODIFICADO
--------- ------- -------------------CLERK
800
920
SALESMAN
1600
1600
SALESMAN
1250
1250
MANAGER
2975
2826.25
SALESMAN
1250
1250
MANAGER
2850
2707.5
MANAGER
2450
2327.5
ANALYST
3000
3300
PRESIDENT
5000
5000
SALESMAN
1500
1500
CLERK
1100
1265
CLERK
950
1092.5
ANALYST
3000
3300
CLERK
1300
1495
14 rows selected.
44
1000
1000
1000
1000
1000
1000
300
500
1250
0
5.4.5 VSIZE(coluna|valor)
Retorna o nmero de bytes utilizado internamente pelo Oracle para representar o valor.
SQL>
2
3
4
DEPTNO
VSIZE(DEPTNO) VSIZE(HIREDATE)
VSIZE(SAL)
VSIZE(ENAME)
------- --------------- --------------- --------------- --------------10
2
7
3
5
10
2
7
2
4
10
2
7
2
6
SELECT SYSDATE,
TO_CHAR(NEXT_DAY(ADD_MONTHS(SYSDATE,2),'FRIDAY'),
'Day dd Month YYYY')
FROM SYS.DUAL
SYSDATE
TO_CHAR(NEXT_DAY(ADD_MONTHS(SYSDATE,2),'FRIDAY'),'DAYDDMONTHYYYY')
--------- -------------------------------------------------------25-OCT-94 Friday
30 December 1994
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.
ENAME
---------SMITH
JONES
SCOTT
ADAMS
FORD
DATA_DE_ADMISSAO
--------------------------June, Thirteenth 1983
October, Thirty-First 1983
March, Fifth 1984
June, Fourth 1984
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
45
---------SMITH
ALLEN
JONES
MILLER
MARTIN
FORD
SCOTT
WARD
CLARK
TURNER
ADAMS
BLAKE
KING
JAMES
--------13-JUN-83
15-AUG-83
31-OCT-83
21-NOV-83
05-DEC-83
05-DEC-83
05-MAR-84
26-MAR-84
14-MAY-84
04-JUN-84
04-JUN-84
11-JUN-84
09-JUL-84
23-JUL-84
--------13-JUN-84
15-AUG-84
31-OCT-84
21-NOV-84
05-DEC-84
05-DEC-84
05-MAR-85
26-MAR-85
14-MAY-85
04-JUN-85
04-JUN-85
11-JUN-85
09-JUL-85
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
---------ADAMS
ALLEN
BLAKE
CLARK
FORD
JAMES
JONES
KING
MARTIN
MILLER
SCOTT
SMITH
TURNER
WARD
SALARIO
-------------ABAIXO DE 1500
1600
2850
2450
3000
ABAIXO DE 1500
2975
5000
ABAIXO DE 1500
ABAIXO DE 1500
3000
ABAIXO DE 1500
NO LIMITE
ABAIXO DE 1500
d) Escreva uma consulta que retorne o dia da semana para qualquer data entrada no formato
DD.MM.YY.
DIA
-------SATURDAY
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
46
HIREDATE
--------13-JUN-83
15-AUG-83
31-OCT-83
21-NOV-83
05-DEC-83
05-DEC-83
05-MAR-84
26-MAR-84
14-MAY-84
04-JUN-84
04-JUN-84
11-JUN-84
09-JUL-84
23-JUL-84
DIA_DO_PAGAMENTO
---------------24-JUN-83
26-AUG-83
25-NOV-83
30-DEC-83
30-DEC-83
30-DEC-83
30-MAR-84
27-APR-84
25-MAY-84
29-JUN-84
29-JUN-84
29-JUN-84
27-JUL-84
31-AUG-84
14 rows selected.
47
5.6
48
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.
49
Uma funo de grupo pode ser aplicada sobre um subconjunto das linhas usando a clusula
WHERE.
Para encontrar o salrio mnimo recebido por um CLERK:
SQL> SELECT MIN(SAL)
2 FROM EMP
3 WHERE JOB='CLERK'
MIN(SAL)
----------------800
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
JOB
AVG(SAL)
--------- ----------------ANALYST
3000
CLERK
1037.5
50
PRESIDENT
SALESMAN
6.6
5000
1400
JOB
AVG(SAL)
--------- ----------------CLERK
1300
MANAGER
2450
PRESIDENT
5000
ANALYST
3000
CLERK
950
MANAGER
2975
CLERK
950
MANAGER
2850
SALESMAN
1400
9 rows selected.
6.7
JOB
--------ANALYST
CLERK
MANAGER
PRESIDENT
SALESMAN
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>
2
3
4
JOB
MAX(SAL)
--------- ----------------ANALYST
3000
PRESIDENT
5000
52
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>
2
3
4
DEPTNO
AVG(SAL)
----------------- ----------------10 2916.666666666667
20
2175
JOB
AVG(SAL)
--------- ----------------ANALYST
3000
CLERK
1037.5
PRESIDENT
5000
6.9
lista_de_colunas
lista_de_tabelas
condies_de_linha
lista_de_colunas
53
HAVING
condies_de_grupo
ORDER BY 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
DEPTNO
COUNT(*)
----------------- ----------------20
5
30
6
55
6.11
f)
SQL> SELECT MAX(SAL)-MIN(SAL) DIFERENCA
2 FROM EMP
g)
SQL>
2
3
4
h)
SQL>
2
3
4
SELECT EMPNO
FROM EMP
GROUP BY EMPNO
HAVING COUNT(*) > 1
i)
SQL>
2
3
4
5
56
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
---------CLARK
KING
MILLER
SMITH
ADAMS
FORD
SCOTT
JONES
ALLEN
BLAKE
MARTIN
JAMES
TURNER
WARD
JOB
--------MANAGER
PRESIDENT
CLERK
CLERK
CLERK
ANALYST
ANALYST
MANAGER
SALESMAN
MANAGER
SALESMAN
CLERK
SALESMAN
SALESMAN
DNAME
-------------ACCOUNTING
ACCOUNTING
ACCOUNTING
RESEARCH
RESEARCH
RESEARCH
RESEARCH
RESEARCH
SALES
SALES
SALES
SALES
SALES
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
57
4 ORDER BY DEPT.DEPTNO
DEPTNO ENAME
JOB
------- ---------- --------10 CLARK
MANAGER
10 KING
PRESIDENT
10 MILLER
CLERK
20 SMITH
CLERK
20 ADAMS
CLERK
20 FORD
ANALYST
20 SCOTT
ANALYST
20 JONES
MANAGER
30 ALLEN
SALESMAN
30 BLAKE
MANAGER
30 MARTIN
SALESMAN
30 JAMES
CLERK
30 TURNER
SALESMAN
30 WARD
SALESMAN
DNAME
-------------ACCOUNTING
ACCOUNTING
ACCOUNTING
RESEARCH
RESEARCH
RESEARCH
RESEARCH
RESEARCH
SALES
SALES
SALES
SALES
SALES
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>
2
3
4
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
O relacionamento entre as tabelas EMP e SALGRADE formam uma juno no equivalente,
uma vez que no existe nenhuma coluna comum s duas tabelas. No exemplo, a funo
BETWEEN ... AND ... faz o relacionamento entre as duas tabelas.
58
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
---------CLARK
KING
MILLER
SMITH
ADAMS
FORD
SCOTT
JONES
ALLEN
BLAKE
MARTIN
JAMES
TURNER
DNAME
-------------ACCOUNTING
ACCOUNTING
ACCOUNTING
RESEARCH
RESEARCH
RESEARCH
RESEARCH
RESEARCH
SALES
SALES
SALES
SALES
SALES
59
WARD
SALES
14 rows selected.
c) Listar o nome, o local de trabalho e o departamento dos empregados com salrio superior
a 1500.
ENAME
---------CLARK
KING
JONES
SCOTT
FORD
ALLEN
BLAKE
LOCAL
------------NEW YORK
NEW YORK
DALLAS
DALLAS
DALLAS
CHICAGO
CHICAGO
DNAME
-------------ACCOUNTING
ACCOUNTING
RESEARCH
RESEARCH
RESEARCH
SALES
SALES
7 rows selected.
JOB
SAL
GRADE
--------- ------- ------CLERK
800
1
CLERK
1100
1
CLERK
950
1
SALESMAN
1250
2
SALESMAN
1250
2
CLERK
1300
2
SALESMAN
1600
3
SALESMAN
1500
3
MANAGER
2975
4
MANAGER
2850
4
MANAGER
2450
4
ANALYST
3000
4
ANALYST
3000
4
PRESIDENT
5000
5
14 rows selected.
60
JOB
SAL
GRADE
--------- ------- ------SALESMAN
1600
3
SALESMAN
1500
3
JOB
SAL
GRADE DNAME
--------- ------- ------- -------------PRESIDENT
5000
5 ACCOUNTING
ANALYST
3000
4 RESEARCH
ANALYST
3000
4 RESEARCH
MANAGER
2975
4 RESEARCH
MANAGER
2850
4 SALES
MANAGER
2450
4 ACCOUNTING
SALESMAN
1600
3 SALES
SALESMAN
1500
3 SALES
SALESMAN
1250
2 SALES
SALESMAN
1250
2 SALES
10 rows selected.
h) Listar os seguintes detalhes para os empregados que ganham 36.000 por ano ou que so
Clerks.
ENAME
---------MILLER
SMITH
ADAMS
JAMES
JOB
SALARIO_ANUAL DEPTNO DNAME
GRADE
--------- ------------- ------- -------------- ------CLERK
15600
10 ACCOUNTING
2
CLERK
9600
20 RESEARCH
1
CLERK
13200
20 RESEARCH
1
CLERK
11400
30 SALES
1
61
7.8
d)
SQL> SELECT ENAME, JOB, SAL, GRADE
2 FROM EMP, SALGRADE
3 WHERE SAL BETWEEN LOSAL AND HISAL
e)
SQL> SELECT ENAME, JOB, SAL, GRADE
2 FROM EMP, SALGRADE
3 WHERE SAL BETWEEN LOSAL AND HISAL AND GRADE = 3
f)
SQL>
2
3
4
g)
SQL>
2
3
4
5
6
h)
SQL>
2
3
4
5
6
7
62
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>
2
3
4
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
63
4 WHERE E.MGR =
EMP_NOME
EMP_SAL
---------- ------ALLEN
1600
WARD
1250
JAMES
950
TURNER
1500
MARTIN
1250
MILLER
1300
ADAMS
1100
JONES
2975
CLARK
2450
BLAKE
2850
SMITH
800
11 rows selected.
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>
2
3
4
5
6
7
SELECT JOB
FROM EMP
WHERE DEPTNO = 10
UNION
SELECT JOB
FROM EMP
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>
2
3
4
5
6
7
SELECT JOB
FROM EMP
WHERE DEPTNO = 10
INTERSECT
SELECT JOB
FROM EMP
WHERE DEPTNO = 30
64
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>
2
3
4
5
6
7
SELECT JOB
FROM EMP
WHERE DEPTNO = 10
MINUS
SELECT JOB
FROM EMP
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
ENAME
GER_NUM GER_NOME
---------- ------- ---------SCOTT
7566 JONES
FORD
7566 JONES
ALLEN
7698 BLAKE
WARD
7698 BLAKE
JAMES
7698 BLAKE
TURNER
7698 BLAKE
MARTIN
7698 BLAKE
MILLER
7782 CLARK
ADAMS
7788 SCOTT
JONES
7839 KING
CLARK
7839 KING
BLAKE
7839 KING
SMITH
7902 FORD
13 rows selected.
ENAME
GER_NUM GER_NOME
---------- ------- ---------SCOTT
7566 JONES
FORD
7566 JONES
ALLEN
7698 BLAKE
WARD
7698 BLAKE
JAMES
7698 BLAKE
TURNER
7698 BLAKE
MARTIN
7698 BLAKE
MILLER
7782 CLARK
ADAMS
7788 SCOTT
JONES
7839 KING
CLARK
7839 KING
BLAKE
7839 KING
SMITH
7902 FORD
KING
66
14 rows selected.
HIREDATE
--------15-AUG-83
26-MAR-84
04-JUN-84
05-DEC-83
21-NOV-83
31-OCT-83
14-MAY-84
11-JUN-84
13-JUN-83
GERENTE
---------BLAKE
BLAKE
BLAKE
BLAKE
CLARK
KING
KING
KING
FORD
HIREDATE
--------11-JUN-84
11-JUN-84
11-JUN-84
11-JUN-84
14-MAY-84
09-JUL-84
09-JUL-84
09-JUL-84
05-DEC-83
9 rows selected.
67
8.6
b)
SQL>
2
3
4
c)
SQL>
2
3
4
d)
SQL>
2
3
4
5
6
7
SELECT JOB
FROM EMP
WHERE HIREDATE BETWEEN '01-JAN-83' AND '30-JUN-83'
INTERSECT
SELECT JOB
FROM EMP
WHERE HIREDATE BETWEEN '01-JAN-84' AND '30-JUN-84'
e)
SQL>
2
3
4
f)
SQL>
2
3
4
5
6
68
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 =, <,
>, <=, >=, <>.
69
9.4
JOB
--------MANAGER
MANAGER
MANAGER
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>
2
3
4
ENAME
SAL DEPTNO
---------- ------- ------SMITH
800
20
JAMES
950
30
MILLER
1300
10
70
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
ENAME
SAL JOB
DEPTNO
---------- ------- --------- ------KING
5000 PRESIDENT
10
SCOTT
3000 ANALYST
20
FORD
3000 ANALYST
20
JONES
2975 MANAGER
20
BLAKE
2850 MANAGER
30
71
CLARK
ALLEN
TURNER
MILLER
WARD
MARTIN
ADAMS
2450
1600
1500
1300
1250
1250
1100
MANAGER
SALESMAN
SALESMAN
CLERK
SALESMAN
SALESMAN
CLERK
10
30
30
10
30
30
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>
2
3
4
5
ENAME
SAL JOB
DEPTNO
---------- ------- --------- ------KING
5000 PRESIDENT
10
SCOTT
3000 ANALYST
20
FORD
3000 ANALYST
20
JONES
2975 MANAGER
20
DEPTNO AVG(SAL)
------- -------10 2916.67
20
2175
JOB
AVG(SAL)
--------- -------PRESIDENT
5000
72
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>
2
3
4
5
EMPNO
------7839
7566
7788
7902
7499
ENAME
SAL DEPTNO
---------- ------- ------KING
5000
10
JONES
2975
20
SCOTT
3000
20
FORD
3000
20
ALLEN
1600
30
73
7698 BLAKE
2850
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>
2
3
4
5
EMPNO
------7566
7698
7782
7788
7839
7902
ENAME
---------JONES
BLAKE
CLARK
SCOTT
KING
FORD
JOB
DEPTNO
--------- ------MANAGER
20
MANAGER
30
MANAGER
10
ANALYST
20
PRESIDENT
10
ANALYST
20
6 rows selected.
74
no rows selected
DEPTNO DNAME
------- -------------40 OPERATIONS
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
---------KING
SCOTT
FORD
JONES
ALLEN
MILLER
JOB
SAL
--------- ------PRESIDENT
5000
ANALYST
3000
ANALYST
3000
MANAGER
2975
SALESMAN
1600
CLERK
1300
b) Listar os empregados com os menores salrio por cargo, em ordem ascendente de salrio.
ENAME
---------SMITH
WARD
MARTIN
CLARK
SCOTT
FORD
KING
JOB
SAL
--------- ------CLERK
800
SALESMAN
1250
SALESMAN
1250
MANAGER
2450
ANALYST
3000
ANALYST
3000
PRESIDENT
5000
7 rows selected.
ENAME
---------ADAMS
KING
JAMES
HIREDATE
--------04-JUN-84
09-JUL-84
23-JUL-84
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
75
SCOTT
FORD
ALLEN
BLAKE
3000
3000
1600
2850
20
20
30
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
---------ADAMS
ALLEN
BLAKE
CLARK
FORD
JAMES
JONES
KING
MARTIN
MILLER
SCOTT
HIREDATE MAIOR_DATA
--------- ---------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
76
SMITH
TURNER
WARD
13-JUN-83
04-JUN-84
26-MAR-84
14 rows selected.
77
9.13
b)
SQL>
2
3
4
5
c)
SQL>
2
3
4
5
d)
SQL>
2
3
4
5
e)
SQL>
2
3
4
f)
SQL>
SQL>
2
3
4
5
old
new
old
new
old
new
g)
SQL> SELECT ENAME, SAL
2 FROM EMP E
3 WHERE 3 > (SELECT COUNT(*) FROM EMP WHERE E.SAL < SAL)
h)
SQL>
SQL>
SQL>
2
3
4
5
6
7
78
GROUP BY TO_CHAR(HIREDATE,'YYYY'))
i)
SQL>
SQL>
SQL>
SQL>
2
3
4
5
6
7
8
j)
SQL>
2
3
4
5
6
7
79
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.
10.4
SQL>
SQL>
SQL>
SQL>
SQL>
SQL>
COLUMN
COLUMN
COLUMN
COLUMN
COLUMN
COLUMN
10.5
Num.
Salario
Remuneracao
Cargo Emp.
Mensal
Comissao
Total
--------- ----- ---------- ---------- ----------CLERK
7369
800.00 Sem com.
9,600.00
SALESMAN
7499
1,600.00
300.00
19,500.00
SALESMAN
7521
1,250.00
500.00
15,500.00
MANAGER
7566
2,975.00 Sem com.
35,700.00
SALESMAN
7654
1,250.00
1,400.00
16,400.00
MANAGER
7698
2,850.00 Sem com.
34,200.00
MANAGER
7782
2,450.00 Sem com.
29,400.00
ANALYST
7788
3,000.00 Sem com.
36,000.00
PRESIDENT 7839
5,000.00 Sem com.
60,000.00
SALESMAN
7844
1,500.00
0.00
18,000.00
CLERK
7876
1,100.00 Sem com.
13,200.00
CLERK
7900
950.00 Sem com.
11,400.00
ANALYST
7902
3,000.00 Sem com.
36,000.00
CLERK
7934
1,300.00 Sem com.
15,600.00
BTITLE 'ttulo'
TTITLE OFF
BTITLE OFF
page
RELATORIO DA EMPRESA
Produzido pelo DP
Dept.
----020
030
030
020
030
030
010
020
010
030
020
030
020
Num.
Salario
Remuneracao
Cargo Emp.
Mensal
Comissao
Total
--------- ----- ---------- ---------- ----------CLERK
7369
800.00 Sem com.
9,600.00
SALESMAN
7499
1,600.00
300.00
19,500.00
SALESMAN
7521
1,250.00
500.00
15,500.00
MANAGER
7566
2,975.00 Sem com.
35,700.00
SALESMAN
7654
1,250.00
1,400.00
16,400.00
MANAGER
7698
2,850.00 Sem com.
34,200.00
MANAGER
7782
2,450.00 Sem com.
29,400.00
ANALYST
7788
3,000.00 Sem com.
36,000.00
PRESIDENT 7839
5,000.00 Sem com.
60,000.00
SALESMAN
7844
1,500.00
0.00
18,000.00
CLERK
7876
1,100.00 Sem com.
13,200.00
CLERK
7900
950.00 Sem com.
11,400.00
ANALYST
7902
3,000.00 Sem com.
36,000.00
82
010 CLERK
7934
15,600.00
10.6
JOB
EMPNO
SAL
COMM
REM
--------- ------- ------- ------- ------CLERK
7369
800
9600
SALESMAN
7499
1600
300
19500
SALESMAN
7521
1250
500
15500
MANAGER
7566
2975
35700
SALESMAN
7654
1250
1400
16400
MANAGER
7698
2850
34200
MANAGER
7782
2450
29400
ANALYST
7788
3000
36000
PRESIDENT
7839
5000
60000
SALESMAN
7844
1500
0
18000
CLERK
7876
1100
13200
CLERK
7900
950
11400
ANALYST
7902
3000
36000
CLERK
7934
1300
15600
14 rows selected.
83
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
84
0001
ENAME
---------ALLEN
WARD
MARTIN
TURNER
JOB
SAL
COMM
--------- ------- ------SALESMAN
1600
300
SALESMAN
1250
500
SALESMAN
1250
1400
SALESMAN
1500
0
FIM DO RELATORIO
----------------
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
Usuario: ALUNO1
Pagina:
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.
85
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>
2
3
4
old
new
SELECT JOB
FROM EMP
GROUP BY JOB
HAVING AVG(SAL) = &MAIOR_SALARIO_MEDIO
4: HAVING AVG(SAL) = &MAIOR_SALARIO_MEDIO
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
86
page
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
CLERK
MANAGER
030 CLERK
MANAGER
SALESMAN
7788
7902
7369
7876
7566
3,000.00
3,000.00
800.00
1,100.00
2,975.00
Sem
Sem
Sem
Sem
Sem
Com.
Com.
Com.
Com.
Com.
7900
7698
7499
7654
7844
7521
36,000.00
36,000.00
9,600.00
13,200.00
35,700.00
11,400.00
34,200.00
19,500.00
16,400.00
18,000.00
15,500.00
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]
MAX[IMUM]
MIN[IMUM]
NUM[BER]
Descrio
calcula a mdia
conta os valores no nulos
valor mximo
valor mnimo
nmero de linhas
87
Tipo da coluna
nmero
qualquer
nmero ou caracter
nmero ou caracter
qualquer
STD
SUM
VAR[IANCE]
desvio padro
soma os valores no nulos
calcula a varincia
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
Relatorio da Companhia
Produzido pelo Departamento Pessoal
Emp.
Salario
Dept.
Cargo Num.
Mensal
------ --------- ----- ----------00010 CLERK
7934
1,300.00
MANAGER
7782
2,450.00
PRESIDENT 7839
5,000.00
****** *********
----------avg
2,916.67
sum
8,750.00
00020 ANALYST
CLERK
MANAGER
7788
7902
7369
7876
7566
3,000.00
3,000.00
800.00
1,100.00
2,975.00
COMISSAO
Remuneracao
Y-T-D
Total
----------- ------------Sem Com.
15,600.00
Sem Com.
29,400.00
Sem Com.
60,000.00
----------0.00
Sem
Sem
Sem
Sem
Sem
88
Com.
Com.
Com.
Com.
Com.
36,000.00
36,000.00
9,600.00
13,200.00
35,700.00
****** *********
avg
sum
00030 CLERK
MANAGER
SALESMAN
----------- ----------2,175.00
10,875.00
0.00
7900
7698
7499
7654
7844
7521
****** *********
avg
sum
avg
sum
----------- ----------2,073.21
550.00
29,025.00
2,200.00
11,400.00
34,200.00
19,500.00
16,400.00
18,000.00
15,500.00
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
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
89
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.
SELECT JOB,
DECODE(DEPTNO, 10, SAL, 0) D10,
DECODE(DEPTNO, 20, SAL, 0) D20,
DECODE(DEPTNO, 30, SAL, 0) D30
FROM EMP
JOB
D10
D20
D30
--------- ------- ------- ------CLERK
0
800
0
SALESMAN
0
0
1600
SALESMAN
0
0
1250
MANAGER
0
2975
0
SALESMAN
0
0
1250
MANAGER
0
0
2850
MANAGER
2450
0
0
ANALYST
0
3000
0
PRESIDENT
5000
0
0
SALESMAN
0
0
1500
CLERK
0
1100
0
CLERK
0
0
950
ANALYST
0
3000
0
CLERK
1300
0
0
14 rows selected.
SELECT JOB,
SUM(DECODE(DEPTNO, 10, SAL, 0)) D10,
SUM(DECODE(DEPTNO, 20, SAL, 0)) D20,
SUM(DECODE(DEPTNO, 30, SAL, 0)) D30
FROM EMP
GROUP BY JOB
JOB
D10
D20
D30
--------- ------- ------- ------ANALYST
0
6000
0
CLERK
1300
1900
950
MANAGER
2450
2975
2850
PRESIDENT
5000
0
0
SALESMAN
0
0
5600
SQL>
2
3
4
5
6
7
SELECT JOB,
SUM(DECODE(DEPTNO, 10, SAL, 0)) D10,
SUM(DECODE(DEPTNO, 20, SAL, 0)) D20,
SUM(DECODE(DEPTNO, 30, SAL, 0)) D30,
SUM(SAL) TBJ
FROM EMP
GROUP BY JOB
JOB
D10
D20
D30
TBJ
--------- ------- ------- ------- ------ANALYST
0
6000
0
6000
CLERK
1300
1900
950
4150
MANAGER
2450
2975
2850
8275
PRESIDENT
5000
0
0
5000
SALESMAN
0
0
5600
5600
SET PAGES 16
COLUMN D10 HEADING 'Departamento 10' FORMAT
COLUMN D20 HEADING 'Departamento 20' FORMAT
COLUMN D30 HEADING 'Departamento 30' FORMAT
COLUMN TBJ HEADING 'Total por Cargo' FORMAT
BREAK ON REPORT
COMPUTE SUM OF D10 D20 D30 TBJ ON REPORT
TTITLE 'Relatorio da Companhia'
BTITLE 'Confidencial'
/
Mon Oct 31
99,999.99
99,999.99
99,999.99
999,999.99
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
SQL> TTITLE OFF
SQL> BTITLE OFF
SQL> CLEAR COLUMN
columns cleared
SQL> CLEAR BREAKS
breaks cleared
SQL> CLEAR COMPUTE
computes cleared
11.7
92
11.8
Exerccios
a) Produza o relatrio mostrado abaixo
Mon Oct 31
page
R E L A T O R I O
D O S
E M P R E G A D O S
EMP.
DEPARTAMENTO CARGO
NUM. NOME
------------ --------- ----- -------ACCOUNTING
CLERK
7934 MILLER
MANAGER
7782 CLARK
PRESIDENT 7839 KING
************ *********
sum
DATA
SALARIO
COM.
ADM.
MENSAL
ANUAL
TOTAL
----- --------- -------- ----------11/83 1,300.00
0.00
15,600.00
05/84 2,450.00
0.00
29,400.00
07/84 5,000.00
0.00
60,000.00
--------- -------- ----------8,750.00
0.00 105,000.00
RESEARCH
ANALYST
7902
7788
7369
7876
7566
FORD
SCOTT
SMITH
ADAMS
JONES
12/83
03/84
06/83
06/84
10/83
3,000.00
0.00
36,000.00
3,000.00
0.00
36,000.00
800.00
0.00
9,600.00
1,100.00
0.00
13,200.00
2,975.00
0.00
35,700.00
--------- -------- ----------10,875.00
0.00 130,500.00
7900
7698
7499
7654
7844
7521
JAMES
BLAKE
ALLEN
MARTIN
TURNER
WARD
07/84
06/84
08/83
12/83
06/84
03/84
************ *********
sum
950.00
0.00
11,400.00
2,850.00
0.00
34,200.00
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
--------- -------- ----------9,400.00 2,200.00 115,000.00
sum
CLERK
MANAGER
************ *********
sum
SALES
CLERK
MANAGER
SALESMAN
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
93
page
R E L A T O R I O
D O S
EMP.
DEPARTAMENTO CARGO
NUM. NOME
------------ --------- ----- -------SALES
CLERK
7900 JAMES
MANAGER
7698 BLAKE
SALESMAN
7499 ALLEN
7521 WARD
7844 TURNER
7654 MARTIN
************ *********
sum
DATA
ADM.
----07/84
06/84
08/83
03/84
06/84
12/83
E M P R E G A D O S
SALARIO COMISSAO
MENSAL
ANUAL
TOTAL
-------- --------- ----------950.00
0.00
11,400.00
2,850.00
0.00
34,200.00
1,600.00
300.00
19,500.00
1,250.00
500.00
15,500.00
1,500.00
0.00
18,000.00
1,250.00 1,400.00
16,400.00
-------- --------- ----------9,400.00 2,200.00 115,000.00
-------- --------- ----------9,400.00 2,200.00 115,000.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
11.9
95
12.2
KING (EMPNO=7839)
|
------------------------------------- (MGR=7839)
|
|
|
CLARK
JONES
BLAKE
|
|
|
|
-------------------------------------|
|
|
|
|
|
|
|
MILLER
SCOTT FORD ALLEN
WARD
MARTIN
TURNER
JAMES
|
|
ADAMS SMITH
96
LEVEL DEPTNO
EMPNO ENAME
JOB
SAL
------- ------- ------- ---------- --------- ------1
10
7839 KING
PRESIDENT
5000
2
3
4
3
4
20
7566
7788
7876
7902
7369
JONES
SCOTT
ADAMS
FORD
SMITH
MANAGER
ANALYST
CLERK
ANALYST
CLERK
2975
3000
1100
3000
800
2
3
3
3
3
3
30
7698
7499
7521
7654
7844
7900
BLAKE
ALLEN
WARD
MARTIN
TURNER
JAMES
MANAGER
SALESMAN
SALESMAN
SALESMAN
SALESMAN
CLERK
2850
1600
1250
1250
1500
950
2
3
10
7782 CLARK
7934 MILLER
MANAGER
CLERK
2450
1300
Comando
Descrio
SELECT
FROM
WHERE
CONNECT BY
PRIOR
START WITH
ORDER BY
97
LEVEL DEPTNO
EMPNO ENAME
------- ------- ------- ---------1
10
7839 KING
2
7782 CLARK
3
7934 MILLER
JOB
SAL
--------- ------PRESIDENT
5000
MANAGER
2450
CLERK
1300
2
3
4
3
4
20
7566
7788
7876
7902
7369
JONES
SCOTT
ADAMS
FORD
SMITH
MANAGER
ANALYST
CLERK
ANALYST
CLERK
2975
3000
1100
3000
800
2
3
3
3
3
3
30
7698
7499
7521
7654
7844
7900
BLAKE
ALLEN
WARD
MARTIN
TURNER
JAMES
MANAGER
SALESMAN
SALESMAN
SALESMAN
SALESMAN
CLERK
2850
1600
1250
1250
1500
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
98
LEVEL DEPTNO
EMPNO ENAME
JOB
SAL
------- ------- ------- ---------- --------- ------1
10
7839 KING
PRESIDENT
5000
2
4
3
4
20
7566
7876
7902
7369
JONES
ADAMS
FORD
SMITH
MANAGER
CLERK
ANALYST
CLERK
2975
1100
3000
800
2
3
3
3
3
3
30
7698
7499
7521
7654
7844
7900
BLAKE
ALLEN
WARD
MARTIN
TURNER
JAMES
MANAGER
SALESMAN
SALESMAN
SALESMAN
SALESMAN
CLERK
2850
1600
1250
1250
1500
950
2
3
10
7782 CLARK
7934 MILLER
MANAGER
CLERK
2450
1300
13 rows selected.
99
LEVEL DEPTNO
EMPNO ENAME
JOB
SAL
------- ------- ------- ---------- --------- ------1
10
7839 KING
PRESIDENT
5000
2
3
4
20
7566 JONES
7902 FORD
7369 SMITH
MANAGER
ANALYST
CLERK
2975
3000
800
2
3
3
3
3
3
30
7698
7499
7521
7654
7844
7900
MANAGER
SALESMAN
SALESMAN
SALESMAN
SALESMAN
CLERK
2850
1600
1250
1250
1500
950
2
3
10
7782 CLARK
7934 MILLER
MANAGER
CLERK
2450
1300
Ingls
Portugus
Descrio
NODE
ROOT
Raiz
PARENT
Pai
CHILD
TERMINAL NODE
LEAF
BRANCH
Filho
Folha
Ramo ou Galho
BLAKE
ALLEN
WARD
MARTIN
TURNER
JAMES
12 rows selected.
12.4
12.5
Terminologia
Exerccios
a) Mostrar a organizao do departamento 20.
100
13.2
13.3
13.4
Nomes dos objetos do banco de dados (tabelas, vises, ndices, sinnimos, seqncias.)
13.5
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
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
102
ALL_INDEXES
ALL_IND_COLUMNS
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
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
103
DBA_COL_PRIVS
DBA_CONSTRAINTS
DBA_CONS_COLUMNS
DBA_DATA_FILES
DBA_DB_LINKS
DBA_DEPENDENCIES
DBA_ERRORS
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
DBA_TAB_PRIVS
DBA_TRIGGERS
DBA_TRIGGER_COLS
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
Dependencies to and from objects
Current errors on all stored objects in the
database
Description of export files
Objects that have been incrementally
exported
Version number of the last export session
Extents comprising all segments in the
database
Free extents in all tablespaces
Description for all indexes in the database
COLUMNs comprising INDEXes on all
TABLEs and CLUSTERs
All objects in the database
Sizes, in bytes, of various pl/sql objects
Auditing options for all tables and views
Describes current system privileges being
audited across the system and by user
Display all profiles and their limits
All Roles which exist in the database
Roles granted to users and roles
Description of rollback segments
Storage allocated for all database segments
Description of all SEQUENCEs in the
database
All snapshots in the database
All snapshot logs in the database
Source of all stored objects in the database
Describes current system auditing options
across the system and by user
All synonyms in the database
System privileges granted to users and roles
Description of all tables in the database
Description of all tablespaces
Columns of all tables, views and clusters
Comments on all tables and views in the
database
All grants on objects in the database
All triggers in the database
Column usage in all triggers
104
DBA_TS_QUOTAS
DBA_USERS
DBA_VIEWS
Viso
USER_AUDIT_OBJECT
Descrio
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
Audit trail entries relevant to the user
Tables, Views, Synonyms and Sequences
owned by the user
Descriptions of user's own clusters
Mapping of table columns to cluster columns
Comments on columns of user's tables and
views
Grants on columns for which the user is the
owner, grantor or grantee
All grants on columns of objects owned by
the user
Grants on columns for which the user is the
grantee
Constraint definitions on user's own tables
Information about accessible columns in
constraint definitions
Database links owned by the user
Dependencies to and from a users objects
Current errors on stored objects owned by the
user
Extents comprising segments owned by the
user
Free extents in tablespaces accessible to the
user
Description of the user's own indexes
COLUMNs comprising user's INDEXes or
on user's TABLES
Objects owned by the user
Sizes, in bytes, of various pl/sql objects
Auditing options for user's own tables and
views
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
105
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
Null?
-------NOT NULL
NOT NULL
Type
---CHAR(30)
CHAR(30)
CHAR(11)
SQL> SELECT *
2 FROM ACCESSIBLE_TABLES
3 ORDER BY 1,2
OWNER
-------------------ALUNO1
ALUNO1
TABLE_NAME
-------------------ASSIGNMENTS
BONUS
106
TABLE_TYPE
----------TABLE
TABLE
ALUNO1
CUSTOMER
TABLE
ALUNO1
DEPT
TABLE
ALUNO1
DUMMY
TABLE
ALUNO1
EMP
TABLE
ALUNO1
ITEM
TABLE
ALUNO1
ORD
TABLE
ALUNO1
PRICE
TABLE
ALUNO1
PRODUCT
TABLE
ALUNO1
PROJECTS
TABLE
ALUNO1
SALES
VIEW
ALUNO1
SALGRADE
TABLE
SYS
ACCESSIBLE_COLUMNS
VIEW
SYS
ACCESSIBLE_TABLES
VIEW
SYS
ALL_CATALOG
VIEW
SYS
ALL_COL_COMMENTS
VIEW
SYS
ALL_COL_GRANTS_MADE VIEW
..............................................
SYS
ALL_TAB_GRANTS_RECD VIEW
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.
Null?
-------NOT NULL
NOT NULL
NOT NULL
Type
---CHAR(30)
NUMBER
DATE
107
ALUNO1
_NEXT_USER
4 19-OCT-94
5 30-DEC-91
6 rows selected.
Null?
-------NOT NULL
NOT NULL
NOT NULL
NOT NULL
NOT NULL
NOT NULL
NOT
NOT
NOT
NOT
NULL
NULL
NULL
NULL
Type
---CHAR(30)
CHAR(30)
CHAR(30)
CHAR(11)
CHAR(9)
CHAR(30)
NUMBER
NUMBER
NUMBER
NUMBER
NUMBER
NUMBER
NUMBER
NUMBER
CHAR(17)
INDEX_NAME
TABLE_TYPE
-------------------ITEM_INDEX
ORD_INDEX
PRICE_INDEX
PRODUCT_INDEX
TABLE_OWNER
TABLE_NAME
-------------------ALUNO1
ALUNO1
ALUNO1
ALUNO1
-------------------ITEM
ORD
PRICE
PRODUCT
Esta consulta s pode ser realizada por um usurio com privilgio de DBA.
SQL> CONNECT SYSTEM
Connected.
SQL> DESCRIBE DBA_COL_COMMENTS
Name
------------------------------OWNER
TABLE_NAME
COLUMN_NAME
COMMENTS
13.7
Null?
-------NOT NULL
NOT NULL
NOT NULL
Exerccios
a) Mostrar as seguintes informaes para a tabela EMP:
108
Type
---CHAR(30)
CHAR(30)
CHAR(30)
CHAR(255)
-------TABLE
TABLE
TABLE
TABLE
Coluna
Nulo?
------------------------------- -------EMPNO
NOT NULL
ENAME
JOB
MGR
HIREDATE
SAL
COMM
DEPTNO
109
Tipo
-------------NUMBER(4)
VARCHAR2(10)
VARCHAR2(9)
NUMBER(4)
DATE
NUMBER(7,2)
NUMBER(7,2)
NUMBER(2)
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.
Vlido
Sim
No, comea com nmero.
Sim
No, contm espao.
No, palavra reservada.
Sim, mas nome no diz nada.
110
14.4
14.5
Usar uma regra consistente para atribuir nomes. Uma regra pode ser, todas as tabelas do
sistema financeiro comeam com FIN_.
VARCHAR(n)
VARCHAR2(n)
LONG
RAW(n)
LONG RAW
ROWID
MLSLABEL
NUMBER(p,s)
DATE
FLOAT
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.
111
Dado
7456123,89
7456123,89
7456123,89
7456123,89
7456123,8
7456123,8
7456123,89
7456123,8
14.6
Especificao
NUMBER
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
Valor armazenado
7456123,89
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
14.8.1 Sintaxe do comando:
CREATE TABLE [esquema.] nome_da_tabela [restries]
(nome_da_coluna tipo_de_dado (tamanho) [DEFAULT valor] [restries])
[PCTFREE inteiro PCTUSED inteiro INITRANS inteiro MAXTRANS inteiro]
[TABLESPACE espao_de_tabela STORAGE armazenamento]
112
Restrio
CONSTRAINT
nome_da_restrio
NULL
NOT NULL
UNIQUE
PRIMARY KEY
FOREIGN KEY
(coluna...)
REFERENCES
tabela(col(s))
CHECK condio
DISABLE
(ENABLE)
EXCEPTIONS
INTO
Descrio
Especifica o nome da restrio. opcional. Quando
omitido o nome padro tem a forma de SYS_Cn, onde 'n'
um nmero inteiro atribudo pelo Oracle que identifica
unicamente a restrio.
Especifica se a coluna pode ou no conter valores nulos.
Designa uma coluna, ou uma combinao de colunas,
como chave nica. Cada coluna deve ser declarada como
NOT NULL, e no podem ser chave primria.
Designa uma coluna, ou uma combinao de colunas,
como chave primria. As colunas devem ser declaradas
como NOT NULL e no podem ter a restrio UNIQUE.
Se a chave primria contiver apenas uma coluna pode ser
declarada na restrio da coluna. Se a chave primria
contiver mltiplas colunas deve ser declarada na restrio
da tabela.
Identifica a(s) coluna(s) como chave estrangeira .
REFERENCES identifica a chave primria ou chave nica
que referenciada.
Especifica a condio que uma coluna deve satisfazer para
a linha ser aceita na tabela. S pode se referenciar a colunas
da mesma tabela. Uma restrio de coluna s pode
referenciar a uma coluna, porm uma restrio de tabela
pode referenciar mltiplas colunas.
Desativa (ativa) uma restrio de integridade. O pado a
restrio ativa.
Identifica a tabela na qual o ORACLE armazena as
informaes sobre as linhas que violaram as restries de
integridade. A tabela deve existir antes desta condio ser
especificada.
NOT NULL,
CONSTRAINT DEPT_PRIMARY_KEY)
113
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))
CHAR(14)
CONSTRAINT CHECK_DNAME
CHECK(DNAME=UPPER(DNAME))
DISABLE,
LOC
CHAR(13)
CONSTRAINT CHECK_LOC
CHECK (LOC IN ('DALLAS','BOSTON',...))
DISABLE)
NOT NULL,
114
MGR
NUMBER(4)
REFERENCES EMP (EMPNO) CONSTRAINT EMP_S_KEY,
HIREDATE
DATE,
SAL
NUMBER(7,2),
COMM
NUMBER(7,2),
DEPTNO
NUMBER(2)
NOT NULL,
CONSTRAINT FK_DEPTNO REFERENCES DEPT(DEPTNO) ON DELETE CASCADE)
14.9
Null?
Type
-------- ---NOT NULL NUMBER(4)
CHAR(10)
CHAR(9)
NUMBER(4)
DATE
NUMBER(7,2)
NUMBER(7,2)
NOT NULL NUMBER(2)
Null?
Type
-------- ---NOT NULL NUMBER(4)
CHAR(10)
CHAR(9)
NUMBER(4)
DATE
NUMBER(7,2)
NUMBER(7,2)
NOT NULL NUMBER(2)
115
7369
7499
7521
7566
7654
7698
7782
7788
7839
7844
7876
7900
7902
7934
SMITH
ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
SCOTT
KING
TURNER
ADAMS
JAMES
FORD
MILLER
CLERK
SALESMAN
SALESMAN
MANAGER
SALESMAN
MANAGER
MANAGER
ANALYST
PRESIDENT
SALESMAN
CLERK
CLERK
ANALYST
CLERK
7902
7698
7698
7839
7698
7839
7839
7566
7698
7788
7698
7566
7782
13-JUN-83
15-AUG-83
26-MAR-84
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
800
1600
1250
2975
1250
2850
2450
3000
5000
1500
1100
950
3000
1300
300
500
1400
20
30
30
20
30
30
10
20
10
30
20
30
20
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>
2
3
4
5
6
Table created.
SQL> DESCRIBE SALARIOS_DOS_EMPREGADOS
Name
Null?
------------------------------- -------NOME
SALARIO
FAIXA
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
KING
5000
5
14 rows selected.
Type
---CHAR(10)
NUMBER(7,2)
NUMBER
Null?
Type
-------- ---NOT NULL NUMBER(4)
CHAR(10)
CHAR(9)
NUMBER(4)
DATE
NUMBER(7,2)
NUMBER(7,2)
NOT NULL NUMBER(2)
CHAR(10)
Para alterar a tabela empregados e garantir todos tenham salrio inferior a 5000:
SQL> ALTER TABLE EMPREGADOS
2 ADD (CHECK(SAL<=5000))
Table altered.
Null?
Type
-------- ---NOT NULL NUMBER(4)
CHAR(10)
CHAR(9)
NUMBER(4)
DATE
NUMBER(7,2)
NUMBER(7,2)
NOT NULL NUMBER(2)
CHAR(25)
14.14 Exerccios
a) Criar as seguintes tabelas:
Tabela: PROJECTS
PROJID
P_DESC
P_START_DATE
P_END_DATE
BUDGET_AMOUNT
MAX_NO_STAFF
NUMBER
CHARACTER
DATE
DATE
NUMBER
NUMBER
4
20
Tabela: ASSIGNMENTS
PROJID
EMPNO
NUMBER
NUMBER
4
4
NOT NULL
7,2
2
118
NOT NULL
NOT NULL
A_START_DATE
A_END_DATE
BILL_RATE
ASSIGN_TYPE
DATE
DATE
NUMBER
CHAR
4,2
2
NUMBER
119
SQL>
2
3
4
5
6
7
NOT NULL,
NOT NULL,
NOT NULL,
b)
SQL> ALTER TABLE ASSIGNMENTS
2 ADD (HOURS NUMBER(2))
c)
SQL> COMMENT ON TABLE PROJECTS IS 'UNIQUE PROJECT DETAILS'
SQL> COMMENT ON TABLE ASSIGNMENTS IS > 'ASSIGNMENTS FOR ANY EMPLOYEE ON A PROJECT'
d)
SQL> COMMENT ON COLUMN PROJECTS.PROJID IS > 'UNIQUE IDENTIFIER FOR A PROJECT'
e)
SQL> DESCRIBE USER_COL_COMMENTS
Name
------------------------------TABLE_NAME
COLUMN_NAME
COMMENTS
Null?
-------NOT NULL
NOT NULL
Type
---CHAR(30)
CHAR(30)
CHAR(255)
f)
SQL> SELECT * FROM USER_COL_COMMENTS WHERE COMMENTS IS NOT NULL
TABLE_NAME
COLUMN_NAME
COMMENTS
--------------- --------------- --------------------------------------PROJECTS
PROJID
UNIQUE IDENTIFIER FOR A PROJECT
g)
SQL> DESCRIBE USER_TAB_COMMENTS
Name
Null?
------------------------------- -------TABLE_NAME
NOT NULL
TABLE_TYPE
COMMENTS
Type
--------CHAR(30)
CHAR(11)
CHAR(255)
h)
SQL> SELECT * FROM USER_TAB_COMMENTS WHERE COMMENTS IS NOT NULL
TABLE_NAME
--------------ASSIGNMENTS
PROJECTS
TABLE_TYPE
----------TABLE
TABLE
COMMENTS
-----------------------------------------ASSIGNMENTS FOR ANY EMPLOYEE ON A PROJECT
UNIQUE PROJECT DETAILS
120
15.2
Table created.
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.
121
DNAME
-------------ACCOUNTING
RESEARCH
SALES
OPERATIONS
MARKETING
RESEARCH
INSURANCE
LOC
------------NEW YORK
DALLAS
CHICAGO
BOSTON
SAN JOSE
ALBERTA
DETROIT
ATLANTA
LONDON
9 rows selected.
Para os exemplos de insero de valores de data e hora ser criada a tabela Employee a partir
da tabela Emp.
SQL>
2
3
4
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>
2
3
4
5
6
7
8
9
10
122
11 20)
1 row created.
Para exemplo de insero de valores a partir de uma outra tabela ser criada a tabela
SALARY_GRADE a partir da tabela SALGRADE.
SQL>
2
3
4
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
1 row created.
15.3
nome_da_tabela [alis]
coluna, [,coluna...] = {expresso ou sub-consulta}
condio]
UPDATE EMPLOYEE
SET
JOB
= 'SALESMAN',
HIREDATE = SYSDATE,
SAL
= SAL*1.1
WHERE ENAME = 'SCOTT'
1 row updated.
123
JOB
--------ANALYST
ANALYST
CLERK
CLERK
CLERK
CLERK
MANAGER
MANAGER
MANAGER
PRESIDENT
VENDEDOR
VENDEDOR
VENDEDOR
VENDEDOR
VENDEDOR
15 rows selected.
15.4
124
no rows selected
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
125
2
7844
01-JAN-89
10-JAN-89
45.50
PF
30
15.6
SQL>
2
3
4
b)
SQL>
2
3
4
SQL>
2
3
4
SQL>
2
3
4
c)
SQL> UPDATE ASSIGNMENTS
2 SET ASSIGN_TYPE = 'WT'
3 WHERE ASSIGN_TYPE = 'WR'
126
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.
127
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
128
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
mantm o SavePoint at onde foi feito o Rollback, mas perde os SavePoints criados
aps o SavePoint para o qual o Rollback foi feito.
130
DNAME
-------------ACCOUNTING
RESEARCH
SALES
OPERATIONS
LOC
------------NEW YORK
DALLAS
CHICAGO
BOSTON
DNAME
-------------ACCOUNTING
RESEARCH
SALES
OPERATIONS
TESTING
LOC
------------NEW YORK
DALLAS
CHICAGO
BOSTON
LAS VEGAS
131
Para desfazer o erro da ltima declarao, mas sem desfazer a incluso do departamento 50.
SQL> ROLLBACK TO INSERT_DONE
Rollback complete.
DNAME
-------------ACCOUNTING
RESEARCH
SALES
OPERATIONS
TESTING
LOC
------------NEW YORK
DALLAS
CHICAGO
BOSTON
LAS VEGAS
DNAME
-------------ACCOUNTING
RESEARCH
MARKETING
OPERATIONS
TESTING
LOC
------------NEW YORK
DALLAS
CHICAGO
BOSTON
LAS VEGAS
DNAME
-------------ACCOUNTING
RESEARCH
MARKETING
OPERATIONS
TESTING
LOC
------------NEW YORK
DALLAS
CHICAGO
BOSTON
LAS VEGAS
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.
133
Exemplo:
SQL> SET TRANSACTION READ ONLY
Transaction set.
SQL> SELECT * FROM DEPT
DEPTNO
------10
20
30
40
DNAME
-------------ACCOUNTING
RESEARCH
SALES
OPERATIONS
LOC
------------NEW YORK
DALLAS
CHICAGO
BOSTON
SQL> COMMIT
Commit complete.
135
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
17.6.1 Bloqueios do dicionrio de dados (DDL)
controla o acesso s definies dos objetos do banco de dados.
usado para controlar as operaes SQL que modificam o dicionrio de dados, tais
como, Create Table, Alter Table, Drop Table...
controlado automaticamente pelo SGBD Oracle.
17.6.2 Bloqueios da manipulao de dados (DML)
controla o acesso aos dados nas tabelas dos usurios.
o Oracle automaticamente bloqueia as tabelas que esto sendo atualizadas pelos
usurios (bloqueio implcito).
o usurio pode solicitar o bloqueio atravs de comandos SQL (bloqueio explcito)
Este captulo trata de bloqueios causados pela DML.
17.7
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
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.
137
Nveis de Bloqueio
Nvel de Linha
Row Locks (TX)
Nvel de Tabela
Table Locks (TM)
Descrio
- Um bloqueio exclusivo adquirido para cada linha
modificada pelos comandos INSERT, UPDATE,
DELETE ou SELECT FOR UPDATE.
- Uma linha sempre bloqueada de forma exclusiva, para
no permitir outros usurios atualizar a mesma linha ao
mesmo tempo.
- Bloqueios de linha so sempre adquiridos
automaticamente pelo Oracle quando um dos comandos
listados anteriormente executado.
- Existem diversos modos de bloqueio para tabelas.
- Um bloqueio para a tabela adquirido quando a tabela
modificada pelos comandos INSERT, UPDATE,
DELETE, SELECT FOR UPDATE ou LOCK TABLE.
- As operaes de DML necessitam de bloqueio a nvel
de tabela para impedir comandos de DDL serem
executados sobre uma tabela sendo modificada.
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.
- 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.
- 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
138
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
139
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
140
UPDATE EMP
SET JOB = SALESMAN, HIREDATE = SYSDATE, SAL = 1.1 * SAL
WHERE ROWID = &ROW_IDENT
LOCK
SEQNCIA
141
-----------------EMP
DEPT
SALGRADE
---------RS
RS
X
-----------------2
1
10
142
Captulo 18 - Vises
18.1
18.2
18.3
143
18.4
View created.
ENAME
DEPTNO
---------- ------CLARK
10
KING
10
MILLER
10
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
144
18.5
View created.
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>
2
3
4
5
6
7
8
View created.
View created.
145
Type
---CHAR(30)
NUMBER
LONG
EMP_DATA
EMP_DETAILS
SALES
146
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.
147
18.8
Exerccios
a) Criar uma viso que produza o seguinte resultado.
SQL> SELECT * FROM AGGREGATES
DEPTNO
------10
20
30
c) Criar uma viso que garanta as seguintes restries ao se inserir dados na tabela
ASSIGNMENTS:
-
value
value
value
value
value
value
value
for
for
for
for
for
for
for
id: 1
empno: 7566
start: 01-JAN-89
end: 01-JAN-88
bill_r: 40.00
asgt: ED
hours: 20
old
3: (&ID,&EMPNO,'&START','&END','&BILL_R','&ASGT',&HOURS)
148
new
3: (1,7566,'01-JAN-89','01-JAN-88','40.00','ED',20)
(1,7566,'01-JAN-89','01-JAN-88','40.00','ED',20)
*
ERROR at line 3:
ORA-01402: view WITH CHECK OPTION where-clause violation
SQL> /
Enter value for id: 2
Enter value for empno: 7698
Enter value for start: 01-FEB-89
Enter value for end: 20-FEB-89
Enter value for bill_r: 55.00
Enter value for asgt: WT
Enter value for hours: 30
old
3: (&ID,&EMPNO,'&START','&END','&BILL_R','&ASGT',&HOURS)
new
3: (2,7698,'01-FEB-89','20-FEB-89','55.00','WT',30)
1 row created.
SQL> /
Enter value for id: 2
Enter value for empno: 8000
Enter value for start: 01-MAR-89
Enter value for end: 31-DEC-89
Enter value for bill_r: 69.00
Enter value for asgt: ED
Enter value for hours: 40
old
3: (&ID,&EMPNO,'&START','&END','&BILL_R','&ASGT',&HOURS)
new
3: (2,8000,'01-MAR-89','31-DEC-89','69.00','ED',40)
(2,8000,'01-MAR-89','31-DEC-89','69.00','ED',40)
*
ERROR at line 3:
ORA-01402: view WITH CHECK OPTION where-clause violation
149
18.9
b)
SQL> COLUMN MAXIMUM FORMAT 99,999
SQL> COLUMN MINIMUM LIKE MAXIMUM
SQL> COLUMN AVERAGE LIKE MAXIMUM
SQL> COLUMN SAL LIKE MAXIMUM
SQL> COLUM JOB FORMAT A9
SQL> COLUMN ENAME FORMAT A6
SQL> SELECT EMP.EMPNO, ENAME, JOB, SAL, HIREDATE,
2 MINIMUM, MAXIMUM, AVERAGE
3 FROM EMP, AGGREGATES AGG
4 WHERE EMP.DEPTNO = AGG.DEPTNO
5 AND EMP.EMPNO = &EMPNO
Enter value for empno: 7902
old
5: AND EMP.EMPNO = &EMPNO
new
5: AND EMP.EMPNO = 7902
c)
SQL>
2
3
4
5
6
7
8
9
10
11
d)
SQL> INSERT INTO ASG_VAL
2 VALUES
3 (&ID,&EMPNO,'&START','&END','&BILL_R','&ASGT',&HOURS)
e)
SQL> SELECT VIEW_NAME, TEXT
2 FROM USER_VIEWS
3 WHERE VIEW_NAME = ASG_VAL
VIEW_NAME
TEXT
--------------- -------------------------------------------------ASG_VAL
SELECT PROJID, EMPNO, A_START_DATE, A_END_DATE,
BILL_RATE, ASSIGN_TYPE, HOURS
FR........
150
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.
151
19.5
19.6
19.7
*
152
FROM
WHERE
EMP
ENAME = JONES
*
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.
153
b) CREATE
ON
INDEX ASG_PROJID
ASSIGNMENTS(PROJID)
c) SELECT
FROM
*
USER_INDEXES
154
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
nome-da-seqncia
INCREMENT WITH
START WITH
MINVALUE|NOMINVALUE
MAXVALUE|NOMAXVALUE
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
SELECT
FROM
DEPT_SEQ.NEXTVAL
SYS.DUAL
NEXTVAL
------20
A coluna NEXTVAL mais til em comandos de DML. Por exemplo, quando so inseridas
linhas na tabela, a seqncia pode ser utilizada para gerar valores nicos para a chave
primria.
INSERT INTO DEPT
VALUES
(DEPT_SEQ.NEXTVAL, ACCOUNTING, NEW YORK)
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.
158
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
159
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
160
161
162
163
164