Você está na página 1de 134

MANUAL DE TREINAMENTO

Verso: 01

Pg. 1/134

Vigncia:

Data: 05/07/2011

SQL Bsico para Oracle

SQL Bsico para Oracle

Compilao

Leandro Mendes Ferreira

Contedo
Contedo.................................................................................................................. 2
Banco de dados relacional........................................................................................9
Modelagem de Dados...............................................................................................9
Entidade................................................................................................................9
Relacionamento....................................................................................................9
Tipos de relacionamento.....................................................................................11
Relacionamento um-para-um...........................................................................11
Relacionamento um-para-muitos.....................................................................11
Relacionamento muitos-para-muitos...............................................................11

............................................................................................................................12
Cardinalidade......................................................................................................12
Atributo............................................................................................................... 12
Chave Primria....................................................................................................13
Chave Estrangeira...............................................................................................13
Integridade Referencial.......................................................................................13
Deleo Restrita -> .........................................................................................14
Atualizao e Linha Restrita -> ......................................................................14
Operadores Relacionais..........................................................................................15
Sistema de Gerenciamento de Banco de Dados.....................................................19
O Utilitrio PL/SQL Developer.................................................................................20
Query Builder..................................................................................................... 20
A Linguagem SQL...................................................................................................21
Tipos de declaraes SQL.......................................................................................22
DDL (Data Definition Language)..........................................................................22
DML (Data Manipulation Language)....................................................................22

Recomendaes sobre os nomes das tabelas.....................................................23


Tipo de dado das colunas.......................................................................................24
Restries (constrains)...........................................................................................25
Construo bsica de uma consulta.......................................................................26
Expresses aritmticas...........................................................................................27
Nomes alternativos para ttulos de colunas............................................................29
O operador de concatenao.................................................................................30
Literais.................................................................................................................... 30
Manuseio de valores nulos.....................................................................................31
Eliminao de linhas duplicadas.............................................................................33
Ordenao das linhas.............................................................................................34
Critrios de pesquisa..............................................................................................36
Consultas com condies mltiplas........................................................................41
Precedncia dos operadores..................................................................................42
Resumo do comando SELECT.................................................................................43
Funes que manipulam caracteres.......................................................................44
LOWER(coluna | literal)........................................................................................44
UPPER(coluna | literal).........................................................................................44
INITCAP(coluna | literal).......................................................................................44
LPAD(coluna | literal, tamanho, 'caracter')..........................................................45
RPAD(coluna | literal, tamanho, 'caracter')..........................................................45
SUBSTR(coluna | literal, posio, comprimento).................................................45
INSTR(coluna | literal, seqncia de caracteres', posio, n).............................46
LTRIM(coluna | literal, 'caracteres').....................................................................46
RTRIM(coluna | literal, 'caracteres').....................................................................47
SOUNDEX(coluna | literal)...................................................................................47
LENGTH(coluna | literal)......................................................................................47
TRANSLATE(coluna | literal, de, para)..................................................................48
REPLACE(coluna | literal, de, para)......................................................................48

Funes aninhadas..............................................................................................49
Funes numricas.................................................................................................50
ROUND(coluna | literal, n)...................................................................................50
TRUNC(coluna | literal, n)....................................................................................50
CEIL(coluna | literal)............................................................................................51
FLOOR(coluna | literal)........................................................................................51
POWER(coluna | literal, n)...................................................................................51
EXP(coluna | literal).............................................................................................52
LOG(base, coluna | literal)...................................................................................52
LN(coluna | literal)...............................................................................................52
SQRT(coluna | literal)..........................................................................................52
SIGN(coluna | literal)...........................................................................................53
ABS(coluna | literal).............................................................................................53
MOD(valor1, valor2)............................................................................................54
Funes trigonomtricas.....................................................................................54
Funes hiperblicas...........................................................................................54
Funes que manipulam datas...............................................................................56
SYSDATE.............................................................................................................. 56
Aritmtica de datas.............................................................................................56
MONTHS_BETWEEN(data1,data2).......................................................................57
ADD_MONTHS(data, meses)................................................................................57
NEXT_DAY(data, dia_da_semana)........................................................................58
LAST_DAY(data)...................................................................................................58
ROUND(data).......................................................................................................58
TRUNC(data).......................................................................................................59
Funes de converso............................................................................................59
Formatos de Data................................................................................................59
TO_CHAR(nmero|data,['formato']).....................................................................61
Formatos Numricos...........................................................................................62

TO_NUMBER(cadeia_de_caracteres)....................................................................62
TO_DATE('cadeia_de_caracteres','formato')........................................................63
Funes que aceitam qualquer tipo de dado..........................................................63
DECODE(coluna|expresso,pes1,res1,[pes2,res2,...],default).............................63
NVL(coluna|valor, valor)......................................................................................65
GREATEST(coluna|valor, coluna|valor,...)............................................................66
LEAST(coluna|valor, coluna|valor,...)...................................................................66
VSIZE(coluna|valor).............................................................................................66
Funes aninhadas revisitadas...............................................................................67
Usando funes de grupo.......................................................................................68
A clusula GROUP BY...........................................................................................68
Excluindo linhas dos grupos................................................................................69
Grupos dentro de grupos.....................................................................................69
Funes disponveis de grupo.............................................................................70
Funes de grupo e resultados individuais..........................................................71
A clusula HAVING..............................................................................................72
Ordem das clusulas...........................................................................................74
Junes equivalentes..............................................................................................75
Produto................................................................................................................76
Junes no equivalentes....................................................................................77
Regra para juno de tabelas..............................................................................77
Sumrio da Sintaxe.............................................................................................77
Junes externas....................................................................................................79
Juno de uma tabela com ela mesmo................................................................79
Junes verticais................................................................................................. 80
Unio................................................................................................................... 80
Interseo........................................................................................................... 81
Subtrao............................................................................................................ 81
Combinao de operadores.................................................................................81

A clusula ORDER BY...........................................................................................82


Regras para utilizar junes verticais..................................................................82
Definio de consultas aninhadas..........................................................................84
Consultas internas que retornam apenas um valor.............................................84
Como as consultas aninhadas so executadas...................................................85
Consultas internas que retornam mais de um valor............................................85
Operadores ANY e ALL.........................................................................................87
Clusula HAVING com consultas aninhadas........................................................88
Ordenao em consultas aninhadas....................................................................89
Limite para o aninhamento.................................................................................89
Consulta interna correlacionada..........................................................................89
O operador EXISTS..............................................................................................91
Linguagem de Definio de Dados.........................................................................92
Sintaxe do comando:...........................................................................................92
Criao das tabelas do curso:.............................................................................93
Exemplos de restries.......................................................................................93
Criando uma tabela a partir de outra tabela.......................................................95
Alterando uma tabela..........................................................................................97
Trocando o nome de uma tabela.........................................................................98
Descrio das tabelas e colunas.........................................................................98
Removendo tabelas.............................................................................................99
Inserindo novas linhas em uma tabela................................................................99
Atualizando linhas em uma tabela....................................................................103
Eliminando linhas de uma tabela......................................................................104
Viso.....................................................................................................................105
O que uma viso............................................................................................105
Vises simples...................................................................................................105
Vises complexas..............................................................................................105
O comando CREATE VIEW.....................................................................................106

Usando uma viso para operaes de DML..........................................................107


Alterando dados atravs das vises.....................................................................110
Eliminao de vises............................................................................................110
Finalidades dos ndices.........................................................................................112
Estrutura dos ndices.........................................................................................112
Tipos de ndices.................................................................................................112
Criao dos ndices............................................................................................113
Criao de um ndice para melhorar o acesso...................................................113
Criao de um ndice para garantir unicidade...................................................114
Eliminao dos ndices......................................................................................114
Quando um ndice utilizado............................................................................114
ndices e Junes...............................................................................................115
Sugestes para criao dos ndices...................................................................116
O gerador de seqncias......................................................................................117
Gerao de nmeros seqenciais com NEXTVAL..............................................118
Valor atual da seqncia...................................................................................119
Regras para utilizar CURRVAL E NEXTVAL.........................................................119
Alterando uma seqncia..................................................................................120
Concedendo privilgios em seqncias.............................................................121
Eliminando uma seqncia...............................................................................121
Listando seqncias..........................................................................................121
O que uma transao........................................................................................122
Efetivando as mudanas...................................................................................123
Removendo mudanas......................................................................................123
Falhas do sistema..............................................................................................123
O significado de uma transao........................................................................124
Controlando transaes....................................................................................124
COMMIT [WORK]................................................................................................124
SAVEPOINT savepoint_name.............................................................................125

ROLLBACK[WORK] to [SAVEPOINT] savepoint_name.........................................126


Rollback a nvel de declarao..........................................................................126
Rollbacks implcitos...........................................................................................127
Autocommit......................................................................................................127
Exemplo de utilizao de COMMIT e ROLLBACK................................................127
Consistncia de leitura......................................................................................131
Transaes somente de leitura.........................................................................132

Banco de dados relacional


O modelo predominante atualmente o relacional. Um banco de dados relacional
pode ser definido como um banco de dados que aparece ao usurio como uma
coleo de tabelas relacionadas entre si.

Os trs elementos de um banco de dados relacional so:

tabelas
colunas
linhas

Modelagem de Dados
Entidade
Pode ser entendida como uma coisa ou algo da realidade modelada onde
deseja-se manter informaes no banco de dados (BD). Por exemplo, em um
sistema escolar, algumas entidades podem ser os alunos, professores, horrio,
disciplinas e avaliaes. Note que uma entidade pode representar tanto objetos
concretos (alunos), quanto objetos abstratos (horrio). A entidade representada
por um retngulo, que contm o nome da entidade. Observe o exemplo abaixo.

A entidade ALUNO representa todos os estudantes sobre as quais se deseja


manter informaes no BD

Relacionamento
9

Relacionamento um conjunto de associaes entre entidades. O relacionamento


representado por um losango. Esse losango ligado por linhas aos retngulos
que representam as entidades participantes do relacionamento. O exemplo abaixo
possui
duas
entidades, MDICO e PACIENTE,
e
um
relacionamento
chamado CONSULTA.

O modelo acima informa que o BD mantm informaes sobre mdicos, pacientes,


alm de um conjunto de associaes (consulta), cada uma ligando um mdico a
um paciente.

Um relacionamento pode envolver ocorrncias de uma mesma entidade. Neste


caso, estamos diante de um auto-relacionamento. Observe o exemplo:

CASAMENTO um relacionamento que envolve duas ocorrncias da entidade


PESSOA. Para facilitar o entendimento, em geral costumamos identificar
o papel de cada entidade no relacionamento (para o exemplo, marido e esposa).
Cardinalidade do relacionamento
Observe o modelo abaixo:

10

Estamos diante de um relacionamento (possui) entre as


entidades EMPREGADO e DEPENDENTE. Considere as seguintes questes:

Um empregado pode no ter dependentes?


Um dependente pode ter mais de um empregado associado ?
Determinado empregado pode possuir mais de um dependente?
Pode existir dependente sem algum empregado associado?

Tipos de relacionamento
Existem trs tipos de relacionamento entre entidades:

um-para-um
um-para-muitos
muitos-para-muitos

Relacionamento um-para-um
O relacionamento um-para-um usado quando uma entidade A se relaciona com
uma entidade B e vice-versa.
Este relacionamento representado pelo sinal: 1:1
Veja o exemplo:

Relacionamento um-para-muitos
O relacionamento um-para-muitos usado quando uma entidade A pode se
relacionar com uma ou mais entidades B.
Este relacionamento representado pelo sinal: 1:N
Veja o exemplo:

Relacionamento muitos-para-muitos
O relacionamento muitos-para-muitos usado quando vrias entidades A se
relacionam com vrias entidades B.
Este relacionamento representado pelo sinal: N:N ou N:M
11

Veja o exemplo:

Cardinalidade
A cardinalidade um conceito importante para ajudar a definir o relacionamento,
ela define o nmero de ocorrncias em um relacionamento.
Para determinar a cardinalidade, deve-se fazer a pergunta
relacionamento em ambas as direes. No exemplo a seguir, temos:

relativa

ao

Um departamento possui quantos empregados?


- no mnimo 1 e no mximo N.
Um empregado est alocado em quantos departamentos?
- no mnimo em 1 e no mximo em 1
Somando-se as cardinalidades, definimos o resultado final do relacionamento, ou
seja, 1:N

Atributo

Atributo uma caracterstica relevante associada a cada ocorrncia de entidade


ou Relacionamento. Observe no modelo abaixo a notao utilizada para atributos:

12

Cardinalidade do atributo
Observe que o modelo acima no informa se determinado aluno pode ter vrios
telefones, ou mesmo se algum aluno pode no ter telefones. Para deixar o modelo
mais preciso, costumamos expressar cardinalidade para os atributos. Observe a
cardinalidade do atributo telefone no modelo abaixo:

Dessa forma, podemos concluir que determinado aluno pode no ter telefone
(cardinalidade mnima zero) ou pode ter vrios (cardinalidade mxima N). A
cardinalidade dos atributos cdigo e nome (1,1)

Chave Primria
Em toda e qualquer tabela existente em um banco de dados relacional haver
sempre uma coluna ou um conjunto de colunas concatenadas, cujos valores so
nicos na tabela, isto e, nunca se repete aquele valor em nenhuma outra linha da
tabela.
Essa coluna ou conjunto de colunas concatenadas identifica uma nica linha da
tabela. Entao dizemos que essa coluna ou conjunto de colunas forma a chave
primaria da tabela.

Chave Estrangeira
Uma tabela relacional e uma estruturao dos dados por assunto, organizada em
tabelas com linhas e colunas, e cada linha e a representao de uma ocorrncia
de um objeto, um assunto, descrita por valores em cada coluna.
Dessas colunas j sabemos que uma ou um conjunto delas forma o que definimos
como o identificados nico de cada linha que e a chave primaria da tabela.

Integridade Referencial

13

Quando colocamos uma coluna como chave estrangeira em uma tabela,


assumimos responsabilidade com o banco de dados por assim dizer.
As colunas pertencentes a chave estrangeira da tabela A devem ter o mesmo
domnio das colunas pertencentes a chave primaria da tabela B.
O valor de uma chave estrangeira em uma tabela A deve ser um valor de chave
primaria da tabela B, ou ento ser nulo. Sintetizando: uma tabela contem uma
chave estrangeira, ento o valor dessa chave so pode ser:
Nulo neste caso pode, pois representa a inexistencia de referencia para uma
linha da tabela.
Igual ao valor de alguma chave primaria na tabela referenciada.
Existe um conjunto de regras de operao para um banco de dados que coloca
restries, regras de atualizao das tabelas do banco de dados, de forma a
garantir e
manter a integridade referencial. So elas:

Deleo Restrita ->


Ao excluir (deletar) a tabela pai , se ela possuir filhos relacionados (ou seja, se o
departamento tiver funcionrios), a excluso e impedida. Isso evita que o bando
de dados fique inconsistente, ou seja, linhas de Funcionrio com valor de chave
estrangeira inexistente como chave primaria na tabela associada. Outras opes
para garantir a integridade de referencias do banco de dados seriam excluir todos
os filhos em cascata, fazendo com que todos os funcionrios referenciem um
departamento-padro ou fazer com que todos os funcionrios fiquem sem
departamento.
Incluso e Linha Restrita ->
Ao inserir um dado na tabela filha, caso seja obrigatrio que ele j possua dado
um dado na tabela ai, ou seja chave estrangeira associada, verifica se ele esta
relacionada tabela pai, seno impede a operao.
Atualizao e Linha Restrita ->
Ao atualizar a chave estrangeira de uma tabela, verifica se existe uma linha da
tabela associada que possua como chave primaria o novo valor da chave
estrangeira, seno impede essa operao. A opo cascata e sempre perigosa de
ser utilizada em banco de dados, pois existe o risco de perder todos os dados
existentes em uma determinada tabela se optar por apagar as suas linhas que
esto associadas a uma determinada linha que ser deletada da tabela que possui
a chave primaria referenciada.

14

Operadores Relacionais

Seleo/Restrio

uma operao que recupera e mostra dados de


uma tabela. possvel recuperar todas as linhas,
ou apenas algumas que satisfaam uma
determinada condio ou a vrias condies. Esta
operao chamada tambm de subconjunto
horizontal.

Projeo

uma operao que recupera e mostra dados de


apenas algumas colunas, e portanto chamada
de subconjunto vertical.

Unio

mostra todas as linhas que aparecem em duas


tabelas.

Interseo

mostra todas as linhas que aparecem nas duas


tabelas.

Diferena

mostra todas as linhas que aparecem em apenas


uma das tabelas

Produto

o resultado obtido pela concatenao de duas


tabelas. Todas as linhas da primeira tabela so
concatenadas com todas as linhas da segunda
tabela.

Juno

o resultado obtido pela concatenao de duas


tabelas de acordo com condies especficas.
Apenas as linhas que atendem as condies
estabelecidas so concatenadas.

15

Seleo/Restrio

Projeo

Unio

16

Interseo

Diferena

17

18

Sistema de Gerenciamento de Banco de Dados


O Sistema de Gerenciamento de Banco de Dados (SGBD) um software que
controla o armazenamento, as modificaes, e os acessos s informaes do
banco de dados.

O SGBD atua como interface entre os usurios e as informaes armazenadas.


Todas as solicitaes relativas aos dados do banco de dados so interceptadas,
interpretadas, e executadas pelo SGBD. Nenhum acesso aos dados pode ser feito
de outra maneira.

Desta forma, o SGBD isola o usurio de todos os detalhes particulares do hardware


ou do sistema operacional sendo utilizado, tais como mtodo de acesso e
blocagem de disco. A forma de acesso do usurio ao banco de dados no deve
mudar quando o hardware ou o sistema operacional mudam.

Existem modelos alternativos para se implementar um SGBD, sendo que os mais


comuns so hierrquico, rede, listas invertidas e relacional.

19

O Utilitrio PL/SQL Developer


PL/SQL Developer um ambiente de desenvolvimento integrado (IDE) que foi
especialmente destinado ao desenvolvimento de programas armazenados em
bancos de dados Oracle. Ao longo do tempo, temos observado que mais e mais
lgicas de Negcios e Aplicaes vem sendo migradas / desenvolvidas em
servidores Oracle, tornando assim a programao em PL/SQL uma parte
significante de todo o processo de desenvolvimento.
PL/SQL Developer tem como principal objetivo facilidade de uso, qualidade de
cdigo e produtividade, ou seja, um conjunto de conceitos que hoje so as chaves
para o sucesso de qualquer projeto de desenvolvimento de aplicaes Oracle.

Query Builder
A criao de declaraes SELECT ou a modificao de declaraes j existentes se
tornam rpidas e eficientes. Simplesmente clique e arraste tabelas e views,
selecione colunas, crie, de modo fcil, clausulas WHERE e ORDER BY, faa join de
tabelas baseadas em foreing key e pronto sua consulta j esta criada.

20

A Linguagem SQL
A linguagem SQL a ferramenta bsica para acesso aos dados de um
banco de dados relacional. Foi desenvolvida inicialmente nos laboratrios
da IBM (1976) sendo atualmente um padro para os SGBD relacionais.
Apesar de existirem alguns padres da linguagem SQL, a maioria dos
fabricantes de banco de dados criou suas prprias extenses para
explorar as caractersticas do banco de dados como o caso da Oracle com
o PL/SQL.
A SQL considerada como sendo uma linguagem no procedural uma
vez que ela processa conjunto de registros e fornece acesso ou navegao
automtica de dados. A base para esta linguagem a lgebra relacional,
muito embora existam diversas caractersticas importantes
que no
pertencem a lgebra relacional.
Na verdade, a SQL padro deve ser considerada como uma
sublinguagem, uma vez que no possui comandos ou declaraes que
permitam o controle de repeties ou de desvios condicionais e
incondicionais. Para este tipo de controle a Oracle desenvolveu o PL/SQL
que consiste em uma extenso da SQL padro.

21

Tipos de declaraes SQL


Os comandos ou declaraes em SQL so divididos nas seguintes
categorias:

DDL (Data Definition Language)


a parte do SQL usada para definir dados e objetos de um banco
de dados. Atravs destes comandos so feitas inseres no dicionrio de
dados.

A tabela abaixo indica comandos DDL :

Coman

Funo

do
Create
Table

Cria uma tabela

Create
Index

Cria um ndice

Alter Table

Altera ou insere uma coluna da


tabela

Drop Table

Elimina uma tabela do banco de


Dados

Drop Index
Grant

Elimina um ndice
Concede privilgios de acesso p/a
um usurio

DML (Data Manipulation Language)


a parte da SQL usada para a recuperao ou manipulao de dados.
Permite realizar consultas, adicionar, alterar e excluir informaes do banco
de dados. Possui tambm clusulas adicionais e funes para clculo de
totais, mdias, contagem de registros e mximo e mnimo entre valores.

22

A tabela abaixo apresenta alguns dos mais importantes comandos dessa


categoria:

Coman

Funo

do
Select

Seleciona dados de uma base

Insert

Insere uma linha em uma tabela

Delete

Apaga linhas da Tabela

Update

Altera o contedo de colunas (campos)


da tabela.

Commit

Grava no disco as alteraes feitas

Rollback

Desfaz as alteraes feitas aps o


ltimo commit

Recomendaes sobre os nomes das tabelas

Usar nomes descritivos para as tabelas, colunas, ndices e outros


objetos.

Abreviar de forma consistente, mantendo sempre a mesma abreviatura.

Consistncia de singular e plural, no colocando o nome de algumas


tabelas no singular e de outras no plural

Usar uma regra consistente para atribuir nomes. Uma regra pode ser,
todas as tabelas do sistema financeiro comeam com FIN_.

Use o mesmo nome para descrever o mesmo atributo em tabelas


diferentes.

23

Tipo de dado das colunas


Tipo

Contedo

CHAR(n)

Caracteres alfanumricos com at 'n' caracteres. Coluna


de tamanho constante independente do que est
armazenado. Mximo de 255 caracteres.

VARCHAR(n)

Caracteres alfanumricos com at 'n' caracteres. No


Oracle 6 sinnimo de CHAR, e pode ter no mximo 255
caracteres.

VARCHAR2(n)

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.

LONG

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.

RAW(n)

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.

LONG RAW

Semelhante a RAW, porm podendo armazenar at 2


GigaBytes.

ROWID

Caracteres hexadecimais representando o endereo


nico de uma linha em uma tabela.

MLSLABEL

Formato binrio to rtulo do sistema operacional. Usado


com o Trusted ORACLE.

NUMBER(p,s)

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

DATE

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.(Padro Americano)

FLOAT

Nmero de ponto flutuante com preciso decimal de 38


dgitos, ou preciso binria de 126 dgitos.

24

Restries (constrains)
So recursos proporcionados pelo SGBD para implementar regras de
consistncia bsicas para os dados de uma tabela.

Restrio

Descrio

CONSTRAINT

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.

nome_da_restri
o
NULL
NOT NULL

Especifica se a coluna pode ou no conter valores


nulos.

UNIQUE

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.

PRIMARY KEY

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.

FOREIGN KEY
(coluna...)
REFERENCES
tabela(col(s))

Identifica a(s) coluna(s) como chave estrangeira .


REFERENCES identifica a chave primria ou chave
nica que referenciada.

CHECK condio

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.

DISABLE

Desativa (ativa) uma restrio de integridade. O


pado a restrio ativa.

(ENABLE)
EXCEPTIONS
INTO

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.

25

Construo bsica de uma consulta


O comando SELECT recupera informaes do banco de dados, implementando
todos os operadores da lgebra relacional.

Em sua forma mais simples deve incluir:

a. A clusula SELECT, que lista as colunas a serem envolvidas


(essencialmente a Projeo, conforme definido na lgebra relacional).

b. A clusula FROM, que especifica as tabelas envolvidas.

Para listar os nmeros de todos os departamentos, nomes dos empregados e


nmeros dos gerentes da tabela EMP, digita-se:

SQL> SELECT DEPTNO, ENAME, MGR


2 FROM EMP
DEPTNO ENAME
MGR
------- ---------- ------20 SMITH
7902
30 ALLEN
7698
30 WARD
7698
20 JONES
7839
30 MARTIN
7698
30 BLAKE
7839
10 CLARK
7839
20 SCOTT
7566
10 KING
30 TURNER
7698
20 ADAMS
7788
30 JAMES
7698
20 FORD
7566
10 MILLER
7782
14 rows selected.

possvel selecionar todas as colunas da tabela colocando-se um "*" (asterisco)


aps a palavra SELECT, como visto abaixo:

SQL> SELECT *
2 FROM EMP

26

EMPNO ENAME
JOB
MGR HIREDATE
SAL COMM DEPTNO
------- ---------- --------- ------- --------- ------- ------- ------7369 SMITH
CLERK
7902 13-JUN-83
800
20
7499 ALLEN
SALESMAN
7698 15-AUG-83 1600
300
30
7521 WARD
SALESMAN
7698 26-MAR-84 1250
500
30
7566 JONES
MANAGER
7839 31-OCT-83 2975
20
7654 MARTIN
SALESMAN
7698 05-DEC-83 1250 1400
30
7698 BLAKE
MANAGER
7839 11-JUN-84 2850
30
7782 CLARK
MANAGER
7839 14-MAY-84 2450
10
7788 SCOTT
ANALYST
7566 05-MAR-84 3000
20
7839 KING
PRESIDENT
09-JUL-84 5000
10
7844 TURNER
SALESMAN
7698 04-JUN-84 1500
0
30
7876 ADAMS
CLERK
7788 04-JUN-84 1100
20
7900 JAMES
CLERK
7698 23-JUL-84
950
30
7902 FORD
ANALYST
7566 05-DEC-83 3000
20
7934 MILLER
CLERK
7782 21-NOV-83 1300
10
14 rows selected.

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

27

JAMES
FORD
MILLER

11400
36000
15600

Se a expresso aritmtica contiver mais de um operador, multiplicao e diviso


so de mesma precedncia, porm com precedncia superior a adio e
subtrao, que tambm so de mesma precedncia. No caso de operadores com a
mesma precedncia, o da esquerda processado primeiro.

No exemplo abaixo, a multiplicao (250*12) realizada primeiro, e depois


somada ao salrio.

SQL> SELECT ENAME, SAL+250*12


2 FROM EMP
ENAME
SAL+250*12
---------- ---------SMITH
3800
ALLEN
4600
WARD
4250
JONES
5975
MARTIN
4250
BLAKE
5850
CLARK
5450
SCOTT
6000
KING
8000
TURNER
4500
ADAMS
4100
JAMES
3950
FORD
6000
MILLER
4300

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
37200
CLARK
32400
SCOTT
39000
KING
63000
TURNER
21000
ADAMS
16200
JAMES
14400
FORD
39000
MILLER
18600

28

Nomes alternativos para ttulos de colunas


Para mostrar o resultado de uma consulta, o SQL*PLUS normalmente utiliza o
nome da coluna como ttulo da coluna. Em muitos casos, isto torna o ttulo sem
significado. Pode ser alterado o ttulo da coluna usando-se um Alis.

O Alis especificado escrevendo-se um texto aps item a ser mostrado na


clusula SELECT. Por padro, o nome do Alis convertido para letras maisculas,
e no pode conter espaos em branco, a menos que seja colocado entre aspas.

Para mostrar como ttulo da coluna SALARIO ANUAL no lugar de SAL*12, podemos
escrever:

SQL> SELECT ENAME NOME, SAL*12 SALARIO ANUAL, COMM


2 FROM EMP
NOME
SALARIO ANUAL 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
14 rows selected.

Nota: somente na clusula SELECT o Alis pode ser usado, nas outras clusulas
no.

29

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.

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.

30

SQL> COLUMN EMPREGADO FORMAT A20


SQL> SELECT EMPNO||'-'||ENAME EMPREGADO,
2 'TRABALHA NO DEPARTAMENTO',
3 DEPTNO
4 FROM EMP
EMPREGADO
'TRABALHANODEPARTAMENTO' DEPTNO
-------------------- ------------------------ ------7369-SMITH
TRABALHA NO DEPARTAMENTO
20
7499-ALLEN
TRABALHA NO DEPARTAMENTO
30
7521-WARD
TRABALHA NO DEPARTAMENTO
30
7566-JONES
TRABALHA NO DEPARTAMENTO
20
7654-MARTIN
TRABALHA NO DEPARTAMENTO
30
7698-BLAKE
TRABALHA NO DEPARTAMENTO
30
7782-CLARK
TRABALHA NO DEPARTAMENTO
10
7788-SCOTT
TRABALHA NO DEPARTAMENTO
20
7839-KING
TRABALHA NO DEPARTAMENTO
10
7844-TURNER
TRABALHA NO DEPARTAMENTO
30
7876-ADAMS
TRABALHA NO DEPARTAMENTO
20
7900-JAMES
TRABALHA NO DEPARTAMENTO
30
7902-FORD
TRABALHA NO DEPARTAMENTO
20
7934-MILLER
TRABALHA NO DEPARTAMENTO
10
14 rows selected.

Manuseio de valores nulos


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

31

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.

A funo NVL espera dois argumentos:

a)

uma expresso

b)

um valor no nulo

Podem ser convertidos valores nulos de data, nmeros, ou caracteres:

NVL(ColunaData, 01-jan-84')

NVL(ColunaNumero, 9)

32

NVL(ColunaCaracter, alfanumrico')

Eliminao de linhas duplicadas


A no ser que seja especificado o contrrio, as linhas duplicadas no so
eliminadas dos resultados das consultas.

SQL> SELECT DEPTNO


2 FROM EMP
DEPTNO
------20
30
30
20
30
30
10
20
10
30
20
30
20
10

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

Mltiplas colunas podem ser especificadas aps a palavra DISTINCT.

SQL> SELECT DISTINCT DEPTNO, JOB


2 FROM EMP
DEPTNO JOB
------- --------10 CLERK

33

10
10
20
20
20
30
30
30

MANAGER
PRESIDENT
ANALYST
CLERK
MANAGER
CLERK
MANAGER
SALESMAN

Acima esto mostradas todas as combinaes diferentes de departamentos e


cargos.

Ordenao das linhas


Normalmente, a ordem das linhas retornadas por uma consulta indefinida. A
clusula ORDER BY pode ser usada para ordenar linhas. Se for usada, ORDER BY
deve ser sempre a ltima clusula de um comando SELECT.

Para ordenar pelo nome do empregado, usamos:

SQL> SELECT ENAME, JOB, SAL*12, DEPTNO


2 FROM EMP
3 ORDER BY ENAME
ENAME
JOB
SAL*12 DEPTNO
---------- --------- ------- ------ADAMS
CLERK
13200
20
ALLEN
SALESMAN 19200
30
BLAKE
MANAGER
34200
30
CLARK
MANAGER
29400
10
FORD
ANALYST
36000
20
JAMES
CLERK
11400
30
JONES
MANAGER
35700
20
KING
PRESIDENT 60000
10
MARTIN
SALESMAN 15000
30
MILLER
CLERK
15600
10
SCOTT
ANALYST
36000
20
SMITH
CLERK
9600
20
TURNER
SALESMAN 18000
30
WARD
SALESMAN 15000
30
14 rows selected.

Ordem padro de ordenao:

- Nmeros: menores primeiro


- Data:

mais cedo primeiro

- Caracteres:

ordem alfabtica
34

Para reverter esta ordem, pode ser utilizada a palavra DESC aps o nome da
coluna, na clusula ORDER BY.

Para listarmos os funcionrios mais novos antes dos mais antigos fazemos:

SQL> SELECT ENAME, JOB, HIREDATE


2 FROM EMP
3 ORDER BY HIREDATE DESC
ENAME
JOB
HIREDATE
---------- --------- --------JAMES
CLERK
23-JUL-84
KING
PRESIDENT 09-JUL-84
BLAKE
MANAGER 11-JUN-84
TURNER
SALESMAN 04-JUN-84
ADAMS
CLERK
04-JUN-84
CLARK
MANAGER 14-MAY-84
WARD
SALESMAN 26-MAR-84
SCOTT
ANALYST 05-MAR-84
MARTIN
SALESMAN 05-DEC-83
FORD
ANALYST 05-DEC-83
MILLER
CLERK
21-NOV-83
JONES
MANAGER 31-OCT-83
ALLEN
SALESMAN 15-AUG-83
SMITH
CLERK
13-JUN-83

possvel efetuar a ordenao por mais de uma coluna, sendo algumas em ordem
ascendente e outras em ordem descendente.

SQL> SELECT DEPTNO, JOB, ENAME


2 FROM EMP
3 ORDER BY DEPTNO, SAL DESC
DEPTNO JOB
ENAME
------- --------- ---------10 PRESIDENT KING
10 MANAGER CLARK
10 CLERK
MILLER
20 ANALYST SCOTT
20 ANALYST FORD
20 MANAGER JONES
20 CLERK
ADAMS
20 CLERK
SMITH
30 MANAGER BLAKE
30 SALESMAN ALLEN
30 SALESMAN TURNER
30 SALESMAN WARD
30 SALESMAN MARTIN
30 CLERK
JAMES

35

Exerccio: verificar como ficam os valores nulos aps a ordenao.

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

<>

diferente (^= ou !=)

Para listar os nomes, nmeros, cargos e departamentos de todos os funcionrios


com cargo CLERK, usamos:

SQL> SELECT ENAME, EMPNO, JOB, DEPTNO


2 FROM EMP
3 WHERE JOB = CLERK'

36

ENAME
EMPNO JOB
---------- ------- --------- ------SMITH
7369 CLERK
ADAMS
7876 CLERK
JAMES
7900 CLERK
MILLER
7934 CLERK

DEPTNO
20
20
30
10

Para listar o nome e o nmero dos departamentos com nmero maior que 20,
usamos:

SQL> SELECT DNAME, DEPTNO


2 FROM DEPT
3 WHERE DEPTNO > 20
DNAME
DEPTNO
-------------- ------SALES
30
OPERATIONS
40

Para sabermos que funcionrios tem comisso superior ao salrio, usamos:

SQL> SELECT ENAME, SAL, COMM


2 FROM EMP
3 WHERE COMM > SAL
ENAME
SAL COMM
---------- ------- ------MARTIN
1250 1400

Existem quatro operadores SQL, que operam sobre todos os tipos de dados.

BETWEEN...AND... entre dois valores (inclusive)


IN(lista)

idnticos a uma lista de valores

LIKE

semelhante a um modelo de caracteres

IS NULL

valor nulo

O operador BETWEEN testa valores no intervalo ou idnticos aos limites.

SQL> SELECT ENAME, SAL


2 FROM EMP
3 WHERE SAL BETWEEN 1000 AND 2000
ENAME
SAL
---------- -------

37

ALLEN
WARD
MARTIN
TURNER
ADAMS
MILLER

1600
1250
1250
1500
1100
1300

O operador IN testa os valores especificados em uma lista.

SQL> SELECT EMPNO, ENAME, SAL, MGR


2 FROM EMP
3 WHERE MGR IN ( 7902, 7566, 7788 )
EMPNO ENAME
------- ---------- ------7369 SMITH
7788 SCOTT
7876 ADAMS
7902 FORD

SAL
MGR
------800 7902
3000 7566
1100 7788
3000 7566

Se caracteres ou datas forem utilizados, devem ser envoltos por apstrofos.

Usando o operador LIKE possvel selecionar linhas de acordo com modelo


fornecido. O smbolo "%" representa qualquer seqncia de zero ou mais
caracteres. O smbolo "_" (sublinhado) representa qualquer um caracter, mas
apenas um, no mnimo e no mximo.

Para listarmos todos os empregados cujos nomes comeam com a letra "S",
usamos:
SQL> SELECT ENAME
2 FROM EMP
3 WHERE ENAME LIKE 'S%'
ENAME
---------SMITH
SCOTT

Para listar os nomes de todos os empregados que contm exatamente 4 letras,


usamos:

SQL> SELECT ENAME


2 FROM EMP
3 WHERE ENAME LIKE '____'

(quatro caracteres de sublinhado)

ENAME

38

---------WARD
KING
FORD

O operador IS NULL serve especificamente para testar valores nulos.

Para listar os funcionrios que no possuem gerente, usamos:

SQL> SELECT ENAME, MGR


2 FROM EMP
3 WHERE MGR IS NULL
ENAME
MGR
---------- ------KING

Os operadores mostrados abaixo podem ser utilizados para testes de negao:

!=

^=

<>

no igual

NOT NomeDaColuna =

no igual a

NOT NomeDaColuna >

no maior do que

NOT BETWEEN

fora da faixa especificada

NOT IN

fora da lista especificada

NOT LIKE

no semelhante ao modelo

IS NOT NULL

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

39

BLAKE
CLARK
SCOTT
KING
JAMES
FORD

2850
2450
3000
5000
950
3000

8 rows selected.

Para listar os empregados cujos cargos no comeam com a letra M, usamos:

SQL> SELECT ENAME, JOB


2 FROM EMP
3 WHERE JOB NOT LIKE 'M%'
ENAME
JOB
---------- --------SMITH
CLERK
ALLEN
SALESMAN
WARD
SALESMAN
MARTIN
SALESMAN
SCOTT
ANALYST
KING
PRESIDENT
TURNER
SALESMAN
ADAMS
CLERK
JAMES
CLERK
FORD
ANALYST
MILLER
CLERK

Para listar os empregados com gerentes, usamos:

SQL> SELECT ENAME, MGR


2 FROM EMP
3 WHERE MGR IS NOT NULL
ENAME
MGR
---------- ------SMITH
7902
ALLEN
7698
WARD
7698
JONES
7839
MARTIN
7698
BLAKE
7839
CLARK
7839
SCOTT
7566
TURNER
7698
ADAMS
7788
JAMES
7698
FORD
7566
MILLER
7782

x <> NULL

x = NULL

40

sempre falso. Nulo nunca igual a nada nem diferente de nada, nem a outro
nulo.

Consultas com condies mltiplas


Os operadores AND e OR podem ser utilizados para criar expresses lgicas
compostas.

O predicado AND espera que todas duas condies sejam verdadeiras.

O predicado OR espera que uma (ou as duas) condies sejam verdadeiras.

Nos exemplos abaixo as condies so as mesmas, porm os predicados so


diferentes.

Para listar todos os CLERKs com salrio entre 1000 e 2000, usamos:

SQL> SELECT EMPNO, ENAME, JOB, SAL


2 FROM EMP
3 WHERE SAL BETWEEN 1000 AND 2000
4 AND JOB = 'CLERK'
EMPNO ENAME
JOB
------- ---------- --------- ------7876 ADAMS
CLERK
7934 MILLER
CLERK

SAL
1100
1300

Para listar os funcionrios que so CLERK, ou que recebem entre 1000 e 2000,
usamos:

SQL> SELECT EMPNO, ENAME, JOB, SAL


2 FROM EMP
3 WHERE SAL BETWEEN 1000 AND 2000
4 OR JOB = CLERK'
EMPNO ENAME
JOB
SAL
------- ---------- --------- ------7369 SMITH
CLERK
800
7499 ALLEN
SALESMAN
1600
7521 WARD
SALESMAN
1250

41

7654
7844
7876
7900
7934

MARTIN
SALESMAN
1250
TURNER
SALESMAN
1500
ADAMS
CLERK
1100
JAMES
CLERK
950
MILLER
CLERK
1300

Quando aparecem tanto ANDs quanto ORs em uma expresso lgica, todos os
ANDs so processados antes que os ORs sejam processados.

Uma vez que AND tem precedncia sobre OR, a consulta abaixo retorna todos os
gerentes com salrio maior do que 1500, e todos os vendedores.

SQL> SELECT EMPNO, ENAME, JOB, SAL, DEPTNO


2 FROM EMP
3 WHERE SAL > 1500
4 AND JOB = 'MANAGER'
5 OR JOB = 'SALESMAN'
EMPNO ENAME
JOB
SAL DEPTNO
------- ---------- --------- ------- ------7499 ALLEN
SALESMAN
1600
30
7521 WARD
SALESMAN
1250
30
7566 JONES
MANAGER
2975
20
7654 MARTIN
SALESMAN
1250
30
7698 BLAKE
MANAGER
2850
30
7782 CLARK
MANAGER
2450
10
7844 TURNER
SALESMAN
1500
30

Para selecionar todos os vendedores e gerentes com salrio superior a 1500,


usamos:

SQL> SELECT EMPNO, ENAME, JOB, SAL, DEPTNO


2 FROM EMP
3 WHERE SAL > 1500
4 AND ( JOB = 'MANAGER' OR JOB = SALESMAN' )
EMPNO ENAME
JOB
SAL DEPTNO
------- ---------- --------- ------- ------7499 ALLEN
SALESMAN
1600
30
7566 JONES
MANAGER
2975
20
7698 BLAKE
MANAGER
2850
30
7782 CLARK
MANAGER
2450
10

Os parnteses especificam a ordem em que os operadores devem ser calculados.

Precedncia dos operadores


a) os operadores de comparao e os operadores SQL tem precedncias iguais.
42

=, !=, <, >, <=, >=, BETWEEN...AND..., IN, LIKE, IS NULL

b) NOT (para reverter o resultado lgico da expresso, WHERE NOT(sal>2000))

c) AND

d) OR

Para listar todos os gerentes, de qualquer departamento, e os CLERK do


departamento 10 apenas, usamos:

SQL> SELECT *
2 FROM EMP
3 WHERE JOB = MANAGER' OR (JOB = CLERK' AND DEPTNO = 10)
EMPNO ENAME
JOB
MGR HIREDATE
SAL COMM DEPTNO
------- ---------- --------- ------- --------- ------- ------- ------7566 JONES
MANAGER
7839 31-OCT-83 2975
20
7698 BLAKE
MANAGER
7839 11-JUN-84 2850
30
7782 CLARK
MANAGER
7839 14-MAY-84 2450
10
7934 MILLER
CLERK
7782 21-NOV-83 1300
10

Neste caso os parnteses so desnecessrios, uma vez que o AND processa


primeiro.

Resumo do comando SELECT


SELECT

[DISTINCT] {* | coluna [alis],....}

FROM

tabela

WHERE

condies

ORDER BY

{coluna | expresso} [ASC|DESC]

43

Funes que manipulam caracteres


LOWER(coluna | literal)
Transforma letras maisculas em minsculas.

SQL> SELECT LOWER(DNAME), LOWER('CURSO DE SQL')


2 FROM DEPT
LOWER(DNAME) LOWER('CURSODESQL')
-------------- -------------------accounting
curso de sql
research
curso de sql
sales
curso de sql
operations
curso de sql

UPPER(coluna | literal)
Transforma letras minsculas em maisculas.

SQL> SELECT ENAME


2 FROM EMP
3 WHERE ENAME = UPPER('smith')
ENAME
---------SMITH

INITCAP(coluna | literal)
Transforma a primeira letra da palavra em maiscula e as demais
minsculas.

SQL> SELECT INITCAP(DNAME), INITCAP(LOC)


2 FROM DEPT
INITCAP(DNAME)
INITCAP(LOC)
-------------------- -------------------Accounting
New York
Research
Dallas
Sales
Chicago
Operations
Boston

44

LPAD(coluna | literal, tamanho, 'caracter')


Preenche a sequncia de caracteres, esquerda, com o caracter e o tamanho
informados. Se o caracter de preenchimento no for informado, ser utilizado o
caracter de espao.

No exemplo abaixo, as trs colunas so preenchidas esquerda at um total de


20 caracteres. A primeira coluna foi preenchida com asteriscos, a segunda com
espaos, e a terceira com pontos. Note que a terceira coluna numrica.

SQL> SELECT LPAD(DNAME, 20, *'), LPAD(DNAME, 20), LPAD(DEPTNO, 20,'.')


2 FROM DEPT
LPAD(DNAME,20,*') LPAD(DNAME,20)
LPAD(DEPTNO,20,'.')
-------------------- -------------------- -------------------**********ACCOUNTING
ACCOUNTING ..................10
************RESEARCH
RESEARCH ..................20
***************SALES
SALES ..................30
**********OPERATIONS
OPERATIONS ..................40

RPAD(coluna | literal, tamanho, 'caracter')


Preenche a seqncia de caracteres, direta, com o caracter e o tamanho
informados. Se o caracter de preenchimento no for informado, ser utilizado o
caracter de espao.

SQL> SELECT RPAD(DNAME, 20, *'), RPAD(DNAME, 20), RPAD(DEPTNO, 20,'.')


2 FROM DEPT
RPAD(DNAME,20,'*') RPAD(DNAME,20)
RPAD(DEPTNO,20,'.')
-------------------- -------------------- -------------------ACCOUNTING********** ACCOUNTING
10..................
RESEARCH************ RESEARCH
20..................
SALES*************** SALES
30..................
OPERATIONS********** OPERATIONS
40..................

SUBSTR(coluna | literal, posio, comprimento)


Retorna uma seqncia de caracteres, a partir da posio indicada, com o
comprimento especificado.

SQL> SELECT SUBSTR('ORACLE',2,4), SUBSTR(DNAME,2), SUBSTR(DNAME,3,5)


2 FROM DEPT

45

SUBSTR('ORACLE',2,4) SUBSTR(DNAME,2) SUBSTR(DNAME,3,5)


-------------------- --------------- -------------------RACL
CCOUNTING
COUNT
RACL
ESEARCH
SEARC
RACL
ALES
LES
RACL
PERATIONS
ERATI

INSTR(coluna | literal, seqncia de caracteres', posio, n)


Encontra a posio da primeira ocorrncia da seqncia de caracteres na coluna
ou literal, se os dois ltimos parmetros forem omitidos.

Encontra a posio da n-sima ocorrncia a partir da posio indicada, se os


quatro parmetros forem fornecidos.

SQL> SELECT DNAME,


2 INSTR(DNAME,'A'), INSTR(DNAME,'ES'), INSTR(DNAME,'C',1,2)
3 FROM DEPT
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(coluna | literal, 'caracteres')


Remove os caracteres indicados esquerda da coluna ou do literal. Se nenhum
caracter for especificado, sero eliminados os espaos esquerda.

SQL> SELECT DNAME,


2 LTRIM(DNAME,'A'), LTRIM(DNAME,'AS'), LTRIM(DNAME,'ASOP')
3 FROM DEPT
DNAME
LTRIM(DNAME,'A') LTRIM(DNAME,'AS') LTRIM(DNAME,'ASOP')
-------------- ---------------- ----------------- ------------------ACCOUNTING
CCOUNTING
CCOUNTING
CCOUNTING
RESEARCH
RESEARCH
RESEARCH
RESEARCH
SALES
SALES
LES
LES
OPERATIONS
OPERATIONS
OPERATIONS
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
46

"A" quanto a letra "S". Na quarta coluna foram removidas as letras "A", "S", "O" e
"P" esquerda.

RTRIM(coluna | literal, 'caracteres')


Remove os caracteres indicados direita da coluna ou do literal. Se nenhum
caracter for especificado, sero eliminados os espaos direita.

SQL> SELECT DNAME,


2 RTRIM(DNAME,'G'), RTRIM(DNAME,'GHS'), RTRIM(DNAME,'N')
3 FROM DEPT
DNAME
RTRIM(DNAME,'G') RTRIM(DNAME,'GHS') RTRIM(DNAME,'N')
-------------- ---------------- ------------------ ---------------ACCOUNTING
ACCOUNTIN
ACCOUNTIN
ACCOUNTING
RESEARCH
RESEARCH
RESEARC
RESEARCH
SALES
SALES
SALE
SALES
OPERATIONS
OPERATIONS
OPERATION
OPERATIONS

SOUNDEX(coluna | literal)
Retorna uma seqncia de caracteres que representa o som das palavras contidas
na coluna ou no literal.

SQL> SELECT ENAME, SOUNDEX(ENAME)


2 FROM EMP
3 WHERE SOUNDEX(ENAME) = SOUNDEX('FRED')
ENAME
SOUNDEX(ENAME)
---------- -------------------FORD
F630

LENGTH(coluna | literal)
Retorna o nmero de caracteres (ou dgitos) na coluna ou literal especificados.

SQL> SELECT LENGTH('CURSO DE SQL'), LENGTH(DEPTNO), LENGTH(DNAME)


2 FROM DEPT
LENGTH('CURSODESQL')
LENGTH(DEPTNO)
--------------------- --------------------- ---------------------

LENGTH(DNAME)

47

12
12
12
12

2
2
2
2

10
8
5
10

TRANSLATE(coluna | literal, de, para)


Substitui os caracteres do argumento "de" pelos caracteres do argumento "para",
na coluna ou literal especificados. Todas as ocorrncias dos caracteres do
parmetro "de" so substitudas pelos caracteres no parmetro "para". Caracteres
do parmetro "de" sem correspondncia no parmetro "para" so removidos.

No exemplo abaixo foram trocados os caracteres "C" por "P" nos nomes dos
funcionrios.

SQL> SELECT ENAME, TRANSLATE(ENAME,'C','P')


2 FROM EMP
3 WHERE DEPTNO = 10
ENAME
TRANSLATE(ENAME,'C','P')
---------- ------------------------CLARK
PLARK
KING
KING
MILLER
MILLER

No exemplo abaixo foram trocados "A" por "I", e "R" por "T", nos cargos.

SQL> SELECT JOB, TRANSLATE(JOB,'AR','IT')


2 FROM EMP
3 WHERE DEPTNO = 10
JOB
TRANSLATE(JOB,'AR','IT')
--------- -----------------------------MANAGER MINIGET
PRESIDENT PTESIDENT
CLERK
CLETK

REPLACE(coluna | literal, de, para)


Substitui a seqncia de caracteres "de" pela seqncia de caracteres "para", na
coluna ou literal especificados.

No exemplo abaixo SALESMAN substitudo por VENDEDOR:

48

SQL> SELECT JOB, REPLACE(JOB,'SALESMAN','VENDEDOR')


2 FROM EMP

JOB
REPLACE(JOB,'SALESMAN','VENDEDOR')
--------- ---------------------------------------CLERK
CLERK
SALESMAN VENDEDOR
SALESMAN VENDEDOR
MANAGER MANAGER
SALESMAN VENDEDOR
MANAGER MANAGER
MANAGER MANAGER
ANALYST ANALYST
PRESIDENT PRESIDENT
SALESMAN VENDEDOR
CLERK
CLERK
CLERK
CLERK
ANALYST ANALYST
CLERK
CLERK
14 rows selected.

No exemplo abaixo, "CO" foi substitudo por "PX":


SELECT ENAME, REPLACE(ENAME,'CO','PX')
FROM EMP
ENAME
REPLACE(ENAME,'CO','PX')
---------- -----------------------SMITH
SMITH
ALLEN
ALLEN
WARD
WARD
JONES
JONES
MARTIN
MARTIN
BLAKE
BLAKE
CLARK
CLARK
SCOTT
SPXTT <-------------KING
KING
TURNER
TURNER
ADAMS
ADAMS
JAMES
JAMES
FORD
FORD
MILLER
MILLER
14 rows selected.

Funes aninhadas
As funes que operam sobre uma nica linha podem ser aninhadas, sendo que
neste caso as funes internas so executadas antes das externas.

49

SQL> SELECT DNAME, LENGTH(DNAME),


2 LENGTH(DNAME)-LENGTH(TRANSLATE(DNAME,'AS','A'))
3 FROM DEPT
DNAME
LENGTH(DNAME)LENGTH(DNAME)-LENGTH(TRANSLATE(DNAME,'AS','A'))
---------- -----------------------------------------------------------ACCOUNTING
10
0
RESEARCH
8
1
SALES
5
2
OPERATIONS
10
1

Funes numricas
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

TRUNC(coluna | literal, n)
Trunca o valor da coluna ou do literal na n-sima posio.

SQL> SELECT TRUNC(45.923,1), TRUNC(45.923), TRUNC(42.323,-1),


TRUNC(SAL/32,2)
2 FROM EMP
3 WHERE DEPTNO = 10
TRUNC(45.923,1)
TRUNC(45.923) TRUNC(42.323,-1) TRUNC(SAL/32,2)
----------------- ----------------- ----------------- ----------------45.9
45
40
76.56
45.9
45
40
156.25
45.9
45
40
40.62

50

CEIL(coluna | literal)
Retorna o menor inteiro maior ou igual ao valor da coluna ou do literal.

SQL> SELECT CEIL(SAL), CEIL(99.9), CEIL(101.76), CEIL(-11.1)


2 FROM EMP
3 WHERE SAL BETWEEN 3000 AND 5000
CEIL(SAL) CEIL(99.9) CEIL(101.76) CEIL(-11.1)
--------- ---------- ------------ ----------3000
100
102
-11
5000
100
102
-11
3000
100
102
-11

FLOOR(coluna | literal)
Retorna o maior inteiro menor ou igual ao valor da coluna ou literal.

SQL> SELECT FLOOR(SAL), FLOOR(99.9), FLOOR(101.76), FLOOR(-11.1)


2 FROM EMP
3 WHERE FLOOR(SAL) BETWEEN 3000 AND 5000

FLOOR(SAL) FLOOR(99.9) FLOOR(101.76) FLOOR(-11.1)


---------- ----------- ------------- -----------3000
99
101
-12
5000
99
101
-12
3000
99
101
-12

POWER(coluna | literal, n)
Eleva a coluna ou literal a n-sima potncia.

SQL> SELECT SAL, POWER(SAL,2), POWER(SAL,3), POWER(50,5)


2 FROM EMP
3 WHERE DEPTNO = 10
SAL
POWER(SAL,2)
POWER(SAL,3)
POWER(50,5)
----------------- ----------------- ----------------- ----------------2450
6002500
14706125000
312500000
5000
25000000
125000000000
312500000
1300
1690000
2197000000
312500000

51

EXP(coluna | literal)
Eleva e (2.71828183...) coluna ou literal.

SELECT EXP(4)
FROM DUAL
EXP(4)
---------54.59815
1 row selected.

LOG(base, coluna | literal)


Calcula o logaritmo da coluna ou do literal na base especificada.

SELECT LOG(10,100)
FROM DUAL
LOG(10,100)
----------2
1 row selected.

LN(coluna | literal)
Calcula o logaritmo neperiano da coluna ou do literal.

SELECT LN(95)
FROM DUAL
LN(95)
---------4.55387689

SQRT(coluna | literal)
Retorna a raiz quadrada da coluna ou do literal.

SQL> SELECT SAL, SQRT(SAL), SQRT(40), SQRT(COMM)


2 FROM EMP
3 WHERE COMM > 0

52

SAL
SQRT(SAL)
SQRT(40)
SQRT(COMM)
---- ----------------- ----------------- ----------------1600
40 6.324555320336759 17.32050807568877
1250 35.35533905932738 6.324555320336759 22.3606797749979
1250 35.35533905932738 6.324555320336759 37.41657386773941

SIGN(coluna | literal)
Retorna -1 se o valor da coluna ou do literal for negativo, retorna 0 se for igual a
zero, ou retorna 1 se for maior do que zero.

SQL> SELECT SAL-COMM, SIGN(SAL-COMM), COMM-SAL, SIGN(COMM-SAL)


2 FROM EMP
3 WHERE DEPTNO = 30
SAL-COMM SIGN(SAL-COMM)
COMM-SAL
----------------- ----------------- ----------------- ----------------1300
1
-1300
-1
750
1
-750
-1
-150
-1
150
1
1500
1
-1500
-1

SIGN(COMM-SAL)

Salrios maiores do que a comisso podem ser listados conforme mostrado


abaixo:

SQL> SELECT ENAME, SAL, COMM


2 FROM EMP
3 WHERE SIGN(SAL-COMM) = 1
ENAME
SAL
COMM
---------- ----------------- ----------------ALLEN
1600
300
WARD
1250
500
TURNER
1500
0

ABS(coluna | literal)
Retorna o valor absoluto da coluna ou do literal.

SQL> SELECT SAL, COMM, COMM-SAL, ABS(COMM-SAL)


2 FROM EMP
3 WHERE DEPTNO = 30
SAL
COMM
COMM-SAL
ABS(COMM-SAL)
----------------- ----------------- ----------------- ----------------1600
300
-1300
1300
1250
500
-750
750
1250
1400
150
150

53

2850
1500
950

-1500

1500

MOD(valor1, valor2)
Retorna o resto da diviso de valor1 por valor2.

SQL> SELECT SAL, COMM, MOD(SAL,COMM), MOD(100,40)


2 FROM EMP
3 WHERE DEPTNO = 30
4 ORDER BY COMM
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

Funes trigonomtricas
Calculam o seno (SIN), coseno (COS), e tangente (TAN) da coluna ou literal.

SELECT SIN(30*3.141592654/180),
COS(60*3.141592654/180),
TAN(45*3.141592654/180)
FROM DUAL
SIN(30*3.1
COS(60*3.1
TAN(45*3.1
---------------------------.5
.5
1

Funes hiperblicas
Calculam o seno hiperblico (SINH), coseno hiperblico (COSH) e tangente
hiperblica (TANH) da coluna ou literal.

SELECT SINH(1), COSH(0), TANH(.5)


FROM DUAL
SINH(1)
----------

-------

COSH(0)
----------

TANH(.5)

54

1.17520119

.462117157

55

Funes que manipulam datas


SYSDATE
SYSDATE uma pseudo-coluna que retorna a data e a hora corrente. A tabela
SYS.DUAL pblica, contm apenas uma coluna chamada DUMMY, e uma linha
com o valor 'X'. Esta tabela til para retornar um nico valor de uma constante,
de uma pseudo-coluna, ou de uma expresso. Abaixo a tabela SYS.DUAL foi
utilizada para retornar a data corrente.

SQL> SELECT SYSDATE


2 FROM SYS.DUAL
SYSDATE
--------25-OCT-94

Aritmtica de datas
Datas podem ser somadas ou subtradas de outras datas, ou de valores
numricos.

data+nmero

Soma o nmero de dias data, produzindo outra


data

data-nmero

Subtrai o nmero de dias data, produzindo


outra data

data-data

Subtrai uma data da outra, produzindo nmero


de dias

data+nmero/24

Soma nmero de horas data, produzindo outra


data

SQL> SELECT HIREDATE, HIREDATE+7, HIREDATE-7, SYSDATE-HIREDATE


2 FROM EMP
3 WHERE HIREDATE LIKE '%JUN%'
HIREDATE HIREDATE+7 HIREDATE-7 SYSDATE-HIREDATE
--------- ---------- ---------- ----------------13-JUN-83 20-JUN-83 06-JUN-83 4152.351851851852
11-JUN-84 18-JUN-84 04-JUN-84 3788.351851851852
04-JUN-84 11-JUN-84 28-MAY-84 3795.351851851852
04-JUN-84 11-JUN-84 28-MAY-84 3795.351851851852

56

A operao SYSDATE-HIREDATE retorna o nmero de dias entre a admisso do


empregado e a data atual.

MONTHS_BETWEEN(data1,data2)
Retorna o nmero de meses decorridos entre data1 e data2.

SQL> SELECT MONTHS_BETWEEN(SYSDATE,HIREDATE),


2 MONTHS_BETWEEN('01-JAN-84','05-NOV-88')
3 FROM EMP
4 WHERE MONTHS_BETWEEN(SYSDATE,HIREDATE) > 59
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(data, meses)
Adiciona o nmero de meses especificados data.

SQL> SELECT HIREDATE, ADD_MONTHS(HIREDATE,3),


ADD_MONTHS(HIREDATE,-3)
2 FROM EMP
3 WHERE DEPTNO=20
HIREDATE ADD_MONTHS(HIREDATE,3) ADD_MONTHS(HIREDATE,-3)
--------- ---------------------- ----------------------13-JUN-83 13-SEP-83
13-MAR-83
31-OCT-83 31-JAN-84
31-JUL-83
05-MAR-84 05-JUN-84
05-DEC-83
04-JUN-84 04-SEP-84
04-MAR-84
05-DEC-83 05-MAR-84
05-SEP-83

57

NEXT_DAY(data, dia_da_semana)
Data do prximo dia da semana aps data.

SQL> SELECT HIREDATE, NEXT_DAY(HIREDATE,'FRIDAY'),


NEXT_DAY(HIREDATE,6)
2 FROM EMP
3 WHERE DEPTNO = 10
HIREDATE NEXT_DAY(HIREDATE,'FRIDAY') NEXT_DAY(HIREDATE,6)
--------- --------------------------- -------------------14-MAY-84 18-MAY-84
18-MAY-84
09-JUL-84 13-JUL-84
13-JUL-84
21-NOV-83 25-NOV-83
25-NOV-83

LAST_DAY(data)
Retorna a data do ltimo dia do ms da data especificada.

SQL> SELECT SYSDATE, LAST_DAY(SYSDATE), HIREDATE,


2 LAST_DAY(HIREDATE), LAST_DAY('15-FEB-88')
3 FROM EMP
4 WHERE DEPTNO = 20

SYSDATE LAST_DAY HIREDATE LAST_DAY LAST_DAY


(SYSDATE)
(HIREDATE) ('15-FEB-88')
--------- ---------- --------- ---------- ------------25-OCT-94 31-OCT-94 13-JUN-83 30-JUN-83 29-FEB-88
25-OCT-94 31-OCT-94 31-OCT-83 31-OCT-83 29-FEB-88
25-OCT-94 31-OCT-94 05-MAR-84 31-MAR-84 29-FEB-88
25-OCT-94 31-OCT-94 04-JUN-84 30-JUN-84 29-FEB-88
25-OCT-94 31-OCT-94 05-DEC-83 31-DEC-83 29-FEB-88

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.

58

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

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

Funes de converso
Formatos de Data
Formato

Significado

CC ou SCC

Sculo; S prefixa datas Antes de Cristo com "-"

YYYY ou SYYYY

Ano; S prefixa datas Antes de Cristo com "-"

YYY, YY, Y

ltimos 3,2,1 dgitos do ano

59

Y,YYY

Ano com vrgula separando os milhares

YEAR ou SYEAR

Ano por extenso. S prefixa datas Antes de Cristo


com "-"

BC ou AD

Indicador de Antes ou Depois de Cristo

B.C. ou A.D.

Idntico a BC/AD com pontos

Quarto do ano (trimestre)

MM

Ms

Month

Ms por extenso, com 9 caracteres, espaos


direita

MON

Nome do ms, com 3 caracteres

WW ou W

Semana do ano ou do ms

DDD, DD, D

Dia do ano, do ms, ou da semana

DAY

Dia por extenso, com 9 caracteres, espaos


direita

DY

Nome do dia, abreviado com 3 caracteres

Dia Juliano (dias desde 31/12/4713 AC)

AM ou PM

Indicador de meridiano

A.M. ou P.M.

Indicador de meridiano com pontos

HH ou HH12

Hora do dia no intervalo 1 a 12

HH24

Hora do dia no intervalo 0 a 23

MI

Minuto

SS

Segundo

SSSS

Segundos aps meia noite (0-86399)

/., etc...

Pontuao reproduzida no resultado

"..."

Caracteres entre aspas reproduzido no resultado

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")

60

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

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

Adicionando-se o prefixo fm (fill mode) para remover os espaos, e utilizando-se


letras maisculas e minsculas temos:
SQL> SELECT TO_CHAR(SYSDATE, 'fmDay, ddth Month YYYY')
2 FROM SYS.DUAL
TO_CHAR(SYSDATE,'FMDAY,DDTHMONTHYYYY')
-------------------------------------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

61

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.

Formatos Numricos
Format
o

Significado

Exemplo

posio numrica (um 9 para cada


nmero)

999999

1234

zeros esquerda

099999

001234

cifro esquerda

$99999

$1234

ponto decimal na posio especificada

999999.99

vrgula na posio especificada

999,999

1,234

MI

sinal de menos direita

099999MI

1234-

PR

nmeros negativos entre parnteses

999999PR

(1234)

EEEE

notao cientfica

99.999EEE
E

1.234E+0
3

multiplicar por 10 elevado a n, sendo


n o nmero de 9 direita de V

9999V99

123400

mostrar resultados zero como


espaos, no como 0.

B9999.99

1234.00

1234.00

TO_NUMBER(cadeia_de_caracteres)
Converte a cadeia de caracteres, que deve conter um nmero, em um valor
numrico.
62

SQL> SELECT EMPNO, ENAME, JOB, SAL


2 FROM EMP
3 WHERE SAL > TO_NUMBER('1500')
EMPNO ENAME
JOB
SAL
----- ---------- --------- ------7499 ALLEN
SALESMAN
1600
7566 JONES
MANAGER
2975
7698 BLAKE
MANAGER
2850
7782 CLARK
MANAGER
2450
7788 SCOTT
ANALYST
3000
7839 KING
PRESIDENT 5000
7902 FORD
ANALYST
3000
7 rows selected.

TO_DATE('cadeia_de_caracteres','formato')
Retorna a data contida na cadeia de caracteres conforme o formato especificado.
Se o formato for omitido ser assumido DD-MON-YY.

SQL> SELECT EMPNO, ENAME, HIREDATE


2 FROM EMP
3 WHERE HIREDATE = TO_DATE('June 4,1984','Month dd,yyyy')
EMPNO ENAME
HIREDATE
----- ---------- --------7844 TURNER
04-JUN-84
7876 ADAMS
04-JUN-84

Funes que aceitam qualquer tipo de dado


DECODE(coluna|expresso,pes1,res1,[pes2,res2,...],default)
Funciona como uma estrutura CASO, substituindo as pesquisas pelos resultados. A
coluna ou expresso comparada com os argumentos de pesquisa, e se houver
igualdade o resultado correspondente retornado. Se no houver igualdade, o
valor default retornado.

Argumentos:

coluna|expresso a coluna ou expresso a ser avaliada


pes1

o primeiro valor a ser testado


63

res1

o valor a ser retornado se coluna ou expresso igual a

pes2

o segundo valor a ser testado

res2

o valor a ser retornado se coluna ou expresso igual a

pes1

pes2
default
for diferente

o valor a ser retornado se a coluna ou expresso


de pes1, pes2,...,pesN.

Notas:

-coluna ou expresso podem ser de qualquer tipo de dados.

-pes(quisa) deve ter o mesmo tipo de dados da coluna ou expresso

-O valor retornado sempre do mesmo tipo do terceiro argumento


(resultado1)
No exemplo abaixo o cargo CLERK transformado em WORKER, o cargo MANAGER
transformado em BOSS, e os demais cargos so transformados em UNDEFINED.

SQL> SELECT ENAME, JOB,


2 DECODE(JOB, 'CLERK','WORKER','MANAGER','BOSS','UNDEFINED')
3 DECODED_JOB
4 FROM EMP
ENAME
JOB
DECODED_JOB
---------- --------- ----------SMITH
CLERK
WORKER
ALLEN
SALESMAN UNDEFINED
WARD
SALESMAN UNDEFINED
JONES
MANAGER BOSS
MARTIN
SALESMAN UNDEFINED
BLAKE
MANAGER BOSS
CLARK
MANAGER BOSS
SCOTT
ANALYST UNDEFINED
KING
PRESIDENT UNDEFINED
TURNER
SALESMAN UNDEFINED
ADAMS
CLERK
WORKER
JAMES
CLERK
WORKER
FORD
ANALYST UNDEFINED
MILLER
CLERK
WORKER

Para mostrar as percentagens de bnus relativas s faixas salariais:


64

SQL> SELECT GRADE,


2 DECODE(GRADE,'1','15%','2','10%','3','8%','5%') BONUS
3 FROM SALGRADE
GRADE BONUS
----- ----1 15%
2 10%
3 8%
4 5%
5 5%

O exemplo abaixo causa um erro porque ename (caracter) tem tipo diferente do
terceiro argumento sal (numrico).

SQL> SELECT * FROM EMP


2 ORDER BY DECODE(2,1,SAL,2,ENAME,SAL)
*
ERROR: ORA-01722: invalid number
no rows selected

Para fazer um aumento salarial diferenciado por cargo:

SQL> SELECT JOB, SAL,


2 DECODE(JOB,'ANALYST',SAL*1.1, 'CLERK',SAL*1.15,
3 'MANAGER',SAL*0.95, SAL) SALARIO_DECODIFICADO
4 FROM EMP
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.

NVL(coluna|valor, valor)

65

Converte valores nulos do primeiro argumento no valor especificado no segundo


argumento.
SQL> SELECT SAL*12+NVL(COMM,0), NVL(COMM,1000),
SAL*12+NVL(COMM,1000)
2 FROM EMP
3 WHERE DEPTNO = 10
SAL*12+NVL(COMM,0) NVL(COMM,1000) SAL*12+NVL(COMM,1000)
------------------ ----------------- --------------------29400
1000
30400
60000
1000
61000
15600
1000
16600

GREATEST(coluna|valor, coluna|valor,...)
Retorna o maior dos valores de uma lista de valores.

SQL> SELECT GREATEST(1000,2000), GREATEST(SAL,COMM)


2 FROM EMP
3 WHERE DEPTNO = 30
GREATEST(1000,2000) GREATEST(SAL,COMM)
------------------- -----------------2000
1600
2000
1250
2000
1400
2000
2000
1500
2000
6 rows selected.

LEAST(coluna|valor, coluna|valor,...)
Retorna o menor dos valores de uma lista de valores.
SQL> SELECT LEAST(1000,2000), LEAST(SAL,COMM)
2 FROM EMP
3 WHERE DEPTNO = 30
LEAST(1000,2000) LEAST(SAL,COMM)
----------------- ----------------1000
300
1000
500
1000
1250
1000
1000
0
1000

VSIZE(coluna|valor)
66

Retorna o nmero de bytes utilizado internamente pelo Oracle para representar o


valor.

SQL> SELECT DEPTNO, VSIZE(DEPTNO), VSIZE(HIREDATE),


2 VSIZE(SAL), VSIZE(ENAME)
3 FROM EMP
4 WHERE DEPTNO = 10
DEPTNO VSIZE(DEPTNO) VSIZE(HIREDATE)
VSIZE(SAL)
------- --------------- --------------- --------------- --------------10
2
7
3
5
10
2
7
2
4
10
2
7
2
6

VSIZE(ENAME)

Funes aninhadas revisitadas


SQL> SELECT ENAME, NVL(TO_CHAR(MGR),'NAO GERENCIAVEL')
2 FROM EMP
3 WHERE MGR IS NULL
ENAME
NVL(TO_CHAR(MGR),'NAOGERENCIAVEL')
---------- ---------------------------------KING
NAO GERENCIAVEL
SQL> SELECT SYSDATE,
2 TO_CHAR(NEXT_DAY(ADD_MONTHS(SYSDATE,2),'FRIDAY'),
3 'Day dd Month YYYY')
4 FROM SYS.DUAL
SYSDATE
TO_CHAR(NEXT_DAY(ADD_MONTHS(SYSDATE,2),'FRIDAY'),'DAYDDMONTHYYYY')
--------- -------------------------------------------------------25-OCT-94 Friday 30 December 1994

67

Usando funes de grupo


Para calcular o salrio mdio de todos os empregados:

SQL> SELECT AVG(SAL)


2 FROM EMP
AVG(SAL)
----------------2073.214285714286

Note que toda a tabela EMP foi tratada como um nico grupo.

Uma funo de grupo pode ser aplicada sobre um subconjunto das linhas usando a
clusula WHERE.

Para encontrar o salrio mnimo recebido por um CLERK:

SQL> SELECT MIN(SAL)


2 FROM EMP
3 WHERE JOB='CLERK'
MIN(SAL)
----------------800

Para contar o nmero de empregados que trabalham no departamento 20:

SQL> SELECT COUNT(*)


2 FROM EMP
3 WHERE DEPTNO = 20
COUNT(*)
----------------5

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.

68

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

Excluindo linhas dos grupos


A clusula WHERE pode ser utilizada para excluir linhas, antes que estas sejam
grupadas.

Para mostrar o salrio mdio de cada cargo, excluindo os gerentes:

SQL> SELECT JOB, AVG(SAL)


2 FROM EMP
3 WHERE JOB != 'MANAGER'
4 GROUP BY JOB
JOB
AVG(SAL)
--------- ----------------ANALYST
3000
CLERK
1037.5
PRESIDENT
5000
SALESMAN
1400

Grupos dentro de grupos


Os grupos podem conter subgrupos, fornecendo resultados para grupos dentro de
grupos.

Para listar o salrio mdio de cada cargo em cada departamento:

SQL> SELECT DEPTNO, JOB, AVG(SAL)


2 FROM EMP
3 GROUP BY DEPTNO, JOB
DEPTNO JOB
AVG(SAL)
----------------- --------- -----------------

69

10
10
10
20
20
20
30
30
30

CLERK
MANAGER
PRESIDENT
ANALYST
CLERK
MANAGER
CLERK
MANAGER
SALESMAN

1300
2450
5000
3000
950
2975
950
2850
1400

9 rows selected.

Funes disponveis de grupo


Funo

Valor retornado

AVG

Valor mdio de 'n', ignorando os valores nulos.

([DISTINCT|ALL]n)
COUNT
([DISTINCT|ALL]exp*)

Nmero de ocorrncias no nulas da expresso. O


'*' obriga a contagem total, incluindo valores
duplicados e nulos.

MAX

Valor mximo da expresso.

([DISTINCT|ALL]exp)
MIN

Valor mnimo da expresso.

([DISTINCT|ALL]exp)
STDDEV

Desvio padro de 'n', ignorando os valores nulos.

([DISTINCT|ALL]n)
SUM
([DISTINCT|ALL]n)
VARIANCE

Soma dos valores de 'n', ignorando os valores


nulos.
Varincia de 'n', ignorando os valores nulos.

([DISTINCT|ALL]n)

Quando DISTINCT especificado, somente os valores no duplicados so


considerados pela funo, caso contrrio ALL assumido, considerando todos os
valores, inclusive os duplicados.

Todas as funes de grupo, exceto COUNT(*), ignoram os valores nulos.

70

Podem ser fornecidas expresses dos tipos caracter, nmero ou data quando 'exp'
estiver indicado. Quando 'n' estiver indicado, somente valores numricos so
aceitos.

Funes de grupo e resultados individuais


A declarao abaixo mostra o salrio mximo para cada tipo de cargo. O resultado
no muito significativo pois no mostra o cargo, mas mostra que no h
obrigao de listar as colunas pelas quais o grupamento realizado.

SQL> SELECT MAX(SAL)


2 FROM EMP
3 GROUP BY JOB
MAX(SAL)
----------------3000
1300
2975
5000
1600

Tambm no h necessidade de colocar as colunas a serem grupadas antes das


outras:

SQL> SELECT MAX(SAL), JOB


2 FROM EMP
3 GROUP BY JOB
MAX(SAL) JOB
----------------- --------3000 ANALYST
1300 CLERK
2975 MANAGER
5000 PRESIDENT
1600 SALESMAN

Lembre-se que quando funes de grupo so includas na clusula SELECT, todas


as colunas que no contm funo de grupo devem aparecer na clusula GROUP
BY.

O exemplo abaixo mostra o erro causado pela utilizao da funo de grupo


MIN(SAL), sem haver a clusula GROUP BY em DEPTNO:
71

SQL> SELECT DEPTNO, MIN(SAL)


2 FROM EMP
SELECT DEPTNO, MIN(SAL)
*
ERROR at line 1:
ORA-00937: not a single-group group function

Grupando-se por DEPTNO o comando processa corretamente.

SQL> SELECT DEPTNO, MIN(SAL)


2 FROM EMP
3 GROUP BY DEPTNO
DEPTNO
MIN(SAL)
----------------- ----------------10
1300
20
800
30
950

Toda coluna ou expresso da clusula SELECT que no


uma funo de agregao deve aparecer na clusula
GROUP BY.

A clusula HAVING
Somente os grupos que atendem as condies especificadas na clusula HAVING
so selecionados. A clusula HAVING opera sobre a clusula GROUP BY de maneira
semelhante a que a clusula WHERE opera sobre a clusula SELECT.

Para mostrar o salrio mdio dos departamento que possuem mais de trs
funcionrios:

SQL> SELECT DEPTNO, AVG(SAL)


2 FROM EMP
3 GROUP BY DEPTNO
4 HAVING COUNT(*) > 3
DEPTNO
AVG(SAL)
----------------- ----------------20
2175
30 1566.666666666667

Para mostrar os cargos com salrio mximo acima de 3000:


72

SQL> SELECT JOB, MAX(SAL)


2 FROM EMP
3 HAVING MAX(SAL) >= 3000
4 GROUP BY JOB
JOB
MAX(SAL)
--------- ----------------ANALYST
3000
PRESIDENT
5000

Embora a clusula HAVING possa ser escrita antes da clusula GROUP BY, a leitura
torna-se mais fcil quando a clusula HAVING aparece aps a clusula GROUP BY.
Os grupos so formados e as funes de grupo so calculadas antes da clusula
HAVING ser aplicada.

A clusula WHERE no pode ser usada para restringir os grupos a serem


retornados. A clusula WHERE na declarao abaixa ilegal:

SQL> SELECT DEPTNO, AVG(SAL)


2 FROM EMP
3 WHERE AVG(SAL) > 2000
4 GROUP BY DEPTNO
WHERE AVG(SAL) > 2000
*
ERROR at line 3:
ORA-00934: group function is not allowed here

A clusula HAVING deve ser usada neste caso.

SQL> SELECT DEPTNO, AVG(SAL)


2 FROM EMP
3 GROUP BY DEPTNO
4 HAVING AVG(SAL) > 2000
DEPTNO
AVG(SAL)
----------------- ----------------10 2916.666666666667
20
2175

A clusula WHERE utilizada para aplicar restries


sobre linhas individualmente, enquanto a clusula
HAVING utilizada para aplicar restries sobre grupos
de linhas.

73

As clusulas WHERE e HAVING podem ser utilizadas em conjunto.

Para calcular o salrio mdio de todos os cargos, exceto o cargo de gerente:

SQL> SELECT JOB, AVG(SAL)


2 FROM EMP
3 WHERE JOB <> 'MANAGER'
4 GROUP BY JOB
5 HAVING AVG(SAL) > 2000
JOB
AVG(SAL)
--------- ----------------ANALYST
3000
CLERK
1037.5
PRESIDENT
5000

Ordem das clusulas


SELECT

lista_de_colunas

FROM

lista_de_tabelas

WHERE

condies_de_linha

GROUP BY

lista_de_colunas

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

74

Junes equivalentes
Para levantar, manualmente, o nome do departamento em que um funcionrio
trabalha, primeiro seria levantado na tabela EMP o nmero do departamento do
empregado, e, em seguida, seria levantado na tabela DEPT o nome
correspondente ao nmero do departamento. Este relacionamento entre as duas
tabelas chamado de juno equivalente (equi-join), uma vez o nmero do
departamento nas duas tabelas o mesmo.

A condio de juno especificada na clusula WHERE usando o operador '='.

SQL> SELECT ENAME, JOB, DNAME


2 FROM EMP, DEPT
3 WHERE EMP.DEPTNO = DEPT.DEPTNO
ENAME
JOB
DNAME
---------- --------- -------------CLARK
MANAGER ACCOUNTING
KING
PRESIDENT ACCOUNTING
MILLER
CLERK
ACCOUNTING
SMITH
CLERK
RESEARCH
ADAMS
CLERK
RESEARCH
FORD
ANALYST RESEARCH
SCOTT
ANALYST RESEARCH
JONES
MANAGER RESEARCH
ALLEN
SALESMAN SALES
BLAKE
MANAGER SALES
MARTIN
SALESMAN SALES
JAMES
CLERK
SALES
TURNER
SALESMAN SALES
WARD
SALESMAN SALES

As linhas da tabela EMP foram combinadas com as linhas da tabela DEPT para
obteno dos nmeros dos departamentos.

O nome da tabela colocado antes do nome da coluna, para diferenciar colunas


com mesmo nome em tabelas diferentes.

Todas as colunas podem ser prefixadas com o nome da tabela, porm este
procedimento s obrigatrio quando existe ambigidade.

SQL> SELECT DEPT.DEPTNO, ENAME, JOB, DNAME


2 FROM EMP, DEPT

75

3 WHERE EMP.DEPTNO = DEPT.DEPTNO


4 ORDER BY DEPT.DEPTNO
DEPTNO ENAME
JOB
DNAME
------- ---------- --------- -------------10 CLARK
MANAGER ACCOUNTING
10 KING
PRESIDENT ACCOUNTING
10 MILLER
CLERK
ACCOUNTING
20 SMITH
CLERK
RESEARCH
20 ADAMS
CLERK
RESEARCH
20 FORD
ANALYST RESEARCH
20 SCOTT
ANALYST RESEARCH
20 JONES
MANAGER RESEARCH
30 ALLEN
SALESMAN SALES
30 BLAKE
MANAGER SALES
30 MARTIN
SALESMAN SALES
30 JAMES
CLERK
SALES
30 TURNER
SALESMAN SALES
30 WARD
SALESMAN SALES
14 rows selected.

Alis para nomes de tabelas podem ser usado de forma semelhante que foi
usada para alis de nomes de colunas. O nome do alis escrito aps o nome da
tabela. No exemplo abaixo foi utilizado o alis 'E' para a tabela EMP, e o alis 'D'
para a tabela DEPT.

SQL> SELECT E.ENAME, D.DEPTNO, D.DNAME


2 FROM EMP E, DEPT D
3 WHERE E.DEPTNO = D.DEPTNO
4 ORDER BY D.DEPTNO
ENAME
DEPTNO DNAME
---------- ------- -------------CLARK
10 ACCOUNTING
KING
10 ACCOUNTING
MILLER
10 ACCOUNTING
SMITH
20 RESEARCH
ADAMS
20 RESEARCH
FORD
20 RESEARCH
SCOTT
20 RESEARCH
JONES
20 RESEARCH
ALLEN
30 SALES
BLAKE
30 SALES
MARTIN
30 SALES
JAMES
30 SALES
TURNER
30 SALES
WARD
30 SALES
14 rows selected.

Produto
Quando a condio de juno invlida ou omitida completamente, o resultado
um Produto Cartesiano, e todas as combinaes de linha sero retornadas.
76

O Produto tende a gerar um grande nmero de linhas, e o resultado raramente


til.

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.

SQL> SELECT E.ENAME, E.SAL, S.GRADE


2 FROM EMP E, SALGRADE S
3 WHERE E.SAL BETWEEN S.LOSAL AND S.HISAL
ENAME
SAL GRADE
---------- ------- ------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

Regra para juno de tabelas


O nmero mnimo de condies de juno igual ao
nmero de tabelas menos um.

Sumrio da Sintaxe

SELECT

[DISTINCT] {[tabela].*|expresso [alis],...}

FROM

tabela [alias],...

WHERE

[condio de juno]...
77

AND

[condio de linha]...

OR

[outra condio de linha]

GROUP BY

{expresso|coluna}

HAVING

{condio de grupo}

ORDER BY

{expresso|coluna} [ASC|DESC]

78

Junes externas
Se uma linha no satisfaz a condio de juno, ento a linha no mostrada no
resultado da consulta. De fato, quando fazemos a juno equivalente (equi-join)
das tabelas EMP e DEPT, o departamento 40 no aparece, uma vez que no h
nenhum empregado lotado neste departamento.

As linhas excludas podem ser retornadas se um operador de juno externa


(outer join) for utilizado na condio de juno. O operador um sinal de '+'
colocado entre parnteses, que deve ser ficar ao lado da tabela onde as
informaes que no seriam includas devem aparecer.

No exemplo o operador est colocado ao lado da tabela DEPT, forando listar os


dados dos departamentos mesmo que no haja correspondncia em EMP.

SQL> SELECT E.ENAME, D.DEPTNO, D.DNAME


2 FROM EMP E, DEPT D
3 WHERE E.DEPTNO (+) = D.DEPTNO
4 AND D.DEPTNO IN (30,40)
ENAME
DEPTNO DNAME
---------- ------- -------------ALLEN
30 SALES
BLAKE
30 SALES
MARTIN
30 SALES
JAMES
30 SALES
TURNER
30 SALES
WARD
30 SALES
40 OPERATIONS
7 rows selected.

O operador de juno externa (outer join) s pode aparecer em um dos lados da


expresso, causando uma juno externa esquerda (left outer join), ou uma juno
externa direita (right outer join). A juno externa completa (outer join) no
implementada diretamente pelo Oracle.

Juno de uma tabela com ela mesmo


possvel utilizar rtulos nas tabelas (aliases) para fazer a juno de uma tabela
com ela mesmo, como se fossem duas tabelas distintas.

79

No exemplo abaixo so mostrados todos os funcionrios que recebem menos que


seus gerentes.

SQL> SELECT E.ENAME EMP_NOME, E.SAL EMP_SAL,


2 G.ENAME GER_NOME, G.SAL GER_SAL
3 FROM EMP E, EMP G
4 WHERE E.MGR = G.EMPNO AND E.SAL < G.SAL
EMP_NOME EMP_SAL GER_NOME GER_SAL
---------- ------- ---------- ------ALLEN
1600 BLAKE
2850
WARD
1250 BLAKE
2850
JAMES
950 BLAKE
2850
TURNER
1500 BLAKE
2850
MARTIN
1250 BLAKE
2850
MILLER
1300 CLARK
2450
ADAMS
1100 SCOTT
3000
JONES
2975 KING
5000
CLARK
2450 KING
5000
BLAKE
2850 KING
5000
SMITH
800 FORD
3000
11 rows selected.

Note que EMP aparece na clusula FROM duas vezes, uma com o alis 'E', para os
empregados, e outra com o alis 'G', para os gerentes.

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.

Unio
O operador UNION retorna todas as linhas distintas das consultas unidas por este
operador. No exemplo so listados todos os cargos dos departamentos 10 e 30
sem repetio.

SQL> SELECT JOB


2 FROM EMP
3 WHERE DEPTNO = 10
4 UNION
5 SELECT JOB
6 FROM EMP
7 WHERE DEPTNO = 30
JOB

80

--------CLERK
MANAGER
PRESIDENT
SALESMAN

Interseo
O operador INTERSECT retorna apenas as linhas comuns s duas consultas. Para
listar os cargos existentes tanto no departamento 10 quanto no departamento 30:

SQL> SELECT JOB


2 FROM EMP
3 WHERE DEPTNO = 10
4 INTERSECT
5 SELECT JOB
6 FROM EMP
7 WHERE DEPTNO = 30
JOB
--------CLERK
MANAGER

Subtrao
O operador MINUS retorna as linhas presentes na primeira consulta mas no
presentes na segunda consulta. Para listar os cargos existentes no departamento
10 mas no existentes no departamento 30:

SQL> SELECT JOB


2 FROM EMP
3 WHERE DEPTNO = 10
4 MINUS
5 SELECT JOB
6 FROM EMP
7 WHERE DEPTNO = 30
JOB
--------PRESIDENT

Combinao de operadores
possvel a construo de consultas com operadores UNION, INTERSECT e MINUS
combinados. Quando isto feito a execuo efetuada de cima para baixo, porm
podem ser utilizados parnteses para alterar esta ordem.
81

A clusula ORDER BY
Como as colunas das tabelas podem ter nomes diferentes quando usamos UNION,
INTERSECT e MINUS, o nome da coluna no pode ser usado na clusula ORDER BY
quando estes operadores so utilizados. Ao invs do nome deve ser usado o
nmero da coluna, como mostrado abaixo:

SQL> SELECT EMPNO, ENAME, SAL


2 FROM EMP
3 UNION
4 SELECT ID, NAME, SALARY
5 FROM EMP HISTORY
6 ORDER BY 2

A clusula ORDER BY deve ser sempre a ltima.

Regras para utilizar junes verticais

As declaraes SELECT devem ter todas o mesmo nmero de colunas.

Os tipos de dados das colunas correspondentes devem ser idnticos.

Linhas duplicadas so automaticamente eliminadas (DISTINCT no pode


ser usado).

Os nomes das colunas da primeira consulta so os que aparecem no


resultado.

A clusula ORDER BY deve ser sempre a ltima.

A clusula ORDER BY s pode conter os nmeros das colunas, no os


nomes.

Junes verticais podem ser usadas em sub-consultas.

Declaraes SELECT so executadas de cima para baixo.


82

Mltiplas junes verticais podem ser utilizadas, com parnteses, se


necessrio, para alterar a ordem de execuo.

83

Definio de consultas aninhadas


Uma consulta aninhada, ou subconsulta, aquela que est contida dentro de uma
outra consulta, e que retorna valores intermedirios.

Por exemplo:

SELECT

coluna1, coluna2

FROM

tabela

WHERE

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.

Consultas internas que retornam apenas um valor


Para encontrar o empregado com o menor salrio da empresa so necessrias
duas etapas:

a) achar qual o menor salrio

SQL> SELECT MIN(SAL)


2 FROM EMP
MIN(SAL)
-------800

b) localizar o empregado que recebe o menor salrio

SELECT ENAME, JOB, SAL


FROM EMP
WHERE SAL = salrio encontrado na etapa anterior

Os dois comandos podem ser combinados em uma consulta aninhada:


84

SQL> SELECT ENAME, JOB, SAL


2 FROM EMP
3 WHERE SAL = (SELECT MIN(SAL) FROM EMP)
ENAME
JOB
SAL
---------- --------- ------SMITH
CLERK
800

Antes da consulta interna que retorna apenas um valor, podem ser usados os
operadores =, <, >, <=, >=, <>.

Como as consultas aninhadas so executadas


Uma declarao SELECT pode ser considerada como um bloco de consulta. No
exemplo anterior, haviam dois blocos de consulta: um principal e outro interno. O
bloco interno executado primeiro, produzindo o resultado: 800. Em seguida o
bloco principal executado, utilizando o valor retornado pelo bloco interno.

Para listar todos os empregados com o mesmo cargo do BLAKE:

SQL> SELECT ENAME, JOB


2 FROM EMP
3 WHERE JOB = (SELECT JOB FROM EMP WHERE ENAME = 'BLAKE')
ENAME
JOB
---------- --------JONES
MANAGER
BLAKE
MANAGER
CLARK
MANAGER

O cargo de BLAKE obtido pela consulta interna e utilizado pela consulta principal.

Consultas internas que retornam mais de um valor


A consulta abaixo tenta localizar os empregados com o menor salrio em cada
departamento.

SQL> SELECT ENAME, SAL, DEPTNO


2 FROM EMP
3 WHERE SAL IN (SELECT MIN(SAL) FROM EMP GROUP BY DEPTNO)
ENAME

SAL DEPTNO

85

---------- ------- ------SMITH


800
20
JAMES
950
30
MILLER
1300
10

Note que a consulta interna tem uma clusula GROUP BY, e portanto retorna mais
de um valor. Neste caso o operador IN deve ser usado para tratar a lista de
valores.

O resultado da consulta interna no indica o departamento, no havendo assim


qualquer correspondncia entre o salrio retornado e o departamento do
funcionrio.

Para haver correspondncia entre o salrio e o departamento a consulta foi escrita


novamente:

SQL> SELECT ENAME, SAL, DEPTNO


2 FROM EMP
3 WHERE (SAL,DEPTNO) IN
4 (SELECT MIN(SAL), DEPTNO FROM EMP GROUP BY DEPTNO)
ENAME
SAL DEPTNO
---------- ------- ------SMITH
800
20
JAMES
950
30
MILLER
1300
10

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:

86

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

Se a consulta interna no retornar nenhuma linha:

SQL> SELECT ENAME, JOB


2 FROM EMP
3 WHERE JOB =
4 (SELECT JOB FROM EMP WHERE ENAME = 'SMYTHE')
ERROR:
ORA-01426: sigle-row subquery returns no row
no rows selected

Operadores ANY e ALL


Os operadores ANY e ALL podem ser utilizados quando as consultas internas
retornam mais de uma valor. Estes operadores so usados nas clusulas WHERE e
HAVING em conjuno com os operadores lgicos (=, <, >, >=, <=, <>).

ANY compara o valor com cada valor retornado pela consulta interna.

Para mostrar os empregados que recebem mais do que o menor salrio do


departamento 30:

SQL> SELECT ENAME, SAL, JOB, DEPTNO


2 FROM EMP
3 WHERE SAL > ANY
4 (SELECT DISTINCT SAL FROM EMP WHERE DEPTNO = 30)
5 ORDER BY SAL DESC
ENAME
SAL JOB
DEPTNO
---------- ------- --------- ------KING
5000 PRESIDENT
10
SCOTT
3000 ANALYST
20
FORD
3000 ANALYST
20
JONES
2975 MANAGER
20
BLAKE
2850 MANAGER
30
CLARK
2450 MANAGER
10
ALLEN
1600 SALESMAN
30
TURNER
1500 SALESMAN
30
MILLER
1300 CLERK
10

87

WARD
MARTIN
ADAMS

1250 SALESMAN
1250 SALESMAN
1100 CLERK

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> SELECT ENAME, SAL, JOB, DEPTNO


2 FROM EMP
3 WHERE SAL > ALL
4 (SELECT DISTINCT SAL FROM EMP WHERE DEPTNO = 30)
5 ORDER BY SAL DESC
ENAME
SAL JOB
DEPTNO
---------- ------- --------- ------KING
5000 PRESIDENT
10
SCOTT
3000 ANALYST
20
FORD
3000 ANALYST
20
JONES
2975 MANAGER
20

O operador NOT pode ser usado com IN, ANY ou ALL

Clusula HAVING com consultas aninhadas


Para mostrar os departamentos com salrio mdio superior ao salrio mdio do
departamento 30, escrevemos:
SQL> SELECT DEPTNO, AVG(SAL)
2 FROM EMP
3 GROUP BY DEPTNO
4 HAVING AVG(SAL) >
5 (SELECT AVG(SAL) FROM EMP WHERE DEPTNO = 30)
DEPTNO AVG(SAL)
------- -------10 2916.67
20
2175

Para descobrir qual o cargo com maior salrio mdio:


88

SQL> SELECT JOB, AVG(SAL)


2 FROM EMP
3 GROUP BY JOB
4 HAVING AVG(SAL) =
5 (SELECT MAX(AVG(SAL)) FROM EMP GROUP BY JOB)
JOB
AVG(SAL)
--------- -------PRESIDENT
5000

Ordenao em consultas aninhadas

No pode existir a clusula ORDER BY na consulta interna.

A clusula ORDER BY sempre a ltima no comando SELECT.

Limite para o aninhamento

No h limite para o aninhamento de SELECT dentro de SELECT.

Consulta interna correlacionada


Uma consulta interna correlacionada aquela que:

executada para cada uma das linhas consideradas candidatas na


consulta principal.

a execuo usa o valor da coluna da consulta principal.

Estas propriedades causam a consulta interna ser processada de maneira


diferente de uma consulta aninhada comum.

89

Uma consulta interna correlacionada identificada pela presena de uma coluna


da consulta principal na consulta interna.

Passos para executar uma consulta interna correlacionada:

Pegar a linha candidata fornecida pela consulta principal.

Executar a consulta interna usando os valores da consulta principal.

Usar os resultados da consulta interna para qualificar os desqualificar a


linha candidata.

Repetir enquanto houver linha candidata

Para encontrar os empregados que recebem mais do que o salrio mdio de seus
departamentos:

SQL> SELECT EMPNO, ENAME, SAL, DEPTNO


2 FROM EMP E
3 WHERE SAL >
4 (SELECT AVG(SAL) FROM EMP WHERE DEPTNO = E.DEPTNO)
5 ORDER BY DEPTNO
EMPNO ENAME
SAL DEPTNO
------- ---------- ------- ------7839 KING
5000
10
7566 JONES
2975
20
7788 SCOTT
3000
20
7902 FORD
3000
20
7499 ALLEN
1600
30
7698 BLAKE
2850
30

Anlise da execuo da consulta:

Consulta principal

90

Seleciona a primeira linha candidata - Smith, departamento 20,


salrio 800.

A linha selecionada possui a coluna DEPTNO, e a clusula


WHERE da consulta interna tambm possui a mesma coluna da
mesma tabela EMP, portanto a consulta interna ser realizada.

A clusula WHERE compara o salrio de Smith, 800, com o


valor retornado da consulta interna.

Consulta Interna

O nmero do departamento passado da consulta externa


para a interna.

O salrio mdio do departamento do empregado calculado.

O salrio mdio do departamento do Smith 2172.

O operador EXISTS
O operador EXISTS freqentemente usado com consultas aninhadas
correlacionadas, testando se o valor existe. Se o valor existir, retorna verdadeiro,
caso contrrio retorna falso.

Para listar todas as empregados com ao menos um funcionrio subordinado:

SQL> SELECT EMPNO, ENAME, JOB, DEPTNO


2 FROM EMP E
3 WHERE EXISTS
4 (SELECT EMPNO FROM EMP WHERE EMP.MGR = E.EMPNO)
5 ORDER BY EMPNO
EMPNO ENAME
JOB
DEPTNO
------- ---------- --------- ------7566 JONES
MANAGER
20
7698 BLAKE
MANAGER
30
7782 CLARK
MANAGER
10

91

7788 SCOTT
7839 KING
7902 FORD

ANALYST
PRESIDENT
ANALYST

20
10
20

6 rows selected.

Para listar os empregados cujos departamentos no esto na tabela de


departamentos:

SQL> SELECT EMPNO, ENAME, DEPTNO


2 FROM EMP
3 WHERE NOT EXISTS
4 (SELECT DEPTNO FROM DEPT WHERE DEPT.DEPTNO = EMP.DEPTNO)
no rows selected

Uma outra forma para encontrar os departamentos sem funcionrios :

SQL> SELECT DEPTNO, DNAME


2 FROM DEPT D
3 WHERE NOT EXISTS
4 (SELECT 1 FROM EMP E WHERE E.DEPTNO = D.DEPTNO)
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.

Linguagem de Definio de Dados


Sintaxe do comando:
CREATE TABLE [esquema.] nome_da_tabela [restries]
92

(nome_da_coluna tipo_de_dado (tamanho) [DEFAULT valor] [restries])

[PCTFREE inteiro PCTUSED inteiro INITRANS inteiro MAXTRANS inteiro]

[TABLESPACE espao_de_tabela STORAGE armazenamento]

Criao das tabelas do curso:


CREATE TABLE DEPT (
DEPTNO
NUMBER(2) NOT NULL,
DNAME
CHAR(14),
LOC
CHAR(13),
PRIMARY KEY (DEPTNO)
CONSTRAINT DEPT_PRIMARY_KEY)
CREATE TABLE EMP (
EMPNO
NUMBER(4) NOT NULL,
ENAME
CHAR(10),
JOB
CHAR(9),
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,
FOREIGN KEY (DEPTNO)
REFERENCES DEPT (DEPTNO) CONSTRAINT
EMP_F_K,
PRIMARY KEY (EMPNO)
CONSTRAINT EMP_PRIMARY_KEY)

CREATE TABLE SALGRADE (


GRADE
NUMBER,
LOSAL
NUMBER,
HISAL
NUMBER)

Exemplos de restries
Tabela SAL no permitindo salrio nulo.

ALTER TABLE EMP MODIFY (SAL NUMBER CONTRAINT NN_SAL NOT NULL)

Tabela DEPT com restries de coluna.


CREATE TABLE DEPT (
DEPTNO
NUMBER(2) CONSTRAINT PK_DEPT PRIMARY KEY,
DNAME
VARCHAR2(9) CONSTRAINT UNQ_DNAME UNIQUE,
LOC
VARCHAR2(10))

93

Tabela DEPT com chave primria definida como restrio de tabela.


CREATE TABLE DEPT (
DEPTNO
NUMBER(2) NOT NULL,
DNAME
VARCHAR2(9),
LOC
CHAR(13),
PRIMARY KEY (DEPTNO) CONSTRAINT DEPT_PRIMARY_KEY)

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))

Tabela DEPT com opo CHECK.


CREATE TABLE DEPT (
DEPTNO
NUMBER

DNAME

LOC

CONSTRAINT CHECK_DEPTNO
CHECK (DEPTNO BETWEEN 10 AND 99)
DISABLE,
CHAR(14)
CONSTRAINT CHECK_DNAME
CHECK(DNAME=UPPER(DNAME))
DISABLE,
CHAR(13)
CONSTRAINT CHECK_LOC
CHECK (LOC IN ('DALLAS','BOSTON',...))
DISABLE)

Tabela EMP com opo ON DELETE CACADE.


CREATE TABLE EMP (
EMPNO
NUMBER(4) NOT NULL,
ENAME
CHAR(10),
JOB
CHAR(9),
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)

Tabela CENSUS com um ndice nico composto


CREATE TABLE CENSUS
ADD CONSTRAINT UNQ_CITY_STATE UNIQUE (CITY, STATE)
USING INDEX PCTFREE 5 TABLESPACE TBLSP_CESUS
EXCEPTIONS INTO BAD_KEYS_IN_SHIP_CONT

94

Criando uma tabela a partir de outra tabela


possvel criar uma tabela a partir de outra tabela j existente, atravs do
comando:

CREATE TABLE nome_da_tabela

[(especificao das colunas)]

AS SELECT...

Exemplo:

SQL> CREATE TABLE EMPREGADOS AS SELECT * FROM EMP


Table created.

O comando DESCRIBE permite visualizar a estrutura das tabelas.


SQL> DESCRIBE EMP
Name
Null? Type
------------------------------- -------- ---EMPNO
NOT NULL NUMBER(4)
ENAME
CHAR(10)
JOB
CHAR(9)
MGR
NUMBER(4)
HIREDATE
DATE
SAL
NUMBER(7,2)
COMM
NUMBER(7,2)
DEPTNO
NOT NULL NUMBER(2)
SQL> DESCRIBE EMPREGADOS
Name
Null? Type
------------------------------- -------- ---EMPNO
NOT NULL NUMBER(4)
ENAME
CHAR(10)
JOB
CHAR(9)
MGR
NUMBER(4)
HIREDATE
DATE
SAL
NUMBER(7,2)
COMM
NUMBER(7,2)
DEPTNO
NOT NULL NUMBER(2)
SQL> SELECT * FROM EMPREGADOS

95

EMPNO ENAME
JOB
MGR HIREDATE
SAL COMM DEPTNO
------- ---------- --------- ------- --------- ------- ------- ------7369 SMITH
CLERK
7902 13-JUN-83
800
20
7499 ALLEN
SALESMAN
7698 15-AUG-83 1600
300
30
7521 WARD
SALESMAN
7698 26-MAR-84 1250
500
30
7566 JONES
MANAGER
7839 31-OCT-83 2975
20
7654 MARTIN
SALESMAN
7698 05-DEC-83 1250 1400
30
7698 BLAKE
MANAGER
7839 11-JUN-84 2850
30
7782 CLARK
MANAGER
7839 14-MAY-84 2450
10
7788 SCOTT
ANALYST
7566 05-MAR-84 3000
20
7839 KING
PRESIDENT
09-JUL-84 5000
10
7844 TURNER
SALESMAN
7698 04-JUN-84 1500
0
30
7876 ADAMS
CLERK
7788 04-JUN-84 1100
20
7900 JAMES
CLERK
7698 23-JUL-84
950
30
7902 FORD
ANALYST
7566 05-DEC-83 3000
20
7934 MILLER
CLERK
7782 21-NOV-83 1300
10
14 rows selected.

Como pode ser visto, as duas tabelas tem exatamente a mesma estrutura e o
mesmo contedo.

Tabelas tambm podem ser criadas a partir da juno de outras tabelas.

SQL> CREATE TABLE SALARIOS_DOS_EMPREGADOS


2 (NOME, SALARIO, FAIXA)
3 AS
4 SELECT ENAME, SAL, GRADE
5 FROM
EMP, SALGRADE
6 WHERE
SAL BETWEEN LOSAL AND HISAL
Table created.
SQL> DESCRIBE SALARIOS_DOS_EMPREGADOS
Name
Null? Type
------------------------------- -------- ---NOME
CHAR(10)
SALARIO
NUMBER(7,2)
FAIXA
NUMBER
SQL> SELECT *
2 FROM SALARIOS_DOS_EMPREGADOS
NOME
SALARIO FAIXA
---------- ------- ------SMITH
800
1
ADAMS
1100
1
JAMES
950
1
WARD
1250
2
MARTIN
1250
2
MILLER
1300
2
ALLEN
1600
3
TURNER
1500
3
JONES
2975
4
BLAKE
2850
4

96

CLARK
SCOTT
FORD
KING

2450
3000
3000
5000

4
4
4
5

14 rows selected.

Alterando uma tabela


Para adicionar uma coluna na tabela usamos:

ALTER TABLE nome_da_tabela


ADD ( nome_da_coluna tipo_de_dado [DEFAULT valor] [restries_de_coluna])
SQL> ALTER TABLE EMPREGADOS
2 ADD (NOME_DA_ESPOSA CHAR(10))
Table altered.
SQL> DESCRIBE EMPREGADOS
Name
Null? Type
------------------------------- -------- ---EMPNO
NOT NULL NUMBER(4)
ENAME
CHAR(10)
JOB
CHAR(9)
MGR
NUMBER(4)
HIREDATE
DATE
SAL
NUMBER(7,2)
COMM
NUMBER(7,2)
DEPTNO
NOT NULL NUMBER(2)
NOME_DA_ESPOSA
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.

Para modificar uma coluna na tabela usamos:

ALTER TABLE nome_da_tabela


MODIFY ( nome_da_coluna tipo_de_dado [DEFAULT valor] [restries_de_coluna])

97

Para modificar a coluna NOME_DA_ESPOSA para aceitar at 25 caracteres


fazemos:

SQL> ALTER TABLE EMPREGADOS


2 MODIFY (NOME_DA_ESPOSA CHAR(25))
Table altered.
SQL> DESCRIBE EMPREGADOS
Name
Null? Type
------------------------------- -------- ---EMPNO
NOT NULL NUMBER(4)
ENAME
CHAR(10)
JOB
CHAR(9)
MGR
NUMBER(4)
HIREDATE
DATE
SAL
NUMBER(7,2)
COMM
NUMBER(7,2)
DEPTNO
NOT NULL NUMBER(2)
NOME_DA_ESPOSA
CHAR(25)

Trocando o nome de uma tabela


Os nomes dos objetos do banco de dados podem ser trocado atravs do comando:

RENAME nome_antigo TO nome_novo

Para trocar o nome da tabela de EMPREGADOS para FUNCIONARIOS:

SQL> RENAME EMPREGADOS TO FUNCIONARIOS


Table renamed.

Descrio das tabelas e colunas


A descrio das tabelas e das colunas pode ser armazenada no dicionrio de
dados atravs do comando COMMENT.

Para adicionar a descrio da tabela FUNCIONARIOS:

SQL> COMMENT ON TABLE FUNCIONARIOS IS 'CADASTRO DE FUNCIONARIOS'

98

Comment created.

Para adicionar a descrio da coluna NOME_DA_ESPOSA da tabela FUNCIONARIOS:

SQL> COMMENT ON COLUMN FUNCIONARIOS.NOME_DA_ESPOSA IS > 'NOME DA ESPOSA DO FUNCIONARIO'


Comment created.

Removendo tabelas
As tabelas podem ser removidas do banco de dados atravs do comando:

DROP TABLE nome_da_tabela

Para remover a tabelas SALARIOS_DOS_EMPREGADOS e FUNCIONARIOS:

SQL> DROP TABLE SALARIOS_DOS_EMPREGADOS


Table dropped.
SQL> DROP TABLE FUNCIONARIOS
Table dropped.

Inserindo novas linhas em uma tabela


Para inserir linhas em uma tabela utilizado o comando INSERT.

INSERT INTO nome_da_tabela [(coluna, coluna, ...)]


VALUES (valor, valor, ...)

Os exemplos sero efetuados sobre a tabela Department criada a partir da tabela


Dept.

SQL> CREATE TABLE DEPARTMENT


2 AS
3 SELECT *
4 FROM DEPT

99

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.

Para inserir apenas o nmero e a localidade do novo departamento.

SQL> INSERT INTO DEPARTMENT ( DEPTNO, LOC )


2 VALUES ( 60, 'ALBERTA' )
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.

Podem ser utilizadas variveis de substituio para fornecimento dos valores.

SQL> INSERT INTO DEPARTMENT ( DEPTNO, DNAME, LOC )


2 VALUES ( &DEPT_NUM, '&DEPT_NAME', '&DEPT_LOC' )
Enter value for dept_num: 80
Enter value for dept_name: RESEARCH
Enter value for dept_loc: ATLANTA
old 2: VALUES ( &DEPT_NUM, '&DEPT_NAME', '&DEPT_LOC' )
new 2: VALUES ( 80, 'RESEARCH', 'ATLANTA' )
1 row created.

Para inserir um novo departamento omitindo a lista de colunas.

100

SQL> INSERT INTO DEPARTMENT


2 VALUES ( 90, 'INSURANCE', 'LONDON' )
1 row created.

Listando a tabela de departamentos aps as inseres:

SQL> SELECT *
2 FROM DEPARTMENT
3 ORDER BY DEPTNO
DEPTNO DNAME
LOC
------- -------------- ------------10 ACCOUNTING
NEW YORK
20 RESEARCH
DALLAS
30 SALES
CHICAGO
40 OPERATIONS
BOSTON
50 MARKETING
SAN JOSE
60
ALBERTA
70
DETROIT
80 RESEARCH
ATLANTA
90 INSURANCE
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> CREATE TABLE EMPLOYEE


2 AS
3 SELECT *
4 FROM EMP
Table created.

Quando uma data inserida, o formato DD-MON-YY geralmente usado. Com este
formato, o sculo padro o sculo 20 (19xx). O campo data tambm contm
informao de hora, que quando no especificada assume o valor padro de
zero horas (00:00:00).

Se for necessrio especificar a data em outro sculo, ou for necessrio especificar


a hora, a funo TO_DATE utilizada.

SQL> INSERT INTO EMPLOYEE


2 ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO )
3 VALUES (
4 7658,
5 'CODD',

101

6 'ANALYST',
7 7566,
8 TO_DATE('24/06/2084 9:30','DD/MM/YYYY HH:MI'),
9 3000,
10 NULL,
11 20)
1 row created.

Para exemplo de insero de valores a partir de uma outra tabela ser criada a
tabela SALARY_GRADE a partir da tabela SALGRADE.

SQL> CREATE TABLE SALARY_GRADE


2 AS
3 SELECT * FROM SALGRADE
4 WHERE GRADE=0
Table created.

Como no existe nenhum departamento com nmero zero na tabela SALGRADE,


no foi includa nenhuma linha na tabela SALARY_GRADE durante a criao.

SQL> SELECT *
2 FROM SALARY_GRADE
no rows selected

Para inserir na tabela SALARY_GRADE, a partir da tabela SALGRADE, os valores


correspondentes faixa 1.

SQL> INSERT INTO SALARY_GRADE


2 SELECT *
3 FROM SALGRADE
4 WHERE GRADE = 1
1 row created.

Para verificar se a incluso foi feita corretamente.

SQL> SELECT *
2 FROM SALARY_GRADE
GRADE LOSAL HISAL
------- ------- ------1
700 1200

102

Atualizando linhas em uma tabela


Para atualizar linhas de uma tabela utilizado o comando UPDATE.

UPDATE

nome_da_tabela [alis]

SET

coluna, [,coluna...] = {expresso ou sub-consulta}

[WHERE

condio]

Para atualizar as informaes do funcionrio SCOTT.

SQL> UPDATE EMPLOYEE


2 SET
3 JOB
= 'SALESMAN',
4 HIREDATE
= SYSDATE,
5 SAL
= SAL*1.1
6 WHERE ENAME = 'SCOTT'
1 row updated.

Para trocar todos os cargos de SALESMAN por vendedor.

SQL> UPDATE EMPLOYEE


2 SET JOB
= 'VENDEDOR'
3 WHERE JOB = 'SALESMAN'
5 rows updated.

Para listar a tabela aps as atualizaes.

SQL> SELECT ENAME, JOB


2 FROM EMPLOYEE
3 ORDER BY JOB, ENAME
ENAME
JOB
---------- --------CODD
ANALYST
FORD
ANALYST
ADAMS
CLERK
JAMES
CLERK
MILLER
CLERK
SMITH
CLERK
BLAKE
MANAGER
CLARK
MANAGER
JONES
MANAGER
KING
PRESIDENT

103

ALLEN
VENDEDOR
MARTIN
VENDEDOR
SCOTT
VENDEDOR
TURNER
VENDEDOR
WARD
VENDEDOR
15 rows selected.

Eliminando linhas de uma tabela


Para eliminar linhas de uma tabela utilizado o comando DELETE.

DELETE FROM nome_da_tabela


[WHERE condio]

Para eliminar todos os empregados que trabalham no departamento 10.

SQL> DELETE FROM EMPLOYEE


2 WHERE DEPTNO = 10
3 rows deleted.

Para eliminar todos os empregados.

SQL> DELETE FROM EMPLOYEE


12 rows deleted.

Para verificar como ficou a tabela aps a eliminao.

SQL> SELECT * FROM EMPLOYEE


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.

104

Viso
O que uma viso
*0 Uma viso como uma janela atravs da qual os dados das tabelas
podem ser vistos e alterados.
*1 Uma viso derivada de uma tabela ou de outra viso, a qual
chamada de tabela ou viso base. - uma tabela real com os dados
fisicamente armazenados.
*2 Uma viso armazenada na forma de um comando SELECT apenas.
uma tabela virtual, ou seja, uma tabela que no existe fisicamente no
banco de dados, mas parece existir.
*3 Uma viso no tem dados prprios. Os dados so manipulados a
partir das tabelas base.
Vises so teis pelas seguintes razes:

*4 Restringir o acesso ao banco de dados. Permite enxergar apenas


parte das tabelas.
*5 Permite aos usurios executar consultas simples para obter
resultados de consultas complexas. Podem ser recuperados dados de
vrias tabelas como se fosse uma nica tabela.
*6 Prov independncia de dados, permitindo alterar as tabelas base
sem afetar as aplicaes dos usurios.

Vises simples
*7 dados derivados de uma nica tabela
*8 no contm funes ou dados grupados.

Vises complexas
*9 dados derivados de mltiplas tabelas
105

*10

contm funes ou dados grupados.

O comando CREATE VIEW


Sintaxe:

CREATE VIEW nome_da_view [(coluna1, coluna2,...)]


AS
SELECT clusula_select
[WITH CHECK OPTION [CONSTRAINT nome_da_restrio]]

Para criar uma viso simples chamada D10EMP, a partir da tabela EMP, contendo
certos detalhes dos funcionrios do departamento 10:

SQL> CREATE VIEW D10EMP


2 AS
3 SELECT EMPNO, ENAME, DEPTNO
4 FROM EMP
5 WHERE DEPTNO = 10
6 WITH CHECK OPTION
View created.

Para recuperar os dados atravs da viso:

SQL> SELECT *
2 FROM D10EMP
EMPNO ENAME
DEPTNO
------- ---------- ------7782 CLARK
10
7839 KING
10
7934 MILLER
10

Para criar uma viso complexa, chamada DEPT_SUMMARY, contendo funes de


grupo e dados de mais de uma tabela:
106

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

Usando uma viso para operaes de DML


Vises so poderosas porque permitem realizar verificao de integridade
referencial nos dados modificados atravs delas.

A clusula WITH CHECK OPTION especifica que inseres e atualizaes realizadas


atravs da viso no podem gerar linhas que a viso no pode enxergar. Se na
viso D10EMP tentarmos inserir um funcionrio do departamento 20 um erro
gerado.

SQL> INSERT INTO D10EMP ( EMPNO, ENAME, DEPTNO )


2 VALUES ( 9999, 'MICHAEL', 20 )
INSERT INTO D10EMP ( EMPNO, ENAME, DEPTNO )
*
ERROR at line 1:
ORA-01402: view WITH CHECK OPTION where-clause violation

107

A viso EMP_DATA s permite inseres ou atualizaes se o salrio estiver na


faixa 1000 a 2000, o gerente estiver cadastrado na tabela de empregados, e o
departamento estiver cadastrado na tabela de departamentos.

SQL> CREATE VIEW EMP_DATA


2 AS
3 SELECT EMPNO, ENAME, JOB, MGR, SAL, DEPTNO
4 FROM EMP
5 WHERE SAL BETWEEN 1000 AND 2000
6 AND MGR IN ( SELECT DISTINCT EMPNO FROM EMP )
7 AND DEPTNO IN ( SELECT DEPTNO FROM DEPT )
8 WITH CHECK OPTION
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> CREATE VIEW EMP_DETAILS


2 AS
3 SELECT EMPNO, ENAME, JOB, DEPTNO
4 FROM EMP
5 WHERE ENAME = USER
6 AND TO_CHAR(SYSDATE,'HH24') BETWEEN 7 AND 17
7 AND TO_CHAR(SYSDATE,'D') BETWEEN 2 AND 6
8 WITH CHECK OPTION
View created.

A restrio WITH CHECK OPTION pode ter um nome prprio.

SQL> CREATE VIEW EMPLOYEES ( ID_NUMBER, NAME, POSITION, DEPARTMENT )


2 AS
3 SELECT EMPNO, ENAME, JOB, DEPTNO
4 FROM EMP
5 WHERE DEPTNO IN ( SELECT DISTINCT DEPTNO FROM DEPT )
6 WITH CHECK OPTION CONSTRAINT DEPT_CHECK
View created.

Quando a viso criada, o comando SELECT no executado,


o comando SELECT simplesmente armazenado no dicionrio
de dados.

Quando os dados so acessados atravs da viso, so realizadas as seguintes


operaes:
108

*11

Recuperao da definio da viso do dicionrio de dados.

*12

Verificao dos privilgios de acesso.

*13
Converter a consulta da viso em uma operao equivalente
sobre a(s) tabela(s) base.
Atravs da viso USER_VIEWS do dicionrio de dados, a definio da viso pode
ser recuperada. Alguns parmetros SET influenciam no texto mostrado:

*14

Maxdata

*15

Arraysize

*16

Long

SQL> DESCRIBE USER_VIEWS


Name
Null? Type
------------------------------- -------- ---VIEW_NAME
NOT NULL CHAR(30)
TEXT_LENGTH
NUMBER
TEXT
LONG
SQL> COLUMN VIEW_NAME FORMAT A15
SQL> COLUMN TEXT FORMAT A50
SQL> SELECT *
2 FROM USER_VIEWS
VIEW_NAME
TEXT_LENGTH TEXT
--------------- ----------- ------------------------------------------D10EMP
73 SELECT EMPNO, ENAME, DEPTNO
FROM EMP
WHERE DEPTNO = 10
WITH CHECK OPTION
EMPLOYEES

113 SELECT EMPNO, ENAME, JOB, DEPTNO


FROM EMP
WHERE DEPTNO IN ( SELECT DISTINCT DEPT

EMP_DATA

190 SELECT EMPNO, ENAME, JOB, MGR, SAL, DEPTNO


FROM EMP
WHERE SAL BETWEEN 1000 AND 2

EMP_DETAILS

165 SELECT EMPNO, ENAME, JOB, DEPTNO


FROM EMP
WHERE ENAME = USER
AND TO_CHAR(SYSDATE

SALES

291 SELECT REPID,ORD.CUSTID,CUSTOMER.NAME CUSTNAME

109

PRODUCT.PRODID,
DESCRIP PRODNA

Alterando dados atravs das vises


As seguintes restries se aplicam quando os dados so alterados atravs das
vises:

Eliminao proibida de a viso contm:

*17

Juno.

*18

Funes de grupo.

*19

Clusula GROUP BY.

*20

Clusula DISTINCT.

*21

Coluna ROWNUM.

*22

Sub-consulta correlacionada.

Atualizao proibida se a viso contm:

*23

Alguma das condies anteriores.

*24

Colunas definidas por expresso.

Insero proibida se a viso contm:

*25

Alguma das condies acima.

*26

Coluna NOT NULL da tabela que no consta da viso.

Eliminao de vises
As vises so eliminadas atravs do comando DROP VIEW nome_da_viso.
110

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.

111

Finalidades dos ndices


Os ndices do Oracle tm duas finalidades principais.

- Otimizar o tempo de resposta de uma consulta.

- Garantir unicidade de valores para uma coluna ou conjunto de colunas.

A utilizao de ndices altamente recomendada para obter melhor desempenho,


e geralmente um dos primeiros ndices a serem criados na tabela o da chave
primria.

Os ndices so criados, normalmente, pelos donos das tabelas, mas qualquer


usurio que tenha privilgio de ndice sobre a tabela tambm pode criar ndices
para a tabela.

Uma vez criado, o ndice ser utilizado pelo Oracle, sempre que for possvel, para
acelerar o acesso aos dados. Note que os ndices so utilizados automaticamente,
sem requerer qualquer ao por parte do usurio, que nem precisa saber da
existncia dos ndices.

Estrutura dos ndices


O Oracle utiliza rvores binrias balanceadas para os ndices, o que garante o
mesmo tempo, aproximadamente, para o acesso a qualquer linha da tabela,
independente de sua posio. O tempo de acesso tambm bastante
independente do volume de dados indexados.

Tipos de ndices
UNIQUE

Garante que os valores especificados para a(s) coluna(s) so nicos.


112

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.

Criao dos ndices


Os ndices so criados juntamente com as tabelas, ou atravs do comando:
CREATE [UNIQUE] INDEX nome-do-ndice
ON nome-da-tabela (coluna1, [,coluna2...])

Criao de um ndice para melhorar o acesso.


Para criar um ndice chamado ENAME_IDX para melhorar o tempo de acesso das
consultas feitas atravs do nome do funcionrio:

CREATE INDEX ENAME_IDX


ON EMP(ENAME)

113

Criao de um ndice para garantir unicidade.


Para evitar a duplicao do nome do departamento:

CREATE UNIQUE INDEX DNAME_IDX


ON DEPT(DNAME)

O ndice abaixo garante que no h duplicidade do par fornecedor/material


fornecido.

CREATE UNIQUE INDEX FORNEC_IDX


ON FORNECIMENTO (NUM_FORNECEDOR, NUM-MATERIAL)

Eliminao dos ndices


Os ndices so eliminados atravs do comando:

DROP INDEX nome-do-ndice

Quando um ndice utilizado


O Oracle decide quando apropriado utilizar um ndice. O Oracle sabe quais
colunas esto indexadas e o tipo do ndice, e decide de acordo com regras
especficas.

a) A coluna indexada deve ser referenciada na clusula Where.

A consulta mostrada abaixo no utiliza ndice porque no possui clusula Where.

SELECT

ENAME, JOB, SAL

FROM

EMP
114

A consulta abaixo utiliza o ndice criado para a coluna ENAME:

SELECT

FROM

EMP

WHERE

ENAME = JONES

b) O ndice no utilizado se a coluna referenciada na clusula Where parte de


uma funo ou de uma expresso.

No exemplo abaixo o ndice no utilizado porque a coluna ENAME parte de


uma funo:

SELECT

FROM

EMP

WHERE

UPPER(ENAME) = JONES

No exemplo abaixo o ndice no utilizado porque a coluna parte de uma


expresso:

SELECT

FROM

EMP

WHERE

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.

115

Sugestes para criao dos ndices


As colunas que no permitem valores duplicados devem ser indexadas.

As colunas que so utilizadas habitualmente na clusula Where devem ser


indexadas.

As colunas utilizadas nas condies de juno equivalente devem ser indexadas.

No devem ser utilizados mais de 3 ndices por tabela para no prejudicar as


operaes realizadas atravs das operaes de DML.

116

O gerador de seqncias
O gerador de seqncias do Oracle utilizado para gerar automaticamente
seqncias de nmeros para as linhas das tabelas.

Para gerar os nmeros seqenciais automaticamente, primeiro a seqncia deve


ser definida utilizando a declarao CREATE SEQUENCE, conforme a sintaxe
mostrada abaixo:

CREATE SEQUENCE [esquema.]nome-da-seqncia


[INCREMENTED BY n]
[START WITH n]
[MAXVALUE n | NOMAXVALUE]
[MINVALUE n | NOMINVALUE]

esquema

identificao do dono da seqncia.

nome-da-seqncia

nome vlido para a seqncia.

INCREMENT WITH
START WITH

incremento positivo ou negativo. Padro: 1.


primeiro nmero a ser gerado. Padro: 1.

MINVALUE|NOMINVALUE menor valor a ser gerado. Padro: 1 para seqncias


ascendentes, 10**27-1 para seqncias
descendentes.
MAXVALUE|NOMAXVALUE
seqncias

maior valor a ser gerado. Padro: 1 para


descendentes, 10**27-1 para seqncias

ascendentes.

Para um usurio poder criar uma seqncia deve possuir o privilgio de resource.
O comando mostrada abaixo cria uma seqncia para a coluna DEPTNO da tabela
DEPT.

CREATE SEQUENCE DEPT_SEQ

117

INCREMENT BY 10
START WITH 10
MAXVALUE 10000

Gerao de nmeros seqenciais com NEXTVAL


A pseudo-coluna NEXTVAL utilizada para gerar nmeros seqenciais sucessivos
de uma seqncia especificada. Quando a coluna NEXTVAL especificada um
novo nmero seqencial gerado.

SELECT
FROM

DEPT_SEQ.NEXTVAL
SYS.DUAL

NEXTVAL
------10

Se o comando for executado novamente, o valor incrementado de 10.

SELECT
FROM

DEPT_SEQ.NEXTVAL
SYS.DUAL

NEXTVAL
------20

Todo os valores subsequentes sero incrementados de 10.

Notas:

A coluna NEXTVAL sempre deve ser prefixada pelo nome da


seqncia.

Se a coluna NEXTVAL for referenciada diversas vezes dentro do


mesmo comando SQL, todas as referncias retornam o mesmo valor.

118

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)

Quando o nmero seqencial gerado, a seqncia incrementada


independentemente de haver um Commit ou um Rollback para a transao.
Quando dois usurios acessam a mesma seqncia ao mesmo tempo, os dois
usurios podem ver descontinuidades na seqncia, devido a valores gerados
para o outro usurio que ainda no receberam o Commit. Os nmeros produzidos
pelo gerador de seqncias podem ser saltados devido a Rollbacks.

Valor atual da seqncia


Para se referir ao valor atual da seqncia, pode ser utilizada a pseudo-coluna
CURRVAL. Toda vez que a pseudo-coluna NEXTVAL utilizada, o valor gerado
armazenado em CURRVAL, que s pode ser utilizada aps NEXTVAL ser
referenciado na sesso atual do usurio.

INSERT INTO DEPT_HISTORY


VALUES
(DEPT_SEQ.CURRVAL, ACCOUNTING, NEW YORK)

Regras para utilizar CURRVAL E NEXTVAL


Currval e Nextval podem ser utilizados na:

Clusula SELECT da declarao SELECT (exceto para vises).

Lista de valores da declarao INSERT.

Clusula SET da declarao UPDATE.

SELECT mais externo (consulta principal) de uma subconsulta.


119

Currval e Nextval no podem ser utilizados:

Em vises.

Com a palavra chave DISTINCT.

Com as clusulas Order By, Group By, Connect By, ou Having da


declarao SELECT.

Com os operadores Intersect, Union e Minus.

Dentro de uma consulta interna.

Seqncias so tratadas de maneira similar s tabelas, podendo ser alteradas e


eliminadas. O dono de uma seqncia pode conceder privilgios a outros usurios.

Alterando uma seqncia


O comando ALTER SEQUENCE utilizado para modificar uma seqncia existente.

ALTER SEQUENCE [esquema.]nome-da-sequencia


[INCREMENT BY n]
[MAXVALUE n | NOMAXVALUE]
[MINVALUE n | NOMINVALUE]

Por exemplo, para modificar o valor mximo para a seqncia DEPT_SEQ:

ALTER SEQUENCE dept_seq


MAXVALUE 100000

Notas:
120

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.

Concedendo privilgios em seqncias


O dono de uma seqncia pode conceder os privilgios Select e Alter.

Eliminando uma seqncia


O comando Drop Sequence remove a definio da seqncia do dicionrio de
dados.

DROP SEQUENCE [esquema.]nome-da-seqncia

Apenas o dono da seqncia e o DBA podem utilizar este comando.

Listando seqncias
As vises USER_SEQUENCES ou ALL_SEQUENCES podem ser utilizadas para
descobrir as seqncias existentes.

121

O que uma transao


Uma transao um conjunto de operaes efetuadas em um banco de dados,
que causam alteraes em uma ou mais tabelas.

Existem duas classes de transaes. Transaes produzidas pela linguagem de


manipulao de dados (DML), que consistem em um ou mais comandos de DML,
as quais o Oracle trata como uma nica entidade ou unidade lgica de trabalho
(LUW). Transaes causadas pela linguagem de definio de dados (DDL) contm
apenas um comando.

As transaes no podem ficar pela metade no banco de dados, ou todas as


transaes de uma unidade lgica de trabalho so efetivadas, ou nenhuma
efetivada no banco de dados. No pode haver o caso em que umas so efetivadas
e outras no.

Uma transao comea com o primeiro comando de DML ou DDL executado, e


termina com um dos seguintes comandos.

COMMIT ou ROLLBACK

comando de DDL

Erros

Desconexo (logoff, exit)

Falha de mquina

Um comando de DDL efetivado automaticamente, e portanto termina


implicitamente uma transao.

122

Aps o fim de uma transao, a prxima declarao SQL inicia uma nova
transao automaticamente.

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.

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.

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
123

detectados na fase de 'parse' do comando (quando o comando lido e verificado),


e no durante a fase de execuo.

O significado de uma transao


O Oracle garante a consistncia dos dados baseado nas transaes. Transaes
fornecem mais flexibilidade e controle para trabalhar com os dados. Por exemplo,
quando um valor debitado de uma conta e creditado em outra, esta operao
uma transao, que deve ser totalmente efetivada (Commit), ou descartada
(Rollback), no pode haver o caso em que existe o dbito sem que haja o crdito
correspondente.

Controlando transaes
Os seguintes comandos SQL so utilizados para controlar uma transao:

COMMIT [WORK]

SAVEPOINT nome_do_savepoint

ROLLBACK [WORK]

ROLLBACK TO nome_do_savepoint

COMMIT [WORK]

Torna as mudanas causadas pela transao corrente permanente

Elimina todos os SavePoints

Termina a transao

Libera os Locks causados pela transao


124

A palavra WORK opcional

Deve ser executada explicitamente e no implicitamente, caso


contrrio em caso de trmino anormal do programa a ltima
transao desfeita (Rollback).

COMMIT implcito ou automtico ocorre nas seguintes situaes:

antes de um comando de DDL

aps um comando de DDL

quando de uma desconexo normal

Comandos de DDL sempre geram um Commit quando so executados. Quando um


comando de DDL executado aps a execuo de vrios comandos de DML, o
Commit executado antes do comando de DDL ser executado. Aps o comando
DDL ser executado, se a execuo no causar erro, esta tambm efetivada.

SAVEPOINT savepoint_name

Pode ser utilizado para dividir uma transao em pores menores.

Permite guardar o trabalho at um determinado ponto, para que mais


tarde seja possvel desfaz-lo totalmente, ou apenas at este
determinado ponto.

Quando um novo SavePoint criado com o mesmo nome de um


anterior, o anterior eliminado.

O nmero mximo de SavePoints por processo de usurio 5, por


padro. Este padro pode ser mudado.
125

S existe Rollback to SavePoint, no existe Commit to SavePoint.

ROLLBACK[WORK] to [SAVEPOINT] savepoint_name

O comando Rollback utilizado para desfazer alteraes.

A palavra WORK opcional.

Rollback sem To SavePoint causa:

Fim da transao

Desfaz as alteraes

Elimina todos os SavePoints da transao

Libera os Locks da transao

Rollback a nvel de declarao


Se uma nica declarao de DML falha, somente esta transao desfeita. Esta
caracterstica chamada de Rollback a nvel de declarao, e permite que se
efetue tanto o Rollback quanto o Commit das transaes anteriores a transao
que falhou.

Se a transao for de DDL, o Commit executado antes da transao no permite o


Rollback das transaes anteriores.
126

Oracle realiza um Rollback a nvel de declarao atravs da criao de um


SavePoint implcito antes de cada transao de DML. Este SavePoint no
acessvel diretamente pelo usurio.

Quando feito um ROLLBACK TO SAVEPOINT:

Uma poro da transao desfeita.

mantm o SavePoint at onde foi feito o Rollback, mas perde os


SavePoints criados aps o SavePoint para o qual o Rollback foi feito.

Libera tabelas e Locks a nvel de linha.

Rollbacks implcitos
Rollbacks implcitos ocorrem em caso de trmino anormal

Autocommit
Commit pode ser executado automaticamente atravs do comando SET
AUTOCOMMIT ON. Neste caso, aps cada comando INSERT, UPDATE ou DELETE
executado um comando COMMIT automaticamente.

Com SET AUTOCOMMIT OFF, o prprio usurio tem que executar o comando
COMMIT manualmente.

O comando SET AUTOCOMMIT um comando do SQL*PLUS, no do Oracle.

Exemplo de utilizao de COMMIT e ROLLBACK


Para eliminar os departamentos com nmero maior do que 40.

SQL> DELETE FROM DEPARTMENT

127

2 WHERE DEPTNO > 40


5 rows deleted.

Para efetivar o comando anterior.

SQL> COMMIT
Commit complete.

Para verificar que os departamentos foram realmente eliminados.


SQL> SELECT * FROM DEPARTMENT
DEPTNO DNAME
LOC
------- -------------- ------------10 ACCOUNTING
NEW YORK
20 RESEARCH
DALLAS
30 SALES
CHICAGO
40 OPERATIONS
BOSTON

Para inserir o departamento 50, Testing, de Las Vegas.

SQL> INSERT INTO DEPARTMENT VALUES ( 50, 'TESTING', 'LAS VEGAS')


1 row created.

Para verificar como ficou a tabela aps a insero.

SQL> SELECT * FROM DEPARTMENT


DEPTNO DNAME
LOC
------- -------------- ------------10 ACCOUNTING
NEW YORK
20 RESEARCH
DALLAS
30 SALES
CHICAGO
40 OPERATIONS
BOSTON
50 TESTING
LAS VEGAS

Para criar um SavePoint neste ponto.

SQL> SAVEPOINT INSERT_DONE


Savepoint created.

Para, por erro, trocar o nome de todos os departamentos por MARKETING.


128

SQL> UPDATE DEPARTMENT


2 SET DNAME = 'MARKETING'
5 rows updated.

Para verificar o erro cometido.

SQL> SELECT * FROM DEPARTMENT


DEPTNO DNAME
LOC
------- -------------- ------------10 MARKETING
NEW YORK
20 MARKETING
DALLAS
30 MARKETING
CHICAGO
40 MARKETING
BOSTON
50 MARKETING
LAS VEGAS

Para desfazer o erro da ltima declarao, mas sem desfazer a incluso do


departamento 50.

SQL> ROLLBACK TO INSERT_DONE


Rollback complete.

Para verificar como ficou a tabela.

SQL> SELECT * FROM DEPARTMENT


DEPTNO DNAME
LOC
------- -------------- ------------10 ACCOUNTING
NEW YORK
20 RESEARCH
DALLAS
30 SALES
CHICAGO
40 OPERATIONS
BOSTON
50 TESTING
LAS VEGAS

Para atualizar apenas o nome do departamento SALES, como seria correto.

SQL> UPDATE DEPARTMENT


2 SET DNAME = 'MARKETING'
3 WHERE DNAME = 'SALES'
1 row updated.

129

Para efetivar todas as mudanas.

SQL> COMMIT
Commit complete.

Para verificar como ficou a tabela.

SQL> SELECT * FROM DEPARTMENT


DEPTNO DNAME
LOC
------- -------------- ------------10 ACCOUNTING
NEW YORK
20 RESEARCH
DALLAS
30 MARKETING
CHICAGO
40 OPERATIONS
BOSTON
50 TESTING
LAS VEGAS

Para desabilitar a efetivao automtica (padro).

SQL> SET AUTOCOMMIT OFF

Para eliminar todas as linhas da tabela.

SQL> DELETE FROM DEPARTMENT


5 rows deleted.

Para verificar como ficou a tabela.

SQL> SELECT * FROM DEPARTMENT


no rows selected

Para desfazer a eliminao das linhas.

SQL> ROLLBACK
Rollback complete.

Para verificar como ficou a tabela.


130

SQL> SELECT * FROM DEPARTMENT


DEPTNO DNAME
LOC
------- -------------- ------------10 ACCOUNTING
NEW YORK
20 RESEARCH
DALLAS
30 MARKETING
CHICAGO
40 OPERATIONS
BOSTON
50 TESTING
LAS VEGAS

Para habilitar a efetivao automtica.

SQL> SET AUTOCOMMIT ON

Quando se apaga as linhas da tabela no h retorno com efetivao automtica


habilitada.
SQL> DELETE FROM DEPARTMENT
Commit complete.
5 rows deleted.
SQL> ROLLBACK
Rollback complete.
SQL> SELECT * FROM DEPARTMENT
no rows selected

Consistncia de leitura
Usurios de banco de dados realizam dois tipos de acesso ao banco de
dados:

Operaes de leitura (comando Select)

Operaes de gravao (comandos Insert, Update e Delete)

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
131

como foram alterados, mesmo que as mudanas no tenham ainda sido


efetivadas.

A finalidade da consistncia de leitura garantir que cada usurio veja os dados


da forma como existiam antes do ltimo Commit.

A consistncia de leitura implementada mantendo-se uma cpia parcial do


banco de dados nos segmentos de Rollback.

Quando uma insero, uma atualizao ou uma eliminao feita no banco de


dados, o Oracle faz uma cpia dos dados antes das mudanas, e guarda esta cpia
no Segmento de Rollback.

Todos os usurios que efetuam leituras, exceto aquele que causou as mudanas,
enxergam o banco de dados como ele existia antes das mudanas, atravs da
cpia mantida nos Segmentos de Rollback.

Antes das mudanas serem efetivadas, somente o usurio que modificou os dados
enxerga o banco de dados com as modificaes incorporadas.

Aps a efetivao das mudanas, todos os usurios passam a enxergar os dados


com as mudanas efetuadas, e os Segmentos de Rollback so liberados.

Quando ocorre um Rollback, os dados gravados nos Segmentos de Rollback so


escritos de volta nas tabelas.

Transaes somente de leitura


Por padro, o modelo de consistncia do Oracle garante que os resultados de um
comando so consistentes. Entretanto, em algumas situaes, pode ser necessrio
processar vrias consultas em dados de vrias tabelas e garantir que os dados so
consistentes, ou seja, os resultados produzidos pela consulta uma tabela so
consistentes com os resultados das consultas a qualquer outra tabela.

A declarao SQL SET TRANSACTION READ ONLY utilizada para iniciar uma
transao de leitura apenas.
132

A consistncia de leitura que READ ONLY prov implementada da mesma


maneira que a consistncia nvel de declarao - usando segmentos de rollback.
Cada declarao por padro enxerga uma viso consistente dos dados na hora em
que a declarao foi feita. Esta funcionalidade muito til para relatrios que
processam mltiplas consultas enquanto os usurios atualizam as mesmas
tabelas.

Notas:

*0 A declarao SET TRANSACTION READ ONLY deve ser a primeira da


transao.
*1 Somente consultas so permitidas na transao.
*2 COMMIT, ROLLBACK ou uma declarao DDL terminam a transao.
Com DDL nenhuma indicao dada que a transao terminou.
*3 Durante a transao, todas as consultas se referem ao mesmo
instantneo (snapshot) do banco de dados (mudanas efetivadas
antes da transao comear).
*4 Outros usurios podem continuar a atualizar os dados.

Exemplo:

SQL> SET TRANSACTION READ ONLY


Transaction set.
SQL> SELECT * FROM DEPT
DEPTNO DNAME
LOC
------- -------------- ------------10 ACCOUNTING
NEW YORK
20 RESEARCH
DALLAS
30 SALES
CHICAGO
40 OPERATIONS
BOSTON
SQL> COMMIT
Commit complete.

133

134