Capítulo 1: Conceitos de Banco de Dados

1.1 Objetivos deste capítulo Introduzir os conceitos básico 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 modificações, e os acessos às informações do banco de dados.

O SGBD atua como interface entre os usuários e as informações armazenadas. Todas as solicitações relativas aos dados do banco de dados são interceptadas, interpretadas, e executadas pelo SGBD. Nenhum acesso aos dados pode ser feito de outra maneira. Desta forma, o SGBD isola o usuário de todos os detalhes particulares do hardware ou do sistema operacional sendo utilizado, tais como método de acesso e blocagem de disco. A forma de acesso do usuário ao banco de dados não deve mudar quando o hardware ou o sistema operacional mudam. Existem modelos alternativos para se implementar um SGBD, sendo que os mais comuns são hierárquico, 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 usuário como uma coleção de tabelas relacionadas, e nada além de tabelas. Os três elementos de um banco de dados relacional são: • tabelas • colunas • linhas

1

Os operadores relacionais são: Seleção/Restrição é uma operação que recupera e mostra dados de uma tabela. É possível recuperar todas as linhas, ou apenas algumas que satisfaçam uma determinada condição ou a várias condições. Esta operação é chamada também de subconjunto horizontal. é uma operação 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 concatenação de duas tabelas. Todas as linhas da primeira tabela são concatenadas com todas as linhas da segunda tabela. é o resultado obtido pela concatenação de duas tabelas de acordo com condições específicas. Apenas as linhas que atendem as condições estabelecidas são concatenadas. Seleção/Restrição

Projeção

União Interseção Diferença Produto

Junção

Projeção

2

União

Interseção

Diferença

3

Quanto maior for a SGA melhor será o desempenho do Oracle. Cont. 1. que contém dados e informações de controle.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 memória: System Global Area (SGA) é uma região compartilhada de memória alocada pelo SGBD Oracle. Os dados da SGA são compartilhados por 4 .Produto João José Manoel x Pintor Escritor = João João José José Manoel Manoel Pintor Escritor Pintor Escritor Pintor Escritor Junção João José Maria Ana 10 10 20 30 10 20 30 40 Vendas Pesq. Secret. João José Maria Ana 10 10 20 30 10 10 20 30 Vendas Vendas Pesq. Cont.

Uma PGA é criada pelo Oracle quando um processo servidor é iniciado. Contém todas as informações relativas às alterações efetuadas no banco de dados para permitir a recuperação. Cada usuário conectado possui um Processo Usuário. incluindo ‘database buffers’. Processos: Os processos são divididos em Processos Usuário e Processos do Oracle. Registra a estrutura física do banco de dados. Entre os processos do Oracle estão os Processos Servidores. e os Processos Background. As informações armazenadas na SGA estão divididas por tipo de estrutura de memória. Control Files 5 . através do qual se comunica com o Oracle. O Banco de dados: Data Files Redo Log Files Contém todos os dados do banco de dados.todos os usuários que estão acessando o banco de dados. que executam as solicitações emitidas pelo Processos Usuários. ‘redo log buffers’ e ‘shared poll’. Program Global Area (PGA) é uma área de memória que contém dados e informações de controle para um processo servidor.

Capítulo 2: Introdução às Consultas
2.1 Objetivos deste capítulo Este capítulo faz uma introdução à linguagem de consulta utilizada para acessar o Banco de Dados Oracle. Em particular, são discutidas as declarações utilizadas para:
• • • • • •

realizar cálculos manusear valores nulos corretamente nomes alternativos para títulos das colunas concatenar colunas ordenar linhas fornecer critérios de pesquisa

2.2

O utilitário SQL*PLUS O SQL*PLUS é uma interface através da qual os comandos SQL podem ser entrados e executados. O SQL*PLUS possui outros comandos, que permitem formatar a saída dos comandos SQL, além 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 usuário digite ALUNO1, e quando for solicitada a senha forneça ALUNO1 novamente. As linhas de comando do SQL*PLUS são prefixadas por: SQL>. As linhas de continuação são numeradas. Todo o curso está baseado na utilização desta ferramenta pelos participantes. Os comandos podem ser escritos em uma ou mais linhas.

2.3

Construção básica de uma consulta O comando SELECT recupera informações do banco de dados, implementando todos os operadores da álgebra relacional. Em sua forma mais simples deve incluir: a. A cláusula SELECT, que lista as colunas a serem envolvidas (essencialmente a Projeção, conforme definido na álgebra relacional). b. A cláusula FROM, que especifica as tabelas envolvidas. Para listar os números de todos os departamentos, nomes dos empregados e números 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.

É possível selecionar todas as colunas da tabela colocando-se um "*" (asterisco) após 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

Expressões aritméticas Uma expressão é a combinação de um ou mais valores, operadores e funções, que resultam em um valor calculado. As expressões aritméticas podem conter nomes de colunas, constantes numéricas, e operadores aritméticos. Os operadores são + - * e / , para soma, subtração, multiplicação e divisão, respectivamente. No exemplo abaixo calcula-se o salário anual multiplicando-se o salário mensal por doze.
SQL> SELECT ENAME, SAL*12, COMM 2 FROM EMP

7

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 expressão aritmética contiver mais de um operador, multiplicação e divisão são de mesma precedência, porém com precedência superior a adição e subtração, que também são de mesma precedência. No caso de operadores com a mesma precedência, o da esquerda é processado primeiro. No exemplo abaixo, a multiplicação (250*12) é realizada primeiro, e depois somada ao salário.
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

Parênteses podem ser utilizados para especificar a ordem na qual os operadores serão executados. Se, por exemplo, for necessário somar 250 ao salário 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

8

devemos escrever: SQL> SELECT EMPNO||ENAME EMPREGADO 2 FROM EMP 9 . o nome do Aliás é convertido para letras maiúsculas. para criar uma expressão do tipo caracter. nas outras cláusulas não.BLAKE CLARK SCOTT KING TURNER ADAMS JAMES FORD MILLER 37200 32400 39000 63000 21000 16200 14400 39000 18600 2. SAL*12 “SALARIO ANUAL”.6 O operador de concatenação O operador de concatenação (||) permite juntar colunas. podemos escrever: SQL> SELECT ENAME NOME.-------------. Colunas dos dois lados do operador são combinadas para formar uma só coluna. e não pode conter espaços em branco. O Aliás é especificado escrevendo-se um texto após item a ser mostrado na cláusula SELECT. Por padrão. Nota: somente na cláusula SELECT o Aliás pode ser usado. Para combinar o número do empregado com o nome do empregado em uma coluna apenas.5 Nomes alternativos para títulos de colunas Para mostrar o resultado de uma consulta. 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. Para mostrar como título da coluna SALARIO ANUAL no lugar de SAL*12. utilizando EMPREGADO como título. 2. a menos que seja colocado entre aspas. Em muitos casos. Pode ser alterado o título da coluna usando-se um Aliás. isto torna o título sem significado. o SQL*PLUS normalmente utiliza o nome da coluna como título da coluna. ou valores constantes. expressões aritméticas.

incluido na cláusula SELECT. O comando abaixo contém literal concatenado com colunas.7 Literais Um literal é qualquer caracter. O literal da cláusula SELECT é listado em todas as linhas mostradas pelo comando. Literais dos tipos data e caracter devem ser envoltos por apóstrofos ('). que não é um nome ou Aliás da coluna. ou número. 2. 2. e um Aliás para a primeira coluna. SQL> SQL> 2 3 4 COLUMN EMPREGADO FORMAT A20 SELECT EMPNO||'-'||ENAME EMPREGADO. expressão.EMPREGADO -------------------------------------------------7369SMITH 7499ALLEN 7521WARD 7566JONES 7654MARTIN 7698BLAKE 7782CLARK 7788SCOTT 7839KING 7844TURNER 7876ADAMS 7900JAMES 7902FORD 7934MILLER 14 rows selected.------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. DEPTNO FROM EMP 'TRABALHANODEPARTAMENTO' DEPTNO -----------------------. 'TRABALHA NO DEPARTAMENTO'. Literais numéricos não precisam de apóstrofos.8 Manuseio de valores nulos 10 .

Zero é um número.Se em uma linha não existir valor para uma determinada coluna. SQL> SELECT ENAME. SAL*12+NVL(COMM. SAL*12+COMM SALARIO_ANUAL 2 FROM EMP ENAME SALARIO_ANUAL ---------. A função NVL espera dois argumentos: a) uma expressão 11 . este valor é dito como sendo nulo. conforme mostrado abaixo: SQL> SELECT ENAME. Um valor nulo não é o mesmo que zero. 0) SALARIO_ANUAL 2 FROM EMP ENAME SALARIO_ANUAL ---------. No exemplo abaixo. deve ser utilizada a expressão NVL. pois somente estes tem comissão não nula.------------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. Se o valor de qualquer coluna envolvida em uma expressão for nulo.------------SMITH ALLEN 19500 WARD 15500 JONES MARTIN 16400 BLAKE CLARK SCOTT KING TURNER 18000 ADAMS JAMES FORD MILLER 14 rows selected. é desconhecido. Um valor nulo é um valor que não está disponível. somente aparecem os salários anuais dos vendedores. o resultado da expressão também será nulo. que converte um valor nulo em um valor não nulo. ou não é aplicável. Para calcular o resultado corretamente.

números. 9) NVL(ColunaCaracter. 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. ‘01-jan-84') NVL(ColunaNumero. SQL> SELECT DISTINCT DEPTNO 2 FROM EMP DEPTNO ------10 20 30 Múltiplas colunas podem ser especificadas após a palavra DISTINCT.b) um valor não nulo Podem ser convertidos valores nulos de data. ‘alfanumérico') 2. deve ser incluída a palavra DISTINCT após o SELECT. SQL> SELECT DISTINCT DEPTNO.9 Eliminação de linhas duplicadas A não ser que seja especificado o contrário. JOB 2 FROM EMP DEPTNO ------10 10 10 20 20 20 JOB --------CLERK MANAGER PRESIDENT ANALYST CLERK MANAGER 12 . as linhas duplicadas não são eliminadas dos resultados das consultas. ou caracteres: NVL(ColunaData.

Caracteres: ordem alfabética Para reverter esta ordem. na cláusula ORDER BY. pode ser utilizada a palavra DESC após o nome da coluna. SAL*12. 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 . Para listarmos os funcionários mais novos antes dos mais antigos fazemos: SQL> SELECT ENAME. 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 --------. usamos: SQL> SELECT ENAME. Ordem padrão de ordenação: .10 Ordenação das linhas Normalmente.30 CLERK 30 MANAGER 30 SALESMAN Acima estão mostradas todas as combinações diferentes de departamentos e cargos. JOB. JOB. Se for usada.------. a ordem das linhas retornadas por uma consulta é indefinida. Para ordenar pelo nome do empregado.Data: mais cedo primeiro .Números: menores primeiro . A cláusula ORDER BY pode ser usada para ordenar linhas. 2.------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. ORDER BY deve ser sempre a última cláusula de um comando SELECT.

Os operadores lógicos testam as seguintes condições: = > >= < <= igual maior maior ou igual menor menor ou igual 14 .Um operador de comparação .Um nome de coluna. ou funções. SQL> SELECT DEPTNO. Nesta cláusula estão estabelecidos os critérios necessários para uma linha poder ser selecionada.11 Critérios de pesquisa Os critérios de pesquisa são informados na cláusula WHERE. sendo algumas em ordem ascendente e outras em ordem descendente.Um nome de coluna . Três elementos são sempre necessários: . ENAME 2 FROM EMP 3 ORDER BY DEPTNO. expressões aritméticas. que corresponde ao operador Restrição da álgebra relacional. A cláusula WHERE pode comparar valores em colunas. JOB. valores literais. 2. 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 Exercício: verificar como ficam os valores nulos após a ordenação. ou lista de valores Existem dois tipos de operadores: lógicos e SQL. constante.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 É possível efetuar a ordenação por mais de uma coluna.

DEPTNO 2 FROM DEPT 3 WHERE DEPTNO > 20 DNAME DEPTNO -------------.<> diferente (^= ou !=) Para listar os nomes.--------.. SAL 2 FROM EMP 3 WHERE SAL BETWEEN 1000 AND 2000 ENAME SAL ---------.------.AND..------MARTIN 1250 1400 Existem quatro operadores SQL. COMM 2 FROM EMP 3 WHERE COMM > SAL ENAME SAL COMM ---------. SQL> SELECT ENAME. BETWEEN. que operam sobre todos os tipos de dados.------ALLEN 1600 WARD 1250 MARTIN 1250 TURNER 1500 ADAMS 1100 MILLER 1300 15 . JOB. usamos: SQL> SELECT DNAME..------SALES 30 OPERATIONS 40 Para sabermos que funcionários tem comissão superior ao salário. números. EMPNO. usamos: SQL> SELECT ENAME. cargos e departamentos de todos os funcionários com cargo CLERK. IN(lista) LIKE IS NULL entre dois valores (inclusive) idênticos a uma lista de valores semelhante a um modelo de caracteres valor é nulo O operador BETWEEN testa valores no intervalo ou idênticos aos limites.------SMITH 7369 CLERK 20 ADAMS 7876 CLERK 20 JAMES 7900 CLERK 30 MILLER 7934 CLERK 10 Para listar o nome e o número dos departamentos com número maior que 20. usamos: SQL> SELECT ENAME. DEPTNO 2 FROM EMP 3 WHERE JOB = ‘CLERK' ENAME EMPNO JOB DEPTNO ---------.------. SAL..

MGR 2 FROM EMP 3 WHERE MGR IS NULL ENAME MGR ---------. devem ser envoltos por apóstrofos. 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.------SMITH 800 7902 SCOTT 3000 7566 ADAMS 1100 7788 FORD 3000 7566 Se caracteres ou datas forem utilizados. mas apenas um. usamos: SQL> SELECT ENAME.------KING 16 . Usando o operador LIKE é possível selecionar linhas de acordo com modelo fornecido. ENAME. O símbolo "%" representa qualquer seqüência de zero ou mais caracteres. SQL> SELECT EMPNO.O operador IN testa os valores especificados em uma lista.------. usamos: SQL> SELECT ENAME 2 FROM EMP 3 WHERE ENAME LIKE 'S%' ENAME ---------SMITH SCOTT Para listar os nomes de todos os empregados que contém exatamente 4 letras. MGR 2 FROM EMP 3 WHERE MGR IN ( 7902. Para listar os funcionários que não possuem gerente. no mínimo e no máximo. Para listarmos todos os empregados cujos nomes começam com a letra "S". 7788 ) EMPNO ------7369 7788 7876 7902 ENAME SAL MGR ---------. O símbolo "_" (sublinhado) representa qualquer um caracter. 7566. SAL.

Para listar os empregados cujos cargos não começam com a letra M. usamos: SQL> SELECT ENAME. MGR 2 FROM EMP 3 WHERE MGR IS NOT NULL ENAME MGR ---------. usamos: SQL> SELECT ENAME.------SMITH 7902 17 .------SMITH 800 JONES 2975 BLAKE 2850 CLARK 2450 SCOTT 3000 KING 5000 JAMES 950 FORD 3000 8 rows selected. 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. SAL 2 FROM EMP 3 WHERE SAL NOT BETWEEN 1000 AND 2000 ENAME SAL ---------. usamos: SQL> SELECT ENAME.Os operadores mostrados abaixo podem ser utilizados para testes de negação: != ^= <> NOT NomeDaColuna = NOT NomeDaColuna > NOT BETWEEN NOT IN NOT LIKE IS NOT NULL não igual não igual a não maior do que fora da faixa especificada fora da lista especificada não semelhante ao modelo não é nulo Para listar os empregados com salários fora da faixa de 1000 a 2000.

O predicado OR espera que uma (ou as duas) condições sejam verdadeiras. ou que recebem entre 1000 e 2000. SAL FROM EMP WHERE SAL BETWEEN 1000 AND 2000 AND JOB = 'CLERK' ENAME ---------ADAMS MILLER JOB SAL --------. JOB. porém os predicados são diferentes.------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 expressão lógica. Nulo nunca é igual a nada nem diferente de nada.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. JOB.12 Consultas com condições múltiplas Os operadores AND e OR podem ser utilizados para criar expressões lógicas compostas. usamos: SQL> 2 3 4 SELECT EMPNO. ENAME. todos os ANDs são processados antes que os ORs sejam processados.------CLERK 1100 CLERK 1300 EMPNO ------7876 7934 Para listar os funcionários que são CLERK. 18 . O predicado AND espera que todas duas condições sejam verdadeiras. nem a outro nulo. SAL FROM EMP WHERE SAL BETWEEN 1000 AND 2000 OR JOB = ‘CLERK' ENAME ---------SMITH ALLEN WARD MARTIN TURNER ADAMS JAMES MILLER JOB SAL --------. ENAME. Nos exemplos abaixo as condições são as mesmas. 2. Para listar todos os CLERKs com salário entre 1000 e 2000. usamos: SQL> 2 3 4 SELECT EMPNO.

ENAME. 2.Uma vez que AND tem precedência sobre OR.13 Precedência dos operadores a) os operadores de comparação e os operadores SQL tem precedências iguais.------. SAL... SAL.------SALESMAN 1600 30 MANAGER 2975 20 MANAGER 2850 30 MANAGER 2450 10 EMPNO ------7499 7566 7698 7782 Os parênteses especificam a ordem em que os operadores devem ser calculados.------7566 JONES MANAGER 7839 31-OCT-83 2975 20 19 . IS NULL b) NOT (para reverter o resultado lógico da expressão. =. a consulta abaixo retorna todos os gerentes com salário maior do que 1500. >. DEPTNO FROM EMP WHERE SAL > 1500 AND ( JOB = 'MANAGER' OR JOB = ‘SALESMAN' ) ENAME ---------ALLEN JONES BLAKE CLARK JOB SAL DEPTNO --------.---------.------. !=. LIKE..AND. 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 ------. BETWEEN. de qualquer departamento. IN. JOB.--------. ENAME. e todos os vendedores. JOB. >=.------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 salário superior a 1500. usamos: SQL> 2 3 4 SELECT EMPNO.------. WHERE NOT(sal>2000)) c) AND d) OR Para listar todos os gerentes. DEPTNO FROM EMP WHERE SAL > 1500 AND JOB = 'MANAGER' OR JOB = 'SALESMAN' ENAME ---------ALLEN WARD JONES MARTIN BLAKE CLARK TURNER JOB SAL DEPTNO --------. <=..------. SQL> 2 3 4 5 SELECT EMPNO. <.--------.------.

------. ordenados pelo nome do departamento 20 .15 Exercícios a) Selecionar todas as informações da tabela SALGRADE GRADE LOSAL HISAL ------.--------.------.------1 700 1200 2 1201 1400 3 1401 2000 4 2001 3000 5 3001 9999 [DISTINCT] {* | coluna [aliás].------ALLEN 30 1600 WARD 30 1250 MARTIN 30 1250 TURNER 30 1500 ADAMS 20 1100 MILLER 10 1300 6 rows selected..------.------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.} tabela condições {coluna | expressão} [ASC|DESC] b) Selecionar todas a informações 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 --------. d) Listar os números e os nomes dos departamentos.. c) Listar todos os funcionários com salário entre 1000 e 2000 ENAME DEPTNO SAL ---------..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 parênteses são desnecessários. uma vez que o AND processa primeiro. 2.14 Resumo do comando SELECT SELECT FROM WHERE ORDER BY 2.------..------.

--------. ENAME ---------SMITH ALLEN WARD JONES MARTIN BLAKE CLARK SCOTT TURNER ADAMS JAMES JOB SAL --------. 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 funcionários que tem gerente.------CLERK 800 SALESMAN 1600 SALESMAN 1250 MANAGER 2975 SALESMAN 1250 MANAGER 2850 MANAGER 2450 ANALYST 3000 SALESMAN 1500 CLERK 1100 CLERK 950 21 .------.------.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 alfabética 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.------.

QUEM.------ALLEN 19200 300 TURNER 18000 0 WARD 15000 500 m) Selecione os dados para reproduzir a saída mostrada abaixo. o salário anual e comissão. 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 .--------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 QUE. O resultado deve ser ordenado com os maiores salários na frente.----------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 ---------. Se dois ou mais empregados tiverem o mesmo salário. ENAME REMUNERACAO ---------.FORD MILLER ANALYST CLERK 3000 1300 j) Mostrar o nome e a remuneração total de todos os empregados.------. de todos os vendedores com salário mensal maior do que a comissão. deve ser ordenado pelo nome do funcionário. ENAME SALARIO_ANUAL COMM ---------.

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. SAL 2 FROM EMP 3 WHERE SAL BETWEEN 1000 AND 2000 d) SQL> SELECT DEPTNO. ENAME m) SQL> SELECT ENAME||' TEM A POSICAO DE '||JOB|| 2 ' NO DEPARTAMENTO '||DEPTNO|| 3 ' DESDE '||HIREDATE "QUEM.2.0) REMUNERACAO 2 FROM EMP k) SQL> SELECT ENAME.20) 4 ORDER BY ENAME g) SQL> SELECT ENAME. HIREDATE 2 FROM EMP 3 WHERE HIREDATE LIKE '%83' l) SQL> SELECT ENAME. SAL 2 FROM EMP 3 WHERE MGR IS NOT NULL j) 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. DEPTNO. JOB. SAL*12+NVL(COMM. QUANDO" 4 FROM EMP 23 . O QUE. COMM 2 FROM EMP 3 WHERE SAL > COMM 4 AND JOB = 'SALESMAN' 5 ORDER BY SAL DESC.16 Respostas dos exercícios a) SQL> SELECT * 2 FROM SALGRADE b) SQL> SELECT * 2 FROM EMP c) SQL> SELECT ENAME. SAL*12 SALARIO_ANUAL.

Exemplo: &&NUMERO_DO_DEPARTAMENTO 24 . ENAME.2 Variáveis de substituição com um "&" A variável de substituição pode ser utilizada em uma declaração SELECT. 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 ---------. o SQL*PLUS solicita o valor da variável apenas uma vez. guardando este valor para uso subseqüente.Capítulo 3: Variáveis de Substituição 3. representando um valor a ser fornecido quando o comando for executado.3 Variáveis de substituição com dois "&" Quando são utilizados dois "&" na variável.------CLARK 2450 KING 5000 MILLER 1300 EMPNO ------7782 7839 7934 3. SQL> SELECT EMPNO. 3.1 Objetivos deste capítulo Descrever as variáveis de substituição e como estas são usadas nas declarações SQL.

2 UPPER(coluna | literal) Transforma letras minúsculas em maiúsculas. SQL> SELECT LOWER(DNAME).4 LPAD(coluna | literal.2. SQL> SELECT INITCAP(DNAME). 25 .2.1 LOWER(coluna | literal) Transforma letras maiúsculas em minúsculas. tamanho. Se o caracter de preenchimento não for informado. 'caracter') Preenche a sequência de caracteres. SQL> SELECT ENAME 2 FROM EMP 3 WHERE ENAME = UPPER('smith') ENAME ---------SMITH 4. 4. com o caracter e o tamanho informados. à esquerda. será utilizado o caracter de espaço.3 INITCAP(coluna | literal) Transforma a primeira letra da palavra em maiúscula e as demais minúsculas.1 Objetivos deste capítulo Este capítulo mostra as funções do Oracle que manipulam números e sequências de caracteres.2. INITCAP(LOC) 2 FROM DEPT INITCAP(DNAME) -------------------Accounting Research Sales Operations INITCAP(LOC) -------------------New York Dallas Chicago Boston 4.2. 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.Capítulo 4: Funções Numéricas e de Caracteres 4.2 Funções que manipulam caracteres 4.

..3... ‘*').2. INSTR(DNAME.. ‘*')...4) -------------------RACL RACL RACL RACL SUBSTR(DNAME. RPAD(DEPTNO.. tamanho. a partir da posição indicada....5 RPAD(coluna | literal..... 20....2..5) 2 FROM DEPT SUBSTR('ORACLE'.'*') -------------------ACCOUNTING********** RESEARCH************ SALES*************** OPERATIONS********** RPAD(DNAME.3.20..........2.. A primeira coluna foi preenchida com asteriscos... 2 INSTR(DNAME..'.... se os dois últimos parâmetros forem omitidos......2)..... com o caracter e o tamanho informados.20.2.1...'.........') -------------------..2) 3 FROM DEPT 26 .. SQL> SELECT RPAD(DNAME.... comprimento) Retorna uma seqüência de caracteres. Encontra a posição da n-ésima ocorrência a partir da posição indicada.-------------------**********ACCOUNTING ACCOUNTING ..... 'caracter') Preenche a seqüência de caracteres..'.. a segunda com espaços.. ‘seqüência de caracteres'...'C'...7 INSTR(coluna | literal. será utilizado o caracter de espaço. LPAD(DEPTNO.2....No exemplo abaixo.. Note que a terceira coluna é numérica... SUBSTR(DNAME...4)....... à direta..2) --------------CCOUNTING ESEARCH ALES PERATIONS SUBSTR(DNAME. 4.40 4..10 ************RESEARCH RESEARCH .') 2 FROM DEPT LPAD(DNAME... se os quatro parâmetros forem fornecidos.‘*') LPAD(DNAME.... posição.20) LPAD(DEPTNO.......-------------------...') -------------------10.. SQL> SELECT LPAD(DNAME..'A')....'ES')....') 2 FROM DEPT RPAD(DNAME... Se o caracter de preenchimento não for informado.. RPAD(DNAME. 40. 20.30 **********OPERATIONS OPERATIONS . INSTR(DNAME..5) -------------------COUNT SEARC LES ERATI 4.. 20. as três colunas são preenchidas à esquerda até um total de 20 caracteres.20 ***************SALES SALES ... 20. LPAD(DNAME... n) Encontra a posição da primeira ocorrência da seqüência de caracteres na coluna ou literal. SQL> SELECT SUBSTR('ORACLE'.... e a terceira com pontos..6 SUBSTR(coluna | literal... SQL> SELECT DNAME.. 20). 20)..'. com o comprimento especificado. posição... SUBSTR(DNAME..... 20..20) -------------------ACCOUNTING RESEARCH SALES OPERATIONS RPAD(DEPTNO... 30...20..20.

2) -----------. SOUNDEX(ENAME) 2 FROM EMP 3 WHERE SOUNDEX(ENAME) = SOUNDEX('FRED') ENAME SOUNDEX(ENAME) ---------. 'caracteres') Remove os caracteres indicados à direita da coluna ou do literal.'G') ---------------ACCOUNTIN RESEARCH SALES OPERATIONS RTRIM(DNAME.1. Se nenhum caracter for especificado.-------------------ACCOUNTING 1 0 3 RESEARCH 5 2 0 SALES 2 4 0 OPERATIONS 5 0 0 4.'GHS').9 RTRIM(coluna | literal. 2 RTRIM(DNAME.----------------.'AS') ----------------CCOUNTING RESEARCH LES OPERATIONS LTRIM(DNAME.'ES') INSTR(DNAME. 'caracteres') Remove os caracteres indicados à esquerda da coluna ou do literal. RTRIM(DNAME.'A').'N') ---------------ACCOUNTING RESEARCH SALES OPERATIONS 4. 4.-------------------FORD F630 27 .---------------.'A') INSTR(DNAME.'GHS') -----------------ACCOUNTIN RESEARC SALE OPERATION RTRIM(DNAME. serão eliminados os espaços à esquerda. LTRIM(DNAME.'G'). SQL> SELECT DNAME. SQL> SELECT DNAME. 2 LTRIM(DNAME.'C'.2.8 LTRIM(coluna | literal. Na quarta coluna foram removidas as letras "A". LTRIM(DNAME. na segunda coluna foram removidas as letras "A" à esquerda dos nomes dos departamentos. serão eliminados os espaços à direita.'N') 3 FROM DEPT DNAME -------------ACCOUNTING RESEARCH SALES OPERATIONS RTRIM(DNAME. Se nenhum caracter for especificado.2.'ASOP') ------------------CCOUNTING RESEARCH LES ERATIONS No exemplo acima.DNAME INSTR(DNAME. RTRIM(DNAME.'A') ---------------CCOUNTING RESEARCH SALES OPERATIONS LTRIM(DNAME.2.10 SOUNDEX(coluna | literal) Retorna uma seqüência de caracteres que representa o som das palavras contidas na coluna ou no literal.'ASOP') 3 FROM DEPT DNAME -------------ACCOUNTING RESEARCH SALES OPERATIONS LTRIM(DNAME. "O" e "P" à esquerda.'AS'). "S". Na terceira coluna foram removidas tanto a letra "A" quanto a letra "S". SQL> SELECT ENAME.

na coluna ou literal especificados.'C'.11 LENGTH(coluna | literal) Retorna o número de caracteres (ou dígitos) na coluna ou literal especificados.--------------------12 2 10 12 2 8 12 2 5 12 2 10 4.'AR'. LENGTH(DNAME) 2 FROM DEPT LENGTH('CURSODESQL') LENGTH(DEPTNO) LENGTH(DNAME) --------------------.'SALESMAN'.2. SQL> SELECT ENAME.--------------------.'IT') -----------------------------MINIGET PTESIDENT CLETK 4.'IT') 2 FROM EMP 3 WHERE DEPTNO = 10 JOB --------MANAGER PRESIDENT CLERK TRANSLATE(JOB. de. SQL> SELECT LENGTH('CURSO DE SQL'). LENGTH(DEPTNO). No exemplo abaixo SALESMAN é substituído por VENDEDOR: SQL> SELECT JOB.2. Caracteres do parâmetro "de" sem correspondência no parâmetro "para" são removidos. e "R" por "T". TRANSLATE(JOB. TRANSLATE(ENAME. nos cargos.13 REPLACE(coluna | literal. SQL> SELECT JOB.'P') 2 FROM EMP 3 WHERE DEPTNO = 10 ENAME ---------CLARK KING MILLER TRANSLATE(ENAME. REPLACE(JOB. de.2.4. para) Substitui a seqüência de caracteres "de" pela seqüência de caracteres "para". na coluna ou literal especificados.'C'.12 TRANSLATE(coluna | literal. Todas as ocorrências dos caracteres do parâmetro "de" são substituídas pelos caracteres no parâmetro "para".'VENDEDOR') 2 FROM EMP 28 . para) Substitui os caracteres do argumento "de" pelos caracteres do argumento "para". No exemplo abaixo foram trocados os caracteres "C" por "P" nos nomes dos funcionários.'AR'.'P') ------------------------PLARK KING MILLER No exemplo abaixo foram trocados "A" por "I".

'PX') -----------------------SMITH ALLEN WARD JONES MARTIN BLAKE CLARK SPXTT <-------------KING TURNER ADAMS JAMES FORD MILLER 14 rows selected.-----------------------------------------------------------ACCOUNTING 10 0 RESEARCH 8 1 SALES 5 2 OPERATIONS 10 1 29 .'CO'.'AS'.'AS'. SQL> SELECT DNAME.'VENDEDOR') ---------------------------------------CLERK VENDEDOR VENDEDOR MANAGER VENDEDOR MANAGER MANAGER ANALYST PRESIDENT VENDEDOR CLERK CLERK ANALYST CLERK 14 rows selected.'PX') FROM EMP ENAME ---------SMITH ALLEN WARD JONES MARTIN BLAKE CLARK SCOTT KING TURNER ADAMS JAMES FORD MILLER REPLACE(ENAME. 2 LENGTH(DNAME)-LENGTH(TRANSLATE(DNAME. sendo que neste caso as funções internas são executadas antes das externas.JOB --------CLERK SALESMAN SALESMAN MANAGER SALESMAN MANAGER MANAGER ANALYST PRESIDENT SALESMAN CLERK CLERK ANALYST CLERK REPLACE(JOB. LENGTH(DNAME).14 Funções aninhadas As funções que operam sobre uma única linha podem ser aninhadas.'A')) ---------.'CO'.2. REPLACE(ENAME.'SALESMAN'. "CO" foi substituído por "PX": SELECT ENAME. No exemplo abaixo.'A')) 3 FROM DEPT DNAME LENGTH(DNAME)LENGTH(DNAME)-LENGTH(TRANSLATE(DNAME. 4.

-----------.923). TRUNC(45.----------3000 100 102 -11 5000 100 102 -11 3000 100 102 -11 4.25 45.76) CEIL(-11. n) Arredonda o valor da coluna ou do literal na n-ésima casa decimal.76).----------------45.4 FLOOR(coluna | literal) Retorna o maior inteiro menor ou igual ao valor da coluna ou literal. FLOOR(101.9 45 40 156.323.-1) TRUNC(SAL/32.----------------.1) ROUND(45.---------.-1).9) CEIL(101.1).323.3.63 4.3 Funções numéricas 4.923).2) ----------------. TRUNC(SAL/32.9 45 40 40. FLOOR(99.1) 2 FROM EMP 3 WHERE FLOOR(SAL) BETWEEN 3000 AND 5000 30 .1 ROUND(coluna | literal.1) --------. CEIL(-11. Se n for omitido eqüivale a um número inteiro.56 45.2 TRUNC(coluna | literal.9).----------------. SQL> SELECT TRUNC(45. CEIL(99.9 45 40 76.56 45.3. SQL> SELECT ROUND(45.3.3 CEIL(coluna | literal) Retorna o menor inteiro maior ou igual ao valor da coluna ou do literal. n) Trunca o valor da coluna ou do literal na n-ésima posição.-1) ROUND(SAL/32.923.76).1) TRUNC(45.323.9 46 40 40. Se n for negativo eqüivale às dezenas.25 45.923.1).3.----------------.9 46 40 156. ROUND(42.923) TRUNC(42.9). TRUNC(42.-1). FLOOR(-11.923) ROUND(42.1) 2 FROM EMP 3 WHERE SAL BETWEEN 3000 AND 5000 CEIL(SAL) CEIL(99.2) 2 FROM EMP 3 WHERE DEPTNO = 10 ROUND(45.2) ----------------.923.923.323.62 4.9 46 40 76. SQL> SELECT FLOOR(SAL).4.2) 2 FROM EMP 3 WHERE DEPTNO = 10 TRUNC(45. ROUND(SAL/32. ROUND(45. CEIL(101.----------------.----------------45. SQL> SELECT CEIL(SAL).

. coluna | literal) Calcula o logaritmo da coluna ou do literal na base especificada.6 EXP(coluna | literal) Eleva e (2.1) ---------.----------.3.9 SQRT(coluna | literal) Retorna a raiz quadrada da coluna ou do literal.7 LOG(base. 4.5 POWER(coluna | literal. n) Eleva a coluna ou literal a n-ésima potência. SELECT LOG(10.59815 1 row selected.----------------.5) ----------------.-----------3000 99 101 -12 5000 99 101 -12 3000 99 101 -12 4. POWER(SAL.100) FROM DUAL LOG(10.76) FLOOR(-11.3.3).----------------2450 6002500 14706125000 312500000 5000 25000000 125000000000 312500000 1300 1690000 2197000000 312500000 4.3) POWER(50.------------. SQL> SELECT SAL. POWER(SAL.3. SELECT LN(95) FROM DUAL LN(95) ---------4.----------------.8 LN(coluna | literal) Calcula o logaritmo neperiano da coluna ou do literal. POWER(50.100) ----------2 1 row selected. 31 .3.55387689 4.FLOOR(SAL) FLOOR(99.2) POWER(SAL.5) 2 FROM EMP 3 WHERE DEPTNO = 10 SAL POWER(SAL. 4.9) FLOOR(101.3. SELECT EXP(4) FROM DUAL EXP(4) ---------54.71828183.2).) à coluna ou literal..

----------------1600 40 6. SQL> SELECT SAL.----------------.----------------. COMM 2 FROM EMP 3 WHERE SIGN(SAL-COMM) = 1 ENAME SAL COMM ---------.35533905932738 6.41657386773941 4. SQRT(COMM) 2 FROM EMP 3 WHERE COMM > 0 SAL SQRT(SAL) SQRT(40) SQRT(COMM) ---. SIGN(SAL-COMM).11 ABS(coluna | literal) Retorna o valor absoluto da coluna ou do literal.----------------1600 300 -1300 1300 1250 500 -750 750 1250 1400 150 150 2850 1500 0 -1500 1500 950 4.324555320336759 17.----------------.12 MOD(valor1.3. SQL> SELECT SAL-COMM.3.----------------1300 1 -1300 -1 750 1 -750 -1 -150 -1 150 1 1500 1 -1500 -1 Salários maiores do que a comissão podem ser listados conforme mostrado abaixo: SQL> SELECT ENAME. ou retorna 1 se for maior do que zero.32050807568877 1250 35.----------------. retorna 0 se for igual a zero. 32 . COMM. COMM-SAL.SQL> SELECT SAL. ABS(COMM-SAL) 2 FROM EMP 3 WHERE DEPTNO = 30 SAL COMM COMM-SAL ABS(COMM-SAL) ----------------.3.----------------ALLEN 1600 300 WARD 1250 500 TURNER 1500 0 4. COMM-SAL.10 SIGN(coluna | literal) Retorna -1 se o valor da coluna ou do literal for negativo. SAL.----------------. SQRT(SAL).324555320336759 37. SIGN(COMM-SAL) 2 FROM EMP 3 WHERE DEPTNO = 30 SAL-COMM SIGN(SAL-COMM) COMM-SAL SIGN(COMM-SAL) ----------------.3606797749979 1250 35.324555320336759 22.----------------.----------------.35533905932738 6. valor2) Retorna o resto da divisão de valor1 por valor2. SQRT(40).

462117157 4.5 COS(60*3.----------------. COS(60*3.40) FROM EMP WHERE DEPTNO = 30 ORDER BY COMM SAL COMM MOD(SAL.17520119 COSH(0) ------1 TANH(.1 ---------1 4. MOD(100.1 ---------.141592654/180). COMM. DEPTNO ----------------20 30 30 20 30 30 10 20 10 30 20 30 20 10 ENAME PCTSAL ---------. coseno (COS).141592654/180).----------------.3.COMM).1 ---------. o nome do funcionário. SELECT SIN(30*3. coseno hiperbólico (COSH) e tangente hiperbólica (TANH) da coluna ou literal.13 Funções trigonométricas Calculam o seno (SIN). e o salário com aumento de 15% expresso em número inteiro.14 Funções hiperbólicas Calculam o seno hiperbólico (SINH).40) ----------------.COMM) MOD(100.5) FROM DUAL SINH(1) ---------1.5) ---------.----------------1500 0 1500 20 1600 300 100 20 1250 500 250 20 1250 1400 1250 20 2850 20 950 20 4.4 Exercícios a) Listar o número do departamento.SQL> 2 3 4 SELECT SAL. MOD(SAL.5 TAN(45*3. TAN(45*3. TANH(. COSH(0). SELECT SINH(1).141592654/180) FROM DUAL SIN(30*3.----------------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 . e tangente (TAN) da coluna ou literal.3.

--------.----. e o código sonoro de seus nomes. c) Listar uma lista contendo todos os empregados com um identificador composto pelas duas primeiras letras de seus cargos. 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) Faça uma procura não sensitiva a letras maiúsculas ou minúsculas por um cargo fornecido pelo usuário.----. DEPARTAMENTO -------------------ACCOUNTING RESEARCH SALES OPERATIONS 34 . os dois dígitos do meio de seus números de matrícula.----.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.-----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 posições. EMPNO ----7369 7876 7900 7934 ENAME ---------SMITH ADAMS JAMES MILLER JOB MGR HIREDATE SAL COMM DEPTNO --------.

35 . 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.f) Encontrar a primeira ocorrência da letra "L" nos nomes dos empregados e substituir pela letra "X".

10)||LPAD(JOB.10) EMPREGADO_E_CARGO 2 FROM EMP c) SQL> SELECT ENAME NOME.'L')).INSTR(ENAME.'L')+1) PRIMEIRA_OCORRENCIA_DE_L FROM EMP 36 . ENAME.1. 2 SUBSTR(JOB.15) PCTSAL 2 FROM EMP b) SQL> SELECT RPAD(ENAME.'X')|| SUBSTR(ENAME.'L'.(20-LENGTH(DNAME))/2)||DNAME DEPARTAMENTO 2 FROM DEPT f) SQL> 2 3 4 SELECT ENAME.2.4.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(' '.1. TRANSLATE(SUBSTR(ENAME.INSTR(ENAME.2)||SUBSTR(EMPNO. ROUND (SAL*1.5 Respostas dos exercícios a) SQL> SELECT DEPTNO.

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.2 Funções que manipulam datas 5. HIREDATE-7. 5.HIREDATE) > 59 37 .351851851852 3795. e uma linha com o valor 'X'.1 Objetivos deste capítulo Este capítulo mostra as funções do Oracle que manipulam datas e fazem a conversão de tipo de dados. contém apenas uma coluna chamada DUMMY.2. Abaixo a tabela SYS. HIREDATE+7. ou de valores numéricos. data+número data-número data-data data+número/24 Soma o número de dias à data.'05-NOV-88') FROM EMP WHERE MONTHS_BETWEEN(SYSDATE.351851851852 3795. produzindo outra data Subtrai uma data da outra.2.DUAL é pública. SQL> 2 3 4 SELECT MONTHS_BETWEEN(SYSDATE. produzindo número de dias Soma número de horas à data. SQL> SELECT SYSDATE 2 FROM SYS.2 Aritmética de datas Datas podem ser somadas ou subtraídas de outras datas. MONTHS_BETWEEN('01-JAN-84'.3 MONTHS_BETWEEN(data1. Esta tabela é útil para retornar um único valor de uma constante. A tabela SYS. ou de uma expressão.351851851852 A operação SYSDATE-HIREDATE retorna o número de dias entre a admissão do empregado e a data atual.HIREDATE).351851851852 3788.data2) Retorna o número de meses decorridos entre data1 e data2.1 SYSDATE SYSDATE é uma pseudo-coluna que retorna a data e a hora corrente.Capítulo 5: Funções de Data e de Conversão 5. 5.DUAL SYSDATE --------25-OCT-94 5. produzindo outra data SQL> SELECT HIREDATE.DUAL foi utilizada para retornar a data corrente. produzindo outra data Subtrai o número de dias à data. de uma pseudo-coluna.2.

3985293458781 -58.-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. dia_da_semana) Data do próximo dia da semana após data. LAST_DAY('15-FEB-88') FROM EMP WHERE DEPTNO = 20 38 .1290322580645 14 rows selected. ADD_MONTHS(HIREDATE.1290322580645 134.3340132168459 -58. meses) Adiciona o número de meses especificados à data.6565938620072 -58. NEXT_DAY(HIREDATE.1290322580645 131.3).1290322580645 126.2.2.1290322580645 130.1290322580645 124. HIREDATE. ADD_MONTHS(HIREDATE.1290322580645 127.1290322580645 131.1290322580645 130.5275616039427 -58.'05-NOV-88' -------------------------------.6) 2 FROM EMP 3 WHERE DEPTNO = 10 HIREDATE --------14-MAY-84 09-JUL-84 21-NOV-83 NEXT_DAY(HIREDATE.2.366271281362 -58.MONTHS_BETWEEN(SYSDATE.1290322580645 123. SQL> 2 3 4 SELECT SYSDATE. SQL> SELECT HIREDATE.0759487007168 -58.1290322580645 124.6 LAST_DAY(data) Retorna a data do último dia do mês da data especificada.1290322580645 124.6565938620072 -58.-3) ----------------------13-MAR-83 31-JUL-83 05-DEC-83 04-MAR-84 05-SEP-83 5.8178841845878 -58.'FRIDAY') --------------------------18-MAY-84 13-JUL-84 25-NOV-83 NEXT_DAY(HIREDATE.1404648297491 -58.5 NEXT_DAY(data.6) -------------------18-MAY-84 13-JUL-84 25-NOV-83 5. SQL> SELECT HIREDATE.1290322580645 125.6888519265233 -58.HIREDATE) MONTHS_BETWEEN('01-JAN-84'.3) ---------------------13-SEP-83 31-JAN-84 05-JUN-84 04-SEP-84 05-MAR-84 ADD_MONTHS(HIREDATE. LAST_DAY(SYSDATE).6888519265233 -58. NEXT_DAY(HIREDATE.4630454749104 -58.9791745071685 -58.4 ADD_MONTHS(data.6565938620072 -58. 5.-------------------------------------136.'FRIDAY').1290322580645 123. LAST_DAY(HIREDATE).

'YEAR') --------. se a data estiver na segunda quinzena.'MONTH') ROUND(SYSDATE. 'YEAR') ROUND(data) retorna a data com a indicação da hora como sendo zero horas (meia noite). S prefixa datas Antes de Cristo com "-" Ano.---------------------.7 ROUND(data) ROUND(data.'YEAR') --------.'YEAR') 2 FROM SYS. ROUND(data.--------------------25-OCT-94 01-OCT-94 01-JAN-94 5.---------------------. ROUND(SYSDATE.3 Funções de conversão 5. Até o meio dia retorna a mesma data. YY. 'MONTH') TRUNC(data. se a data estiver no segundo semestre.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.7 TRUNC(data) TRUNC(data. TRUNC(data. se a data estiver no primeiro semestre. 'MONTH') ROUND(data. ROUND(SYSDATE. 'MONTH') retorna o primeiro dia do mês da data. S prefixa datas Antes de Cristo com "-" Últimos 3.'MONTH') retorna o primeiro dia do mês da data. SQL> SELECT SYSDATE.DUAL SYSDATE ROUND(SYSDATE. Esta função é útil quando são comparadas datas com horas diferentes. ROUND(data. se a data estiver na primeira quinzena. SQL> SELECT SYSDATE.--------------------25-OCT-94 01-NOV-94 01-JAN-95 5. TRUNC(data. ou retorna o primeiro dia do mês seguinte.2.DUAL SYSDATE TRUNC(SYSDATE. 'YEAR') TRUNC(data) retorna a data com o tempo indicando zero horas.1 Formatos de Data Formato CC ou SCC YYYY ou SYYYY YYY. TRUNC(SYSDATE. TRUNC(SYSDATE. 'YEAR') retorna o primeiro dia do ano da data.'MONTH').'MONTH'). Y Significado Século.1 dígitos do ano 39 . ou retorna o primeiro dia do ano seguinte.2. após o meio dia retorna o dia seguinte.'MONTH') TRUNC(SYSDATE.3.'YEAR') 2 FROM SYS.'YEAR') retorna o primeiro dia do ano da data.2.

O sufixo 'SP' produz números por extenso ("DDSP" para "FOUR") 4 .. com 9 caracteres.'DAY.M. do mês. com 9 caracteres..O sufixo 'TH' produz números ordinais ("DDTH" para "4TH") 3 .D.C.YYY YEAR ou SYEAR BC ou AD B." Notas: Ano com vírgula separando os milhares Ano por extenso.3. DD..O prefixo 'fm' (fill mode) antes de MONTH ou DAY suprime os espaços à direita 2 .Y.M. espaços à direita Nome do mês.Os códigos são sensitivos a caracteres maiúsculos e minúsculos 5.. e utilizando-se letras maiúsculas e minúsculas temos: 40 .'DAYDDTHMONTHYYYY') ----------------------------------TUESDAY . HH ou HH12 HH24 MI SS SSSS /..O sufixo 'SPTH' para números ordinais por extenso ("DDSPTH" para "FOURTH") 5 .2 TO_CHAR(número|data.25TH OCTOBER 1994 Adicionando-se o prefixo fm (fill mode) para remover os espaços. D DAY DY J AM ou PM A. Q MM Month MON WW ou W DDD. S prefixa datas Antes de Cristo com "" Indicador de Antes ou Depois de Cristo Idêntico a BC/AD com pontos Quarto do ano (trimestre) Mês Mês por extenso. etc.DUAL TO_CHAR(SYSDATE. ou P. ou da semana Dia por extenso. DDTH MONTH YYYY') 2 FROM SYS. com 3 caracteres Semana do ano ou do mês Dia do ano. SQL> SELECT TO_CHAR(SYSDATE. 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 após à meia noite (0-86399) Pontuação reproduzida no resultado Caracteres entre aspas reproduzido no resultado 1 .['formato']) Converte número ou data em caracter no formato especificado. espaços à direita Nome do dia. ". ou A.

00 .000 $5. 5.234 1234(1234) 1.850 $2.250 $2.100 $950 $3.3 Formatos Numéricos Formato 9 0 $ .999') 2 FROM EMP TO_CHAR(SAL.00 1. 25th October 1994 A função TO_CHAR pode ser usada para extrair a hora do dia apenas. SQL> SELECT TO_CHAR(SAL.'FMDAY.000 $1.999EEEE 9999V99 B9999.'$9.999 099999MI 999999PR 99.'$9.DUAL TO_CHAR(SYSDATE.450 $3.SQL> SELECT TO_CHAR(SYSDATE. .3. 41 Exemplo 999999 099999 $99999 999999.DDTHMONTHYYYY') -------------------------------------Tuesday.99 1234 001234 $1234 1234.'HH:MI:SS') --------------------------08:39:51 A função TO_CHAR pode ser usada para converter números em caracteres aplicando a formatação desejada. sendo n o número de 9 à direita de V mostrar resultados zero como espaços.999') --------------------$800 $1.975 $1. 'fmDay.250 $2.99 999.300 14 rows selected.500 $1.DUAL TO_CHAR(SYSDATE. SQL> SELECT TO_CHAR(SYSDATE.234E+03 123400 1234.000 $1. ddth Month YYYY') 2 FROM SYS. não como 0. 'HH:MI:SS') 2 FROM SYS.600 $1. MI PR EEEE V B Significado posição numérica (um 9 para cada número) zeros à esquerda cifrão à esquerda ponto decimal na posição especificada vírgula na posição especificada sinal de menos à direita números negativos entre parênteses notação científica multiplicar por 10 elevado a n.

Se o formato for omitido será assumido DD-MON-YY.. e se houver igualdade o resultado correspondente é retornado.res1.. ENAME. HIREDATE 2 FROM EMP 3 WHERE HIREDATE = TO_DATE('June 4.4. que deve conter um número..]. o valor default é retornado..yyyy') EMPNO ----7844 7876 ENAME ---------TURNER ADAMS HIREDATE --------04-JUN-84 04-JUN-84 5. pes2.4 TO_NUMBER(cadeia_de_caracteres) Converte a cadeia de caracteres. 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 --------..5 TO_DATE('cadeia_de_caracteres'. 5.1984'.5.pes1.3. SQL> SELECT EMPNO.------SALESMAN 1600 MANAGER 2975 MANAGER 2850 MANAGER 2450 ANALYST 3000 PRESIDENT 5000 ANALYST 3000 7 rows selected. em um valor numérico.'Month dd.1 DECODE(coluna|expressão.[pes2.default) Funciona como uma estrutura CASO.res2. Se não houver igualdade. JOB. A coluna ou expressão é comparada com os argumentos de pesquisa.'formato') Retorna a data contida na cadeia de caracteres conforme o formato especificado.pesN. Notas: 42 .. Argumentos: coluna|expressão pes1 res1 pes2 res2 default a coluna ou expressão a ser avaliada o primeiro valor a ser testado o valor a ser retornado se coluna ou expressão igual a pes1 o segundo valor a ser testado o valor a ser retornado se coluna ou expressão igual a pes2 o valor a ser retornado se a coluna ou expressão for diferente de pes1.4 Funções que aceitam qualquer tipo de dado 5. substituindo as pesquisas pelos resultados. SQL> SELECT EMPNO. ENAME.3..

ENAME. 'CLERK'.1.'1'.'BOSS'.'ANALYST'. -pes(quisa) deve ter o mesmo tipo de dados da coluna ou expressão -O valor retornado é sempre do mesmo tipo do terceiro argumento (resultado1) No exemplo abaixo o cargo CLERK é transformado em WORKER.SAL*1.'3'. 2 DECODE(GRADE. DECODE(JOB.-coluna ou expressão podem ser de qualquer tipo de dados. 'CLERK'.SAL*0.SAL) * ERROR: ORA-01722: invalid number no rows selected Para fazer um aumento salarial diferenciado por cargo: SQL> 2 3 4 SELECT JOB.'MANAGER'. SAL) SALARIO_DECODIFICADO FROM EMP 43 . o cargo MANAGER é transformado em BOSS.'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 (numérico). e os demais cargos são transformados em UNDEFINED.2.'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 bônus relativas às faixas salariais: SQL> SELECT GRADE. SQL> SELECT * FROM EMP 2 ORDER BY DECODE(2.'15%'. JOB. SQL> 2 3 4 SELECT ENAME.'WORKER'. DECODE(JOB.'10%'. 'MANAGER'. SAL.15.1.SAL*1.95.'8%'.SAL.'2'.

COMM) 2 FROM EMP 3 WHERE DEPTNO = 30 LEAST(1000. SQL> SELECT SAL*12+NVL(COMM. coluna|valor. SQL> SELECT LEAST(1000..1000) -----------------.. coluna|valor.COMM) ----------------.----------------- 44 .25 SALESMAN 1250 1250 MANAGER 2850 2707. 5.) Retorna o menor dos valores de uma lista de valores. LEAST(SAL.COMM) ------------------.COMM) 2 FROM EMP 3 WHERE DEPTNO = 30 GREATEST(1000.------.4.4.2000) GREATEST(SAL..1000).1000) 2 FROM EMP 3 WHERE DEPTNO = 10 SAL*12+NVL(COMM.) Retorna o maior dos valores de uma lista de valores. NVL(COMM. valor) Converte valores nulos do primeiro argumento no valor especificado no segundo argumento.2000) LEAST(SAL.----------------.JOB SAL SALARIO_DECODIFICADO --------.4 LEAST(coluna|valor.3 GREATEST(coluna|valor. 5.2 NVL(coluna|valor.4.--------------------29400 1000 30400 60000 1000 61000 15600 1000 16600 5.-----------------2000 1600 2000 1250 2000 1400 2000 2000 1500 2000 6 rows selected.5 ANALYST 3000 3300 PRESIDENT 5000 5000 SALESMAN 1500 1500 CLERK 1100 1265 CLERK 950 1092.0).1000) SAL*12+NVL(COMM.5 MANAGER 2450 2327.5 ANALYST 3000 3300 CLERK 1300 1495 14 rows selected. GREATEST(SAL... SAL*12+NVL(COMM.2000).-------------------CLERK 800 920 SALESMAN 1600 1600 SALESMAN 1250 1250 MANAGER 2975 2826.. SQL> SELECT GREATEST(1000.2000).0) NVL(COMM.

'Day dd Month YYYY') FROM SYS. VSIZE(HIREDATE).5 Exercícios a) Mostrar o nome e a data de admissão dos empregados do departamento 20.5 Funções aninhadas revisitadas SQL> SELECT ENAME.2).-------------------------------------------------------25-OCT-94 Friday 30 December 1994 5. TO_CHAR(NEXT_DAY(ADD_MONTHS(SYSDATE. Thirteenth 1983 October.5 VSIZE(coluna|valor) Retorna o número de bytes utilizado internamente pelo Oracle para representar o valor. Fourth 1984 December. NVL(TO_CHAR(MGR).'FRIDAY').'DAYDDMONTHYYYY') --------.--------------10 2 7 3 5 10 2 7 2 4 10 2 7 2 6 5.2).---------------------------------KING NAO GERENCIAVEL SQL> 2 3 4 SELECT SYSDATE. Assuma a data de revisão um ano após a data de admissão.DUAL SYSDATE TO_CHAR(NEXT_DAY(ADD_MONTHS(SYSDATE. Thirty-First 1983 March.--------------. VSIZE(SAL). ENAME ---------SMITH JONES SCOTT ADAMS FORD DATA_DE_ADMISSAO --------------------------June.--------------. Fifth 1984 June.'NAO GERENCIAVEL') 2 FROM EMP 3 WHERE MGR IS NULL ENAME NVL(TO_CHAR(MGR).--------------. VSIZE(DEPTNO).1000 1000 1000 1000 1000 1000 300 500 1250 0 5. VSIZE(ENAME) FROM EMP WHERE DEPTNO = 10 DEPTNO VSIZE(DEPTNO) VSIZE(HIREDATE) VSIZE(SAL) VSIZE(ENAME) ------.4. Classificar a saída em ordem ascendente da data de revisão do salário.4. ENAME HIREDATE REVISAO 45 .'FRIDAY'). juntamente com a data de admissão e a data de revisão do salário.'NAOGERENCIAVEL') ---------. Fifth 1983 b) Exibir o nome de cada empregado. SQL> 2 3 4 SELECT DEPTNO. Utilize o aliás DATA_DE_ADMISSAO para o nome da coluna.

YY. verifique se os dois primeiros e os dois últimos caracteres são numéricos. e 'NAO' se não for válido.'e '99\88'.---------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 salário. Imprima a expressão 'SIM' se for válido. DIA -------SATURDAY e) Escreva uma consulta que retorne o tempo que o empregado está trabalhando para a empresa.MM. e se o caracter do meio é uma '/'. 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.---------------KING 10 ANOS 3 MESES f) Dada uma cadeia de caracteres no formato 'nn/nn'. se este for superior a 1500. VALOR VALIDO? ----. ENAME TEMPO DE SERVICO ---------. Se o salário for inferior a 1500 deve ser exibido ABAIXO DE 1500. Experimente as expressões '12/34'.'01/1a'. e se for igual a 1500 deve ser exibido NO LIMITE.------12/34 SIM 46 .

e a primeira data de pagamento. são pagos na última sexta-feira do mês. Empregados admitidos após o dia 15 são pagos na última sexta-feira do mês seguinte. 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. Imprima uma relação contendo os nome dos empregados. as datas de admissão. inclusive.g) Empregados admitidos até o dia 15. 47 .

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

2 Funções disponíveis Função 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 médio de 'n'. Quando DISTINCT é especificado. inclusive os duplicados. Valor máximo da expressão. ignorando os valores nulos.3 Usando funções de grupo Para calcular o salário médio de todos os empregados: SQL> SELECT AVG(SAL) 2 FROM EMP AVG(SAL) ----------------2073. máximo. Podem ser fornecidas expressões dos tipos caracter. Número de ocorrências não nulas da expressão. Soma dos valores de 'n'. Variância de 'n'. enquanto que as funções mostradas neste capítulo operam sobre um grupo de linhas. Todas as funções de grupo.. caso contrário ALL é assumido. ignorando os valores nulos.1 Objetivos deste capítulo Este capítulo explica como informações sumarizadas (média. incluindo valores duplicados e nulos. ignorando os valores nulos. 6. Valor mínimo da expressão.) podem ser obtidas para grupo de linhas. número ou data quando 'exp' estiver indicado. somente os valores não duplicados são considerados pela função. ignoram os valores nulos. O '*' obriga a contagem total.Capitulo 6: Funções de Grupo 6. 6. exceto COUNT(*). Quando 'n' estiver indicado. somente valores numéricos são aceitos. ignorando os valores nulos. mínimo.214285714286 Note que toda a tabela EMP foi tratada como um único grupo.. As funções vistas anteriormente operavam sobre cada linha.. considerando todos os valores. Desvio padrão de 'n'. 49 .

excluindo os gerentes: SQL> 2 3 4 SELECT JOB. AVG(SAL) 2 FROM EMP 3 GROUP BY JOB JOB AVG(SAL) --------. Para mostrar o salário médio de cada cargo. Para encontrar o salário mínimo recebido por um CLERK: SQL> SELECT MIN(SAL) 2 FROM EMP 3 WHERE JOB='CLERK' MIN(SAL) ----------------800 Para contar o número de empregados que trabalham no departamento 20: SQL> SELECT COUNT(*) 2 FROM EMP 3 WHERE DEPTNO = 20 COUNT(*) ----------------5 6.----------------ANALYST 3000 CLERK 1037.Uma função de grupo pode ser aplicada sobre um subconjunto das linhas usando a cláusula WHERE.5 Excluindo linhas dos grupos A cláusula WHERE pode ser utilizada para excluir linhas. Funções de grupo podem ser utilizadas para retornar informações sumarizadas para cada grupo.----------------ANALYST 3000 CLERK 1037.4 A cláusula GROUP BY A cláusula GROUP BY é utilizada para dividir as linhas das tabelas em grupos. antes que estas sejam grupadas.5 MANAGER 2758. Para calcular o salário médio de cada cargo: SQL> SELECT JOB. AVG(SAL) FROM EMP WHERE JOB != 'MANAGER' GROUP BY JOB JOB AVG(SAL) --------.5 50 .333333333333 PRESIDENT 5000 SALESMAN 1400 6.

AVG(SAL) 2 FROM EMP 3 GROUP BY DEPTNO. JOB.----------------CLERK 1300 MANAGER 2450 PRESIDENT 5000 ANALYST 3000 CLERK 950 MANAGER 2975 CLERK 950 MANAGER 2850 SALESMAN 1400 6. mas mostra que não há obrigação de listar as colunas pelas quais o grupamento é realizado. JOB DEPTNO ----------------10 10 10 20 20 20 30 30 30 9 rows selected. fornecendo resultados para grupos dentro de grupos.6 Grupos dentro de grupos Os grupos podem conter subgrupos. 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 funções de grupo são incluídas na cláusula SELECT. Para listar o salário médio de cada cargo em cada departamento: SQL> SELECT DEPTNO. O resultado não é muito significativo pois não mostra o cargo. SQL> SELECT MAX(SAL) 2 FROM EMP 3 GROUP BY JOB MAX(SAL) ----------------3000 1300 2975 5000 1600 Também não há necessidade de colocar as colunas a serem grupadas antes das outras: SQL> SELECT MAX(SAL). JOB AVG(SAL) --------.PRESIDENT SALESMAN 5000 1400 6. 51 .7 Funções de grupo e resultados individuais A declaração abaixo mostra o salário máximo para cada tipo de cargo. todas as colunas que não contém função de grupo devem aparecer na cláusula GROUP BY.

----------------10 1300 20 800 30 950 Toda coluna ou expressão da cláusula SELECT que não é uma função de agregação deve aparecer na cláusula GROUP BY.----------------ANALYST 3000 PRESIDENT 5000 52 .----------------20 2175 30 1566. AVG(SAL) FROM EMP GROUP BY DEPTNO HAVING COUNT(*) > 3 DEPTNO AVG(SAL) ----------------.O exemplo abaixo mostra o erro causado pela utilização da função de grupo MIN(SAL). MIN(SAL) * ERROR at line 1: ORA-00937: not a single-group group function Grupando-se por DEPTNO o comando processa corretamente. Para mostrar o salário médio dos departamento que possuem mais de três funcionários: SQL> 2 3 4 SELECT DEPTNO. 6. MIN(SAL) 2 FROM EMP SELECT DEPTNO. A cláusula HAVING opera sobre a cláusula GROUP BY de maneira semelhante a que a cláusula WHERE opera sobre a cláusula SELECT. SQL> SELECT DEPTNO. MAX(SAL) FROM EMP HAVING MAX(SAL) >= 3000 GROUP BY JOB JOB MAX(SAL) --------.666666666667 Para mostrar os cargos com salário máximo acima de 3000: SQL> 2 3 4 SELECT JOB. sem haver a cláusula GROUP BY em DEPTNO: SQL> SELECT DEPTNO. MIN(SAL) 2 FROM EMP 3 GROUP BY DEPTNO DEPTNO MIN(SAL) ----------------.8 A cláusula HAVING Somente os grupos que atendem as condições especificadas na cláusula HAVING são selecionados.

A cláusula WHERE não pode ser usada para restringir os grupos a serem retornados.9 Ordem das cláusulas SELECT FROM WHERE GROUP BY lista_de_colunas lista_de_tabelas condições_de_linha lista_de_colunas 53 . AVG(SAL) FROM EMP GROUP BY DEPTNO HAVING AVG(SAL) > 2000 DEPTNO AVG(SAL) ----------------.666666666667 20 2175 A cláusula WHERE é utilizada para aplicar restrições sobre linhas individualmente. A cláusula WHERE na declaração abaixa é ilegal: SQL> 2 3 4 SELECT DEPTNO. AVG(SAL) FROM EMP WHERE JOB <> 'MANAGER' GROUP BY JOB HAVING AVG(SAL) > 2000 JOB AVG(SAL) --------. As cláusulas WHERE e HAVING podem ser utilizadas em conjunto. a leitura tornase mais fácil quando a cláusula HAVING aparece após a cláusula GROUP BY. enquanto a cláusula HAVING é utilizada para aplicar restrições sobre grupos de linhas. exceto o cargo de gerente: SQL> 2 3 4 5 SELECT JOB.Embora a cláusula HAVING possa ser escrita antes da cláusula GROUP BY.----------------ANALYST 3000 CLERK 1037.5 PRESIDENT 5000 6. Para calcular o salário médio de todos os cargos. SQL> 2 3 4 SELECT DEPTNO. Os grupos são formados e as funções de grupo são calculadas antes da cláusula HAVING ser aplicada. 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 cláusula HAVING deve ser usada neste caso.----------------10 2916.

----------------. MAX(SAL) MIN(SAL) AVG(SAL) ----------------.10 Exercícios a) Encontrar o menor salário entre todos os empregados. 54 . DIFERENCA ----------------4200 g) Listar todos os departamentos que possuem mais de três empregados.HAVING condições_de_grupo ORDER BY lista_de_colunas São avaliados: WHERE para ficar somente as linhas que atendem a cláusula GROUP BY para montagem dos grupos HAVING para ficar somente os grupos que atendem a cláusula 6. JOB SALARIO_MEDIO REMUNERACAO_MEDIA --------. menor.214285714286 c) Listar o maior e o menor salário por cada tipo de cargo. lembrandose que os vendedores recebem comissão. CARGO MAIOR MENOR --------.----------------ANALYST 3000 3000 CLERK 1300 800 MANAGER 2975 2450 PRESIDENT 5000 5000 SALESMAN 1600 1250 d) Calcular o número de gerentes sem listar seus nomes. entre todos os empregados.----------------.----------------ANALYST 3000 36000 CLERK 1037.333333333333 33100 PRESIDENT 5000 60000 SALESMAN 1400 17237 f) Encontrar a diferença entre o maior e o menor salários. MENOR ----------------800 b) Encontrar o salário maior. GERENTES ----------------3 e) Encontrar o salário médio e a remuneração total média de cada tipo de cargo.5 12450 MANAGER 2758. e médio.----------------5000 800 2073.----------------.

Ordenar os resultados pelo salário MGR MIN(SAL) ----------------.DEPTNO COUNT(*) ----------------.----------------20 5 30 6 h) Verificar se não há duplicidade no número dos empregados no rows selected i) Listar os empregados que recebem o menor salário em cada departamento. Excluir os grupos onde o menor salário é inferior a 1000.----------------7788 1100 7782 1300 7839 2450 7566 3000 5000 55 . relacionando os seus gerentes.

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.6. MAX(SAL) MAIOR. MIN(SAL) FROM EMP GROUP BY MGR HAVING MIN(SAL) >= 1000 ORDER BY MIN(SAL) 56 . COUNT(*) FROM EMP GROUP BY DEPTNO HAVING COUNT(*) > 3 SELECT EMPNO FROM EMP GROUP BY EMPNO HAVING COUNT(*) > 1 SELECT MGR.11 Respostas dos exercícios a) SQL> SELECT MIN(SAL) MENOR 2 FROM EMP b) SQL> SELECT MAX(SAL). AVG(SAL) 2 FROM EMP c) SQL> SELECT JOB CARGO. MIN(SAL). AVG(SAL*12+NVL(COMM. AVG(SAL) SALARIO_MEDIO.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.

Os dois principais tipos de junção são: 1-Junções equivalentes (equi-join) 2-Junções não equivalentes (non-equi-join) 7. seria levantado na tabela DEPT o nome correspondente ao número do departamento. para diferenciar colunas com mesmo nome em tabelas diferentes.DEPTNO = DEPT. DEPT 3 WHERE EMP. uma vez o número do departamento nas duas tabelas é o mesmo. o nome do departamento em que um funcionário trabalha.DEPTNO 57 . SQL> SELECT DEPT. manualmente.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 obtenção dos números dos departamentos. DNAME 2 FROM EMP. JOB. Todas as colunas podem ser prefixadas com o nome da tabela. de acordo com valores comuns existentes em colunas correspondentes.DEPTNO. porém este procedimento só é obrigatório quando existe ambigüidade. Linhas de uma tabela podem ser juntadas com linhas de outra tabela. ENAME. primeiro seria levantado na tabela EMP o número do departamento do empregado. DEPT 3 WHERE EMP. JOB.Capítulo 7: Extraindo dados de mais de uma tabela 7. DNAME 2 FROM EMP.1 Objetivos deste capítulo Mostrar como obter informações de mais de uma tabela através das junções. A condição de junção é especificada na cláusula WHERE usando o operador '='. SQL> SELECT ENAME. em seguida.DEPTNO = DEPT. Este relacionamento entre as duas tabelas é chamado de junção equivalente (equi-join).2 Junções equivalentes Para levantar. e. O nome da tabela é colocado antes do nome da coluna.

AND .------.--------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. 58 . O Produto tende a gerar um grande número de linhas. e todas as combinações de linha serão retornadas.DEPTNO. No exemplo abaixo foi utilizado o aliás 'E' para a tabela EMP.. D.DNAME FROM EMP E...DEPTNO ENAME DEPTNO DNAME ---------. 7.DEPTNO DEPTNO ENAME JOB ------.ENAME.---------. No exemplo. o resultado é um Produto Cartesiano.4 Junções não equivalentes O relacionamento entre as tabelas EMP e SALGRADE formam uma junção não equivalente.DEPTNO ORDER BY D.4 ORDER BY DEPT. uma vez que não existe nenhuma coluna comum às duas tabelas. D.-------------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. DNAME -------------ACCOUNTING ACCOUNTING ACCOUNTING RESEARCH RESEARCH RESEARCH RESEARCH RESEARCH SALES SALES SALES SALES SALES SALES Aliás para nomes de tabelas podem ser usado de forma semelhante à que foi usada para aliás de nomes de colunas.DEPTNO = D. faz o relacionamento entre as duas tabelas.. SQL> 2 3 4 SELECT E. DEPT D WHERE E. O nome do aliás é escrito após o nome da tabela. e o aliás 'D' para a tabela DEPT.3 Produto Quando a condição de junção é inválida ou omitida completamente. a função BETWEEN . 7. e o resultado é raramente útil.

..5 Regra para junção de tabelas O número mínimo de condições de junção é igual ao número de tabelas menos um.7 Exercícios [DISTINCT] {[tabela]. E.6 Sumário da Sintaxe SELECT FROM WHERE AND OR GROUP BY HAVING ORDER BY 7.SAL. [condição de linha].GRADE 2 FROM EMP E.SAL BETWEEN S..} tabela [alias]..*|expressão [aliás]..ENAME..------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. 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 . S... SALGRADE S 3 WHERE E.------.. ordenados pelo nome do departamento. 7.LOSAL AND S.SQL> SELECT E. [outra condição de linha] {expressão|coluna} {condição de grupo} {expressão|coluna} [ASC|DESC] a) Mostrar o nome dos empregados e dos departamentos onde trabalham.. [condição de junção].HISAL ENAME SAL GRADE ---------.

------. d) Listar as faixas salariais dos empregados. c) Listar o nome. 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 . o local de trabalho e o departamento dos empregados com salário superior a 1500. juntamente com os números e nomes dos departamentos onde trabalham ENAME DEPTNO DNAME ---------. 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.------. b) Mostrar os nomes dos empregados.WARD SALES 14 rows selected.-------------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.

------------. o cargo. a faixa salarial.------CLERK 15600 10 ACCOUNTING 2 CLERK 9600 20 RESEARCH 1 CLERK 13200 20 RESEARCH 1 CLERK 11400 30 SALES 1 61 .-------------. exceto os Clerks.------------SMITH 800 DALLAS ADAMS 1100 DALLAS FORD 3000 DALLAS SCOTT 3000 DALLAS JONES 2975 DALLAS g) Listar os nomes dos empregados. ENAME ---------KING FORD SCOTT JONES BLAKE CLARK ALLEN TURNER MARTIN WARD JOB SAL GRADE DNAME --------.------.------. ENAME ---------MILLER SMITH ADAMS JAMES JOB SALARIO_ANUAL DEPTNO DNAME GRADE --------. ENAME ---------ALLEN TURNER JOB SAL GRADE --------.------.------SALESMAN 1600 3 SALESMAN 1500 3 f) Listar todos os empregados em Dallas.------.-------------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. o salário. Ordenar pelo salário. ENAME SAL LOCAL ---------. h) Listar os seguintes detalhes para os empregados que ganham 36. com os maiores primeiro.000 por ano ou que são Clerks.------.e) Mostrar somente os empregados na faixa 3. e o nome do departamento para todos na companhia.

GRADE.DEPTNO AND SAL > 1500 d) SQL> SELECT ENAME. DEPT WHERE EMP.DEPTNO = D. SALGRADE 3 WHERE SAL BETWEEN LOSAL AND HISAL e) SQL> SELECT ENAME. SAL.DEPTNO AND LOC='DALLAS' SELECT ENAME.DEPTNO. DEPT D WHERE E.0)=3600 OR JOB = 'CLERK') ORDER BY E. DEPT 3 WHERE EMP. JOB. GRADE 2 FROM EMP. DNAME 2 FROM EMP. LOC LOCAL FROM EMP.DEPTNO = DEPT.8 Solução dos exercícios a) SQL> SELECT ENAME. SAL*12+NVL(COMM. DNAME FROM EMP. SAL.DEPTNO b) SQL> SELECT ENAME. DNAME 2 FROM EMP E.DEPTNO.DEPTNO c) SQL> 2 3 4 SELECT ENAME. JOB. E. DEPT D 3 WHERE E.DEPTNO = DEPT.DEPTNO = D. DEPT WHERE EMP. SAL. DEPT WHERE EMP. D.7.DEPTNO AND SAL BETWEEN LOSAL AND HISAL AND JOB != 'CLERK' ORDER BY SAL DESC SELECT ENAME. DNAME 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.DEPTNO = DEPT. SAL. DNAME.JOB 62 . LOC LOCAL.DEPTNO AND SAL BETWEEN LOSAL AND HISAL AND (SAL*12+NVL(COMM.DEPTNO = DEPT. GRADE FROM EMP E. GRADE 2 FROM EMP. JOB. JOB. SALGRADE.0) SALARIO_ANUAL. SALGRADE.

40) ENAME DEPTNO DNAME ---------. que deve ser ficar ao lado da tabela onde as informações que não seriam incluídas devem aparecer. A junção externa completa (outer join) não é implementada diretamente pelo Oracle. uma vez que não há nenhum empregado lotado neste departamento.2 Junções externas Se uma linha não satisfaz a condição de junção. causando uma junção externa esquerda (left outer join). 8. O operador de junção externa (outer join) só pode aparecer em um dos lados da expressão. D. 8.-------------ALLEN 30 SALES BLAKE 30 SALES MARTIN 30 SALES JAMES 30 SALES TURNER 30 SALES WARD 30 SALES 40 OPERATIONS 7 rows selected. SQL> SELECT E. De fato. forçando listar os dados dos departamentos mesmo que não haja correspondência em EMP.DEPTNO. quando fazemos a junção equivalente (equi-join) das tabelas EMP e DEPT. O operador é um sinal de '+' colocado entre parênteses.DEPTNO AND D.1 Objetivos deste capítulo Mostrar métodos alternativos para construção de junções.Capítulo 8: Outros métodos de junção 8.ENAME. então a linha não é mostrada no resultado da consulta.3 Junção de uma tabela com ela mesmo É possível utilizar rótulos nas tabelas (aliases) para fazer a junção de uma tabela com ela mesmo. No exemplo o operador está colocado ao lado da tabela DEPT. E. EMP G 63 . No exemplo abaixo são mostrados todos os funcionários que recebem menos que seus gerentes.SAL GER_SAL 3 FROM EMP E.DEPTNO IN (30. 2 G. D. SQL> 2 3 4 SELECT E.DNAME FROM EMP E. como se fossem duas tabelas distintas.ENAME GER_NOME.------. o departamento 40 não aparece. As linhas excluídas podem ser retornadas se um operador de junção externa (outer join) for utilizado na condição de junção.ENAME EMP_NOME. ou uma junção externa direita (right outer join). DEPT D WHERE E.DEPTNO (+) = D. G.SAL EMP_SAL.

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.------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.4 Junções verticais Os operadores UNION.2 Interseção O operador INTERSECT retorna apenas as linhas comuns às duas consultas. G. 8.SAL < G. uma com o aliás 'E'.MGR = EMP_NOME EMP_SAL ---------. No exemplo são listados todos os cargos dos departamentos 10 e 30 sem repetição. INTERSECT e MINUS são úteis para construir consultas que se referem a tabelas diferentes. Estes operadores combinam os resultados de dois ou mais SELECTs em um único resultado.EMPNO AND E.4 WHERE E.1 União O operador UNION retorna todas as linhas distintas das consultas unidas por este operador.------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 cláusula FROM duas vezes.4.4. para os empregados. para os gerentes. 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 . 8. e outra com o aliás 'G'.SAL GER_NOME GER_SAL ---------.

porém podem ser utilizados parênteses para alterar esta ordem.4. Os tipos de dados das colunas correspondentes devem ser idênticos. NAME.4. ENAME. o nome da coluna não pode ser usado na cláusula ORDER BY quando estes operadores são utilizados. 8. 65 .5 A cláusula ORDER BY Como as colunas das tabelas podem ter nomes diferentes quando usamos UNION. Ao invés do nome deve ser usado o número da coluna.6 Regras para utilizar junções verticais • • • • As declarações SELECT devem ter todas o mesmo número de colunas. Linhas duplicadas são automaticamente eliminadas (DISTINCT não pode ser usado).4. Para listar os cargos existentes no departamento 10 mas não 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 Combinação de operadores É possível a construção de consultas com operadores UNION.4. como mostrado abaixo: SQL> 2 3 4 5 6 SELECT EMPNO. INTERSECT e MINUS. INTERSECT e MINUS combinados. SAL FROM EMP UNION SELECT ID.3 Subtração O operador MINUS retorna as linhas presentes na primeira consulta mas não presentes na segunda consulta. SALARY FROM EMP HISTORY ORDER BY 2 A cláusula ORDER BY deve ser sempre a última. 8.JOB --------CLERK MANAGER 8. Os nomes das colunas da primeira consulta são os que aparecem no resultado. Quando isto é feito a execução é efetuada de cima para baixo.

------. Múltiplas junções verticais podem ser utilizadas. DEPTNO DNAME ------.5 Exercícios a) Listar os departamentos que não possuem empregados. 8. Junções verticais podem ser usadas em sub-consultas.---------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. EMPNO ------7788 7902 7499 7521 7900 7844 7654 7934 7876 7566 7782 7698 7369 ENAME GER_NUM GER_NOME ---------. EMPNO ------7788 7902 7499 7521 7900 7844 7654 7934 7876 7566 7782 7698 7369 7839 ENAME GER_NUM GER_NOME ---------. c) Alterar a solução do exercício b para mostrar KING que não possui gerente. com parênteses.------. se necessário. Declarações SELECT são executadas de cima para baixo. A cláusula ORDER BY só pode conter os números das colunas. não os nomes.• • • • • A cláusula ORDER BY deve ser sempre a última. para alterar a ordem de execução.---------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 .-------------40 OPERATIONS b) Listar os números e os nomes dos empregados juntamente com os números e os nomes de seus gerentes.

f) Encontrar outra maneira de resolver o exercício a. DEPTNO DNAME ------. d) Mostrar os cargos que foram preenchidos no primeiro semestre de 1983 e no mesmo período em 1984. JOB --------CLERK e) Listar todos os empregados admitidos antes de seus gerentes.14 rows selected. 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.-------------40 OPERATIONS 67 .

8.EMPNO IS NULL SELECT EMPS.HIREDATE SELECT DEPTNO.DEPTNO. EMP M WHERE E. DEPT WHERE EMP. EMPS.EMPNO.HIREDATE FROM EMP E. GERS.6 Respostas dos exercícios 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 68 .EMPNO SELECT EMPS.ENAME. M.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.MGR = M.DEPTNO.DEPTNO (+) = D. GERS. GERS.ENAME.ENAME GER_NOME FROM EMP EMPS.ENAME EMPREGADO. DNAME FROM EMP E.ENAME GER_NOME FROM EMP EMPS.EMPNO GER_NUM.DEPTNO AND E. M. EMPS. DNAME FROM EMP. GERS.HIREDATE < M.EMPNO GER_NUM.MGR = GERS.EMPNO. EMP GERS WHERE EMPS. EMP GERS WHERE EMPS.HIREDATE.EMPNO AND E.DEPTNO = DEPT. E. DEPT D WHERE E.MGR = GERS. DNAME FROM DEPT MINUS SELECT EMP.ENAME GERENTE.

1 Objetivos deste capítulo Mostrar consultas declaradas nas cláusulas Where e Having. coluna2 tabela coluna1 = (SELECT coluna FROM tabela WHERE condição) Consultas aninhadas são muito úteis quando é necessário selecionar linhas de uma tabela sob uma condição que depende dos dados da própria tabela. >=.Capítulo 9: Consultas aninhadas 9. 9. <. <>.3 Consultas internas que retornam apenas um valor Para encontrar o empregado com o menor salário da empresa são necessárias duas etapas: a) achar qual o menor salário SQL> SELECT MIN(SAL) 2 FROM EMP MIN(SAL) -------800 b) localizar o empregado que recebe o menor salário SELECT ENAME. 9.------SMITH CLERK 800 Antes da consulta interna que retorna apenas um valor. JOB. e que retorna valores intermediários. 69 . Por exemplo: SELECT FROM WHERE coluna1.2 Definição de consultas aninhadas Uma consulta aninhada. podem ser usados os operadores =. SAL FROM EMP WHERE SAL = salário encontrado na etapa anterior Os dois comandos podem ser combinados em uma consulta aninhada: SQL> SELECT ENAME. <=. é aquela que está contida dentro de uma outra consulta. SAL 2 FROM EMP 3 WHERE SAL = (SELECT MIN(SAL) FROM EMP) ENAME JOB SAL ---------. ou subconsulta. JOB. >.--------.

DEPTNO) IN (SELECT MIN(SAL). Em seguida o bloco principal é executado. haviam dois blocos de consulta: um principal e outro interno. Para listar todos os empregados com o mesmo cargo do BLAKE: SQL> SELECT ENAME. SAL. produzindo o resultado: 800. 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 cláusula GROUP BY.4 Como as consultas aninhadas são executadas Uma declaração SELECT pode ser considerada como um bloco de consulta. não havendo assim qualquer correspondência entre o salário retornado e o departamento do funcionário. DEPTNO FROM EMP WHERE (SAL. 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. DEPTNO FROM EMP GROUP BY DEPTNO) ENAME SAL DEPTNO ---------.5 Consultas internas que retornam mais de um valor A consulta abaixo tenta localizar os empregados com o menor salário em cada departamento. e portanto retorna mais de um valor. No exemplo anterior. O bloco interno é executado primeiro. Neste caso o operador IN deve ser usado para tratar a lista de valores. O resultado da consulta interna não indica o departamento.------SMITH 800 20 JAMES 950 30 MILLER 1300 10 70 . SQL> SELECT ENAME. SAL.9. 9. Para haver correspondência entre o salário e o departamento a consulta foi escrita novamente: SQL> 2 3 4 SELECT ENAME.------. utilizando o valor retornado pelo bloco interno.------.

JOB. <>). é retornado um par de colunas que é comparado com um par de colunas da consulta principal. SAL.--------. Se uma consulta interna retornar mais de uma linha e a condição de procura utilizar um operador de uma linha apenas gera o erro mostrado abaixo: SQL> SELECT ENAME. 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 não retornar nenhuma linha: SQL> SELECT ENAME. As colunas listadas na consulta interna devem estar na mesma ordem das colunas à esquerda da condição de procura.6 Operadores ANY e ALL Os operadores ANY e ALL podem ser utilizados quando as consultas internas retornam mais de uma valor. Note que as colunas à esquerda da condição de procura estão entre parênteses e são separadas por vírgulas. ANY compara o valor com cada valor retornado pela consulta interna. <=. Para mostrar os empregados que recebem mais do que o menor salário do departamento 30: SQL> 2 3 4 5 SELECT ENAME.------KING 5000 PRESIDENT 10 SCOTT 3000 ANALYST 20 FORD 3000 ANALYST 20 JONES 2975 MANAGER 20 BLAKE 2850 MANAGER 30 71 . 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.Nesta nova consulta. SAL. Estes operadores são usados nas cláusulas WHERE e HAVING em conjunção com os operadores lógicos (=. DEPTNO FROM EMP WHERE SAL > ANY (SELECT DISTINCT SAL FROM EMP WHERE DEPTNO = 30) ORDER BY SAL DESC ENAME SAL JOB DEPTNO ---------. >=.------. <. >. As colunas retornadas pela consulta interna devem ser em mesmo número e do mesmo tipo de dados das colunas à esquerda da condição de procura.

DEPTNO FROM EMP WHERE SAL > ALL (SELECT DISTINCT SAL FROM EMP WHERE DEPTNO = 30) ORDER BY SAL DESC ENAME SAL JOB DEPTNO ---------.-------10 2916. AVG(SAL) FROM EMP GROUP BY DEPTNO HAVING AVG(SAL) > (SELECT AVG(SAL) FROM EMP WHERE DEPTNO = 30) DEPTNO AVG(SAL) ------.------. ALL compara o valor com todos os valores retornados pela consulta interna.67 20 2175 Para descobrir qual o cargo com maior salário médio: SQL> 2 3 4 5 SELECT JOB. JOB. ANY ou ALL 9. escrevemos: SQL> 2 3 4 5 SELECT DEPTNO.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. SQL> 2 3 4 5 SELECT ENAME.------KING 5000 PRESIDENT 10 SCOTT 3000 ANALYST 20 FORD 3000 ANALYST 20 JONES 2975 MANAGER 20 O operador NOT pode ser usado com IN.-------PRESIDENT 5000 72 . AVG(SAL) FROM EMP GROUP BY JOB HAVING AVG(SAL) = (SELECT MAX(AVG(SAL)) FROM EMP GROUP BY JOB) JOB AVG(SAL) --------. A consulta abaixo encontra os empregados que ganham mais do que todos os empregados do departamento 30.--------. Quando usamos ANY geralmente usamos DISTINCT para reduzir a lista de valores a serem comparados. SAL.7 Cláusula HAVING com consultas aninhadas Para mostrar os departamentos com salário médio superior ao salário médio do departamento 30.

Uma consulta interna correlacionada é identificada pela presença de uma coluna da consulta principal na consulta interna.DEPTNO) ORDER BY DEPTNO ENAME SAL DEPTNO ---------.------. 9. Repetir enquanto houver linha candidata Para encontrar os empregados que recebem mais do que o salário médio de seus departamentos: SQL> 2 3 4 5 SELECT EMPNO.8 Ordenação em consultas aninhadas • • Não pode existir a cláusula ORDER BY na consulta interna. A cláusula ORDER BY é sempre a última no comando SELECT.9 Limite para o aninhamento • Não há limite para o aninhamento de SELECT dentro de SELECT. Usar os resultados da consulta interna para qualificar os desqualificar a linha candidata. Passos para executar uma consulta interna correlacionada: • • • • Pegar a linha candidata fornecida pela consulta principal. ENAME. 9.------KING 5000 10 JONES 2975 20 SCOTT 3000 20 FORD 3000 20 ALLEN 1600 30 EMPNO ------7839 7566 7788 7902 7499 73 .10 Consulta interna correlacionada Uma consulta interna correlacionada é aquela que: • • é executada para cada uma das linhas consideradas candidatas na consulta principal. Executar a consulta interna usando os valores da consulta principal. SAL.9. DEPTNO FROM EMP E WHERE SAL > (SELECT AVG(SAL) FROM EMP WHERE DEPTNO = E. Estas propriedades causam a consulta interna ser processada de maneira diferente de uma consulta aninhada comum. a execução usa o valor da coluna da consulta principal.

DEPTNO = EMP. caso contrário retorna falso. A linha selecionada possui a coluna DEPTNO.DEPTNO) 74 .Smith. JOB. 800.EMPNO) ORDER BY EMPNO ENAME ---------JONES BLAKE CLARK SCOTT KING FORD JOB DEPTNO --------. DEPTNO FROM EMP E WHERE EXISTS (SELECT EMPNO FROM EMP WHERE EMP. A cláusula WHERE compara o salário de Smith. O salário médio do departamento do Smith é 2172. Para listar todas as empregados com ao menos um funcionário subordinado: SQL> 2 3 4 5 SELECT EMPNO. retorna verdadeiro.11 O operador EXISTS O operador EXISTS é freqüentemente usado com consultas aninhadas correlacionadas. Se o valor existir. e a cláusula WHERE da consulta interna também possui a mesma coluna da mesma tabela EMP. departamento 20.7698 BLAKE 2850 30 Análise da execução da consulta: • Consulta principal • • Seleciona a primeira linha candidata . ENAME.------MANAGER 20 MANAGER 30 MANAGER 10 ANALYST 20 PRESIDENT 10 ANALYST 20 EMPNO ------7566 7698 7782 7788 7839 7902 6 rows selected. salário 800.MGR = E. ENAME. 9. com o valor retornado da consulta interna. testando se o valor existe. O salário médio do departamento do empregado é calculado. • • Consulta Interna • • • O número do departamento é passado da consulta externa para a interna. DEPTNO FROM EMP WHERE NOT EXISTS (SELECT DEPTNO FROM DEPT WHERE DEPT. Para listar os empregados cujos departamentos não estão na tabela de departamentos: SQL> 2 3 4 SELECT EMPNO. portanto a consulta interna será realizada.

ENAME ---------KING SCOTT FORD JONES ALLEN MILLER JOB SAL --------. o salário e o número do departamento dos funcionários que recebem acima da média de seus departamentos.DEPTNO) DEPTNO DNAME ------. Ordenar pelo número do departamento. em ordem descendente de salário. 9. 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.------. DEPTNO ------20 10 30 ENAME ---------ADAMS KING JAMES HIREDATE --------04-JUN-84 09-JUL-84 23-JUL-84 d) Listar o nome.12 Exercícios a) Listar os empregados com o maior salário por cargo.no rows selected Uma outra forma para encontrar os departamentos sem funcionários é: SQL> 2 3 4 SELECT DEPTNO. c) Listar os últimos empregados contratados em cada departamento.DEPTNO = D.-------------40 OPERATIONS Note que neste exemplo a consulta interna não precisa retornar nada. mesmo que seja um literal. porém a cláusula SELECT precisa de uma coluna. DNAME FROM DEPT D WHERE NOT EXISTS (SELECT 1 FROM EMP E WHERE E.------PRESIDENT 5000 ANALYST 3000 ANALYST 3000 MANAGER 2975 SALESMAN 1600 CLERK 1300 b) Listar os empregados com os menores salário por cargo. ENAME SALARIO DEPTNO ---------. em ordem ascendente de salário.------KING 5000 10 JONES 2975 20 75 .

00 30 1.00 FORD 3.00 30 JONES 2.----------.------SCOTT 3000 KING 5000 FORD 3000 h) Em que ano a empresa contratou mais ? ANO NUMERO DE EMPREGADOS ---.-------------40 OPERATIONS f) Mostrar o departamento que tem mais despesas com seus funcionários.850.175. NOME SALARIO DEPARTAMENTO MEDIA_DEPT ---------. j) Escreva uma consulta que mostre um '*' junto do funcionário contratado mais recentemente ENAME ---------ADAMS ALLEN BLAKE CLARK FORD JAMES JONES KING MARTIN MILLER SCOTT HIREDATE MAIOR_DATA --------.-----------.67 BLAKE 2. DEPTNO DNAME ------.---------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 .----------ALLEN 1.000.67 6 rows selected.566.------------20 130500 g) Quais os três empregados que ganham mais ? ENAME SAL ---------.916.975.SCOTT FORD ALLEN BLAKE 3000 3000 1600 2850 20 20 30 30 e) Listar os departamentos sem funcionários.00 10 2. DEPTNO MAIOR_DESPESA ------.00 20 2.000.000.600.00 20 KING 5.00 20 SCOTT 3.-------------------1984 8 i) Modificar o exercício d para mostrar o salário médio do departamento junto com as outras informações.

SMITH TURNER WARD

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

14 rows selected.

77

9.13

Resposta dos exercícios
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

0 = form feed. se algum for usado.Capítulo 10: Geração de relatórios 10. Formato padrão para resultados numéricos. O comando SHOW ALL exibe todas as variáveis do comando SET. OFF suprime a exibição dos resultados produzidos pelos comandos executados a partir de um arquivo. Máximo igual a 10. OFF suprime a espera. e aprender a formatar os resultados das consultas no SQL*PLUS. Número de linhas por página. ON causa a impressão do cabeçalho da coluna no relatório. Notas: • O nome da coluna deve ser o nome do aliás. 80 . 'n' faz com que seja mostrado o número de linhas selecionadas na tela. 10. ON aguarda pressionar ENTER antes de mostrar a nova tela. e controle para centrar e ajustar texto à direita. Número de caracteres a serem exibidos antes da marca de nova linha. OFF suprime a impressão do cabeçalho. OFF não mostra. LOWER e UPPER convertem os caracteres antes da execução.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. 10. MIXED não altera os caracteres do texto. Largura padrão para colunas numéricas.3 COLUMN Através do comando COLUMN podem ser alteradas propriedades das colunas. ON mostra as estatísticas de tempo de cada comando SQL processado. Número de espaços entre colunas. quando 'n' ou mais linhas são selecionadas. Número de linhas em branco entre o título inferior de uma página e o título superior da página seguinte. mantendo o Spool.1 Objetivos deste capítulo Aprender os comandos SET que controlam o ambiente. 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 variável de substituição.

número negativo entre parênteses. como B9999. como 099999. Coloca o texto especificado quando o valor da coluna for nulo. Remove a formatação prévia da coluna.• • As opções podem vir em qualquer ordem. Especifica um cabeçalho para a coluna.999.2 Outras opções de exibição das colunas. valores zero em branco. como 999.. como 999999. como 9999V99. O padrão é JUSTIFY LEFT para caracteres e datas.3. .. cifrão flutuante. 10. MI PR EEEE V B SIGNIFICADO alfanumérico.4 Exemplo de formatação de colunas 81 . 10. coloca zeros à esquerda. e JUSTIFY RIGHT para números. Uma vez emitido. 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 conteúdo da coluna excede a sua largura. como $999999. Faz com que a coluna apareça ou não no relatório. ponto decimal. Alinhamento do cabeçalho da coluna. se não for eliminado. Copia a especificação de uma outra coluna.3. o comando permanece válido até o fim da sessão. como 99. como 999999. sinal de menos à direita. Especifica que a formatação é válida para uma consulta apenas.1 Formato de exibição para as colunas COL xxx FORMAT yyy .9999EEEE.99. Move a palavra toda. multiplicar por 10**n. O padrão é WRAP. Começa uma nova linha antes da coluna especificada ser exibida. Para descobrir as opções atribuídas para a coluna digite COL nome_da_coluna. como 999999MI. como 999999PR. largura n. vírgula. FORMATO An 9 0 $ . • 10. posição numérica. notação científica.99.

400.00 Sem com.00 300. SAL.00 SALESMAN 7844 1.00 1. 60.000. ----020 030 030 020 030 030 010 020 010 030 020 030 020 Num. 60.00 ANALYST 7902 3.00 page 1 82 .600.00 ANALYST 7788 3.00 SALESMAN 7499 1.400.100.----. Salario Remuneracao Cargo Emp.500. COMM.00 Sem com. 35. JOB.00 SALESMAN 7521 1.00 Sem com. 9. 11.600.250.00 ANALYST 7788 3.000.200.5 Exemplo de formatação de título TTITLE 'título' Imprime a data no topo da folha.700.00 Sem com.00 Sem com.' JOB FORMAT A9 HEADING 'Cargo' JUSTIFY RIGHT EMPNO FORMAT 9999 HEADING 'Num.00 MANAGER 7566 2. 35.000.250.00 0.400.----.000.000.00 Dept.999. 36.00 Sem com.00 PRESIDENT 7839 5.975.00 CLERK 7876 1.700.00 CLERK 7934 1. e o título centrado na linha seguinte. SAL*12+NVL(COMM.400. BTITLE 'título' TTITLE OFF BTITLE OFF SQL> TTITLE 'RELATORIO DA EMPRESA|Produzido pelo DP' SQL> BTITLE '*** CONFIDENCIAL ***' SQL> / Thu Oct 27 RELATORIO DA EMPRESA Produzido pelo DP Dept.500.200. 9.00 300.000. EMPNO. 11.00 SALESMAN 7654 1.400.00 SALESMAN 7499 1. Limpa o título superior.00 Sem com. 13. Mensal Comissao Total --------.00 Sem com.00 18.250.00 Sem com.999.450.00 Sem com. 36. Salario Remuneracao Cargo Emp.00 MANAGER 7782 2.500.00 CLERK 7876 1.400.00 1.00 15. Mensal Comissao Total --------.000.000.99 HEADING 'Salario|Mensal' COMM FORMAT 99.00 Sem com.' REM FORMAT 999.00 500.850.00 SALESMAN 7521 1.' SAL FORMAT 99.00 Sem com. 34. O caracter '|' serve para quebrar linhas.000.00 Sem com. 36.600.00 PRESIDENT 7839 5. Imprime um texto centrado ao fim de cada página. 34.000.00 MANAGER 7782 2.500.00 CLERK 7900 950.000.00 ANALYST 7902 3.00 15.850.00 Sem com.400. Limpa o título inferior.250.00 CLERK 7900 950.00 SALESMAN 7844 1.00 19.----------CLERK 7369 800.500. ----020 030 030 020 030 030 010 020 010 030 020 030 020 010 10.200. 29.---------.00 500.500.300.00 Sem com.99 HEADING 'Remuneracao|Total' SQL> SELECT DEPTNO. 29.990.00 18. o número da folha no canto direito superior.----------CLERK 7369 800.000.00 SALESMAN 7654 1.00 MANAGER 7566 2.0) REM 2 FROM EMP Num.00 16.---------.400. 13.200.00 Sem com.00 16.00 Sem com. 15.99 HEADING 'Comissao' NULL 'Sem com. 36.---------.00 19.000.450.00 Sem com.---------.600.000.00 MANAGER 7698 2.00 MANAGER 7698 2.SQL> SQL> SQL> SQL> SQL> SQL> COLUMN COLUMN COLUMN COLUMN COLUMN COLUMN DEPTNO FORMAT 099 HEADING 'Dept.00 0.975.|Emp. no canto esquerdo superior.100.00 Sem com.600.

00 *** CONFIDENCIAL *** 10.00 Sem com.------.------.300.6 Exemplo de remoção da formatação 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 --------.600. 83 .------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. 15.010 CLERK 7934 1.------.

Se não houver nenhuma cláusula FORMAT ativa. A especificação do formato para os títulos é semelhante a especificação do formato para as colunas.SQLCODE Descrição Número da pagina corrente.Capítulo 11: Geração de Relatórios . o formato não tem efeito para este item. As cláusulas LEFT e CENTER se baseiam no comando SET LINESIZE para calcular a posição dos itens de dados. ou na ausência deste com o formato padrão.PNO > RIGHT 'Produzido por: Contabilidade' SKIP 2 > CENTER 'Relatorio Confidencial de Vendas' SKIP > CENTER '--------------------------------' SKIP 2 84 . Número da linha corrente. Define o formato dos itens de dados que seguem a cláusula. como mostrado abaixo: Cláusula COL n SKIP n LEFT CENTER RIGHT Descrição Posicionar a impressão na coluna 'n' na linha corrente.1 Objetivos deste capítulo Mostrar propriedades dos cabeçalhos e rodapés. e os comandos BREAK e COMPUTE.2 Propriedades dos cabeçalhos e dos rodapés Os comandos TTITLE e BTITLE podem incluir diversas cláusulas. Os itens de dados que seguem esta cláusula. variáveis de sistema. Se n=0 volta para o começo da linha corrente. Valores de data são impressos no formato padrão. 11.Parte 2 11. O valor de 'n' deve ser negativo para haver o recuo. são alinhados como um grupo. TAB n FORMAT Podem ser incluídas. Se 'n' for omitido salta 1 linha. até o fim do comando ou até a próxima ocorrência desta cláusula. Volta atrás se a coluna tiver sido passada. Variável SQL. no centro. Alinha à esquerda. Código do erro mais recente. os valores numéricos são impressos de acordo com o comando SET NUMFORMAT. Saltar 'n' linhas. até o fim do comando ou até a próxima ocorrência de uma destas cláusulas. Avança ou recua a posição de impressão 'n' caracteres. Nome do usuário. Se o tipo de dado for conflitante com o formato.PNO SQL.USER SQL.LNO SQL. também. O exemplo a seguir mostra algumas das opções disponíveis para TTITLE e BTITLE: SQL> TTITLE LEFT FORMAT 0999 'Pagina: 'SQL. Somente uma especificação de formato está ativa a cada instante. ou à direita da linha corrente. mostrar a variável NEW_VALUE.

SQL> COLUMN SYSDATE NEW_VALUE HOJE NOPRINT SQL> SELECT SYSDATE 2 FROM SYS.DUAL faz com que SYSDATE seja selecionada a partir da tabela SYS.DUAL Data: 31-OCT-94 Usuario: ALUNO1 Pagina: Um relatorio com a data reformatada no titulo SQL> TTITLE OFF 1 A cláusula COLUMN SYSDATE NEW_VALUE HOJE NOPRINT faz com que sempre que a coluna com nome SYSDATE seja selecionada. A cláusula NOPRINT impede a impressão da variável SYSDATE como um relatório separado.SQL> BTITLE CENTER 'FIM DO RELATORIO' SKIP > CENTER '----------------' SQL> SELECT ENAME.DUAL SQL> TTITLE LEFT 'Data:' HOJE RIGHT FORMAT 999 'Pagina:' SQL.DUAL. 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 --------. O comando SELECT SYSDATE FROM SYS. As variáveis podem ser usadas para modificar um comando SQL dinamicamente. 85 .------SALESMAN 1600 300 SALESMAN 1250 500 SALESMAN 1250 1400 SALESMAN 1500 0 FIM DO RELATORIO ---------------SQL> TTITLE OFF SQL> BTITLE OFF 11. SAL.3 A cláusula NEW_VALUE Esta cláusula permite armazenar os valores das colunas em variáveis do SQL*PLUS. apenas um valor. e vai retornar. que é uma tabela que contém apenas uma linha.USER SKIP > CENTER 'Um relatorio com a data reformatada no titulo' SKIP 2 SQL> SELECT SYSDATE 2 FROM SYS. portanto. JOB.PNO SKIP > LEFT 'Usuario: ' SQL. exibir valores nos cabeçalhos e passar um valor de um comando SQL para outro. seu valor passe para a variável HOJE.------.

salta 'n' linhas quando o valor da coluna muda. Somente existe um comando BREAK ativo de cada vez. 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. Quando se faz uma quebra por uma coluna. definida e com valor atribuído pela cláusula NEW_VALUE. os valores duplicados da coluna são omitidos. o resultado deve ser ordenado pelas colunas com quebra especificada. O exemplo abaixo ilustra o uso do comando BREAK: SQL> COLUMN DEPTNO FORMAT 099 HEADING 'Dept. Desta forma. SYSDATE é impressa no cabeçalho através da variável HOJE.4 Quebras nos relatórios O comando BREAK pode ser utilizado para quebrar os relatórios em sessões. portanto todas as quebras devem ser especificadas no mesmo comando.' 86 . Como a quebra ocorre toda vez que o valor da coluna muda. No exemplo abaixo. O comando BREAK permite as seguintes opções 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. a variável MAIOR_SALARIO_MEDIO é utilizada para passar um valor de uma consulta para a outra.O comando TTITLE LEFT 'Data: ' HOJE faz referência a variável HOJE.' SQL> COLUMN JOB FORMAT A9 HEADING 'Cargo' JUSTIFY RIGHT SQL> COLUMN EMPNO FORMAT 9999 HEADING 'Emp. mostra os valores duplicados.|Num.

000. Com.5 Cálculo de sumários O comando COMPUTE realiza cálculos baseados nas quebras estabelecidas pelo comando BREAK. 60.0) REM 2 FROM EMP 3 ORDER BY DEPTNO.99 > HEADING 'Comissao|Y-T-D' NULL 'Sem Com.00 *** CONFIDENCIAL *** SQL> CLEAR COLUMNS columns cleared SQL> TTITLE OFF SQL> BTITLE OFF SQL> CLEAR BREAKS breaks cleared 11.250.00 MANAGER 7782 2. Cargo Num. COMPUTE cláusulas OF colunas ON quebras Cláusulas AVG COU[NT] MAX[IMUM] MIN[IMUM] NUM[BER] Descrição calcula a média conta os valores não nulos valor máximo valor mínimo número de linhas 87 Tipo da coluna número qualquer número ou caracter número ou caracter qualquer .000. COMM.' SQL> COLUMN REM FORMAT 9. 2.500.000.00 19.00 15.--------.----------.00 1. 36.999.----.00 300.00 500.00 0.999. Com.000.00 1.00 9.000.00 16. 15. 1.00 Sem Com. EMPNO.00 Sem Com.00 36.00 35.000. Salario Comissao Remuneracao Dept.00 Sem Sem Sem Sem Sem Com. Com.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.400.99 HEADING 'Salario|Mensal' SQL> COLUMN COMM FORMAT 999. SAL.00 800.450.00 Sem Com.400. JOB Mon Oct 31 RELATORIO DA COMPANHIA Produzido pelo Departamento Pessoal Emp.00 2.00 1.00 34.400. SAL*12+NVL(COMM.600.300.00 1.850.00 page 1 950. JOB.00 11.500.00 13.00 3.600.100.500.------------010 CLERK 7934 1.600.250.200.00 020 ANALYST CLERK MANAGER 030 CLERK MANAGER SALESMAN 7788 7902 7369 7876 7566 7900 7698 7499 7654 7844 7521 3.00 Sem Com. Com.990.999.400.000.975.00 18.700.200.----------. Mensal Y-T-D Total ----.00 PRESIDENT 7839 5. 29.00 Sem Com.00 1.SQL> COLUMN SAL FORMAT 999.

000. SAL.------------Sem Com. Com.450.750.000.00 3. 60.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.00 36.99 HEADING 'Salario|Mensal' SQL> COLUMN COMM FORMAT 999. 15.00 1.00 35.000.--------.916.67 sum 8. SAL*12+NVL(COMM.999.99 HEADING 'COMISSAO|Y-T-D' NULL 'Sem Com. Com.00 800. mas geralmente é mais fácil especificar tudo em um único comando. 29. 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. Com.' SQL> COLUMN SAL FORMAT 999. Com.00 Sem Com.990.0) REM 2 FROM EMP 3 ORDER BY DEPTNO.600.00 MANAGER 7782 2.975.|Num.000.100. JOB Mon Oct 31 Relatorio da Companhia Produzido pelo Departamento Pessoal Emp.00 00020 ANALYST CLERK MANAGER 7788 7902 7369 7876 7566 3.00 13.999.00 9.600.000.999. como. Cargo Num.00 ----------0.000. COMM.00 page 1 88 .400.' SQL> COLUMN JOB FORMAT A9 HEADING 'Cargo' JUSTIFY RIGHT SQL> COLUMN EMPNO FORMAT 9999 HEADING 'Emp.----.00 COMISSAO Remuneracao Y-T-D Total ----------.----------00010 CLERK 7934 1.00 2.00 Sem Sem Sem Sem Sem Com. 36.700.00 PRESIDENT 7839 5. EMPNO.200.00 Sem Com.00 ****** ********* ----------avg 2.' SQL> COLUMN REM FORMAT 9.STD SUM VAR[IANCE] desvio padrão soma os valores não nulos calcula a variância número número número Pode haver vários comandos COMPUTE ativos ao mesmo tempo. Salario Dept. Mensal -----.300.

--------------ANALYST .000.073.200.00 ****** ********* avg sum avg sum 14 rows selected.00 9.00 Sem Com.--------------.00 950. 2.975.00 2.000.****** ********* avg sum 00030 CLERK MANAGER SALESMAN 7900 7698 7499 7654 7844 7521 ----------. SAL.450. SAL e DEPTNO.--------------.00 19.--------------sum 8. Abaixo estão descritas as etapas a serem seguidas para a obtenção do relatório: a) Listar as informações necessárias contidas na tabela EMP.00 Sem Com.00 4.850. JOB.00 1.400.00 34.00 2.--------------.00 10.000.300.400.00 6.875.875.00 9.250.00 1.025.500.00 SALESMAN . 1.----------2.00 5.00 2.00 15.00 5. DEPTNO 2 FROM EMP 89 .00 CLERK 1.00 10.566.00 29.500.00 2.00 18.00 1.600.00 1.00 16.400. como mostrado abaixo: Mon Oct 31 Relatorio da Companhia JOB Departamento 10 Departamento 20 Departamento 30 Total por Cargo --------.00 MANAGER 2.400.21 550.250.600.500.00 .00 1.00 --------------.00 Confidencial page 1 A tabela EMP tem todas as informações necessárias para produzir o relatório.750.150.00 300.67 550.00 .00 ----------.00 .00 0.00 500.000.00 950.400. SQL> SELECT JOB.--------------.200.00 PRESIDENT 5.025.00 ----------.00 0.00 29.900.00 .200.00 5.600.175.----------2.275. ou seja.850.00 *** CONFIDENCIAL *** 11.--------------.00 8.00 6.----------1.6 Relatório matricial Suponha que se deseje produzir um relatório sumarizando os salários por cargo e por departamento.000. SQL> CLEAR COLUMN columns cleared SQL> CLEAR BREAKS breaks cleared SQL> CLEAR COMPUTE computes cleared SQL> TTITLE OFF SQL> BTITLE OFF 11.

SQL> 2 3 4 5 6 SELECT JOB. 0) D10.------. 30. SUM(DECODE(DEPTNO. 90 . 10.------. 30. 20. SAL. SQL> 2 3 4 5 SELECT JOB.------. SUM(DECODE(DEPTNO. DECODE(DEPTNO. 0) D20.------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. SAL.------.------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. 0)) D20.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. SAL. 0)) D30 FROM EMP GROUP BY JOB JOB D10 D20 D30 --------.------. SAL. 0) D30 FROM EMP JOB D10 D20 D30 --------. c) Sumarizar os campos de acordo com o grupo do cargo e o departamento. 20. SAL. DECODE(DEPTNO. SAL. b) Separar a coluna SAL em 3 departamentos separados. 0)) D10. usando a função DECODE. SUM(DECODE(DEPTNO. 10. DECODE(DEPTNO.

600.99 99.999.00 SALESMAN .300.000.00 . SAL. 0)) D30.00 .00 1.------.275.--------------.--------------.00 . SUM(SAL) TBJ FROM EMP GROUP BY JOB JOB D10 D20 D30 TBJ --------.975. 20.875.99 999.------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 relatório com os comandos do SQL*PLUS.00 8.00 5.00 5.00 MANAGER 2. 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' / 99. SAL.000.150.999.000.99 Mon Oct 31 Relatorio da Companhia page 1 JOB Departamento 10 Departamento 20 Departamento 30 Total por Cargo --------.999.00 Confidencial SQL> TTITLE OFF SQL> BTITLE OFF SQL> CLEAR COLUMN columns cleared SQL> CLEAR BREAKS breaks cleared SQL> CLEAR COMPUTE computes cleared 11.00 .--------------.00 6.--------------ANALYST .99 99.00 2.00 10. 0)) D20.00 CLERK 1.SQL> 2 3 4 5 6 7 SELECT JOB.025.--------------.400.00 --------------.------.--------------.--------------sum 8.750.00 5.450. 10.00 950. SUM(DECODE(DEPTNO. 0)) D10. SUM(DECODE(DEPTNO.------.900.00 29.999.00 4.00 PRESIDENT 5. SAL. 30.7 Arquivo de comandos para o SQL*PLUS Para criar um arquivo de comandos para o SQL*PLUS: a) Prepare o comando SELECT 91 .00 9.00 2.00 6.000.850. SUM(DECODE(DEPTNO.600.

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

00 36.000.000. DEPARTAMENTO CARGO NUM.00 05/84 2.----------29.--------.00 1.00 07/84 5.00 130.----------8.400.----------11/83 1.00 1.00 19. NOME -----------.200.00 0.00 3.025.00 18.600.500.00 950.00 105.400.00 800.000.000.00 0.11.250.00 2.600.00 115.500.450.00 0.-------.00 --------.8 Exercícios a) Produza o relatório 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.00 16.00 15.00 1.000.300.00 34.00 2.00 29.----------10.00 0.00 0. ADM.000.00 --------.00 --------.00 2.500.00 15.600.00 1.000.700.00 1.250.-------.--------.00 11.200.100.000.00 13.400.00 0.400.500.00 9.00 1.200.00 2.00 0.750.----------9.00 0.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 .00 --------.00 0. MENSAL ANUAL TOTAL ----.-------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.975.00 36.00 12/83 03/84 06/83 06/84 10/83 3.00 500.875.00 0.00 0.200.-------.00 300.500.00 0.00 350.-------.000.00 35.00 60.850.400.-------.00 0.----.

200.00 2.----------950.00 18.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.----------9.200.00 0.00 2.00 1.00 0.000.00 -------. DEPARTAMENTO CARGO NUM.500.200.----------9.--------.00 115.400.00 1.00 0.00 16.-------SALES CLERK 7900 JAMES MANAGER 7698 BLAKE SALESMAN 7499 ALLEN 7521 WARD 7844 TURNER 7654 MARTIN ************ ********* sum page 1 sum 94 .--------.--------.500.250.00 -------.400.000.00 19. O número do departamento deve ser solicitado em tempo de execução.00 1.00 300. NOME -----------. ----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 -------.00 2.850.b) Produza o relatório abaixo.600.00 115.250.400. Mon Oct 31 R E L A T O R I O D O S DATA ADM.500.000.00 15.----.400.--------.00 1.00 500.00 1.400.00 11.00 34.

&COMM G. JOB old 2: TO_CHAR(HIREDATE. SAL*12+NVL(COMM. EMPNO C.99 HEADING 'SALARIO|MENSAL' TEMP SQL> COL G FORMAT 9. &COMM G. EMPNO C.' TEMP SQL> COL D FORMAT A8 HEADING 'NOME' TEMP SQL> COL E FORMAT A5 HEADING 'DATA|ADM.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. SAL F. 2 TO_CHAR(HIREDATE.|ANUAL' TEMP SQL> COL H FORMAT 999.|NUM. DEPT D 4 WHERE E.'MM/YY') E. SAL*12+&COMM H new 2: TO_CHAR(HIREDATE. NVL(COMM. ENAME D.999. &COMM G. SAL*12+&COMM H 3 FROM EMP E.DEPTNO 5 AND E. NVL(COMM.DEPTNO = 30 95 . 2 TO_CHAR(HIREDATE.DEPTNO = &DEPTNO 6 ORDER BY DNAME.DEPTNO = D.DEPTNO 5 ORDER BY DNAME. &COMM G.990.99 HEADING 'COMISSAO|ANUAL' TEMP SQL> COL H FORMAT 999.9 Respostas dos exercícios 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.'MM/YY') E.99 HEADING 'COM.99 HEADING 'SALARIO|MENSAL' TEMP SQL> COL G FORMAT 9.' TEMP SQL> COL F FORMAT B99. ENAME D. SAL F. SAL*12+&COMM H new 2: TO_CHAR(HIREDATE.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) G.999.' TEMP SQL> COL D FORMAT A8 HEADING 'NOME' TEMP SQL> COL E FORMAT A5 HEADING 'DATA|ADM. SAL*12+NVL(COMM.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.0) H old 5: AND E.0)' SQL> COL A FORMAT A12 HEADING 'DEPARTAMENTO' TEMP SQL> COL B FORMAT A9 HEADING 'CARGO' TEMP SQL> COL C FORMAT 9999 HEADING 'EMP. SAL*12+&COMM H 3 FROM EMP E.999.DEPTNO = &DEPTNO new 5: AND E. SAL F.DEPTNO = D. JOB B. DEPT D 4 WHERE E.990.11.'MM/YY') E.' TEMP SQL> COL F FORMAT B99.|NUM. SAL F.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.999.'MM/YY') E. JOB B. SAL F.0) G. JOB old 2: TO_CHAR(HIREDATE.'MM/YY') E.'MM/YY') E. SAL F.

EMPNO. existe um processo de navegação na árvore que permite a hierarquia ser construída.2 Quando é possível caminhar na árvore A tabela EMP tem uma estrutura em forma de árvore. KING (EMPNO=7839) | ------------------------------------. Quando uma navegação na árvore é executada. não espere ver o resultado na forma da figura acima. JOB. Entretanto.1 Objetivos deste capítulo Utilizar os relacionamentos hierárquicos para recuperar dados em uma tabela. A coluna MGR indica o número do empregado ao qual o empregado está subordinado. indicando os gerentes de cada funcionário.(MGR=7839) | | | CLARK JONES BLAKE | | | | -------------------------------------| | | | | | | | MILLER SCOTT FORD ALLEN WARD MARTIN TURNER JAMES | | ADAMS SMITH Um banco de dados relacional não armazena os registros em forma hierárquica. ENAME.Capítulo 12: Hierarquias . quando existe um relacionamento hierárquico entre linhas de uma única tabela. A hierarquia pode ser vista analisando-se os valores idênticos nas colunas EMPNO e MGR da tabela EMP (Este relacionamento já foi visto quando foi feita a junção desta tabela com ela mesmo). DEPTNO. Para caminhar na árvore da tabela EMP: SQL> BREAK ON DEPTNO SKIP 1 SQL> 2 3 4 SELECT LEVEL. o resultado é uma tabela. O nível (LEVEL) indica a distância do nó à raiz da árvore. 12. SAL FROM EMP CONNECT BY PRIOR EMPNO = MGR START WITH MGR IS NULL 96 .Caminhando na Árvore 12.

------.------. Estabelece a direção para caminhar na árvore.---------. Especifica as colunas onde existe o relacionamento entre as linhas. então os valores de MGR são pesquisados primeiro. DEPTNO. a estrutura hierárquica da empresa é refletida na navegação pela árvore. JOB. ENAME. É a última cláusula. 1) PRIOR expressão operador_de_comparação expressão 2) expressão operador_de_comparação PRIOR expressão Se PRIOR aparece antes de MGR. Especifica onde começa a pesquisa. A estrutura chefe/subordinado fica claramente identificada.--------. O comando abaixo é totalmente legítimo: SQL> 2 3 4 5 SELECT LEVEL. Restringe as linhas pesquisadas durante a navegação.------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 Descrição A cláusula SELECT padrão. START WITH ORDER BY No exemplo acima. ou seja.LEVEL DEPTNO EMPNO ENAME JOB SAL ------. incluindo a pseudo coluna LEVEL que mostra a distância do nó à raiz. Se PRIOR aparece antes de EMP a árvore é percorrido do topo para a raiz. e depois os valores equivalentes de EMP. EMPNO. A cláusula ORDER BY pode ser usada para ordenar as linhas retornadas. Esta cláusula é obrigatório para caminhar na árvore. Não pode ser usado na forma 'START at a LEVEL'. Só pode conter uma tabela. como sempre. pesquisa da raiz para o topo. Esta cláusula é opcional. SAL FROM EMP CONNECT BY PRIOR EMPNO = MGR START WITH MGR IS NULL ORDER BY DEPTNO 97 .

EMPNO.------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 Não é recomendada a utilização da cláusula ORDER BY. ENAME.------. JONES | ---------------| | SCOTT FORD | | ADAMS SMITH Neste exemplo. SCOTT é eliminado. DEPTNO. SQL> 2 3 4 5 SELECT LEVEL.---------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 --------.------. somente o nó é eliminado. 12. porque a ordenação implícita pode ser destruída. SAL FROM EMP WHERE ENAME <> 'SCOTT' CONNECT BY PRIOR EMPNO = MGR START WITH MGR IS NULL 98 . • WHERE ENAME <> 'SCOTT' Quando a cláusula WHERE é utilizada para eliminar o nó.3 Excluindo um nó da árvore As cláusulas WHERE e CONNECT BY podem ser usadas para podar a árvore. isto é.LEVEL DEPTNO EMPNO ENAME ------. controlar os nós que são mostrados. JOB. mas ADAMS permanece.

SAL FROM EMP CONNECT BY PRIOR EMPNO = MGR AND ENAME <> 'SCOTT' START WITH MGR IS NULL 99 .LEVEL DEPTNO EMPNO ENAME JOB SAL ------.---------. SQL> 2 3 4 SELECT LEVEL.------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. toda a sua ramificação é eliminada. DEPTNO.--------.------. EMPNO. JOB. SCOTT e ADAMS são eliminados.------. JONES | ---------------| | SCOTT FORD | | ADAMS SMITH Neste exemplo. • CONNECT BY PRIOR EMPNO=MGR AND ENAME <> 'SCOTT' Quando a cláusula CONNECT BY é utilizada para eliminar o nó. ENAME.

LEVEL DEPTNO EMPNO ENAME JOB SAL ------. Um nó que possui outros nós de nível inferior.5 Exercícios a) Mostrar a organização do departamento 20. 12. Um nó que não possui filhos. 12. Um nó que tem filhos e netos.4 Terminologia Inglês NODE ROOT PARENT CHILD TERMINAL NODE LEAF BRANCH Português Nó Raiz Pai Filho Folha Ramo ou Galho Descrição O mesmo que uma linha da tabela. O nó que não pertence a nenhum outro nó.------.------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.---------.--------.------. 100 . Um nó que tem um pai.

No dicionário de dados são permitidas apenas consultas por parte dos usuários. sinônimos. 13.) Restrições aplicadas sobre as tabelas. sendo uma peça crítica no funcionamento do gerenciador do banco de dados. 13.Capítulo 13: Dicionário de Dados 13. são executados. Todas as tabelas do dicionário de dados pertencem ao usuário SYS. e não são acessadas diretamente porque as informações armazenadas nestas tabelas são de difícil compreensão. Os direitos e privilégios concedidos aos usuários. 13. Informações de auditoria. Acesso público ao dicionário de dados é concedido através das visões. 101 .5 Visões do dicionário de dados As visões do dicionário de dados contém informações em uma maneira fácil de serem compreendidas.2 O que é o dicionário de dados O dicionário de dados é um conjunto de tabelas e visões que provê um guia de referência sobre o banco de dados. Nomes dos objetos do banco de dados (tabelas. 13. O conjunto de tabelas e visões é fixo. índices.4 Tabelas do dicionário de dados As tabelas do dicionário de dados são criadas automaticamente quando o comando CREATE DATABASE é executado. quando um comando da linguagem de definição de dados (DDL).3 Informações contidas no dicionário de dados As seguintes informações podem ser obtidas a partir do dicionário de dados: • • • • • Os nomes dos usuários do banco de dados. O dicionário de dados é criado quando o banco de dados é criado. ou outros comandos. e não do acesso direto às tabelas. tais como que acessou ou atualizou um determinado objeto do banco de dados. que utiliza as informações contidas no dicionário de dados para gerenciar o próprio banco de dados. visões.1 Objetivos deste capítulo Apresentar o dicionário de dados do Oracle. e o conteúdo é atualizado automaticamente pelo Oracle. seqüências.

Visões que qualquer usuário pode acessar. Classe USER_xxx ALL_xxx Descrição Visões que qualquer usuário pode acessar.As visões do dicionário de dados também pertencem aos usuários SYS. Visões que só podem ser acessadas pelos usuários com privilégio de administrador do banco de dados DBA_xxx Existem ainda algumas visões que não possuem nenhum destes três prefixos. ALL e DBA. synonyms. As visões são classificadas em três grupos distinguidos pelos prefixos USER. sequences accessible to the user Comments on columns of accessible tables and views Grants on columns for which the user is the grantor. 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. grantee. contendo informações relativas tanto aos objetos do próprio usuário. views. 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 Visão 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 . quanto informações sobre os objetos aos quais foram concedidos privilégios ao usuário. Abaixo é mostrada a relação das visões do dicionário de dados. owner. Os nomes das visões refletem o tipo de uso para o qual elas foram criadas. juntamente com suas descrições: Visão DICTIONARY DICT_COLUMNS TABLE_PRIVILEGES Descrição 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 PUBLIC is the grantee Descrição All tables. contendo informações relativas aos objetos do próprio usuário. or owner.

tablespace. owner.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. Sequences Description of all clusters in the database Mapping of table columns to cluster columns Comments on columns of all tables and 103 . user Audit trail records concerning grant. [public] synonym. revoke. grantee. views and clusters Comments on tables and views accessible to the user Grants on objects for which the user is the grantor. audit. specifically: table. Views. index. role. [public] database link. 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 Visão 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 Descrição 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. Synonyms. view. trigger. sequence. noaudit and alter system All audit trail entries All database Tables. rollback segment. 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. cluster. procedure.

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

tablespace. view. index. Views. user Audit trail records concerning grant. role. trigger. 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. rollback segment. [public] synonym. 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. specifically: table. [public] database link. cluster. of various pl/sql objects Auditing options for user's own tables and views 105 . revoke. noaudit and alter system Audit trail entries relevant to the user Tables. in bytes. procedure. sequence.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 Visão 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 Descrição Audit trail records for statements concerning objects. audit.

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 visões: SYSCATALOG. SYSVIEWS. SYSUSERAUTH.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. SQL> DESCRIBE ACCESSIBLE_TABLES Name ------------------------------OWNER TABLE_NAME TABLE_TYPE SQL> SELECT * 2 FROM ACCESSIBLE_TABLES 3 ORDER BY 1. SYSTABSPACES. SYSCOLUMNS. SYSFILES. SYSTABALLOC. SYSDBLINKS. SYSINDEXES. SYSTEM_AUDIT. 13. SYSROLLBACKSEG. SYSTABAUTH. SYS_OBJECTS. SYSSTORAGE.6 Exemplos de utilização do dicionário de dados Listar todas as tabelas acessíveis ao usuário. SYSSEGOBJ. views and clusters Comments on the tables and views owned by the user Grants on objects for which the user is the owner. SYSEXTENTS. SYSUSERLIST. SYSTSQUOTAS. SYSCOLAUTH.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 USER_AUDIT_CONNECT VIEW SYS USER_AUDIT_RESOURCE VIEW SYS USER_AUDIT_TRAIL 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 ...................................------......... Listar todos os usuários do banco de dados. 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................................--------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 ................... SQL> DESCRIBE ALL_USERS Name ------------------------------USERNAME USER_ID CREATED SQL> SELECT * FROM ALL_USERS USERNAME USER_ID CREATED -----------------------------.

TABLE_TYPE FROM USER_INDEXES ORDER BY 1. 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. 4 19-OCT-94 5 30-DEC-91 Listar todos os índices criados nas tabelas do usuário. TABLE_NAME. SQL> DESCRIBE DBA_COL_COMMENTS ERROR: ORA-00942: table or view does not exist Esta consulta só pode ser realizada por um usuário com privilégio de DBA. TABLE_OWNER.ALUNO1 _NEXT_USER 6 rows selected.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 descrições das colunas de todas as tabelas do banco de dados.7 Exercícios a) Mostrar as seguintes informações para a tabela EMP: 108 . 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. SQL> CONNECT SYSTEM Connected.

Coluna Nulo? ------------------------------.2) NUMBER(2) 109 .2) NUMBER(7.-------EMPNO NOT NULL ENAME JOB MGR HIREDATE SAL COMM DEPTNO Tipo -------------NUMBER(4) VARCHAR2(10) VARCHAR2(9) NUMBER(4) DATE NUMBER(7.

sinônimo ou visão. Não. trocar de nome. Sim Não. O nome da tabela não pode ser igual ao de outra tabela. Emp. Somente os caracteres e números especificados são armazenados. adicionar comentários e remover tabelas. emp. O nome pode conter até 30 caracteres. • • • • 110 . mesmo com usuários acessando o banco de dados. independentemente do uso de letras minúsculas ou maiúsculas. Os caracteres "$" e "#” também podem ser usado. números. O nome é o mesmo. de "A" a "Z". alterar. O nome pode conter letras. Nome EMP85 85EMP LUCRO_BRUTO LUCRO BRUTO UPDATE TABELA1 Válido Sim Não. Sim. a não ser que pertençam a usuários diferentes. Comprimento dos dados é variável.Capítulo 14: Linguagem de Definição de Dados 14. começa com número. 14. EMP. As tabelas ocupam novos segmentos quando necessário.2 Estrutura de Dados do Oracle Tabelas podem ser criadas a qualquer momento. Por exemplo. mas nome não diz nada.1 Objetivos deste capítulo Apresentar os comandos utilizados para criar. Espaços à frente e à traz não são armazenados. e Emp são a mesma tabela. O nome não pode ser uma das palavras reservadas do Oracle. contém espaço. 14. e o caractere especial sublinhado (_).3 Criando uma tabela Devem ser observadas as seguintes regras para o nome de uma tabela: • • O nome deve começar por uma letra. mas seu uso é desaconselhado. EmP. A estrutura das tabelas podem ser modificadas on-line. Não existe a necessidade de se especificar o tamanho das tabelas. ou de "a" a "z". palavra reservada.

por exemplo. o Ano. desde 1 de janeiro de 4712 AC. Tem as mesmas restrições de LONG. Caracteres alfanuméricos com até 2 GigaBytes (2**31 . Número com a precisão 'p' e a escala 's'. A escala 's' pode variar de -84 a +127 Data válida. Usado com o Trusted ORACLE. mantendo sempre a mesma abreviatura.s) DATE FLOAT 111 . VARCHAR(n) VARCHAR2(n) LONG RAW(n) LONG RAW ROWID MLSLABEL NUMBER(p. Formato binário to rótulo do sistema operacional. Introduzida no Oracle 7.1). o Mês. até 31 de dezembro de 4712 DC. ou precisão binária de 126 dígitos. A precisão 'p' pode variar de 1 a 38. • • 14. porém podendo armazenar até 2 GigaBytes. até 255 bytes. Caracteres hexadecimais representando o endereço único de uma linha em uma tabela. e pode ter até 2000 caracteres. Consistência de singular e plural. Não podem ser especificadas restrições de integridade. Uma regra pode ser. Dados binários. não colocando o nome de algumas tabelas no singular e de outras no plural Usar uma regra consistente para atribuir nomes. Use o mesmo nome para descrever o mesmo atributo em tabelas diferentes. Coluna de tamanho constante independente do que está armazenado.14. Caracteres alfanuméricos com até 'n’ caracteres. exceto NOT NULL. Semelhante a RAW. Número de ponto flutuante com precisão decimal de 38 dígitos. Abreviar de forma consistente. o tamanho armazenado varia de acordo com o conteúdo da coluna. o Minuto e o Segundo. como.5 Tipo de dado das colunas Tipo CHAR(n) Conteúdo Caracteres alfanuméricos com até 'n' caracteres. Caracteres alfanuméricos com até 'n' caracteres. colunas. a Hora. e pode ter no máximo 255 caracteres. todas as tabelas do sistema financeiro começam com FIN_. No Oracle 6 é sinônimo de CHAR. Não existe conversão de caracteres. índices e outros objetos. como som e imagem. Não pode ser indexada. Só pode haver uma coluna LONG por tabela. ANSI x PC850. Não podem ser executadas funções de manipulação de caracteres sobre colunas RAW. o Dia. Para cada coluna DATA são armazenados o Século. Máximo de 255 caracteres.4 Recomendações sobre os nomes das tabelas • • • Usar nomes descritivos para as tabelas.

89 7456123.s) NUMBER(38) NUMBER 14.s).2) Valor armazenado 7456123.8 Criação de tabelas 14.89 7456124 7456123.] nome_da_tabela [restrições] (nome_da_coluna tipo_de_dado (tamanho) [DEFAULT valor] [restrições]) [PCTFREE inteiro PCTUSED inteiro INITRANS inteiro MAXTRANS inteiro] [TABLESPACE espaço_de_tabela STORAGE armazenamento] 112 . REAL ORACLE CHAR(n) VARCHAR(n) NUMBER(p.89 7456123.8 7456123.89 7456123.8 7456123.s) INTEGER. SMALLINT FLOAT(b) GRAPHIC LONG VARGRAPHIC VARGRAPHIC TIMESTAMP TIME ORACLE CHAR(n) VARCHAR(n) LONG NUMBER(p. DEC(p.89 7456123. INT.6 Especificação NUMBER NUMBER(9) NUMBER(9.9 precisão excedida 7456123.89 7456123. DECIMAL(p.8.-2) NUMBER(7.2) NUMBER(9.1 Sintaxe do comando: CREATE TABLE [esquema. SMALLINT FLOAT(b). DOUBLE PRECISION.8 7456100 precisão excedida Relação entre os tipos de dados ANSI e do Oracle ANSI CHARACTER(n).s) NUMBER(38) NUMBER DATE DATE 14.Dado 7456123. CHAR VARYING(n) NUMERIC(p.1) NUMBER(7. CHAR(n) CHARACTER VARYING(n).1) NUMBER(6) NUMBER(15.s) INTEGER.s).7 Relação entre os tipos de dados do SQL/DS e do Oracle SQL/DS ou DB2 CHARACTER(n) VARCHAR(n) LONG VARCHAR DECIMAL(p.8 14.89 7456123.

Só pode se referenciar a colunas da mesma tabela. LOC CHAR(13). como chave primária. Designa uma coluna. Identifica a(s) coluna(s) como chave estrangeira .2 Criação das tabelas do curso: CREATE TABLE DEPT ( DEPTNO NUMBER(2) DNAME CHAR(14). É opcional.. A tabela deve existir antes desta condição ser especificada. Especifica se a coluna pode ou não conter valores nulos. Identifica a tabela na qual o ORACLE armazena as informações sobre as linhas que violaram as restrições de integridade. Desativa (ativa) uma restrição de integridade. MGR NUMBER(4) REFERENCES EMP (EMPNO) CONSTRAINT EMP_S_KEY.2).) REFERENCES tabela(col(s)) CHECK condição DISABLE (ENABLE) EXCEPTIONS INTO 14. CONSTRAINT DEPT_PRIMARY_KEY) CREATE TABLE EMP ( EMPNO NUMBER(4) NOT NULL. PRIMARY KEY FOREIGN KEY (coluna. Cada coluna deve ser declarada como NOT NULL. DEPTNO NUMBER(2) NOT NULL. e não podem ser chave primária. como chave única.2). Designa uma coluna. porém uma restrição de tabela pode referenciar múltiplas colunas. ou uma combinação de colunas. ENAME CHAR(10). onde 'n' é um número inteiro atribuído pelo Oracle que identifica unicamente a restrição. Especifica a condição que uma coluna deve satisfazer para a linha ser aceita na tabela..8.Restrição CONSTRAINT nome_da_restrição NULL NOT NULL UNIQUE Descrição Especifica o nome da restrição. SAL NUMBER(7. PRIMARY KEY (DEPTNO) NOT NULL. O padão é a restrição ativa. ou uma combinação de colunas. 113 . COMM NUMBER(7. HIREDATE DATE. JOB CHAR(9). As colunas devem ser declaradas como NOT NULL e não podem ter a restrição UNIQUE. Se a chave primária contiver múltiplas colunas deve ser declarada na restrição da tabela. Se a chave primária contiver apenas uma coluna pode ser declarada na restrição da coluna. Quando omitido o nome padrão tem a forma de SYS_Cn. REFERENCES identifica a chave primária ou chave única que é referenciada. Uma restrição de coluna só pode referenciar a uma coluna.

CREATE TABLE EMP ( EMPNO NUMBER(4) ENAME CHAR(10). LOC CHAR(13).'BOSTON'.8. DNAME VARCHAR2(9). 114 . LOSAL NUMBER. DNAME CHAR(14) CONSTRAINT CHECK_DNAME CHECK(DNAME=UPPER(DNAME)) DISABLE. JOB CHAR(9). NOT NULL. LOC CHAR(13) CONSTRAINT CHECK_LOC CHECK (LOC IN ('DALLAS'.)) DISABLE) Tabela EMP com opção ON DELETE CACADE. CREATE TABLE DEPT ( DEPTNO NUMBER(2) CONSTRAINT PK_DEPT PRIMARY KEY. CREATE TABLE DEPT ( DEPTNO NUMBER CONSTRAINT CHECK_DEPTNO CHECK (DEPTNO BETWEEN 10 AND 99) DISABLE. ALTER TABLE EMP MODIFY (SAL NUMBER CONTRAINT NN_SAL NOT NULL) Tabela DEPT com restrições de coluna. DNAME VARCHAR2(9) CONSTRAINT UNQ_DNAME UNIQUE. LOC VARCHAR2(10)) Tabela DEPT com chave primária definida como restrição de tabela. DNAME CHAR(14).FOREIGN KEY (DEPTNO) PRIMARY KEY (EMPNO) REFERENCES DEPT (DEPTNO) CONSTRAINT EMP_F_K. CREATE TABLE DEPT ( DEPTNO NUMBER(2) NOT NULL. HISAL NUMBER) 14.. CREATE TABLE DEPT ( DEPTNO NUMBER(2) NOT NULL.. PRIMARY KEY (DEPTNO) CONSTRAINT DEPT_PRIMARY_KEY) Tabela DEPT com nome do departamento único definido como restrição de tabela.3 Exemplos de restrições Tabela SAL não permitindo salário nulo. LOC CHAR(13). CONSTRAINT EMP_PRIMARY_KEY) CREATE TABLE SALGRADE ( GRADE NUMBER. CONSTRAINT UNQ_DNAME UNIQUE (DNAME) USING INDEX PCTFREE 20 TABLESDPACE TBLSP_DEPT STORAGE (INITIAL 8K NEXT 6K)) Tabela DEPT com opção CHECK..

2) NUMBER(7.--------.2).. Exemplo: SQL> CREATE TABLE EMPREGADOS AS SELECT * FROM EMP Table created.9 Criando uma tabela a partir de outra tabela É possível criar uma tabela a partir de outra tabela já existente.--------.2). 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.---------.MGR NUMBER(4) REFERENCES EMP (EMPNO) CONSTRAINT EMP_S_KEY. 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 -------. O comando DESCRIBE permite visualizar a estrutura das tabelas.2) NOT NULL NUMBER(2) Null? Type -------. STATE) USING INDEX PCTFREE 5 TABLESPACE TBLSP_CESUS EXCEPTIONS INTO BAD_KEYS_IN_SHIP_CONT 14..------.---NOT NULL NUMBER(4) CHAR(10) CHAR(9) NUMBER(4) DATE NUMBER(7. COMM NUMBER(7.---NOT NULL NUMBER(4) CHAR(10) CHAR(9) NUMBER(4) DATE NUMBER(7.------. DEPTNO NUMBER(2) NOT NULL.2) NOT NULL NUMBER(2) 115 . através do comando: CREATE TABLE nome_da_tabela [(especificação das colunas)] AS SELECT. HIREDATE DATE.2) NUMBER(7.------. SAL NUMBER(7.

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

0

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 conteúdo. Tabelas também podem ser criadas a partir da junção 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] [restrições_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 salário 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] [restrições_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 através 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 Descrição das tabelas e colunas A descrição das tabelas e das colunas pode ser armazenada no dicionário de dados através do comando COMMENT. Para adicionar a descrição da tabela FUNCIONARIOS:
SQL> COMMENT ON TABLE FUNCIONARIOS IS 'CADASTRO DE FUNCIONARIOS' Comment created.

Para adicionar a descrição 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 através 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 Exercícios 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

4 20

NOT NULL

7,2 2

NUMBER NUMBER 118

4 4

NOT NULL NOT NULL

das colunas.2 2 b) Com as tabelas criadas adicionar a seguinte coluna a tabela ASSIGNMENTS: HOURS NUMBER 2 c) Adicionar comentários às tabelas criadas para descrever o conteúdo. h) Mostrar os nomes das tabelas e os comentários para as tabelas. d) Adicionar comentários à coluna PROJID da tabela PROJECTS descrevendo seu conteúdo. e) Mostrar a especificação das colunas das visão USER_COL_COMMENTS.A_START_DATE A_END_DATE BILL_RATE ASSIGN_TYPE DATE DATE NUMBER CHAR 4. g) Mostrar a especificação das colunas das visão USER_TAB_COMMENTS. f) Mostrar os nomes das tabelas. e os comentários para as colunas. 119 .

14. NOT NULL.15 Respostas dos exercícios 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.--------------. A_END_DATE DATE. ASSIGN_TYPE CHAR(2)) NOT NULL. BILL_RATE NUMBER(4.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 --------------.2). MAX_NO_STAFF NUMBER(2)) CREATE TABLE ASSIGNMENTS ( PROJID NUMBER(4) EMPNO NUMBER(4) A_START_DATE DATE.--------------------------------------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 . NOT NULL. P_END_DATE DATE. 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.2). BUDGET_AMOUNT NUMBER(7.

LOC ) 2 VALUES ( 60. LOC ) ( &DEPT_NUM. . Quando os novos valores são inseridos em todas as colunas da tabela.1 Objetivos deste capítulo Mostrar a linguagem de manipulação de dados (DML). 'DETROIT' ) 1 row created. SQL> INSERT 2 VALUES Enter value Enter value INTO DEPARTMENT ( DEPTNO. DNAME. DNAME. SQL> INSERT INTO DEPARTMENT ( DEPTNO. Podem ser utilizadas variáveis de substituição para fornecimento dos valores. DNAME. . 'ALBERTA' ) 1 row created. LOC ) 2 VALUES ( 70.. a lista de colunas pode ser omitida.)] VALUES (valor. INSERT INTO nome_da_tabela [(coluna. SQL> INSERT INTO DEPARTMENT ( DEPTNO.2 Inserindo novas linhas em uma tabela Para inserir linhas em uma tabela é utilizado o comando INSERT. Em vez que omitir o nome do departamento na lista de colunas. SQL> 2 3 4 CREATE TABLE DEPARTMENT AS SELECT * FROM DEPT Table created. '&DEPT_LOC' ) for dept_num: 80 for dept_name: RESEARCH 121 . valor. É recomendado que a lista de colunas seja sempre especificada. para não haver necessidade de alterar o programa quando uma nova coluna for adicionada à tabela.) Os exemplos serão efetuados sobre a tabela Department criada a partir da tabela Dept. utilizada para inserir.. Para inserir apenas o número e a localidade do novo departamento. NULL. atualizar e eliminar registros do banco de dados. 'SAN JOSE' ) 1 row created. Para inserir um novo departamento. o resultado é o mesmo.Capítulo 15: Linguagem de Manipulação de Dados 15. '&DEPT_NAME'. SQL> INSERT INTO DEPARTMENT ( DEPTNO. na mesma ordem das colunas da tabela. 'MARKETING'.. LOC ) 2 VALUES (50. 15. pode ser especificado o valor nulo para o nome do departamento.. coluna.

COMM. 7566. Com este formato.Enter value for dept_loc: ATLANTA old 2: VALUES ( &DEPT_NUM. 'INSURANCE'. Se for necessário especificar a data em outro século. O campo data também contém informação de hora. 'ANALYST'. o formato DD-MON-YY é geralmente usado. HIREDATE. MGR. NULL. 'CODD'.'DD/MM/YYYY HH:MI'). SQL> INSERT INTO DEPARTMENT 2 VALUES ( 90. 'LONDON' ) 1 row created. Para os exemplos de inserção de valores de data e hora será criada a tabela Employee a partir da tabela Emp. 'RESEARCH'. '&DEPT_LOC' ) new 2: VALUES ( 80. 122 . Para inserir um novo departamento omitindo a lista de colunas. SQL> 2 3 4 5 6 7 8 9 10 INSERT INTO EMPLOYEE ( EMPNO. SQL> 2 3 4 CREATE TABLE EMPLOYEE AS SELECT * FROM EMP Table created. ou for necessário especificar a hora. a função TO_DATE é utilizada. ENAME. JOB. o século padrão é o século 20 (19xx). que quando não é especificada assume o valor padrão de zero horas (00:00:00). TO_DATE('24/06/2084 9:30'. '&DEPT_NAME'. Listando a tabela de departamentos após as inserções: 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. DEPTNO ) VALUES ( 7658. 3000. SAL. 'ATLANTA' ) 1 row created. Quando uma data é inserida.

123 . Para exemplo de inserção de valores a partir de uma outra tabela será criada a tabela SALARY_GRADE a partir da tabela SALGRADE.3 Atualizando linhas em uma tabela Para atualizar linhas de uma tabela é utilizado o comando UPDATE. SQL> SELECT * 2 FROM SALARY_GRADE GRADE LOSAL HISAL ------. não foi incluída nenhuma linha na tabela SALARY_GRADE durante a criação. SQL> 2 3 4 INSERT INTO SALARY_GRADE SELECT * FROM SALGRADE WHERE GRADE = 1 1 row created.------.. [. Para verificar se a inclusão foi feita corretamente. HIREDATE = SYSDATE. SQL> 2 3 4 5 6 UPDATE EMPLOYEE SET JOB = 'SALESMAN'.coluna. UPDATE SET [WHERE nome_da_tabela [aliás] coluna.11 20) 1 row created. os valores correspondentes à faixa 1. SQL> SELECT * 2 FROM SALARY_GRADE no rows selected Para inserir na tabela SALARY_GRADE. Como não existe nenhum departamento com número zero na tabela SALGRADE. SQL> 2 3 4 CREATE TABLE SALARY_GRADE AS SELECT * FROM SALGRADE WHERE GRADE=0 Table created.1 WHERE ENAME = 'SCOTT' 1 row updated. SAL = SAL*1.] = {expressão ou sub-consulta} condição] Para atualizar as informações do funcionário SCOTT..------1 700 1200 15. a partir da tabela SALGRADE.

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 após as atualizações.
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 condição] 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 após a eliminação.
SQL> SELECT * FROM EMPLOYEE

124

no rows selected

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

15.5

Exercícios 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 exercícios
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

exit) Falha de máquina Um comando de DDL é efetivado automaticamente. que consistem em um ou mais comandos de DML. Existem duas classes de transações. Até que o comando Commit seja executado.2 O que é uma transação Uma transação é um conjunto de operações efetuadas em um banco de dados. ou nenhuma é efetivada no banco de dados. Não pode haver o caso em que umas são efetivadas e outras não. as mudanças são vistas apenas pelo usuário que as efetuou.Capítulo 16: Processamento de transações 16. a próxima declaração SQL inicia uma nova transação automaticamente. As transações não podem ficar pela metade no banco de dados. 16. Transações produzidas pela linguagem de manipulação de dados (DML). e o comando ROLLBACK é utilizado para descartar as mudanças. Após o fim de uma transação. elas devem ser efetivadas. e termina com um dos seguintes comandos. Uma transação começa com o primeiro comando de DML ou DDL executado. • • • • • COMMIT ou ROLLBACK comando de DDL Erros Desconexão (logoff. Transações causadas pela linguagem de definição de dados (DDL) contém apenas um comando. os demais usuários enxergam a situação anterior as modificações. e portanto termina implicitamente uma transação.1 Objetivos deste capítulo Fazer uma introdução ao conceito de transação.3 Efetivando as mudanças Para tornar as mudanças no banco de dados permanentes. O comando COMMIT é utilizado para efetivar as mudanças. que causam alterações em uma ou mais tabelas. 16. ou todas as transações de uma unidade lógica de trabalho são efetivadas. as quais o Oracle trata como uma única entidade ou unidade lógica de trabalho (LUW). Os comandos emitidos entre dois comandos COMMIT definem uma transação. 127 .

4 Removendo mudanças Mudanças não efetivadas podem ser descartadas através do comando ROLLBACK. como. quando um valor é debitado de uma conta e creditado em outra. O Rollback automático é mais freqüentemente causado por falhas no sistema. porque estes erros são detectados na fase de 'parse' do comando (quando o comando é lido e verificado). nem causam um Rollback automático. toda a transação é descartada (Rolled back). Por exemplo. 16. tais como digitar o nome errado para uma coluna ou tentar realizar uma operação não permitida na tabela de outro usuário. uma falha do sistema. tais como falta de luz ou queda do sistema operacional.6 O significado de uma transação O Oracle garante a consistência dos dados baseado nas transações. não interrompem uma transação. Transações fornecem mais flexibilidade e controle para trabalhar com os dados.8 COMMIT [WORK] • • • Torna as mudanças causadas pela transação corrente permanente Elimina todos os SavePoints Termina a transação 128 . ou descartada (Rollback). 16. que deve ser totalmente efetivada (Commit). esta operação é uma transação. Este procedimento previne que os erros causem mudanças não desejadas aos dados. 16. não pode haver o caso em que existe o débito sem que haja o crédito correspondente. e não durante a fase de execução. por exemplo.7 Controlando transações Os seguintes comandos SQL são utilizados para controlar uma transação: • • • • COMMIT [WORK] SAVEPOINT nome_do_savepoint ROLLBACK [WORK] ROLLBACK TO nome_do_savepoint 16. O comando ROLLBACK retorna os dados ao estado em que se encontrava após o último COMMIT. Erros causados pela entrada de comandos.5 Falhas do sistema Quando uma transação é interrompida por um erro.16.

9 SAVEPOINT savepoint_name • • Pode ser utilizado para dividir uma transação em porções menores. 16. A palavra WORK é opcional.10 ROLLBACK[WORK] to [SAVEPOINT] savepoint_name • • • O comando Rollback é utilizado para desfazer alterações. O número máximo de SavePoints por processo de usuário é 5. o anterior é eliminado.• • • Libera os Locks causados pela transação A palavra WORK é opcional Deve ser executada explicitamente e não implicitamente. se a execução não causar erro. Este padrão pode ser mudado. não existe Commit to SavePoint. • • • 16. COMMIT implícito ou automático ocorre nas seguintes situações: antes de um comando de DDL após um comando de DDL quando de uma desconexão normal • Comandos de DDL sempre geram um Commit quando são executados. para que mais tarde seja possível desfazê-lo totalmente. ou apenas até este determinado ponto. Após o comando DDL ser executado. Permite guardar o trabalho até um determinado ponto. o Commit é executado antes do comando de DDL ser executado. Só existe Rollback to SavePoint. Rollback sem To SavePoint causa: Fim da transação Desfaz as alterações Elimina todos os SavePoints da transação 129 . caso contrário em caso de término anormal do programa a última transação é desfeita (Rollback). Quando um comando de DDL é executado após a execução de vários comandos de DML. Quando um novo SavePoint é criado com o mesmo nome de um anterior. esta também é efetivada. por padrão.

após cada comando INSERT.11 Rollback a nível de declaração Se uma única declaração de DML falha. o próprio usuário tem que executar o comando COMMIT manualmente. O comando SET AUTOCOMMIT é um comando do SQL*PLUS. SQL> DELETE FROM DEPARTMENT 2 WHERE DEPTNO > 40 5 rows deleted. somente esta transação é desfeita. Esta característica é chamada de Rollback a nível de declaração. 130 . UPDATE ou DELETE é executado um comando COMMIT automaticamente.13 Autocommit Commit pode ser executado automaticamente através do comando SET AUTOCOMMIT ON. • 16. Se a transação for de DDL. Quando é feito um ROLLBACK TO SAVEPOINT: • • Uma porção da transação é desfeita. mantém o SavePoint até onde foi feito o Rollback. não do Oracle. mas perde os SavePoints criados após o SavePoint para o qual o Rollback foi feito.- Libera os Locks da transação 16.14 Exemplo de utilização de COMMIT e ROLLBACK Para eliminar os departamentos com número maior do que 40. Neste caso. Com SET AUTOCOMMIT OFF. o Commit executado antes da transação não permite o Rollback das transações anteriores.12 Rollbacks implícitos Rollbacks implícitos ocorrem em caso de término anormal 16. Oracle realiza um Rollback a nível de declaração através da criação de um SavePoint implícito antes de cada transação de DML. Este SavePoint não é acessível diretamente pelo usuário. e permite que se efetue tanto o Rollback quanto o Commit das transações anteriores a transação que falhou. Libera tabelas e Locks a nível de linha. 16.

SQL> UPDATE DEPARTMENT 2 SET DNAME = 'MARKETING' 5 rows updated. 'LAS VEGAS') 1 row created. 'TESTING'. 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. Para. SQL> SELECT * FROM DEPARTMENT DEPTNO DNAME LOC ------. SQL> COMMIT Commit complete. SQL> INSERT INTO DEPARTMENT VALUES ( 50. Para verificar como ficou a tabela após a inserção.-------------.Para efetivar o comando anterior. trocar o nome de todos os departamentos por MARKETING. SQL> SAVEPOINT INSERT_DONE Savepoint created. 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.------------10 MARKETING NEW YORK 20 MARKETING DALLAS 30 MARKETING CHICAGO 40 MARKETING BOSTON 50 MARKETING LAS VEGAS 131 . Testing. Para verificar o erro cometido. por erro. Para verificar que os departamentos foram realmente eliminados. de Las Vegas.

SQL> COMMIT Commit complete. como seria correto. Para efetivar todas as mudanças. Para verificar como ficou a tabela. 132 . SQL> ROLLBACK TO INSERT_DONE Rollback complete. Para verificar como ficou a tabela. SQL> DELETE FROM DEPARTMENT 5 rows deleted. SQL> UPDATE DEPARTMENT 2 SET DNAME = 'MARKETING' 3 WHERE DNAME = 'SALES' 1 row updated. mas sem desfazer a inclusão do departamento 50.Para desfazer o erro da última declaração. SQL> SET AUTOCOMMIT OFF Para eliminar todas as linhas da 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. 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 efetivação automática (padrão). Para verificar como ficou a tabela.

SQL> DELETE FROM DEPARTMENT Commit complete. 5 rows deleted. Os usuários que estão lendo não devem enxergar os dados que estão em processo de alteração. mesmo que as mudanças não tenham ainda sido efetivadas. SQL> ROLLBACK Rollback complete.15 Consistência de leitura Usuários de banco de dados realizam dois tipos de acesso ao banco de dados: • • Operações de leitura (comando Select) Operações de gravação (comandos Insert.SQL> SELECT * FROM DEPARTMENT no rows selected Para desfazer a eliminação das linhas. SQL> SET AUTOCOMMIT ON Quando se apaga as linhas da tabela não há retorno com efetivação automática habilitada. A finalidade da consistência de leitura é garantir que cada usuário veja os dados da forma como existiam antes do último Commit. 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 efetivação automática. Os usuários que estão gravando devem enxergar os dados da forma como foram alterados. Update e Delete) É necessário se garantir uma consistência de leitura tanto para os usuários que estão gravando quanto para os usuários que estão lendo do banco de dados. 133 . SQL> SELECT * FROM DEPARTMENT no rows selected 16. SQL> ROLLBACK Rollback complete. Para verificar como ficou a tabela.

o modelo de consistência do Oracle garante que os resultados de um comando são consistentes. A consistência de leitura que READ ONLY provê é implementada da mesma maneira que a consistência à nível de declaração . Todos os usuários que efetuam leituras. • Somente consultas são permitidas na transação. pode ser necessário processar várias consultas em dados de várias tabelas e garantir que os dados são consistentes. e os Segmentos de Rollback são liberados. • COMMIT. A declaração SQL “SET TRANSACTION READ ONLY” é utilizada para iniciar uma transação de leitura apenas. os dados gravados nos Segmentos de Rollback são escritos de volta nas tabelas.16 Transações somente de leitura Por padrão. todas as consultas se referem ao mesmo instantâneo (snapshot) do banco de dados (mudanças efetivadas antes da transação começar). ou seja. 16. Entretanto. em algumas situações. através da cópia mantida nos Segmentos de Rollback. Notas: • A declaração SET TRANSACTION READ ONLY deve ser a primeira da transação. Cada declaração por padrão enxerga uma visão consistente dos dados na hora em que a declaração foi feita. os resultados produzidos pela consulta à uma tabela são consistentes com os resultados das consultas a qualquer outra tabela. ROLLBACK ou uma declaração DDL terminam a transação. Esta funcionalidade é muito útil para relatórios que processam múltiplas consultas enquanto os usuários atualizam as mesmas tabelas. enxergam o banco de dados como ele existia antes das mudanças.usando segmentos de rollback. 134 . Quando uma inserção. exceto aquele que causou as mudanças. somente o usuário que modificou os dados enxerga o banco de dados com as modificações incorporadas. Quando ocorre um Rollback. o Oracle faz uma cópia dos dados antes das mudanças. • Durante a transação.A consistência de leitura é implementada mantendo-se uma cópia parcial do banco de dados nos segmentos de Rollback. Após a efetivação das mudanças. uma atualização ou uma eliminação é feita no banco de dados. e guarda esta cópia no Segmento de Rollback. Com DDL nenhuma indicação é dada que a transação terminou. todos os usuários passam a enxergar os dados com as mudanças efetuadas. Antes das mudanças serem efetivadas.

Exemplo: SQL> SET TRANSACTION READ ONLY Transaction set.• Outros usuários podem continuar a atualizar os dados. 135 . SQL> SELECT * FROM DEPT DEPTNO ------10 20 30 40 DNAME -------------ACCOUNTING RESEARCH SALES OPERATIONS LOC ------------NEW YORK DALLAS CHICAGO BOSTON SQL> COMMIT Commit complete.

• Bloqueio padrão. prevenindo que dois usuários atualizem o mesmo dado ao mesmo tempo.Capítulo 17: Concorrência e Bloqueio 17. com relação a máxima proteção dos dados. Bloqueios de tabelas e linhas são uma parte essencial para manter a consistência e a integridade do banco de dados.3 O que é um bloqueio O bloqueio é o mecanismo que é usado para controlar o acesso aos dados em um sistema multi-usuário.4 Quando os bloqueios são necessários Bloqueios são ativados sempre que um usuário começa a realizar alterações no banco de dados.2 Introdução ao bloqueio Uma das maiores tarefas de um sistema gerenciador de banco de dados (SGBD) é controlar a concorrência. • Bloqueio implícito e explícito. isto é. porque os bloqueios não são necessários para a leitura.1 Objetivos deste capítulo • Mostrar como o Oracle manuseia os bloqueios (locks). comprometendo. o acesso aos mesmos dados por vários usuários. 136 . ou seja. permitir o maior número de usuários no sistema. a integridade dos dados. • Bloqueio mortal (Deadlock). Oracle resolve os problemas resultantes das atualizações concorrentes através de bloqueios. Sem um controle correto de concorrência os dados podem ser atualizados incorretamente ou fora de seqüência. Bloqueios são usados para: • proteger os dados • controlar os usuários Qualquer estratégia de bloqueio deve balancear os objetivos de máxima concorrência. 17. 17. portanto. 17. O Oracle permite que qualquer número de usuários leiam os dados ao mesmo tempo. • Tipos e níveis de bloqueio. Este capítulo não possui exercícios.

Drop Table.6. Permite o compartilhamento do recurso dependendo da operação.. • controlado automaticamente pelo SGBD Oracle. 17.1 Bloqueios do dicionário de dados (DDL) • controla o acesso às definições dos objetos do banco de dados.8 Descrição dos bloqueios Modo de bloqueio Compartilhado “Share locks” Exclusivo “Exclusive lock” Severidade Pode ser adquirido por mais de um usuário para a mesma tabela ao mesmo tempo. 17. 137 . no final da transação.6. O primeiro usuário a adquirir um bloqueio exclusivo é o único que pode atualizar até o bloqueio exclusivo ser liberado.Usuários consultando dados nunca bloqueiam usuários modificando dados.toda a tabela é bloqueada.somente as linhas da tabela são bloqueadas. Create Table.2 Bloqueios da manipulação de dados (DML) • controla o acesso aos dados nas tabelas dos usuários. Pode ser adquirido por apenas um usuário de cada vez. • Bloqueio a nível de linha . tais como. ou seja..7 Níveis de bloqueio • Bloqueio a nível de tabela . e usuários modificando dados nunca bloqueiam usuários lendo dados. • o Oracle automaticamente bloqueia as tabelas que estão sendo atualizadas pelos usuários (bloqueio implícito).6 Tipos de bloqueios 17. 17.5 Quando os bloqueios são liberados Os bloqueios são liberados após o Commit ou o Rollback. • o usuário pode solicitar o bloqueio através de comandos SQL (bloqueio explícito) Este capítulo trata de bloqueios causados pela DML. • usado para controlar as operações SQL que modificam o dicionário de dados. 17. Alter Table. 17.

LOCK TABLE IN SHARE EXCLUSIVE MODE e LOCK TABLE IN EXCLUSIVE MODE.Uma linha é sempre bloqueada de forma exclusiva. SELECT FOR UPDATE e LOCK TABLE IN SHARE MODE. atualizações . DELETE ou LOCK TABLE IN ROW EXCLUSIVE MODE é executado. UPDATE.Um bloqueio para a tabela é adquirido quando a tabela é modificada pelos comandos INSERT. Bloqueio de Tabela Row Share (RS) Descrição .Indica que a transação atualizou uma ou mais linhas da tabela. . . UPDATE. UPDATE.É um pouco mais restritivo do que Row Share. .É automaticamente adquirido quando um dos comandos INSERT. eliminação e bloqueios de linhas na mesma tabela. . . . LOCK 138 Row Exclusive (RX) Share Lock (S) .É ativado pelo comando LOCK TABLE IN SHARE MODE.Permite: consultas.Níveis de Bloqueio Nível de Linha “Row Locks (TX)” Nível de Tabela “Table Locks (TM)” Descrição .Não permite: INSERT. LOCK TABLE IN SHARE ROW EXCLUSIVE MODE.Existem diversos modos de bloqueio para tabelas. SELECT FOR UPDATE ou LOCK TABLE. para não permitir outros usuários atualizar a mesma linha ao mesmo tempo.É o menos restritivo dos bloqueios. .Permite: consultas.. . .Não permite: LOCK TABLE IN SHARE MODE. permitindo o maior grau de concorrência para a tabela. DELETE. .Não permite: LOCK TABLE IN EXCLUSIVE MODE. atualizações. . .Um bloqueio exclusivo é adquirido para cada linha modificada pelos comandos INSERT.Permite: consultas.Adquirido quando um dos comandos SELECT FOR UPDATE ou LOCK TABLE IN ROW SHARE MODE é executado. . . DELETE ou SELECT FOR UPDATE. UPDATE. eliminação e bloqueio de linhas da mesma tabela. . inserções. DELETE.Indica que a transação tem intenção de atualizar linhas da tabela.As operações de DML necessitam de bloqueio a nível de tabela para impedir comandos de DDL serem executados sobre uma tabela sendo modificada.Bloqueios de linha são sempre adquiridos automaticamente pelo Oracle quando um dos comandos listados anteriormente é executado. Descrição dos modos de bloqueio às tabelas. inserções. . .

É ativado pelo comando LOCK TABLE IN SHARE (SRX) ROW EXCLUSIVE MODE.Permite: consultas à tabela.Não permite: qualquer operação de DML por outros usuários. Share Row Exclusive . Modo de lock da tabela none RX RX RX RS RS RX S SRX X DECLARAÇÃO 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.É o mais restritivo dos bloqueios.Permite: consultas à tabela e bloqueios através do comando SELECT FOR UPDATE. LOCK TABLE IN ROW EXCLUSIVE MODE.9 Bloqueios implícitos Relação 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 . Exclusive (X) .TABLE IN EXCLUSIVE MODE. . . A tabela abaixo indica os modos de bloqueio adquiridos pelos comandos SQL e as operações que estes bloqueios permitem e proibem. .É ativado pelo comando LOCK TABLE IN EXCLUSIVE MODE.Não permite: outras transações atualizar a tabela. . .

mesmo que a linha esteja repetida na tabela. ROWID é uma pseudo-coluna que tem um valor único para cada linha da tabela. O processo de efetivação pode ser acelerado utilizando ROWID para localizar as linhas dentro das tabelas. Exemplo: COLUMN ROWID NEW_VALUE ROW_IDENT SELECT ENAME.10 Bloqueios explícitos 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 Identificação da linha e bloqueio É importante executar os comandos Commit ou Rollback o quanto antes para liberar os bloqueios adquiridos pela transação. o meio mais rápido de acesso à uma linha. SAL 140 . ROWID contém o endereço da linha. sendo.17. HIREDATE. HIREDATE. SAL. JOB.0001 Bloco: 00004C90 Linha do bloco: 0001 Arquivo do banco de dados: 0001 ROWID é uma chave única para uma linha de uma tabela. ROWID Descrição: 00004C90.0001. portanto. ROWID FROM EMP WHERE ENAME = ‘SCOTT’ FOR UPDATE OF JOB.

1 * SAL WHERE ROWID = ‘&ROW_IDENT’ 17. deve ser estabelecida uma ordem de acesso às tabelas para todas as aplicações. Deadlocks podem ocorrer sempre que dois ou mais usuários estão acessando as mesmas tabelas do banco de dados. Pode ser criado para isto uma tabela no banco de dados. e o usuário ‘B’ está na mesma situação com relação ao usuário ‘A’. não havendo Deadlock. HIREDATE = SYSDATE.UPDATE EMP SET JOB = ‘SALESMAN’. Ocorre quando o usuário ‘A’ está aguardando a liberação de uma linha bloqueada pelo usuário ‘B’. TABELA LOCK SEQÜÊNCIA 141 . Desta forma um segue o outro. com uma identificação única de sua ordem de acesso. Esta situação pode ser evitada quando os dois usuários acessando a mesma tabela o fazem na mesma ordem. temos um caso de DEADLOCK. SAL = 1. Quando o acesso é feito a mais de uma tabela. As tabelas de menor ordem são acessadas primeiro.12 Impasse (Deadlock) Imagine a seguinte situação: • Transação A: UPDATE EMP SET SAL = 1200 WHERE ENAME = ‘LEWIS’ • Transação B: UPDATE DEPT SET LOC = ‘LONDON’ WHERE DEPTNO = 20 • Transação A: UPDATE DEPT SET LOC = ‘RICHMOND’ WHERE DEPTNO = 20 • Transação B: UPDATE EMP SET SAL = 1750 WHERE ENAME = ‘LEWIS’ Desta forma: • a transação A só pode prosseguir após a transação B liberar a linha da tabela DEPT bloqueada • a transação B só pode prosseguir quando a transação A liberar a linha da tabela EMP bloqueada ou seja.

-----------------EMP DEPT SALGRADE ---------RS RS X -----------------2 1 10 142 .

Visões são úteis pelas seguintes razões: • Restringir o acesso ao banco de dados. . • Uma visão não tem dados próprios. mas parece existir. 143 . • Uma visão é derivada de uma tabela ou de outra visão.3.3. 18.3 Classificação das visões 18. • Uma visão é armazenada na forma de um comando SELECT apenas. uma tabela que não existe fisicamente no banco de dados. Permite enxergar apenas parte das tabelas. É uma tabela virtual.1 Objetivos deste capítulo Mostrar a criação e utilização de visões (views). 18.1 Visões simples • dados derivados de uma única tabela • não contém funções ou dados grupados. • Permite aos usuários executar consultas simples para obter resultados de consultas complexas. ou seja. Os dados são manipulados a partir das tabelas base. Podem ser recuperados dados de várias tabelas como se fosse uma única tabela.Capítulo 18 . a qual é chamada de tabela ou visão base. permitindo alterar as tabelas base sem afetar as aplicações dos usuários.uma tabela real com os dados fisicamente armazenados. 18.2 Visões complexas • dados derivados de múltiplas tabelas • contém funções ou dados grupados.2 O que é uma visão • Uma visão é como uma janela através da qual os dados das tabelas podem ser vistos e alterados.Visões 18. • Provê independência de dados.

. SAL*12 ANNSAL FROM EMP WHERE DEPTNO = 20 144 . ou se alguma coluna é derivada de uma função ou expressão. não é necessário colocar um nome para a coluna na cláusula Create View.------CLARK 10 KING 10 MILLER 10 Para criar uma visão complexa. CREATE VIEW DEPT20 AS SELECT ENAME..DEPTNO GROUP BY DNAME Note que nomes alternativos para as colunas foram especificados na visão. MAX(SAL). DEPT WHERE EMP. AVGSAL ) AS SELECT DNAME. contendo funções de grupo e dados de mais de uma tabela: CREATE VIEW DEPT_SUMMARY ( NAME.DEPTNO = DEPT. MAXSAL. a partir da tabela EMP. o que é necessário quando os itens da cláusula Select não estão de acordo com as regras para nomes de colunas. coluna2. contendo certos detalhes dos funcionários do departamento 10: SQL> 2 3 4 5 6 CREATE VIEW D10EMP AS SELECT EMPNO. MINSAL. Para recuperar os dados através da visão: SQL> SELECT * 2 FROM D10EMP EMPNO ------7782 7839 7934 ENAME DEPTNO ---------.)] AS SELECT cláusula_select [WITH CHECK OPTION [CONSTRAINT nome_da_restrição]] Para criar uma visão simples chamada D10EMP. AVG(SAL) FROM EMP. Quando um aliás é utilizado para o nome da coluna na cláusula Select.18.4 O comando CREATE VIEW Sintaxe: CREATE VIEW nome_da_view [(coluna1. ENAME.. chamada DEPT_SUMMARY. MIN(SAL). DEPTNO FROM EMP WHERE DEPTNO = 10 WITH CHECK OPTION View created.

'D') BETWEEN 2 AND 6 WITH CHECK OPTION View created. JOB. ENAME. ENAME. Se na visão D10EMP tentarmos inserir um funcionário do departamento 20 um erro é gerado. ENAME. A visão EMP_DETAILS restringe o acesso aos dados do próprio usuário. 'MICHAEL'. NAME. JOB. MGR. no período das 7 às 17 horas. 145 . DEPTNO FROM EMP WHERE ENAME = USER AND TO_CHAR(SYSDATE. DEPTNO FROM EMP WHERE DEPTNO IN ( SELECT DISTINCT DEPTNO FROM DEPT ) WITH CHECK OPTION CONSTRAINT DEPT_CHECK View created. o gerente estiver cadastrado na tabela de empregados. A cláusula WITH CHECK OPTION especifica que inserções e atualizações realizadas através da visão não podem gerar linhas que a visão não pode enxergar. DEPARTMENT ) AS SELECT EMPNO. DEPTNO ) 2 VALUES ( 9999. 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 restrição WITH CHECK OPTION pode ter um nome próprio. ENAME. SQL> 2 3 4 5 6 7 8 CREATE VIEW EMP_DETAILS AS SELECT EMPNO. SAL. POSITION.18. JOB. 20 ) INSERT INTO D10EMP ( EMPNO. DEPTNO ) * ERROR at line 1: ORA-01402: view WITH CHECK OPTION where-clause violation A visão EMP_DATA só permite inserções ou atualizações se o salário estiver na faixa 1000 a 2000. de segunda a sexta-feira. e o departamento estiver cadastrado na tabela de departamentos.'HH24') BETWEEN 7 AND 17 AND TO_CHAR(SYSDATE. SQL> INSERT INTO D10EMP ( EMPNO.5 Usando uma visão para operações de DML Visões são poderosas porque permitem realizar verificação de integridade referencial nos dados modificados através delas. SQL> 2 3 4 5 6 7 8 CREATE VIEW EMP_DATA AS SELECT EMPNO. ENAME. SQL> 2 3 4 5 6 CREATE VIEW EMPLOYEES ( ID_NUMBER.

JOB. SAL.------------------------------------------D10EMP 73 SELECT EMPNO. são realizadas as seguintes operações: • Recuperação da definição da visão do dicionário de dados. DEPTNO FROM EMP WHERE DEPTNO IN ( SELECT DISTINCT DEPT 190 SELECT EMPNO. • Converter a consulta da visão em uma operação equivalente sobre a(s) tabela(s) base. ENAME. DEPTNO FROM EMP WHERE SAL BETWEEN 1000 AND 2 165 SELECT EMPNO.NAME CUSTNAME PRODUCT. o comando SELECT é simplesmente armazenado no dicionário de dados. MGR.----------. DEPTNO FROM EMP WHERE ENAME = USER AND TO_CHAR(SYSDATE 291 SELECT REPID. Alguns parâmetros SET influenciam no texto mostrado: • Maxdata • Arraysize • Long SQL> DESCRIBE USER_VIEWS Name Null? ------------------------------. • Verificação dos privilégios de acesso.PRODID. Quando os dados são acessados através da visão. ENAME. o comando SELECT não é executado. DESCRIP PRODNA Type ---CHAR(30) NUMBER LONG EMP_DATA EMP_DETAILS SALES 146 . JOB. a definição da visão pode ser recuperada. ENAME.-------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 --------------.CUSTOMER. Através da visão USER_VIEWS do dicionário de dados. JOB. ENAME. DEPTNO FROM EMP WHERE DEPTNO = 10 WITH CHECK OPTION EMPLOYEES 113 SELECT EMPNO.Quando a visão é criada.CUSTID.ORD.

• Coluna ROWNUM. • Sub-consulta correlacionada. 147 . SQL> DROP VIEW EMP_DETAILS View dropped. Atualização é proibida se a visão contém: • Alguma das condições anteriores. Inserção é proibida se a visão contém: • Alguma das condições acima. • Coluna NOT NULL da tabela que não consta da visão. SQL> DROP VIEW D10EMP View dropped.6 Alterando dados através das visões As seguintes restrições se aplicam quando os dados são alterados através das visões: Eliminação é proibida de a visão contém: • Junção. • Cláusula GROUP BY.18. • Funções de grupo. • Colunas definidas por expressão.7 Eliminação de visões As visões são eliminadas através do comando “DROP VIEW nome_da_visão”. SQL> DROP VIEW EMP_DATA View dropped. 18. • Cláusula DISTINCT. SQL> DROP VIEW EMPLOYEES View dropped.

'&START'.------.000 2.&EMPNO.------. 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.8 Exercícios a) Criar uma visão que produza o seguinte resultado.------.67 2850 950 9400 6 4 b) Utilizando a visão do exercício anterior.--------.--------. O número do empregado deve ser solicitado em tempo de execução.175 c) Criar uma visão que garanta as seguintes restrições ao se inserir dados na tabela ASSIGNMENTS: número do projeto menor do que 2000.------7902 FORD ANALYST 3. ASSIGN_TYPE válidos são PF.000 05-DEC-83 800 3.--------.--------.&HOURS) 148 .'&END'. BILL_RATE menor do que 70 para ASSIGN_TYPE ED.18.------. extrair as seguintes informações.67 5000 1300 8750 3 0 2175 3000 800 10875 5 0 1566.-----. EMPNO ENAME JOB SAL HIREDATE MINIMUM MAXIMUM AVERAGE ------. SQL> SELECT * FROM AGGREGATES DEPTNO ------10 20 30 AVERAGE MAXIMUM MINIMUM SUM NO_SALS NO_COMMS ------. Término do projeto após o início do projeto.--------.00 asgt: ED hours: 20 3: (&ID.------.'&ASGT'. BILL_RATE menor do que 60 para ASSIGN_TYPE WT. WT e ED. O número do empregado deve ser válido.------.5 PF 30 1 7902 04-JAN-88 07-JAN-88 55 WT 20 d) Inserir valores na tabela ASSIGNMENTS através da visão criada.------.-------2916.-.------1 7369 01-JAN-88 03-JAN-88 50 WT 15 2 7844 01-JAN-89 10-JAN-89 45. BILL_RATE menor do que 50 para ASSIGN_TYPE PF.------.'&BILL_R'. Não esqueça a cláusula WITH CHECK OPTION - SQL> SELECT * FROM ASG_VAL PROJID EMPNO A_START_D A_END_DAT BILL_RATE AS HOURS ------.

'69.'WT'.'ED'.'40.'ED'.'&START'.'&START'.8000.00 Enter value for asgt: ED Enter value for hours: 40 old 3: (&ID.00'.'&END'.'&BILL_R'.7566.40) (2.&HOURS) new 3: (2.'&END'.00 Enter value for asgt: WT Enter value for hours: 30 old 3: (&ID.'&BILL_R'.8000.00'.'55.'01-FEB-89'.40) * ERROR at line 3: ORA-01402: view WITH CHECK OPTION where-clause violation e) Consulte o dicionário de dados para ver a cláusula SELECT da visão.'ED'.&HOURS) new 3: (2.'01-JAN-89'. 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.'01-JAN-89'.7566.20) (1.'01-JAN-88'.00'.'01-JAN-88'.00'.'01-MAR-89'.'40.00'.new 3: (1.&EMPNO.'ED'.&EMPNO.'&ASGT'.'&ASGT'.'31-DEC-89'.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.'01-MAR-89'.'20-FEB-89'. 149 .30) 1 row created.7698.'31-DEC-89'.'69.

A_START_DATE. AVERAGE. EMPNO. 'PF'.&EMPNO.'&END'. 150 .. BILL_RATE. A_START_DATE. 'WT'. NO_COMMS) AS SELECT DEPTNO. 70) AND ASSIGN_TYPE IN ('PF'.'&BILL_R'.9 Respostas dos exercícios a) SQL> 2 3 4 5 6 7 CREATE VIEW AGGREGATES (DEPTNO.. EMPNO. NO_SALS. 50.. AVG(SAL). MAXIMUM.. COUNT(SAL). SUM(SAL). 60. BILL_RATE.-------------------------------------------------ASG_VAL SELECT PROJID.EMPNO.. 'WT'. TEXT 2 FROM USER_VIEWS 3 WHERE VIEW_NAME = ‘ASG_VAL’ VIEW_NAME TEXT --------------. HOURS FROM ASSIGNMENTS WHERE A_START_DATE < A_END_DATE AND PROJID < 2000 AND BILL_RATE <= DECODE(ASSIGN_TYPE.&HOURS) e) SQL> SELECT VIEW_NAME.. MINIMUM. 'ED') AND EMPNO IN (SELECT EMPNO FROM EMP) WITH CHECK OPTION d) SQL> INSERT INTO ASG_VAL 2 VALUES 3 (&ID.EMPNO = &EMPNO new 5: AND EMP. A_END_DATE.EMPNO = 7902 c) SQL> 2 3 4 5 6 7 8 9 10 11 CREATE VIEW ASG_VAL AS SELECT PROJID.18.DEPTNO = AGG.'&ASGT'. ASSIGN_TYPE. 2 MINIMUM. SAL.. HOURS FR. ASSIGN_TYPE. MAXIMUM.'&START'.DEPTNO 5 AND EMP. SUM. ENAME. AGGREGATES AGG 4 WHERE EMP. JOB. MIN(SAL). A_END_DATE. COUNT(COMM) FROM EMP GROUP BY DEPTNO b) SQL> COLUMN MAXIMUM FORMAT 99. HIREDATE. AVERAGE 3 FROM EMP. MAX(SAL).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 = &EMPNO Enter value for empno: 7902 old 5: AND EMP.

O tempo de acesso também é bastante independente do volume de dados indexados. Uma vez criado. 151 . sempre que for possível.1 Objetivos deste capítulo Mostrar a criação e a utilidade dos índices. 19. A utilização de índices é altamente recomendada para obter melhor desempenho. usado para melhorar o tempo de acesso. aproximadamente. para acelerar o acesso aos dados. NON UNIQUE É o padrão. para o acesso a qualquer linha da tabela. sem requerer qualquer ação por parte do usuário. 19. .4 Tipos de índices UNIQUE Garante que os valores especificados para a(s) coluna(s) são únicos.Garantir unicidade de valores para uma coluna ou conjunto de colunas. independente de sua posição.2 Finalidades dos índices Os índices do Oracle têm duas finalidades principais. SINGLE COLUMN Índice composto de apenas uma coluna. o índice será utilizado pelo Oracle. Os índices são criados.Índices 19. que nem precisa saber da existência dos índices. Note que os índices são utilizados automaticamente. normalmente. pelos donos das tabelas. .Otimizar o tempo de resposta de uma consulta. mas qualquer usuário que tenha privilégio de índice sobre a tabela também pode criar índices para a tabela. o que garante o mesmo tempo. 19.3 Estrutura dos índices O Oracle utiliza árvores binárias balanceadas para os índices. CONCATENATED Índice composto de até 16 colunas. e geralmente um dos primeiros índices a serem criados na tabela é o da chave primária.Capítulo 19 .

CREATE UNIQUE INDEX FORNEC_IDX ON FORNECIMENTO (NUM_FORNECEDOR.5.2 Criação de um índice para garantir unicidade.1 Criação de um índice para melhorar o acesso. SELECT FROM ENAME.. O Oracle sabe quais colunas estão indexadas e o tipo do índice. ou através do comando: CREATE [UNIQUE] INDEX nome-do-índice ON nome-da-tabela (coluna1.6 Eliminação dos índices Os índices são eliminados através do comando: DROP INDEX nome-do-índice 19.]) 19.7 Quando um índice é utilizado O Oracle decide quando é apropriado utilizar um índice. [.5. A consulta mostrada abaixo não utiliza índice porque não possui cláusula Where. a) A coluna indexada deve ser referenciada na cláusula Where. JOB. SAL EMP A consulta abaixo utiliza o índice criado para a coluna ENAME: SELECT * 152 .coluna2.19.. Para evitar a duplicação do nome do departamento: CREATE UNIQUE INDEX DNAME_IDX ON DEPT(DNAME) O índice abaixo garante que não há duplicidade do par fornecedor/material fornecido. NUM-MATERIAL) 19. e decide de acordo com regras específicas.5 Criação dos índices Os índices são criados juntamente com as tabelas. Para criar um índice chamado ENAME_IDX para melhorar o tempo de acesso das consultas feitas através do nome do funcionário: CREATE INDEX ENAME_IDX ON EMP(ENAME) 19.

c) Consulte o dicionário de dados para obter as informações de seus índices. Isto significa que cada tabela é ordenada separadamente. b) Criar um índice não único na coluna PROJID da tabela ASSIGNMENTS. 19. e depois as duas são unidas de acordo com a condição de junção. No exemplo abaixo o índice não é utilizado porque a coluna ENAME é parte de uma função: SELECT FROM WHERE * EMP UPPER(ENAME) = ‘JONES’ No exemplo abaixo o índice não é utilizado porque a coluna é parte de uma expressão: SELECT FROM WHERE 19. 19.FROM WHERE EMP ENAME = ‘JONES’ b) O índice não é utilizado se a coluna referenciada na cláusula Where é parte de uma função ou de uma expressão.8 Índices e Junções Se não existirem índices nas colunas utilizadas para realizar a junção equivalente.9 Sugestões para criação dos índices As colunas que não permitem valores duplicados devem ser indexadas. Teste o índice inserindo um valor para PROJID já existente.10 Exercícios a) Criar um índice único na coluna PROJID da tabela PROJECTS. Não devem ser utilizados mais de 3 índices por tabela para não prejudicar as operações realizadas através das operações de DML. As colunas utilizadas nas condições de junção equivalente devem ser indexadas. o Oracle é obrigado a realizar uma operação de SORT/MERGE para responder a consulta. * EMP HIREDATE+7 = ‘01-JAN-84’ 153 . As colunas que são utilizadas habitualmente na cláusula Where devem ser indexadas.

11 Respostas dos exercícios a) CREATE ON b) CREATE ON c) SELECT FROM UNIQUE INDEX PROJ_PROJID PROJECTS(PROJID) INDEX ASG_PROJID ASSIGNMENTS(PROJID) * USER_INDEXES 154 .19.

155 . 10**27-1 para seqüências descendentes. primeiro a seqüência deve ser definida utilizando a declaração CREATE SEQUENCE. primeiro número a ser gerado. maior valor a ser gerado.]nome-da-seqüência [INCREMENTED BY n] [START WITH n] [MAXVALUE n | NOMAXVALUE] [MINVALUE n | NOMINVALUE] esquema nome-da-seqüência INCREMENT WITH START WITH MINVALUE|NOMINVALUE MAXVALUE|NOMAXVALUE identificação do dono da seqüência. menor valor a ser gerado. Para gerar os números seqüenciais automaticamente.Capítulo 20: Seqüências 20. 10**27-1 para seqüências ascendentes.1 Objetivos deste capítulo Mostrar a criação e a utilização das seqüências. incremento positivo ou negativo. Padrão: 1 para seqüências descendentes. O comando mostrada abaixo cria uma seqüência para a coluna DEPTNO da tabela DEPT.2 O gerador de seqüências O gerador de seqüências do Oracle é utilizado para gerar automaticamente seqüências de números para as linhas das tabelas. o valor é incrementado de 10. Padrão: 1.NEXTVAL SYS. 20. Padrão: 1. Padrão: 1 para seqüências ascendentes. nome válido para a seqüência. CREATE SEQUENCE DEPT_SEQ INCREMENT BY 10 START WITH 10 MAXVALUE 10000 20. Para um usuário poder criar uma seqüência deve possuir o privilégio de ‘resource’. SELECT FROM NEXTVAL ------10 DEPT_SEQ. conforme a sintaxe mostrada abaixo: CREATE SEQUENCE [esquema. Quando a coluna NEXTVAL é especificada um novo número seqüencial é gerado.DUAL Se o comando for executado novamente.1 Geração de números seqüenciais com NEXTVAL A pseudo-coluna NEXTVAL é utilizada para gerar números seqüenciais sucessivos de uma seqüência especificada.

20. Os números produzidos pelo gerador de seqüências podem ser saltados devido a Rollbacks. devido a valores gerados para o outro usuário que ainda não receberam o Commit. Lista de valores da declaração INSERT. 156 . o valor gerado é armazenado em CURRVAL. todas as referências retornam o mesmo valor. ‘NEW YORK’) Quando o número seqüencial é gerado. Cláusula SET da declaração UPDATE.DUAL Todo os valores subsequentes serão incrementados de 10. ‘ACCOUNTING’.NEXTVAL.SELECT FROM NEXTVAL ------20 DEPT_SEQ. A coluna NEXTVAL é mais útil em comandos de DML. Se a coluna NEXTVAL for referenciada diversas vezes dentro do mesmo comando SQL. a seqüência pode ser utilizada para gerar valores únicos para a chave primária. INSERT INTO DEPT_HISTORY VALUES (DEPT_SEQ. ‘NEW YORK’) 20. Quando dois usuários acessam a mesma seqüência ao mesmo tempo. pode ser utilizada a pseudo-coluna CURRVAL. Notas: A coluna NEXTVAL sempre deve ser prefixada pelo nome da seqüência. INSERT INTO DEPT VALUES (DEPT_SEQ.1 Valor atual da seqüência Para se referir ao valor atual da seqüência. quando são inseridas linhas na tabela.NEXTVAL SYS. Por exemplo. os dois usuários podem ver descontinuidades na seqüência.CURRVAL.2 Regras para utilizar CURRVAL E NEXTVAL Currval e Nextval podem ser utilizados na: Cláusula SELECT da declaração SELECT (exceto para visões). ‘ACCOUNTING’. a seqüência é incrementada independentemente de haver um Commit ou um Rollback para a transação. que só pode ser utilizada após NEXTVAL ser referenciado na sessão atual do usuário. Toda vez que a pseudo-coluna NEXTVAL é utilizada.

Connect By. para modificar o valor máximo para a seqüência DEPT_SEQ: ALTER SEQUENCE dept_seq MAXVALUE 100000 Notas: Somente os números a serem gerados no futuro são alterados pelo comando Alter Sequence. Seqüências são tratadas de maneira similar às tabelas. Currval e Nextval não podem ser utilizados: Em visões. Os números que já foram gerados não são alterados. Union e Minus. Dentro de uma consulta interna.4 Concedendo privilégios em seqüências O dono de uma seqüência pode conceder os privilégios Select e Alter. 20. 20. Com os operadores Intersect. ALTER SEQUENCE [esquema. Com as cláusulas Order By. ou Having da declaração SELECT. A seqüência deve ser eliminada e recriada para ser iniciada com um novo número. um novo valor máximo menor que o valor corrente. Não pode ser especificado. por exemplo.3 Alterando uma seqüência O comando ALTER SEQUENCE é utilizado para modificar uma seqüência existente. Validações são realizadas.]nome-da-sequencia [INCREMENT BY n] [MAXVALUE n | NOMAXVALUE] [MINVALUE n | NOMINVALUE] Por exemplo. 20. podendo ser alteradas e eliminadas. O dono de uma seqüência pode conceder privilégios a outros usuários. O parâmetro START WITH não pode ser alterado pelo comando Alter Sequence.5 Eliminando uma seqüência 157 . Com a palavra chave DISTINCT.SELECT mais externo (consulta principal) de uma subconsulta. Group By.

]nome-da-seqüência Apenas o dono da seqüência e o DBA podem utilizar este comando. 158 . 20.O comando Drop Sequence remove a definição da seqüência do dicionário de dados. DROP SEQUENCE [esquema.6 Listando seqüências As visões USER_SEQUENCES ou ALL_SEQUENCES podem ser utilizadas para descobrir as seqüências existentes.

Apêndice A .Faixas Salariais GRADE 1 2 3 4 5 LOSAL 700 1201 1401 2001 3001 HISAL 1200 1400 2000 3000 9999 159 .Departamentos DEPTNO 10 20 30 40 DNAME ACCOUNTING RESEARCH SALES OPERATIONS LOC NEW YORK DALLAS CHICAGO BOSTON Tabela SALGRADE .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 0 Tabela DEPT .Tabelas do Curso Tabela EMP .

....................................................................3.2.......................................2........................ 12 2.........3..........1 OBJETIVOS DESTE CAPÍTULO .......... 30 4......................................................... 24 3.............. 31 4..................3 FUNÇÕES NUMÉRICAS ................................................................... 18 2.1 OBJETIVOS DESTE CAPÍTULO ............................................................................................ 32 4...............................14 Funções aninhadas.................................................................................................2 SISTEMA DE GERENCIAMENTO DE BANCO DE DADOS ..................4 LPAD(coluna | literal. comprimento) ................................................... 31 4... 30 4............... 26 4......................... para) ................................. posição...............................................................................................................................................2.................................................................................. 10 2...................................... 'caracteres') ......2.....10 ORDENAÇÃO DAS LINHAS ...........................................................................................................................................................................................................2............................................................................................................3..... 31 4.......................................5 POWER(coluna | literal...............9 SQRT(coluna | literal) .....................4 EXPRESSÕES ARITMÉTICAS.......................................CAPÍTULO 1: CONCEITOS DE BANCO DE DADOS ...............................8 LN(coluna | literal)................................................................... 25 4........................................................................................................................................................... 28 4.6 EXP(coluna | literal) ..................3................................................................................................. 25 4....... 14 2............................. tamanho.............................................4 ARQUITETURA DO ORACLE ............3.......................................................................................................16 RESPOSTAS DOS EXERCÍCIOS ...............................................................................................................................12 MOD(valor1..................9 ELIMINAÇÃO DE LINHAS DUPLICADAS .................................................................................................. 1 1....................................................................................... 25 4...................................................................11 LENGTH(coluna | literal) ....................... ‘seqüência de caracteres'.......................................................................................................8 MANUSEIO DE VALORES NULOS............................ 6 2............... 26 4.............................................................. 'caracter') .........................................5 NOMES ALTERNATIVOS PARA TÍTULOS DE COLUNAS............................................................................................. 'caracteres')....................... coluna | literal) ..............................................3..................7 LITERAIS .....................................2...................3......................................................................................... n) .....................................................................10 SIGN(coluna | literal).................................... 7 2.................................................................................. 27 4........................... 30 4............... 4 CAPÍTULO 2: INTRODUÇÃO ÀS CONSULTAS.........................3 CEIL(coluna | literal) ..........3.......... n) .......... 9 2.............................. 25 4.........................2...............................................1 OBJETIVOS DESTE CAPÍTULO ................................................................ 24 3..................................................................................4 FLOOR(coluna | literal)..... 28 4...2 UPPER(coluna | literal) .........6 SUBSTR(coluna | literal....................................................3 CONSTRUÇÃO BÁSICA DE UMA CONSULTA............3 VARIÁVEIS DE SUBSTITUIÇÃO COM DOIS "&" ...................................................................................... n) ................................................................................................3 INITCAP(coluna | literal) .......................... 24 3.......... de.............. 32 4..........................2 VARIÁVEIS DE SUBSTITUIÇÃO COM UM "&" ............................. 'caracter') ..............12 TRANSLATE(coluna | literal....2 O UTILITÁRIO SQL*PLUS...........................................................10 SOUNDEX(coluna | literal) .2 FUNÇÕES QUE MANIPULAM CARACTERES ........... 10 2............................................ 25 4.............. 1 1.................................................................................. tamanho...................................................................................................2..........................1 LOWER(coluna | literal) ............................................................ 6 2........................... 9 2.......................................3.... 6 2....................1 ROUND(coluna | literal...................................................................................................11 CRITÉRIOS DE PESQUISA .......................... 29 4.............. 30 4.................................................................................................................................. 26 4............. 27 4.. 27 4............2...2 TRUNC(coluna | literal................................... 19 2...........................11 ABS(coluna | literal)...13 PRECEDÊNCIA DOS OPERADORES................. 23 CAPÍTULO 3: VARIÁVEIS DE SUBSTITUIÇÃO ...........................................................................................5 RPAD(coluna | literal........ 31 4.......15 EXERCÍCIOS................................7 LOG(base...........3..................................................................................................................................................................................................6 O OPERADOR DE CONCATENAÇÃO ..........3........................................................................................................................................................................................................................ posição........... 20 2....................................13 REPLACE(coluna | literal.............2.................. 28 4....................................................................................................................................1 OBJETIVOS DESTE CAPÍTULO ......9 RTRIM(coluna | literal........3 BANCO DE DADOS RELACIONAL ............................8 LTRIM(coluna | literal...........................................................................2........................................... de.............................7 INSTR(coluna | literal.......................................................................................................................................................................... 6 2.....14 RESUMO DO COMANDO SELECT .................................................................................................................................. valor2) .......................................................................................................... 24 CAPÍTULO 4: FUNÇÕES NUMÉRICAS E DE CARACTERES........................................................................ 32 160 .........................................................................................................................2...............3.................................. 25 4....... 30 4.....................................................................................................................................2................................................................................................ 1 1.......................... para) ................. 1 1....................................................... 13 2............................................................................................................................................................................. 20 2........................................................................................................ 31 4................... n) ...........12 CONSULTAS COM CONDIÇÕES MÚLTIPLAS ....... 25 4.............................................2......................................................................

...........................2 Aritmética de datas............................................................2 FUNÇÕES QUE MANIPULAM DATAS ................................................................................................................................................ 58 7..........................................................................................................................................................................................default)..........................) .........2..........6 GRUPOS DENTRO DE GRUPOS .............. 62 CAPÍTULO 8: OUTROS MÉTODOS DE JUNÇÃO ...................................... 59 7..................4................................. 45 5....5 RESPOSTAS DOS EXERCÍCIOS .................1 SYSDATE...............................5 EXERCÍCIOS................. 39 5.........................................................................2 JUNÇÕES EQUIVALENTES .............................................................................................................................................................................................................................. 42 5...........................................................................................res1............................ 44 5....4...................................... 57 7.................... 50 6...............................................) ......................................................................................................................................................................................6 LAST_DAY(data)...........................................................................................................................................................................................................................................2.. 54 6..........................pes1............................................................. 37 5..................1 OBJETIVOS DESTE CAPÍTULO ................................................................................ 37 5..........4.............2 NVL(coluna|valor............................................ 45 5..................................... 51 6............2...........4..........5 Funções aninhadas revisitadas ..................................... 56 CAPÍTULO 7: EXTRAINDO DADOS DE MAIS DE UMA TABELA ..................................................................................................................................................................... 57 7.................................................................................9 ORDEM DAS CLÁUSULAS ...2........................................3 PRODUTO ................. coluna|valor...... 64 161 ......................4 FUNÇÕES QUE ACEITAM QUALQUER TIPO DE DADO ........................................................................4............................................................... 63 8............................................. 38 5.................................. 33 4.........data2) ...........................................................................5 NEXT_DAY(data........... 37 5.................................................................................................................................................................................. 40 5................................................................................................................5 TO_DATE('cadeia_de_caracteres'...............................................4 EXERCÍCIOS.......................................................................................4 JUNÇÕES VERTICAIS ..................................... 44 5................................................................... 59 7........... 42 5............................................................................................................................................................3 USANDO FUNÇÕES DE GRUPO ..........................................................................3 Formatos Numéricos ............................................................................................................................................................................................................ 41 5.....................................................4......................................................................................................................................... 50 6..........................................].......................................................3 GREATEST(coluna|valor..............................................................................................3..................................................... 58 7.............................................................[pes2... 39 5................................ 52 6........................................................................................... 37 5...................................... 42 5.......................................7 EXERCÍCIOS..............................................................2.................................................... 51 6................................2 JUNÇÕES EXTERNAS ......1 DECODE(coluna|expressão.................................................. 63 8............3 JUNÇÃO DE UMA TABELA COM ELA MESMO ..................................................................... dia_da_semana)......................................................1 OBJETIVOS DESTE CAPÍTULO ..................................................................................................................................................................................................................................................................... 44 5.................. 63 8.................... 39 5..... meses)........................................................................ 36 CAPÍTULO 5: FUNÇÕES DE DATA E DE CONVERSÃO ............................................................ 57 7....................................................................................................... 49 6............................4..........................res2.......................................5 EXCLUINDO LINHAS DOS GRUPOS ..........................................................................4 ADD_MONTHS(data............................................................. 45 5.....................................................['formato']) .....................................................................................................................................................................................................2 FUNÇÕES DISPONÍVEIS...................................7 ROUND(data) .............................................................................. 33 4.......................................................... 53 6..............................2................................................................................3. 42 5.........................4 LEAST(coluna|valor....5 VSIZE(coluna|valor) ............................................2......................................4 TO_NUMBER(cadeia_de_caracteres) .. 33 4.....................................................................................................................................................................................................................................................................................................................................3. 59 7............................................3........2 TO_CHAR(número|data..............14 Funções hiperbólicas ...............................................................2......... 49 6............................................... 49 6......................................3...........10 EXERCÍCIOS..............................................3.................8 A CLÁUSULA HAVING .................. 38 5................ 38 5................................................................................... 48 CAPITULO 6: FUNÇÕES DE GRUPO..........1 OBJETIVOS DESTE CAPÍTULO .............................................. 37 5.............................5 REGRA PARA JUNÇÃO DE TABELAS ..................'formato') ...13 Funções trigonométricas ...........4 JUNÇÕES NÃO EQUIVALENTES .........................8 SOLUÇÃO DOS EXERCÍCIOS ...............1 OBJETIVOS DESTE CAPÍTULO .................. coluna|valor......11 RESPOSTAS DOS EXERCÍCIOS ...........................................................7 TRUNC(data) ..................... 63 8...........................6 RESPOSTAS DOS EXERCÍCIOS ......3 MONTHS_BETWEEN(data1........................................................................... 39 5........................................................................6 SUMÁRIO DA SINTAXE ................................................ 37 5......................7 FUNÇÕES DE GRUPO E RESULTADOS INDIVIDUAIS ...........................................................................1 Formatos de Data ......... 49 6...4 A CLÁUSULA GROUP BY ...3 FUNÇÕES DE CONVERSÃO ..................................................................3....................... valor) ............

..........................................................................6 OPERADORES ANY E ALL ......................................................... 101 13................................4.................................................................... 93 11.......... 83 CAPÍTULO 11: GERAÇÃO DE RELATÓRIOS ..............................................4............... 100 CAPÍTULO 13: DICIONÁRIO DE DADOS ......4 TERMINOLOGIA .................................... 78 CAPÍTULO 10: GERAÇÃO DE RELATÓRIOS ........13 RESPOSTA DOS EXERCÍCIOS ................................................3 EXCLUINDO UM NÓ DA ÁRVORE ...7 EXERCÍCIOS.................................2 Interseção ............................................................... 95 CAPÍTULO 12: HIERARQUIAS .........................................................................................................................................................................................................................................................................................8 EXERCÍCIOS................ 81 10.............................................................6 EXEMPLO DE REMOÇÃO DA FORMATAÇÃO ...............................5 VISÕES DO DICIONÁRIO DE DADOS...................... 96 12............4 QUEBRAS NOS RELATÓRIOS ..................................3 COLUMN ........................................................................................................................................................................................................................................................................5 EXERCÍCIOS.............. 84 11..........3 CONSULTAS INTERNAS QUE RETORNAM APENAS UM VALOR ................................................................................................................................................................... 80 10.............................................................................................. 70 9.................................................................... 84 11................. 98 12........................................................ 65 8.......................................... 101 13................4 TABELAS DO DICIONÁRIO DE DADOS .....4 EXEMPLO DE FORMATAÇÃO DE COLUNAS...........................3 INFORMAÇÕES CONTIDAS NO DICIONÁRIO DE DADOS ....... 101 13......7 CLÁUSULA HAVING COM CONSULTAS ANINHADAS ........................5 CONSULTAS INTERNAS QUE RETORNAM MAIS DE UM VALOR ................................................................................. 100 12...............................................................................5 EXERCÍCIOS.....................................................................................................................................................................................................................................................................................................................................................................................................................................5 A cláusula ORDER BY .................................................................................4 COMO AS CONSULTAS ANINHADAS SÃO EXECUTADAS ..................................................................................................4 Combinação de operadores ........................8.................. 80 10............................ 108 162 ......................5 EXEMPLO DE FORMATAÇÃO DE TÍTULO .........6 EXEMPLOS DE UTILIZAÇÃO DO DICIONÁRIO DE DADOS ........ 74 9................... 84 11..........................................................................................................................................................................................................2 CONJUNTO DE COMANDOS SET DO SQL*PLUS ....................................................................................9 LIMITE PARA O ANINHAMENTO .........................................................................1 OBJETIVOS DESTE CAPÍTULO ............................................................................................................................................ 89 11.......9 RESPOSTAS DOS EXERCÍCIOS .............................1 OBJETIVOS DESTE CAPÍTULO .................................................................... 80 10.......2 DEFINIÇÃO DE CONSULTAS ANINHADAS .......................................... 96 12.............................................................. ................................................................................................................... 69 9......... 65 8......... 101 13...........................................................2 O QUE É O DICIONÁRIO DE DADOS .................................................................................................................................................................4....................................... 81 10..........................................................................6 RESPOSTAS DOS EXERCÍCIOS ....................................... 81 10.......10 CONSULTA INTERNA CORRELACIONADA .................................................2 PROPRIEDADES DOS CABEÇALHOS E DOS RODAPÉS .................... 101 13..................................................................... 75 9..........................................1 Formato de exibição para as colunas ...............7 ARQUIVO DE COMANDOS PARA O SQL*PLUS ....... 80 10...................... 91 11..............................1 União .....11 O OPERADOR EXISTS............................................................... 86 11.................................................................................................................. 101 13..............................CAMINHANDO NA ÁRVORE .......................................................................................................................................3...............4..............................1 OBJETIVOS DESTE CAPÍTULO .................................................. 69 9.............. 96 12...............................................12 EXERCÍCIOS................................................................................................... 68 CAPÍTULO 9: CONSULTAS ANINHADAS ................................................. 66 8.......................................................................... 85 11............................6 Regras para utilizar junções verticais .........................................................................................................................................................4...........................1 OBJETIVOS DESTE CAPÍTULO ..............................................................................................3 Subtração ....1 OBJETIVOS DESTE CAPÍTULO ...........................................................2 Outras opções de exibição das colunas.... 73 9......................3.............................................................................................................................. 65 8.................... 73 9.................................................................................... 69 9.......................................................................................................................................................3 A CLÁUSULA NEW_VALUE ...................................... 71 9............. 64 8....................... 72 9......................................................4....................................................................................... 70 9....................................................... 69 9.........................................................................................................6 RELATÓRIO MATRICIAL ......................... 87 11...............................................................8 ORDENAÇÃO EM CONSULTAS ANINHADAS ....................................................................................................... 82 10...........................................................................5 CÁLCULO DE SUMÁRIOS ............................................................. 73 9............................................ 64 8..................................................................................................................................................................................................... 106 13......................................................................................................................PARTE 2 ..................................................................................................................................................................2 QUANDO É POSSÍVEL CAMINHAR NA ÁRVORE ............. 65 8.............................................................................

................................................................................................. 136 17.......... 110 14.................................................................4 ELIMINANDO LINHAS DE UMA TABELA...............................................................................................1 Bloqueios do dicionário de dados (DDL) ............. 111 14.................1 OBJETIVOS DESTE CAPÍTULO ...2 O QUE É UMA TRANSAÇÃO ............................................................CAPÍTULO 14: LINGUAGEM DE DEFINIÇÃO DE DADOS.. 111 14.................................................................................................................................................................................................... 113 14........................................................................................................................................................ 128 16...................................... 133 16........................................ 121 15....................................................................................................................................................................................................................................................................................................... 137 17.............................................................................................................. 112 14...................................................................................................................................................................................................... 128 16..................................................................................................................................................................................1 OBJETIVOS DESTE CAPÍTULO ..2 ESTRUTURA DE DADOS DO ORACLE ......8 COMMIT [WORK] .......................................................... 137 17.......................6 RELAÇÃO ENTRE OS TIPOS DE DADOS ANSI E DO ORACLE ..... 136 17.............................................. 116 14..1 OBJETIVOS DESTE CAPÍTULO ...... 125 15............. 139 17......... 129 16......................................................2 Bloqueios da manipulação de dados (DML) ....................................................... 136 17..........................................................2 INSERINDO NOVAS LINHAS EM UMA TABELA ...................... 126 CAPÍTULO 16: PROCESSAMENTO DE TRANSAÇÕES................................................................................................................................. 137 17....................................................................................6 O SIGNIFICADO DE UMA TRANSAÇÃO ........3 CRIANDO UMA TABELA .............5 FALHAS DO SISTEMA ..........................................................................................................................................................................14 EXERCÍCIOS.................................... 110 14....................................12 ROLLBACKS IMPLÍCITOS ....................................................................................................................................... 121 15........15 CONSISTÊNCIA DE LEITURA .............................................10 BLOQUEIOS EXPLÍCITOS........................................ 117 14........................................................................ 136 17.........................................8 CRIAÇÃO DE TABELAS ............................................................................................3 Exemplos de restrições ........................................................ 121 15.......... 118 14.....................................7 CONTROLANDO TRANSAÇÕES..................................................................... 112 14................................................................................................................................................. 130 16........................ 129 16....5 EXERCÍCIOS...16 TRANSAÇÕES SOMENTE DE LEITURA ..................................................1 Sintaxe do comando: ................................................................................................................8................................................................................................ 112 14................................9 BLOQUEIOS IMPLÍCITOS ..................................... 137 17.................. 115 14.............................................................................................................3 ATUALIZANDO LINHAS EM UMA TABELA .................................................2 INTRODUÇÃO AO BLOQUEIO ............................8........................6..........................................................................11 IDENTIFICAÇÃO DA LINHA E BLOQUEIO ..................................6...................................................................... 134 CAPÍTULO 17: CONCORRÊNCIA E BLOQUEIO ...........................................................................................................................................................................................................................................................................................................................................................3 EFETIVANDO AS MUDANÇAS.................. 137 17................................10 ALTERANDO UMA TABELA ..... 130 16.......................... 128 16..9 SAVEPOINT SAVEPOINT_NAME ........................................................ 123 15..............................................................................................................................................7 NÍVEIS DE BLOQUEIO . 110 14......................................................7 RELAÇÃO ENTRE OS TIPOS DE DADOS DO SQL/DS E DO ORACLE .................................................4 REMOVENDO MUDANÇAS ..................... 136 17..... 130 16.................. 118 CAPÍTULO 15: LINGUAGEM DE MANIPULAÇÃO DE DADOS.............................. 140 163 .................................................................................................6 RESPOSTAS DOS EXERCÍCIOS .......................................................................................................................................................................................................... 127 16.....................5 QUANDO OS BLOQUEIOS SÃO LIBERADOS .............................................................................6 TIPOS DE BLOQUEIOS ............... 130 16.................................................. 127 16......................1 OBJETIVOS DESTE CAPÍTULO ..........4 RECOMENDAÇÕES SOBRE OS NOMES DAS TABELAS .........8.....................................................................................8 DESCRIÇÃO DOS BLOQUEIOS ........................................................................2 Criação das tabelas do curso: ....................11 TROCANDO O NOME DE UMA TABELA ............................................ 137 17......................................................................................14 EXEMPLO DE UTILIZAÇÃO DE COMMIT E ROLLBACK............................................9 CRIANDO UMA TABELA A PARTIR DE OUTRA TABELA..........................................................10 ROLLBACK[WORK] TO [SAVEPOINT] SAVEPOINT_NAME.............................................................................................................. 110 14............................ 128 16............................ 118 14..................................................................... 128 16................................................................................................................................................................................................................................. 127 16............................................................... 140 17.................................................11 ROLLBACK A NÍVEL DE DECLARAÇÃO....... 112 14.................................................5 TIPO DE DADO DAS COLUNAS ................................................................................. 127 16...........4 QUANDO OS BLOQUEIOS SÃO NECESSÁRIOS .....................3 O QUE É UM BLOQUEIO .............................. 114 14..............................................................................................................................................................................................13 AUTOCOMMIT ................................................................................ 124 15..........................................................12 DESCRIÇÃO DAS TABELAS E COLUNAS ......................13 REMOVENDO TABELAS ...........................................................................................................................................

................................................................................................................................................... 155 20........................................................................................................................................................... 143 18...............................................................................................................1 Visões simples ..........................3 CLASSIFICAÇÃO DAS VISÕES .........................................................................................................................................2 O QUE É UMA VISÃO ...........................................................................1 OBJETIVOS DESTE CAPÍTULO ............... 153 19...................................................................... .......................................................................................................................................2 REGRAS PARA UTILIZAR CURRVAL E NEXTVAL ............................................................ 155 20...4 CONCEDENDO PRIVILÉGIOS EM SEQÜÊNCIAS ...................................................2 Visões complexas.........................................................................................1 Criação de um índice para melhorar o acesso............................................................................................................................................................................................... 152 19.................................................6 ALTERANDO DADOS ATRAVÉS DAS VISÕES ....................................................5 USANDO UMA VISÃO PARA OPERAÇÕES DE DML .......................3................................................................................................... 155 20...................................................................................................... 143 18....................................................................... 147 18..... 151 19.................................................................................... 153 19......................12 IMPASSE (DEADLOCK)........................................................................................................ 156 20.................................................................................................................2 O GERADOR DE SEQÜÊNCIAS ..............................................................................................................8 ÍNDICES E JUNÇÕES ..........................................................................................10 EXERCÍCIOS...............................7 QUANDO UM ÍNDICE É UTILIZADO .................................................................... 143 18....................................................................................................................................5 CRIAÇÃO DOS ÍNDICES ............................................................................. 151 19................................................................. 157 20............................ 145 18...............5................................... 153 19....................1 OBJETIVOS DESTE CAPÍTULO .............................................................................................. 150 CAPÍTULO 19 ............. 154 CAPÍTULO 20: SEQÜÊNCIAS...............................3 ESTRUTURA DOS ÍNDICES .......................................... 143 18...........VISÕES ............................................................7 ELIMINAÇÃO DE VISÕES ................9 SUGESTÕES PARA CRIAÇÃO DOS ÍNDICES .................. 147 18.....................6 ELIMINAÇÃO DOS ÍNDICES .....................................................................................................................................................2 Criação de um índice para garantir unicidade.......................................... 143 18............................................................................................................................................................................................................ 157 20................. 143 18....2 FINALIDADES DOS ÍNDICES ............................5 ELIMINANDO UMA SEQÜÊNCIA ............................................... 152 19....................................................................................... 152 19............................. ...........................................17................................................................. 156 20......................................... 148 18............................................................. 155 20................................................3............9 RESPOSTAS DOS EXERCÍCIOS ......TABELAS DO CURSO ................................3 ALTERANDO UMA SEQÜÊNCIA ......................................................................1 OBJETIVOS DESTE CAPÍTULO ..............................................11 RESPOSTAS DOS EXERCÍCIOS ............................ 152 19.......................ÍNDICES .......................................................................1 GERAÇÃO DE NÚMEROS SEQÜENCIAIS COM NEXTVAL ................................................................. 152 19..........1 VALOR ATUAL DA SEQÜÊNCIA ............... 141 CAPÍTULO 18 ................................................................................................................................................. 159 164 .................. 151 19......................... 151 19.................................................................. 144 18.............................6 LISTANDO SEQÜÊNCIAS .............................................4 O COMANDO CREATE VIEW .............8 EXERCÍCIOS...........5...................................... 157 20........................................................................................................................................................................................................................................ 151 19...4 TIPOS DE ÍNDICES .......................................................................................... 158 APÊNDICE A ...............................

Sign up to vote on this title
UsefulNot useful