Você está na página 1de 164

Captulo 1: Conceitos de Banco de Dados

1.1 Objetivos deste captulo Introduzir os conceitos bsico de sistema gerenciador de banco de dados, banco de dados relacional, lgebra relacional, e a arquitetura do Oracle. 1.2 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. 1.3 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, e nada alm de tabelas. Os trs elementos de um banco de dados relacional so: tabelas colunas linhas

Os operadores relacionais so: 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. Seleo/Restrio

Projeo Unio Interseo Diferena Produto Juno

Projeo

Unio

Interseo

Diferena

Produto

Joo Jos Manoel

Pintor Escritor

Joo Joo Jos Jos Manoel Manoel

Pintor Escritor Pintor Escritor Pintor Escritor

Juno

Joo Jos Maria Ana

10 10 20 30

10 20 30 40

Vendas Pesq. Cont. Secret.

Joo Jos Maria Ana

10 10 20 30

10 10 20 30

Vendas Vendas Pesq. Cont.

1.4

Arquitetura do Oracle
Background Processes

System Global Area Banco de Dados


Servers

Redo Log Files

Users Data Files

Control Files

O SGBD: Estruturas de memria: System Global Area (SGA) uma regio compartilhada de memria alocada pelo SGBD Oracle, que contm dados e informaes de controle. Quanto maior for a SGA melhor ser o desempenho do Oracle. Os dados da SGA so compartilhados por 4

todos os usurios que esto acessando o banco de dados. As informaes armazenadas na SGA esto divididas por tipo de estrutura de memria, incluindo database buffers, redo log buffers e shared poll. Program Global Area (PGA) uma rea de memria que contm dados e informaes de controle para um processo servidor. Uma PGA criada pelo Oracle quando um processo servidor iniciado. Processos: Os processos so divididos em Processos Usurio e Processos do Oracle. Cada usurio conectado possui um Processo Usurio, atravs do qual se comunica com o Oracle. Entre os processos do Oracle esto os Processos Servidores, que executam as solicitaes emitidas pelo Processos Usurios, e os Processos Background. O Banco de dados: Data Files Redo Log Files Contm todos os dados do banco de dados. Contm todas as informaes relativas s alteraes efetuadas no banco de dados para permitir a recuperao. Registra a estrutura fsica do banco de dados.

Control Files

Captulo 2: Introduo s Consultas


2.1 Objetivos deste captulo Este captulo faz uma introduo linguagem de consulta utilizada para acessar o Banco de Dados Oracle. Em particular, so discutidas as declaraes utilizadas para:

realizar clculos manusear valores nulos corretamente nomes alternativos para ttulos das colunas concatenar colunas ordenar linhas fornecer critrios de pesquisa

2.2

O utilitrio SQL*PLUS O SQL*PLUS uma interface atravs da qual os comandos SQL podem ser entrados e executados. O SQL*PLUS possui outros comandos, que permitem formatar a sada dos comandos SQL, alm de fornecer facilidades para editar e salvar comandos SQL. Para ativar o SQL*PLUS digite SQLPLUS na linha de comando do MS-DOS, e pressione a tecla Enter. Quando o SQLPLUS solicitar para entrar com o nome do usurio digite ALUNO1, e quando for solicitada a senha fornea ALUNO1 novamente. As linhas de comando do SQL*PLUS so prefixadas por: SQL>. As linhas de continuao so numeradas. Todo o curso est baseado na utilizao desta ferramenta pelos participantes. Os comandos podem ser escritos em uma ou mais linhas.

2.3

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: 6

SQL> SELECT DEPTNO, ENAME, MGR 2 FROM EMP DEPTNO ------20 30 30 20 30 30 10 20 10 30 20 30 20 10 ENAME MGR ---------- ------SMITH 7902 ALLEN 7698 WARD 7698 JONES 7839 MARTIN 7698 BLAKE 7839 CLARK 7839 SCOTT 7566 KING TURNER 7698 ADAMS 7788 JAMES 7698 FORD 7566 MILLER 7782

14 rows selected.

possvel selecionar todas as colunas da tabela colocando-se um "*" (asterisco) aps a palavra SELECT, como visto abaixo:
SQL> SELECT * 2 FROM EMP EMPNO ------7369 7499 7521 7566 7654 7698 7782 7788 7839 7844 7876 7900 7902 7934 ENAME ---------SMITH ALLEN WARD JONES MARTIN BLAKE CLARK SCOTT KING TURNER ADAMS JAMES FORD MILLER JOB MGR HIREDATE SAL COMM DEPTNO --------- ------- --------- ------- ------- ------CLERK 7902 13-JUN-83 800 20 SALESMAN 7698 15-AUG-83 1600 300 30 SALESMAN 7698 26-MAR-84 1250 500 30 MANAGER 7839 31-OCT-83 2975 20 SALESMAN 7698 05-DEC-83 1250 1400 30 MANAGER 7839 11-JUN-84 2850 30 MANAGER 7839 14-MAY-84 2450 10 ANALYST 7566 05-MAR-84 3000 20 PRESIDENT 09-JUL-84 5000 10 SALESMAN 7698 04-JUN-84 1500 0 30 CLERK 7788 04-JUN-84 1100 20 CLERK 7698 23-JUL-84 950 30 ANALYST 7566 05-DEC-83 3000 20 CLERK 7782 21-NOV-83 1300 10

14 rows selected.

2.4

Expresses aritmticas Uma expresso a combinao de um ou mais valores, operadores e funes, que resultam em um valor calculado. As expresses aritmticas podem conter nomes de colunas, constantes numricas, e operadores aritmticos. Os operadores so + - * e / , para soma, subtrao, multiplicao e diviso, respectivamente. No exemplo abaixo calcula-se o salrio anual multiplicando-se o salrio mensal por doze.
SQL> SELECT ENAME, SAL*12, COMM 2 FROM EMP

ENAME SAL*12 COMM ---------- ------- ------SMITH 9600 ALLEN 19200 300 WARD 15000 500 JONES 35700 MARTIN 15000 1400 BLAKE 34200 CLARK 29400 SCOTT 36000 KING 60000 TURNER 18000 0 ADAMS 13200 JAMES 11400 FORD 36000 MILLER 15600

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 CLARK SCOTT KING TURNER ADAMS JAMES FORD MILLER

37200 32400 39000 63000 21000 16200 14400 39000 18600

2.5

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. 2.6 O operador de concatenao O operador de concatenao (||) permite juntar colunas, expresses aritmticas, ou valores constantes, para criar uma expresso do tipo caracter. Colunas dos dois lados do operador so combinadas para formar uma s coluna. Para combinar o nmero do empregado com o nome do empregado em uma coluna apenas, utilizando EMPREGADO como ttulo, devemos escrever:
SQL> SELECT EMPNO||ENAME EMPREGADO 2 FROM EMP

EMPREGADO -------------------------------------------------7369SMITH 7499ALLEN 7521WARD 7566JONES 7654MARTIN 7698BLAKE 7782CLARK 7788SCOTT 7839KING 7844TURNER 7876ADAMS 7900JAMES 7902FORD 7934MILLER 14 rows selected.

2.7

Literais Um literal qualquer caracter, expresso, ou nmero, incluido na clusula SELECT, que no um nome ou Alis da coluna. O literal da clusula SELECT listado em todas as linhas mostradas pelo comando. Literais dos tipos data e caracter devem ser envoltos por apstrofos ('). Literais numricos no precisam de apstrofos. O comando abaixo contm literal concatenado com colunas, e um Alis para a primeira coluna.
SQL> SQL> 2 3 4 COLUMN EMPREGADO FORMAT A20 SELECT EMPNO||'-'||ENAME EMPREGADO, 'TRABALHA NO DEPARTAMENTO', DEPTNO FROM EMP 'TRABALHANODEPARTAMENTO' DEPTNO ------------------------ ------TRABALHA NO DEPARTAMENTO 20 TRABALHA NO DEPARTAMENTO 30 TRABALHA NO DEPARTAMENTO 30 TRABALHA NO DEPARTAMENTO 20 TRABALHA NO DEPARTAMENTO 30 TRABALHA NO DEPARTAMENTO 30 TRABALHA NO DEPARTAMENTO 10 TRABALHA NO DEPARTAMENTO 20 TRABALHA NO DEPARTAMENTO 10 TRABALHA NO DEPARTAMENTO 30 TRABALHA NO DEPARTAMENTO 20 TRABALHA NO DEPARTAMENTO 30 TRABALHA NO DEPARTAMENTO 20 TRABALHA NO DEPARTAMENTO 10

EMPREGADO -------------------7369-SMITH 7499-ALLEN 7521-WARD 7566-JONES 7654-MARTIN 7698-BLAKE 7782-CLARK 7788-SCOTT 7839-KING 7844-TURNER 7876-ADAMS 7900-JAMES 7902-FORD 7934-MILLER 14 rows selected.

2.8

Manuseio de valores nulos 10

Se em uma linha no existir valor para uma determinada coluna, este valor dito como sendo nulo. Um valor nulo um valor que no est disponvel, desconhecido, ou no aplicvel. Um valor nulo no o mesmo que zero. Zero um nmero. Se o valor de qualquer coluna envolvida em uma expresso for nulo, o resultado da expresso tambm ser nulo. No exemplo abaixo, somente aparecem os salrios anuais dos vendedores, pois somente estes tem comisso no nula.
SQL> SELECT ENAME, SAL*12+COMM SALARIO_ANUAL 2 FROM EMP ENAME SALARIO_ANUAL ---------- ------------SMITH ALLEN 19500 WARD 15500 JONES MARTIN 16400 BLAKE CLARK SCOTT KING TURNER 18000 ADAMS JAMES FORD MILLER 14 rows selected.

Para calcular o resultado corretamente, deve ser utilizada a expresso NVL, que converte um valor nulo em um valor no nulo, conforme mostrado abaixo:
SQL> SELECT ENAME, SAL*12+NVL(COMM, 0) SALARIO_ANUAL 2 FROM EMP ENAME SALARIO_ANUAL ---------- ------------SMITH 9600 ALLEN 19500 WARD 15500 JONES 35700 MARTIN 16400 BLAKE 34200 CLARK 29400 SCOTT 36000 KING 60000 TURNER 18000 ADAMS 13200 JAMES 11400 FORD 36000 MILLER 15600 14 rows selected.

A funo NVL espera dois argumentos: a) uma expresso 11

b)

um valor no nulo

Podem ser convertidos valores nulos de data, nmeros, ou caracteres: NVL(ColunaData, 01-jan-84') NVL(ColunaNumero, 9) NVL(ColunaCaracter, alfanumrico') 2.9 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 ------10 10 10 20 20 20 JOB --------CLERK MANAGER PRESIDENT ANALYST CLERK MANAGER

12

30 CLERK 30 MANAGER 30 SALESMAN

Acima esto mostradas todas as combinaes diferentes de departamentos e cargos. 2.10 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 ---------ADAMS ALLEN BLAKE CLARK FORD JAMES JONES KING MARTIN MILLER SCOTT SMITH TURNER WARD JOB SAL*12 DEPTNO --------- ------- ------CLERK 13200 20 SALESMAN 19200 30 MANAGER 34200 30 MANAGER 29400 10 ANALYST 36000 20 CLERK 11400 30 MANAGER 35700 20 PRESIDENT 60000 10 SALESMAN 15000 30 CLERK 15600 10 ANALYST 36000 20 CLERK 9600 20 SALESMAN 18000 30 SALESMAN 15000 30

14 rows selected.

Ordem padro de ordenao: - Nmeros: menores primeiro - Data: mais cedo primeiro - Caracteres: ordem alfabtica 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 ---------JAMES KING BLAKE TURNER ADAMS CLARK JOB --------CLERK PRESIDENT MANAGER SALESMAN CLERK MANAGER HIREDATE --------23-JUL-84 09-JUL-84 11-JUN-84 04-JUN-84 04-JUN-84 14-MAY-84

13

WARD SCOTT MARTIN FORD MILLER JONES ALLEN SMITH

SALESMAN ANALYST SALESMAN ANALYST CLERK MANAGER SALESMAN CLERK

26-MAR-84 05-MAR-84 05-DEC-83 05-DEC-83 21-NOV-83 31-OCT-83 15-AUG-83 13-JUN-83

possvel efetuar a ordenao por mais de uma coluna, sendo algumas em ordem ascendente e outras em ordem descendente.
SQL> SELECT DEPTNO, JOB, ENAME 2 FROM EMP 3 ORDER BY DEPTNO, SAL DESC DEPTNO ------10 10 10 20 20 20 20 20 30 30 30 30 30 30 JOB --------PRESIDENT MANAGER CLERK ANALYST ANALYST MANAGER CLERK CLERK MANAGER SALESMAN SALESMAN SALESMAN SALESMAN CLERK ENAME ---------KING CLARK MILLER SCOTT FORD JONES ADAMS SMITH BLAKE ALLEN TURNER WARD MARTIN JAMES

Exerccio: verificar como ficam os valores nulos aps a ordenao. 2.11 Critrios de pesquisa Os critrios de pesquisa so informados na clusula WHERE, que corresponde ao operador Restrio da lgebra relacional. Nesta clusula esto estabelecidos os critrios necessrios para uma linha poder ser selecionada. A clusula WHERE pode comparar valores em colunas, valores literais, expresses aritmticas, ou funes. Trs elementos so sempre necessrios: - Um nome de coluna - Um operador de comparao - Um nome de coluna, constante, ou lista de valores Existem dois tipos de operadores: lgicos e SQL. Os operadores lgicos testam as seguintes condies: = > >= < <= igual maior maior ou igual menor menor ou igual 14

<>

diferente (^= ou !=)

Para listar os nomes, nmeros, cargos e departamentos de todos os funcionrios com cargo CLERK, usamos:
SQL> SELECT ENAME, EMPNO, JOB, DEPTNO 2 FROM EMP 3 WHERE JOB = CLERK' ENAME EMPNO JOB DEPTNO ---------- ------- --------- ------SMITH 7369 CLERK 20 ADAMS 7876 CLERK 20 JAMES 7900 CLERK 30 MILLER 7934 CLERK 10

Para listar o nome e o nmero dos departamentos com nmero maior que 20, usamos:
SQL> SELECT DNAME, DEPTNO 2 FROM DEPT 3 WHERE DEPTNO > 20 DNAME DEPTNO -------------- ------SALES 30 OPERATIONS 40

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... IN(lista) LIKE IS NULL entre dois valores (inclusive) 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 ---------- ------ALLEN 1600 WARD 1250 MARTIN 1250 TURNER 1500 ADAMS 1100 MILLER 1300

15

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 ------7369 7788 7876 7902 ENAME SAL MGR ---------- ------- ------SMITH 800 7902 SCOTT 3000 7566 ADAMS 1100 7788 FORD 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 ---------WARD KING FORD

(quatro caracteres de sublinhado)

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

16

Os operadores mostrados abaixo podem ser utilizados para testes de negao: != ^= <> NOT NomeDaColuna = NOT NomeDaColuna > NOT BETWEEN NOT IN NOT LIKE IS NOT NULL no igual no igual a no maior do que fora da faixa especificada fora da lista especificada no semelhante ao modelo no nulo

Para listar os empregados com salrios fora da faixa de 1000 a 2000, usamos:
SQL> SELECT ENAME, SAL 2 FROM EMP 3 WHERE SAL NOT BETWEEN 1000 AND 2000 ENAME SAL ---------- ------SMITH 800 JONES 2975 BLAKE 2850 CLARK 2450 SCOTT 3000 KING 5000 JAMES 950 FORD 3000 8 rows selected.

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 ---------SMITH ALLEN WARD MARTIN SCOTT KING TURNER ADAMS JAMES FORD MILLER JOB --------CLERK SALESMAN SALESMAN SALESMAN ANALYST PRESIDENT SALESMAN CLERK CLERK ANALYST 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

17

ALLEN WARD JONES MARTIN BLAKE CLARK SCOTT TURNER ADAMS JAMES FORD MILLER

7698 7698 7839 7698 7839 7839 7566 7698 7788 7698 7566 7782

x <> NULL e x = NULL sempre falso. Nulo nunca igual a nada nem diferente de nada, nem a outro nulo. 2.12 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> 2 3 4 SELECT EMPNO, ENAME, JOB, SAL FROM EMP WHERE SAL BETWEEN 1000 AND 2000 AND JOB = 'CLERK' ENAME ---------ADAMS MILLER JOB SAL --------- ------CLERK 1100 CLERK 1300

EMPNO ------7876 7934

Para listar os funcionrios que so CLERK, ou que recebem entre 1000 e 2000, usamos:
SQL> 2 3 4 SELECT EMPNO, ENAME, JOB, SAL FROM EMP WHERE SAL BETWEEN 1000 AND 2000 OR JOB = CLERK' ENAME ---------SMITH ALLEN WARD MARTIN TURNER ADAMS JAMES MILLER JOB SAL --------- ------CLERK 800 SALESMAN 1600 SALESMAN 1250 SALESMAN 1250 SALESMAN 1500 CLERK 1100 CLERK 950 CLERK 1300

EMPNO ------7369 7499 7521 7654 7844 7876 7900 7934

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

Uma vez que AND tem precedncia sobre OR, a consulta abaixo retorna todos os gerentes com salrio maior do que 1500, e todos os vendedores.
SQL> 2 3 4 5 SELECT EMPNO, ENAME, JOB, SAL, DEPTNO FROM EMP WHERE SAL > 1500 AND JOB = 'MANAGER' OR JOB = 'SALESMAN' ENAME ---------ALLEN WARD JONES MARTIN BLAKE CLARK TURNER JOB SAL DEPTNO --------- ------- ------SALESMAN 1600 30 SALESMAN 1250 30 MANAGER 2975 20 SALESMAN 1250 30 MANAGER 2850 30 MANAGER 2450 10 SALESMAN 1500 30

EMPNO ------7499 7521 7566 7654 7698 7782 7844

Para selecionar todos os vendedores e gerentes com salrio superior a 1500, usamos:
SQL> 2 3 4 SELECT EMPNO, ENAME, JOB, SAL, DEPTNO FROM EMP WHERE SAL > 1500 AND ( JOB = 'MANAGER' OR JOB = SALESMAN' ) ENAME ---------ALLEN JONES BLAKE CLARK JOB SAL DEPTNO --------- ------- ------SALESMAN 1600 30 MANAGER 2975 20 MANAGER 2850 30 MANAGER 2450 10

EMPNO ------7499 7566 7698 7782

Os parnteses especificam a ordem em que os operadores devem ser calculados. 2.13 Precedncia dos operadores a) os operadores de comparao e os operadores SQL tem precedncias iguais. =, !=, <, >, <=, >=, 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

19

7698 BLAKE 7782 CLARK 7934 MILLER

MANAGER MANAGER CLERK

7839 11-JUN-84 7839 14-MAY-84 7782 21-NOV-83

2850 2450 1300

30 10 10

Neste caso os parnteses so desnecessrios, uma vez que o AND processa primeiro. 2.14 Resumo do comando SELECT SELECT FROM WHERE ORDER BY 2.15 Exerccios a) Selecionar todas as informaes da tabela SALGRADE
GRADE LOSAL HISAL ------- ------- ------1 700 1200 2 1201 1400 3 1401 2000 4 2001 3000 5 3001 9999

[DISTINCT] {* | coluna [alis],....} tabela condies {coluna | expresso} [ASC|DESC]

b) Selecionar todas a informaes da tabela EMP


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

14 rows selected.

c) Listar todos os funcionrios com salrio entre 1000 e 2000


ENAME DEPTNO SAL ---------- ------- ------ALLEN 30 1600 WARD 30 1250 MARTIN 30 1250 TURNER 30 1500 ADAMS 20 1100 MILLER 10 1300 6 rows selected.

d) Listar os nmeros e os nomes dos departamentos, ordenados pelo nome do departamento 20

DEPTNO ------10 40 20 30

DNAME -------------ACCOUNTING OPERATIONS RESEARCH SALES

e) Listar os diferentes tipos de cargo


JOB --------ANALYST CLERK MANAGER PRESIDENT SALESMAN

f) Listar os detalhes dos empregados dos departamentos 10 e 20 em ordem alfabtica de nome.


EMPNO ------7876 7782 7902 7566 7839 7934 7788 7369 ENAME ---------ADAMS CLARK FORD JONES KING MILLER SCOTT SMITH JOB MGR HIREDATE SAL COMM DEPTNO --------- ------- --------- ------- ------- ------CLERK 7788 04-JUN-84 1100 20 MANAGER 7839 14-MAY-84 2450 10 ANALYST 7566 05-DEC-83 3000 20 MANAGER 7839 31-OCT-83 2975 20 PRESIDENT 09-JUL-84 5000 10 CLERK 7782 21-NOV-83 1300 10 ANALYST 7566 05-MAR-84 3000 20 CLERK 7902 13-JUN-83 800 20

g) Listar os nomes e os cargos de todos os CLERK do departamento 20.


ENAME ---------SMITH ADAMS JOB --------CLERK CLERK

h) Listar os nomes de todos os empregados onde aparece TH ou LL no nome.


ENAME ---------SMITH ALLEN MILLER

i) Listar os seguintes detalhes dos funcionrios que tem gerente.


ENAME ---------SMITH ALLEN WARD JONES MARTIN BLAKE CLARK SCOTT TURNER ADAMS JAMES JOB SAL --------- ------CLERK 800 SALESMAN 1600 SALESMAN 1250 MANAGER 2975 SALESMAN 1250 MANAGER 2850 MANAGER 2450 ANALYST 3000 SALESMAN 1500 CLERK 1100 CLERK 950

21

FORD MILLER

ANALYST CLERK

3000 1300

j) Mostrar o nome e a remunerao total de todos os empregados.


ENAME REMUNERACAO ---------- ----------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

k) Mostrar todos os empregados que foram admitidos em 1983.


ENAME DEPTNO HIREDATE ---------- ------- --------SMITH 20 13-JUN-83 ALLEN 30 15-AUG-83 JONES 20 31-OCT-83 MARTIN 30 05-DEC-83 FORD 20 05-DEC-83 MILLER 10 21-NOV-83

l) Mostrar o nome, o salrio anual e comisso, de todos os vendedores com salrio mensal maior do que a comisso. O resultado deve ser ordenado com os maiores salrios na frente. Se dois ou mais empregados tiverem o mesmo salrio, deve ser ordenado pelo nome do funcionrio.
ENAME SALARIO_ANUAL COMM ---------- ------------- ------ALLEN 19200 300 TURNER 18000 0 WARD 15000 500

m) Selecione os dados para reproduzir a sada mostrada abaixo.


QUEM, O QUE, QUANDO --------------------------------------------------------------------SMITH TEM A POSICAO DE CLERK NO DEPARTAMENTO 20 DESDE 13-JUN-83 ALLEN TEM A POSICAO DE SALESMAN NO DEPARTAMENTO 30 DESDE 15-AUG-83 WARD TEM A POSICAO DE SALESMAN NO DEPARTAMENTO 30 DESDE 26-MAR-84 JONES TEM A POSICAO DE MANAGER NO DEPARTAMENTO 20 DESDE 31-OCT-83 MARTIN TEM A POSICAO DE SALESMAN NO DEPARTAMENTO 30 DESDE 05-DEC-83 BLAKE TEM A POSICAO DE MANAGER NO DEPARTAMENTO 30 DESDE 11-JUN-84 CLARK TEM A POSICAO DE MANAGER NO DEPARTAMENTO 10 DESDE 14-MAY-84 SCOTT TEM A POSICAO DE ANALYST NO DEPARTAMENTO 20 DESDE 05-MAR-84 KING TEM A POSICAO DE PRESIDENT NO DEPARTAMENTO 10 DESDE 09-JUL-84 TURNER TEM A POSICAO DE SALESMAN NO DEPARTAMENTO 30 DESDE 04-JUN-84 ADAMS TEM A POSICAO DE CLERK NO DEPARTAMENTO 20 DESDE 04-JUN-84 JAMES TEM A POSICAO DE CLERK NO DEPARTAMENTO 30 DESDE 23-JUL-84 FORD TEM A POSICAO DE ANALYST NO DEPARTAMENTO 20 DESDE 05-DEC-83 MILLER TEM A POSICAO DE CLERK NO DEPARTAMENTO 10 DESDE 21-NOV-83

22

2.16

Respostas dos exerccios


a) SQL> SELECT * 2 FROM SALGRADE b) SQL> SELECT * 2 FROM EMP c) SQL> SELECT ENAME, DEPTNO, SAL 2 FROM EMP 3 WHERE SAL BETWEEN 1000 AND 2000 d) SQL> SELECT DEPTNO, DNAME 2 FROM DEPT 3 ORDER BY DNAME e) SQL> SELECT DISTINCT JOB 2 FROM EMP f) SQL> SELECT * 2 FROM EMP 3 WHERE DEPTNO IN(10,20) 4 ORDER BY ENAME g) SQL> SELECT ENAME, JOB 2 FROM EMP 3 WHERE JOB = CLERK' 4 AND DEPTNO = 20 h) SQL> SELECT ENAME 2 FROM EMP 3 WHERE ENAME LIKE '%TH%' 4 OR ENAME LIKE '%LL%' i) SQL> SELECT ENAME, JOB, SAL 2 FROM EMP 3 WHERE MGR IS NOT NULL j) SQL> SELECT ENAME, SAL*12+NVL(COMM,0) REMUNERACAO 2 FROM EMP k) SQL> SELECT ENAME, DEPTNO, HIREDATE 2 FROM EMP 3 WHERE HIREDATE LIKE '%83' l) SQL> SELECT ENAME, SAL*12 SALARIO_ANUAL, COMM 2 FROM EMP 3 WHERE SAL > COMM 4 AND JOB = 'SALESMAN' 5 ORDER BY SAL DESC, ENAME m) SQL> SELECT ENAME||' TEM A POSICAO DE '||JOB|| 2 ' NO DEPARTAMENTO '||DEPTNO|| 3 ' DESDE '||HIREDATE "QUEM, O QUE, QUANDO" 4 FROM EMP

23

Captulo 3: Variveis de Substituio


3.1 Objetivos deste captulo Descrever as variveis de substituio e como estas so usadas nas declaraes SQL. 3.2 Variveis de substituio com um "&" A varivel de substituio pode ser utilizada em uma declarao SELECT, representando um valor a ser fornecido quando o comando for executado.
SQL> SELECT EMPNO, ENAME, SAL 2 FROM EMP 3 WHERE DEPTNO = &NUMERO_DO_DEPARTAMENTO Enter value for numero_do_departamento: 10 old new 3: WHERE DEPTNO = &NUMERO_DO_DEPARTAMENTO 3: WHERE DEPTNO = 10 ENAME SAL ---------- ------CLARK 2450 KING 5000 MILLER 1300

EMPNO ------7782 7839 7934

3.3

Variveis de substituio com dois "&" Quando so utilizados dois "&" na varivel, o SQL*PLUS solicita o valor da varivel apenas uma vez, guardando este valor para uso subseqente. Exemplo: &&NUMERO_DO_DEPARTAMENTO

24

Captulo 4: Funes Numricas e de Caracteres


4.1 Objetivos deste captulo Este captulo mostra as funes do Oracle que manipulam nmeros e sequncias de caracteres. 4.2 Funes que manipulam caracteres 4.2.1 LOWER(coluna | literal) Transforma letras maisculas em minsculas.
SQL> SELECT LOWER(DNAME), LOWER('CURSO DE SQL') 2 FROM DEPT LOWER(DNAME) -------------accounting research sales operations LOWER('CURSODESQL') -------------------curso de sql curso de sql curso de sql curso de sql

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


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

4.2.3 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) -------------------Accounting Research Sales Operations INITCAP(LOC) -------------------New York Dallas Chicago Boston

4.2.4 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. 25

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

4.2.5 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,'*') -------------------ACCOUNTING********** RESEARCH************ SALES*************** OPERATIONS********** RPAD(DNAME,20) -------------------ACCOUNTING RESEARCH SALES OPERATIONS RPAD(DEPTNO,20,'.') -------------------10.................. 20.................. 30.................. 40..................

4.2.6 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 SUBSTR('ORACLE',2,4) -------------------RACL RACL RACL RACL SUBSTR(DNAME,2) --------------CCOUNTING ESEARCH ALES PERATIONS SUBSTR(DNAME,3,5) -------------------COUNT SEARC LES ERATI

4.2.7 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

26

DNAME INSTR(DNAME,'A') INSTR(DNAME,'ES') INSTR(DNAME,'C',1,2) ------------ ---------------- ----------------- -------------------ACCOUNTING 1 0 3 RESEARCH 5 2 0 SALES 2 4 0 OPERATIONS 5 0 0

4.2.8 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 -------------ACCOUNTING RESEARCH SALES OPERATIONS LTRIM(DNAME,'A') ---------------CCOUNTING RESEARCH SALES OPERATIONS LTRIM(DNAME,'AS') ----------------CCOUNTING RESEARCH LES OPERATIONS LTRIM(DNAME,'ASOP') ------------------CCOUNTING RESEARCH LES ERATIONS

No exemplo acima, na segunda coluna foram removidas as letras "A" esquerda dos nomes dos departamentos. Na terceira coluna foram removidas tanto a letra "A" quanto a letra "S". Na quarta coluna foram removidas as letras "A", "S", "O" e "P" esquerda. 4.2.9 RTRIM(coluna | literal, 'caracteres') Remove os caracteres indicados direita da coluna ou do literal. Se nenhum caracter for especificado, sero eliminados os espaos direita.
SQL> SELECT DNAME, 2 RTRIM(DNAME,'G'), RTRIM(DNAME,'GHS'), RTRIM(DNAME,'N') 3 FROM DEPT DNAME -------------ACCOUNTING RESEARCH SALES OPERATIONS RTRIM(DNAME,'G') ---------------ACCOUNTIN RESEARCH SALES OPERATIONS RTRIM(DNAME,'GHS') -----------------ACCOUNTIN RESEARC SALE OPERATION RTRIM(DNAME,'N') ---------------ACCOUNTING RESEARCH SALES OPERATIONS

4.2.10 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

27

4.2.11 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) --------------------- --------------------- --------------------12 2 10 12 2 8 12 2 5 12 2 10

4.2.12 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 ---------CLARK KING MILLER TRANSLATE(ENAME,'C','P') ------------------------PLARK KING MILLER

No exemplo abaixo foram trocados "A" por "I", e "R" por "T", nos cargos.
SQL> SELECT JOB, TRANSLATE(JOB,'AR','IT') 2 FROM EMP 3 WHERE DEPTNO = 10 JOB --------MANAGER PRESIDENT CLERK TRANSLATE(JOB,'AR','IT') -----------------------------MINIGET PTESIDENT CLETK

4.2.13 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:
SQL> SELECT JOB, REPLACE(JOB,'SALESMAN','VENDEDOR') 2 FROM EMP

28

JOB --------CLERK SALESMAN SALESMAN MANAGER SALESMAN MANAGER MANAGER ANALYST PRESIDENT SALESMAN CLERK CLERK ANALYST CLERK

REPLACE(JOB,'SALESMAN','VENDEDOR') ---------------------------------------CLERK VENDEDOR VENDEDOR MANAGER VENDEDOR MANAGER MANAGER ANALYST PRESIDENT VENDEDOR CLERK CLERK ANALYST CLERK

14 rows selected.

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


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

14 rows selected.

4.2.14 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.
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

29

4.3

Funes numricas 4.3.1 ROUND(coluna | literal, n) Arredonda o valor da coluna ou do literal na n-sima casa decimal. Se n for negativo eqivale s dezenas. Se n for omitido eqivale a um nmero inteiro.
SQL> SELECT ROUND(45.923,1), ROUND(45.923), ROUND(42.323,-1), ROUND(SAL/32,2) 2 FROM EMP 3 WHERE DEPTNO = 10 ROUND(45.923,1) ROUND(45.923) ROUND(42.323,-1) ROUND(SAL/32,2) ----------------- ----------------- ----------------- ----------------45.9 46 40 76.56 45.9 46 40 156.25 45.9 46 40 40.63

4.3.2 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

4.3.3 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

4.3.4 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

30

FLOOR(SAL) FLOOR(99.9) FLOOR(101.76) FLOOR(-11.1) ---------- ----------- ------------- -----------3000 99 101 -12 5000 99 101 -12 3000 99 101 -12

4.3.5 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

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


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

4.3.7 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.

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


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

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

SQL> SELECT SAL, SQRT(SAL), SQRT(40), SQRT(COMM) 2 FROM EMP 3 WHERE COMM > 0 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

4.3.10 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 SIGN(COMM-SAL) ----------------- ----------------- ----------------- ----------------1300 1 -1300 -1 750 1 -750 -1 -150 -1 150 1 1500 1 -1500 -1

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

4.3.11 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 2850 1500 0 -1500 1500 950

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

32

SQL> 2 3 4

SELECT SAL, COMM, MOD(SAL,COMM), MOD(100,40) FROM EMP WHERE DEPTNO = 30 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

4.3.13 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 ---------.5 COS(60*3.1 ---------.5 TAN(45*3.1 ---------1

4.3.14 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) ---------1.17520119 COSH(0) ------1 TANH(.5) ---------.462117157

4.4

Exerccios a) Listar o nmero do departamento, o nome do funcionrio, e o salrio com aumento de 15% expresso em nmero inteiro.
DEPTNO ----------------20 30 30 20 30 30 10 20 10 30 20 30 20 10 ENAME PCTSAL ---------- ----------------SMITH 920 ALLEN 1840 WARD 1438 JONES 3421 MARTIN 1438 BLAKE 3278 CLARK 2818 SCOTT 3450 KING 5750 TURNER 1725 ADAMS 1265 JAMES 1093 FORD 3450 MILLER 1495

33

b) Gerar a listagem mostrada a seguir:


EMPREGADO_E_CARGO -------------------SMITH CLERK ALLEN SALESMAN WARD SALESMAN JONES MANAGER MARTIN SALESMAN BLAKE MANAGER CLARK MANAGER SCOTT ANALYST KING PRESIDENT TURNER SALESMAN ADAMS CLERK JAMES CLERK FORD ANALYST MILLER CLERK 14 rows selected.

c) Listar uma lista contendo todos os empregados com um identificador composto pelas duas primeiras letras de seus cargos, os dois dgitos do meio de seus nmeros de matrcula, e o cdigo sonoro de seus nomes.
NOME ---------SMITH ALLEN WARD JONES MARTIN BLAKE CLARK SCOTT KING TURNER ADAMS JAMES FORD MILLER CODIGO -------CL36S530 SA49A450 SA52W630 MA56J520 SA65M635 MA69B420 MA78C462 AN78S300 PR83K520 SA84T656 CL87A352 CL90J520 AN90F630 CL93M460

d) Faa uma procura no sensitiva a letras maisculas ou minsculas por um cargo fornecido pelo usurio.
EMPNO ----7369 7876 7900 7934 ENAME ---------SMITH ADAMS JAMES MILLER JOB MGR HIREDATE SAL COMM DEPTNO --------- ----- --------- ----- ----- -----CLERK 7902 13-JUN-83 800 20 CLERK 7788 04-JUN-84 1100 20 CLERK 7698 23-JUL-84 950 30 CLERK 7782 21-NOV-83 1300 10

e) Imprima os nomes dos departamentos centrados em um campo com largura de 20 posies.


DEPARTAMENTO -------------------ACCOUNTING RESEARCH SALES OPERATIONS

34

f) Encontrar a primeira ocorrncia da letra "L" nos nomes dos empregados e substituir pela letra "X".
ENAME ---------SMITH ALLEN WARD JONES MARTIN BLAKE CLARK SCOTT KING TURNER ADAMS JAMES FORD MILLER PRIMEIRA_OCORRENCIA_ -------------------SMITH AXLEN WARD JONES MARTIN BXAKE CXARK SCOTT KING TURNER ADAMS JAMES FORD MIXLER

14 rows selected.

35

4.5

Respostas dos exerccios


a) SQL> SELECT DEPTNO, ENAME, ROUND (SAL*1.15) PCTSAL 2 FROM EMP b) SQL> SELECT RPAD(ENAME,10)||LPAD(JOB,10) EMPREGADO_E_CARGO 2 FROM EMP c) SQL> SELECT ENAME NOME, 2 SUBSTR(JOB,1,2)||SUBSTR(EMPNO,2,2)||SOUNDEX(ENAME) CODIGO 3 FROM EMP d) SQL> SELECT * 2 FROM EMP 3 WHERE UPPER(JOB) = UPPER ('&JOB') Enter value for job: clerk old 3: WHERE UPPER(JOB) = UPPER ('&JOB') new 3: WHERE UPPER(JOB) = UPPER ('clerk') e) SQL> SELECT LPAD(' ',(20-LENGTH(DNAME))/2)||DNAME DEPARTAMENTO 2 FROM DEPT f) SQL> 2 3 4 SELECT ENAME, TRANSLATE(SUBSTR(ENAME,1,INSTR(ENAME,'L')),'L','X')|| SUBSTR(ENAME,INSTR(ENAME,'L')+1) PRIMEIRA_OCORRENCIA_DE_L FROM EMP

36

Captulo 5: Funes de Data e de Converso


5.1 Objetivos deste captulo Este captulo mostra as funes do Oracle que manipulam datas e fazem a converso de tipo de dados. 5.2 Funes que manipulam datas 5.2.1 SYSDATE SYSDATE uma pseudo-coluna que retorna a data e a hora corrente. A tabela SYS.DUAL pblica, contm apenas uma coluna chamada DUMMY, e uma linha com o valor 'X'. Esta tabela til para retornar um nico valor de uma constante, de uma pseudo-coluna, ou de uma expresso. Abaixo a tabela SYS.DUAL foi utilizada para retornar a data corrente.
SQL> SELECT SYSDATE 2 FROM SYS.DUAL SYSDATE --------25-OCT-94

5.2.2 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 --------13-JUN-83 11-JUN-84 04-JUN-84 04-JUN-84 HIREDATE+7 ---------20-JUN-83 18-JUN-84 11-JUN-84 11-JUN-84 HIREDATE-7 ---------06-JUN-83 04-JUN-84 28-MAY-84 28-MAY-84 SYSDATE-HIREDATE ----------------4152.351851851852 3788.351851851852 3795.351851851852 3795.351851851852

A operao SYSDATE-HIREDATE retorna o nmero de dias entre a admisso do empregado e a data atual. 5.2.3 MONTHS_BETWEEN(data1,data2) Retorna o nmero de meses decorridos entre data1 e data2.
SQL> 2 3 4 SELECT MONTHS_BETWEEN(SYSDATE,HIREDATE), MONTHS_BETWEEN('01-JAN-84','05-NOV-88') FROM EMP WHERE MONTHS_BETWEEN(SYSDATE,HIREDATE) > 59

37

MONTHS_BETWEEN(SYSDATE,HIREDATE) MONTHS_BETWEEN('01-JAN-84','05-NOV-88' -------------------------------- -------------------------------------136.3985293458781 -58.1290322580645 134.3340132168459 -58.1290322580645 126.9791745071685 -58.1290322580645 131.8178841845878 -58.1290322580645 130.6565938620072 -58.1290322580645 124.4630454749104 -58.1290322580645 125.366271281362 -58.1290322580645 127.6565938620072 -58.1290322580645 123.5275616039427 -58.1290322580645 124.6888519265233 -58.1290322580645 124.6888519265233 -58.1290322580645 123.0759487007168 -58.1290322580645 130.6565938620072 -58.1290322580645 131.1404648297491 -58.1290322580645 14 rows selected.

5.2.4 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 --------13-JUN-83 31-OCT-83 05-MAR-84 04-JUN-84 05-DEC-83 ADD_MONTHS(HIREDATE,3) ---------------------13-SEP-83 31-JAN-84 05-JUN-84 04-SEP-84 05-MAR-84 ADD_MONTHS(HIREDATE,-3) ----------------------13-MAR-83 31-JUL-83 05-DEC-83 04-MAR-84 05-SEP-83

5.2.5 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 --------14-MAY-84 09-JUL-84 21-NOV-83 NEXT_DAY(HIREDATE,'FRIDAY') --------------------------18-MAY-84 13-JUL-84 25-NOV-83 NEXT_DAY(HIREDATE,6) -------------------18-MAY-84 13-JUL-84 25-NOV-83

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


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

38

SYSDATE --------25-OCT-94 25-OCT-94 25-OCT-94 25-OCT-94 25-OCT-94

LAST_DAY (SYSDATE) ---------31-OCT-94 31-OCT-94 31-OCT-94 31-OCT-94 31-OCT-94

HIREDATE --------13-JUN-83 31-OCT-83 05-MAR-84 04-JUN-84 05-DEC-83

LAST_DAY (HIREDATE) ---------30-JUN-83 31-OCT-83 31-MAR-84 30-JUN-84 31-DEC-83

LAST_DAY ('15-FEB-88') ------------29-FEB-88 29-FEB-88 29-FEB-88 29-FEB-88 29-FEB-88

5.2.7 ROUND(data) ROUND(data, 'MONTH') ROUND(data, 'YEAR') ROUND(data) retorna a data com a indicao da hora como sendo zero horas (meia noite). At o meio dia retorna a mesma data, aps o meio dia retorna o dia seguinte. Esta funo til quando so comparadas datas com horas diferentes. ROUND(data, 'MONTH') retorna o primeiro dia do ms da data, se a data estiver na primeira quinzena, ou retorna o primeiro dia do ms seguinte, se a data estiver na segunda quinzena. ROUND(data, 'YEAR') retorna o primeiro dia do ano da data, se a data estiver no primeiro semestre, ou retorna o primeiro dia do ano seguinte, se a data estiver no segundo semestre.
SQL> SELECT SYSDATE, ROUND(SYSDATE,'MONTH'), ROUND(SYSDATE,'YEAR') 2 FROM SYS.DUAL SYSDATE ROUND(SYSDATE,'MONTH') ROUND(SYSDATE,'YEAR') --------- ---------------------- --------------------25-OCT-94 01-NOV-94 01-JAN-95

5.2.7 TRUNC(data) TRUNC(data, 'MONTH') TRUNC(data, 'YEAR') TRUNC(data) retorna a data com o tempo indicando zero horas. TRUNC(data,'MONTH') retorna o primeiro dia do ms da data. TRUNC(data,'YEAR') retorna o primeiro dia do ano da data.
SQL> SELECT SYSDATE, TRUNC(SYSDATE,'MONTH'), TRUNC(SYSDATE,'YEAR') 2 FROM SYS.DUAL SYSDATE TRUNC(SYSDATE,'MONTH') TRUNC(SYSDATE,'YEAR') --------- ---------------------- --------------------25-OCT-94 01-OCT-94 01-JAN-94

5.3

Funes de converso 5.3.1 Formatos de Data Formato CC ou SCC YYYY ou SYYYY YYY, YY, Y Significado Sculo; S prefixa datas Antes de Cristo com "-" Ano; S prefixa datas Antes de Cristo com "-" ltimos 3,2,1 dgitos do ano 39

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

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

1 - O prefixo 'fm' (fill mode) antes de MONTH ou DAY suprime os espaos direita 2 - O sufixo 'TH' produz nmeros ordinais ("DDTH" para "4TH") 3 - O sufixo 'SP' produz nmeros por extenso ("DDSP" para "FOUR") 4 - O sufixo 'SPTH' para nmeros ordinais por extenso ("DDSPTH" para "FOURTH") 5 - Os cdigos so sensitivos a caracteres maisculos e minsculos 5.3.2 TO_CHAR(nmero|data,['formato']) Converte nmero ou data em caracter no formato especificado.
SQL> SELECT TO_CHAR(SYSDATE,'DAY, DDTH MONTH YYYY') 2 FROM SYS.DUAL TO_CHAR(SYSDATE,'DAYDDTHMONTHYYYY') ----------------------------------TUESDAY ,25TH OCTOBER 1994

Adicionando-se o prefixo fm (fill mode) para remover os espaos, e utilizando-se letras maisculas e minsculas temos: 40

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 TO_CHAR(SAL,'$9,999') --------------------$800 $1,600 $1,250 $2,975 $1,250 $2,850 $2,450 $3,000 $5,000 $1,500 $1,100 $950 $3,000 $1,300 14 rows selected.

5.3.3 Formatos Numricos Formato 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. 41 Exemplo 999999 099999 $99999 999999.99 999,999 099999MI 999999PR 99.999EEEE 9999V99 B9999.99 1234 001234 $1234 1234.00 1,234 1234(1234) 1.234E+03 123400 1234.00

5.3.4 TO_NUMBER(cadeia_de_caracteres) Converte a cadeia de caracteres, que deve conter um nmero, em um valor numrico.
SQL> SELECT EMPNO, ENAME, JOB, SAL 2 FROM EMP 3 WHERE SAL > TO_NUMBER('1500') EMPNO ----7499 7566 7698 7782 7788 7839 7902 ENAME ---------ALLEN JONES BLAKE CLARK SCOTT KING FORD JOB SAL --------- ------SALESMAN 1600 MANAGER 2975 MANAGER 2850 MANAGER 2450 ANALYST 3000 PRESIDENT 5000 ANALYST 3000

7 rows selected.

5.3.5 TO_DATE('cadeia_de_caracteres','formato') Retorna a data contida na cadeia de caracteres conforme o formato especificado. Se o formato for omitido ser assumido DD-MON-YY.
SQL> SELECT EMPNO, ENAME, HIREDATE 2 FROM EMP 3 WHERE HIREDATE = TO_DATE('June 4,1984','Month dd,yyyy') EMPNO ----7844 7876 ENAME ---------TURNER ADAMS HIREDATE --------04-JUN-84 04-JUN-84

5.4

Funes que aceitam qualquer tipo de dado 5.4.1 DECODE(coluna|expresso,pes1,res1,[pes2,res2,...],default) Funciona como uma estrutura CASO, substituindo as pesquisas pelos resultados. A coluna ou expresso comparada com os argumentos de pesquisa, e se houver igualdade o resultado correspondente retornado. Se no houver igualdade, o valor default retornado. Argumentos: coluna|expresso pes1 res1 pes2 res2 default Notas: 42 a coluna ou expresso a ser avaliada o primeiro valor a ser testado o valor a ser retornado se coluna ou expresso igual a pes1 o segundo valor a ser testado o valor a ser retornado se coluna ou expresso igual a pes2 o valor a ser retornado se a coluna ou expresso for diferente de pes1, pes2,...,pesN.

-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> 2 3 4 SELECT ENAME, JOB, DECODE(JOB, 'CLERK','WORKER','MANAGER','BOSS','UNDEFINED') DECODED_JOB FROM EMP JOB --------CLERK SALESMAN SALESMAN MANAGER SALESMAN MANAGER MANAGER ANALYST PRESIDENT SALESMAN CLERK CLERK ANALYST CLERK DECODED_JOB ----------WORKER UNDEFINED UNDEFINED BOSS UNDEFINED BOSS BOSS UNDEFINED UNDEFINED UNDEFINED WORKER WORKER UNDEFINED WORKER

ENAME ---------SMITH ALLEN WARD JONES MARTIN BLAKE CLARK SCOTT KING TURNER ADAMS JAMES FORD MILLER

Para mostrar as percentagens de bnus relativas s faixas salariais:


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

O exemplo abaixo causa um erro porque ename (caracter) tem tipo diferente do terceiro argumento sal (numrico).
SQL> SELECT * FROM EMP 2 ORDER BY DECODE(2,1,SAL,2,ENAME,SAL) * ERROR: ORA-01722: invalid number no rows selected

Para fazer um aumento salarial diferenciado por cargo:


SQL> 2 3 4 SELECT JOB, SAL, DECODE(JOB,'ANALYST',SAL*1.1, 'CLERK',SAL*1.15, 'MANAGER',SAL*0.95, SAL) SALARIO_DECODIFICADO FROM EMP

43

JOB SAL SALARIO_DECODIFICADO --------- ------- -------------------CLERK 800 920 SALESMAN 1600 1600 SALESMAN 1250 1250 MANAGER 2975 2826.25 SALESMAN 1250 1250 MANAGER 2850 2707.5 MANAGER 2450 2327.5 ANALYST 3000 3300 PRESIDENT 5000 5000 SALESMAN 1500 1500 CLERK 1100 1265 CLERK 950 1092.5 ANALYST 3000 3300 CLERK 1300 1495 14 rows selected.

5.4.2 NVL(coluna|valor, valor) 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

5.4.3 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.

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

44

1000 1000 1000 1000 1000 1000

300 500 1250 0

5.4.5 VSIZE(coluna|valor) Retorna o nmero de bytes utilizado internamente pelo Oracle para representar o valor.
SQL> 2 3 4 SELECT DEPTNO, VSIZE(DEPTNO), VSIZE(HIREDATE), VSIZE(SAL), VSIZE(ENAME) FROM EMP WHERE DEPTNO = 10

DEPTNO VSIZE(DEPTNO) VSIZE(HIREDATE) VSIZE(SAL) VSIZE(ENAME) ------- --------------- --------------- --------------- --------------10 2 7 3 5 10 2 7 2 4 10 2 7 2 6

5.4.5 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> 2 3 4 SELECT SYSDATE, TO_CHAR(NEXT_DAY(ADD_MONTHS(SYSDATE,2),'FRIDAY'), 'Day dd Month YYYY') FROM SYS.DUAL

SYSDATE TO_CHAR(NEXT_DAY(ADD_MONTHS(SYSDATE,2),'FRIDAY'),'DAYDDMONTHYYYY') --------- -------------------------------------------------------25-OCT-94 Friday 30 December 1994

5.5

Exerccios a) Mostrar o nome e a data de admisso dos empregados do departamento 20. Utilize o alis DATA_DE_ADMISSAO para o nome da coluna.
ENAME ---------SMITH JONES SCOTT ADAMS FORD DATA_DE_ADMISSAO --------------------------June, Thirteenth 1983 October, Thirty-First 1983 March, Fifth 1984 June, Fourth 1984 December, Fifth 1983

b) Exibir o nome de cada empregado, juntamente com a data de admisso e a data de reviso do salrio. Assuma a data de reviso um ano aps a data de admisso. Classificar a sada em ordem ascendente da data de reviso do salrio.
ENAME HIREDATE REVISAO

45

---------SMITH ALLEN JONES MILLER MARTIN FORD SCOTT WARD CLARK TURNER ADAMS BLAKE KING JAMES

--------13-JUN-83 15-AUG-83 31-OCT-83 21-NOV-83 05-DEC-83 05-DEC-83 05-MAR-84 26-MAR-84 14-MAY-84 04-JUN-84 04-JUN-84 11-JUN-84 09-JUL-84 23-JUL-84

--------13-JUN-84 15-AUG-84 31-OCT-84 21-NOV-84 05-DEC-84 05-DEC-84 05-MAR-85 26-MAR-85 14-MAY-85 04-JUN-85 04-JUN-85 11-JUN-85 09-JUL-85 23-JUL-85

c) Imprimir uma lista de empregados mostrando o salrio, se este for superior a 1500. Se o salrio for inferior a 1500 deve ser exibido ABAIXO DE 1500, e se for igual a 1500 deve ser exibido NO LIMITE.
ENAME ---------ADAMS ALLEN BLAKE CLARK FORD JAMES JONES KING MARTIN MILLER SCOTT SMITH TURNER WARD SALARIO -------------ABAIXO DE 1500 1600 2850 2450 3000 ABAIXO DE 1500 2975 5000 ABAIXO DE 1500 ABAIXO DE 1500 3000 ABAIXO DE 1500 NO LIMITE ABAIXO DE 1500

d) Escreva uma consulta que retorne o dia da semana para qualquer data entrada no formato DD.MM.YY.
DIA -------SATURDAY

e) Escreva uma consulta que retorne o tempo que o empregado est trabalhando para a empresa.
ENAME TEMPO DE SERVICO ---------- ---------------KING 10 ANOS 3 MESES

f) Dada uma cadeia de caracteres no formato 'nn/nn', verifique se os dois primeiros e os dois ltimos caracteres so numricos, e se o caracter do meio uma '/'. Imprima a expresso 'SIM' se for vlido, e 'NAO' se no for vlido. Experimente as expresses '12/34','01/1a','e '99\88'.
VALOR VALIDO? ----- ------12/34 SIM

46

g) Empregados admitidos at o dia 15, inclusive, so pagos na ltima sexta-feira do ms. Empregados admitidos aps o dia 15 so pagos na ltima sexta-feira do ms seguinte. Imprima uma relao contendo os nome dos empregados, as datas de admisso, e a primeira data de pagamento.
ENAME ---------SMITH ALLEN JONES MILLER MARTIN FORD SCOTT WARD CLARK TURNER ADAMS BLAKE KING JAMES HIREDATE --------13-JUN-83 15-AUG-83 31-OCT-83 21-NOV-83 05-DEC-83 05-DEC-83 05-MAR-84 26-MAR-84 14-MAY-84 04-JUN-84 04-JUN-84 11-JUN-84 09-JUL-84 23-JUL-84 DIA_DO_PAGAMENTO ---------------24-JUN-83 26-AUG-83 25-NOV-83 30-DEC-83 30-DEC-83 30-DEC-83 30-MAR-84 27-APR-84 25-MAY-84 29-JUN-84 29-JUN-84 29-JUN-84 27-JUL-84 31-AUG-84

14 rows selected.

47

5.6

Respostas dos exerccios


a)SQL> SELECT ENAME, 2 TO_CHAR(HIREDATE,'fmMonth, Ddspth YYYY') DATA_DE_ADMISSAO 3 FROM EMP 4 WHERE DEPTNO = 20 b)SQL> SELECT ENAME, HIREDATE, ADD_MONTHS(HIREDATE,12) REVISAO 2 FROM EMP 3 ORDER BY ADD_MONTHS(HIREDATE,12) c)SQL> SELECT ENAME, 2 DECODE(SIGN(1500-SAL),1,'ABAIXO DE 1500',0,'NO LIMITE',SAL) 3 SALARIO 4 FROM EMP 5 ORDER BY ENAME d)SQL> SELECT TO_CHAR(TO_DATE('&ANYDATE','DD.MM.YY'),'DAY') DIA 2 FROM SYS.DUAL Enter value for anydate: 12.11.88 old 1: SELECT TO_CHAR(TO_DATE('&ANYDATE','DD.MM.YY'),'DAY') DIA new 1: SELECT TO_CHAR(TO_DATE('12.11.88','DD.MM.YY'),'DAY') DIA e)SQL> DEFINE TIME = MONTHS_BETWEEN(SYSDATE,HIREDATE) SQL> SELECT ENAME, FLOOR(&TIME/12)||' ANOS '|| 2 FLOOR(MOD(&TIME,12))||' MESES ' "TEMPO DE SERVICO" 3 FROM EMP 4 WHERE ENAME = UPPER('&NOME_DO_EMPREGADO') old 1: SELECT ENAME, FLOOR(&TIME/12)||' ANOS '|| new 1: SELECT ENAME, FLOOR(MONTHS_BETWEEN(SYSDATE,HIREDATE)/12)||' ANOS '|| old 2: FLOOR(MOD(&TIME,12))||' MESES ' "TEMPO DE SERVICO" new 2: FLOOR(MOD(MONTHS_BETWEEN(SYSDATE,HIREDATE),12))||' MESES ' "TEMPO DE SERVICO" Enter value for nome_do_empregado: king old 4: WHERE ENAME = UPPER('&NOME_DO_EMPREGADO') new 4: WHERE ENAME = UPPER('king') f)SQL> SELECT '12/34' VALOR, 2 DECODE(TRANSLATE('12/34','1234567890','9999999999'), 3 '99/99','SIM','NAO') "VALIDO?" 4 FROM SYS.DUAL g)SQL> SELECT ENAME, HIREDATE, 2 DECODE(SIGN(TO_CHAR(HIREDATE,'DD')-15), 3 1,NEXT_DAY(LAST_DAY(ADD_MONTHS(HIREDATE,1)),'FRIDAY')-7, 4 NEXT_DAY(LAST_DAY(HIREDATE),'FRIDAY')-7) DIA_DO_PAGAMENTO 5 FROM EMP 6 ORDER BY HIREDATE ou SQL> 2 3 4 5 SELECT ENAME, HIREDATE, NEXT_DAY(LAST_DAY(ROUND(HIREDATE,'MONTH'))-7,'FRIDAY') DIA_DO_PAGAMENTO FROM EMP ORDER BY HIREDATE

48

Capitulo 6: Funes de Grupo


6.1 Objetivos deste captulo Este captulo explica como informaes sumarizadas (mdia, mximo, mnimo,...) podem ser obtidas para grupo de linhas. As funes vistas anteriormente operavam sobre cada linha, enquanto que as funes mostradas neste captulo operam sobre um grupo de linhas. 6.2 Funes disponveis Funo AVG ([DISTINCT|ALL]n) COUNT ([DISTINCT|ALL]exp*) MAX ([DISTINCT|ALL]exp) MIN ([DISTINCT|ALL]exp) STDDEV ([DISTINCT|ALL]n) SUM ([DISTINCT|ALL]n) VARIANCE ([DISTINCT|ALL]n) Valor retornado Valor mdio de 'n', ignorando os valores nulos. Nmero de ocorrncias no nulas da expresso. O '*' obriga a contagem total, incluindo valores duplicados e nulos. Valor mximo da expresso. Valor mnimo da expresso. Desvio padro de 'n', ignorando os valores nulos. Soma dos valores de 'n', ignorando os valores nulos. Varincia de 'n', ignorando os valores nulos.

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. Podem ser fornecidas expresses dos tipos caracter, nmero ou data quando 'exp' estiver indicado. Quando 'n' estiver indicado, somente valores numricos so aceitos. 6.3 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. 49

Uma funo de grupo pode ser aplicada sobre um subconjunto das linhas usando a clusula WHERE. Para encontrar o salrio mnimo recebido por um CLERK:
SQL> SELECT MIN(SAL) 2 FROM EMP 3 WHERE JOB='CLERK' MIN(SAL) ----------------800

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


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

6.4

A clusula GROUP BY A clusula GROUP BY utilizada para dividir as linhas das tabelas em grupos. Funes de grupo podem ser utilizadas para retornar informaes sumarizadas para cada grupo. Para calcular o salrio mdio de cada cargo:
SQL> SELECT JOB, AVG(SAL) 2 FROM EMP 3 GROUP BY JOB JOB AVG(SAL) --------- ----------------ANALYST 3000 CLERK 1037.5 MANAGER 2758.333333333333 PRESIDENT 5000 SALESMAN 1400

6.5

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> 2 3 4 SELECT JOB, AVG(SAL) FROM EMP WHERE JOB != 'MANAGER' GROUP BY JOB

JOB AVG(SAL) --------- ----------------ANALYST 3000 CLERK 1037.5

50

PRESIDENT SALESMAN

5000 1400

6.6

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 ----------------10 10 10 20 20 20 30 30 30 9 rows selected. JOB AVG(SAL) --------- ----------------CLERK 1300 MANAGER 2450 PRESIDENT 5000 ANALYST 3000 CLERK 950 MANAGER 2975 CLERK 950 MANAGER 2850 SALESMAN 1400

6.7

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) ----------------3000 1300 2975 5000 1600 JOB --------ANALYST CLERK MANAGER PRESIDENT 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. 51

O exemplo abaixo mostra o erro causado pela utilizao da funo de grupo MIN(SAL), sem haver a clusula GROUP BY em DEPTNO:
SQL> SELECT DEPTNO, MIN(SAL) 2 FROM EMP SELECT DEPTNO, MIN(SAL) * ERROR at line 1: ORA-00937: not a single-group group function

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. 6.8 A clusula HAVING Somente os grupos que atendem as condies especificadas na clusula HAVING so selecionados. A clusula HAVING opera sobre a clusula GROUP BY de maneira semelhante a que a clusula WHERE opera sobre a clusula SELECT. Para mostrar o salrio mdio dos departamento que possuem mais de trs funcionrios:
SQL> 2 3 4 SELECT DEPTNO, AVG(SAL) FROM EMP GROUP BY DEPTNO HAVING COUNT(*) > 3 DEPTNO AVG(SAL) ----------------- ----------------20 2175 30 1566.666666666667

Para mostrar os cargos com salrio mximo acima de 3000:


SQL> 2 3 4 SELECT JOB, MAX(SAL) FROM EMP HAVING MAX(SAL) >= 3000 GROUP BY JOB

JOB MAX(SAL) --------- ----------------ANALYST 3000 PRESIDENT 5000

52

Embora a clusula HAVING possa ser escrita antes da clusula GROUP BY, a leitura tornase mais fcil quando a clusula HAVING aparece aps a clusula GROUP BY. Os grupos so formados e as funes de grupo so calculadas antes da clusula HAVING ser aplicada. A clusula WHERE no pode ser usada para restringir os grupos a serem retornados. A clusula WHERE na declarao abaixa ilegal:
SQL> 2 3 4 SELECT DEPTNO, AVG(SAL) FROM EMP WHERE AVG(SAL) > 2000 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> 2 3 4 SELECT DEPTNO, AVG(SAL) FROM EMP GROUP BY DEPTNO 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. 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> 2 3 4 5 SELECT JOB, AVG(SAL) FROM EMP WHERE JOB <> 'MANAGER' GROUP BY JOB HAVING AVG(SAL) > 2000

JOB AVG(SAL) --------- ----------------ANALYST 3000 CLERK 1037.5 PRESIDENT 5000

6.9

Ordem das clusulas SELECT FROM WHERE GROUP BY lista_de_colunas lista_de_tabelas condies_de_linha lista_de_colunas 53

HAVING condies_de_grupo ORDER BY lista_de_colunas So avaliados: WHERE para ficar somente as linhas que atendem a clusula GROUP BY para montagem dos grupos HAVING para ficar somente os grupos que atendem a clusula 6.10 Exerccios a) Encontrar o menor salrio entre todos os empregados.
MENOR ----------------800

b) Encontrar o salrio maior, menor, e mdio, entre todos os empregados.


MAX(SAL) MIN(SAL) AVG(SAL) ----------------- ----------------- ----------------5000 800 2073.214285714286

c) Listar o maior e o menor salrio por cada tipo de cargo.


CARGO MAIOR MENOR --------- ----------------- ----------------ANALYST 3000 3000 CLERK 1300 800 MANAGER 2975 2450 PRESIDENT 5000 5000 SALESMAN 1600 1250

d) Calcular o nmero de gerentes sem listar seus nomes.


GERENTES ----------------3

e) Encontrar o salrio mdio e a remunerao total mdia de cada tipo de cargo, lembrandose que os vendedores recebem comisso.
JOB SALARIO_MEDIO REMUNERACAO_MEDIA --------- ----------------- ----------------ANALYST 3000 36000 CLERK 1037.5 12450 MANAGER 2758.333333333333 33100 PRESIDENT 5000 60000 SALESMAN 1400 17237

f) Encontrar a diferena entre o maior e o menor salrios.


DIFERENCA ----------------4200

g) Listar todos os departamentos que possuem mais de trs empregados. 54

DEPTNO COUNT(*) ----------------- ----------------20 5 30 6

h) Verificar se no h duplicidade no nmero dos empregados


no rows selected

i) Listar os empregados que recebem o menor salrio em cada departamento, relacionando os seus gerentes. Excluir os grupos onde o menor salrio inferior a 1000. Ordenar os resultados pelo salrio
MGR MIN(SAL) ----------------- ----------------7788 1100 7782 1300 7839 2450 7566 3000 5000

55

6.11

Respostas dos exerccios


a) SQL> SELECT MIN(SAL) MENOR 2 FROM EMP b) SQL> SELECT MAX(SAL), MIN(SAL), AVG(SAL) 2 FROM EMP c) SQL> SELECT JOB CARGO, MAX(SAL) MAIOR, MIN(SAL) MENOR 2 FROM EMP 3 GROUP BY JOB d) SQL> SELECT COUNT(*) GERENTES 2 FROM EMP 3 WHERE JOB = 'MANAGER' e) SQL> 2 3 4 SELECT JOB, AVG(SAL) SALARIO_MEDIO, AVG(SAL*12+NVL(COMM,0)) REMUNERACAO_MEDIA FROM EMP GROUP BY JOB

f) SQL> SELECT MAX(SAL)-MIN(SAL) DIFERENCA 2 FROM EMP g) SQL> 2 3 4 h) SQL> 2 3 4 i) SQL> 2 3 4 5 SELECT DEPTNO, COUNT(*) FROM EMP GROUP BY DEPTNO HAVING COUNT(*) > 3 SELECT EMPNO FROM EMP GROUP BY EMPNO HAVING COUNT(*) > 1 SELECT MGR, MIN(SAL) FROM EMP GROUP BY MGR HAVING MIN(SAL) >= 1000 ORDER BY MIN(SAL)

56

Captulo 7: Extraindo dados de mais de uma tabela


7.1 Objetivos deste captulo Mostrar como obter informaes de mais de uma tabela atravs das junes. Linhas de uma tabela podem ser juntadas com linhas de outra tabela, de acordo com valores comuns existentes em colunas correspondentes. Os dois principais tipos de juno so: 1-Junes equivalentes (equi-join) 2-Junes no equivalentes (non-equi-join) 7.2 Junes equivalentes Para levantar, manualmente, o nome do departamento em que um funcionrio trabalha, primeiro seria levantado na tabela EMP o nmero do departamento do empregado, e, em seguida, seria levantado na tabela DEPT o nome correspondente ao nmero do departamento. Este relacionamento entre as duas tabelas chamado de juno equivalente (equi-join), uma vez o nmero do departamento nas duas tabelas o mesmo. A condio de juno especificada na clusula WHERE usando o operador '='.
SQL> SELECT ENAME, JOB, DNAME 2 FROM EMP, DEPT 3 WHERE EMP.DEPTNO = DEPT.DEPTNO ENAME ---------CLARK KING MILLER SMITH ADAMS FORD SCOTT JONES ALLEN BLAKE MARTIN JAMES TURNER WARD JOB --------MANAGER PRESIDENT CLERK CLERK CLERK ANALYST ANALYST MANAGER SALESMAN MANAGER SALESMAN CLERK SALESMAN SALESMAN DNAME -------------ACCOUNTING ACCOUNTING ACCOUNTING RESEARCH RESEARCH RESEARCH RESEARCH RESEARCH SALES SALES SALES SALES SALES SALES

As linhas da tabela EMP foram combinadas com as linhas da tabela DEPT para obteno dos nmeros dos departamentos. O nome da tabela colocado antes do nome da coluna, para diferenciar colunas com mesmo nome em tabelas diferentes. Todas as colunas podem ser prefixadas com o nome da tabela, porm este procedimento s obrigatrio quando existe ambigidade.
SQL> SELECT DEPT.DEPTNO, ENAME, JOB, DNAME 2 FROM EMP, DEPT 3 WHERE EMP.DEPTNO = DEPT.DEPTNO

57

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

DNAME -------------ACCOUNTING ACCOUNTING ACCOUNTING RESEARCH RESEARCH RESEARCH RESEARCH RESEARCH SALES SALES SALES SALES SALES SALES

Alis para nomes de tabelas podem ser usado de forma semelhante que foi usada para alis de nomes de colunas. O nome do alis escrito aps o nome da tabela. No exemplo abaixo foi utilizado o alis 'E' para a tabela EMP, e o alis 'D' para a tabela DEPT.
SQL> 2 3 4 SELECT E.ENAME, D.DEPTNO, D.DNAME FROM EMP E, DEPT D WHERE E.DEPTNO = D.DEPTNO ORDER BY D.DEPTNO

ENAME DEPTNO DNAME ---------- ------- -------------CLARK 10 ACCOUNTING KING 10 ACCOUNTING MILLER 10 ACCOUNTING SMITH 20 RESEARCH ADAMS 20 RESEARCH FORD 20 RESEARCH SCOTT 20 RESEARCH JONES 20 RESEARCH ALLEN 30 SALES BLAKE 30 SALES MARTIN 30 SALES JAMES 30 SALES TURNER 30 SALES WARD 30 SALES 14 rows selected.

7.3

Produto Quando a condio de juno invlida ou omitida completamente, o resultado um Produto Cartesiano, e todas as combinaes de linha sero retornadas. O Produto tende a gerar um grande nmero de linhas, e o resultado raramente til.

7.4

Junes no equivalentes O relacionamento entre as tabelas EMP e SALGRADE formam uma juno no equivalente, uma vez que no existe nenhuma coluna comum s duas tabelas. No exemplo, a funo BETWEEN ... AND ... faz o relacionamento entre as duas tabelas. 58

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

7.5

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

7.6

Sumrio da Sintaxe SELECT FROM WHERE AND OR GROUP BY HAVING ORDER BY [DISTINCT] {[tabela].*|expresso [alis],...} tabela [alias],... [condio de juno]... [condio de linha]... [outra condio de linha] {expresso|coluna} {condio de grupo} {expresso|coluna} [ASC|DESC]

7.7

Exerccios a) Mostrar o nome dos empregados e dos departamentos onde trabalham, ordenados pelo nome do departamento.
ENAME ---------CLARK KING MILLER SMITH ADAMS FORD SCOTT JONES ALLEN BLAKE MARTIN JAMES TURNER DNAME -------------ACCOUNTING ACCOUNTING ACCOUNTING RESEARCH RESEARCH RESEARCH RESEARCH RESEARCH SALES SALES SALES SALES SALES

59

WARD

SALES

14 rows selected.

b) Mostrar os nomes dos empregados, juntamente com os nmeros e nomes dos departamentos onde trabalham
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.

c) Listar o nome, o local de trabalho e o departamento dos empregados com salrio superior a 1500.
ENAME ---------CLARK KING JONES SCOTT FORD ALLEN BLAKE LOCAL ------------NEW YORK NEW YORK DALLAS DALLAS DALLAS CHICAGO CHICAGO DNAME -------------ACCOUNTING ACCOUNTING RESEARCH RESEARCH RESEARCH SALES SALES

7 rows selected.

d) Listar as faixas salariais dos empregados.


ENAME ---------SMITH ADAMS JAMES WARD MARTIN MILLER ALLEN TURNER JONES BLAKE CLARK SCOTT FORD KING JOB SAL GRADE --------- ------- ------CLERK 800 1 CLERK 1100 1 CLERK 950 1 SALESMAN 1250 2 SALESMAN 1250 2 CLERK 1300 2 SALESMAN 1600 3 SALESMAN 1500 3 MANAGER 2975 4 MANAGER 2850 4 MANAGER 2450 4 ANALYST 3000 4 ANALYST 3000 4 PRESIDENT 5000 5

14 rows selected.

60

e) Mostrar somente os empregados na faixa 3.


ENAME ---------ALLEN TURNER JOB SAL GRADE --------- ------- ------SALESMAN 1600 3 SALESMAN 1500 3

f) Listar todos os empregados em Dallas.


ENAME SAL LOCAL ---------- ------- ------------SMITH 800 DALLAS ADAMS 1100 DALLAS FORD 3000 DALLAS SCOTT 3000 DALLAS JONES 2975 DALLAS

g) Listar os nomes dos empregados, o cargo, o salrio, a faixa salarial, e o nome do departamento para todos na companhia, exceto os Clerks. Ordenar pelo salrio, com os maiores primeiro.
ENAME ---------KING FORD SCOTT JONES BLAKE CLARK ALLEN TURNER MARTIN WARD JOB SAL GRADE DNAME --------- ------- ------- -------------PRESIDENT 5000 5 ACCOUNTING ANALYST 3000 4 RESEARCH ANALYST 3000 4 RESEARCH MANAGER 2975 4 RESEARCH MANAGER 2850 4 SALES MANAGER 2450 4 ACCOUNTING SALESMAN 1600 3 SALES SALESMAN 1500 3 SALES SALESMAN 1250 2 SALES SALESMAN 1250 2 SALES

10 rows selected.

h) Listar os seguintes detalhes para os empregados que ganham 36.000 por ano ou que so Clerks.
ENAME ---------MILLER SMITH ADAMS JAMES JOB SALARIO_ANUAL DEPTNO DNAME GRADE --------- ------------- ------- -------------- ------CLERK 15600 10 ACCOUNTING 2 CLERK 9600 20 RESEARCH 1 CLERK 13200 20 RESEARCH 1 CLERK 11400 30 SALES 1

61

7.8

Soluo dos exerccios


a) SQL> SELECT ENAME, DNAME 2 FROM EMP, DEPT 3 WHERE EMP.DEPTNO = DEPT.DEPTNO b) SQL> SELECT ENAME, E.DEPTNO, DNAME 2 FROM EMP E, DEPT D 3 WHERE E.DEPTNO = D.DEPTNO c) SQL> 2 3 4 SELECT ENAME, LOC LOCAL, DNAME FROM EMP, DEPT WHERE EMP.DEPTNO = DEPT.DEPTNO AND SAL > 1500

d) SQL> SELECT ENAME, JOB, SAL, GRADE 2 FROM EMP, SALGRADE 3 WHERE SAL BETWEEN LOSAL AND HISAL e) SQL> SELECT ENAME, JOB, SAL, GRADE 2 FROM EMP, SALGRADE 3 WHERE SAL BETWEEN LOSAL AND HISAL AND GRADE = 3 f) SQL> 2 3 4 g) SQL> 2 3 4 5 6 h) SQL> 2 3 4 5 6 7 SELECT ENAME, SAL, LOC LOCAL FROM EMP, DEPT WHERE EMP.DEPTNO = DEPT.DEPTNO AND LOC='DALLAS' SELECT ENAME, JOB, SAL, GRADE, DNAME FROM EMP, SALGRADE, DEPT WHERE EMP.DEPTNO = DEPT.DEPTNO AND SAL BETWEEN LOSAL AND HISAL AND JOB != 'CLERK' ORDER BY SAL DESC SELECT ENAME, JOB, SAL*12+NVL(COMM,0) SALARIO_ANUAL, D.DEPTNO, DNAME, GRADE FROM EMP E, SALGRADE, DEPT D WHERE E.DEPTNO = D.DEPTNO AND SAL BETWEEN LOSAL AND HISAL AND (SAL*12+NVL(COMM,0)=3600 OR JOB = 'CLERK') ORDER BY E.JOB

62

Captulo 8: Outros mtodos de juno


8.1 Objetivos deste captulo Mostrar mtodos alternativos para construo de junes. 8.2 Junes externas Se uma linha no satisfaz a condio de juno, ento a linha no mostrada no resultado da consulta. De fato, quando fazemos a juno equivalente (equi-join) das tabelas EMP e DEPT, o departamento 40 no aparece, uma vez que no h nenhum empregado lotado neste departamento. As linhas excludas podem ser retornadas se um operador de juno externa (outer join) for utilizado na condio de juno. O operador um sinal de '+' colocado entre parnteses, que deve ser ficar ao lado da tabela onde as informaes que no seriam includas devem aparecer. No exemplo o operador est colocado ao lado da tabela DEPT, forando listar os dados dos departamentos mesmo que no haja correspondncia em EMP.
SQL> 2 3 4 SELECT E.ENAME, D.DEPTNO, D.DNAME FROM EMP E, DEPT D WHERE E.DEPTNO (+) = D.DEPTNO AND D.DEPTNO IN (30,40)

ENAME DEPTNO DNAME ---------- ------- -------------ALLEN 30 SALES BLAKE 30 SALES MARTIN 30 SALES JAMES 30 SALES TURNER 30 SALES WARD 30 SALES 40 OPERATIONS 7 rows selected.

O operador de juno externa (outer join) s pode aparecer em um dos lados da expresso, causando uma juno externa esquerda (left outer join), ou uma juno externa direita (right outer join). A juno externa completa (outer join) no implementada diretamente pelo Oracle. 8.3 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. 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

63

4 WHERE E.MGR = EMP_NOME EMP_SAL ---------- ------ALLEN 1600 WARD 1250 JAMES 950 TURNER 1500 MARTIN 1250 MILLER 1300 ADAMS 1100 JONES 2975 CLARK 2450 BLAKE 2850 SMITH 800 11 rows selected.

G.EMPNO AND E.SAL < G.SAL GER_NOME GER_SAL ---------- ------BLAKE 2850 BLAKE 2850 BLAKE 2850 BLAKE 2850 BLAKE 2850 CLARK 2450 SCOTT 3000 KING 5000 KING 5000 KING 5000 FORD 3000

Note que EMP aparece na clusula FROM duas vezes, uma com o alis 'E', para os empregados, e outra com o alis 'G', para os gerentes. 8.4 Junes verticais Os operadores UNION, INTERSECT e MINUS so teis para construir consultas que se referem a tabelas diferentes. Estes operadores combinam os resultados de dois ou mais SELECTs em um nico resultado. 8.4.1 Unio O operador UNION retorna todas as linhas distintas das consultas unidas por este operador. No exemplo so listados todos os cargos dos departamentos 10 e 30 sem repetio.
SQL> 2 3 4 5 6 7 SELECT JOB FROM EMP WHERE DEPTNO = 10 UNION SELECT JOB FROM EMP WHERE DEPTNO = 30

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

8.4.2 Interseo O operador INTERSECT retorna apenas as linhas comuns s duas consultas. Para listar os cargos existentes tanto no departamento 10 quanto no departamento 30:
SQL> 2 3 4 5 6 7 SELECT JOB FROM EMP WHERE DEPTNO = 10 INTERSECT SELECT JOB FROM EMP WHERE DEPTNO = 30

64

JOB --------CLERK MANAGER

8.4.3 Subtrao O operador MINUS retorna as linhas presentes na primeira consulta mas no presentes na segunda consulta. Para listar os cargos existentes no departamento 10 mas no existentes no departamento 30:
SQL> 2 3 4 5 6 7 SELECT JOB FROM EMP WHERE DEPTNO = 10 MINUS SELECT JOB FROM EMP WHERE DEPTNO = 30

JOB --------PRESIDENT

8.4.4 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. 8.4.5 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> 2 3 4 5 6 SELECT EMPNO, ENAME, SAL FROM EMP UNION SELECT ID, NAME, SALARY FROM EMP HISTORY ORDER BY 2

A clusula ORDER BY deve ser sempre a ltima. 8.4.6 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. 65

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. Mltiplas junes verticais podem ser utilizadas, com parnteses, se necessrio, para alterar a ordem de execuo.

8.5

Exerccios a) Listar os departamentos que no possuem empregados.


DEPTNO DNAME ------- -------------40 OPERATIONS

b) Listar os nmeros e os nomes dos empregados juntamente com os nmeros e os nomes de seus gerentes.
EMPNO ------7788 7902 7499 7521 7900 7844 7654 7934 7876 7566 7782 7698 7369 ENAME GER_NUM GER_NOME ---------- ------- ---------SCOTT 7566 JONES FORD 7566 JONES ALLEN 7698 BLAKE WARD 7698 BLAKE JAMES 7698 BLAKE TURNER 7698 BLAKE MARTIN 7698 BLAKE MILLER 7782 CLARK ADAMS 7788 SCOTT JONES 7839 KING CLARK 7839 KING BLAKE 7839 KING SMITH 7902 FORD

13 rows selected.

c) Alterar a soluo do exerccio b para mostrar KING que no possui gerente.


EMPNO ------7788 7902 7499 7521 7900 7844 7654 7934 7876 7566 7782 7698 7369 7839 ENAME GER_NUM GER_NOME ---------- ------- ---------SCOTT 7566 JONES FORD 7566 JONES ALLEN 7698 BLAKE WARD 7698 BLAKE JAMES 7698 BLAKE TURNER 7698 BLAKE MARTIN 7698 BLAKE MILLER 7782 CLARK ADAMS 7788 SCOTT JONES 7839 KING CLARK 7839 KING BLAKE 7839 KING SMITH 7902 FORD KING

66

14 rows selected.

d) Mostrar os cargos que foram preenchidos no primeiro semestre de 1983 e no mesmo perodo em 1984.
JOB --------CLERK

e) Listar todos os empregados admitidos antes de seus gerentes.


EMPREGADO ---------ALLEN WARD TURNER MARTIN MILLER JONES CLARK BLAKE SMITH HIREDATE --------15-AUG-83 26-MAR-84 04-JUN-84 05-DEC-83 21-NOV-83 31-OCT-83 14-MAY-84 11-JUN-84 13-JUN-83 GERENTE ---------BLAKE BLAKE BLAKE BLAKE CLARK KING KING KING FORD HIREDATE --------11-JUN-84 11-JUN-84 11-JUN-84 11-JUN-84 14-MAY-84 09-JUL-84 09-JUL-84 09-JUL-84 05-DEC-83

9 rows selected.

f) Encontrar outra maneira de resolver o exerccio a.


DEPTNO DNAME ------- -------------40 OPERATIONS

67

8.6

Respostas dos exerccios


a) SQL> 2 3 4 b) SQL> 2 3 4 c) SQL> 2 3 4 d) SQL> 2 3 4 5 6 7 e) SQL> 2 3 4 f) SQL> 2 3 4 5 6 SELECT D.DEPTNO, DNAME FROM EMP E, DEPT D WHERE E.DEPTNO (+) = D.DEPTNO AND E.EMPNO IS NULL SELECT EMPS.EMPNO, EMPS.ENAME, GERS.EMPNO GER_NUM, GERS.ENAME GER_NOME FROM EMP EMPS, EMP GERS WHERE EMPS.MGR = GERS.EMPNO SELECT EMPS.EMPNO, EMPS.ENAME, GERS.EMPNO GER_NUM, GERS.ENAME GER_NOME FROM EMP EMPS, EMP GERS WHERE EMPS.MGR = GERS.EMPNO (+) SELECT JOB FROM EMP WHERE HIREDATE BETWEEN '01-JAN-83' AND '30-JUN-83' INTERSECT SELECT JOB FROM EMP WHERE HIREDATE BETWEEN '01-JAN-84' AND '30-JUN-84' SELECT E.ENAME EMPREGADO, E.HIREDATE, M.ENAME GERENTE, M.HIREDATE FROM EMP E, EMP M WHERE E.MGR = M.EMPNO AND E.HIREDATE < M.HIREDATE SELECT DEPTNO, DNAME FROM DEPT MINUS SELECT EMP.DEPTNO, DNAME FROM EMP, DEPT WHERE EMP.DEPTNO = DEPT.DEPTNO

68

Captulo 9: Consultas aninhadas


9.1 Objetivos deste captulo Mostrar consultas declaradas nas clusulas Where e Having. 9.2 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. 9.3 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:


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 =, <, >, <=, >=, <>.

69

9.4

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 ---------JONES BLAKE CLARK JOB --------MANAGER MANAGER MANAGER

O cargo de BLAKE obtido pela consulta interna e utilizado pela consulta principal. 9.5 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 ---------- ------- ------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> 2 3 4 SELECT ENAME, SAL, DEPTNO FROM EMP WHERE (SAL,DEPTNO) IN (SELECT MIN(SAL), DEPTNO FROM EMP GROUP BY DEPTNO)

ENAME SAL DEPTNO ---------- ------- ------SMITH 800 20 JAMES 950 30 MILLER 1300 10

70

Nesta nova consulta, retornado um par de colunas que comparado com um par de colunas da consulta principal. Note que as colunas esquerda da condio de procura esto entre parnteses e so separadas por vrgulas. As colunas listadas na consulta interna devem estar na mesma ordem das colunas esquerda da condio de procura. As colunas retornadas pela consulta interna devem ser em mesmo nmero e do mesmo tipo de dados das colunas esquerda da condio de procura. Se uma consulta interna retornar mais de uma linha e a condio de procura utilizar um operador de uma linha apenas gera o erro mostrado abaixo:
SQL> SELECT ENAME, SAL, DEPTNO 2 FROM EMP 3 WHERE SAL = 4 (SELECT MIN(SAL) FROM EMP GROUP BY DEPTNO) ERROR: ORA-01427: single-row subquery returns more than one row no rows selected

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

9.6

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> 2 3 4 5 SELECT ENAME, SAL, JOB, DEPTNO FROM EMP WHERE SAL > ANY (SELECT DISTINCT SAL FROM EMP WHERE DEPTNO = 30) 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

71

CLARK ALLEN TURNER MILLER WARD MARTIN ADAMS

2450 1600 1500 1300 1250 1250 1100

MANAGER SALESMAN SALESMAN CLERK SALESMAN SALESMAN CLERK

10 30 30 10 30 30 20

12 rows selected.

Quando usamos ANY geralmente usamos DISTINCT para reduzir a lista de valores a serem comparados. ALL compara o valor com todos os valores retornados pela consulta interna. A consulta abaixo encontra os empregados que ganham mais do que todos os empregados do departamento 30.
SQL> 2 3 4 5 SELECT ENAME, SAL, JOB, DEPTNO FROM EMP WHERE SAL > ALL (SELECT DISTINCT SAL FROM EMP WHERE DEPTNO = 30) 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 9.7 Clusula HAVING com consultas aninhadas Para mostrar os departamentos com salrio mdio superior ao salrio mdio do departamento 30, escrevemos:
SQL> 2 3 4 5 SELECT DEPTNO, AVG(SAL) FROM EMP GROUP BY DEPTNO HAVING AVG(SAL) > (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:


SQL> 2 3 4 5 SELECT JOB, AVG(SAL) FROM EMP GROUP BY JOB HAVING AVG(SAL) = (SELECT MAX(AVG(SAL)) FROM EMP GROUP BY JOB)

JOB AVG(SAL) --------- -------PRESIDENT 5000

72

9.8

Ordenao em consultas aninhadas


No pode existir a clusula ORDER BY na consulta interna. A clusula ORDER BY sempre a ltima no comando SELECT.

9.9

Limite para o aninhamento

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

9.10

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. 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> 2 3 4 5 SELECT EMPNO, ENAME, SAL, DEPTNO FROM EMP E WHERE SAL > (SELECT AVG(SAL) FROM EMP WHERE DEPTNO = E.DEPTNO) ORDER BY DEPTNO ENAME SAL DEPTNO ---------- ------- ------KING 5000 10 JONES 2975 20 SCOTT 3000 20 FORD 3000 20 ALLEN 1600 30

EMPNO ------7839 7566 7788 7902 7499

73

7698 BLAKE

2850

30

Anlise da execuo da consulta:

Consulta principal

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.

9.11

O operador EXISTS O operador EXISTS freqentemente usado com consultas aninhadas correlacionadas, testando se o valor existe. Se o valor existir, retorna verdadeiro, caso contrrio retorna falso. Para listar todas as empregados com ao menos um funcionrio subordinado:
SQL> 2 3 4 5 SELECT EMPNO, ENAME, JOB, DEPTNO FROM EMP E WHERE EXISTS (SELECT EMPNO FROM EMP WHERE EMP.MGR = E.EMPNO) ORDER BY EMPNO ENAME ---------JONES BLAKE CLARK SCOTT KING FORD JOB DEPTNO --------- ------MANAGER 20 MANAGER 30 MANAGER 10 ANALYST 20 PRESIDENT 10 ANALYST 20

EMPNO ------7566 7698 7782 7788 7839 7902

6 rows selected.

Para listar os empregados cujos departamentos no esto na tabela de departamentos:


SQL> 2 3 4 SELECT EMPNO, ENAME, DEPTNO FROM EMP WHERE NOT EXISTS (SELECT DEPTNO FROM DEPT WHERE DEPT.DEPTNO = EMP.DEPTNO)

74

no rows selected

Uma outra forma para encontrar os departamentos sem funcionrios :


SQL> 2 3 4 SELECT DEPTNO, DNAME FROM DEPT D WHERE NOT EXISTS (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. 9.12 Exerccios a) Listar os empregados com o maior salrio por cargo, em ordem descendente de salrio.
ENAME ---------KING SCOTT FORD JONES ALLEN MILLER JOB SAL --------- ------PRESIDENT 5000 ANALYST 3000 ANALYST 3000 MANAGER 2975 SALESMAN 1600 CLERK 1300

b) Listar os empregados com os menores salrio por cargo, em ordem ascendente de salrio.
ENAME ---------SMITH WARD MARTIN CLARK SCOTT FORD KING JOB SAL --------- ------CLERK 800 SALESMAN 1250 SALESMAN 1250 MANAGER 2450 ANALYST 3000 ANALYST 3000 PRESIDENT 5000

7 rows selected.

c) Listar os ltimos empregados contratados em cada departamento.


DEPTNO ------20 10 30 ENAME ---------ADAMS KING JAMES HIREDATE --------04-JUN-84 09-JUL-84 23-JUL-84

d) Listar o nome, o salrio e o nmero do departamento dos funcionrios que recebem acima da mdia de seus departamentos. Ordenar pelo nmero do departamento.
ENAME SALARIO DEPTNO ---------- ------- ------KING 5000 10 JONES 2975 20

75

SCOTT FORD ALLEN BLAKE

3000 3000 1600 2850

20 20 30 30

e) Listar os departamentos sem funcionrios.


DEPTNO DNAME ------- -------------40 OPERATIONS

f) Mostrar o departamento que tem mais despesas com seus funcionrios.


DEPTNO MAIOR_DESPESA ------- ------------20 130500

g) Quais os trs empregados que ganham mais ?


ENAME SAL ---------- ------SCOTT 3000 KING 5000 FORD 3000

h) Em que ano a empresa contratou mais ?


ANO NUMERO DE EMPREGADOS ---- -------------------1984 8

i) Modificar o exerccio d para mostrar o salrio mdio do departamento junto com as outras informaes.
NOME SALARIO DEPARTAMENTO MEDIA_DEPT ---------- ----------- ------------ ----------ALLEN 1,600.00 30 1,566.67 BLAKE 2,850.00 30 JONES 2,975.00 20 2,175.00 FORD 3,000.00 20 SCOTT 3,000.00 20 KING 5,000.00 10 2,916.67 6 rows selected.

j) Escreva uma consulta que mostre um '*' junto do funcionrio contratado mais recentemente
ENAME ---------ADAMS ALLEN BLAKE CLARK FORD JAMES JONES KING MARTIN MILLER SCOTT HIREDATE MAIOR_DATA --------- ---------04-JUN-84 15-AUG-83 11-JUN-84 14-MAY-84 05-DEC-83 23-JUL-84 * 31-OCT-83 09-JUL-84 05-DEC-83 21-NOV-83 05-MAR-84

76

SMITH TURNER WARD

13-JUN-83 04-JUN-84 26-MAR-84

14 rows selected.

77

9.13

Resposta dos exerccios


a) SQL> 2 3 4 5 b) SQL> 2 3 4 5 c) SQL> 2 3 4 5 d) SQL> 2 3 4 5 e) SQL> 2 3 4 f) SQL> SQL> 2 3 4 5 old new old new old new SELECT ENAME, JOB, SAL FROM EMP WHERE (SAL,JOB) IN (SELECT MAX(SAL), JOB FROM EMP GROUP BY JOB) ORDER BY SAL DESC SELECT ENAME, JOB, SAL FROM EMP WHERE (SAL,JOB) IN (SELECT MIN(SAL), JOB FROM EMP GROUP BY JOB) ORDER BY SAL SELECT DEPTNO, ENAME, HIREDATE FROM EMP WHERE (HIREDATE,DEPTNO) IN (SELECT MAX(HIREDATE), DEPTNO FROM EMP GROUP BY DEPTNO) ORDER BY HIREDATE SELECT ENAME, SAL SALARIO, DEPTNO FROM EMP E WHERE SAL > (SELECT AVG(SAL) FROM EMP WHERE DEPTNO = E.DEPTNO) ORDER BY DEPTNO SELECT DEPTNO, DNAME FROM DEPT D WHERE NOT EXISTS (SELECT 'qualquer coisa' FROM EMP WHERE DEPTNO = D.DEPTNO) DEFINE REM = SAL*12+NVL(COMM,0) SELECT DEPTNO, SUM(&REM) MAIOR_DESPESA FROM EMP GROUP BY DEPTNO HAVING SUM(&REM) = (SELECT MAX(SUM(&REM)) FROM EMP GROUP BY DEPTNO) 1: SELECT DEPTNO, SUM(&REM) MAIOR_DESPESA 1: SELECT DEPTNO, SUM(SAL*12+NVL(COMM,0)) MAIOR_DESPESA 4: HAVING SUM(&REM) = 4: HAVING SUM(SAL*12+NVL(COMM,0)) = 5: (SELECT MAX(SUM(&REM)) FROM EMP GROUP BY DEPTNO) 5: (SELECT MAX(SUM(SAL*12+NVL(COMM,0))) FROM EMP GROUP BY DEPTNO)

g) SQL> SELECT ENAME, SAL 2 FROM EMP E 3 WHERE 3 > (SELECT COUNT(*) FROM EMP WHERE E.SAL < SAL) h) SQL> SQL> SQL> 2 3 4 5 6 7

COLUMN ANO FORMAT A4 COLUMN NUMBER_OF_EMPS FORMAT 9 HEADING 'NUMERO DE EMPREGADOS' SELECT TO_CHAR(HIREDATE,'YYYY') ANO, COUNT(EMPNO) NUMBER_OF_EMPS FROM EMP GROUP BY TO_CHAR(HIREDATE,'YYYY') HAVING COUNT(EMPNO) = (SELECT MAX(COUNT(EMPNO)) FROM EMP

78

8 i) SQL> SQL> SQL> SQL> 2 3 4 5 6 7 8 j) SQL> 2 3 4 5 6 7

GROUP BY TO_CHAR(HIREDATE,'YYYY')) COLUMN SALARIO FORMAT 999,999.99 COLUMN MEDIA_DEPT LIKE SALARIO BREAK ON DEPTNO ON MEDIA_DEPT SELECT E.ENAME NOME, E.SAL SALARIO, E.DEPTNO DEPARTAMENTO, AVG(A.SAL) MEDIA_DEPT FROM EMP A, EMP E WHERE E.DEPTNO = A.DEPTNO AND E.SAL > (SELECT AVG(SAL) FROM EMP WHERE DEPTNO = E.DEPTNO) GROUP BY E.ENAME, E.SAL, E.DEPTNO ORDER BY AVG(A.SAL) SELECT ENAME, HIREDATE, '*' MAIOR_DATA FROM EMP WHERE HIREDATE = (SELECT MAX(HIREDATE) FROM EMP) UNION SELECT ENAME, HIREDATE, ' ' FROM EMP WHERE HIREDATE < (SELECT MAX(HIREDATE) FROM EMP)

79

Captulo 10: Gerao de relatrios


10.1 Objetivos deste captulo Aprender os comandos SET que controlam o ambiente, e aprender a formatar os resultados das consultas no SQL*PLUS. 10.2 Conjunto de comandos SET do SQL*PLUS ECHO{OFF on} FEED[BACK] {6 n off on} HEA[DING] {off ON} LIN[ESIZE] {80 n} NEWP[AGE] {1 n} NUMF[ORMAT] formato NUM[WIDTH] {10 n} PAGES[IZE] {24 n} PAU[SE] {OFF on texto} VERIFY {off ON} TIMING {OFF on} SPACE {1 n} TERM[OUT] {off ON} SQLCASE {MIXED lower upper} ON mostra os comando executados a partir de um arquivo de comandos. OFF no mostra. 'n' faz com que seja mostrado o nmero de linhas selecionadas na tela, quando 'n' ou mais linhas so selecionadas. ON causa a impresso do cabealho da coluna no relatrio. OFF suprime a impresso do cabealho. Nmero de caracteres a serem exibidos antes da marca de nova linha, e controle para centrar e ajustar texto direita. Nmero de linhas em branco entre o ttulo inferior de uma pgina e o ttulo superior da pgina seguinte. 0 = form feed. Formato padro para resultados numricos. Largura padro para colunas numricas. Nmero de linhas por pgina. ON aguarda pressionar ENTER antes de mostrar a nova tela. OFF suprime a espera. Texto especifica o texto a ser mostrado ON faz com que o texto de uma linha de comando seja mostrado antes e depois de aplicada a varivel de substituio. ON mostra as estatsticas de tempo de cada comando SQL processado. Nmero de espaos entre colunas. Mximo igual a 10. OFF suprime a exibio dos resultados produzidos pelos comandos executados a partir de um arquivo, mantendo o Spool. LOWER e UPPER convertem os caracteres antes da execuo. MIXED no altera os caracteres do texto.

O comando SHOW ALL exibe todas as variveis do comando SET. 10.3 COLUMN Atravs do comando COLUMN podem ser alteradas propriedades das colunas. Notas:

O nome da coluna deve ser o nome do alis, se algum for usado. 80

As opes podem vir em qualquer ordem. Uma vez emitido, o comando permanece vlido at o fim da sesso, se no for eliminado. Para descobrir as opes atribudas para a coluna digite COL nome_da_coluna.

10.3.1 Formato de exibio para as colunas COL xxx FORMAT yyy ... FORMATO An 9 0 $ . , MI PR EEEE V B SIGNIFICADO alfanumrico, largura n. posio numrica, como 999999. coloca zeros esquerda, como 099999. cifro flutuante, como $999999. ponto decimal, como 999999.99. vrgula, como 999,999. sinal de menos direita, como 999999MI. nmero negativo entre parnteses, como 999999PR. notao cientfica, como 99.9999EEEE. multiplicar por 10**n, como 9999V99. valores zero em branco, como B9999.99.

10.3.2 Outras opes de exibio das colunas. WRAP TRUNC WORD_WRAPPED CLEAR HEADING JUSTIFY LEFT RIGHT CENTER LIKE nome_da_coluna NEWLINE NULL texto PRINT NOPRINT TEMP Especifica o que fazer quando o contedo da coluna excede a sua largura. O padro WRAP. Move a palavra toda. Remove a formatao prvia da coluna. Especifica um cabealho para a coluna. Alinhamento do cabealho da coluna. O padro JUSTIFY LEFT para caracteres e datas, e JUSTIFY RIGHT para nmeros. Copia a especificao de uma outra coluna. Comea uma nova linha antes da coluna especificada ser exibida. Coloca o texto especificado quando o valor da coluna for nulo. Faz com que a coluna aparea ou no no relatrio. Especifica que a formatao vlida para uma consulta apenas.

10.4

Exemplo de formatao de colunas 81

SQL> SQL> SQL> SQL> SQL> SQL>

COLUMN COLUMN COLUMN COLUMN COLUMN COLUMN

DEPTNO FORMAT 099 HEADING 'Dept.' JOB FORMAT A9 HEADING 'Cargo' JUSTIFY RIGHT EMPNO FORMAT 9999 HEADING 'Num.|Emp.' SAL FORMAT 99,999.99 HEADING 'Salario|Mensal' COMM FORMAT 99,990.99 HEADING 'Comissao' NULL 'Sem com.' REM FORMAT 999,999.99 HEADING 'Remuneracao|Total'

SQL> SELECT DEPTNO, JOB, EMPNO, SAL, COMM, SAL*12+NVL(COMM,0) REM 2 FROM EMP Dept. ----020 030 030 020 030 030 010 020 010 030 020 030 020 010 Num. Salario Remuneracao Cargo Emp. Mensal Comissao Total --------- ----- ---------- ---------- ----------CLERK 7369 800.00 Sem com. 9,600.00 SALESMAN 7499 1,600.00 300.00 19,500.00 SALESMAN 7521 1,250.00 500.00 15,500.00 MANAGER 7566 2,975.00 Sem com. 35,700.00 SALESMAN 7654 1,250.00 1,400.00 16,400.00 MANAGER 7698 2,850.00 Sem com. 34,200.00 MANAGER 7782 2,450.00 Sem com. 29,400.00 ANALYST 7788 3,000.00 Sem com. 36,000.00 PRESIDENT 7839 5,000.00 Sem com. 60,000.00 SALESMAN 7844 1,500.00 0.00 18,000.00 CLERK 7876 1,100.00 Sem com. 13,200.00 CLERK 7900 950.00 Sem com. 11,400.00 ANALYST 7902 3,000.00 Sem com. 36,000.00 CLERK 7934 1,300.00 Sem com. 15,600.00

10.5

Exemplo de formatao de ttulo TTITLE 'ttulo' BTITLE 'ttulo' TTITLE OFF BTITLE OFF Imprime a data no topo da folha, no canto esquerdo superior, o nmero da folha no canto direito superior, e o ttulo centrado na linha seguinte. Imprime um texto centrado ao fim de cada pgina. O caracter '|' serve para quebrar linhas. Limpa o ttulo superior. Limpa o ttulo inferior.

SQL> TTITLE 'RELATORIO DA EMPRESA|Produzido pelo DP' SQL> BTITLE '*** CONFIDENCIAL ***' SQL> / Thu Oct 27 RELATORIO DA EMPRESA Produzido pelo DP Dept. ----020 030 030 020 030 030 010 020 010 030 020 030 020 Num. Salario Remuneracao Cargo Emp. Mensal Comissao Total --------- ----- ---------- ---------- ----------CLERK 7369 800.00 Sem com. 9,600.00 SALESMAN 7499 1,600.00 300.00 19,500.00 SALESMAN 7521 1,250.00 500.00 15,500.00 MANAGER 7566 2,975.00 Sem com. 35,700.00 SALESMAN 7654 1,250.00 1,400.00 16,400.00 MANAGER 7698 2,850.00 Sem com. 34,200.00 MANAGER 7782 2,450.00 Sem com. 29,400.00 ANALYST 7788 3,000.00 Sem com. 36,000.00 PRESIDENT 7839 5,000.00 Sem com. 60,000.00 SALESMAN 7844 1,500.00 0.00 18,000.00 CLERK 7876 1,100.00 Sem com. 13,200.00 CLERK 7900 950.00 Sem com. 11,400.00 ANALYST 7902 3,000.00 Sem com. 36,000.00 page 1

82

010 CLERK

7934

1,300.00 Sem com.

15,600.00

*** CONFIDENCIAL ***

10.6

Exemplo de remoo da formatao


SQL> CLEAR COLUMNS columns cleared SQL> TTITLE OFF SQL> BTITLE OFF SQL> / DEPTNO ------20 30 30 20 30 30 10 20 10 30 20 30 20 10 JOB EMPNO SAL COMM REM --------- ------- ------- ------- ------CLERK 7369 800 9600 SALESMAN 7499 1600 300 19500 SALESMAN 7521 1250 500 15500 MANAGER 7566 2975 35700 SALESMAN 7654 1250 1400 16400 MANAGER 7698 2850 34200 MANAGER 7782 2450 29400 ANALYST 7788 3000 36000 PRESIDENT 7839 5000 60000 SALESMAN 7844 1500 0 18000 CLERK 7876 1100 13200 CLERK 7900 950 11400 ANALYST 7902 3000 36000 CLERK 7934 1300 15600

14 rows selected.

83

Captulo 11: Gerao de Relatrios - Parte 2


11.1 Objetivos deste captulo Mostrar propriedades dos cabealhos e rodaps, mostrar a varivel NEW_VALUE, e os comandos BREAK e COMPUTE. 11.2 Propriedades dos cabealhos e dos rodaps Os comandos TTITLE e BTITLE podem incluir diversas clusulas, como mostrado abaixo: Clusula COL n SKIP n LEFT CENTER RIGHT Descrio Posicionar a impresso na coluna 'n' na linha corrente. Volta atrs se a coluna tiver sido passada. Saltar 'n' linhas. Se 'n' for omitido salta 1 linha. Se n=0 volta para o comeo da linha corrente. Alinha esquerda, no centro, ou direita da linha corrente. Os itens de dados que seguem esta clusula, at o fim do comando ou at a prxima ocorrncia de uma destas clusulas, so alinhados como um grupo. As clusulas LEFT e CENTER se baseiam no comando SET LINESIZE para calcular a posio dos itens de dados. Avana ou recua a posio de impresso 'n' caracteres. O valor de 'n' deve ser negativo para haver o recuo. Define o formato dos itens de dados que seguem a clusula, at o fim do comando ou at a prxima ocorrncia desta clusula. A especificao do formato para os ttulos semelhante a especificao do formato para as colunas. Somente uma especificao de formato est ativa a cada instante. Se o tipo de dado for conflitante com o formato, o formato no tem efeito para este item. Se no houver nenhuma clusula FORMAT ativa, os valores numricos so impressos de acordo com o comando SET NUMFORMAT, ou na ausncia deste com o formato padro. Valores de data so impressos no formato padro.

TAB n FORMAT

Podem ser includas, tambm, variveis de sistema. Varivel SQL.PNO SQL.LNO SQL.USER SQL.SQLCODE Descrio Nmero da pagina corrente. Nmero da linha corrente. Nome do usurio. Cdigo do erro mais recente.

O exemplo a seguir mostra algumas das opes disponveis para TTITLE e BTITLE:
SQL> TTITLE LEFT FORMAT 0999 'Pagina: 'SQL.PNO > RIGHT 'Produzido por: Contabilidade' SKIP 2 > CENTER 'Relatorio Confidencial de Vendas' SKIP > CENTER '--------------------------------' SKIP 2

84

SQL> BTITLE CENTER 'FIM DO RELATORIO' SKIP > CENTER '----------------' SQL> SELECT ENAME, JOB, SAL, COMM 2 FROM EMP 3 WHERE COMM IS NOT NULL Pagina: 0001 Produzido por: Contabilidade Relatorio Confidencial de Vendas -------------------------------ENAME ---------ALLEN WARD MARTIN TURNER JOB SAL COMM --------- ------- ------SALESMAN 1600 300 SALESMAN 1250 500 SALESMAN 1250 1400 SALESMAN 1500 0 FIM DO RELATORIO ---------------SQL> TTITLE OFF SQL> BTITLE OFF

11.3

A clusula NEW_VALUE Esta clusula permite armazenar os valores das colunas em variveis do SQL*PLUS. As variveis podem ser usadas para modificar um comando SQL dinamicamente, exibir valores nos cabealhos e passar um valor de um comando SQL para outro.
SQL> COLUMN SYSDATE NEW_VALUE HOJE NOPRINT SQL> SELECT SYSDATE 2 FROM SYS.DUAL SQL> TTITLE LEFT 'Data:' HOJE RIGHT FORMAT 999 'Pagina:' SQL.PNO SKIP > LEFT 'Usuario: ' SQL.USER SKIP > CENTER 'Um relatorio com a data reformatada no titulo' SKIP 2 SQL> SELECT SYSDATE 2 FROM SYS.DUAL Data: 31-OCT-94 Usuario: ALUNO1 SQL> TTITLE OFF Pagina: Um relatorio com a data reformatada no titulo 1

A clusula COLUMN SYSDATE NEW_VALUE HOJE NOPRINT faz com que sempre que a coluna com nome SYSDATE seja selecionada, seu valor passe para a varivel HOJE. A clusula NOPRINT impede a impresso da varivel SYSDATE como um relatrio separado. O comando SELECT SYSDATE FROM SYS.DUAL faz com que SYSDATE seja selecionada a partir da tabela SYS.DUAL, que uma tabela que contm apenas uma linha, e vai retornar, portanto, apenas um valor.

85

O comando TTITLE LEFT 'Data: ' HOJE faz referncia a varivel HOJE, definida e com valor atribudo pela clusula NEW_VALUE. Desta forma, SYSDATE impressa no cabealho atravs da varivel HOJE. No exemplo abaixo, a varivel MAIOR_SALARIO_MEDIO utilizada para passar um valor de uma consulta para a outra.
SQL> COL MAIOR_SALARIO_MEDIO NEW_VALUE MAIOR_SALARIO_MEDIO SQL> SELECT MAX(AVG(SAL)) MAIOR_SALARIO_MEDIO 2 FROM EMP 3 GROUP BY JOB MAIOR_SALARIO_MEDIO ------------------5000 SQL> 2 3 4 old new SELECT JOB FROM EMP GROUP BY JOB HAVING AVG(SAL) = &MAIOR_SALARIO_MEDIO 4: HAVING AVG(SAL) = &MAIOR_SALARIO_MEDIO 4: HAVING AVG(SAL) = 5000

JOB --------PRESIDENT

11.4

Quebras nos relatrios O comando BREAK pode ser utilizado para quebrar os relatrios em sesses. Quando se faz uma quebra por uma coluna, os valores duplicados da coluna so omitidos. Como a quebra ocorre toda vez que o valor da coluna muda, o resultado deve ser ordenado pelas colunas com quebra especificada. Somente existe um comando BREAK ativo de cada vez, portanto todas as quebras devem ser especificadas no mesmo comando. O comando BREAK permite as seguintes opes PAGE SKIP n DUP[LICATE] Exemplos:
SQL> BREAK ON REPORT ON DEPTNO PAGE ON JOB SKIP 2 SQL> BREAK ON REPORT ON DEPTNO PAGE ON JOB DUP SQL> CLEAR BREAKS breaks cleared SQL> BREAK no break(s) defined

salta folha quando o valor da coluna muda. salta 'n' linhas quando o valor da coluna muda. mostra os valores duplicados.

O exemplo abaixo ilustra o uso do comando BREAK:


SQL> COLUMN DEPTNO FORMAT 099 HEADING 'Dept.' SQL> COLUMN JOB FORMAT A9 HEADING 'Cargo' JUSTIFY RIGHT SQL> COLUMN EMPNO FORMAT 9999 HEADING 'Emp.|Num.'

86

SQL> COLUMN SAL FORMAT 999,999.99 HEADING 'Salario|Mensal' SQL> COLUMN COMM FORMAT 999,990.99 > HEADING 'Comissao|Y-T-D' NULL 'Sem Com.' SQL> COLUMN REM FORMAT 9,999,999.99 HEADING 'Remuneracao|Total' SQL> TTITLE 'RELATORIO DA COMPANHIA|Produzido pelo Departamento Pessoal' SQL> BTITLE '*** CONFIDENCIAL ***' SQL> BREAK ON DEPTNO SKIP 1 ON JOB ON REPORT SQL> SELECT DEPTNO, JOB, EMPNO, SAL, COMM, SAL*12+NVL(COMM,0) REM 2 FROM EMP 3 ORDER BY DEPTNO, JOB Mon Oct 31 RELATORIO DA COMPANHIA Produzido pelo Departamento Pessoal Emp. Salario Comissao Remuneracao Dept. Cargo Num. Mensal Y-T-D Total ----- --------- ----- ----------- ----------- ------------010 CLERK 7934 1,300.00 Sem Com. 15,600.00 MANAGER 7782 2,450.00 Sem Com. 29,400.00 PRESIDENT 7839 5,000.00 Sem Com. 60,000.00 020 ANALYST CLERK MANAGER 030 CLERK MANAGER SALESMAN 7788 7902 7369 7876 7566 7900 7698 7499 7654 7844 7521 3,000.00 3,000.00 800.00 1,100.00 2,975.00 Sem Sem Sem Sem Sem Com. Com. Com. Com. Com. 36,000.00 36,000.00 9,600.00 13,200.00 35,700.00 11,400.00 34,200.00 19,500.00 16,400.00 18,000.00 15,500.00 page 1

950.00 Sem Com. 2,850.00 Sem Com. 1,600.00 300.00 1,250.00 1,400.00 1,500.00 0.00 1,250.00 500.00 *** CONFIDENCIAL ***

SQL> CLEAR COLUMNS columns cleared SQL> TTITLE OFF SQL> BTITLE OFF SQL> CLEAR BREAKS breaks cleared

11.5

Clculo de sumrios O comando COMPUTE realiza clculos baseados nas quebras estabelecidas pelo comando BREAK. COMPUTE clusulas OF colunas ON quebras Clusulas AVG COU[NT] MAX[IMUM] MIN[IMUM] NUM[BER] Descrio calcula a mdia conta os valores no nulos valor mximo valor mnimo nmero de linhas 87 Tipo da coluna nmero qualquer nmero ou caracter nmero ou caracter qualquer

STD SUM VAR[IANCE]

desvio padro soma os valores no nulos calcula a varincia

nmero nmero nmero

Pode haver vrios comandos COMPUTE ativos ao mesmo tempo, mas geralmente mais fcil especificar tudo em um nico comando, como, por exemplo:
SQL> COMPUTE SUM AVG OF SAL COMM ON DEPTNO REPORT

Para mostrar o valor corrente:


SQL> COMPUTE COMPUTE sum avg COMPUTE sum avg COMPUTE sum avg COMPUTE sum avg OF OF OF OF SAL ON DEPTNO SAL ON REPORT COMM ON DEPTNO COMM ON REPORT

Para apagar todos os valores:


SQL> CLEAR COMPUTES computes cleared SQL> COMPUTE no computes currently defined

Exemplo utilizando COMPUTE:


SQL> COLUMN DEPTNO FORMAT 09999 HEADING 'Dept.' SQL> COLUMN JOB FORMAT A9 HEADING 'Cargo' JUSTIFY RIGHT SQL> COLUMN EMPNO FORMAT 9999 HEADING 'Emp.|Num.' SQL> COLUMN SAL FORMAT 999,999.99 HEADING 'Salario|Mensal' SQL> COLUMN COMM FORMAT 999,990.99 HEADING 'COMISSAO|Y-T-D' NULL 'Sem Com.' SQL> COLUMN REM FORMAT 9,999,999.99 HEADING 'Remuneracao|Total' SQL> TTITLE 'Relatorio da Companhia|Produzido pelo Departamento Pessoal' SQL> BTITLE '*** CONFIDENCIAL ***' SQL> BREAK ON DEPTNO SKIP 1 ON JOB ON REPORT SQL> COMPUTE AVG SUM OF SAL COMM ON DEPTNO REPORT SQL> SELECT DEPTNO, JOB, EMPNO, SAL, COMM, SAL*12+NVL(COMM,0) REM 2 FROM EMP 3 ORDER BY DEPTNO, JOB Mon Oct 31 Relatorio da Companhia Produzido pelo Departamento Pessoal Emp. Salario Dept. Cargo Num. Mensal ------ --------- ----- ----------00010 CLERK 7934 1,300.00 MANAGER 7782 2,450.00 PRESIDENT 7839 5,000.00 ****** ********* ----------avg 2,916.67 sum 8,750.00 00020 ANALYST CLERK MANAGER 7788 7902 7369 7876 7566 3,000.00 3,000.00 800.00 1,100.00 2,975.00 COMISSAO Remuneracao Y-T-D Total ----------- ------------Sem Com. 15,600.00 Sem Com. 29,400.00 Sem Com. 60,000.00 ----------0.00 Sem Sem Sem Sem Sem Com. Com. Com. Com. Com. 36,000.00 36,000.00 9,600.00 13,200.00 35,700.00 page 1

88

****** ********* avg sum 00030 CLERK MANAGER SALESMAN 7900 7698 7499 7654 7844 7521

----------- ----------2,175.00 10,875.00 0.00 950.00 Sem Com. 2,850.00 Sem Com. 1,600.00 300.00 1,250.00 1,400.00 1,500.00 0.00 1,250.00 500.00 ----------- ----------1,566.67 550.00 9,400.00 2,200.00 ----------- ----------2,073.21 550.00 29,025.00 2,200.00 *** CONFIDENCIAL *** 11,400.00 34,200.00 19,500.00 16,400.00 18,000.00 15,500.00

****** ********* avg sum avg sum

14 rows selected. SQL> CLEAR COLUMN columns cleared SQL> CLEAR BREAKS breaks cleared SQL> CLEAR COMPUTE computes cleared SQL> TTITLE OFF SQL> BTITLE OFF

11.6

Relatrio matricial Suponha que se deseje produzir um relatrio sumarizando os salrios por cargo e por departamento, como mostrado abaixo:
Mon Oct 31 Relatorio da Companhia JOB Departamento 10 Departamento 20 Departamento 30 Total por Cargo --------- --------------- --------------- --------------- --------------ANALYST .00 6,000.00 .00 6,000.00 CLERK 1,300.00 1,900.00 950.00 4,150.00 MANAGER 2,450.00 2,975.00 2,850.00 8,275.00 PRESIDENT 5,000.00 .00 .00 5,000.00 SALESMAN .00 .00 5,600.00 5,600.00 --------------- --------------- --------------- --------------sum 8,750.00 10,875.00 9,400.00 29,025.00 Confidencial page 1

A tabela EMP tem todas as informaes necessrias para produzir o relatrio. Abaixo esto descritas as etapas a serem seguidas para a obteno do relatrio: a) Listar as informaes necessrias contidas na tabela EMP, ou seja, JOB, SAL e DEPTNO.
SQL> SELECT JOB, SAL, DEPTNO 2 FROM EMP

89

JOB SAL DEPTNO --------- ------- ------CLERK 800 20 SALESMAN 1600 30 SALESMAN 1250 30 MANAGER 2975 20 SALESMAN 1250 30 MANAGER 2850 30 MANAGER 2450 10 ANALYST 3000 20 PRESIDENT 5000 10 SALESMAN 1500 30 CLERK 1100 20 CLERK 950 30 ANALYST 3000 20 CLERK 1300 10 14 rows selected.

b) Separar a coluna SAL em 3 departamentos separados, usando a funo DECODE.


SQL> 2 3 4 5 SELECT JOB, DECODE(DEPTNO, 10, SAL, 0) D10, DECODE(DEPTNO, 20, SAL, 0) D20, DECODE(DEPTNO, 30, SAL, 0) D30 FROM EMP

JOB D10 D20 D30 --------- ------- ------- ------CLERK 0 800 0 SALESMAN 0 0 1600 SALESMAN 0 0 1250 MANAGER 0 2975 0 SALESMAN 0 0 1250 MANAGER 0 0 2850 MANAGER 2450 0 0 ANALYST 0 3000 0 PRESIDENT 5000 0 0 SALESMAN 0 0 1500 CLERK 0 1100 0 CLERK 0 0 950 ANALYST 0 3000 0 CLERK 1300 0 0 14 rows selected.

c) Sumarizar os campos de acordo com o grupo do cargo e o departamento.


SQL> 2 3 4 5 6 SELECT JOB, SUM(DECODE(DEPTNO, 10, SAL, 0)) D10, SUM(DECODE(DEPTNO, 20, SAL, 0)) D20, SUM(DECODE(DEPTNO, 30, SAL, 0)) D30 FROM EMP GROUP BY JOB

JOB D10 D20 D30 --------- ------- ------- ------ANALYST 0 6000 0 CLERK 1300 1900 950 MANAGER 2450 2975 2850 PRESIDENT 5000 0 0 SALESMAN 0 0 5600

d) Calcular os totais para cada grupo de cargo. 90

SQL> 2 3 4 5 6 7

SELECT JOB, SUM(DECODE(DEPTNO, 10, SAL, 0)) D10, SUM(DECODE(DEPTNO, 20, SAL, 0)) D20, SUM(DECODE(DEPTNO, 30, SAL, 0)) D30, SUM(SAL) TBJ FROM EMP GROUP BY JOB

JOB D10 D20 D30 TBJ --------- ------- ------- ------- ------ANALYST 0 6000 0 6000 CLERK 1300 1900 950 4150 MANAGER 2450 2975 2850 8275 PRESIDENT 5000 0 0 5000 SALESMAN 0 0 5600 5600

e) Finalmente formatar o relatrio com os comandos do SQL*PLUS.


SQL> SQL> SQL> SQL> SQL> SQL> SQL> SQL> SQL> SQL> SET PAGES 16 COLUMN D10 HEADING 'Departamento 10' FORMAT COLUMN D20 HEADING 'Departamento 20' FORMAT COLUMN D30 HEADING 'Departamento 30' FORMAT COLUMN TBJ HEADING 'Total por Cargo' FORMAT BREAK ON REPORT COMPUTE SUM OF D10 D20 D30 TBJ ON REPORT TTITLE 'Relatorio da Companhia' BTITLE 'Confidencial' / Relatorio da Companhia JOB Departamento 10 Departamento 20 Departamento 30 Total por Cargo --------- --------------- --------------- --------------- --------------ANALYST .00 6,000.00 .00 6,000.00 CLERK 1,300.00 1,900.00 950.00 4,150.00 MANAGER 2,450.00 2,975.00 2,850.00 8,275.00 PRESIDENT 5,000.00 .00 .00 5,000.00 SALESMAN .00 .00 5,600.00 5,600.00 --------------- --------------- --------------- --------------sum 8,750.00 10,875.00 9,400.00 29,025.00 Confidencial SQL> TTITLE OFF SQL> BTITLE OFF SQL> CLEAR COLUMN columns cleared SQL> CLEAR BREAKS breaks cleared SQL> CLEAR COMPUTE computes cleared 99,999.99 99,999.99 99,999.99 999,999.99

Mon Oct 31

page

11.7

Arquivo de comandos para o SQL*PLUS Para criar um arquivo de comandos para o SQL*PLUS: a) Prepare o comando SELECT 91

b) Salve o comando SELECT (SAVE nome-do-arquivo) c) Abrir o arquivo salvo para edio (HOST EDIT nome-do-arquivo.SQL) d) Adicionar os comandos SET COLUMN TTILE BTITLE BREAK COMPUTE ... SELECT ... / TTITLE OFF BTITLE OFF CLEAR BREAKS CLEAR COMPUTES CLEAR COLUMNS ... e) Salvar o arquivos f) Executar o arquivo (@nome-do-arquivo)

92

11.8

Exerccios a) Produza o relatrio mostrado abaixo


Mon Oct 31 R E L A T O R I O D O S E M P R E G A D O S EMP. DEPARTAMENTO CARGO NUM. NOME ------------ --------- ----- -------ACCOUNTING CLERK 7934 MILLER MANAGER 7782 CLARK PRESIDENT 7839 KING ************ ********* sum RESEARCH ANALYST CLERK MANAGER ************ ********* sum SALES CLERK MANAGER SALESMAN 7902 7788 7369 7876 7566 FORD SCOTT SMITH ADAMS JONES page 1

DATA SALARIO COM. ADM. MENSAL ANUAL TOTAL ----- --------- -------- ----------11/83 1,300.00 0.00 15,600.00 05/84 2,450.00 0.00 29,400.00 07/84 5,000.00 0.00 60,000.00 --------- -------- ----------8,750.00 0.00 105,000.00 12/83 03/84 06/83 06/84 10/83 3,000.00 0.00 36,000.00 3,000.00 0.00 36,000.00 800.00 0.00 9,600.00 1,100.00 0.00 13,200.00 2,975.00 0.00 35,700.00 --------- -------- ----------10,875.00 0.00 130,500.00 950.00 0.00 11,400.00 2,850.00 0.00 34,200.00 1,600.00 300.00 19,500.00 1,250.00 1,400.00 16,400.00 1,500.00 0.00 18,000.00 1,250.00 500.00 15,500.00 --------- -------- ----------9,400.00 2,200.00 115,000.00 --------- -------- ----------29,025.00 2,200.00 350,500.00

7900 7698 7499 7654 7844 7521

JAMES BLAKE ALLEN MARTIN TURNER WARD

07/84 06/84 08/83 12/83 06/84 03/84

************ ********* sum

sum

CONFIDENCIAL SQL> TTITLE OFF SQL> BTITLE OFF SQL> SET FEEDBACK ON SQL> SET PAGESIZE 24 SQL> CLEAR BREAKS breaks cleared SQL> CLEAR COMPUTES computes cleared

93

b) Produza o relatrio abaixo. O nmero do departamento deve ser solicitado em tempo de execuo.
Mon Oct 31 R E L A T O R I O D O S DATA ADM. ----07/84 06/84 08/83 03/84 06/84 12/83 E M P R E G A D O S SALARIO COMISSAO MENSAL ANUAL TOTAL -------- --------- ----------950.00 0.00 11,400.00 2,850.00 0.00 34,200.00 1,600.00 300.00 19,500.00 1,250.00 500.00 15,500.00 1,500.00 0.00 18,000.00 1,250.00 1,400.00 16,400.00 -------- --------- ----------9,400.00 2,200.00 115,000.00 -------- --------- ----------9,400.00 2,200.00 115,000.00 CONFIDENCIAL SQL> TTITLE OFF SQL> BTITLE OFF SQL> SET FEEDBACK ON SQL> SET PAGESIZE 24 SQL> CLEAR BREAKS breaks cleared SQL> CLEAR COMPUTES computes cleared EMP. DEPARTAMENTO CARGO NUM. NOME ------------ --------- ----- -------SALES CLERK 7900 JAMES MANAGER 7698 BLAKE SALESMAN 7499 ALLEN 7521 WARD 7844 TURNER 7654 MARTIN ************ ********* sum page 1

sum

94

11.9

Respostas dos exerccios


a) SQL> SET ECHO OFF SQL> SET PAGESIZE 37 SQL> SET FEEDBACK OFF SQL> SET LINESIZE 78 SQL> TTITLE 'R E L A T O R I O D O S E M P R E G A D O S' SQL> BTITLE 'CONFIDENCIAL' SQL> DEFINE COMM = 'NVL(COMM,0)' SQL> COL A FORMAT A12 HEADING 'DEPARTAMENTO' TEMP SQL> COL B FORMAT A9 HEADING 'CARGO' TEMP SQL> COL C FORMAT 9999 HEADING 'EMP.|NUM.' TEMP SQL> COL D FORMAT A8 HEADING 'NOME' TEMP SQL> COL E FORMAT A5 HEADING 'DATA|ADM.' TEMP SQL> COL F FORMAT B99,999.99 HEADING 'SALARIO|MENSAL' TEMP SQL> COL G FORMAT 9,990.99 HEADING 'COM.|ANUAL' TEMP SQL> COL H FORMAT 999,999.99 HEADING 'TOTAL' TEMP SQL> BREAK ON REPORT ON A SKIP 2 ON B SQL> COMPUTE SUM OF F G H ON REPORT A SQL> SELECT DNAME A, JOB B, EMPNO C, ENAME D, 2 TO_CHAR(HIREDATE,'MM/YY') E, SAL F, &COMM G, SAL*12+&COMM H 3 FROM EMP E, DEPT D 4 WHERE E.DEPTNO = D.DEPTNO 5 ORDER BY DNAME, JOB old 2: TO_CHAR(HIREDATE,'MM/YY') E, SAL F, &COMM G, SAL*12+&COMM H new 2: TO_CHAR(HIREDATE,'MM/YY') E, SAL F, NVL(COMM,0) G, SAL*12+NVL(COMM,0) H b) SQL> SET ECHO OFF SQL> SET PAGESIZE 37 SQL> SET FEEDBACK OFF SQL> SET LINESIZE 78 SQL> TTITLE'R E L A T O R I O D O S E M P R E G A D O S' SQL> BTITLE 'CONFIDENCIAL' SQL> DEFINE COMM = 'NVL(COMM,0)' SQL> ACCEPT DEPTNO NUMBER PROMPT 'NUMERO DO DEPARTAMENTO:' NUMERO DO DEPARTAMENTO:30 SQL> COL A FORMAT A12 HEADING 'DEPARTAMENTO' TEMP SQL> COL B FORMAT A9 HEADING 'CARGO' TEMP SQL> COL C FORMAT 9999 HEADING 'EMP.|NUM.' TEMP SQL> COL D FORMAT A8 HEADING 'NOME' TEMP SQL> COL E FORMAT A5 HEADING 'DATA|ADM.' TEMP SQL> COL F FORMAT B99,999.99 HEADING 'SALARIO|MENSAL' TEMP SQL> COL G FORMAT 9,990.99 HEADING 'COMISSAO|ANUAL' TEMP SQL> COL H FORMAT 999,999.99 HEADING 'TOTAL' TEMP SQL> BREAK ON REPORT ON A SKIP 2 ON B SQL> COMPUTE SUM OF F G H ON REPORT A SQL> SELECT DNAME A, JOB B, EMPNO C, ENAME D, 2 TO_CHAR(HIREDATE,'MM/YY') E, SAL F, &COMM G, SAL*12+&COMM H 3 FROM EMP E, DEPT D 4 WHERE E.DEPTNO = D.DEPTNO 5 AND E.DEPTNO = &DEPTNO 6 ORDER BY DNAME, JOB old 2: TO_CHAR(HIREDATE,'MM/YY') E, SAL F, &COMM G, SAL*12+&COMM H new 2: TO_CHAR(HIREDATE,'MM/YY') E, SAL F, NVL(COMM,0) G, SAL*12+NVL(COMM,0) H old 5: AND E.DEPTNO = &DEPTNO new 5: AND E.DEPTNO = 30

95

Captulo 12: Hierarquias - Caminhando na rvore


12.1 Objetivos deste captulo Utilizar os relacionamentos hierrquicos para recuperar dados em uma tabela. 12.2 Quando possvel caminhar na rvore A tabela EMP tem uma estrutura em forma de rvore, indicando os gerentes de cada funcionrio.

KING (EMPNO=7839) | ------------------------------------- (MGR=7839) | | | CLARK JONES BLAKE | | | | -------------------------------------| | | | | | | | MILLER SCOTT FORD ALLEN WARD MARTIN TURNER JAMES | | ADAMS SMITH

Um banco de dados relacional no armazena os registros em forma hierrquica. Entretanto, quando existe um relacionamento hierrquico entre linhas de uma nica tabela, existe um processo de navegao na rvore que permite a hierarquia ser construda. A hierarquia pode ser vista analisando-se os valores idnticos nas colunas EMPNO e MGR da tabela EMP (Este relacionamento j foi visto quando foi feita a juno desta tabela com ela mesmo). A coluna MGR indica o nmero do empregado ao qual o empregado est subordinado. Quando uma navegao na rvore executada, no espere ver o resultado na forma da figura acima, o resultado uma tabela. O nvel (LEVEL) indica a distncia do n raiz da rvore. Para caminhar na rvore da tabela EMP:
SQL> BREAK ON DEPTNO SKIP 1 SQL> 2 3 4 SELECT LEVEL, DEPTNO, EMPNO, ENAME, JOB, SAL FROM EMP CONNECT BY PRIOR EMPNO = MGR START WITH MGR IS NULL

96

LEVEL DEPTNO EMPNO ENAME JOB SAL ------- ------- ------- ---------- --------- ------1 10 7839 KING PRESIDENT 5000 2 3 4 3 4 2 3 3 3 3 3 2 3 20 7566 7788 7876 7902 7369 7698 7499 7521 7654 7844 7900 JONES SCOTT ADAMS FORD SMITH BLAKE ALLEN WARD MARTIN TURNER JAMES MANAGER ANALYST CLERK ANALYST CLERK MANAGER SALESMAN SALESMAN SALESMAN SALESMAN CLERK MANAGER CLERK 2975 3000 1100 3000 800 2850 1600 1250 1250 1500 950 2450 1300

30

10

7782 CLARK 7934 MILLER

Comando SELECT FROM WHERE CONNECT BY PRIOR

Descrio A clusula SELECT padro, incluindo a pseudo coluna LEVEL que mostra a distncia do n raiz. S pode conter uma tabela. Restringe as linhas pesquisadas durante a navegao. Especifica as colunas onde existe o relacionamento entre as linhas. Esta clusula obrigatrio para caminhar na rvore. Estabelece a direo para caminhar na rvore. 1) PRIOR expresso operador_de_comparao expresso 2) expresso operador_de_comparao PRIOR expresso Se PRIOR aparece antes de MGR, ento os valores de MGR so pesquisados primeiro, e depois os valores equivalentes de EMP, ou seja, pesquisa da raiz para o topo. Se PRIOR aparece antes de EMP a rvore percorrido do topo para a raiz. Especifica onde comea a pesquisa. No pode ser usado na forma 'START at a LEVEL'. Esta clusula opcional. a ltima clusula, como sempre.

START WITH ORDER BY

No exemplo acima, a estrutura hierrquica da empresa refletida na navegao pela rvore. A estrutura chefe/subordinado fica claramente identificada. A clusula ORDER BY pode ser usada para ordenar as linhas retornadas. O comando abaixo totalmente legtimo:
SQL> 2 3 4 5 SELECT LEVEL, DEPTNO, EMPNO, ENAME, JOB, SAL FROM EMP CONNECT BY PRIOR EMPNO = MGR START WITH MGR IS NULL ORDER BY DEPTNO

97

LEVEL DEPTNO EMPNO ENAME ------- ------- ------- ---------1 10 7839 KING 2 7782 CLARK 3 7934 MILLER 2 3 4 3 4 2 3 3 3 3 3 20 7566 7788 7876 7902 7369 7698 7499 7521 7654 7844 7900 JONES SCOTT ADAMS FORD SMITH BLAKE ALLEN WARD MARTIN TURNER JAMES

JOB SAL --------- ------PRESIDENT 5000 MANAGER 2450 CLERK 1300 MANAGER ANALYST CLERK ANALYST CLERK MANAGER SALESMAN SALESMAN SALESMAN SALESMAN CLERK 2975 3000 1100 3000 800 2850 1600 1250 1250 1500 950

30

No recomendada a utilizao da clusula ORDER BY, porque a ordenao implcita pode ser destruda.

12.3

Excluindo um n da rvore As clusulas WHERE e CONNECT BY podem ser usadas para podar a rvore, isto , controlar os ns que so mostrados.

WHERE ENAME <> 'SCOTT'

Quando a clusula WHERE utilizada para eliminar o n, somente o n eliminado.

JONES | ---------------| | SCOTT FORD | | ADAMS SMITH

Neste exemplo, SCOTT eliminado, mas ADAMS permanece.


SQL> 2 3 4 5 SELECT LEVEL, DEPTNO, EMPNO, ENAME, JOB, SAL FROM EMP WHERE ENAME <> 'SCOTT' CONNECT BY PRIOR EMPNO = MGR START WITH MGR IS NULL

98

LEVEL DEPTNO EMPNO ENAME JOB SAL ------- ------- ------- ---------- --------- ------1 10 7839 KING PRESIDENT 5000 2 4 3 4 2 3 3 3 3 3 2 3 20 7566 7876 7902 7369 7698 7499 7521 7654 7844 7900 JONES ADAMS FORD SMITH BLAKE ALLEN WARD MARTIN TURNER JAMES MANAGER CLERK ANALYST CLERK MANAGER SALESMAN SALESMAN SALESMAN SALESMAN CLERK MANAGER CLERK 2975 1100 3000 800 2850 1600 1250 1250 1500 950 2450 1300

30

10

7782 CLARK 7934 MILLER

13 rows selected.

CONNECT BY PRIOR EMPNO=MGR AND ENAME <> 'SCOTT'

Quando a clusula CONNECT BY utilizada para eliminar o n, toda a sua ramificao eliminada.

JONES | ---------------| | SCOTT FORD | | ADAMS SMITH

Neste exemplo, SCOTT e ADAMS so eliminados.


SQL> 2 3 4 SELECT LEVEL, DEPTNO, EMPNO, ENAME, JOB, SAL FROM EMP CONNECT BY PRIOR EMPNO = MGR AND ENAME <> 'SCOTT' START WITH MGR IS NULL

99

LEVEL DEPTNO EMPNO ENAME JOB SAL ------- ------- ------- ---------- --------- ------1 10 7839 KING PRESIDENT 5000 2 3 4 2 3 3 3 3 3 2 3 20 7566 JONES 7902 FORD 7369 SMITH 7698 7499 7521 7654 7844 7900 BLAKE ALLEN WARD MARTIN TURNER JAMES MANAGER ANALYST CLERK MANAGER SALESMAN SALESMAN SALESMAN SALESMAN CLERK MANAGER CLERK 2975 3000 800 2850 1600 1250 1250 1500 950 2450 1300

30

10

7782 CLARK 7934 MILLER

12 rows selected.

12.4

Terminologia Ingls NODE ROOT PARENT CHILD TERMINAL NODE LEAF BRANCH Portugus N Raiz Pai Filho Folha Ramo ou Galho Descrio O mesmo que uma linha da tabela. O n que no pertence a nenhum outro n. Um n que possui outros ns de nvel inferior. Um n que tem um pai. Um n que no possui filhos. Um n que tem filhos e netos.

12.5

Exerccios a) Mostrar a organizao do departamento 20.

100

Captulo 13: Dicionrio de Dados


13.1 Objetivos deste captulo Apresentar o dicionrio de dados do Oracle. 13.2 O que o dicionrio de dados O dicionrio de dados um conjunto de tabelas e vises que prov um guia de referncia sobre o banco de dados. No dicionrio de dados so permitidas apenas consultas por parte dos usurios. O conjunto de tabelas e vises fixo, e o contedo atualizado automaticamente pelo Oracle, quando um comando da linguagem de definio de dados (DDL), ou outros comandos, so executados. O dicionrio de dados criado quando o banco de dados criado, sendo uma pea crtica no funcionamento do gerenciador do banco de dados, que utiliza as informaes contidas no dicionrio de dados para gerenciar o prprio banco de dados. 13.3 Informaes contidas no dicionrio de dados As seguintes informaes podem ser obtidas a partir do dicionrio de dados:

Os nomes dos usurios do banco de dados. Os direitos e privilgios concedidos aos usurios. Nomes dos objetos do banco de dados (tabelas, vises, ndices, sinnimos, seqncias.) Restries aplicadas sobre as tabelas. Informaes de auditoria, tais como que acessou ou atualizou um determinado objeto do banco de dados.

13.4

Tabelas do dicionrio de dados As tabelas do dicionrio de dados so criadas automaticamente quando o comando CREATE DATABASE executado. Todas as tabelas do dicionrio de dados pertencem ao usurio SYS, e no so acessadas diretamente porque as informaes armazenadas nestas tabelas so de difcil compreenso.

13.5

Vises do dicionrio de dados As vises do dicionrio de dados contm informaes em uma maneira fcil de serem compreendidas. Acesso pblico ao dicionrio de dados concedido atravs das vises, e no do acesso direto s tabelas. 101

As vises do dicionrio de dados tambm pertencem aos usurios SYS. Os nomes das vises refletem o tipo de uso para o qual elas foram criadas. As vises so classificadas em trs grupos distinguidos pelos prefixos USER, ALL e DBA. Classe USER_xxx ALL_xxx Descrio Vises que qualquer usurio pode acessar, contendo informaes relativas aos objetos do prprio usurio. Vises que qualquer usurio pode acessar, contendo informaes relativas tanto aos objetos do prprio usurio, quanto informaes sobre os objetos aos quais foram concedidos privilgios ao usurio. Vises que s podem ser acessadas pelos usurios com privilgio de administrador do banco de dados

DBA_xxx

Existem ainda algumas vises que no possuem nenhum destes trs prefixos. Abaixo mostrada a relao das vises do dicionrio de dados, juntamente com suas descries: Viso DICTIONARY DICT_COLUMNS TABLE_PRIVILEGES Descrio Description of data dictionary tables and views Description of columns in data dictionary tables and views Grants on objects for which the user is the grantor, grantee, or owner, or PUBLIC is the grantee Descrio All tables, views, synonyms, sequences accessible to the user Comments on columns of accessible tables and views Grants on columns for which the user is the grantor, grantee, owner, or an enabled role or PUBLIC is the grantee Grants on columns for which the user is owner or grantor Grants on columns for which the user, PUBLIC or enabled role is the grantee Constraint definitions on accessible tables Information about accessible columns in constraint definitions Database links accessible to the user Auditing options for newly created objects Dependencies to and from objects accessible to the user Current errors on stored objects that user is allowed to create 102

Viso ALL_CATALOG ALL_COL_COMMENTS ALL_COL_PRIVS ALL_COL_PRIVS_MADE ALL_COL_PRIVS_RECD ALL_CONSTRAINTS ALL_CONS_COLUMNS ALL_DB_LINKS ALL_DEF_AUDIT_OPTS ALL_DEPENDENCIES ALL_ERRORS

ALL_INDEXES ALL_IND_COLUMNS ALL_OBJECTS ALL_SEQUENCES ALL_SNAPSHOTS ALL_SOURCE ALL_SYNONYMS ALL_TABLES ALL_TAB_COLUMNS ALL_TAB_COMMENTS ALL_TAB_PRIVS ALL_TAB_PRIVS_MADE ALL_TAB_PRIVS_RECD ALL_TRIGGERS ALL_TRIGGER_COLS ALL_USERS ALL_VIEWS

Descriptions of indexes on tables accessible to the user COLUMNs comprising INDEXes on accessible TABLES Objects accessible to the user Description of SEQUENCEs accessible to the user Snapshots the user can look at Current source on stored objects that user is allowed to create All synonyms accessible to the user Description of tables accessible to the user Columns of all tables, views and clusters Comments on tables and views accessible to the user Grants on objects for which the user is the grantor, grantee, owner, or an enabled role or PUBLIC is the grantee User's grants and grants on user's objects Grants on objects for which the user, PUBLIC or enabled role is the grantee Triggers accessible to the current user Column usage in user's triggers or in triggers on user's tables Information about all users of the database Text of views accessible to the user

Viso DBA_2PC_NEIGHBORS DBA_2PC_PENDING DBA_AUDIT_EXISTS DBA_AUDIT_OBJECT

DBA_AUDIT_STATEMENT DBA_AUDIT_TRAIL DBA_CATALOG DBA_CLUSTERS DBA_CLU_COLUMNS DBA_COL_COMMENTS

Descrio information about incoming and outgoing connections for pending transactions info about distributed transactions awaiting recovery Lists audit trail entries produced by AUDIT NOT EXISTS and AUDIT EXISTS Audit trail records for statements concerning objects, specifically: table, cluster, view, index, sequence, [public] database link, [public] synonym, procedure, trigger, rollback segment, tablespace, role, user Audit trail records concerning grant, revoke, audit, noaudit and alter system All audit trail entries All database Tables, Views, Synonyms, Sequences Description of all clusters in the database Mapping of table columns to cluster columns Comments on columns of all tables and 103

DBA_COL_PRIVS DBA_CONSTRAINTS DBA_CONS_COLUMNS DBA_DATA_FILES DBA_DB_LINKS DBA_DEPENDENCIES DBA_ERRORS DBA_EXP_FILES DBA_EXP_OBJECTS DBA_EXP_VERSION DBA_EXTENTS DBA_FREE_SPACE DBA_INDEXES DBA_IND_COLUMNS DBA_OBJECTS DBA_OBJECT_SIZE DBA_OBJ_AUDIT_OPTS DBA_PRIV_AUDIT_OPTS DBA_PROFILES DBA_ROLES DBA_ROLE_PRIVS DBA_ROLLBACK_SEGS DBA_SEGMENTS DBA_SEQUENCES DBA_SNAPSHOTS DBA_SNAPSHOT_LOGS DBA_SOURCE DBA_STMT_AUDIT_OPTS DBA_SYNONYMS DBA_SYS_PRIVS DBA_TABLES DBA_TABLESPACES DBA_TAB_COLUMNS DBA_TAB_COMMENTS DBA_TAB_PRIVS DBA_TRIGGERS DBA_TRIGGER_COLS

views All grants on columns in the database Constraint definitions on all tables Information about accessible columns in constraint definitions Information about database files All database links in the database Dependencies to and from objects Current errors on all stored objects in the database Description of export files Objects that have been incrementally exported Version number of the last export session Extents comprising all segments in the database Free extents in all tablespaces Description for all indexes in the database COLUMNs comprising INDEXes on all TABLEs and CLUSTERs All objects in the database Sizes, in bytes, of various pl/sql objects Auditing options for all tables and views Describes current system privileges being audited across the system and by user Display all profiles and their limits All Roles which exist in the database Roles granted to users and roles Description of rollback segments Storage allocated for all database segments Description of all SEQUENCEs in the database All snapshots in the database All snapshot logs in the database Source of all stored objects in the database Describes current system auditing options across the system and by user All synonyms in the database System privileges granted to users and roles Description of all tables in the database Description of all tablespaces Columns of all tables, views and clusters Comments on all tables and views in the database All grants on objects in the database All triggers in the database Column usage in all triggers 104

DBA_TS_QUOTAS DBA_USERS DBA_VIEWS

Tablespace quotas for all users Information about all users of the database Text of all views in the database

Viso USER_AUDIT_OBJECT

USER_AUDIT_STATEMENT USER_AUDIT_TRAIL USER_CATALOG USER_CLUSTERS USER_CLU_COLUMNS USER_COL_COMMENTS USER_COL_PRIVS USER_COL_PRIVS_MADE USER_COL_PRIVS_RECD USER_CONSTRAINTS USER_CONS_COLUMNS USER_DB_LINKS USER_DEPENDENCIES USER_ERRORS USER_EXTENTS USER_FREE_SPACE USER_INDEXES USER_IND_COLUMNS USER_OBJECTS USER_OBJECT_SIZE USER_OBJ_AUDIT_OPTS

Descrio Audit trail records for statements concerning objects, specifically: table, cluster, view, index, sequence, [public] database link, [public] synonym, procedure, trigger, rollback segment, tablespace, role, user Audit trail records concerning grant, revoke, audit, noaudit and alter system Audit trail entries relevant to the user Tables, Views, Synonyms and Sequences owned by the user Descriptions of user's own clusters Mapping of table columns to cluster columns Comments on columns of user's tables and views Grants on columns for which the user is the owner, grantor or grantee All grants on columns of objects owned by the user Grants on columns for which the user is the grantee Constraint definitions on user's own tables Information about accessible columns in constraint definitions Database links owned by the user Dependencies to and from a users objects Current errors on stored objects owned by the user Extents comprising segments owned by the user Free extents in tablespaces accessible to the user Description of the user's own indexes COLUMNs comprising user's INDEXes or on user's TABLES Objects owned by the user Sizes, in bytes, of various pl/sql objects Auditing options for user's own tables and views 105

USER_RESOURCE_LIMITS USER_ROLE_PRIVS USER_SEGMENTS USER_SEQUENCES USER_SNAPSHOTS USER_SNAPSHOT_LOGS USER_SOURCE USER_SYNONYMS USER_SYS_PRIVS USER_TABLES USER_TABLESPACES USER_TAB_COLUMNS USER_TAB_COMMENTS USER_TAB_PRIVS USER_TAB_PRIVS_MADE USER_TAB_PRIVS_RECD USER_TRIGGERS USER_TRIGGER_COLS USER_TS_QUOTAS USER_USERS USER_VIEWS

Display resource limit of the user Roles granted to current user Storage allocated for all database segments Description of the user's own SEQUENCEs Snapshots the user can look at All snapshot logs owned by the user Source of stored objects accessible to the user The user's private synonyms System privileges granted to current user Description of the user's own tables Description of accessible tablespaces Columns of user's tables, views and clusters Comments on the tables and views owned by the user Grants on objects for which the user is the owner, grantor or grantee All grants on objects owned by the user Grants on objects for which the user is the grantee Triggers owned by the user Column usage in user's triggers Tablespace quotas for the user Information about the current user Text of views owned by the user

Para compatibilidade com os SQL/DS e o DB2 da IBM existem aindas as vises: SYSCATALOG, SYSCOLAUTH, SYSCOLUMNS, SYSDBLINKS, SYSEXTENTS, SYSFILES, SYSINDEXES, SYSROLLBACKSEG, SYSSEGOBJ, SYSSTORAGE, SYSTABALLOC, SYSTABAUTH, SYSTABSPACES, SYSTEM_AUDIT, SYSTSQUOTAS, SYSUSERAUTH, SYSUSERLIST, SYSVIEWS, SYS_OBJECTS. 13.6 Exemplos de utilizao do dicionrio de dados Listar todas as tabelas acessveis ao usurio.
SQL> DESCRIBE ACCESSIBLE_TABLES Name ------------------------------OWNER TABLE_NAME TABLE_TYPE SQL> SELECT * 2 FROM ACCESSIBLE_TABLES 3 ORDER BY 1,2 OWNER -------------------ALUNO1 ALUNO1 TABLE_NAME -------------------ASSIGNMENTS BONUS TABLE_TYPE ----------TABLE TABLE Null? -------NOT NULL NOT NULL Type ---CHAR(30) CHAR(30) CHAR(11)

106

ALUNO1 CUSTOMER TABLE ALUNO1 DEPT TABLE ALUNO1 DUMMY TABLE ALUNO1 EMP TABLE ALUNO1 ITEM TABLE ALUNO1 ORD TABLE ALUNO1 PRICE TABLE ALUNO1 PRODUCT TABLE ALUNO1 PROJECTS TABLE ALUNO1 SALES VIEW ALUNO1 SALGRADE TABLE SYS ACCESSIBLE_COLUMNS VIEW SYS ACCESSIBLE_TABLES VIEW SYS ALL_CATALOG VIEW SYS ALL_COL_COMMENTS VIEW SYS ALL_COL_GRANTS_MADE VIEW .............................................. SYS ALL_TAB_GRANTS_RECD VIEW SYS ALL_USERS VIEW SYS ALL_VIEWS VIEW SYS AUDIT_ACCESS VIEW SYS AUDIT_ACTIONS TABLE SYS AUDIT_CONNECT VIEW SYS AUDIT_TRAIL VIEW SYS CATALOG VIEW SYS CLUSTERCOLUMNS VIEW SYS CLUSTERS VIEW .............................................. SYS USER_AUDIT_CONNECT VIEW SYS USER_AUDIT_RESOURCE VIEW SYS USER_AUDIT_TRAIL VIEW .............................................. SYS USER_TS_QUOTAS VIEW SYS USER_USERS VIEW SYS USER_VIEWS VIEW SYS V4EXPCLUS VIEW SYS V4EXPCOL VIEW SYS V4EXPEXTENTS VIEW SYS V4EXPINDEX VIEW SYS V4EXPSPACE VIEW SYS V4EXPSYN VIEW SYS V4EXPTAB VIEW SYS V4EXPTABAUTH VIEW SYS V4EXPUSER VIEW SYS V4EXPVIEW VIEW SYSTEM HELP TABLE 136 rows selected.

Listar todos os usurios do banco de dados.


SQL> DESCRIBE ALL_USERS Name ------------------------------USERNAME USER_ID CREATED SQL> SELECT * FROM ALL_USERS USERNAME USER_ID CREATED ------------------------------ ------- --------SYS 0 30-DEC-91 PUBLIC 1 30-DEC-91 SYSTEM 2 30-DEC-91 SCOTT 3 30-DEC-91 Null? -------NOT NULL NOT NULL NOT NULL Type ---CHAR(30) NUMBER DATE

107

ALUNO1 _NEXT_USER 6 rows selected.

4 19-OCT-94 5 30-DEC-91

Listar todos os ndices criados nas tabelas do usurio.


SQL> DESCRIBE USER_INDEXES Name ------------------------------INDEX_NAME TABLE_OWNER TABLE_NAME TABLE_TYPE UNIQUENESS TABLESPACE_NAME INI_TRANS MAX_TRANS INITIAL_EXTENT NEXT_EXTENT MIN_EXTENTS MAX_EXTENTS PCT_INCREASE PCT_FREE STATUS SQL> SQL> SQL> SQL> 2 3 Null? -------NOT NULL NOT NULL NOT NULL NOT NULL NOT NULL NOT NULL NOT NOT NOT NOT NULL NULL NULL NULL Type ---CHAR(30) CHAR(30) CHAR(30) CHAR(11) CHAR(9) CHAR(30) NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER CHAR(17)

COLUMN INDEX_NAME FORMAT A20 COLUMN TABLE_OWNER FORMAT A20 COLUMN TABLE_NAME FORMAT A20 SELECT INDEX_NAME, TABLE_OWNER, TABLE_NAME, TABLE_TYPE FROM USER_INDEXES ORDER BY 1,2 TABLE_OWNER -------------------ALUNO1 ALUNO1 ALUNO1 ALUNO1 TABLE_NAME -------------------ITEM ORD PRICE PRODUCT -------TABLE TABLE TABLE TABLE

INDEX_NAME TABLE_TYPE -------------------ITEM_INDEX ORD_INDEX PRICE_INDEX PRODUCT_INDEX

Listar as descries das colunas de todas as tabelas do banco de dados.


SQL> DESCRIBE DBA_COL_COMMENTS ERROR: ORA-00942: table or view does not exist

Esta consulta s pode ser realizada por um usurio com privilgio de DBA.
SQL> CONNECT SYSTEM Connected. SQL> DESCRIBE DBA_COL_COMMENTS Name ------------------------------OWNER TABLE_NAME COLUMN_NAME COMMENTS Null? -------NOT NULL NOT NULL NOT NULL Type ---CHAR(30) CHAR(30) CHAR(30) CHAR(255)

13.7

Exerccios a) Mostrar as seguintes informaes para a tabela EMP: 108

Coluna Nulo? ------------------------------- -------EMPNO NOT NULL ENAME JOB MGR HIREDATE SAL COMM DEPTNO

Tipo -------------NUMBER(4) VARCHAR2(10) VARCHAR2(9) NUMBER(4) DATE NUMBER(7,2) NUMBER(7,2) NUMBER(2)

109

Captulo 14: Linguagem de Definio de Dados


14.1 Objetivos deste captulo Apresentar os comandos utilizados para criar, alterar, trocar de nome, adicionar comentrios e remover tabelas. 14.2 Estrutura de Dados do Oracle Tabelas podem ser criadas a qualquer momento, mesmo com usurios acessando o banco de dados. Comprimento dos dados varivel. Somente os caracteres e nmeros especificados so armazenados. Espaos frente e traz no so armazenados. No existe a necessidade de se especificar o tamanho das tabelas. As tabelas ocupam novos segmentos quando necessrio. A estrutura das tabelas podem ser modificadas on-line. 14.3 Criando uma tabela Devem ser observadas as seguintes regras para o nome de uma tabela:

O nome deve comear por uma letra, de "A" a "Z", ou de "a" a "z". O nome pode conter letras, nmeros, e o caractere especial sublinhado (_). Os caracteres "$" e "# tambm podem ser usado, mas seu uso desaconselhado. O nome o mesmo, independentemente do uso de letras minsculas ou maisculas. Por exemplo, EMP, emp. EmP, Emp, e Emp so a mesma tabela. O nome pode conter at 30 caracteres. O nome da tabela no pode ser igual ao de outra tabela, sinnimo ou viso, a no ser que pertenam a usurios diferentes. O nome no pode ser uma das palavras reservadas do Oracle. Nome EMP85 85EMP LUCRO_BRUTO LUCRO BRUTO UPDATE TABELA1 Vlido Sim No, comea com nmero. Sim No, contm espao. No, palavra reservada. Sim, mas nome no diz nada.

110

14.4

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.

14.5

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

RAW(n)

LONG RAW ROWID MLSLABEL NUMBER(p,s) DATE FLOAT

111

Dado 7456123,89 7456123,89 7456123,89 7456123,89 7456123,8 7456123,8 7456123,89 7456123,8 14.6

Especificao NUMBER NUMBER(9) NUMBER(9,2) NUMBER(9,1) NUMBER(6) NUMBER(15,1) NUMBER(7,-2) NUMBER(7,2)

Valor armazenado 7456123,89 7456124 7456123,89 7456123,9 preciso excedida 7456123,8 7456100 preciso excedida

Relao entre os tipos de dados ANSI e do Oracle ANSI CHARACTER(n), CHAR(n) CHARACTER VARYING(n), CHAR VARYING(n) NUMERIC(p,s), DECIMAL(p,s), DEC(p,s) INTEGER, INT, SMALLINT FLOAT(b), DOUBLE PRECISION, REAL ORACLE CHAR(n) VARCHAR(n) NUMBER(p,s) NUMBER(38) NUMBER

14.7

Relao entre os tipos de dados do SQL/DS e do Oracle SQL/DS ou DB2 CHARACTER(n) VARCHAR(n) LONG VARCHAR DECIMAL(p,s) INTEGER, SMALLINT FLOAT(b) GRAPHIC LONG VARGRAPHIC VARGRAPHIC TIMESTAMP TIME ORACLE CHAR(n) VARCHAR(n) LONG NUMBER(p,s) NUMBER(38) NUMBER DATE DATE

14.8

Criao de tabelas 14.8.1 Sintaxe do comando: CREATE TABLE [esquema.] nome_da_tabela [restries] (nome_da_coluna tipo_de_dado (tamanho) [DEFAULT valor] [restries]) [PCTFREE inteiro PCTUSED inteiro INITRANS inteiro MAXTRANS inteiro] [TABLESPACE espao_de_tabela STORAGE armazenamento] 112

Restrio CONSTRAINT nome_da_restrio NULL NOT NULL UNIQUE PRIMARY KEY

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.

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

DISABLE (ENABLE) EXCEPTIONS INTO

14.8.2 Criao das tabelas do curso:


CREATE TABLE DEPT ( DEPTNO NUMBER(2) DNAME CHAR(14), LOC CHAR(13), PRIMARY KEY (DEPTNO) NOT NULL, 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,

113

FOREIGN KEY (DEPTNO) PRIMARY KEY (EMPNO)

REFERENCES DEPT (DEPTNO) CONSTRAINT EMP_F_K, CONSTRAINT EMP_PRIMARY_KEY)

CREATE TABLE SALGRADE ( GRADE NUMBER, LOSAL NUMBER, HISAL NUMBER)

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

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 CONSTRAINT CHECK_DEPTNO CHECK (DEPTNO BETWEEN 10 AND 99) DISABLE, DNAME CHAR(14) CONSTRAINT CHECK_DNAME CHECK(DNAME=UPPER(DNAME)) DISABLE, LOC CHAR(13) CONSTRAINT CHECK_LOC CHECK (LOC IN ('DALLAS','BOSTON',...)) DISABLE)

Tabela EMP com opo ON DELETE CACADE.


CREATE TABLE EMP ( EMPNO NUMBER(4) ENAME CHAR(10), JOB CHAR(9), NOT NULL,

114

MGR NUMBER(4) REFERENCES EMP (EMPNO) CONSTRAINT EMP_S_KEY, HIREDATE DATE, SAL NUMBER(7,2), COMM NUMBER(7,2), DEPTNO NUMBER(2) NOT NULL, CONSTRAINT FK_DEPTNO REFERENCES DEPT(DEPTNO) ON DELETE CASCADE)

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

14.9

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

Null? Type -------- ---NOT NULL NUMBER(4) CHAR(10) CHAR(9) NUMBER(4) DATE NUMBER(7,2) NUMBER(7,2) NOT NULL NUMBER(2)

115

7369 7499 7521 7566 7654 7698 7782 7788 7839 7844 7876 7900 7902 7934

SMITH ALLEN WARD JONES MARTIN BLAKE CLARK SCOTT KING TURNER ADAMS JAMES FORD MILLER

CLERK SALESMAN SALESMAN MANAGER SALESMAN MANAGER MANAGER ANALYST PRESIDENT SALESMAN CLERK CLERK ANALYST CLERK

7902 7698 7698 7839 7698 7839 7839 7566 7698 7788 7698 7566 7782

13-JUN-83 15-AUG-83 26-MAR-84 31-OCT-83 05-DEC-83 11-JUN-84 14-MAY-84 05-MAR-84 09-JUL-84 04-JUN-84 04-JUN-84 23-JUL-84 05-DEC-83 21-NOV-83

800 1600 1250 2975 1250 2850 2450 3000 5000 1500 1100 950 3000 1300

300 500 1400

20 30 30 20 30 30 10 20 10 30 20 30 20 10

14 rows selected.

Como pode ser visto, as duas tabelas tem exatamente a mesma estrutura e o mesmo contedo. Tabelas tambm podem ser criadas a partir da juno de outras tabelas.
SQL> 2 3 4 5 6 CREATE TABLE SALARIOS_DOS_EMPREGADOS (NOME, SALARIO, FAIXA) AS SELECT ENAME, SAL, GRADE FROM EMP, SALGRADE WHERE SAL BETWEEN LOSAL AND HISAL

Table created. SQL> DESCRIBE SALARIOS_DOS_EMPREGADOS Name Null? ------------------------------- -------NOME SALARIO FAIXA SQL> SELECT * 2 FROM SALARIOS_DOS_EMPREGADOS NOME SALARIO FAIXA ---------- ------- ------SMITH 800 1 ADAMS 1100 1 JAMES 950 1 WARD 1250 2 MARTIN 1250 2 MILLER 1300 2 ALLEN 1600 3 TURNER 1500 3 JONES 2975 4 BLAKE 2850 4 CLARK 2450 4 SCOTT 3000 4 FORD 3000 4 KING 5000 5 14 rows selected. Type ---CHAR(10) NUMBER(7,2) NUMBER

14.10 Alterando uma tabela Para adicionar uma coluna na tabela usamos: 116

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 ------------------------------EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO NOME_DA_ESPOSA Null? Type -------- ---NOT NULL NUMBER(4) CHAR(10) CHAR(9) NUMBER(4) DATE NUMBER(7,2) NUMBER(7,2) NOT NULL NUMBER(2) CHAR(10)

Para alterar a tabela empregados e garantir todos tenham salrio inferior a 5000:
SQL> ALTER TABLE EMPREGADOS 2 ADD (CHECK(SAL<=5000)) Table altered.

Para modificar uma coluna na tabela usamos: ALTER TABLE nome_da_tabela MODIFY ( nome_da_coluna tipo_de_dado [DEFAULT valor] [restries_de_coluna]) 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 ------------------------------EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO NOME_DA_ESPOSA Null? Type -------- ---NOT NULL NUMBER(4) CHAR(10) CHAR(9) NUMBER(4) DATE NUMBER(7,2) NUMBER(7,2) NOT NULL NUMBER(2) CHAR(25)

14.11 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 117

Para trocar o nome da tabela de EMPREGADOS para FUNCIONARIOS: SQL> RENAME EMPREGADOS TO FUNCIONARIOS Table renamed. 14.12 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' 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.

14.13 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.

14.14 Exerccios a) Criar as seguintes tabelas: Tabela: PROJECTS PROJID P_DESC P_START_DATE P_END_DATE BUDGET_AMOUNT MAX_NO_STAFF Tabela: ASSIGNMENTS PROJID EMPNO NUMBER CHARACTER DATE DATE NUMBER NUMBER NUMBER NUMBER 118 4 20 7,2 2 4 4 NOT NULL NOT NULL NOT NULL

A_START_DATE A_END_DATE BILL_RATE ASSIGN_TYPE

DATE DATE NUMBER CHAR

4,2 2

b) Com as tabelas criadas adicionar a seguinte coluna a tabela ASSIGNMENTS: HOURS NUMBER 2

c) Adicionar comentrios s tabelas criadas para descrever o contedo. d) Adicionar comentrios coluna PROJID da tabela PROJECTS descrevendo seu contedo. e) Mostrar a especificao das colunas das viso USER_COL_COMMENTS. f) Mostrar os nomes das tabelas, das colunas, e os comentrios para as colunas. g) Mostrar a especificao das colunas das viso USER_TAB_COMMENTS. h) Mostrar os nomes das tabelas e os comentrios para as tabelas.

119

14.15 Respostas dos exerccios


a) SQL> 2 3 4 5 6 7 SQL> 2 3 4 5 6 7 CREATE TABLE PROJECTS ( PROJID NUMBER(4) P_DESC CHAR(20), P_START_DATE DATE, P_END_DATE DATE, BUDGET_AMOUNT NUMBER(7,2), MAX_NO_STAFF NUMBER(2)) CREATE TABLE ASSIGNMENTS ( PROJID NUMBER(4) EMPNO NUMBER(4) A_START_DATE DATE, A_END_DATE DATE, BILL_RATE NUMBER(4,2), ASSIGN_TYPE CHAR(2))

NOT NULL,

NOT NULL, NOT NULL,

b) SQL> ALTER TABLE ASSIGNMENTS 2 ADD (HOURS NUMBER(2)) c) SQL> COMMENT ON TABLE PROJECTS IS 'UNIQUE PROJECT DETAILS' SQL> COMMENT ON TABLE ASSIGNMENTS IS > 'ASSIGNMENTS FOR ANY EMPLOYEE ON A PROJECT' d) SQL> COMMENT ON COLUMN PROJECTS.PROJID IS > 'UNIQUE IDENTIFIER FOR A PROJECT' e) SQL> DESCRIBE USER_COL_COMMENTS Name ------------------------------TABLE_NAME COLUMN_NAME COMMENTS

Null? -------NOT NULL NOT NULL

Type ---CHAR(30) CHAR(30) CHAR(255)

f) SQL> SELECT * FROM USER_COL_COMMENTS WHERE COMMENTS IS NOT NULL TABLE_NAME COLUMN_NAME COMMENTS --------------- --------------- --------------------------------------PROJECTS PROJID UNIQUE IDENTIFIER FOR A PROJECT g) SQL> DESCRIBE USER_TAB_COMMENTS Name Null? ------------------------------- -------TABLE_NAME NOT NULL TABLE_TYPE COMMENTS

Type --------CHAR(30) CHAR(11) CHAR(255)

h) SQL> SELECT * FROM USER_TAB_COMMENTS WHERE COMMENTS IS NOT NULL TABLE_NAME --------------ASSIGNMENTS PROJECTS TABLE_TYPE ----------TABLE TABLE COMMENTS -----------------------------------------ASSIGNMENTS FOR ANY EMPLOYEE ON A PROJECT UNIQUE PROJECT DETAILS

120

Captulo 15: Linguagem de Manipulao de Dados


15.1 Objetivos deste captulo Mostrar a linguagem de manipulao de dados (DML), utilizada para inserir, atualizar e eliminar registros do banco de dados. 15.2 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> 2 3 4 CREATE TABLE DEPARTMENT AS SELECT * FROM DEPT

Table created.

Quando os novos valores so inseridos em todas as colunas da tabela, na mesma ordem das colunas da tabela, a lista de colunas pode ser omitida. recomendado que a lista de colunas seja sempre especificada, para no haver necessidade de alterar o programa quando uma nova coluna for adicionada tabela. Para inserir um novo departamento.
SQL> INSERT INTO DEPARTMENT ( DEPTNO, DNAME, LOC ) 2 VALUES (50, 'MARKETING', 'SAN JOSE' ) 1 row created.

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


SQL> INSERT INTO DEPARTMENT ( DEPTNO, LOC ) 2 VALUES ( 60, 'ALBERTA' ) 1 row created.

Em vez que omitir o nome do departamento na lista de colunas, pode ser especificado o valor nulo para o nome do departamento, o resultado o mesmo.
SQL> INSERT INTO DEPARTMENT ( DEPTNO, DNAME, LOC ) 2 VALUES ( 70, NULL, 'DETROIT' ) 1 row created.

Podem ser utilizadas variveis de substituio para fornecimento dos valores.


SQL> INSERT 2 VALUES Enter value Enter value INTO DEPARTMENT ( DEPTNO, DNAME, LOC ) ( &DEPT_NUM, '&DEPT_NAME', '&DEPT_LOC' ) for dept_num: 80 for dept_name: RESEARCH

121

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.


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 ------10 20 30 40 50 60 70 80 90 DNAME -------------ACCOUNTING RESEARCH SALES OPERATIONS MARKETING RESEARCH INSURANCE LOC ------------NEW YORK DALLAS CHICAGO BOSTON SAN JOSE ALBERTA DETROIT ATLANTA LONDON

9 rows selected.

Para os exemplos de insero de valores de data e hora ser criada a tabela Employee a partir da tabela Emp.
SQL> 2 3 4 CREATE TABLE EMPLOYEE AS SELECT * 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> 2 3 4 5 6 7 8 9 10 INSERT INTO EMPLOYEE ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO ) VALUES ( 7658, 'CODD', 'ANALYST', 7566, TO_DATE('24/06/2084 9:30','DD/MM/YYYY HH:MI'), 3000, NULL,

122

11 20) 1 row created.

Para exemplo de insero de valores a partir de uma outra tabela ser criada a tabela SALARY_GRADE a partir da tabela SALGRADE.
SQL> 2 3 4 CREATE TABLE SALARY_GRADE AS SELECT * FROM SALGRADE 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> 2 3 4 INSERT INTO SALARY_GRADE SELECT * FROM SALGRADE 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

15.3

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> 2 3 4 5 6 UPDATE EMPLOYEE SET JOB = 'SALESMAN', HIREDATE = SYSDATE, SAL = SAL*1.1 WHERE ENAME = 'SCOTT'

1 row updated.

123

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 ---------CODD FORD ADAMS JAMES MILLER SMITH BLAKE CLARK JONES KING ALLEN MARTIN SCOTT TURNER WARD JOB --------ANALYST ANALYST CLERK CLERK CLERK CLERK MANAGER MANAGER MANAGER PRESIDENT VENDEDOR VENDEDOR VENDEDOR VENDEDOR VENDEDOR

15 rows selected.

15.4

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

124

no rows selected

Apesar de no possuir nenhuma linha, a tabela Employee ainda existe, para elimin-la utilizado o comando da linguagem de definio de dados (DDL) DROP TABLE.
SQL> DROP TABLE EMPLOYEE Table dropped.

15.5

Exerccios a) Inserir as seguintes linhas na tabela PROJECTS PROJID P_DESC P_START_DATE P_END_DATE BUDGET_AMOUNT MAX_NO_STAFF 1 WRITE C030 COURSE 02-JAN-88 07-JAN-88 500 1 2 PROOF READ NOTES 01-JAN-89 10-JAN-89 600 1

b) Inserir as seguintes linhas na tabela ASSIGNMENTS PROJID EMPNO A_START_DATE A_END_DATE BILL_RATE ASSIGN_TYPE HOURS 1 7369 01-JAN-88 03-JAN-88 50.00 WR 15 1 7902 04-JAN-88 07-JAN-88 55.00 WR 20 2 7844 01-JAN-89 10-JAN-89 45.50 PF 30

c) Alterar ASSIGNMENT_TYPE: trocar WR por WT.

125

15.6

Respostas dos exerccios


a) SQL> 2 3 4 SQL> 2 3 4 b) SQL> 2 3 4 SQL> 2 3 4 SQL> 2 3 4 INSERT INTO PROJECTS (PROJID,P_DESC,P_START_DATE,P_END_DATE,BUDGET_AMOUNT,MAX_NO_STAFF) VALUES (1,'WRITE C030 COURSE','02-JAN-88','07-JAN-88',500,2) INSERT INTO PROJECTS (PROJID,P_DESC,P_START_DATE,P_END_DATE,BUDGET_AMOUNT,MAX_NO_STAFF) VALUES (2,'PROOF READ NOTES','01-JAN-89','10-JAN-89',600,1) INSERT INTO ASSIGNMENTS (PROJID,EMPNO,A_START_DATE,A_END_DATE,BILL_RATE,ASSIGN_TYPE,HOURS) VALUES (1,7369,'01-JAN-88','03-JAN-88',50.00,'WR',15) INSERT INTO ASSIGNMENTS (PROJID,EMPNO,A_START_DATE,A_END_DATE,BILL_RATE,ASSIGN_TYPE,HOURS) VALUES (1,7902,'04-JAN-88','07-JAN-88',55.00,'WR',20) INSERT INTO ASSIGNMENTS (PROJID,EMPNO,A_START_DATE,A_END_DATE,BILL_RATE,ASSIGN_TYPE,HOURS) VALUES (2,7844,'01-JAN-89','10-JAN-89',45.50,'PF',30)

c) SQL> UPDATE ASSIGNMENTS 2 SET ASSIGN_TYPE = 'WT' 3 WHERE ASSIGN_TYPE = 'WR'

126

Captulo 16: Processamento de transaes


16.1 Objetivos deste captulo Fazer uma introduo ao conceito de transao. 16.2 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. Aps o fim de uma transao, a prxima declarao SQL inicia uma nova transao automaticamente. 16.3 Efetivando as mudanas Para tornar as mudanas no banco de dados permanentes, elas devem ser efetivadas. O comando COMMIT utilizado para efetivar as mudanas, e o comando ROLLBACK utilizado para descartar as mudanas. Os comandos emitidos entre dois comandos COMMIT definem uma transao. At que o comando Commit seja executado, as mudanas so vistas apenas pelo usurio que as efetuou, os demais usurios enxergam a situao anterior as modificaes. 127

16.4

Removendo mudanas Mudanas no efetivadas podem ser descartadas atravs do comando ROLLBACK. O comando ROLLBACK retorna os dados ao estado em que se encontrava aps o ltimo COMMIT.

16.5

Falhas do sistema Quando uma transao interrompida por um erro, como, por exemplo, uma falha do sistema, toda a transao descartada (Rolled back). Este procedimento previne que os erros causem mudanas no desejadas aos dados. O Rollback automtico mais freqentemente causado por falhas no sistema, tais como falta de luz ou queda do sistema operacional. Erros causados pela entrada de comandos, tais como digitar o nome errado para uma coluna ou tentar realizar uma operao no permitida na tabela de outro usurio, no interrompem uma transao, nem causam um Rollback automtico, porque estes erros so detectados na fase de 'parse' do comando (quando o comando lido e verificado), e no durante a fase de execuo.

16.6

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.

16.7

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

16.8

COMMIT [WORK]

Torna as mudanas causadas pela transao corrente permanente Elimina todos os SavePoints Termina a transao 128

Libera os Locks causados pela transao 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. 16.9 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. S existe Rollback to SavePoint, no existe Commit to SavePoint.

16.10 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 129

Libera os Locks da transao

16.11 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. 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.

16.12 Rollbacks implcitos Rollbacks implcitos ocorrem em caso de trmino anormal 16.13 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. 16.14 Exemplo de utilizao de COMMIT e ROLLBACK Para eliminar os departamentos com nmero maior do que 40.
SQL> DELETE FROM DEPARTMENT 2 WHERE DEPTNO > 40 5 rows deleted.

130

Para efetivar o comando anterior.


SQL> COMMIT Commit complete.

Para verificar que os departamentos foram realmente eliminados.


SQL> SELECT * FROM DEPARTMENT DEPTNO ------10 20 30 40 DNAME -------------ACCOUNTING RESEARCH SALES OPERATIONS LOC ------------NEW YORK DALLAS CHICAGO 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 ------10 20 30 40 50 DNAME -------------ACCOUNTING RESEARCH SALES OPERATIONS TESTING LOC ------------NEW YORK DALLAS CHICAGO BOSTON 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.


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

131

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 ------10 20 30 40 50 DNAME -------------ACCOUNTING RESEARCH SALES OPERATIONS TESTING LOC ------------NEW YORK DALLAS CHICAGO BOSTON 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.

Para efetivar todas as mudanas.


SQL> COMMIT Commit complete.

Para verificar como ficou a tabela.


SQL> SELECT * FROM DEPARTMENT DEPTNO ------10 20 30 40 50 DNAME -------------ACCOUNTING RESEARCH MARKETING OPERATIONS TESTING LOC ------------NEW YORK DALLAS CHICAGO BOSTON 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. 132

SQL> SELECT * FROM DEPARTMENT no rows selected

Para desfazer a eliminao das linhas.


SQL> ROLLBACK Rollback complete.

Para verificar como ficou a tabela.


SQL> SELECT * FROM DEPARTMENT DEPTNO ------10 20 30 40 50 DNAME -------------ACCOUNTING RESEARCH MARKETING OPERATIONS TESTING LOC ------------NEW YORK DALLAS CHICAGO BOSTON 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

16.15 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 como foram alterados, mesmo que as mudanas no tenham ainda sido efetivadas. A finalidade da consistncia de leitura garantir que cada usurio veja os dados da forma como existiam antes do ltimo Commit. 133

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. 16.16 Transaes somente de leitura Por padro, o modelo de consistncia do Oracle garante que os resultados de um comando so consistentes. Entretanto, em algumas situaes, pode ser necessrio processar vrias consultas em dados de vrias tabelas e garantir que os dados so consistentes, ou seja, os resultados produzidos pela consulta uma tabela so consistentes com os resultados das consultas a qualquer outra tabela. A declarao SQL SET TRANSACTION READ ONLY utilizada para iniciar uma transao de leitura apenas. A consistncia de leitura que READ ONLY prov implementada da mesma maneira que a consistncia nvel de declarao - usando segmentos de rollback. Cada declarao por padro enxerga uma viso consistente dos dados na hora em que a declarao foi feita. Esta funcionalidade muito til para relatrios que processam mltiplas consultas enquanto os usurios atualizam as mesmas tabelas. Notas: A declarao SET TRANSACTION READ ONLY deve ser a primeira da transao. Somente consultas so permitidas na transao. COMMIT, ROLLBACK ou uma declarao DDL terminam a transao. Com DDL nenhuma indicao dada que a transao terminou. Durante a transao, todas as consultas se referem ao mesmo instantneo (snapshot) do banco de dados (mudanas efetivadas antes da transao comear). 134

Outros usurios podem continuar a atualizar os dados. Exemplo:


SQL> SET TRANSACTION READ ONLY Transaction set. SQL> SELECT * FROM DEPT DEPTNO ------10 20 30 40 DNAME -------------ACCOUNTING RESEARCH SALES OPERATIONS LOC ------------NEW YORK DALLAS CHICAGO BOSTON

SQL> COMMIT Commit complete.

135

Captulo 17: Concorrncia e Bloqueio


17.1 Objetivos deste captulo Mostrar como o Oracle manuseia os bloqueios (locks). Tipos e nveis de bloqueio. Bloqueio padro. Bloqueio implcito e explcito. Bloqueio mortal (Deadlock). Este captulo no possui exerccios. 17.2 Introduo ao bloqueio Uma das maiores tarefas de um sistema gerenciador de banco de dados (SGBD) controlar a concorrncia, ou seja, o acesso aos mesmos dados por vrios usurios. Sem um controle correto de concorrncia os dados podem ser atualizados incorretamente ou fora de seqncia, comprometendo, portanto, a integridade dos dados. Oracle resolve os problemas resultantes das atualizaes concorrentes atravs de bloqueios. Bloqueios de tabelas e linhas so uma parte essencial para manter a consistncia e a integridade do banco de dados. Bloqueios so usados para: proteger os dados controlar os usurios Qualquer estratgia de bloqueio deve balancear os objetivos de mxima concorrncia, isto , permitir o maior nmero de usurios no sistema, com relao a mxima proteo dos dados. 17.3 O que um bloqueio O bloqueio o mecanismo que usado para controlar o acesso aos dados em um sistema multi-usurio, prevenindo que dois usurios atualizem o mesmo dado ao mesmo tempo. 17.4 Quando os bloqueios so necessrios Bloqueios so ativados sempre que um usurio comea a realizar alteraes no banco de dados. O Oracle permite que qualquer nmero de usurios leiam os dados ao mesmo tempo, porque os bloqueios no so necessrios para a leitura. 136

Usurios consultando dados nunca bloqueiam usurios modificando dados, e usurios modificando dados nunca bloqueiam usurios lendo dados. 17.5 Quando os bloqueios so liberados Os bloqueios so liberados aps o Commit ou o Rollback, ou seja, no final da transao. 17.6 Tipos de bloqueios 17.6.1 Bloqueios do dicionrio de dados (DDL) controla o acesso s definies dos objetos do banco de dados. usado para controlar as operaes SQL que modificam o dicionrio de dados, tais como, Create Table, Alter Table, Drop Table... controlado automaticamente pelo SGBD Oracle. 17.6.2 Bloqueios da manipulao de dados (DML) controla o acesso aos dados nas tabelas dos usurios. o Oracle automaticamente bloqueia as tabelas que esto sendo atualizadas pelos usurios (bloqueio implcito). o usurio pode solicitar o bloqueio atravs de comandos SQL (bloqueio explcito) Este captulo trata de bloqueios causados pela DML. 17.7 Nveis de bloqueio Bloqueio a nvel de tabela - toda a tabela bloqueada. Bloqueio a nvel de linha - somente as linhas da tabela so bloqueadas. 17.8 Descrio dos bloqueios Modo de bloqueio Compartilhado Share locks Exclusivo Exclusive lock Severidade Pode ser adquirido por mais de um usurio para a mesma tabela ao mesmo tempo. Permite o compartilhamento do recurso dependendo da operao. Pode ser adquirido por apenas um usurio de cada vez. O primeiro usurio a adquirir um bloqueio exclusivo o nico que pode atualizar at o bloqueio exclusivo ser liberado. 137

Nveis de Bloqueio Nvel de Linha Row Locks (TX)

Nvel de Tabela Table Locks (TM)

Descrio - Um bloqueio exclusivo adquirido para cada linha modificada pelos comandos INSERT, UPDATE, DELETE ou SELECT FOR UPDATE. - Uma linha sempre bloqueada de forma exclusiva, para no permitir outros usurios atualizar a mesma linha ao mesmo tempo. - Bloqueios de linha so sempre adquiridos automaticamente pelo Oracle quando um dos comandos listados anteriormente executado. - Existem diversos modos de bloqueio para tabelas. - Um bloqueio para a tabela adquirido quando a tabela modificada pelos comandos INSERT, UPDATE, DELETE, SELECT FOR UPDATE ou LOCK TABLE. - As operaes de DML necessitam de bloqueio a nvel de tabela para impedir comandos de DDL serem executados sobre uma tabela sendo modificada.

Descrio dos modos de bloqueio s tabelas. Bloqueio de Tabela Row Share (RS) Descrio - Indica que a transao tem inteno de atualizar linhas da tabela. - Adquirido quando um dos comandos SELECT FOR UPDATE ou LOCK TABLE IN ROW SHARE MODE executado. - o menos restritivo dos bloqueios, permitindo o maior grau de concorrncia para a tabela. - Permite: consultas, inseres, atualizaes , eliminao e bloqueio de linhas da mesma tabela. - No permite: LOCK TABLE IN EXCLUSIVE MODE. - Indica que a transao atualizou uma ou mais linhas da tabela. - automaticamente adquirido quando um dos comandos INSERT, UPDATE, DELETE ou LOCK TABLE IN ROW EXCLUSIVE MODE executado. - um pouco mais restritivo do que Row Share. - Permite: consultas, inseres, atualizaes,, eliminao e bloqueios de linhas na mesma tabela. - No permite: LOCK TABLE IN SHARE MODE, LOCK TABLE IN SHARE EXCLUSIVE MODE e LOCK TABLE IN EXCLUSIVE MODE. - ativado pelo comando LOCK TABLE IN SHARE MODE. - Permite: consultas, SELECT FOR UPDATE e LOCK TABLE IN SHARE MODE. - No permite: INSERT, DELETE, UPDATE, LOCK TABLE IN SHARE ROW EXCLUSIVE MODE, LOCK 138

Row Exclusive (RX)

Share Lock (S)

TABLE IN EXCLUSIVE MODE, LOCK TABLE IN ROW EXCLUSIVE MODE. Share Row Exclusive - ativado pelo comando LOCK TABLE IN SHARE (SRX) ROW EXCLUSIVE MODE. - Permite: consultas tabela e bloqueios atravs do comando SELECT FOR UPDATE. - No permite: outras transaes atualizar a tabela. Exclusive (X) - ativado pelo comando LOCK TABLE IN EXCLUSIVE MODE. - o mais restritivo dos bloqueios. - Permite: consultas tabela. - No permite: qualquer operao de DML por outros usurios. A tabela abaixo indica os modos de bloqueio adquiridos pelos comandos SQL e as operaes que estes bloqueios permitem e proibem. Modo de lock da tabela none RX RX RX RS RS RX S SRX X

DECLARAO SQL SELECT INSERT UPDATE DELETE SELECT FOR UPDATE LOCK TABLE IN ROW SHARE MODE LOCK TABLE IN ROW EXCLUSIVE MODE LOCK TABLE IN SHARE MODE LOCK TABLE IN SHARE ROW EXCLUSIVE MODE LOCK TABLE IN EXCLUSIVE MODE

RS S S S* S* S* S S S S N

RX S S S* S* S* S S N N N

S S N N N S* S N Y N N

SRX X S N N N S* S N N N N S N N N N N N N N N

17.9

Bloqueios implcitos Relao dos bloqueios adquiridos automaticamente pelo Oracle: Comando SELECT INSERT UPDATE DELETE SELECT FOR UPDATE DDL LINHA X X X X 139 TABELA RX RX RX RS RX

17.10 Bloqueios explcitos

Comando LOCK TABLE tabela IN ROW SHARE MODE LOCK TABLE tabela IN ROW EXCLUSIVE MODE LOCK TABLE tabela IN SHARE MODE LOCK TABLE tabela IN SHARE EXCLUSIVE MODE LOCK TABLE tabela IN EXCLUSIVE MODE

Bloqueio RS RX S SRX X

17.11 Identificao da linha e bloqueio importante executar os comandos Commit ou Rollback o quanto antes para liberar os bloqueios adquiridos pela transao. O processo de efetivao pode ser acelerado utilizando ROWID para localizar as linhas dentro das tabelas. ROWID uma pseudo-coluna que tem um valor nico para cada linha da tabela. ROWID contm o endereo da linha, sendo, portanto, o meio mais rpido de acesso uma linha.

ROWID
Descrio:

00004C90.0001.0001

Bloco: 00004C90 Linha do bloco: 0001 Arquivo do banco de dados: 0001

ROWID uma chave nica para uma linha de uma tabela, mesmo que a linha esteja repetida na tabela.

Exemplo:
COLUMN ROWID NEW_VALUE ROW_IDENT SELECT ENAME, JOB, HIREDATE, SAL, ROWID FROM EMP WHERE ENAME = SCOTT FOR UPDATE OF JOB, HIREDATE, SAL

140

UPDATE EMP SET JOB = SALESMAN, HIREDATE = SYSDATE, SAL = 1.1 * SAL WHERE ROWID = &ROW_IDENT

17.12 Impasse (Deadlock) Imagine a seguinte situao: Transao A: UPDATE EMP SET SAL = 1200 WHERE ENAME = LEWIS Transao B: UPDATE DEPT SET LOC = LONDON WHERE DEPTNO = 20 Transao A: UPDATE DEPT SET LOC = RICHMOND WHERE DEPTNO = 20 Transao B: UPDATE EMP SET SAL = 1750 WHERE ENAME = LEWIS Desta forma: a transao A s pode prosseguir aps a transao B liberar a linha da tabela DEPT bloqueada a transao B s pode prosseguir quando a transao A liberar a linha da tabela EMP bloqueada ou seja, temos um caso de DEADLOCK. Deadlocks podem ocorrer sempre que dois ou mais usurios esto acessando as mesmas tabelas do banco de dados. Ocorre quando o usurio A est aguardando a liberao de uma linha bloqueada pelo usurio B, e o usurio B est na mesma situao com relao ao usurio A. Esta situao pode ser evitada quando os dois usurios acessando a mesma tabela o fazem na mesma ordem. Desta forma um segue o outro, no havendo Deadlock. Quando o acesso feito a mais de uma tabela, deve ser estabelecida uma ordem de acesso s tabelas para todas as aplicaes. Pode ser criado para isto uma tabela no banco de dados, com uma identificao nica de sua ordem de acesso. As tabelas de menor ordem so acessadas primeiro. TABELA LOCK SEQNCIA 141

-----------------EMP DEPT SALGRADE

---------RS RS X

-----------------2 1 10

142

Captulo 18 - Vises
18.1 Objetivos deste captulo Mostrar a criao e utilizao de vises (views). 18.2 O que uma viso Uma viso como uma janela atravs da qual os dados das tabelas podem ser vistos e alterados. 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. 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. Uma viso no tem dados prprios. Os dados so manipulados a partir das tabelas base. Vises so teis pelas seguintes razes: Restringir o acesso ao banco de dados. Permite enxergar apenas parte das tabelas. 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. Prov independncia de dados, permitindo alterar as tabelas base sem afetar as aplicaes dos usurios. 18.3 Classificao das vises 18.3.1 Vises simples dados derivados de uma nica tabela no contm funes ou dados grupados. 18.3.2 Vises complexas dados derivados de mltiplas tabelas contm funes ou dados grupados.

143

18.4

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> 2 3 4 5 6 CREATE VIEW D10EMP AS SELECT EMPNO, ENAME, DEPTNO FROM EMP WHERE DEPTNO = 10 WITH CHECK OPTION

View created.

Para recuperar os dados atravs da viso:


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

Para criar uma viso complexa, chamada DEPT_SUMMARY, contendo funes de grupo e dados de mais de uma tabela:
CREATE VIEW DEPT_SUMMARY ( NAME, MINSAL, MAXSAL, AVGSAL ) AS SELECT DNAME, MIN(SAL), MAX(SAL), AVG(SAL) FROM EMP, DEPT WHERE EMP.DEPTNO = DEPT.DEPTNO GROUP BY DNAME

Note que nomes alternativos para as colunas foram especificados na viso, o que necessrio quando os itens da clusula Select no esto de acordo com as regras para nomes de colunas, ou se alguma coluna derivada de uma funo ou expresso. Quando um alis utilizado para o nome da coluna na clusula Select, no necessrio colocar um nome para a coluna na clusula Create View.
CREATE VIEW DEPT20 AS SELECT ENAME, SAL*12 ANNSAL FROM EMP WHERE DEPTNO = 20

144

18.5

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

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

View created.

A restrio WITH CHECK OPTION pode ter um nome prprio.


SQL> 2 3 4 5 6 CREATE VIEW EMPLOYEES ( ID_NUMBER, NAME, POSITION, DEPARTMENT ) AS SELECT EMPNO, ENAME, JOB, DEPTNO FROM EMP WHERE DEPTNO IN ( SELECT DISTINCT DEPTNO FROM DEPT ) WITH CHECK OPTION CONSTRAINT DEPT_CHECK

View created.

145

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: Recuperao da definio da viso do dicionrio de dados. Verificao dos privilgios de acesso. 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: Maxdata Arraysize Long
SQL> DESCRIBE USER_VIEWS Name Null? ------------------------------- -------VIEW_NAME NOT NULL TEXT_LENGTH TEXT 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 PRODUCT.PRODID, DESCRIP PRODNA Type ---CHAR(30) NUMBER LONG

EMP_DATA

EMP_DETAILS

SALES

146

18.6

Alterando dados atravs das vises As seguintes restries se aplicam quando os dados so alterados atravs das vises: Eliminao proibida de a viso contm: Juno. Funes de grupo. Clusula GROUP BY. Clusula DISTINCT. Coluna ROWNUM. Sub-consulta correlacionada. Atualizao proibida se a viso contm: Alguma das condies anteriores. Colunas definidas por expresso. Insero proibida se a viso contm: Alguma das condies acima. Coluna NOT NULL da tabela que no consta da viso.

18.7

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


SQL> DROP VIEW D10EMP View dropped. SQL> DROP VIEW EMPLOYEES View dropped. SQL> DROP VIEW EMP_DATA View dropped. SQL> DROP VIEW EMP_DETAILS View dropped.

147

18.8

Exerccios a) Criar uma viso que produza o seguinte resultado.


SQL> SELECT * FROM AGGREGATES DEPTNO ------10 20 30 AVERAGE MAXIMUM MINIMUM SUM NO_SALS NO_COMMS ------- ------- ------- ------- ------- -------2916.67 5000 1300 8750 3 0 2175 3000 800 10875 5 0 1566.67 2850 950 9400 6 4

b) Utilizando a viso do exerccio anterior, extrair as seguintes informaes. O nmero do empregado deve ser solicitado em tempo de execuo.
EMPNO ENAME JOB SAL HIREDATE MINIMUM MAXIMUM AVERAGE ------- ------ --------- ------- --------- ------- ------- ------7902 FORD ANALYST 3,000 05-DEC-83 800 3,000 2,175

c) Criar uma viso que garanta as seguintes restries ao se inserir dados na tabela ASSIGNMENTS: nmero do projeto menor do que 2000. Trmino do projeto aps o incio do projeto. ASSIGN_TYPE vlidos so PF, WT e ED. BILL_RATE menor do que 50 para ASSIGN_TYPE PF. BILL_RATE menor do que 60 para ASSIGN_TYPE WT. BILL_RATE menor do que 70 para ASSIGN_TYPE ED. O nmero do empregado deve ser vlido. No esquea a clusula WITH CHECK OPTION

SQL> SELECT * FROM ASG_VAL PROJID EMPNO A_START_D A_END_DAT BILL_RATE AS HOURS ------- ------- --------- --------- --------- -- ------1 7369 01-JAN-88 03-JAN-88 50 WT 15 2 7844 01-JAN-89 10-JAN-89 45.5 PF 30 1 7902 04-JAN-88 07-JAN-88 55 WT 20

d) Inserir valores na tabela ASSIGNMENTS atravs da viso criada.


Enter Enter Enter Enter Enter Enter Enter old value value value value value value value for for for for for for for id: 1 empno: 7566 start: 01-JAN-89 end: 01-JAN-88 bill_r: 40.00 asgt: ED hours: 20

3: (&ID,&EMPNO,'&START','&END','&BILL_R','&ASGT',&HOURS)

148

new 3: (1,7566,'01-JAN-89','01-JAN-88','40.00','ED',20) (1,7566,'01-JAN-89','01-JAN-88','40.00','ED',20) * ERROR at line 3: ORA-01402: view WITH CHECK OPTION where-clause violation SQL> / Enter value for id: 2 Enter value for empno: 7698 Enter value for start: 01-FEB-89 Enter value for end: 20-FEB-89 Enter value for bill_r: 55.00 Enter value for asgt: WT Enter value for hours: 30 old 3: (&ID,&EMPNO,'&START','&END','&BILL_R','&ASGT',&HOURS) new 3: (2,7698,'01-FEB-89','20-FEB-89','55.00','WT',30) 1 row created. SQL> / Enter value for id: 2 Enter value for empno: 8000 Enter value for start: 01-MAR-89 Enter value for end: 31-DEC-89 Enter value for bill_r: 69.00 Enter value for asgt: ED Enter value for hours: 40 old 3: (&ID,&EMPNO,'&START','&END','&BILL_R','&ASGT',&HOURS) new 3: (2,8000,'01-MAR-89','31-DEC-89','69.00','ED',40) (2,8000,'01-MAR-89','31-DEC-89','69.00','ED',40) * ERROR at line 3: ORA-01402: view WITH CHECK OPTION where-clause violation

e) Consulte o dicionrio de dados para ver a clusula SELECT da viso.

149

18.9

Respostas dos exerccios


a) SQL> 2 3 4 5 6 7 CREATE VIEW AGGREGATES (DEPTNO, AVERAGE, MAXIMUM, MINIMUM, SUM, NO_SALS, NO_COMMS) AS SELECT DEPTNO, AVG(SAL), MAX(SAL), MIN(SAL), SUM(SAL), COUNT(SAL), COUNT(COMM) FROM EMP GROUP BY DEPTNO

b) SQL> COLUMN MAXIMUM FORMAT 99,999 SQL> COLUMN MINIMUM LIKE MAXIMUM SQL> COLUMN AVERAGE LIKE MAXIMUM SQL> COLUMN SAL LIKE MAXIMUM SQL> COLUM JOB FORMAT A9 SQL> COLUMN ENAME FORMAT A6 SQL> SELECT EMP.EMPNO, ENAME, JOB, SAL, HIREDATE, 2 MINIMUM, MAXIMUM, AVERAGE 3 FROM EMP, AGGREGATES AGG 4 WHERE EMP.DEPTNO = AGG.DEPTNO 5 AND EMP.EMPNO = &EMPNO Enter value for empno: 7902 old 5: AND EMP.EMPNO = &EMPNO new 5: AND EMP.EMPNO = 7902 c) SQL> 2 3 4 5 6 7 8 9 10 11 CREATE VIEW ASG_VAL AS SELECT PROJID, EMPNO, A_START_DATE, A_END_DATE, BILL_RATE, ASSIGN_TYPE, HOURS FROM ASSIGNMENTS WHERE A_START_DATE < A_END_DATE AND PROJID < 2000 AND BILL_RATE <= DECODE(ASSIGN_TYPE, 'PF', 50, 'WT', 60, 70) AND ASSIGN_TYPE IN ('PF', 'WT', 'ED') AND EMPNO IN (SELECT EMPNO FROM EMP) WITH CHECK OPTION

d) SQL> INSERT INTO ASG_VAL 2 VALUES 3 (&ID,&EMPNO,'&START','&END','&BILL_R','&ASGT',&HOURS) e) SQL> SELECT VIEW_NAME, TEXT 2 FROM USER_VIEWS 3 WHERE VIEW_NAME = ASG_VAL VIEW_NAME TEXT --------------- -------------------------------------------------ASG_VAL SELECT PROJID, EMPNO, A_START_DATE, A_END_DATE, BILL_RATE, ASSIGN_TYPE, HOURS FR........

150

Captulo 19 - ndices
19.1 Objetivos deste captulo Mostrar a criao e a utilidade dos ndices. 19.2 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. 19.3 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. 19.4 Tipos de ndices UNIQUE Garante que os valores especificados para a(s) coluna(s) so nicos. NON UNIQUE o padro, usado para melhorar o tempo de acesso. SINGLE COLUMN ndice composto de apenas uma coluna. CONCATENATED ndice composto de at 16 colunas.

151

19.5

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...]) 19.5.1 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) 19.5.2 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)

19.6

Eliminao dos ndices Os ndices so eliminados atravs do comando: DROP INDEX nome-do-ndice

19.7

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

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

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 19.8 ndices e Junes Se no existirem ndices nas colunas utilizadas para realizar a juno equivalente, o Oracle obrigado a realizar uma operao de SORT/MERGE para responder a consulta. Isto significa que cada tabela ordenada separadamente, e depois as duas so unidas de acordo com a condio de juno. 19.9 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. 19.10 Exerccios a) Criar um ndice nico na coluna PROJID da tabela PROJECTS. Teste o ndice inserindo um valor para PROJID j existente. b) Criar um ndice no nico na coluna PROJID da tabela ASSIGNMENTS. c) Consulte o dicionrio de dados para obter as informaes de seus ndices. * EMP HIREDATE+7 = 01-JAN-84

153

19.11 Respostas dos exerccios


a) CREATE ON b) CREATE ON c) SELECT FROM UNIQUE INDEX PROJ_PROJID PROJECTS(PROJID) INDEX ASG_PROJID ASSIGNMENTS(PROJID) * USER_INDEXES

154

Captulo 20: Seqncias


20.1 Objetivos deste captulo Mostrar a criao e a utilizao das seqncias. 20.2 O gerador de seqncias O gerador de seqncias do Oracle utilizado para gerar automaticamente seqncias de nmeros para as linhas das tabelas. Para gerar os nmeros seqenciais automaticamente, primeiro a seqncia deve ser definida utilizando a declarao CREATE SEQUENCE, conforme a sintaxe mostrada abaixo: CREATE SEQUENCE [esquema.]nome-da-seqncia [INCREMENTED BY n] [START WITH n] [MAXVALUE n | NOMAXVALUE] [MINVALUE n | NOMINVALUE] esquema nome-da-seqncia INCREMENT WITH START WITH MINVALUE|NOMINVALUE MAXVALUE|NOMAXVALUE identificao do dono da seqncia. nome vlido para a seqncia. incremento positivo ou negativo. Padro: 1. primeiro nmero a ser gerado. Padro: 1. menor valor a ser gerado. Padro: 1 para seqncias ascendentes, 10**27-1 para seqncias descendentes. maior valor a ser gerado. Padro: 1 para seqncias descendentes, 10**27-1 para seqncias ascendentes.

Para um usurio poder criar uma seqncia deve possuir o privilgio de resource. O comando mostrada abaixo cria uma seqncia para a coluna DEPTNO da tabela DEPT.
CREATE SEQUENCE DEPT_SEQ INCREMENT BY 10 START WITH 10 MAXVALUE 10000

20.1

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. 155

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

20.2

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. 156

SELECT mais externo (consulta principal) de uma subconsulta. 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. 20.3 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: Somente os nmeros a serem gerados no futuro so alterados pelo comando Alter Sequence. Os nmeros que j foram gerados no so alterados. Validaes so realizadas. No pode ser especificado, por exemplo, um novo valor mximo menor que o valor corrente. O parmetro START WITH no pode ser alterado pelo comando Alter Sequence. A seqncia deve ser eliminada e recriada para ser iniciada com um novo nmero. 20.4 Concedendo privilgios em seqncias O dono de uma seqncia pode conceder os privilgios Select e Alter. 20.5 Eliminando uma seqncia 157

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. 20.6 Listando seqncias As vises USER_SEQUENCES ou ALL_SEQUENCES podem ser utilizadas para descobrir as seqncias existentes.

158

Apndice A - Tabelas do Curso

Tabela EMP - Empregados


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

Tabela DEPT - Departamentos


DEPTNO 10 20 30 40 DNAME ACCOUNTING RESEARCH SALES OPERATIONS LOC NEW YORK DALLAS CHICAGO BOSTON

Tabela SALGRADE - Faixas Salariais


GRADE 1 2 3 4 5 LOSAL 700 1201 1401 2001 3001 HISAL 1200 1400 2000 3000 9999

159

CAPTULO 1: CONCEITOS DE BANCO DE DADOS ............................................................................................... 1 1.1 OBJETIVOS DESTE CAPTULO .......................................................................................................................................... 1 1.2 SISTEMA DE GERENCIAMENTO DE BANCO DE DADOS .................................................................................................... 1 1.3 BANCO DE DADOS RELACIONAL ..................................................................................................................................... 1 1.4 ARQUITETURA DO ORACLE ............................................................................................................................................ 4 CAPTULO 2: INTRODUO S CONSULTAS........................................................................................................ 6 2.1 OBJETIVOS DESTE CAPTULO .......................................................................................................................................... 6 2.2 O UTILITRIO SQL*PLUS.............................................................................................................................................. 6 2.3 CONSTRUO BSICA DE UMA CONSULTA...................................................................................................................... 6 2.4 EXPRESSES ARITMTICAS............................................................................................................................................. 7 2.5 NOMES ALTERNATIVOS PARA TTULOS DE COLUNAS....................................................................................................... 9 2.6 O OPERADOR DE CONCATENAO .................................................................................................................................. 9 2.7 LITERAIS ...................................................................................................................................................................... 10 2.8 MANUSEIO DE VALORES NULOS.................................................................................................................................... 10 2.9 ELIMINAO DE LINHAS DUPLICADAS .......................................................................................................................... 12 2.10 ORDENAO DAS LINHAS ........................................................................................................................................... 13 2.11 CRITRIOS DE PESQUISA ............................................................................................................................................. 14 2.12 CONSULTAS COM CONDIES MLTIPLAS .................................................................................................................. 18 2.13 PRECEDNCIA DOS OPERADORES................................................................................................................................ 19 2.14 RESUMO DO COMANDO SELECT ............................................................................................................................... 20 2.15 EXERCCIOS................................................................................................................................................................ 20 2.16 RESPOSTAS DOS EXERCCIOS ...................................................................................................................................... 23 CAPTULO 3: VARIVEIS DE SUBSTITUIO ..................................................................................................... 24 3.1 OBJETIVOS DESTE CAPTULO ........................................................................................................................................ 24 3.2 VARIVEIS DE SUBSTITUIO COM UM "&" ................................................................................................................. 24 3.3 VARIVEIS DE SUBSTITUIO COM DOIS "&" ............................................................................................................... 24 CAPTULO 4: FUNES NUMRICAS E DE CARACTERES.............................................................................. 25 4.1 OBJETIVOS DESTE CAPTULO ........................................................................................................................................ 25 4.2 FUNES QUE MANIPULAM CARACTERES .................................................................................................................... 25 4.2.1 LOWER(coluna | literal) ..................................................................................................................................... 25 4.2.2 UPPER(coluna | literal) ...................................................................................................................................... 25 4.2.3 INITCAP(coluna | literal) ................................................................................................................................... 25 4.2.4 LPAD(coluna | literal, tamanho, 'caracter') ....................................................................................................... 25 4.2.5 RPAD(coluna | literal, tamanho, 'caracter') ....................................................................................................... 26 4.2.6 SUBSTR(coluna | literal, posio, comprimento) ............................................................................................... 26 4.2.7 INSTR(coluna | literal, seqncia de caracteres', posio, n) ........................................................................... 26 4.2.8 LTRIM(coluna | literal, 'caracteres')................................................................................................................... 27 4.2.9 RTRIM(coluna | literal, 'caracteres') .................................................................................................................. 27 4.2.10 SOUNDEX(coluna | literal) .............................................................................................................................. 27 4.2.11 LENGTH(coluna | literal) ................................................................................................................................. 28 4.2.12 TRANSLATE(coluna | literal, de, para) ............................................................................................................ 28 4.2.13 REPLACE(coluna | literal, de, para) ................................................................................................................ 28 4.2.14 Funes aninhadas............................................................................................................................................ 29 4.3 FUNES NUMRICAS .................................................................................................................................................. 30 4.3.1 ROUND(coluna | literal, n) ................................................................................................................................. 30 4.3.2 TRUNC(coluna | literal, n) .................................................................................................................................. 30 4.3.3 CEIL(coluna | literal) .......................................................................................................................................... 30 4.3.4 FLOOR(coluna | literal)...................................................................................................................................... 30 4.3.5 POWER(coluna | literal, n) ................................................................................................................................. 31 4.3.6 EXP(coluna | literal) ........................................................................................................................................... 31 4.3.7 LOG(base, coluna | literal) ................................................................................................................................. 31 4.3.8 LN(coluna | literal).............................................................................................................................................. 31 4.3.9 SQRT(coluna | literal) ......................................................................................................................................... 31 4.3.10 SIGN(coluna | literal)........................................................................................................................................ 32 4.3.11 ABS(coluna | literal).......................................................................................................................................... 32 4.3.12 MOD(valor1, valor2) ........................................................................................................................................ 32

160

4.3.13 Funes trigonomtricas ................................................................................................................................... 33 4.3.14 Funes hiperblicas ........................................................................................................................................ 33 4.4 EXERCCIOS.................................................................................................................................................................. 33 4.5 RESPOSTAS DOS EXERCCIOS ........................................................................................................................................ 36 CAPTULO 5: FUNES DE DATA E DE CONVERSO ...................................................................................... 37 5.1 OBJETIVOS DESTE CAPTULO ........................................................................................................................................ 37 5.2 FUNES QUE MANIPULAM DATAS ............................................................................................................................... 37 5.2.1 SYSDATE............................................................................................................................................................. 37 5.2.2 Aritmtica de datas.............................................................................................................................................. 37 5.2.3 MONTHS_BETWEEN(data1,data2) ................................................................................................................... 37 5.2.4 ADD_MONTHS(data, meses).............................................................................................................................. 38 5.2.5 NEXT_DAY(data, dia_da_semana)..................................................................................................................... 38 5.2.6 LAST_DAY(data)................................................................................................................................................. 38 5.2.7 ROUND(data) ..................................................................................................................................................... 39 5.2.7 TRUNC(data) ...................................................................................................................................................... 39 5.3 FUNES DE CONVERSO ............................................................................................................................................ 39 5.3.1 Formatos de Data ............................................................................................................................................... 39 5.3.2 TO_CHAR(nmero|data,['formato']) .................................................................................................................. 40 5.3.3 Formatos Numricos ........................................................................................................................................... 41 5.3.4 TO_NUMBER(cadeia_de_caracteres) ................................................................................................................ 42 5.3.5 TO_DATE('cadeia_de_caracteres','formato') ..................................................................................................... 42 5.4 FUNES QUE ACEITAM QUALQUER TIPO DE DADO ...................................................................................................... 42 5.4.1 DECODE(coluna|expresso,pes1,res1,[pes2,res2,...],default)........................................................................... 42 5.4.2 NVL(coluna|valor, valor) .................................................................................................................................... 44 5.4.3 GREATEST(coluna|valor, coluna|valor,...) ........................................................................................................ 44 5.4.4 LEAST(coluna|valor, coluna|valor,...) ................................................................................................................ 44 5.4.5 VSIZE(coluna|valor) ........................................................................................................................................... 45 5.4.5 Funes aninhadas revisitadas ........................................................................................................................... 45 5.5 EXERCCIOS.................................................................................................................................................................. 45 5.6 RESPOSTAS DOS EXERCCIOS ........................................................................................................................................ 48 CAPITULO 6: FUNES DE GRUPO........................................................................................................................ 49 6.1 OBJETIVOS DESTE CAPTULO ........................................................................................................................................ 49 6.2 FUNES DISPONVEIS.................................................................................................................................................. 49 6.3 USANDO FUNES DE GRUPO ....................................................................................................................................... 49 6.4 A CLUSULA GROUP BY ............................................................................................................................................ 50 6.5 EXCLUINDO LINHAS DOS GRUPOS ................................................................................................................................. 50 6.6 GRUPOS DENTRO DE GRUPOS ....................................................................................................................................... 51 6.7 FUNES DE GRUPO E RESULTADOS INDIVIDUAIS ......................................................................................................... 51 6.8 A CLUSULA HAVING ................................................................................................................................................ 52 6.9 ORDEM DAS CLUSULAS .............................................................................................................................................. 53 6.10 EXERCCIOS................................................................................................................................................................ 54 6.11 RESPOSTAS DOS EXERCCIOS ...................................................................................................................................... 56 CAPTULO 7: EXTRAINDO DADOS DE MAIS DE UMA TABELA ..................................................................... 57 7.1 OBJETIVOS DESTE CAPTULO ........................................................................................................................................ 57 7.2 JUNES EQUIVALENTES .............................................................................................................................................. 57 7.3 PRODUTO ..................................................................................................................................................................... 58 7.4 JUNES NO EQUIVALENTES ...................................................................................................................................... 58 7.5 REGRA PARA JUNO DE TABELAS ............................................................................................................................... 59 7.6 SUMRIO DA SINTAXE .................................................................................................................................................. 59 7.7 EXERCCIOS.................................................................................................................................................................. 59 7.8 SOLUO DOS EXERCCIOS ........................................................................................................................................... 62 CAPTULO 8: OUTROS MTODOS DE JUNO .................................................................................................. 63 8.1 OBJETIVOS DESTE CAPTULO ........................................................................................................................................ 63 8.2 JUNES EXTERNAS ..................................................................................................................................................... 63 8.3 JUNO DE UMA TABELA COM ELA MESMO .................................................................................................................. 63 8.4 JUNES VERTICAIS ..................................................................................................................................................... 64

161

8.4.1 Unio ................................................................................................................................................................... 64 8.4.2 Interseo ............................................................................................................................................................ 64 8.4.3 Subtrao ............................................................................................................................................................ 65 8.4.4 Combinao de operadores ................................................................................................................................ 65 8.4.5 A clusula ORDER BY ........................................................................................................................................ 65 8.4.6 Regras para utilizar junes verticais ................................................................................................................. 65 8.5 EXERCCIOS.................................................................................................................................................................. 66 8.6 RESPOSTAS DOS EXERCCIOS ........................................................................................................................................ 68 CAPTULO 9: CONSULTAS ANINHADAS ............................................................................................................... 69 9.1 OBJETIVOS DESTE CAPTULO ........................................................................................................................................ 69 9.2 DEFINIO DE CONSULTAS ANINHADAS ....................................................................................................................... 69 9.3 CONSULTAS INTERNAS QUE RETORNAM APENAS UM VALOR ......................................................................................... 69 9.4 COMO AS CONSULTAS ANINHADAS SO EXECUTADAS .................................................................................................. 70 9.5 CONSULTAS INTERNAS QUE RETORNAM MAIS DE UM VALOR ........................................................................................ 70 9.6 OPERADORES ANY E ALL ........................................................................................................................................... 71 9.7 CLUSULA HAVING COM CONSULTAS ANINHADAS .................................................................................................... 72 9.8 ORDENAO EM CONSULTAS ANINHADAS .................................................................................................................... 73 9.9 LIMITE PARA O ANINHAMENTO ..................................................................................................................................... 73 9.10 CONSULTA INTERNA CORRELACIONADA ..................................................................................................................... 73 9.11 O OPERADOR EXISTS................................................................................................................................................ 74 9.12 EXERCCIOS................................................................................................................................................................ 75 9.13 RESPOSTA DOS EXERCCIOS ........................................................................................................................................ 78 CAPTULO 10: GERAO DE RELATRIOS ........................................................................................................ 80 10.1 OBJETIVOS DESTE CAPTULO ...................................................................................................................................... 80 10.2 CONJUNTO DE COMANDOS SET DO SQL*PLUS ........................................................................................................ 80 10.3 COLUMN ................................................................................................................................................................. 80 10.3.1 Formato de exibio para as colunas ............................................................................................................... 81 10.3.2 Outras opes de exibio das colunas. ........................................................................................................... 81 10.4 EXEMPLO DE FORMATAO DE COLUNAS................................................................................................................... 81 10.5 EXEMPLO DE FORMATAO DE TTULO ...................................................................................................................... 82 10.6 EXEMPLO DE REMOO DA FORMATAO ................................................................................................................. 83 CAPTULO 11: GERAO DE RELATRIOS - PARTE 2 .................................................................................... 84 11.1 OBJETIVOS DESTE CAPTULO ...................................................................................................................................... 84 11.2 PROPRIEDADES DOS CABEALHOS E DOS RODAPS .................................................................................................... 84 11.3 A CLUSULA NEW_VALUE ..................................................................................................................................... 85 11.4 QUEBRAS NOS RELATRIOS ........................................................................................................................................ 86 11.5 CLCULO DE SUMRIOS ............................................................................................................................................. 87 11.6 RELATRIO MATRICIAL .............................................................................................................................................. 89 11.7 ARQUIVO DE COMANDOS PARA O SQL*PLUS ........................................................................................................... 91 11.8 EXERCCIOS................................................................................................................................................................ 93 11.9 RESPOSTAS DOS EXERCCIOS ...................................................................................................................................... 95 CAPTULO 12: HIERARQUIAS - CAMINHANDO NA RVORE ......................................................................... 96 12.1 OBJETIVOS DESTE CAPTULO ...................................................................................................................................... 96 12.2 QUANDO POSSVEL CAMINHAR NA RVORE ............................................................................................................. 96 12.3 EXCLUINDO UM N DA RVORE ................................................................................................................................. 98 12.4 TERMINOLOGIA ........................................................................................................................................................ 100 12.5 EXERCCIOS.............................................................................................................................................................. 100 CAPTULO 13: DICIONRIO DE DADOS .............................................................................................................. 101 13.1 OBJETIVOS DESTE CAPTULO .................................................................................................................................... 101 13.2 O QUE O DICIONRIO DE DADOS ............................................................................................................................ 101 13.3 INFORMAES CONTIDAS NO DICIONRIO DE DADOS ............................................................................................... 101 13.4 TABELAS DO DICIONRIO DE DADOS ........................................................................................................................ 101 13.5 VISES DO DICIONRIO DE DADOS............................................................................................................................ 101 13.6 EXEMPLOS DE UTILIZAO DO DICIONRIO DE DADOS ............................................................................................. 106 13.7 EXERCCIOS.............................................................................................................................................................. 108

162

CAPTULO 14: LINGUAGEM DE DEFINIO DE DADOS................................................................................ 110 14.1 OBJETIVOS DESTE CAPTULO .................................................................................................................................... 110 14.2 ESTRUTURA DE DADOS DO ORACLE ......................................................................................................................... 110 14.3 CRIANDO UMA TABELA ............................................................................................................................................ 110 14.4 RECOMENDAES SOBRE OS NOMES DAS TABELAS .................................................................................................. 111 14.5 TIPO DE DADO DAS COLUNAS ................................................................................................................................... 111 14.6 RELAO ENTRE OS TIPOS DE DADOS ANSI E DO ORACLE ....................................................................................... 112 14.7 RELAO ENTRE OS TIPOS DE DADOS DO SQL/DS E DO ORACLE ............................................................................. 112 14.8 CRIAO DE TABELAS .............................................................................................................................................. 112 14.8.1 Sintaxe do comando: ....................................................................................................................................... 112 14.8.2 Criao das tabelas do curso: ........................................................................................................................ 113 14.8.3 Exemplos de restries .................................................................................................................................... 114 14.9 CRIANDO UMA TABELA A PARTIR DE OUTRA TABELA................................................................................................ 115 14.10 ALTERANDO UMA TABELA ..................................................................................................................................... 116 14.11 TROCANDO O NOME DE UMA TABELA ..................................................................................................................... 117 14.12 DESCRIO DAS TABELAS E COLUNAS .................................................................................................................... 118 14.13 REMOVENDO TABELAS ........................................................................................................................................... 118 14.14 EXERCCIOS............................................................................................................................................................ 118 CAPTULO 15: LINGUAGEM DE MANIPULAO DE DADOS........................................................................ 121 15.1 OBJETIVOS DESTE CAPTULO .................................................................................................................................... 121 15.2 INSERINDO NOVAS LINHAS EM UMA TABELA ............................................................................................................ 121 15.3 ATUALIZANDO LINHAS EM UMA TABELA .................................................................................................................. 123 15.4 ELIMINANDO LINHAS DE UMA TABELA...................................................................................................................... 124 15.5 EXERCCIOS.............................................................................................................................................................. 125 15.6 RESPOSTAS DOS EXERCCIOS .................................................................................................................................... 126 CAPTULO 16: PROCESSAMENTO DE TRANSAES...................................................................................... 127 16.1 OBJETIVOS DESTE CAPTULO .................................................................................................................................... 127 16.2 O QUE UMA TRANSAO ....................................................................................................................................... 127 16.3 EFETIVANDO AS MUDANAS..................................................................................................................................... 127 16.4 REMOVENDO MUDANAS ......................................................................................................................................... 128 16.5 FALHAS DO SISTEMA ................................................................................................................................................ 128 16.6 O SIGNIFICADO DE UMA TRANSAO ........................................................................................................................ 128 16.7 CONTROLANDO TRANSAES................................................................................................................................... 128 16.8 COMMIT [WORK] ................................................................................................................................................. 128 16.9 SAVEPOINT SAVEPOINT_NAME ............................................................................................................................. 129 16.10 ROLLBACK[WORK] TO [SAVEPOINT] SAVEPOINT_NAME............................................................................... 129 16.11 ROLLBACK A NVEL DE DECLARAO..................................................................................................................... 130 16.12 ROLLBACKS IMPLCITOS ......................................................................................................................................... 130 16.13 AUTOCOMMIT ........................................................................................................................................................ 130 16.14 EXEMPLO DE UTILIZAO DE COMMIT E ROLLBACK........................................................................................ 130 16.15 CONSISTNCIA DE LEITURA .................................................................................................................................... 133 16.16 TRANSAES SOMENTE DE LEITURA ...................................................................................................................... 134 CAPTULO 17: CONCORRNCIA E BLOQUEIO ................................................................................................. 136 17.1 OBJETIVOS DESTE CAPTULO .................................................................................................................................... 136 17.2 INTRODUO AO BLOQUEIO ..................................................................................................................................... 136 17.3 O QUE UM BLOQUEIO ............................................................................................................................................. 136 17.4 QUANDO OS BLOQUEIOS SO NECESSRIOS .............................................................................................................. 136 17.5 QUANDO OS BLOQUEIOS SO LIBERADOS ................................................................................................................. 137 17.6 TIPOS DE BLOQUEIOS ................................................................................................................................................ 137 17.6.1 Bloqueios do dicionrio de dados (DDL) ....................................................................................................... 137 17.6.2 Bloqueios da manipulao de dados (DML) ................................................................................................... 137 17.7 NVEIS DE BLOQUEIO ................................................................................................................................................ 137 17.8 DESCRIO DOS BLOQUEIOS .................................................................................................................................... 137 17.9 BLOQUEIOS IMPLCITOS ............................................................................................................................................ 139 17.10 BLOQUEIOS EXPLCITOS.......................................................................................................................................... 140 17.11 IDENTIFICAO DA LINHA E BLOQUEIO ................................................................................................................... 140

163

17.12 IMPASSE (DEADLOCK)............................................................................................................................................ 141 CAPTULO 18 - VISES ............................................................................................................................................. 143 18.1 OBJETIVOS DESTE CAPTULO .................................................................................................................................... 143 18.2 O QUE UMA VISO ................................................................................................................................................. 143 18.3 CLASSIFICAO DAS VISES ..................................................................................................................................... 143 18.3.1 Vises simples ................................................................................................................................................. 143 18.3.2 Vises complexas............................................................................................................................................. 143 18.4 O COMANDO CREATE VIEW ................................................................................................................................. 144 18.5 USANDO UMA VISO PARA OPERAES DE DML ..................................................................................................... 145 18.6 ALTERANDO DADOS ATRAVS DAS VISES ............................................................................................................... 147 18.7 ELIMINAO DE VISES ........................................................................................................................................... 147 18.8 EXERCCIOS.............................................................................................................................................................. 148 18.9 RESPOSTAS DOS EXERCCIOS .................................................................................................................................... 150 CAPTULO 19 - NDICES ........................................................................................................................................... 151 19.1 OBJETIVOS DESTE CAPTULO .................................................................................................................................... 151 19.2 FINALIDADES DOS NDICES ....................................................................................................................................... 151 19.3 ESTRUTURA DOS NDICES ......................................................................................................................................... 151 19.4 TIPOS DE NDICES ..................................................................................................................................................... 151 19.5 CRIAO DOS NDICES .............................................................................................................................................. 152 19.5.1 Criao de um ndice para melhorar o acesso. .............................................................................................. 152 19.5.2 Criao de um ndice para garantir unicidade. .............................................................................................. 152 19.6 ELIMINAO DOS NDICES ........................................................................................................................................ 152 19.7 QUANDO UM NDICE UTILIZADO ............................................................................................................................. 152 19.8 NDICES E JUNES .................................................................................................................................................. 153 19.9 SUGESTES PARA CRIAO DOS NDICES .................................................................................................................. 153 19.10 EXERCCIOS............................................................................................................................................................ 153 19.11 RESPOSTAS DOS EXERCCIOS .................................................................................................................................. 154 CAPTULO 20: SEQNCIAS................................................................................................................................... 155 20.1 OBJETIVOS DESTE CAPTULO .................................................................................................................................... 155 20.2 O GERADOR DE SEQNCIAS .................................................................................................................................... 155 20.1 GERAO DE NMEROS SEQENCIAIS COM NEXTVAL .......................................................................................... 155 20.1 VALOR ATUAL DA SEQNCIA .................................................................................................................................. 156 20.2 REGRAS PARA UTILIZAR CURRVAL E NEXTVAL ................................................................................................. 156 20.3 ALTERANDO UMA SEQNCIA .................................................................................................................................. 157 20.4 CONCEDENDO PRIVILGIOS EM SEQNCIAS ............................................................................................................ 157 20.5 ELIMINANDO UMA SEQNCIA ................................................................................................................................. 157 20.6 LISTANDO SEQNCIAS ............................................................................................................................................ 158 APNDICE A - TABELAS DO CURSO .................................................................................................................... 159

164