Вы находитесь на странице: 1из 134

MANUAL DE TREINAMENTO

Verso: 01 Pg. 1/134 Vigncia: SQL Bsico para Oracle Data: 05/07/2011

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. uma operao que recupera e mostra dados de apenas algumas colunas, e portanto chamada de subconjunto vertical. mostra todas as linhas que aparecem em duas tabelas. mostra todas as linhas que aparecem nas duas tabelas. mostra todas as linhas que aparecem em apenas uma das tabelas o resultado obtido pela concatenao de duas tabelas. Todas as linhas da primeira tabela so concatenadas com todas as linhas da segunda tabela. o resultado obtido pela concatenao de duas tabelas de acordo com condies especficas. Apenas as linhas que atendem as condies estabelecidas so concatenadas.

Projeo

Unio Interseo Diferena Produto

Juno

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 do Create Table Create Index Alter Table Drop Table Drop Index Grant

Funo Cria uma tabela Cria um ndice Altera ou insere uma coluna da tabela Elimina uma tabela do banco de Dados 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 do Select Insert Delete Update Commit Rollback

Funo Seleciona dados de uma base Insere uma linha em uma tabela Apaga linhas da Tabela Altera o contedo de colunas (campos) da tabela. Grava no disco as alteraes feitas 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 CHAR(n) Contedo Caracteres alfanumricos com at 'n' caracteres. Coluna de tamanho constante independente do que est armazenado. Mximo de 255 caracteres. Caracteres alfanumricos com at 'n' caracteres. No Oracle 6 sinnimo de CHAR, e pode ter no mximo 255 caracteres. Caracteres alfanumricos com at 'n caracteres. Introduzida no Oracle 7, o tamanho armazenado varia de acordo com o contedo da coluna, e pode ter at 2000 caracteres. Caracteres alfanumricos com at 2 GigaBytes (2**31 1). S pode haver uma coluna LONG por tabela. No pode ser indexada. No podem ser especificadas restries de integridade, exceto NOT NULL. Dados binrios, como som e imagem, at 255 bytes. No podem ser executadas funes de manipulao de caracteres sobre colunas RAW. Tem as mesmas restries de LONG. No existe converso de caracteres, como, por exemplo, ANSI x PC850. Semelhante a RAW, porm podendo armazenar at 2 GigaBytes. Caracteres hexadecimais representando o endereo nico de uma linha em uma tabela. Formato binrio to rtulo do sistema operacional. Usado com o Trusted ORACLE. Nmero com a preciso 'p' e a escala 's'. A preciso 'p' pode variar de 1 a 38. A escala 's' pode variar de -84 a +127 Data vlida, desde 1 de janeiro de 4712 AC, at 31 de dezembro de 4712 DC. Para cada coluna DATA so armazenados o Sculo, o Ano, o Ms, o Dia, a Hora, o Minuto e o Segundo.(Padro Americano) Nmero de ponto flutuante com preciso decimal de 38 dgitos, ou preciso binria de 126 dgitos.

VARCHAR(n)

VARCHAR2(n)

LONG

RAW(n)

LONG RAW ROWID MLSLABEL NUMBER(p,s)

DATE

FLOAT

24

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

Restrio CONSTRAINT nome_da_restri o NULL NOT NULL UNIQUE

Descrio Especifica o nome da restrio. opcional. Quando omitido o nome padro tem a forma de SYS_Cn, onde 'n' um nmero inteiro atribudo pelo Oracle que identifica unicamente a restrio. Especifica se a coluna pode ou no conter valores nulos. Designa uma coluna, ou uma combinao de colunas, como chave nica. Cada coluna deve ser declarada como NOT NULL, e no podem ser chave primria. Designa uma coluna, ou uma combinao de colunas, como chave primria. As colunas devem ser declaradas como NOT NULL e no podem ter a restrio UNIQUE. Se a chave primria contiver apenas uma coluna pode ser declarada na restrio da coluna. Se a chave primria contiver mltiplas colunas deve ser declarada na restrio da tabela. Identifica a(s) coluna(s) como chave estrangeira . REFERENCES identifica a chave primria ou chave nica que referenciada. Especifica a condio que uma coluna deve satisfazer para a linha ser aceita na tabela. S pode se referenciar a colunas da mesma tabela. Uma restrio de coluna s pode referenciar a uma coluna, porm uma restrio de tabela pode referenciar mltiplas colunas. Desativa (ativa) uma restrio de integridade. O pado a restrio ativa. Identifica a tabela na qual o ORACLE armazena as informaes sobre as linhas que violaram as restries de integridade. A tabela deve existir antes desta condio ser especificada.

PRIMARY KEY

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

DISABLE (ENABLE) EXCEPTIONS INTO

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

Acima esto mostradas todas as combinaes diferentes de departamentos e cargos.

10 10 20 20 20 30 30 30

MANAGER PRESIDENT ANALYST CLERK MANAGER CLERK MANAGER SALESMAN

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: - Caracteres: mais cedo primeiro 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) LIKE IS NULL idnticos a uma lista de valores semelhante a um modelo de caracteres 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 '____' ENAME

(quatro caracteres de sublinhado)

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 no igual a no maior do que fora da faixa especificada fora da lista especificada no semelhante ao modelo no nulo

NOT NomeDaColuna = NOT NomeDaColuna > NOT BETWEEN NOT IN NOT LIKE IS NOT NULL

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 FROM WHERE ORDER BY [DISTINCT] {* | coluna [alis],....} tabela condies {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 data-nmero data-data data+nmero/24

Soma o nmero de dias data, produzindo outra data Subtrai o nmero de dias data, produzindo outra data Subtrai uma data da outra, produzindo nmero de dias 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 CC ou SCC YYYY ou SYYYY YYY, YY, Y Significado Sculo; S prefixa datas Antes de Cristo com "-" Ano; S prefixa datas Antes de Cristo com "-" ltimos 3,2,1 dgitos do ano

59

Y,YYY YEAR ou SYEAR BC ou AD B.C. ou A.D. Q MM Month MON WW ou W DDD, DD, D DAY DY J AM ou PM A.M. ou P.M. HH ou HH12 HH24 MI SS SSSS /., etc... "..."

Ano com vrgula separando os milhares Ano por extenso. S prefixa datas Antes de Cristo com "-" Indicador de Antes ou Depois de Cristo Idntico a BC/AD com pontos Quarto do ano (trimestre) Ms Ms por extenso, com 9 caracteres, espaos direita Nome do ms, com 3 caracteres Semana do ano ou do ms Dia do ano, do ms, ou da semana Dia por extenso, com 9 caracteres, espaos direita Nome do dia, abreviado com 3 caracteres Dia Juliano (dias desde 31/12/4713 AC) Indicador de meridiano Indicador de meridiano com pontos Hora do dia no intervalo 1 a 12 Hora do dia no intervalo 0 a 23 Minuto Segundo Segundos aps meia noite (0-86399) 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 9 0 $ . , MI PR EEEE V B Significado posio numrica (um 9 para cada nmero) zeros esquerda cifro esquerda ponto decimal na posio especificada vrgula na posio especificada sinal de menos direita nmeros negativos entre parnteses notao cientfica multiplicar por 10 elevado a n, sendo n o nmero de 9 direita de V mostrar resultados zero como espaos, no como 0. 999999 099999 $99999 999999.99 999,999 099999MI 999999PR 99.999EEE E 9999V99 B9999.99 Exemplo 1234 001234 $1234 1234.00 1,234 1234(1234) 1.234E+0 3 123400 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 pes1 pes2 res2 pes2 default for diferente

o valor a ser retornado se coluna ou expresso igual a o segundo valor a ser testado o valor a ser retornado se coluna ou expresso igual a 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 AVG ([DISTINCT|ALL]n) COUNT ([DISTINCT|ALL]exp*) MAX ([DISTINCT|ALL]exp) MIN ([DISTINCT|ALL]exp) STDDEV ([DISTINCT|ALL]n) SUM ([DISTINCT|ALL]n) VARIANCE ([DISTINCT|ALL]n) Soma dos valores de 'n', ignorando os valores nulos. Varincia de 'n', ignorando os valores nulos. Desvio padro de 'n', ignorando os valores nulos. Valor mnimo da expresso. Nmero de ocorrncias no nulas da expresso. O '*' obriga a contagem total, incluindo valores duplicados e nulos. Valor mximo da expresso. Valor retornado Valor mdio de 'n', ignorando os valores nulos.

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 FROM WHERE GROUP BY HAVING ORDER BY lista_de_colunas lista_de_tabelas condies_de_linha lista_de_colunas condies_de_grupo lista_de_colunas

So avaliados:

WHERE GROUP BY HAVING

para ficar somente as linhas que atendem a clusula para montagem dos grupos 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 FROM WHERE

[DISTINCT] {[tabela].*|expresso [alis],...} tabela [alias],... [condio de juno]... 77

AND OR GROUP BY HAVING ORDER BY

[condio de linha]... [outra condio de linha] {expresso|coluna} {condio de grupo} {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 FROM WHERE

coluna1, coluna2 tabela coluna1 = (SELECT coluna FROM tabela WHERE condio)

Consultas aninhadas so muito teis quando necessrio selecionar linhas de uma tabela sob uma condio que depende dos dados da prpria tabela.

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 6 rows selected.

ANALYST PRESIDENT ANALYST

20 10 20

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

Podem ser utilizadas variveis de substituio para fornecimento dos valores.

1 row created.

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 SET [WHERE

nome_da_tabela [alis] coluna, [,coluna...] = {expresso ou sub-consulta} 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 *12

Recuperao da definio da viso do dicionrio de dados. 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 *15 *16

Maxdata Arraysize 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 190 SELECT EMPNO, ENAME, JOB, MGR, SAL, DEPTNO FROM EMP WHERE SAL BETWEEN 1000 AND 2 165 SELECT EMPNO, ENAME, JOB, DEPTNO FROM EMP WHERE ENAME = USER AND TO_CHAR(SYSDATE 291 SELECT REPID,ORD.CUSTID,CUSTOMER.NAME CUSTNAME

EMP_DATA

EMP_DETAILS

SALES

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 *18 *19 *20 *21 *22

Juno. Funes de grupo. Clusula GROUP BY. Clusula DISTINCT. Coluna ROWNUM. Sub-consulta correlacionada.

Atualizao proibida se a viso contm:

*23 *24

Alguma das condies anteriores. Colunas definidas por expresso.

Insero proibida se a viso contm:

*25 *26

Alguma das condies acima. 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 FROM

ENAME, JOB, SAL EMP 114

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

SELECT FROM WHERE

* EMP 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 WHERE

* EMP UPPER(ENAME) = JONES

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

SELECT FROM WHERE

* EMP HIREDATE+7 = 01-JAN-84

ndices e Junes
Se no existirem ndices nas colunas utilizadas para realizar a juno equivalente, o Oracle obrigado a realizar uma operao de SORT/MERGE para responder a consulta. Isto significa que cada tabela ordenada separadamente, e depois as duas so unidas de acordo com a condio de juno.

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 nome-da-seqncia INCREMENT WITH START WITH

identificao do dono da seqncia. nome vlido para a seqncia. 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 ascendentes. maior valor a ser gerado. Padro: 1 para descendentes, 10**27-1 para seqncias

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 NEXTVAL ------10

DEPT_SEQ.NEXTVAL SYS.DUAL

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

SELECT FROM NEXTVAL ------20

DEPT_SEQ.NEXTVAL SYS.DUAL

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

Вам также может понравиться