oracle sql português

606
1-1 Copyright ' Oracle Corporation, 2001. Todos os direitos reservados. Introduªo ao Oracle9i: SQL Apresentaªo Eletrnica 40049BP11 Produªo 1.1 Fevereiro de 2002 D34392

Upload: diogolopez

Post on 11-Nov-2014

12.339 views

Category:

Business


2 download

DESCRIPTION

Curso de SQL oficial da Oracle

TRANSCRIPT

Page 1: Oracle Sql PortuguêS

1-1 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Introdução ao Oracle9i: SQL

Apresentação Eletrônica

40049BP11Produção 1.1Fevereiro de 2002D34392

Page 2: Oracle Sql PortuguêS

1-2 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Copyright © Oracle Corporation, 2000, 2001. Todos os direitos reservados.

Esta documentação contém informações patenteadas pela Oracle Corporation.É fornecida sob um contrato de licença que contém restrições sobre seu uso esua divulgação, sendo também protegida pela legislação de direitos autorais. Não épermitida a engenharia reversa do programa de computador. Se esta documentaçãofor entregue/distribuída a uma Agência do Departamento de Defesa do Governo dosEstados Unidos da América do Norte, será então entregue/distribuída com DireitosRestritos e a seguinte legenda será aplicável:

Legenda de Direitos Restritos

O uso, duplicação ou divulgação por aquele Governo estão sujeitos às restriçõesaplicáveis aos programas comerciais de computadores e serão considerados comoprogramas de computador com Direitos Restritos de acordo com a legislação federaldaquele Governo, conforme descrito no subparágrafo da legislação norte-americana(c)(1)(ii) de DFARS 252.227-7013, Direitos sobre Dados Técnicos e Programas deComputador (outubro de 1988).

Proibida a reprodução total ou parcial desta documentação sem a expressaautorização prévia por escrito da Oracle Corporation ou da Oracle do Brasil SistemasLtda. A cópia deste material, de qualquer forma ou por qualquer meio, eletrônico,mecânico ou de outra natureza, inclusive através de processos xerográficos, defotocópia e de gravação, constitui violação da legislação de direitos autorais e serápunida civil e/ou criminalmente na forma da lei.

Se esta documentação for entregue/distribuída a uma Agência do Governo dosEstados Unidos da América do Norte que não esteja subordinada ao Departamentode Defesa, será então entregue/distribuída com "Direitos Restritos" conforme definidono FAR 52.227-14, Direitos sobre Dados - Geral, inclusive a Alternativa III (junhode 1987).

As informações contidas neste documento estão sujeitas a alterações sem avisoprévio. Se você encontrar algum problema na documentação, envie a EducationProducts - Oracle Corporation ou a Education - Oracle do Brasil Sistemas Ltda.uma descrição de tal problema por escrito. A Oracle Corporation e a Oracle doBrasil Sistemas Ltda. não garantem que este documento esteja isento de erros.

Oracle e todos os demais produtos Oracle citados nesta documentação são marcascomerciais ou marcas comerciais registradas da Oracle Corporation.

Todos os outros nomes de produtos ou de empresas são aqui mencionadosapenas para fins de identificação e podem ser marcas comerciais de seusrespectivos proprietários.

Autores

Nancy GreenbergPriya Nathan

Colaboradores Técnicose RevisoresJosephine TurnerMartin AlvarezAnna AtkinsonDon BatesMarco BerbeekAndrew BranniganLaszlo CzinkoczkiMichael GerlachSharon GrayRosita HanomanMozhe JalaliSarah JonesCharbel KhouriChristopher LawlessDiana LorentzNina MinchenCuong NguyenDaphne NougierPatrick OdellLaura PezziniStacey ProcterMaribel RenauBryan RobertsHelen RobertsonSunshine SalmonCasa SharifBernard SoleillantCraig SpoonemoreRuediger SteffanKarla VillasenorAndree WheeleyLachlan Williams

Editor

Nita Brozowski

Page 3: Oracle Sql PortuguêS

Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Mapa de Cursos

Page 4: Oracle Sql PortuguêS

Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Currículo de Linguagens do Oracle9i

Introduction to Oracle9ifor

Experienced SQL Users (Introdução ao Oracle9i para

Usuários Experientes em SQL)

inClass

Oracle9i: Advanced PL/SQLinClass

Oracle9i: Advanced PL/SQLinClass

Oracle9i: SQL for End Users

inClass

Oracle9i: SQL for End Users

inClass

Oracle9i: Develop PL/SQL Program Units

Oracle9i: Develop PL/SQL Program Units

Oracle9i: PL/SQLFundamentals

ouIntroduction to Oracle9i: SQL Basics (Introdução ao Oracle9i: SQL Básico)

Introdução ao Oracle9i: SQL

inClass

Oracle9i: Advanced SQL (Oracle9i: SQL

Avançado)

Oracle9i: Program with PL/SQL (Oracle9i: Unidades de Programas PL/SQL)

inClass

Page 5: Oracle Sql PortuguêS

ICopyright © Oracle Corporation, 2001. Todos os direitos reservados.

Introdução

Page 6: Oracle Sql PortuguêS

I-2 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Objetivos

Após concluir esta lição, você poderá fazer o seguinte:� Listar os recursos do Oracle9i� Discutir os aspectos teóricos e físicos de um banco

de dados relacional� Descrever a implementação Oracle do RDBMS e

ORDBMS

Page 7: Oracle Sql PortuguêS

I-3 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Oracle9i

Escalabilidade

Confiabilidade

Modelo dedesenvolvimento

único

Conjuntosde habilidades

comuns

Uma interfacede

gerenciamento

Umfornecedor

Page 8: Oracle Sql PortuguêS

I-4 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Oracle9i

Page 9: Oracle Sql PortuguêS

I-5 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Oracle9i Application Server

Business IntelligenceBusiness intelligence

Aplicações TransacionaisAplicações Transacionais

PortaisPortais

APACHE

IntegraçãoIntegração

Page 10: Oracle Sql PortuguêS

I-6 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Oracle9i Database

MultimídiaMultimídia

Dados Relacionais de ObjetosDados Relacionais de Objetos

MensagensMensagens

Documentos

XML

Documentos

XML

Page 11: Oracle Sql PortuguêS

I-7 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Sistema de Gerenciamento de Banco de Dados Relacional de Objetos e Relacional

� Modelo relacional e modelo relacional de objetos� Objetos e tipos de dados definidos pelo usuário� Compatibilidade total com o banco de dados

relacional� Suporte de objetos grandes e multimídia� Recursos de servidor de banco de dados de alta

qualidade

Page 12: Oracle Sql PortuguêS

I-8 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Oracle Internet PlatformClientes

Ger

enci

amen

tode

sist

ema

Serviços de rede

Bancosde dados

Servidores deaplicações

Ferramentas

dedesenvolvim

entoAplicações paraInternet

Apresentação elógica comercial

Lógica comerciale dados

Qualquernavegador

Qualquercliente FTP

Qualquerclientede correio

JavaJava

SQLSQLSQL

PL/SQLPL/SQLPL/SQL

Page 13: Oracle Sql PortuguêS

I-9 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Ciclo de Vida Útil deDesenvolvimento do Sistema

Estratégiae

análiseProjeto

Construçãoe

documentaçãoTransição

Produção

Page 14: Oracle Sql PortuguêS

I-11 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Armazenamento de Dadosem Diferentes Mídias

Arquivo físicoPlanilha eletrônica

Banco de Dados

Page 15: Oracle Sql PortuguêS

I-12 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Conceito de Banco de Dados Relacional

� O Dr. E. F. Codd propôs o modelo relacional desistemas de bancos de dados em 1970.

� Ele é a base para o RDBMS (relational database management system).

� O modelo relacional consiste nos seguintes itens:� Conjunto de objetos ou relações� Conjunto de operadores para agir sobre as

relações� Integridade de dados para fins de precisão e

consistência

Page 16: Oracle Sql PortuguêS

I-13 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Definição de Banco de Dados Relacional

Um banco de dados relacional é um conjunto derelações ou tabelas bidimensionais.

ServidorServidorOracleOracle

Nome da Tabela: EMPLOYEES Nome da Tabela: DEPARTMENTS

� �

Page 17: Oracle Sql PortuguêS

I-14 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Modelos de Dados

Modelo desistema

na mentedo cliente

Modelo de entidadedo modelo do cliente

Modelo de tabela do modelo de entidade

Tabelas em disco

ServidorOracle

Page 18: Oracle Sql PortuguêS

I-15 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

� Crie um diagrama de relacionamento de entidades apartir de narrativas ou especificações de negócios

� Cenário� ". . . Atribua um ou mais funcionários a um

departamento. . ."� ". . . Alguns departamentos ainda não têm

funcionários atribuídos a eles. . ."

� Crie um diagrama de relacionamento de entidades apartir de narrativas ou especificações de negócios

� Cenário� ". . . Atribua um ou mais funcionários a um

departamento. . ."� ". . . Alguns departamentos ainda não têm

funcionários atribuídos a eles. . ."

Modelo de Relacionamento de Entidades

EMPLOYEEEMPLOYEE#* #* nnúmeroúmero** nomenomeoo cargocargo

DEPARTMENTDEPARTMENT#* #* nnúmeroúmero** nomenomeoo locallocal

atribuído a

composto de

Page 19: Oracle Sql PortuguêS

I-17 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Convenções de Modelo para Relacionamento de Entidades

Entidade"Soft box"Nome exclusivo individualLetras maiúsculasSinônimo entre parênteses

AtributoNome individualLetras minúsculasObrigatório marcado com "*"Opcional marcado com "o"

UID (Identificador Exclusivo)Principal marcado com "#"Secundário marcado com "(#)"

EMPLOYEEEMPLOYEE#* #* nnúmeroúmero** nomenomeoo cargocargo

DEPARTMENTDEPARTMENT#* #* nnúmeroúmero** nomenomeoo locallocal

atribuído a

composto de

Page 20: Oracle Sql PortuguêS

I-19 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Relacionando Várias Tabelas

� Cada linha de dados de uma tabela é identificada comexclusividade por uma chave primária (PK).

� Você pode relacionar logicamente dados de várias tabelas usando as chaves estrangeiras (FK).

Nome da Tabela: EMPLOYEESNome da Tabela: DEPARTMENTS

Chave primária Chave primáriaChave estrangeira

Page 21: Oracle Sql PortuguêS

I-21 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Terminologia de Banco de Dados Relacional

1

23 4

5

6

Page 22: Oracle Sql PortuguêS

I-23 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Propriedades deBanco de Dados Relacional

Um banco de dados relacional:� Pode ser acessado e modificado com a execução

de instruções SQL (Structured Query Language)� Contém um conjunto de tabelas sem ponteiros físicos� Usa um conjunto de operadores

Page 23: Oracle Sql PortuguêS

I-24 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Comunicando-se com um RDBMS Usando o Código SQL

SELECT department_name FROM departments;

SELECT department_name FROM departments;

A instrução SQLé informada.

ServidorOracle

A instrução éenviada ao Oracle

Server.

Page 24: Oracle Sql PortuguêS

I-25 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Sistema de Gerenciamento deBanco de Dados Relacional

Tabelas deusuários

Dicionáriode dados

ServidorOracle

Page 25: Oracle Sql PortuguêS

I-26 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Instruções SQLSELECT

INSERTUPDATEDELETEMERGE

CREATEALTERDROPRENAMETRUNCATE

COMMITROLLBACKSAVEPOINT

GRANTREVOKE

Recuperação de dados

DML (Data Manipulation Language)

DDL (Data Definition Language)

Controle de transação

DCL (Data Control Language)

Page 26: Oracle Sql PortuguêS

I-27 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Tabelas Usadas no CursoEMPLOYEES

DEPARTMENTS JOB_GRADES

Page 27: Oracle Sql PortuguêS

I-28 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Resumo

� O Oracle9i Server é o banco de dados de computação na Internet.

� O Oracle9i é baseado no ORDBMS.� Os bancos de dados relacionais são compostos por

relações, gerenciados por operações relacionais eregidos por restrições de integridade de dados.

� Com o Oracle Server, você pode armazenar egerenciar informações usando a linguagem SQL e o mecanismo PL/SQL.

Page 28: Oracle Sql PortuguêS

1Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Criando Instruções SELECTSQL Básicas

Page 29: Oracle Sql PortuguêS

1-2 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Objetivos

Após concluir esta lição, você poderá fazer o seguinte:� Listar os recursos das instruções SELECT SQL� Executar uma instrução SELECT básica� Diferenciar instruções SQL de comandos doiSQL*Plus

Page 30: Oracle Sql PortuguêS

1-3 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Recursos das Instruções SELECT SQL

SeleçãoProjeção

Tabela 1 Tabela 2

Tabela 1Tabela 1

Junção

Page 31: Oracle Sql PortuguêS

1-4 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Instrução SELECT Básica

SELECT *|{[DISTINCT] coluna|expressão [apelido],...}FROM tabela;

SELECT *|{[DISTINCT] coluna|expressão [apelido],...}FROM tabela;

� SELECT identifica quais colunas� FROM identifica qual tabela

Page 32: Oracle Sql PortuguêS

1-6 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

SELECT *FROM departments;

Selecionando Todas as Colunas

Page 33: Oracle Sql PortuguêS

1-7 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Selecionando Colunas Específicas

SELECT department_id, location_idFROM departments;

Page 34: Oracle Sql PortuguêS

1-8 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Criando Instruções SQL

� As instruções SQL não fazem distinção entremaiúsculas e minúsculas.

� As instruções SQL podem estar em uma ou maislinhas.

� As palavras-chave não podem ser abreviadas oudividas de uma linha para outra.

� Normalmente, as cláusulas são colocadas em linhasseparadas.

� Os recuos são usados para aperfeiçoar a legibilidade.

Page 35: Oracle Sql PortuguêS

1-9 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Defaults de Cabeçalho de Coluna

� iSQL*Plus:� Justificação de cabeçalho default: centralizada� Exibição de cabeçalho default: maiúsculas

� SQL*Plus:� Os cabeçalhos das colunas de caracteres e datas

são justificados à esquerda� Os cabeçalhos das colunas de números são

justificados à direita� Exibição de cabeçalho default: maiúsculas

Page 36: Oracle Sql PortuguêS

1-10 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Expressões Aritméticas

Crie expressões com dados numéricos e de datas usandooperadores aritméticos.

Operador

+

-

*

/

Descrição

Adicionar

Subtrair

Multiplicar

Dividir

Page 37: Oracle Sql PortuguêS

1-11 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Usando Operadores Aritméticos

SELECT last_name, salary, salary + 300FROM employees;

Page 38: Oracle Sql PortuguêS

1-12 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Precedência de Operadores

� A multiplicação e a divisão têm prioridade sobre aadição e a subtração.

� Os operadores com a mesma prioridade são avaliadosda esquerda para a direita.

� Os parênteses são usados para forçar a avaliaçãopriorizada e para esclarecer as instruções.

*** /// +++ ___

Page 39: Oracle Sql PortuguêS

1-13 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Precedência de Operadores

SELECT last_name, salary, 12*salary+100FROM employees;

Page 40: Oracle Sql PortuguêS

1-14 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Usando Parênteses

SELECT last_name, salary, 12*(salary+100)FROM employees;

Page 41: Oracle Sql PortuguêS

1-15 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Definindo um Valor Nulo

� Nulo é um valor que não está disponível, não éatribuído, é desconhecido ou não é aplicável.

� Um valor nulo não é o mesmo que um zero ou umespaço em branco.

SELECT last_name, job_id, salary, commission_pctFROM employees;

Page 42: Oracle Sql PortuguêS

1-16 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

SELECT last_name, 12*salary*commission_pctFROM employees;

Valores Nulos nas Expressões Aritméticas

As expressões aritméticas que contêm um valor nulo sãoavaliadas como nulas.

Page 43: Oracle Sql PortuguêS

1-17 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Definindo um Apelido de Coluna

Um apelido de coluna:� Renomeia um cabeçalho de coluna� É útil para cálculos� Segue imediatamente o nome da coluna. Também

pode haver a palavra-chave AS opcional entre onome da coluna e o apelido

� Necessita de aspas duplas caso contenha espaçosou caracteres especiais ou faça distinção entremaiúsculas e minúsculas

Page 44: Oracle Sql PortuguêS

1-18 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Usando Apelidos de Coluna

SELECT last_name "Name", salary*12 "Annual Salary"FROM employees;

SELECT last_name AS name, commission_pct commFROM employees;

Page 45: Oracle Sql PortuguêS

1-19 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Operador de Concatenação

Um operador de concatenação:� Concatena colunas ou strings de caracteres a outras

colunas� É representado por duas barras verticais (||)� Cria uma coluna resultante que é uma expressão de

caracteres

Page 46: Oracle Sql PortuguêS

1-20 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Usando o Operador de Concatenação

SELECT last_name||job_id AS "Employees"FROM employees;

Page 47: Oracle Sql PortuguêS

1-21 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Strings de Caracteres Literais

� Um literal é um caractere, um número ou uma dataincluída na lista SELECT.

� Os valores literais de caracteres e datas devem estarentre aspas simples.

� Cada string de caracteres é gerada uma vez para cadalinha retornada.

Page 48: Oracle Sql PortuguêS

1-22 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Usando Strings de Caracteres Literais

SELECT last_name ||' is a '||job_id AS "Employee Details"FROM employees;

Page 49: Oracle Sql PortuguêS

1-23 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Linhas Duplicadas

A exibição default das consultas é de todas as linhas,incluindo linhas duplicadas.

SELECT department_idFROM employees;

SELECT department_idFROM employees;

Page 50: Oracle Sql PortuguêS

1-24 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Eliminando Linhas Duplicadas

Elimine linhas duplicadas usando a palavra-chaveDISTINCT na cláusula SELECT.SELECT DISTINCT department_idFROM employees;

Page 51: Oracle Sql PortuguêS

1-25 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Interação entre SQL e iSQL*Plus

Instruções SQLServidorOracle

Resultados da consultaResultados da consultaiSQL*PlusComandos

Cliente

Relatório formatado

InternetInternetBrowserBrowser

iiSQL*PlusSQL*Plus

Page 52: Oracle Sql PortuguêS

1-26 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Instruções SQL VersusComandos do iSQL*Plus

SQLSQLSQLSQL

SQL� Uma linguagem� Padrão ANSI� A palavra-chave não

pode ser abreviada� As instruções

manipulam definiçõesde dados e tabela nobanco de dados

iiSQL*PlusSQL*Plus� Um ambiente� Patenteado pela Oracle� As palavras-chave podem ser

abreviadas� Os comandos não permitem a

manipulação dos valores no bancode dados

� É executado em um browser� Carregado centralmente, não precisa

ser implementado em cada máquina

iiSQL*PlusSQL*PlusiiSQL*PlusSQL*Plus

Page 53: Oracle Sql PortuguêS

1-27 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Visão Geral do iSQL*Plus

Após efetuar login no iSQL*Plus, você poderá:� Descrever a estrutura de tabela� Editar a instrução SQL� Executar o SQL no iSQL*Plus� Salvar instruções SQL em arquivos e anexá-las a

arquivos� Executar instruções armazenadas em arquivos salvos� Carregar comandos de um arquivo de texto na janela

Edit (Editar) do iSQL*Plus

Page 54: Oracle Sql PortuguêS

1-29 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Efetuando Login no iSQL*Plus

No seu ambiente de browser Windows:

Page 55: Oracle Sql PortuguêS

1-30 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

O Ambiente do iSQL*Plus

3 4 5

6

71

2

8 910

Page 56: Oracle Sql PortuguêS

1-31 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Exibindo a Estrutura de Tabela

Use o comando DESCRIBE do iSQL*Plus para exibira estrutura de uma tabela.

DESC[RIBE] nome_da_tabelaDESC[RIBE] nome_da_tabela

Page 57: Oracle Sql PortuguêS

1-32 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Exibindo a Estrutura de Tabela

DESCRIBE employeesDESCRIBE employees

Page 58: Oracle Sql PortuguêS

1-33 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Interagindo com Arquivos de Script

SELECT last_name, hire_date, salaryFROM employees; 1

2

Page 59: Oracle Sql PortuguêS

1-34 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Interagindo com Arquivos de Script

1

D:\temp\emp_sql.htm

2SELECT last_name, hire_date, salaryFROM employees;

3

Page 60: Oracle Sql PortuguêS

1-35 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Interagindo com Arquivos de Script

DESCRIBE employeesSELECT first_name, last_name, job_idFROM employees;

1

23

Page 61: Oracle Sql PortuguêS

1-36 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Resumo

SELECT *|{[DISTINCT] coluna|expressão [apelido],...}FROM tabela;

SELECT *|{[DISTINCT] coluna|expressão [apelido],...}FROM tabela;

Nesta lição, você aprendeu a:� Criar uma instrução SELECT que:

� Retorne todas as linhas e colunas de uma tabela� Retorne colunas especificadas de uma tabela� Use apelidos de coluna para fornecer cabeçalhos

de coluna descritivos� Use o ambiente do iSQL*Plus para criar, salvar e

executar instruções SQL e comandos do iSQL*Plus.

Page 62: Oracle Sql PortuguêS

1-37 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Visão Geral do Exercício 1

Este exercício abrange os seguintes tópicos:� Selecionando todos os dados a partir de tabelas

diferentes� Descrevendo a estrutura de tabelas� Executando cálculos aritméticos e especificando

nomes de colunas� Usando o iSQL*Plus

Page 63: Oracle Sql PortuguêS

2Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Restringindo e Classificando Dados

Page 64: Oracle Sql PortuguêS

2-2 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Objetivos

Após concluir esta lição, você poderá fazer o seguinte:� Limitar as linhas recuperadas por uma consulta� Classificar as linhas recuperadas por uma consulta

Page 65: Oracle Sql PortuguêS

2-3 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Limitando Linhas Usando uma Seleção

"recuperar todosos funcionáriosdo departamento 90"

EMPLOYEES

Page 66: Oracle Sql PortuguêS

2-4 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Limitando as Linhas Selecionadas

� Restrinja as linhas retornadas usando a cláusula WHERE.

� A cláusula WHERE segue a cláusula FROM.

SELECT *|{[DISTINCT] coluna|expressão [apelido],...}FROM tabela[WHERE condição(ões)];

Page 67: Oracle Sql PortuguêS

2-5 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Usando a Cláusula WHERE

SELECT employee_id, last_name, job_id, department_idFROM employeesWHERE department_id = 90;

Page 68: Oracle Sql PortuguêS

2-6 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Strings de Caracteres e Datas

� As strings de caracteres e valores de data aparecementre aspas simples.

� Os valores de caractere fazem distinção entremaiúsculas e minúsculas e os valores de data fazemdistinção entre formatos.

� O formato de data default é DD-MON-RR.SELECT last_name, job_id, department_idFROM employeesWHERE last_name = 'Whalen';

Page 69: Oracle Sql PortuguêS

2-7 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Condições de Comparação

Operador

=

>

>=

<

<=

<>

Significado

Igual a

Maior que

Maior que ou igual a

Menor que

Menor que ou igual a

Diferente de

Page 70: Oracle Sql PortuguêS

2-8 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

SELECT last_name, salary FROM employeesWHERE salary <= 3000;

Usando Condições de Comparação

Page 71: Oracle Sql PortuguêS

2-9 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Outras Condições de Comparação

Operador

BETWEEN

...AND...

IN(set)

LIKE

IS NULL

Significado

Entre dois valores (inclusive),

Corresponde qualquer valor de uma lista

Corresponde um padrão de caractere

É um valor nulo

Page 72: Oracle Sql PortuguêS

2-10 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Usando a Condição BETWEEN

Use a condição BETWEEN para exibir linhas baseadasem uma faixa de valores.SELECT last_name, salary FROM employeesWHERE salary BETWEEN 2500 AND 3500;

Limite inferior Limite superior

Page 73: Oracle Sql PortuguêS

2-11 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

SELECT employee_id, last_name, salary, manager_idFROM employeesWHERE manager_id IN (100, 101, 201);

Usando a Condição IN

Use a condição de associação IN para testar valoresem uma lista.

Page 74: Oracle Sql PortuguêS

2-12 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Usando a Condição LIKE

� Use a condição LIKE para executar pesquisascuringas de valores válidos de string de pesquisa.

� As condições de pesquisa podem conter caracteresliterais ou números:– % denota zero ou muitos caracteres.– _ denota um caractere.

SELECT first_nameFROM employeesWHERE first_name LIKE 'S%';

Page 75: Oracle Sql PortuguêS

2-13 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

� Você pode combinar caracteres de correspondênciade padrão.

� É possível usar o identificador ESCAPE para procurarpelos símbolos % e _.

Usando a Condição LIKE

SELECT last_nameFROM employeesWHERE last_name LIKE '_o%';

Page 76: Oracle Sql PortuguêS

2-14 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Usando as Condições NULL

Teste para valores nulos com o operador IS NULL.

SELECT last_name, manager_idFROM employeesWHERE manager_id IS NULL;

Page 77: Oracle Sql PortuguêS

2-15 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Condições Lógicas

Operador

AND

OR

NOT

Significado

Retorna TRUE se ambas as condiçõesde componentes forem verdadeiras

Retorna TRUE se uma das condiçõesde componente for verdadeira

Retorna TRUE se a condição seguintefor falsa

Page 78: Oracle Sql PortuguêS

2-16 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Usando o Operador AND

AND exige que ambas as condições sejam verdadeiras.

SELECT employee_id, last_name, job_id, salaryFROM employeesWHERE salary >= 10000AND job_id LIKE '%MAN%';

Page 79: Oracle Sql PortuguêS

2-17 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Usando o Operador OR

OR exige que uma das condições seja verdadeira.OR exige que uma das condições seja verdadeira.SELECT employee_id, last_name, job_id, salaryFROM employeesWHERE salary >= 10000OR job_id LIKE '%MAN%';

Page 80: Oracle Sql PortuguêS

2-18 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

SELECT last_name, job_idFROM employeesWHERE job_id NOT IN ('IT_PROG', 'ST_CLERK', 'SA_REP');

Usando o Operador NOT

Page 81: Oracle Sql PortuguêS

2-19 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Regras de Precedência

Sobreponha regras de precedência usando parênteses.

Ordem de Avaliação Operador 1 Operadores aritméticos

2 Operador de concatenação3 Condições de comparação4 IS [NOT] NULL, LIKE, [NOT] IN5 [NOT] BETWEEN

6 Condição lógica NOT7 Condição lógica AND8 Condição lógica OR

Page 82: Oracle Sql PortuguêS

2-20 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

SELECT last_name, job_id, salaryFROM employeesWHERE job_id = 'SA_REP'OR job_id = 'AD_PRES'AND salary > 15000;

Regras de Precedência

Page 83: Oracle Sql PortuguêS

2-21 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

SELECT last_name, job_id, salaryFROM employeesWHERE (job_id = 'SA_REP'OR job_id = 'AD_PRES')AND salary > 15000;

Regras de Precedência

Use parênteses para forçar a prioridade.Use parênteses para forçar a prioridade.

Page 84: Oracle Sql PortuguêS

2-22 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

SELECT last_name, job_id, department_id, hire_dateFROM employeesORDER BY hire_date;

Cláusula ORDER BY

� Classifique linhas com a cláusula ORDER BY� ASC: ordem crescente, default� DESC: ordem decrescente

� A cláusula ORDER BY aparece por último nainstrução SELECT.

Page 85: Oracle Sql PortuguêS

2-23 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Classificando em Ordem Decrescente

SELECT last_name, job_id, department_id, hire_dateFROM employeesORDER BY hire_date DESC ;

Page 86: Oracle Sql PortuguêS

2-24 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Classificando por Apelido de Coluna

SELECT employee_id, last_name, salary*12 annsalFROM employeesORDER BY annsal;

Page 87: Oracle Sql PortuguêS

2-25 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

� A ordem da lista ORDER BY é a ordem declassificação.

� Você pode classificar por uma coluna que não estejana lista SELECT.

SELECT last_name, department_id, salaryFROM employeesORDER BY department_id, salary DESC;

Classificando por Várias Colunas

Page 88: Oracle Sql PortuguêS

2-26 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Resumo

SELECT *|[DISTINCT] coluna|expressão [apelido],...}FROM tabela[WHERE condição(ões)][ORDER BY coluna, expr, apelido [ASC|DESC]];

Nesta lição, você aprendeu a:� Usar a cláusula WHERE para restringir linhas de saída

� Usar as condições de comparação� Usar as condições BETWEEN, IN, LIKE e NULL� Aplicar os operadores lógicos AND, OR e NOT

� Usar a cláusula ORDER BY para classificar linhasde saída

Page 89: Oracle Sql PortuguêS

2-27 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Visão Geral do Exercício 2

Este exercício abrange os seguintes tópicos:� Selecionando dados e alterando a ordem das

linhas exibidas� Restringindo linhas usando a cláusula WHERE� Classificando linhas usando a cláusula ORDER BY

Page 90: Oracle Sql PortuguêS

3Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Funções de uma Única Linha

Page 91: Oracle Sql PortuguêS

3-2 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Objetivos

Após concluir esta lição, você poderá fazer o seguinte:� Descrever vários tipos de funções disponíveis

em SQL� Usar funções de data, número e caractere em

instruções SELECT� Descrever o uso das funções de conversão

Page 92: Oracle Sql PortuguêS

3-3 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Funções SQL

FunFunççãoão

A função executaa ação

Entrada

argarg 11

argarg 22

argarg nn

Saída

ValorValorresultanteresultante

Page 93: Oracle Sql PortuguêS

3-4 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Dois Tipos de Funções SQL

FunFunççõesões

FunFunççõesões dedeuma uma única linhaúnica linha

FunFunççõesões dedevvárias linhasárias linhas

Page 94: Oracle Sql PortuguêS

3-5 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Funções de uma Única Linha

Funções de uma única linha:� Manipulam itens de dados� Aceitam argumentos e retornam um valor� Agem em cada linha retornada� Retornam um resultado por linha� Podem modificar o tipo de dados� Podem ser aninhadas� Aceitam argumentos que podem ser uma coluna

ou uma expressãonome_função [(arg1, arg2,...)]nome_função [(arg1, arg2,...)]

Page 95: Oracle Sql PortuguêS

3-6 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Funções de uma Única Linha

ConversConversãoão

CaractereCaractere

NumNuméricaséricas

DataData

GeraisGeraisFunFunççõesões dede

uma uma única linhaúnica linha

Page 96: Oracle Sql PortuguêS

3-7 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Funções de Caractere

FunFunççõesões dedecaracterecaractere

LOWER

UPPER

INITCAP

CONCAT

SUBSTR

LENGTH

INSTR

LPAD | RPAD

TRIM

REPLACE

FunFunççõesões de de manipulamanipulaççãoão dedemaimaiúscúsc./min./minúscúsc..

FunFunççõesões de de manipulamanipulaççãoão dede

caracterescaracteres

Page 97: Oracle Sql PortuguêS

3-9 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Função Resultado

Funções de Manipulação deMaiúsculas e Minúsculas

Essas funções convertem letras maiúsculas em minúsculas e vice-versa nas strings de caracteres.

LOWER('SQL Course')

UPPER('SQL Course')

INITCAP('SQL Course')

sql course

SQL COURSE

Sql Course

Page 98: Oracle Sql PortuguêS

3-10 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Usando Funções de Manipulaçãode Maiúsculas e Minúsculas

Exibir o número, o nome e o número do departamentodo funcionário Higgins:

SELECT employee_id, last_name, department_idFROM employeesWHERE last_name = 'higgins';no rows selected

SELECT employee_id, last_name, department_idFROM employeesWHERE last_name = 'higgins';no rows selectedno rows selected

SELECT employee_id, last_name, department_idFROM employeesWHERE LOWER(last_name) = 'higgins';

Page 99: Oracle Sql PortuguêS

3-11 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

CONCAT('Hello', 'World')

SUBSTR('HelloWorld',1,5)

LENGTH('HelloWorld')

INSTR('HelloWorld', 'W')

LPAD(salary,10,'*')

RPAD(salary, 10, '*')

TRIM('H' FROM 'HelloWorld')

HelloWorld

Hello

10

6

*****24000

24000*****

elloWorld

Função Resultado

Funções de Manipulação de Caracteres

Estas funções manipulam strings de caracteres:

Page 100: Oracle Sql PortuguêS

3-12 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

SELECT employee_id, CONCAT(first_name, last_name) NAME,

job_id, LENGTH (last_name),

INSTR(last_name, 'a') "Contains 'a'?"

FROM employees

WHERE SUBSTR(job_id, 4) = 'REP';

Usando as Funções deManipulação de Caracteres

1

31 2

32

Page 101: Oracle Sql PortuguêS

3-13 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Funções Numéricas

� ROUND: arredonda o valor para o decimal especificadoROUND(45.926, 2) 45.93

� TRUNC: trunca o valor para o decimal especificadoTRUNC(45.926, 2) 45.92

� MOD: retorna o resto da divisãoMOD(1600, 300) 100

Page 102: Oracle Sql PortuguêS

3-14 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

SELECT ROUND(45.923,2), ROUND(45.923,0),ROUND(45.923,-1)

FROM DUAL;

Usando a Função ROUND

DUAL é uma tabela fictícia usada para exibir resultadosde funções e cálculos.

1 2

3

31 2

Page 103: Oracle Sql PortuguêS

3-15 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

SELECT TRUNC(45.923,2), TRUNC(45.923),TRUNC(45.923,-2)

FROM DUAL;

Usando a Função TRUNC

31 2

1 2

3

Page 104: Oracle Sql PortuguêS

3-16 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

SELECT last_name, salary, MOD(salary, 5000)FROM employeesWHERE job_id = 'SA_REP';

Usando a Função MOD

Calcule o que resta de um salário após dividi-lo por5.000 para todos os funcionários cujo cargo seja representante de vendas.

Page 105: Oracle Sql PortuguêS

3-17 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Trabalhando com Datas

� O banco de dados Oracle armazena datas em umformato de número interno: século, ano, mês, dia,horas, minutos, segundos.

� O formato de exibição de data default é DD-MON-RR.� Permite que você armazene datas do século 21 no

século 20 especificando apenas os dois últimosdígitos do ano.

� Permite que você armazene datas do século 20 no século 21 da mesma maneira.

SELECT last_name, hire_dateFROM employeesWHERE last_name like ''G%';';

Page 106: Oracle Sql PortuguêS

3-18 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Trabalhando com Datas

SYSDATE é uma função que retorna:� Data� Hora

Page 107: Oracle Sql PortuguêS

3-19 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Aritmética com Datas

� Adicionar ou subtrair um número de, ou para, umadata para um valor de data resultante.

� Subtrair duas datas para localizar o número de dias entre estas datas.

� Adicionar horas para uma data dividindo o númerode horas por 24.

Page 108: Oracle Sql PortuguêS

3-20 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Usando OperadoresAritméticos com Datas

SELECT last_name, (SYSDATE-hire_date)/7 AS WEEKSFROM employeesWHERE department_id = 90;

Page 109: Oracle Sql PortuguêS

3-21 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Funções de Data

Número de mesesentre duas datasMONTHS_BETWEEN

ADD_MONTHS

NEXT_DAY

LAST_DAY

ROUND

TRUNC

Adiciona meses docalendário à dataDia seguinte à dataespecificada

Último dia do mês

Arredonda a data

Trunca a data

Função Descrição

Page 110: Oracle Sql PortuguêS

3-22 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

� MONTHS_BETWEEN ('01-SEP-95','11-JAN-94')

Usando Funções de Data

� ADD_MONTHS ('11-JAN-94',6)

� NEXT_DAY ('01-SEP-95','FRIDAY')

� LAST_DAY('01-SEP-95')

19.6774194

'11-JUL-94'

'08-SEP-95'

'28-FEB-95'

Page 111: Oracle Sql PortuguêS

3-23 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

� ROUND(SYSDATE,'MONTH') 01-AUG-95

� ROUND(SYSDATE ,'YEAR') 01-JAN-96

� TRUNC(SYSDATE ,'MONTH') 01-JUL-95

� TRUNC(SYSDATE ,'YEAR') 01-JAN-95

Usando Funções de Data

Suponha que SYSDATE = '25-JUL-95':

Page 112: Oracle Sql PortuguêS

3-24 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Exercício 3, Parte Um: Visão Geral

Este exercício abrange os seguintes tópicos:� Criando uma consulta que exibe a data atual � Criando consultas que exigem o uso de funções

numéricas, de caractere e de data� Executando cálculos de anos e meses de serviço de

um funcionário

Page 113: Oracle Sql PortuguêS

3-25 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Funções de Conversão

ConversConversãoão dede tipotipo dededadosdados implimplícitaícita

ConversConversãoão dede tipotipo dededadosdados explexplícitaícita

ConversConversãoão dedetipotipo de dadosde dados

Page 114: Oracle Sql PortuguêS

3-26 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Conversão de Tipo de Dados Implícita

Nas designações, o servidor Oracle pode converter automaticamente o seguinte:

VARCHAR2 ou CHAR

De Em

VARCHAR2 ou CHAR

NUMBER

DATE

NUMBER

DATE

VARCHAR2

VARCHAR2

Page 115: Oracle Sql PortuguêS

3-27 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Conversão de Tipo de Dados Implícita

Na avaliação de expressões, o Oracle Server podeconverter automaticamente o seguinte:

VARCHAR2 ou CHAR

De Em

VARCHAR2 ou CHAR

NUMBER

DATE

Page 116: Oracle Sql PortuguêS

3-28 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Conversão de Tipo de Dados Explícita

NUMBER CHARACTER

TO_CHAR

TO_NUMBER

DATE

TO_CHAR

TO_DATE

Page 117: Oracle Sql PortuguêS

3-29 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Conversão de Tipo de Dados Explícita

NUMBER CHARACTER

TO_CHAR

TO_NUMBER

DATE

TO_CHAR

TO_DATE

Page 118: Oracle Sql PortuguêS

3-31 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Usando a Função TO_CHAR com Datas

O modelo de formato:� Deve ser delimitado por aspas simples e fazer

distinção entre maiúsculas e minúsculas� Pode incluir qualquer elemento de formato de

data válido� Tem um elemento fm para remover espaços de

preenchimento ou suprimir zeros à esquerda� É separado do valor de data por uma vírgula

TO_CHAR(data, 'modelo_formato')TO_CHAR(data, 'modelo_formato')

Page 119: Oracle Sql PortuguêS

3-32 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

YYYY

Elementos do Modelo de Formato de Data

YEAR

MM

MONTH

DY

DAY

Ano completo em números

Ano por extenso

Valor de dois dígitos para o mês

Abreviação de três letras do dia da semana

Nome completo do dia da semana

Nome completo do mês

MON Abreviação de três letras do mês

DD Dia do mês numérico

Page 120: Oracle Sql PortuguêS

3-34 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Elementos do Modelo de Formato de Data

� Os elementos de hora formatam a parte de hora da data.

� Adicionar strings de caracteres colocando-as entres aspas.

� Os sufixos de número escrevem os números por extenso.

HH24:MI:SS AM 15:45:32 PM

DD "of" MONTH 12 of OCTOBER

ddspth fourteenth

Page 121: Oracle Sql PortuguêS

3-36 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Usando a Função TO_CHAR com Datas

SELECT last_name,TO_CHAR(hire_date, 'fmDD Month YYYY')AS HIREDATE

FROM employees;

Page 122: Oracle Sql PortuguêS

3-37 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Usando a Função TO_CHAR com Números

Estes são alguns dos elementos de formato que podem ser usados com a função TO_CHAR para exibirum valor numérico como um caractere:

TO_CHAR(número, 'modelo_formato')TO_CHAR(número, 'modelo_formato')

90$L.,

Representa um númeroForça a exibição de um zeroColoca um símbolo de dólar flutuanteUsa o símbolo da moeda local flutuanteImprime uma vírgula decimalImprime um indicador de milhar

Page 123: Oracle Sql PortuguêS

3-39 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

SELECT TO_CHAR(salary, '$99,999.00') SALARYFROM employeesWHERE last_name = 'Ernst';

Usando a Função TO_CHAR com Números

Page 124: Oracle Sql PortuguêS

3-40 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Usando as Funções TO_NUMBER e TO_DATE

� Converter uma string de caracteres em um formatode número usando a função TO_NUMBER:

� Converter uma string de caracteres em um formatode data usando a função TO_DATE:

� Essas funções têm um modificador fx. Esse modificador especifica a correspondência exata para o argumento de caractere e o modelo de formato de data de uma função TO_DATE

TO_NUMBER(caract[, 'modelo_formato'])TO_NUMBER(caract[, 'modelo_formato'])

TO_DATE(caract[, 'modelo_formato'])TO_DATE(caract[, 'modelo_formato'])

Page 125: Oracle Sql PortuguêS

3-41 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Usando as Funções TO_NUMBER e TO_DATE

� Converter uma string de caracteres em um formatode número usando a função TO_NUMBER:

� Converter uma string de caracteres em um formatode data usando a função TO_DATE:

� Essas funções têm um modificador fx. Esse modificador especifica a correspondência exata para o argumento de caractere e o modelo de formato de data de uma função TO_DATE

TO_NUMBER(caract[, 'modelo_formato'])TO_NUMBER(caract[, 'modelo_formato'])

TO_DATE(caract[, 'modelo_formato'])TO_DATE(caract[, 'modelo_formato'])

Page 126: Oracle Sql PortuguêS

3-42 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Formato de Data RR

Ano Atual1995199520012001

Data Especificada27-OCT-9527-OCT-1727-OCT-1727-OCT-95

Formato RR1995201720171995

Formato YY1995191720172095

Se os doisdígitos do ano atual forem:

0�49

0�49 50�99

50�99

A data retornada estará no século atualA data retornada estará no século seguinte

A data retornada estará no séculoanteriorA data retornada estará no século atual

Se o ano de dois dígitos especificado for:

Page 127: Oracle Sql PortuguêS

3-43 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Exemplo de Formato de Data RR

Para determinar os funcionários admitidos antes de 1990, use oformato RR, que produz os mesmos resultados independentemente de o comando serexecutado em 1999 ou agora:

SELECT last_name, TO_CHAR(hire_date, 'DD-Mon-YYYY')FROM employeesWHERE hire_date < TO_DATE('01-Jan-90', 'DD-Mon-RR');

Page 128: Oracle Sql PortuguêS

3-44 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Aninhando Funções

� As funções de uma única linha podem seraninhadas em qualquer nível.

� As funções aninhadas são avaliadas do nível mais interno para o mais externo.

F3(F2(F1(col,arg1),arg2),arg3)

Etapa 1 = Resultado 1

Etapa 2 = Resultado 2

Etapa 3 = Resultado 3

Page 129: Oracle Sql PortuguêS

3-45 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

SELECT last_name,NVL(TO_CHAR(manager_id), 'No Manager')

FROM employeesWHERE manager_id IS NULL;

Aninhando Funções

Page 130: Oracle Sql PortuguêS

3-46 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Funções gerais

Essas funções operam com qualquer tipo de dados epertencem ao uso de valores nulos.� NVL (expr1, expr2)

� NVL2 (expr1, expr2, expr3)

� NULLIF (expr1, expr2)

� COALESCE (expr1, expr2, ..., exprn)

Page 131: Oracle Sql PortuguêS

3-47 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Função NVL

Converte um valor nulo em um valor real.� É possível usar os tipos de dados de data, de

caractere e de número.� Os tipos de dados devem corresponder a:

– NVL(commission_pct,0)

– NVL(hire_date,'01-JAN-97')

– NVL(job_id,'No Job Yet')

Page 132: Oracle Sql PortuguêS

3-48 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

SELECT last_name, salary, NVL(commission_pct, 0),(salary*12) + (salary*12*NVL(commission_pct, 0)) AN_SAL

FROM employees;

Usando a Função NVL

1 2

12

Page 133: Oracle Sql PortuguêS

3-49 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

SELECT last_name, salary, commission_pct,NVL2(commission_pct,

'SAL+COMM', 'SAL') incomeFROM employees WHERE department_id IN (50, 80);

Usando a Função NVL2

1 2

12

Page 134: Oracle Sql PortuguêS

3-50 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

SELECT first_name, LENGTH(first_name) "expr1", last_name, LENGTH(last_name) "expr2",NULLIF(LENGTH(first_name), LENGTH(last_name)) result

FROM employees;

Usando a Função NULLIF

1

23

1 2 3

Page 135: Oracle Sql PortuguêS

3-51 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Usando a Função COALESCE

� A vantagem da função COALESCE em relação à função NVL é que ela pode apresentar diversos valores alternativos.

� Se a primeira expressão não for nula, a função retornará essa expressão; caso contrário, a função unirá as expressões restantes.

Page 136: Oracle Sql PortuguêS

3-52 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

SELECT last_name,COALESCE(commission_pct, salary, 10) comm

FROM employeesORDER BY commission_pct;

Usando a Função COALESCE

Page 137: Oracle Sql PortuguêS

3-53 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Expressões Condicionais

� Propiciam o uso da lógica IF-THEN-ELSE em uma instrução SQL

� Use dois métodos:� Expressão CASE� Função DECODE

Page 138: Oracle Sql PortuguêS

3-54 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

A Expressão CASE

Facilita as pesquisas condicionais funcionando como uma instrução IF-THEN-ELSE:

CASE expr WHEN comparação_expr1 THEN retorna_expr1[WHEN comparação_expr2 THEN retorna_expr2WHEN comparação_exprn THEN retorna_exprnELSE else_expr]

END

CASE expr WHEN comparação_expr1 THEN retorna_expr1[WHEN comparação_expr2 THEN retorna_expr2WHEN comparação_exprn THEN retorna_exprnELSE else_expr]

END

Page 139: Oracle Sql PortuguêS

3-55 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

SELECT last_name, job_id, salary,CASE job_id WHEN 'IT_PROG' THEN 1.10*salary

WHEN 'ST_CLERK' THEN 1.15*salaryWHEN 'SA_REP' THEN 1.20*salary

ELSE salary END "REVISED_SALARY"FROM employees;

Usando a Expressão CASE

Facilita as pesquisas condicionais funcionando como uma instrução IF-THEN-ELSE:

Page 140: Oracle Sql PortuguêS

3-56 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

A Função DECODE

Facilita as pesquisas condicionais funcionando como uma instrução CASE ou IF-THEN-ELSE

DECODE(col|expressão, pesquisa1, resultado1 [, pesquisa2, resultado2,...,][, default])

DECODE(col|expressão, pesquisa1, resultado1 [, pesquisa2, resultado2,...,][, default])

Page 141: Oracle Sql PortuguêS

3-57 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Usando a Função DECODE

SELECT last_name, job_id, salary,DECODE(job_id, 'IT_PROG', 1.10*salary,

'ST_CLERK', 1.15*salary,'SA_REP', 1.20*salary,

salary)REVISED_SALARY

FROM employees;

Page 142: Oracle Sql PortuguêS

3-58 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Usando a Função DECODE

SELECT last_name, salary,DECODE (TRUNC(salary/2000, 0),

0, 0.00,1, 0.09,2, 0.20,3, 0.30,4, 0.40,5, 0.42,6, 0.44,

0.45) TAX_RATEFROM employeesWHERE department_id = 80;

Exibir a alíquota de imposto aplicável para cada funcionário do departamento 80.

Page 143: Oracle Sql PortuguêS

3-59 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Resumo

Nesta lição, você aprendeu a:� Executar cálculos nos dados usando funções� Modificar itens de dados individuais usando funções� Manipular a saída para grupos de linhas usando

funções� Alterar formatos de data para exibição usando funções� Converter tipos de dados de coluna usando funções� Usar funções NVL� Usar a lógica IF-THEN-ELSE

Page 144: Oracle Sql PortuguêS

3-60 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Exercício 3, Parte Dois: Visão Geral

Este exercício abrange os seguintes tópicos:� Criando consultas que exigem o uso de funções

numéricas, de caractere e de data� Usando a concatenação com funções� Criando consultas que diferenciam entre letras

maiúsculas e minúsculas para testar a utilidade das funções de caractere

� Executando cálculos de anos e meses de serviço de um funcionário

� Determinando a data de revisão para um funcionário

Page 145: Oracle Sql PortuguêS

4Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Exibindo Dados de Várias Tabelas

Page 146: Oracle Sql PortuguêS

4-2 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Objetivos

Após concluir esta lição, você poderá fazer o seguinte:� Criar instruções SELECT para obter acesso a dados

de mais de uma tabela usando eqüijunções e não-eqüijunções

� Exibir dados que, em geral, não correspondem auma condição de junção usando junções externas

� Unir uma tabela a ela mesma por meio de umaautojunção

Page 147: Oracle Sql PortuguêS

4-3 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Obtendo Dados de Várias Tabelas

EMPLOYEES DEPARTMENTS

Page 148: Oracle Sql PortuguêS

4-4 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Produtos Cartesianos

� Um produto cartesiano será formado quando:� Uma condição de junção for omitida.� Uma condição de junção for inválida.� Todas as linhas da primeira tabela forem unidas a

todas as linhas da segunda tabela.� Para evitar um produto Cartesiano, sempre inclua uma

condição de junção válida em uma cláusula WHERE.

Page 149: Oracle Sql PortuguêS

4-5 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Gerando um Produto Cartesiano

Produtocartesiano:

20x8=160 linhas

EMPLOYEES (20 linhas) DEPARTMENTS (8 linhas)

Page 150: Oracle Sql PortuguêS

4-6 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

� Eqüijunção� Não-eqüijunção� Junção externa� Autojunção

Tipos de Junções

� Junções híbridas� Junções naturais� Cláusula Using� Junções externas de

dois lados ou completas� Condições de junção

arbitrárias para junçõesexternas

Junções Compatíveis como SQL: 1999:Junções Compatíveis como SQL: 1999:

Junções Patenteadas pelaOracle (8i e anterior):Junções Patenteadas pelaOracle (8i e anterior):

Page 151: Oracle Sql PortuguêS

4-7 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Unindo Tabelas Usando a Sintaxe Oracle

Usar uma junção para consultar dados de uma ou maistabelas.

� Crie uma condição de junção na cláusula WHERE.� Coloque o nome da tabela antes do nome da coluna

quando aparecer o mesmo nome de coluna em maisde uma tabela.

SELECT tabela1.coluna, tabela2.colunaFROM tabela1, tabela2WHERE tabela1.coluna1 = tabela2.coluna2;

SELECT tabela1.coluna, tabela2.colunaFROM tabela1, tabela2WHERE tabela1.coluna1 = tabela2.coluna2;

Page 152: Oracle Sql PortuguêS

4-9 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

O Que é uma Eqüijunção?EMPLOYEES DEPARTMENTS

Chave estrangeira

Chave primária

� �

Page 153: Oracle Sql PortuguêS

4-10 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

SELECT employees.employee_id, employees.last_name, employees.department_id, departments.department_id, departments.location_idFROM employees, departmentsWHERE employees.department_id = departments.department_id;

Recuperando Registros com Eqüijunções

Page 154: Oracle Sql PortuguêS

4-11 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Condições de Pesquisa AdicionaisUsando o Operador AND

EMPLOYEES DEPARTMENTS

� �

Page 155: Oracle Sql PortuguêS

4-12 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Qualificando Nomes de Colunas Ambíguos

� Use prefixos de tabela para qualificar nomes decolunas que estão em várias tabelas.

� Melhore o desempenho usando prefixos de tabela.� Diferencie colunas que possuem nomes idênticos,

mas que residam em tabelas diferentes usandoapelidos de coluna.

Page 156: Oracle Sql PortuguêS

4-13 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

SELECT e.employee_id, e.last_name, e.department_id,

d.department_id, d.location_id

FROM employees e, departments d

WHERE e.department_id = d.department_id;

Usando Apelidos de Tabela

� Simplifique consultas usando apelidos de tabela.� Melhore o desempenho usando prefixos de tabela.

Page 157: Oracle Sql PortuguêS

4-14 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Unindo Mais de Duas TabelasEMPLOYEES LOCATIONSDEPARTMENTS

� Para unir n tabelas, é necessário um mínimo de n-1condições de junção. Por exemplo, para unir trêstabelas, é necessário um mínimo de duas junções.

Page 158: Oracle Sql PortuguêS

4-15 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Não-eqüijunções

EMPLOYEES JOB_GRADES

Os salários na tabelaEMPLOYEES devem estarentre o menor e o maiorsalário da tabelaJOB_GRADES

Page 159: Oracle Sql PortuguêS

4-16 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Recuperando Registros com Não-eqüijunções

SELECT e.last_name, e.salary, j.grade_levelFROM employees e, job_grades jWHERE e.salary BETWEEN j.lowest_sal AND j.highest_sal;

Page 160: Oracle Sql PortuguêS

4-17 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Junções Externas

EMPLOYEESDEPARTMENTS

Não há funcionários nodepartamento 190.

Page 161: Oracle Sql PortuguêS

4-18 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Sintaxe de Junções Externas

� Usar uma junção externa para ver também todas aslinhas que não atendem à condição de junção.

� O operador de junção externa é o sinal de mais (+).

SELECT tabela1.coluna, tabela2.coluna

FROM tabela1, tabela2

WHERE tabela1.coluna(+) = tabela2.coluna;

SELECT tabela1.coluna, tabela2.coluna

FROM tabela1, tabela2

WHERE tabela1.coluna(+) = tabela2.coluna;

SELECT tabela1.coluna, tabela2.coluna

FROM tabela1, tabela2

WHERE tabela1.coluna = tabela2.coluna(+);

SELECT tabela1.coluna, tabela2.coluna

FROM tabela1, tabela2

WHERE tabela1.coluna = tabela2.coluna(+);

Page 162: Oracle Sql PortuguêS

4-19 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

SELECT e.last_name, e.department_id, d.department_name

FROM employees e, departments d

WHERE e.department_id(+) = d.department_id ;

Usando Junções Externas

Page 163: Oracle Sql PortuguêS

4-20 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Autojunções

EMPLOYEES (WORKER) EMPLOYEES (MANAGER)

MANAGER_ID na tabela WORKER é iguala EMPLOYEE_ID na tabela MANAGER.

� �

Page 164: Oracle Sql PortuguêS

4-21 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Unindo uma Tabela a ela Mesma

SELECT worker.last_name || ' works for '

|| manager.last_name

FROM employees worker, employees manager

WHERE worker.manager_id = manager.employee_id ;

Page 165: Oracle Sql PortuguêS

4-22 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Exercício 4, Parte Um: Visão Geral

Este exercício aborda a criação de consultas para unirtabelas usando a sintaxe Oracle.

Page 166: Oracle Sql PortuguêS

4-23 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Unindo Tabelas Usando a Sintaxe SQL: 1999

Usar uma junção para consultar dados de uma ou maistabelas.

SELECT tabela1.coluna, tabela2.colunaFROM tabela1[CROSS JOIN tabela2] |[NATURAL JOIN tabela2] |[JOIN tabela2 USING (nome_coluna)] |[JOIN tabela2 ON(tabela1.nome_coluna = tabela2.nome_coluna)] |[LEFT|RIGHT|FULL OUTER JOIN tabela2 ON (tabela1.nome_coluna = tabela2.nome_coluna)];

SELECT tabela1.coluna, tabela2.colunaFROM tabela1[CROSS JOIN tabela2] |[NATURAL JOIN tabela2] |[JOIN tabela2 USING (nome_coluna)] |[JOIN tabela2 ON(tabela1.nome_coluna = tabela2.nome_coluna)] |[LEFT|RIGHT|FULL OUTER JOIN tabela2 ON (tabela1.nome_coluna = tabela2.nome_coluna)];

Page 167: Oracle Sql PortuguêS

4-24 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Criando Junções Híbridas

� A cláusula CROSS JOIN cria o produto híbrido deduas tabelas.

� Esse processo equivale ao produto cartesianoentre as duas tabelas.

SELECT last_name, department_name FROM employeesCROSS JOIN departments ;

Page 168: Oracle Sql PortuguêS

4-25 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Criando Junções Naturais

� A cláusula NATURAL JOIN baseia-se em todas ascolunas com o mesmo nome nas duas tabelas.

� Ela seleciona linhas das duas tabelas que têm valoresiguais em todas as colunas correspondentes.

� Se as colunas com os mesmos nomes tiverem tiposde dados diferentes, será retornado um erro.

Page 169: Oracle Sql PortuguêS

4-26 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

SELECT department_id, department_name, location_id, cityFROM departments NATURAL JOIN locations ;

Recuperando Registros comJunções Naturais

Page 170: Oracle Sql PortuguêS

4-27 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Criando Junções com a Cláusula USING

� Se várias colunas tiverem os mesmos nomes masse os tipos de dados não forem correspondentes, acláusula NATURAL JOIN poderá ser modificada com acláusula USING para especificar as colunas que devemser usadas em uma eqüijunção.

� Usar a cláusula USING para estabelecer acorrespondência com apenas uma coluna quandomais de uma coluna for correspondente.

� Não usar um apelido ou nome de tabela nas colunasàs quais foram feitas referências.

� As cláusulas NATURAL JOIN e USING são mutuamenteexcludentes.

Page 171: Oracle Sql PortuguêS

4-28 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

SELECT e.employee_id, e.last_name, d.location_idFROM employees e JOIN departments dUSING (department_id) ;

Recuperando Registros coma Cláusula USING

Page 172: Oracle Sql PortuguêS

4-29 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Criando Junções com a Cláusula ON

� A condição da junção natural é basicamente umaeqüijunção de todas as colunas com o mesmo nome.

� Para especificar condições arbitrárias ou colunas aserem unidas, é usada a cláusula ON.

� A condição de junção é separada de outras condiçõesde pesquisa.

� A cláusula ON facilita a compreensão do código.

Page 173: Oracle Sql PortuguêS

4-30 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

SELECT e.employee_id, e.last_name, e.department_id, d.department_id, d.location_idFROM employees e JOIN departments dON (e.department_id = d.department_id) ;

Recuperando Registros coma Cláusula ON

Page 174: Oracle Sql PortuguêS

4-31 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Criando Junções Triplas coma Cláusula ON

SELECT employee_id, city, department_name FROM employees e JOIN departments dON d.department_id = e.department_id JOIN locations lON d.location_id = l.location_id;

Page 175: Oracle Sql PortuguêS

4-32 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Junções INNER Versus OUTER

� Na sintaxe SQL: 1999, a junção de duas tabelas queretorna apenas linhas correspondentes é uma junçãointerna.

� Uma junção entre duas tabelas que retorna osresultados da junção interna assim como linhas nãocorrespondentes em tabelas esquerdas (ou direitas)é uma junção externa esquerda (ou direita).

� Uma junção entre duas tabelas que retorna osresultados de uma junção interna assim como osresultados de uma junção esquerda ou direita é umajunção externa completa.

Page 176: Oracle Sql PortuguêS

4-33 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

SELECT e.last_name, e.department_id, d.department_nameFROM employees e LEFT OUTER JOIN departments dON (e.department_id = d.department_id) ;

LEFT OUTER JOIN

Page 177: Oracle Sql PortuguêS

4-34 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

SELECT e.last_name, e.department_id, d.department_nameFROM employees e RIGHT OUTER JOIN departments dON (e.department_id = d.department_id) ;

RIGHT OUTER JOIN

Page 178: Oracle Sql PortuguêS

4-35 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

SELECT e.last_name, e.department_id, d.department_nameFROM employees e FULL OUTER JOIN departments dON (e.department_id = d.department_id) ;

FULL OUTER JOIN

Page 179: Oracle Sql PortuguêS

4-36 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

SELECT e.employee_id, e.last_name, e.department_id, d.department_id, d.location_idFROM employees e JOIN departments dON (e.department_id = d.department_id)AND e.manager_id = 149 ;

Condições Adicionais

Page 180: Oracle Sql PortuguêS

4-37 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Resumo

Nesta lição, você aprendeu a usar junções para exibir osdados de várias tabelas na:� Sintaxe patenteada pela Oracle para versões 8i e

anteriores� Sintaxe compatível com SQL: 1999 para a versão 9i

Page 181: Oracle Sql PortuguêS

4-38 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Exercício 4, Parte Dois: Visão Geral

Este exercício abrange os seguintes tópicos:� Unindo tabelas usando uma eqüijunção� Efetuando junções externas e autojunções� Adicionando condições

Page 182: Oracle Sql PortuguêS

5Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Agregando DadosUsando Funções de Grupo

Page 183: Oracle Sql PortuguêS

5-2 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Objetivos

Após concluir esta lição, você poderá fazer o seguinte:� Identificar as funções de grupo disponíveis� Descrever o uso de funções de grupo� Agrupar dados usando a cláusula GROUP BY� Incluir ou excluir linhas agrupadas usando a cláusula

HAVING

Page 184: Oracle Sql PortuguêS

5-3 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

O que são Funções de Grupo?As funções de grupo operam em conjuntos de linhaspara fornecer um resultado por grupo.EMPLOYEES

O salário máximo na tabelaEMPLOYEES.

Page 185: Oracle Sql PortuguêS

5-4 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Tipos de Funções de Grupo

� AVG

� COUNT

� MAX

� MIN

� STDDEV

� SUM

� VARIANCE

Page 186: Oracle Sql PortuguêS

5-5 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

SELECT [coluna,] função_de_grupo(coluna), ...FROM tabela[WHERE condição][GROUP BY coluna][ORDER BY coluna];

Sintaxe de Funções de Grupo

Page 187: Oracle Sql PortuguêS

5-6 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

SELECT AVG(salary), MAX(salary), MIN(salary), SUM(salary)FROM employeesWHERE job_id LIKE '%REP%';

Usando as Funções AVG e SUM

Você pode usar AVG e SUM para dados numéricos.

Page 188: Oracle Sql PortuguêS

5-7 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Usando as Funções MIN e MAX

Você pode usar MIN e MAX para qualquer tipo de dados.

SELECT MIN(hire_date), MAX(hire_date)FROM employees;

Page 189: Oracle Sql PortuguêS

5-8 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

SELECT COUNT(*)FROM employeesWHERE department_id = 50;

Usando a Função COUNT

COUNT(*) retorna o número de linhas em uma tabela.

Page 190: Oracle Sql PortuguêS

5-9 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Usando a Função COUNT

� COUNT(expr) retorna o número de linhas comvalores não-nulos para a expr.

� Exiba o número de valores de departamento natabela EMPLOYEES, excluindo os valores nulos.

SELECT COUNT(commission_pct)FROM employeesWHERE department_id = 80;

Page 191: Oracle Sql PortuguêS

5-10 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

SELECT COUNT(DISTINCT department_id)FROM employees;

Usando a Palavra-Chave DISTINCT

� COUNT(DISTINCT expr) retorna o número devalores não-nulos distintos da expr.

� Exiba o número de valores de departamentodistintos na tabela EMPLOYEES.

Page 192: Oracle Sql PortuguêS

5-11 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

SELECT AVG(commission_pct)FROM employees;

Funções de Grupo e Valores Nulos

As funções de grupo ignoram valores nulos na coluna.

Page 193: Oracle Sql PortuguêS

5-12 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

SELECT AVG(NVL(commission_pct, 0))FROM employees;

Usando a Função NVL comFunções de Grupo

A função NVL força as funções de grupo a incluíremvalores nulos.

Page 194: Oracle Sql PortuguêS

5-13 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Criando Grupos de Dados

EMPLOYEES

O saláriomédio

na tabela

EMPLOYEESpara cada

departamento.

4400

9500

3500

6400

10033

Page 195: Oracle Sql PortuguêS

5-14 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

SELECT coluna, função_de_grupo(coluna)FROM tabela[WHERE condição][GROUP BY expressão_group_by][ORDER BY coluna];

Criando Grupos de Dados:A Sintaxe da Cláusula GROUP BY

Divida linhas de uma tabela em grupos menores usandoa cláusula GROUP BY.

Page 196: Oracle Sql PortuguêS

5-15 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

SELECT department_id, AVG(salary)FROM employeesGROUP BY department_id;

Usando a Cláusula GROUP BY

Todas as colunas da lista SELECT que não estejam emfunções de grupo devem estar na cláusula GROUP BY.

Page 197: Oracle Sql PortuguêS

5-16 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Usando a Cláusula GROUP BY

A coluna GROUP BY não precisa estar na lista SELECT.

SELECT AVG(salary)FROM employeesGROUP BY department_id;

Page 198: Oracle Sql PortuguêS

5-17 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Agrupando por mais de uma Coluna

EMPLOYEES

Adicione os salários na

tabelaEMPLOYEES

paracada cargo,

agrupado por departamento.�

Page 199: Oracle Sql PortuguêS

5-18 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

SELECT department_id dept_id, job_id, SUM(salary)FROM employeesGROUP BY department_id, job_id ;

Usando a Cláusula GROUP BYem Várias Colunas

Page 200: Oracle Sql PortuguêS

5-19 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Consultas InválidasUsando Funções de Grupo

Qualquer coluna ou expressão na lista SELECT quenão seja uma função agregada deve estar na cláusulaGROUP BY.

SELECT department_id, COUNT(last_name)FROM employees;

SELECT department_id, COUNT(last_name)FROM employees;

SELECT department_id, COUNT(last_name) *ERROR at line 1:ORA-00937: not a single-group group function

SELECT department_id, COUNT(last_name) *ERROR at line 1:ORA-00937: not a single-group group function

Coluna ausente na cláusula GROUP BYColuna ausente na cláusula GROUP BY

Page 201: Oracle Sql PortuguêS

5-20 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Consultas InválidasUsando Funções de Grupo

� Não é possível usar a cláusula WHERE para restringirgrupos.

� Use a cláusula HAVING para restringir grupos.� Não é possível usar funções de grupo na cláusula

WHERE.SELECT department_id, AVG(salary)FROM employeesWHERE AVG(salary) > 8000GROUP BY department_id;

SELECT department_id, AVG(salary)FROM employeesWHERE AVG(salary) > 8000GROUP BY department_id;

WHERE AVG(salary) > 8000 *ERROR at line 3:ORA-00934: group function is not allowed here

WHERE AVG(salary) > 8000 *ERROR at line 3:ORA-00934: group function is not allowed here

Não é possível usar a cláusula WHERE para restringir gruposNão é possível usar a cláusula WHERE para restringir grupos

Page 202: Oracle Sql PortuguêS

5-21 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Excluindo Resultados do Grupo

O saláriomáximo por

departamentoquando formaior queUS$ 10.000

EMPLOYEES

Page 203: Oracle Sql PortuguêS

5-22 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

SELECT coluna, função_de_grupoFROM tabela[WHERE condição][GROUP BY expressão_group_by][HAVING condição_de_grupo][ORDER BY coluna];

Excluindo Resultados do Grupo:A Cláusula HAVING

Use a cláusula HAVING para restringir grupos:1. As linhas são agrupadas.2. A função de grupo é aplicada.3. Os grupos que correspondem à cláusula HAVING

são exibidos.

Page 204: Oracle Sql PortuguêS

5-23 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Usando a Cláusula HAVING

SELECT department_id, MAX(salary)FROM employeesGROUP BY department_idHAVING MAX(salary)>10000 ;

Page 205: Oracle Sql PortuguêS

5-24 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

SELECT job_id, SUM(salary) PAYROLLFROM employeesWHERE job_id NOT LIKE '%REP%'GROUP BY job_idHAVING SUM(salary) > 13000ORDER BY SUM(salary);

Usando a Cláusula HAVING

Page 206: Oracle Sql PortuguêS

5-25 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Aninhando Funções de Grupo

Exiba o salário médio máximo.

SELECT MAX(AVG(salary))FROM employeesGROUP BY department_id;

Page 207: Oracle Sql PortuguêS

5-26 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

SELECT coluna, função_de_grupo(coluna)FROM tabela[WHERE condição][GROUP BY expressão_group_by][HAVING condição_de_grupo][ORDER BY coluna];

Resumo

Nesta lição, você aprendeu a:� Usar as funções de grupo COUNT, MAX, MIN e AVG� Criar consultas que usem a cláusula GROUP BY� Criar consultas que usem a cláusula HAVING

Page 208: Oracle Sql PortuguêS

5-27 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Visão Geral do Exercício 5

Este exercício abrange os seguintes tópicos:� Criando consultas que usem as funções de grupo� Agrupando por linhas para obter mais de um resultado� Excluindo grupos usando a cláusula HAVING

Page 209: Oracle Sql PortuguêS

6Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Subconsultas

Page 210: Oracle Sql PortuguêS

6-2 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Objetivos

Após concluir esta lição, você poderá fazer o seguinte:� Descrever os tipos de problemas que as subconsultas

podem resolver� Definir as subconsultas� Listar os tipos de subconsultas� Criar subconsultas de uma única linha e de várias

linhas

Page 211: Oracle Sql PortuguêS

6-3 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Usando uma Subconsultapara Resolver um Problema

Quem tem um salário maior que o de Abel?

Que funcionários têm salários maioresque o de Abel?

Consulta Principal:

??

Qual é o salário de Abel???

Subconsulta

Page 212: Oracle Sql PortuguêS

6-4 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

SELECT lista_de_seleçãoFROM tabelaWHERE operador expr

(SELECT lista_de_seleção FROM tabela);

Sintaxe de Subconsulta

� A subconsulta (consulta interna) é executada umavez antes da consulta principal.

� O resultado da subconsulta é usado pela consultaprincipal (consulta externa).

Page 213: Oracle Sql PortuguêS

6-5 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

SELECT last_nameFROM employeesWHERE salary > (SELECT salary FROM employees WHERE last_name = 'Abel');

Usando uma Subconsulta

11000

Page 214: Oracle Sql PortuguêS

6-6 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Diretrizes para o Uso de Subconsultas

� Coloque as subconsultas entre parênteses.� Coloque as subconsultas no lado direito da condição

de comparação.� A cláusula ORDER BY na subconsulta não é necessária,

a menos que você esteja executando a análise Top-N.� Use operadores de uma única linha com subconsultas

de uma única linha e use operadores de várias linhascom subconsultas de várias linhas.

Page 215: Oracle Sql PortuguêS

6-7 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Tipos de Subconsultas

ST_CLERK

� Subconsulta de várias linhas

ST_CLERKSA_MAN

Consulta principal

Subconsulta retorna

� Subconsulta de uma única linhaConsulta principal

Subconsulta retorna

Page 216: Oracle Sql PortuguêS

6-8 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Subconsultas de uma Única Linha

� Retorne somente uma linha� Use operadores de comparação de uma única linha

Operador

=

>

>=

<

<=

<>

Significado

Igual a

Maior que

Maior que ou igual a

Menor que

Menor que ou igual a

Diferente de

Page 217: Oracle Sql PortuguêS

6-9 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

SELECT last_name, job_id, salaryFROM employeesWHERE job_id = (SELECT job_id FROM employees WHERE employee_id = 141)AND salary > (SELECT salary FROM employees WHERE employee_id = 143) ;

Executando Subconsultasde uma Única Linha

ST_CLERK

2600

Page 218: Oracle Sql PortuguêS

6-10 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

SELECT last_name, job_id, salaryFROM employeesWHERE salary = (SELECT MIN(salary) FROM employees);

Usando Funções de Grupoem uma Subconsulta

2500

Page 219: Oracle Sql PortuguêS

6-11 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

A Cláusula HAVING com Subconsultas

� O servidor Oracle executa primeiro as subconsultas.� O servidor Oracle retorna os resultados para a

cláusula HAVING da consulta principal.

SELECT department_id, MIN(salary)FROM employeesGROUP BY department_idHAVING MIN(salary) > (SELECT MIN(salary) FROM employees WHERE department_id = 50);

2500

Page 220: Oracle Sql PortuguêS

6-12 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

SELECT employee_id, last_nameFROM employeesWHERE salary = (SELECT MIN(salary) FROM employees GROUP BY department_id);

O que há de Erradocom esta Instrução?

ERROR at line 4:ORA-01427: single-row subquery returns more than one row

ERROR at line 4:ORA-01427: single-row subquery returns more than one row

Operador de uma única linha com subconsulta devárias linhasOperador de uma única linha com subconsulta devárias linhas

Page 221: Oracle Sql PortuguêS

6-13 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Esta Instrução Retornará Linhas?

no rows selectedno rows selected

SELECT last_name, job_idFROM employeesWHERE job_id = (SELECT job_id FROM employees WHERE last_name = 'Haas');

A subconsulta não retorna nenhum valorA subconsulta não retorna nenhum valor

Page 222: Oracle Sql PortuguêS

6-14 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Subconsultas de Várias Linhas

� Retorne mais de uma linha� Use operadores de comparação de várias linhas

Operador

IN

ANY

ALL

Significado

Igual a qualquer membro da lista

Compare o valor a cada valor retornadopela subconsulta

Compare o valor a todo valor retornadopela subconsulta

Page 223: Oracle Sql PortuguêS

6-15 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

SELECT employee_id, last_name, job_id, salaryFROM employeesWHERE salary < ANY (SELECT salary FROM employees WHERE job_id = 'IT_PROG')AND job_id <> 'IT_PROG';

Usando o Operador ANY emSubconsultas de Várias Linhas

9000, 6000, 4200

Page 224: Oracle Sql PortuguêS

6-16 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

SELECT employee_id, last_name, job_id, salaryFROM employeesWHERE salary < ALL (SELECT salary FROM employees WHERE job_id = 'IT_PROG')AND job_id <> 'IT_PROG';

Usando o Operador ALL emSubconsultas de Várias Linhas

9000, 6000, 4200

Page 225: Oracle Sql PortuguêS

6-17 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Valores Nulos em uma Subconsulta

SELECT emp.last_nameFROM employees empWHERE emp.employee_id NOT IN (SELECT mgr.manager_id FROM employees mgr);

no rows selectedno rows selected

Page 226: Oracle Sql PortuguêS

6-18 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

SELECT lista_de_seleçãoFROM tabelaWHERE operador expr

(SELECT lista_de_seleção FROM tabela);

Resumo

Nesta lição, você aprendeu a:� Identificar quando uma subconsulta pode ajudar a

resolver um problema� Criar subconsultas quando uma consulta se basear

em valores desconhecidos

Page 227: Oracle Sql PortuguêS

6-19 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Visão Geral do Exercício 6

Este exercício abrange os seguintes tópicos:� Criando subconsultas para valores de consulta com

base em critérios desconhecidos� Usando subconsultas para descobrir quais valores

existem em um conjunto de dados e não em outro

Page 228: Oracle Sql PortuguêS

7Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Produzindo uma Saída quePode Ser Lida com o iSQL*Plus

Page 229: Oracle Sql PortuguêS

7-2 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Objetivos

Após concluir esta lição, você poderá fazer o seguinte:� Produzir consultas que exijam uma variável de

substituição� Personalizar o ambiente do iSQL*Plus� Produzir saídas mais legíveis� Criar e executar arquivos de script

Page 230: Oracle Sql PortuguêS

7-3 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Variáveis de Substituição

Desejo executar umaconsulta com valoresdiferentes.... salary = ? �

� department_id = ? �... last_name = ? ...

Usuário

Page 231: Oracle Sql PortuguêS

7-4 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Variáveis de Substituição

Use as variáveis de substituição do iSQL*Plus para:� Armazenar valores temporariamente

� "E" comercial simples (&)� "E" comercial duplo (&&)� Comando DEFINE

� Passar os valores das variáveis entre asinstruções SQL

� Alterar cabeçalhos e rodapés dinamicamente

Page 232: Oracle Sql PortuguêS

7-5 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Usando a Variável de Substituição &Usando a Variável de Substituição &

Use uma variável precedida de um "e" comercial (&) parasolicitar um valor ao usuário.Use uma variável precedida de um "e" comercial (&) parasolicitar um valor ao usuário.SELECT employee_id, last_name, salary, department_idFROM employeesWHERE employee_id = &employee_num;

Page 233: Oracle Sql PortuguêS

7-6 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Usando a Variável de Substituição &Usando a Variável de Substituição &

1

2101

Page 234: Oracle Sql PortuguêS

7-7 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

SELECT last_name, department_id, salary*12FROM employeesWHERE job_id = '&job_title' ;

Valores de Caractere e Datacom Variáveis de Substituição

Use aspas simples para valores de data e de caractere.

Page 235: Oracle Sql PortuguêS

7-8 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Especificando Nomes de Colunas,Expressões e Textos

Use variáveis de substituição para complementaro seguinte:� Condições WHERE� Cláusulas ORDER BY� Expressões de coluna� Nomes de tabela� Instruções SELECT inteiras

Page 236: Oracle Sql PortuguêS

7-9 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Especificando Nomes de Colunas,Expressões e Textos

SELECT employee_id, last_name, job_id, &column_nameFROM employeesWHERE &conditionORDER BY &order_column ;

Page 237: Oracle Sql PortuguêS

7-10 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Definindo Variáveis de Substituição

� Você pode predefinir variáveis usando o comandoDEFINE do iSQL*Plus.

DEFINE variável = valor cria uma variável deusuário com o tipo de dados CHAR.

� Se você precisar predefinir uma variável que incluaespaços, deverá colocar o valor entre aspas simplesquando usar o comando DEFINE.

� Uma variável definida está disponível para a sessão.

Page 238: Oracle Sql PortuguêS

7-11 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Comandos DEFINE e UNDEFINE

� A variável permanece definida até você:� Usar o comando UNDEFINE para removê-la� Sair do iSQL*Plus

� Você pode verificar suas alterações com o comandoDEFINE.

DEFINE job_title = IT_PROGDEFINE job_titleDEFINE JOB_TITLE = "IT_PROG" (CHAR)

UNDEFINE job_titleDEFINE job_titleSP2-0135: symbol job_title is UNDEFINED

Page 239: Oracle Sql PortuguêS

7-12 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

SELECT employee_id, last_name, salary, department_idFROM employeesWHERE employee_id = &employee_num;

Usando o Comando DEFINE coma Variável de Substituição &

� Crie a variável de substituição usando o comandoDEFINE.

� Use a variável precedida de um "e" comercial (&)para substituir o valor na instrução SQL.

DEFINE employee_num = 200

Page 240: Oracle Sql PortuguêS

7-13 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

SELECT employee_id, last_name, job_id, &&column_nameFROM employeesORDER BY &column_name;

Use o "e" comercial duplo (&&) para reutilizar o valorda variável sem precisar solicitar sempre um valor aousuário.

Usando a Variável de Substituição &&

Page 241: Oracle Sql PortuguêS

7-14 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

old 3: WHERE employee_id = &employee_numnew 3: WHERE employee_id = 200

Usando o Comando VERIFY

Use o comando VERIFY para alternar a exibição davariável de substituição, antes e depois de o iSQL*Plustrocar as variáveis de substituição por valores.SET VERIFY ONSELECT employee_id, last_name, salary, department_idFROM employeesWHERE employee_id = &employee_num;

Page 242: Oracle Sql PortuguêS

7-15 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Personalizando o Ambiente do iSQL*Plus

� Use os comandos SETSET para controlar a sessão atual.

� Verifique o que você definiu usando o comando SHOWSHOW.

SET ECHO ONSET ECHO ON

SHOW ECHOecho ON

SHOW ECHOecho ONecho ON

SET variável_sistema valor SET variável_sistema valor

Page 243: Oracle Sql PortuguêS

7-16 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Variáveis do Comando SET

� ARRAYSIZE {20 | n}

� FEEDBACK {6 | n |OFF | ON}

� HEADING {OFF | ON}

� LONG {80 | n| ON | texto}

SET HEADING OFFSET HEADING OFF

SHOW HEADINGHEADING OFF

SHOW HEADINGHEADING OFFHEADING OFF

Page 244: Oracle Sql PortuguêS

7-17 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Comandos de Formato do iSQL*Plus

� COLUMN [opção da coluna]� TTITLE [texto | OFF | ON]� BTITLE [texto | OFF | ON]� BREAK [ON elemento_relatório]

Page 245: Oracle Sql PortuguêS

7-18 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

O Comando COLUMN

Controla a exibição de uma coluna:

� CLE[AR]: remove todos os formatos de coluna� HEA[DING] texto: define o cabeçalho da coluna� FOR[MAT] formato: altera a exibição da coluna

usando um modelo de formato� NOPRINT | PRINT

� NULL

COL[UMN] [{coluna|apelido} [opção]]COL[UMN] [{coluna|apelido} [opção]]

Page 246: Oracle Sql PortuguêS

7-19 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Usando o Comando COLUMN

� Crie cabeçalhos de coluna.

COLUMN last_name HEADING 'Employee|Name' COLUMN salary JUSTIFY LEFT FORMAT $99,990.00COLUMN manager FORMAT 999999999 NULL 'No manager'

COLUMN last_name HEADING 'Employee|Name' COLUMN salary JUSTIFY LEFT FORMAT $99,990.00COLUMN manager FORMAT 999999999 NULL 'No manager'

COLUMN last_nameCOLUMN last_name

COLUMN last_name CLEAR COLUMN last_name CLEAR

� Exiba a definição atual da coluna LAST_NAME.

� Remova as definições da coluna LAST_NAME.

Page 247: Oracle Sql PortuguêS

7-20 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Modelos de Formato COLUMN

Resultado

1234

001234

$1234

L1234

1234.00

1,234

Exemplo

999999

099999

$9999

L9999

9999.99

9,999

Elemento

9

0

$

L

.

,

Descrição

Dígito de supressão de umúnico zero

Aplica o zero à esquerda

Símbolo de dólar flutuante

Moeda local

Posição do ponto decimal

Separador de milhar

Page 248: Oracle Sql PortuguêS

7-21 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Usando o Comando BREAK

Use o comando BREAK para suprimir duplicatas.

BREAK ON job_idBREAK ON job_id

Page 249: Oracle Sql PortuguêS

7-22 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Usando os Comandos TTITLE e BTITLE

� Exibir cabeçalhos e rodapés.

� Definir o cabeçalho do relatório.

� Definir o rodapé do relatório.

TTI[TLE] [texto|OFF|ON]TTI[TLE] [texto|OFF|ON]

TTITLE 'Salary|Report'TTITLE 'Salary|Report'

BTITLE 'Confidential'BTITLE 'Confidential'

Page 250: Oracle Sql PortuguêS

7-23 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Criando um Arquivo de Scriptpara Executar um Relatório

1. Crie e teste a instrução SQL SELECT.2. Salve a instrução SELECT em um arquivo de script.3. Carregue o arquivo de script em um editor.4. Adicione comandos de formatação antes da instrução

SELECT.5. Verifique se o caractere de finalização está situado

após a instrução SELECT.

Page 251: Oracle Sql PortuguêS

7-24 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Criando um Arquivo de Scriptpara Executar um Relatório

6. Remova os comandos de formatação depois dainstrução SELECT.

7. Salve o arquivo de script.8. Carregue o arquivo de script na janela de texto doiSQL*Plus e clique no botão Execute (Executar).

Page 252: Oracle Sql PortuguêS

7-25 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Exemplo de Relatório

Page 253: Oracle Sql PortuguêS

7-26 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Exemplo de Relatório

Page 254: Oracle Sql PortuguêS

7-27 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Resumo

Nesta lição, você aprendeu a:� Usar as variáveis de substituição do iSQL*Plus para

armazenar valores temporariamente� Usar os comandos SET para controlar o ambiente

atual do iSQL*Plus� Usar o comando COLUMN para controlar a exibição de

uma coluna� Usar o comando BREAK para suprimir duplicações e

dividir linhas em seções� Usar os comandos TTITLE e BTITLE para exibir

cabeçalhos e rodapés

Page 255: Oracle Sql PortuguêS

7-28 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Visão Geral do Exercício 7

Este exercício abrange os seguintes tópicos:� Criando uma consulta para exibir valores usando

variáveis de substituição� Iniciando um arquivo de comando contendo variáveis

Page 256: Oracle Sql PortuguêS

8Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Manipulando Dados

Page 257: Oracle Sql PortuguêS

8-2 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Objetivos

Após concluir esta lição, você poderá fazer o seguinte:� Descrever cada instrução DML� Inserir linhas em uma tabela� Atualizar linhas em uma tabela� Deletar linhas de uma tabela� Intercalar linhas em uma tabela� Controlar transações

Page 258: Oracle Sql PortuguêS

8-3 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

DML (Data Manipulation Language)

� Uma instrução DML é executada quando você:� Adiciona novas linhas a uma tabela� Modifica linhas existentes em uma tabela� Remove linhas existentes de uma tabela

� Uma transação consiste em um conjunto deinstruções DML que formam uma unidade lógicade trabalho.

Page 259: Oracle Sql PortuguêS

8-4 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Adicionando uma Nova Linha a uma Tabela

DEPARTMENTSNovalinha

�insira uma novalinha na tabela DEPARTMENTS�

Page 260: Oracle Sql PortuguêS

8-5 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

A Sintaxe da Instrução INSERT

� Adicione novas linhas a uma tabela usando ainstrução INSERT.

� Somente uma linha é inserida por vez com esta sintaxe.

INSERT INTO tabela [(coluna [, coluna...])]VALUES (valor [, valor...]);

INSERT INTO tabela [(coluna [, coluna...])]VALUES (valor [, valor...]);

Page 261: Oracle Sql PortuguêS

8-6 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Inserindo Novas Linhas

� Insira uma nova linha contendo valores para cada coluna.

� Liste valores na ordem default das colunas na tabela.

� Opcionalmente, liste as colunas na cláusula INSERT.

� Coloque os valores de data e de caractere entre aspas simples.

INSERT INTO departments(department_id, department_name, manager_id, location_id)

VALUES (70, 'Public Relations', 100, 1700);1 row created.

Page 262: Oracle Sql PortuguêS

8-7 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

INSERT INTO departmentsVALUES (100, 'Finance', NULL, NULL);1 row created.1 row created.

INSERT INTO departments (department_id, department_name )

VALUES (30, 'Purchasing');1 row created.1 row created.

Inserindo Linhas com Valores Nulos

� Método implícito: omite a coluna da lista de colunas.

� Método explícito: especifica a palavra-chave NULLna cláusula VALUES.

Page 263: Oracle Sql PortuguêS

8-8 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

INSERT INTO employees (employee_id, first_name, last_name, email, phone_number,hire_date, job_id, salary, commission_pct, manager_id,department_id)

VALUES (113,'Louis', 'Popp', 'LPOPP', '515.124.4567', SYSDATE, 'AC_ACCOUNT', 6900, NULL, 205, 100);

1 row created.1 row created.

Inserindo Valores Especiais

A função SYSDATE registra a data e a hora atuais.

Page 264: Oracle Sql PortuguêS

8-9 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

INSERT INTO employeesVALUES (114,

'Den', 'Raphealy','DRAPHEAL', '515.127.4561',TO_DATE('FEB 3, 1999', 'MON DD, YYYY'),'AC_ACCOUNT', 11000, NULL, 100, 30);

1 row created.1 row created.

Inserindo Valores de Data Específicos

� Adicione um novo funcionário.

� Verifique sua adição.

Page 265: Oracle Sql PortuguêS

8-10 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

INSERT INTO departments

(department_id, department_name, location_id)

VALUES (&department_id, '&department_name',&location);

Criando um Script

� Use a variável de substituição & em uma instruçãoSQL para solicitar valores.

� & é um marcador de espaço para o valor da variável.

1 row created.1 row created.

Page 266: Oracle Sql PortuguêS

8-11 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

� Crie sua instrução INSERT com uma subconsulta.

� Não use a cláusula VALUES.� Estabeleça a correspondência entre o número de

colunas da cláusula INSERT e o da subconsulta.

INSERT INTO sales_reps(id, name, salary, commission_pct)SELECT employee_id, last_name, salary, commission_pctFROM employeesWHERE job_id LIKE '%REP%';

4 rows created.4 rows created.

Copiando Linhas de Outra Tabela

Page 267: Oracle Sql PortuguêS

8-12 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Alterando os Dados em uma Tabela

EMPLOYEES

Atualize linhas na tabela EMPLOYEES.

Page 268: Oracle Sql PortuguêS

8-13 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

A Sintaxe da Instrução UPDATE

� Modifique linhas existentes com a instrução UPDATE.

� Atualize mais de uma linha por vez, se necessário.

UPDATE tabelaSET coluna = valor [, coluna = valor, ...][WHERE condição];

UPDATE tabelaSET coluna = valor [, coluna = valor, ...][WHERE condição];

Page 269: Oracle Sql PortuguêS

8-14 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

� Uma ou mais linhas específicas serão modificadasse você especificar a cláusula WHERE.

� Se você omitir a cláusula WHERE, todas as linhas da tabela serão modificadas.

UPDATE employeesSET department_id = 70WHERE employee_id = 113;1 row updated.1 row updated.

Atualizando Linhas em uma Tabela

UPDATE copy_empSET department_id = 110;22 rows updated.

UPDATE copy_empSET department_id = 110;22 rows updated.22 rows updated.

Page 270: Oracle Sql PortuguêS

8-15 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

UPDATE employeesSET job_id = (SELECT job_id

FROM employeesWHERE employee_id = 205),

salary = (SELECT salary FROM employeesWHERE employee_id = 205)

WHERE employee_id = 114;1 row updated.1 row updated.

Atualizando Duas Colunascom uma Subconsulta

Atualize o cargo e o salário do funcionário 114 para quecorrespondam aos do funcionário 205.

Page 271: Oracle Sql PortuguêS

8-16 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

UPDATE copy_empSET department_id = (SELECT department_id

FROM employeesWHERE employee_id = 100)

WHERE job_id = (SELECT job_idFROM employeesWHERE employee_id = 200) ;

1 row updated.1 row updated.

Atualizando Linhas com Baseem Outra Tabela

Use subconsultas nas instruções UPDATE para atualizaras linhas de uma tabela com base em valores de outratabela.

Page 272: Oracle Sql PortuguêS

8-17 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

UPDATE employees*

ERROR at line 1:ORA-02291: integrity constraint (HR.EMP_DEPT_FK) violated - parent key not found[restrição de integridade (HR.EMP_DEPT_FK)violada - chave mãe não encontrada]

UPDATE employees*

ERROR at line 1:ORA-02291: integrity constraint (HR.EMP_DEPT_FK) violated - parent key not found[restrição de integridade (HR.EMP_DEPT_FK)violada - chave mãe não encontrada]

UPDATE employeesSET department_id = 55WHERE department_id = 110;

UPDATE employeesSET department_id = 55WHERE department_id = 110;

Atualizando Linhas: Erro deRestrição de Integridade

Não existe o número de departamento 55

Page 273: Oracle Sql PortuguêS

8-18 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Delete uma linha da tabela DEPARTMENTS.

Removendo uma Linha de uma TabelaDEPARTMENTS

Page 274: Oracle Sql PortuguêS

8-19 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

A Instrução DELETE

Você pode remover linhas de uma tabela usando a instrução DELETE.

DELETE [FROM] tabela[WHERE condição];

DELETE [FROM] tabela[WHERE condição];

Page 275: Oracle Sql PortuguêS

8-20 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

� Se você especificar a cláusula WHERE, linhas específicas serão deletadas.

� Se você omitir a cláusula WHERE, todas as linhas da tabela serão deletadas.

Deletando Linhas de uma Tabela

DELETE FROM departmentsWHERE department_name = 'Finance';1 row deleted.

DELETE FROM departmentsWHERE department_name = 'Finance';1 row deleted.1 row deleted.

DELETE FROM copy_emp;22 rows deleted.

DELETE FROM copy_emp;22 rows deleted.22 rows deleted.

Page 276: Oracle Sql PortuguêS

8-22 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

DELETE FROM employeesWHERE department_id =

(SELECT department_idFROM departmentsWHERE department_name LIKE '%Public%');

1 row deleted.1 row deleted.

Deletando Linhas com Base em Outra Tabela

Use subconsultas nas instruções DELETE para removerlinhas de uma tabela com base em valores de outratabela.

Page 277: Oracle Sql PortuguêS

8-23 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Deletando Linhas: Erro deRestrição de Integridade

DELETE FROM departmentsWHERE department_id = 60;

DELETE FROM departmentsWHERE department_id = 60;

DELETE FROM departments*

ERROR at line 1:ORA-02292: integrity constraint (HR.EMP_DEPT_FK) violated - child record found[restrição de integridade (HR.EMP_DEPT_FK)violada - registro filho encontrado]

DELETE FROM departments*

ERROR at line 1:ORA-02292: integrity constraint (HR.EMP_DEPT_FK) violated - child record found[restrição de integridade (HR.EMP_DEPT_FK)violada - registro filho encontrado]

Você não pode deletar uma linha que contenha uma chaveprimária usada como chave estrangeira em outra tabela.

Page 278: Oracle Sql PortuguêS

8-24 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Usando uma Subconsultaem uma Instrução INSERT

INSERT INTO(SELECT employee_id, last_name,

email, hire_date, job_id, salary, department_id

FROM employeesWHERE department_id = 50)

VALUES (99999, 'Taylor', 'DTAYLOR',TO_DATE('07-JUN-99', 'DD-MON-RR'), 'ST_CLERK', 5000, 50);

1 row created.

INSERT INTO(SELECT employee_id, last_name,

email, hire_date, job_id, salary, department_id

FROM employeesWHERE department_id = 50)

VALUES (99999, 'Taylor', 'DTAYLOR',TO_DATE('07-JUN-99', 'DD-MON-RR'), 'ST_CLERK', 5000, 50);

1 row created.

Page 279: Oracle Sql PortuguêS

8-25 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Usando uma Subconsultaem uma Instrução INSERT

� Verifique os resultadosSELECT employee_id, last_name, email, hire_date, job_id, salary, department_id

FROM employeesWHERE department_id = 50;

SELECT employee_id, last_name, email, hire_date, job_id, salary, department_id

FROM employeesWHERE department_id = 50;

Page 280: Oracle Sql PortuguêS

8-26 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Usando a Palavra-Chave WITH CHECK OPTION em Instruções DML

� Uma subconsulta é usada para identificar a tabela e as colunas da instrução DML.

� A palavra-chave WITH CHECK OPTION proíbe que você altere linhas que não estejam na subconsulta.

INSERT INTO (SELECT employee_id, last_name, email,hire_date, job_id, salary

FROM employeesWHERE department_id = 50 WITH CHECK OPTION)

VALUES (99998, 'Smith', 'JSMITH',TO_DATE('07-JUN-99', 'DD-MON-RR'), 'ST_CLERK', 5000);

INSERT INTO*

ERROR at line 1:ORA-01402: view WITH CHECK OPTION where-clause violation (violação da cláusula where WITH CHECK OPTION na view)

INSERT INTO (SELECT employee_id, last_name, email,hire_date, job_id, salary

FROM employeesWHERE department_id = 50 WITH CHECK OPTION)

VALUES (99998, 'Smith', 'JSMITH',TO_DATE('07-JUN-99', 'DD-MON-RR'), 'ST_CLERK', 5000);

INSERT INTO*

ERROR at line 1:ORA-01402: view WITH CHECK OPTION where-clause violation (violação da cláusula where WITH CHECK OPTION na view)

Page 281: Oracle Sql PortuguêS

8-27 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Visão Geral do Recurso Explicit Default (Default Explícito)

� Com o recurso Explicit Default, você pode usar apalavra-chave DEFAULT como um valor de coluna onde o valor default é desejado.

� Esse recurso foi adicionado para fins decompatibilidade com o SQL: 1999 Standard.

� Isso permite que o usuário controle onde e quando o valor default deve ser aplicado aos dados.

� Os valores default explícitos podem ser usados nas instruções INSERT e UPDATE.

Page 282: Oracle Sql PortuguêS

8-28 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Usando Valores Default Explícitos

INSERT INTO departments(department_id, department_name, manager_id)

VALUES (300, 'Engineering', DEFAULT);

INSERT INTO departments(department_id, department_name, manager_id)

VALUES (300, 'Engineering', DEFAULT);

UPDATE departments SET manager_id = DEFAULT WHERE department_id = 10;

UPDATE departments SET manager_id = DEFAULT WHERE department_id = 10;

� DEFAULT com INSERT:

� DEFAULT com UPDATE:

Page 283: Oracle Sql PortuguêS

8-29 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

A Instrução MERGE

� Fornece a habilidade de atualizar ou inserir dados condicionalmente em uma tabela de banco de dados

� Executa uma operação UPDATE se a linha existir euma operação INSERT se for uma nova linha:� Evita atualizações separadas� Aumenta o desempenho e a facilidade de

utilização� É útil em aplicações de data warehousing

Page 284: Oracle Sql PortuguêS

8-30 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

A Sintaxe da Instrução MERGE

Você pode inserir ou atualizar linhas condicionalmente em uma tabela usando a instrução MERGE.

MERGE INTO nome_tabela apelido_tabelaUSING (tabela|view|subconsulta) apelidoON (condição de junção)WHEN MATCHED THENUPDATE SETcol1 = col_val1,col2 = col2_val

WHEN NOT MATCHED THENINSERT (lista_colunas)VALUES (valores_colunas);

MERGE INTO nome_tabela apelido_tabelaUSING (tabela|view|subconsulta) apelidoON (condição de junção)WHEN MATCHED THENUPDATE SETcol1 = col_val1,col2 = col2_val

WHEN NOT MATCHED THENINSERT (lista_colunas)VALUES (valores_colunas);

Page 285: Oracle Sql PortuguêS

8-31 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

MERGE INTO copy_emp cUSING employees eON (c.employee_id = e.employee_id)

WHEN MATCHED THENUPDATE SET

c.first_name = e.first_name,c.last_name = e.last_name,...c.department_id = e.department_id

WHEN NOT MATCHED THENINSERT VALUES(e.employee_id, e.first_name, e.last_name,

e.email, e.phone_number, e.hire_date, e.job_id,e.salary, e.commission_pct, e.manager_id, e.department_id);

Intercalando Linhas

Insira ou atualize linhas na tabela COPY_EMP para que corresponda à tabela EMPLOYEES.

Page 286: Oracle Sql PortuguêS

8-33 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Intercalando Linhas

MERGE INTO copy_emp cUSING employees eON (c.employee_id = e.employee_id)

WHEN MATCHED THENUPDATE SET

...WHEN NOT MATCHED THENINSERT VALUES...;

MERGE INTO copy_emp cUSING employees eON (c.employee_id = e.employee_id)

WHEN MATCHED THENUPDATE SET

...WHEN NOT MATCHED THENINSERT VALUES...;

SELECT *FROM COPY_EMP;

no rows selected

SELECT *FROM COPY_EMP;

no rows selected

SELECT *FROM COPY_EMP;

20 rows selected.

SELECT *FROM COPY_EMP;

20 rows selected.

Page 287: Oracle Sql PortuguêS

8-34 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Transações de Banco de Dados

Uma transação de banco de dados consiste no seguinte: � Instruções DML que fazem uma alteração

consistente nos dados� Uma instrução DDL� Uma instrução DCL

Page 288: Oracle Sql PortuguêS

8-35 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Transações de Banco de Dados

� Iniciam quando a primeira instrução SQL DML éexecutada

� Terminam com um dos seguintes eventos:� Uma instrução COMMIT ou ROLLBACK é emitida� Um instrução DDL ou DCL é executada

(commit automático)� O usuário sai do iSQL*Plus� Ocorre uma falha no sistema

Page 289: Oracle Sql PortuguêS

8-36 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Vantagens das Instruções COMMIT e ROLLBACK

Com as instruções COMMIT e ROLLBACK, você pode: � Garantir a consistência dos dados� Visualizar as alterações nos dados antes de

fazer alterações permanentes� Agrupar operações relacionadas logicamente

Page 290: Oracle Sql PortuguêS

8-37 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Controlando Transações

SAVEPOINT B

SAVEPOINT A

DELETE

INSERT

UPDATE

INSERT

COMMITTempo

Transação

ROLLBACKto SAVEPOINT B

ROLLBACKto SAVEPOINT A

ROLLBACK

Page 291: Oracle Sql PortuguêS

8-38 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

UPDATE...SAVEPOINT update_done;SavepointSavepoint created.created.INSERT...ROLLBACK TO update_done;Rollback complete.Rollback complete.

Fazendo Rollback de Alteraçõesaté um Marcador

� Crie um marcador em uma transação atual usandoa instrução SAVEPOINT.

� Faça o rollback até esse marcador usando ainstrução ROLLBACK TO SAVEPOINT.

Page 292: Oracle Sql PortuguêS

8-39 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

� Um commit automático ocorre nas seguintes circunstâncias:� A emissão de uma instrução DDL� A emissão de uma instrução DCL� A saída normal do iSQL*Plus, sem emitir

explicitamente as instruções COMMIT ou ROLLBACK

� Um rollback automático ocorre quando há um término anormal do iSQL*Plus ou uma falha do sistema.

Processamento de Transação Implícita

Page 293: Oracle Sql PortuguêS

8-40 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Estado dos Dados Antes de COMMIT ou ROLLBACK

� O estado anterior dos dados pode ser recuperado.� O usuário atual pode revisar os resultados das

operações DML usando a instrução SELECT.� Os outros usuários não podem ver os resultados

das instruções DML do usuário atual.� As linhas afetadas são bloqueadas; os outros

usuários não poderão alterar os dados contidos nessas linhas.

Page 294: Oracle Sql PortuguêS

8-41 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Estado dos Dados Após COMMIT

� As alterações nos dados se tornam permanentes nobanco de dados.

� O estado anterior dos dados é perdido permanentemente.

� Todos os usuários podem ver os resultados.� As linhas afetadas são desbloqueadas; essas linhas

estão disponíveis para que outros usuários asmanipulem.

� Todos os pontos de salvamento são apagados.

Page 295: Oracle Sql PortuguêS

8-42 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

COMMIT;Commit complete.Commit complete.

� Faça as alterações.

� Submeta as alterações a commit.

DELETE FROM employeesWHERE employee_id = 99999;1 row deleted.

INSERT INTO departmentsVALUES (290, 'Corporate Tax', NULL, 1700);1 row inserted.

DELETE FROM employeesWHERE employee_id = 99999;WHERE employee_id = 99999;1 row deleted.1 row deleted.

INSERT INTO departmentsVALUES (290, 'Corporate Tax', NULL, 1700);1 row inserted.1 row inserted.

Submetendo Dados a Commit

Page 296: Oracle Sql PortuguêS

8-43 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Estado dos Dados Após ROLLBACK

Descarte todas as alterações pendentes usando a instrução ROLLBACK:� As alterações nos dados são desfeitas.� O estado anterior dos dados é restaurado.� As linhas afetadas são desbloqueadas.

DELETE FROM copy_emp;22 rows deleted.22 rows deleted.ROLLBACK;Rollback complete.Rollback complete.

Page 297: Oracle Sql PortuguêS

8-45 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Rollback no Nível da Instrução

� Se ocorrer falha durante a execução de uma única instrução DML, será feito o rollback somente dessa instrução.

� O servidor Oracle implementará um ponto desalvamento implícito.

� Todas as outras alterações serão mantidas.� O usuário deve finalizar as transações

explicitamente executando uma instrução COMMITou ROLLBACK.

Page 298: Oracle Sql PortuguêS

8-46 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Consistência na Leitura

� A consistência na leitura garante sempre uma exibição consistente dos dados.

� As alterações feitas por um usuário não entramem conflito com as alterações feitas por outro usuário.

� A consistência na leitura garante que nos mesmos dados:� Os leitores não esperem pelos autores.� Os autores não esperem pelos leitores.

Page 299: Oracle Sql PortuguêS

8-47 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

SELECT *FROM userA.employees;

Implementação da Consistência na Leitura

UPDATE employeesSET salary = 7000WHERE last_name = 'Goyal';

Blocos dedados

Segmentos de rollback

dados alteradose dados inalteradosdados "antigos"antes das alterações

Usuário A

Usuário B

Imagem daconsistênciana leitura

Page 300: Oracle Sql PortuguêS

8-48 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Bloqueio

Em um banco de dados Oracle, os bloqueios:� Impedem a interação destrutiva entre transações

simultâneas� Não requerem ações do usuário� Usam automaticamente o nível mais baixo de

restrição� São mantidos durante a transação� São de dois tipos: bloqueios explícitos e

implícitos

Page 301: Oracle Sql PortuguêS

8-49 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Bloqueio Implícito

� Dois modos de bloqueio:� Exclusivo: bloqueia o acesso de outros usuários� De compartilhamento: permite o acesso de outros

usuários� Nível elevado de concorrência dos dados:

� DML: compartilhamento de tabela, linha exclusiva� Consultas: não são necessários bloqueios� DDL: protege as definições de objeto

� Os bloqueios são mantidos até o commit ou rollback

Page 302: Oracle Sql PortuguêS

8-50 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Resumo

Instrução

INSERT

UPDATE

DELETE

MERGE

COMMIT

SAVEPOINT

ROLLBACK

Nesta lição, você aprendeu a usar instruções DML e acontrolar transações.

Descrição

Adiciona uma nova linha à tabela

Modifica linhas existentes na tabela

Remove linhas existentes da tabela

Insere ou atualiza dados condicionalmente em uma tabela

Torna permanentes todas as alterações pendentes

É usada para fazer rollback até o marcador de ponto de salvamento

Descarta todas as alterações pendentes nos dados

Page 303: Oracle Sql PortuguêS

8-51 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Visão Geral do Exercício 8

Este exercício abrange os seguintes tópicos:� Inserindo linhas nas tabelas� Atualizando e deletando linhas na tabela� Controlando transações

Page 304: Oracle Sql PortuguêS

8-55 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

SaídaSaída TempoTempo SessãoSessão 11 SessãoSessão 22

t1t1

t2t2

t3t3

t4t4

t5t5

SELECT salary FROM employeesWHERE last_name='King';24000

UPDATE employeesSET salary=salary+10000WHERE last_name='King';

24000

COMMIT;

34000

SELECT salary FROM employeesWHERE last_name='King';

SELECT salary FROM employeesWHERE last_name='King';

Exemplo de Consistência na Leitura

Page 305: Oracle Sql PortuguêS

9Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Criando e Gerenciando Tabelas

Page 306: Oracle Sql PortuguêS

9-2 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Objetivos

Após concluir esta lição, você poderá fazer o seguinte:� Descrever os principais objetos de banco de dados� Criar tabelas� Descrever os tipos de dados que podem ser usados

ao se especificar a definição da coluna� Alterar definições de tabela� Eliminar, renomear e truncar tabelas

Page 307: Oracle Sql PortuguêS

9-3 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Objetos de Banco de Dados

Objeto Descrição

Tabela Unidade básica de armazenamento, composta de linhas e colunas

View Representa logicamente subconjuntos dedados de uma ou mais tabelas

Seqüência Gerador de valores numéricos

Índice Melhora o desempenho de algumas consultasSinônimo Atribui nomes alternativos a objetos

Page 308: Oracle Sql PortuguêS

9-4 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Regras para Nomeação

Nomes de tabelas e de colunas:� Devem ser iniciados por uma letra� Devem ter de 1 a 30 caracteres� Devem conter somente AZ, az, 09, _, $ e #� Não devem duplicar o nome de outro objeto de

propriedade do mesmo usuário� Não devem ser uma palavra reservada do servidor

Oracle

Page 309: Oracle Sql PortuguêS

9-5 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

A Instrução CREATE TABLE

� Você deve ter:� O privilégio CREATE TABLE� Uma área de armazenamento

� Especifique:� O nome da tabela� O nome, o tipo de dados e o tamanho da coluna

CREATE TABLE [esquema.]tabela (coluna tipo_de_dados [DEFAULT expr][, ...]);

Page 310: Oracle Sql PortuguêS

9-6 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Fazendo Referência a Tabelasde Outro Usuário

� As tabelas que pertencem a outros usuários nãoestão no esquema do usuário.

� Você deve usar o nome do proprietário comoprefixo dessas tabelas.

Page 311: Oracle Sql PortuguêS

9-7 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

A Opção DEFAULT

� Especifique um valor default para uma coluna duranteuma inserção.

� Valores literais, expressões ou funções SQL sãovalores válidos.

� O nome de outra coluna ou uma pseudocoluna sãovalores inválidos.

� O tipo de dados default deve corresponder ao tipo dedados da coluna.

... hire_date DATE DEFAULT SYSDATE, ...

Page 312: Oracle Sql PortuguêS

9-8 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

� Crie a tabela.

� Confirme a criação da tabela.

Criando Tabelas

CREATE TABLE dept(deptno NUMBER(2),dname VARCHAR2(14),loc VARCHAR2(13));

Table created.Table created.

DESCRIBE dept

Page 313: Oracle Sql PortuguêS

9-9 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Tabelas no Banco de Dados Oracle

� Tabelas do Usuário:� São um conjunto de tabelas criadas e

mantidas pelo usuário� Contêm informações sobre o usuário

� Dicionário de Dados:� É um conjunto de tabelas criadas e mantidas

pelo servidor Oracle� Contém informações sobre o banco de dados

Page 314: Oracle Sql PortuguêS

9-11 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

SELECT table_name FROM user_tables ;

SELECT *FROM user_catalog ;

Consultando o Dicionário de Dados

� Exiba tipos de objetos distintos de propriedade dousuário.

� Exiba tipos de objetos distintos de propriedade dousuário.

� Exiba tabelas, views, sinônimos e seqüências depropriedade do usuário.

� Exiba tabelas, views, sinônimos e seqüências depropriedade do usuário.

SELECT DISTINCT object_type FROM user_objects ;

� Veja os nomes de tabelas de propriedade do usuário.� Veja os nomes de tabelas de propriedade do usuário.

Page 315: Oracle Sql PortuguêS

9-12 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Tipos de DadosTipo de Dados Descrição

VARCHAR2(tamanho) Dados de caractere de comprimento variávelCHAR(tamanho) Dados de caractere de comprimento fixoNUMBER(p,s) Dados numéricos de comprimento variávelDATE Valores de data e horárioLONG Dados de caractere de comprimento variável

de até 2 gigabytesCLOB Dados de caractere de até 4 gigabytesRAW e LONG RAW Dados binários brutosBLOB Dados binários de até 4 gigabytesBFILE Dados binários armazenados em um arquivo

externo; até 4 gigabytesROWID Um sistema numérico de base 64 que

representa o endereço exclusivo de umalinha na tabela

Page 316: Oracle Sql PortuguêS

9-14 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Tipos de Dados de Data/Horário

Tipo de Dados DescriçãoTIMESTAMP Data com frações de segundoINTERVAL YEAR TO MONTH Armazenado como um intervalo

de anos e mesesINTERVAL DAY TO SECOND Armazenado como um intervalo

de dias, horas, minutos e segundos

Melhorias de data/horário no Oracle9i:� Foram introduzidos novos tipos de dados de

data/horário.� Está disponível um novo armazenamento de tipos

de dados.� Foram feitas melhorias nos fusos horários

e no fuso horário local.

Page 317: Oracle Sql PortuguêS

9-15 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Tipos de Dados de Data/Horário

� O tipo de dados TIMESTAMP é uma extensão do tipo dedados DATE.

� Ele armazena o ano, o mês e o dia do tipo de dadosDATE, além dos valores de horas, minutos e segundos,assim como o valor das frações de segundo.

� O tipo de dados TIMESTAMP é especificado da seguinteforma:

TIMESTAMP[(fractional_seconds_precision)]

Page 318: Oracle Sql PortuguêS

9-16 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Tipo de Dados TIMESTAMP WITH TIME ZONE

� TIMESTAMP WITH TIME ZONE é uma variante deTIMESTAMP que inclui um deslocamento de fusohorário em seu valor.

� O deslocamento de fuso horário é a diferença, emhoras e minutos, entre o horário local e o UTC("Coordinated Universal Time").

TIMESTAMP[(fractional_seconds_precision)]WITH TIME ZONE

Page 319: Oracle Sql PortuguêS

9-17 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Tipo de Dados TIMESTAMPWITH LOCAL TIME ZONE

� TIMESTAMP WITH LOCAL TIME ZONE é outra variantede TIMESTAMP que inclui um deslocamento de fusohorário em seu valor.

� Os dados armazenados no banco de dados sãonormalizados para o fuso horário do banco de dados.

� O deslocamento de fuso horário não é armazenadocomo parte dos dados das colunas; o Oracle retornaos dados no fuso horário local da sessão dos usuários.

� O tipo de dados TIMESTAMP WITH LOCAL TIME ZONEé especificado da seguinte forma:TIMESTAMP[(fractional_seconds_precision)]WITH LOCAL TIME ZONE

Page 320: Oracle Sql PortuguêS

9-18 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Tipo de Dados INTERVAL YEAR TO MONTH

� INTERVAL YEAR TO MONTH armazena um período detempo usando os campos de data/horário YEAR eMONTH.

INTERVAL YEAR [(year_precision)] TO MONTH

INTERVAL '123-2' YEAR(3) TO MONTHIndica um intervalo de 123 anos, 2 meses.

INTERVAL '123' YEAR(3)Indica um intervalo de 123 anos, 0 meses.

INTERVAL '300' MONTH(3)Indica um intervalo de 300 meses.

INTERVAL '123' YEARRetorna um erro, porque a precisão default é 2e '123' tem 3 dígitos.

Page 321: Oracle Sql PortuguêS

9-20 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Tipo de Dados INTERVAL DAY TO SECOND

� INTERVAL DAY TO SECOND armazena um período detempo em termos de dias, horas, minutos e segundos.

INTERVAL DAY [(day_precision)] TO SECOND [(fractional_seconds_precision)]

INTERVAL '4 5:12:10.222' DAY TO SECOND(3)Indica 4 dias, 5 horas, 12 minutos, 10 segundos e 222 milésimos de segundo.

INTERVAL '7' DAYIndica 7 dias.

INTERVAL '180' DAY(3) Indica 180 dias.

Page 322: Oracle Sql PortuguêS

9-21 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Tipo de Dados INTERVAL DAY TO SECOND

� INTERVAL DAY TO SECOND armazena um período detempo em termos de dias, horas, minutos e segundos.

INTERVAL '4 5:12:10.222' DAY TO SECOND(3)Indica 4 dias, 5 horas, 12 minutos, 10 segundos e 222 milésimos de segundo.

INTERVAL '4 5:12' DAY TO MINUTEIndica 4 dias, 5 horas e 12 minutos.

INTERVAL '400 5' DAY(3) TO HOURIndica 400 dias e 5 horas.

INTERVAL '11:12:10.2222222' HOUR TO SECOND(7)Indica 11 horas, 12 minutos e 10,2222222 segundos.

Page 323: Oracle Sql PortuguêS

9-22 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Criando uma Tabela Usandouma Sintaxe de Subconsulta

� Crie uma tabela e insira linhas combinando a instruçãoCREATE TABLE e a opção AS subconsulta.

� Estabeleça uma correspondência entre o número decolunas especificadas e o número de colunas dasubconsulta.

� Defina colunas com nomes de colunas e valoresdefault.

CREATE TABLE tabela [(coluna, coluna...)]AS subconsulta;

Page 324: Oracle Sql PortuguêS

9-23 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Criando uma Tabela Usando uma Subconsulta

DESCRIBE dept80

CREATE TABLE dept80 AS SELECT employee_id, last_name, salary*12 ANNSAL, hire_date FROM employees WHERE department_id = 80;Table created.Table created.

Page 325: Oracle Sql PortuguêS

9-24 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

A Instrução ALTER TABLE

Use a instrução ALTER TABLE para:� Adicionar uma nova coluna� Modificar uma coluna existente� Definir um valor default para a nova coluna� Eliminar uma coluna

Page 326: Oracle Sql PortuguêS

9-25 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

A Instrução ALTER TABLE

Use a instrução ALTER TABLE para adicionar, modificarou eliminar colunas.

ALTER TABLE tabelaADD (coluna tipo_de_dados [DEFAULT expr]

[,coluna tipo_de_dados]...);

ALTER TABLE tabelaMODIFY (coluna tipo_de_dados [DEFAULT expr]

[,coluna tipo_de_dados]...);

ALTER TABLE tabelaDROP (coluna);

Page 327: Oracle Sql PortuguêS

9-26 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Adicionando uma Coluna

DEPT80

"Adicioneuma novacoluna àtabelaDEPT80."

DEPT80

Nova coluna

Page 328: Oracle Sql PortuguêS

9-27 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Adicionando uma Coluna

� Use a cláusula ADD para adicionar colunas.

� A nova coluna torna-se a última coluna.

ALTER TABLE dept80ADD (job_id VARCHAR2(9));Table altered.Table altered.

Page 329: Oracle Sql PortuguêS

9-28 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Modificando uma Coluna

� Você pode alterar o tipo de dados, o tamanho e ovalor default de uma coluna.

� Uma alteração no valor default afeta somente asinserções subseqüentes na tabela.

ALTER TABLE dept80MODIFY (last_name VARCHAR2(30));Table altered.Table altered.

Page 330: Oracle Sql PortuguêS

9-29 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Eliminando uma Coluna

Use a cláusula DROP COLUMN para eliminar colunas quenão são mais necessárias na tabela.

ALTER TABLE dept80DROP COLUMN job_id; Table altered.Table altered.

Page 331: Oracle Sql PortuguêS

9-30 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

ALTER TABLE tabelaSET UNUSED (coluna);

ALTER TABLE tabelaSET UNUSED COLUMN coluna;

ALTER TABLE tabelaSET UNUSED (coluna);

ALTER TABLE tabelaSET UNUSED COLUMN coluna;

A Opção SET UNUSED

� Use a opção SET UNUSED para marcar uma ou maiscolunas como não usadas.

� Use a opção DROP UNUSED COLUMNS para remover ascolunas que estiverem marcadas como não usadas.

OU

ALTER TABLE tabelaDROP UNUSED COLUMNS;

ALTER TABLE tabelaDROP UNUSED COLUMNS;

Page 332: Oracle Sql PortuguêS

9-32 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Eliminando uma Tabela

� Todos os dados e a estrutura da tabela serãoexcluídos.

� Todas as transações pendentes sofrerão commit.� Todos os índices serão eliminados.� Você não pode fazer rollback da instrução DROP

TABLE.DROP TABLE dept80;Table dropped.Table dropped.

Page 333: Oracle Sql PortuguêS

9-33 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Alterando o Nome de um Objeto

� Para alterar o nome de uma tabela, view, seqüênciaou sinônimo, execute a instrução RENAME.

� Você deve ser o proprietário do objeto.

RENAME dept TO detail_dept;Table renamed.Table renamed.

Page 334: Oracle Sql PortuguêS

9-34 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Truncando uma Tabela

� A Instrução TRUNCATE TABLE:� Remove todas as linhas de uma tabela� Libera o espaço de armazenamento usado por

essa tabela

� Você não poderá fazer rollback da remoção de linhasquando usar TRUNCATE.

� Você também tem a opção de remover as linhasusando a instrução DELETE.

TRUNCATE TABLE detail_dept;Table truncated.Table truncated.

Page 335: Oracle Sql PortuguêS

9-35 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Adicionando Comentários a uma Tabela

� Você pode adicionar comentários a uma tabela oucoluna usando a instrução COMMENT.

� Os comentários podem ser exibidos através dasviews de dicionário de dados:– ALL_COL_COMMENTS

– USER_COL_COMMENTS

– ALL_TAB_COMMENTS

– USER_TAB_COMMENTS

COMMENT ON TABLE employeesIS 'Employee Information';Comment created.Comment created.

Page 336: Oracle Sql PortuguêS

9-36 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Resumo

Instrução Descrição

CREATE TABLE Cria uma tabela

ALTER TABLE Modifica a estrutura da tabela

DROP TABLE Remove as linhas e a estrutura da tabela

RENAME Altera o nome de uma tabela, view,seqüência ou sinônimo

TRUNCATE Remove todas as linhas de umatabela e libera o espaço de armazenamento

COMMENT Adiciona comentários a uma tabela ou view

Nesta lição, você aprendeu a usar instruções DDL paracriar, alterar, eliminar e renomear tabelas.

Page 337: Oracle Sql PortuguêS

9-38 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Visão Geral do Exercício 9

Este exercício abrange os seguintes tópicos:� Criando novas tabelas� Criando uma nova tabela usando a sintaxe CREATE

TABLE AS

� Modificando definições de coluna� Verificando se que as tabelas existem� Adicionando comentários às tabelas� Eliminando tabelas� Alterando tabelas

Page 338: Oracle Sql PortuguêS

10Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Incluindo Restrições

Page 339: Oracle Sql PortuguêS

10-2 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Objetivos

Após concluir esta lição, você poderá fazer o seguinte:� Descrever restrições� Criar e manter restrições

Page 340: Oracle Sql PortuguêS

10-3 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

O que São Restrições?

� As restrições impõem regras no nível da tabela.� As restrições evitam que uma tabela seja deletada

se houver dependências.� Os seguintes tipos de restrições são válidos:

– NOT NULL

– UNIQUE

– PRIMARY KEY

– FOREIGN KEY

– CHECK

Page 341: Oracle Sql PortuguêS

10-4 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Diretrizes sobre Restrições

� Dê um nome à restrição ou deixe o servidor Oraclegerar um nome usando o formato SYS_Cn.

� Crie uma restrição:� No momento em que a tabela for criada ou� Depois que a tabela tiver sido criada

� Defina uma restrição no nível da coluna ou da tabela.� Exiba uma restrição no dicionário de dados.

Page 342: Oracle Sql PortuguêS

10-5 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Definindo Restrições

CREATE TABLE [esquema.]tabela (coluna tipo_de_dados [DEFAULT expr]

[restrição_de_coluna],...[restrição_de_tabela][,...]);

CREATE TABLE employees( employee_id NUMBER(6), first_name VARCHAR2(20), ... job_id VARCHAR2(10) NOT NULL,

CONSTRAINT emp_emp_id_pk PRIMARY KEY (EMPLOYEE_ID));

Page 343: Oracle Sql PortuguêS

10-6 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Definindo Restrições

� Nível de restrição da coluna

� Nível de restrição da tabela

coluna [CONSTRAINT nome_da_restrição] tipo_de_restrição,coluna [CONSTRAINT nome_da_restrição] tipo_de_restrição,

coluna,... [CONSTRAINT nome_da_restrição] tipo_de_restrição (coluna, ...),

coluna,... [CONSTRAINT nome_da_restrição] tipo_de_restrição (coluna, ...),

Page 344: Oracle Sql PortuguêS

10-7 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

A Restrição NOT NULL

Assegura que não sejam permitidos valores nulos paraa coluna:

Restrição NOT NULL(Nenhuma linha podeconter um valor nulonesta coluna.)

Ausência da restriçãoNOT NULL (Qualquerlinha pode conterum valor nulo nestacoluna.)

RestriçãoNOT NULL

Page 345: Oracle Sql PortuguêS

10-8 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

CREATE TABLE employees( employee_id NUMBER(6), last_name VARCHAR2(25) NOT NULL, salary NUMBER(8,2), commission_pct NUMBER(2,2), hire_date DATE CONSTRAINT emp_hire_date_nn NOT NULL,...

A Restrição NOT NULL

É definida no nível da coluna:

Nomeadopelosistema

Nomeadopelousuário

Page 346: Oracle Sql PortuguêS

10-9 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

A Restrição UNIQUE

EMPLOYEESRestrição UNIQUE

INSERT INTO

Não permitido:já existe

Permitido

Page 347: Oracle Sql PortuguêS

10-10 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

A Restrição UNIQUE

Definida no nível da tabela ou da coluna:

CREATE TABLE employees( employee_id NUMBER(6), last_name VARCHAR2(25) NOT NULL, email VARCHAR2(25), salary NUMBER(8,2), commission_pct NUMBER(2,2), hire_date DATE NOT NULL,... CONSTRAINT emp_email_uk UNIQUE(email));

Page 348: Oracle Sql PortuguêS

10-11 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

A Restrição de PRIMARY KEYDEPARTMENTS

PRIMARY KEY

INSERT INTONão permitido(Valor nulo)

Não permitido(50 já existe)

Page 349: Oracle Sql PortuguêS

10-12 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

CREATE TABLE departments ( department_id NUMBER(4), department_name VARCHAR2(30) CONSTRAINT dept_name_nn NOT NULL, manager_id NUMBER(6), location_id NUMBER(4), CONSTRAINT dept_id_pk PRIMARY KEY(department_id));

A Restrição de PRIMARY KEY

Definida no nível da tabela ou da coluna:

Page 350: Oracle Sql PortuguêS

10-13 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

A Restrição de FOREIGN KEYDEPARTMENTS

EMPLOYEES

FOREIGNKEY

INSERT INTO

Não permitido(9 não existe)

Permitido

PRIMARYKEY �

Page 351: Oracle Sql PortuguêS

10-14 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

A Restrição de FOREIGN KEY

Definida no nível da tabela ou da coluna:CREATE TABLE employees( employee_id NUMBER(6), last_name VARCHAR2(25) NOT NULL, email VARCHAR2(25), salary NUMBER(8,2), commission_pct NUMBER(2,2), hire_date DATE NOT NULL,... department_id NUMBER(4), CONSTRAINT emp_dept_fk FOREIGN KEY (department_id) REFERENCES departments(department_id), CONSTRAINT emp_email_uk UNIQUE(email));

Page 352: Oracle Sql PortuguêS

10-15 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Palavras-chave da Restriçãode FOREIGN KEY

� FOREIGN KEY: define a coluna na tabela filha nonível de restrição da tabela.

� REFERENCES: identifica a tabela e a coluna natabela mãe.

� ON DELETE CASCADE: deleta as linhasdependentes da tabela filha quando uma linhada tabela mãe é deletada.

� ON DELETE SET NULL: converte valores dechave estrangeira dependentes em valores nulos.

Page 353: Oracle Sql PortuguêS

10-16 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

A Restrição CHECK

� Define uma condição que cada linha deve satisfazer� As expressões a seguir não são permitidas:

� Referências às pseudocolunas CURRVAL, NEXTVAL,LEVEL e ROWNUM

� Chamadas para as funções SYSDATE, UID, USER eUSERENV

� Consultas que se referem a outros valores emoutras linhas

..., salary NUMBER(2) CONSTRAINT emp_salary_min CHECK (salary > 0),...

Page 354: Oracle Sql PortuguêS

10-17 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Adicionando uma Sintaxe de Restrição

Use a instrução ALTER TABLE para:� Adicionar ou eliminar uma restrição sem modificar

sua estrutura� Ativar ou desativar restrições� Adicionar uma restrição NOT NULL usando a

cláusula MODIFY

ALTER TABLE tabela ADD [CONSTRAINT restrição] tipo (coluna);

ALTER TABLE tabela ADD [CONSTRAINT restrição] tipo (coluna);

Page 355: Oracle Sql PortuguêS

10-18 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Adicionando uma Restrição

Adicione uma restrição de FOREIGN KEY à tabelaEMPLOYEES indicando que já deve existir um gerentecomo um funcionário válido na tabela EMPLOYEES.ALTER TABLE employeesADD CONSTRAINT emp_manager_fk FOREIGN KEY(manager_id) REFERENCES employees(employee_id);Table altered.Table altered.

Page 356: Oracle Sql PortuguêS

10-19 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Eliminando uma Restrição

� Remova a restrição de gerente da tabelaEMPLOYEES.

� Remova a restrição de PRIMARY KEY databela DEPARTMENTS e elimine a restriçãode FOREIGN KEY associada da colunaEMPLOYEES.DEPARTMENT_ID.

ALTER TABLE employeesDROP CONSTRAINT emp_manager_fk;Table altered.

ALTER TABLE employeesDROP CONSTRAINT emp_manager_fk;Table altered.Table altered.

ALTER TABLE departmentsDROP PRIMARY KEY CASCADE;Table altered.

ALTER TABLE departmentsDROP PRIMARY KEY CASCADE;Table altered.Table altered.

Page 357: Oracle Sql PortuguêS

10-20 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Desativando Restrições

� Execute a cláusula DISABLE da instrução ALTERTABLE para desativar uma restrição de integridade.

� Aplique a opção CASCADE para desativar restriçõesde integridade dependentes.

ALTER TABLE employeesDISABLE CONSTRAINT emp_emp_id_pk CASCADE;Table altered.

ALTER TABLE employeesDISABLE CONSTRAINT emp_emp_id_pk CASCADE;Table altered.Table altered.

Page 358: Oracle Sql PortuguêS

10-21 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Ativando Restrições

� Ative uma restrição de integridade desativadano momento na definição da tabela, usando acláusula ENABLE.

� Um índice UNIQUE ou PRIMARY KEY seráautomaticamente criado se você ativar umarestrição de chave UNIQUE ou PRIMARY KEY.

ALTER TABLE employeesENABLE CONSTRAINT emp_emp_id_pk;Table altered.

ALTER TABLE employeesENABLE CONSTRAINT emp_emp_id_pk;Table altered.Table altered.

Page 359: Oracle Sql PortuguêS

10-22 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Restrições em Cascata

� A cláusula CASCADE CONSTRAINTS é usada emconjunto com a cláusula DROP COLUMN.

� A cláusula CASCADE CONSTRAINTS elimina todasas restrições de integridade referenciais queremetam às chaves exclusivas e primária definidasnas colunas eliminadas.

� A cláusula CASCADE CONSTRAINTS tambémelimina todas as restrições de várias colunasdefinidas nas colunas eliminadas.

Page 360: Oracle Sql PortuguêS

10-23 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Restrições em Cascata

Exemplo:

ALTER TABLE test1 DROP (pk) CASCADE CONSTRAINTS;Table altered.

ALTER TABLE test1 DROP (pk) CASCADE CONSTRAINTS;Table altered.Table altered.

ALTER TABLE test1 DROP (pk, fk, col1) CASCADE CONSTRAINTS;Table altered.

ALTER TABLE test1 DROP (pk, fk, col1) CASCADE CONSTRAINTS;Table altered.Table altered.

Page 361: Oracle Sql PortuguêS

10-24 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

SELECT constraint_name, constraint_type,search_condition

FROM user_constraintsWHERE table_name = 'EMPLOYEES';

Verificando Restrições

Consulte a tabela USER_CONSTRAINTS para ver todosos nomes e definições de restrições.

Page 362: Oracle Sql PortuguêS

10-25 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

SELECT constraint_name, column_nameFROM user_cons_columnsWHERE table_name = 'EMPLOYEES';

Verificando Colunas Associadas a Restrições

Veja as colunas associadas aos nomes de restriçõesna view USER_CONS_COLUMNS.

Page 363: Oracle Sql PortuguêS

10-26 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Resumo

Nesta lição, você aprendeu a criar restrições.� Tipos de restrições:

– NOT NULL

– UNIQUE

– PRIMARY KEY

– FOREIGN KEY

– CHECK

� Você pode consultar a tabela USER_CONSTRAINTSpara ver todos os nomes e definições de restrições.

Page 364: Oracle Sql PortuguêS

10-27 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Visão Geral do Exercício 10

Este exercício abrange os seguintes tópicos:� Adicionando restrições às tabelas existentes� Adicionando mais colunas a uma tabela� Exibindo informações nas views de dicionário de dados

Page 365: Oracle Sql PortuguêS

11Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Criando ViewsCriando Views

Page 366: Oracle Sql PortuguêS

11-2 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

ObjetivosObjetivos

Após concluir esta lição, você poderá fazer o seguinte:� Descrever uma view� Criar uma view, eliminá-la e alterar sua definição� Recuperar dados através de uma view� Inserir, atualizar e deletar dados através de uma view� Criar e usar uma view em linha� Executar a análise "Top-N"

Após concluir esta lição, você poderá fazer o seguinte:� Descrever uma view� Criar uma view, eliminá-la e alterar sua definição� Recuperar dados através de uma view� Inserir, atualizar e deletar dados através de uma view� Criar e usar uma view em linha� Executar a análise "Top-N"

Page 367: Oracle Sql PortuguêS

11-3 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Objetos de Banco de DadosObjetos de Banco de Dados

Descrição

Unidade básica de armazenamento,composta de linhas e colunas

Representa logicamente subconjuntosde dados de uma ou mais tabelas

Gera valores de chave primária

Melhora o desempenho de algumas consultas

Nome alternativo para um objeto

Objeto

Tabela

View

Seqüência

Índice

Sinônimo

Page 368: Oracle Sql PortuguêS

11-4 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

O que é uma View?O que é uma View?Tabela EMPLOYEES:

Page 369: Oracle Sql PortuguêS

11-5 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Por que Usar Views?Por que Usar Views?

� Para restringir o acesso a dados� Para facilitar as consultas complexas� Para permitir a independência dos dados� Para apresentar diferentes visualizações

dos mesmos dados

� Para restringir o acesso a dados� Para facilitar as consultas complexas� Para permitir a independência dos dados� Para apresentar diferentes visualizações

dos mesmos dados

Page 370: Oracle Sql PortuguêS

11-6 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Views Simples eViews ComplexasViews Simples e

Views Complexas

Recurso Views Simples Views Complexas

Número de tabelas Uma Uma ou mais

Contém funções Não Sim

Contém grupos de dados Não Sim

Operações DMLatravés de uma view Sim Nem sempre

Page 371: Oracle Sql PortuguêS

11-7 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Criando uma View

� Incorpore uma subconsulta na instrução CREATEVIEW.

� A subconsulta pode conter uma sintaxe SELECTcomplexa.

CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW view [(apelido[, apelido]...)] AS subconsulta[WITH CHECK OPTION [CONSTRAINT restrição]][WITH READ ONLY [CONSTRAINT restrição]];

CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW view [(apelido[, apelido]...)] AS subconsulta[WITH CHECK OPTION [CONSTRAINT restrição]][WITH READ ONLY [CONSTRAINT restrição]];

Page 372: Oracle Sql PortuguêS

11-8 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Criando uma View

� Crie uma view, EMPVU80, que contenha detalhes dosfuncionários do departamento 80.

� Descreva a estrutura da view usando o comandoDESCRIBE do iSQL*Plus.

DESCRIBE empvu80DESCRIBE empvu80

CREATE VIEW empvu80 AS SELECT employee_id, last_name, salary FROM employees WHERE department_id = 80;View created.View created.

Page 373: Oracle Sql PortuguêS

11-9 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Criando uma View

� Crie uma view usando apelidos de coluna nasubconsulta.

� Selecione as colunas nesta view pelos nomes deapelidos atribuídos.

CREATE VIEW salvu50 AS SELECT employee_id ID_NUMBER, last_name NAME, salary*12 ANN_SALARY FROM employees WHERE department_id = 50;View created.View created.

Page 374: Oracle Sql PortuguêS

11-10 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Recuperando Dados de uma ViewRecuperando Dados de uma View

SELECT *FROM salvu50;

Page 375: Oracle Sql PortuguêS

11-11 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Consultando uma ViewConsultando uma View

USER_VIEWSUSER_VIEWS EMPVU80EMPVU80SELECT employee_id, last_name, salaryFROM employeesWHERE department_id=80;

iSQL*Plus

SELECT *FROM empvu80;

EMPLOYEES

ServidorServidor Oracle Oracle

Page 376: Oracle Sql PortuguêS

11-12 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Modificando uma View

� Modifique a view EMPVU80 usando a cláusulaCREATE OR REPLACE VIEW. Adicione um apelidopara cada nome de coluna.

� Os apelidos de coluna na cláusula CREATE VIEWestão listados na mesma ordem que as colunasna subconsulta.

CREATE OR REPLACE VIEW empvu80 (id_number, name, sal, department_id)AS SELECT employee_id, first_name || ' ' || last_name, salary, department_id FROM employees WHERE department_id = 80;View created.View created.

Page 377: Oracle Sql PortuguêS

11-13 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Criando uma View Complexa

Crie uma view complexa que contenha funções de grupopara exibir os valores de duas tabelas.

CREATE VIEW dept_sum_vu (name, minsal, maxsal, avgsal)AS SELECT d.department_name, MIN(e.salary), MAX(e.salary),AVG(e.salary) FROM employees e, departments d WHERE e.department_id = d.department_id GROUP BY d.department_name;View created.View created.

Page 378: Oracle Sql PortuguêS

11-14 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Regras para ExecutarOperações DML em uma View

� Você poderá executar operações DML em viewssimples.

� Você não poderá remover uma linha se a view contiver:� Funções de grupo� Uma cláusula GROUP BY� A palavra-chave DISTINCT� A palavra-chave ROWNUM da pseudocoluna

Page 379: Oracle Sql PortuguêS

11-15 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Regras para ExecutarOperações DML em uma View

Você não poderá modificar dados em uma view se elacontiver:� Funções de grupo� Uma cláusula GROUP BY� A palavra-chave DISTINCT� A palavra-chave ROWNUM da pseudocoluna� Colunas definidas por expressões

Page 380: Oracle Sql PortuguêS

11-16 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Regras para ExecutarOperações DML em uma View

Não será possível adicionar dados através de umaview se ela incluir:� Funções de grupo� Uma cláusula GROUP BY� A palavra-chave DISTINCT� A palavra-chave ROWNUM da pseudocoluna� Colunas definidas por expressões� Colunas NOT NULL nas tabelas-base que não sejam

selecionadas pela view

Page 381: Oracle Sql PortuguêS

11-17 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

� Você pode garantir que as operações DMLexecutadas na view permaneçam no domínio daview usando a cláusula WITH CHECK OPTION.

� Qualquer tentativa de alterar o número dedepartamento em qualquer linha da view resultaráem falha porque será violada a restrição WITH CHECKOPTION.

CREATE OR REPLACE VIEW empvu20AS SELECT * FROM employees WHERE department_id = 20 WITH CHECK OPTION CONSTRAINT empvu20_ck ;View created.View created.

Usando a Cláusula WITH CHECK OPTION

Page 382: Oracle Sql PortuguêS

11-19 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Negando Operações DML

� Você pode assegurar que nenhuma operação DMLocorra adicionando a opção WITH READ ONLY àdefinição de view.

� Qualquer tentativa de executar uma operação DMLem uma linha da view resultará em erro no servidorOracle.

Page 383: Oracle Sql PortuguêS

11-20 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Negando Operações DML

CREATE OR REPLACE VIEW empvu10 (employee_number, employee_name, job_title)AS SELECT employee_id, last_name, job_id FROM employees WHERE department_id = 10 WITH READ ONLY;View created.View created.

Page 384: Oracle Sql PortuguêS

11-21 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Removendo uma ViewRemovendo uma View

Você pode remover uma view sem perder dados porqueela se baseia em tabelas subjacentes no banco de dados.Você pode remover uma view sem perder dados porqueela se baseia em tabelas subjacentes no banco de dados.

DROP VIEW empvu80;View dropped.View dropped.

DROP VIEW view;DROP VIEW view;

Page 385: Oracle Sql PortuguêS

11-22 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Views em LinhaViews em Linha

� Uma view em linha é uma subconsulta com umapelido (ou nome de correlação) que pode serusada em uma instrução SQL.

� Uma subconsulta com um determinado nome nacláusula FROM da consulta principal é um exemplode view em linha.

� Uma view em linha não é um objeto de esquema.

� Uma view em linha é uma subconsulta com umapelido (ou nome de correlação) que pode serusada em uma instrução SQL.

� Uma subconsulta com um determinado nome nacláusula FROM da consulta principal é um exemplode view em linha.

� Uma view em linha não é um objeto de esquema.

Page 386: Oracle Sql PortuguêS

11-24 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Análise Top-N

� As consultas Top-N procuram os n maiores oumenores valores de uma coluna. Por exemplo:� Quais são os dez produtos mais vendidos?� Quais são os dez produtos menos vendidos?

� Tanto o conjunto dos maiores como o dos menoresvalores são considerados consultas Top-N.

Page 387: Oracle Sql PortuguêS

11-25 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Executando a Análise Top-N

A estrutura de nível superior de uma consulta de análise"Top-N" é:SELECT [lista_de_colunas], ROWNUM FROM (SELECT [lista_de_colunas] FROM tabela ORDER BY coluna_Top-N)WHERE ROWNUM <= N;

SELECT [lista_de_colunas], ROWNUM FROM (SELECT [lista_de_colunas] FROM tabela ORDER BY coluna_Top-N)WHERE ROWNUM <= N;

Page 388: Oracle Sql PortuguêS

11-26 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Exemplo de Análise Top-NExemplo de Análise Top-N

Para exibir os nomes e os salários dos três funcionáriosmais bem remunerados da tabela EMPLOYEES:Para exibir os nomes e os salários dos três funcionáriosmais bem remunerados da tabela EMPLOYEES:

SELECT ROWNUM as RANK, last_name, salary FROM (SELECT last_name,salary FROM employees ORDER BY salary DESC)WHERE ROWNUM <= 3;

31 2

1 2 3

Page 389: Oracle Sql PortuguêS

11-27 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Resumo

Nesta lição, você aprendeu que uma view é derivada dosdados contidos em outras tabelas ou views e oferece asseguintes vantagens:� Restringe o acesso a bancos de dados� Simplifica as consultas� Permite a independência dos dados� Proporciona várias visualizações dos mesmos dados� Pode ser eliminada sem remover os dados subjacentes� Uma view em linha é uma subconsulta com um nome

apelido� Pode-se efetuar uma análise "Top-N" usando

subconsultas e consultas externas

Page 390: Oracle Sql PortuguêS

11-28 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Visão Geral do Exercício 11

Este exercício abrange os seguintes tópicos:� Criando uma view simples� Criando uma view complexa� Criando uma view com restrição de verificação� Tentando modificar dados na view� Exibindo definições de view� Removendo views

Page 391: Oracle Sql PortuguêS

12Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Outros Objetos de Banco de Dados

Page 392: Oracle Sql PortuguêS

12-2 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Objetivos

Após concluir esta lição, você poderá fazero seguinte:� Criar, manter e usar seqüências� Criar e manter índices� Criar sinônimos privados e públicos

Page 393: Oracle Sql PortuguêS

12-3 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Objetos de Banco de DadosObjetos de Banco de Dados

Objeto Descrição

Unidade básica de armazenamento, composta de linhas e colunas

Representa logicamente subconjuntos de dadosde uma ou mais tabelas

Nome alternativo para um objeto

Melhora o desempenho de algumas consultas

Gera valores de chave primária

Sinônimo

Índice

Seqüência

View

Tabela

Page 394: Oracle Sql PortuguêS

12-4 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

O que é uma Seqüência?

Uma seqüência:� Gera números exclusivos automaticamente� É um objeto compartilhável� É geralmente usada para criar um valor de chave

primária� Substitui o código de aplicação� Acelera a eficácia do acesso a valores de

seqüência quando estão no cache na memória

Page 395: Oracle Sql PortuguêS

12-5 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

A Sintaxe da Instrução CREATE SEQUENCE

Defina uma seqüência para gerar números seqüenciaisautomaticamente:

CREATE SEQUENCE seqüência [INCREMENT BY n] [START WITH n] [{MAXVALUE n | NOMAXVALUE}] [{MINVALUE n | NOMINVALUE}] [{CYCLE | NOCYCLE}] [{CACHE n | NOCACHE}];

CREATE SEQUENCE seqüência [INCREMENT BY n] [START WITH n] [{MAXVALUE n | NOMAXVALUE}] [{MINVALUE n | NOMINVALUE}] [{CYCLE | NOCYCLE}] [{CACHE n | NOCACHE}];

Page 396: Oracle Sql PortuguêS

12-7 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Criando uma Seqüência

� Crie uma seqüência denominada DEPT_DEPTID_SEQpara ser usada na chave primária da tabelaDEPARTMENTS.

� Não use a opção CYCLE.

CREATE SEQUENCE dept_deptid_seq INCREMENT BY 10 START WITH 120 MAXVALUE 9999 NOCACHE NOCYCLE;Sequence created.

CREATE SEQUENCE dept_deptid_seq INCREMENT BY 10 START WITH 120 MAXVALUE 9999 NOCACHE NOCYCLE;Sequence created.Sequence created.

Page 397: Oracle Sql PortuguêS

12-8 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Confirmando Seqüências

� Verifique seus valores de seqüência na tabela dedicionário de dados USER_SEQUENCES.

� A coluna LAST_NUMBER exibirá o próximo númerode seqüência disponível se NOCACHE forespecificado.

SELECT sequence_name, min_value, max_value, increment_by, last_number

FROM user_sequences;

SELECT sequence_name, min_value, max_value, increment_by, last_number

FROM user_sequences;

Page 398: Oracle Sql PortuguêS

12-9 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Pseudocolunas NEXTVAL e CURRVAL

� NEXTVAL retorna o próximo valor de seqüênciadisponível. Ela retorna um valor exclusivo sempreque é feita referência a ela, até mesmo paradiferentes usuários.

� CURRVAL obtém o valor de seqüência atual.� NEXTVAL deve ser emitido para a seqüência

antes que CURRVAL contenha um valor.

Page 399: Oracle Sql PortuguêS

12-11 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Usando uma Seqüência

� Insira um novo departamento denominado"Support" no ID de local 2500.

� Exiba o valor atual da seqüência DEPT_DEPTID_SEQ.

INSERT INTO departments(department_id, department_name, location_id)VALUES (dept_deptid_seq.NEXTVAL, 'Support', 2500);1 row created.

INSERT INTO departments(department_id, department_name, location_id)VALUES (dept_deptid_seq.NEXTVAL, 'Support', 2500);1 row created.1 row created.

SELECT dept_deptid_seq.CURRVALFROM dual;

SELECT dept_deptid_seq.CURRVALFROM dual;

Page 400: Oracle Sql PortuguêS

12-12 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Usando uma Seqüência

� Se os valores de seqüência forem armazenados nocache na memória, o acesso a eles será mais rápido.

� Podem ocorrer intervalos em valores de seqüênciaquando:� Ocorre um rollback� Ocorre uma falha no sistema� Uma seqüência é usada em outra tabela

� Se a seqüência tiver sido criada com NOCACHE, exibao próximo valor disponível, consultando a tabelaUSER_SEQUENCES.

Page 401: Oracle Sql PortuguêS

12-13 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Modificando uma Seqüência

Altere o valor de incremento, o valor máximo, o valormínimo, a opção de ciclo ou a opção de cache.

ALTER SEQUENCE dept_deptid_seq INCREMENT BY 20 MAXVALUE 999999 NOCACHE NOCYCLE;Sequence altered.

ALTER SEQUENCE dept_deptid_seq INCREMENT BY 20 MAXVALUE 999999 NOCACHE NOCYCLE;Sequence altered.Sequence altered.

Page 402: Oracle Sql PortuguêS

12-14 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Diretrizes para Modificar uma Seqüência

� Você deve ser o proprietário ou ter o privilégioALTER referente à seqüência.

� Somente os números de seqüência futuros sãoafetados.

� A seqüência deve ser eliminada e recriada paraque seja reiniciada em um número diferente.

� Um certo grau de validação é executado.

Page 403: Oracle Sql PortuguêS

12-15 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Removendo uma Seqüência

� Remova uma seqüência do dicionário de dadosusando a instrução DROP SEQUENCE.

� Após remover a seqüência, você não poderá maisfazer referência a ela.

DROP SEQUENCE dept_deptid_seq;Sequence dropped.

DROP SEQUENCE dept_deptid_seq;Sequence dropped.Sequence dropped.

Page 404: Oracle Sql PortuguêS

12-16 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

O que é um Índice?

Um índice:� É um objeto de esquema� É usado pelo servidor Oracle para acelerar a

recuperação de linhas usando um ponteiro� Pode reduzir a E/S do disco usando um método

de acesso rápido a caminhos a fim de localizaros dados rapidamente

� É independente da tabela que indexa� É usado e mantido automaticamente pelo

servidor Oracle

Page 405: Oracle Sql PortuguêS

12-17 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Como os Índices São Criados?

� Automaticamente: um índice exclusivo é criadoautomaticamente quando você define umarestrição de PRIMARY KEY ou UNIQUE KEY emuma definição de tabela.

� Manualmente: os usuários podem criar índicesnão exclusivos em colunas para acelerar o acessoàs linhas.

Page 406: Oracle Sql PortuguêS

12-18 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Criando um Índice

� Crie um índice em uma ou mais colunas.

� Aumente a velocidade de acesso de consulta àcoluna LAST_NAME da tabela EMPLOYEES.

CREATE INDEX emp_last_name_idxON employees(last_name);Index created.

CREATE INDEX emp_last_name_idxON employees(last_name);Index created.Index created.

CREATE INDEX índiceON tabela (coluna[, coluna]...);

CREATE INDEX índiceON tabela (coluna[, coluna]...);

Page 407: Oracle Sql PortuguêS

12-19 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Quando Criar um Índice

Você deverá criar um índice se:� Uma coluna contiver uma ampla faixa de valores� Uma coluna contiver um grande número de

valores nulos� Uma ou mais colunas forem usadas juntas com

freqüência em uma cláusula WHERE ou em umacondição de junção

� A tabela for grande e a expectativa for de quea maioria das consultas recuperará menos que2 a 4% das linhas

Page 408: Oracle Sql PortuguêS

12-20 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Quando Não Criar um Índice

Geralmente, não será vantajoso criar um índice se:� A tabela for pequena� As colunas não forem utilizadas com freqüência

como uma condição na consulta� A expectativa for de que a maioria das consultas

recuperará mais que 2 a 4% das linhas da tabela� A tabela for atualizada com freqüência� Forem feitas referências às colunas indexadas

como parte de uma expressão

Page 409: Oracle Sql PortuguêS

12-21 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

SELECT ic.index_name, ic.column_name,ic.column_position col_pos,ix.uniqueness

FROM user_indexes ix, user_ind_columns icWHERE ic.index_name = ix.index_nameAND ic.table_name = 'EMPLOYEES';

Confirmando Índices

� A view de dicionário de dados USER_INDEXEScontém o nome do índice e sua exclusividade.

� A view USER_IND_COLUMNS contém os nomesdo índice, da tabela e da coluna.

Page 410: Oracle Sql PortuguêS

12-22 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Índices Baseados em Função

� Um índice baseado em função é aquele que sebaseia em expressões.

� Uma expressão de índice é elaborada a partir decolunas de tabela, constantes, funções SQL efunções definidas pelo usuário.

CREATE INDEX upper_dept_name_idxON departments(UPPER(department_name));

Index created.

SELECT * FROM departmentsWHERE UPPER(department_name) = 'SALES';

Page 411: Oracle Sql PortuguêS

12-23 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Removendo um Índice

� Remova um índice do dicionário de dadosusando o comando DROP INDEX.

� Remova o índice UPPER_LAST_NAME_IDXdo dicionário de dados.

� Para eliminar um índice, você deve ser oproprietário do índice ou ter o privilégioDROP ANY INDEX.

DROP INDEX upper_last_name_idx;Index dropped.

DROP INDEX upper_last_name_idx;Index dropped.Index dropped.

DROP INDEX índice;DROP INDEX índice;

Page 412: Oracle Sql PortuguêS

12-24 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Sinônimos

Simplifique o acesso aos objetos criando um sinônimo(outro nome para um objeto). Com os sinônimos, vocêpode:� Referir-se facilmente a uma tabela de propriedade

de outro usuário� Abreviar nomes de objeto longos

CREATE [PUBLIC] SYNONYM sinônimoFOR objeto;

CREATE [PUBLIC] SYNONYM sinônimoFOR objeto;

Page 413: Oracle Sql PortuguêS

12-25 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Criando e Removendo Sinônimos

� Crie um nome abreviado para a viewDEPT_SUM_VU.

� Elimine um sinônimo.

CREATE SYNONYM d_sumFOR dept_sum_vu;Synonym Created.

CREATE SYNONYM d_sumFOR dept_sum_vu;Synonym Created.Synonym Created.

DROP SYNONYM d_sum;Synonym dropped.

DROP SYNONYM d_sum;Synonym dropped.Synonym dropped.

Page 414: Oracle Sql PortuguêS

12-26 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Resumo

Nesta lição, você aprendeu a:� Gerar números de seqüência automaticamente

usando um gerador de seqüência� Exibir informações sobre seqüências na tabela

de dicionário de dados USER_SEQUENCES� Criar índices para melhorar a velocidade de

recuperação da consulta� Exibir informações sobre índices na tabela

de dicionário USER_INDEXES� Usar sinônimos para criar nomes alternativos

de objetos

Page 415: Oracle Sql PortuguêS

12-28 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Visão Geral do Exercício 12

Este exercício abrange os seguintes tópicos:� Criando seqüências� Usando seqüências� Criando índices não-exclusivos� Exibindo informações do dicionário de dados

sobre seqüências e índices� Eliminando índices

Page 416: Oracle Sql PortuguêS

13Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Controlando o Acesso do Usuário

Page 417: Oracle Sql PortuguêS

13-2 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Objetivos

Após concluir esta lição, você poderá fazer o seguinte:� Criar usuários� Criar funções para facilitar a configuração e

manutenção do modelo de segurança� Usar as instruções GRANT e REVOKE para conceder

e revogar privilégios de objeto� Criar e acessar vínculos de banco de dados

Page 418: Oracle Sql PortuguêS

13-3 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Controlando o Acesso do UsuárioControlando o Acesso do Usuário

Administrador debanco de dados

Usuários

Nome de usuário e senhaPrivilégios

Page 419: Oracle Sql PortuguêS

13-4 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Privilégios

� Segurança de banco de dados:� Segurança de sistema� Segurança de dados

� Privilégios de sistema: obtendo acesso ao bancode dados

� Privilégios de objeto: manipulando o conteúdodos objetos de banco de dados

� Esquemas: coleções de objetos, como tabelas,views e seqüências

Page 420: Oracle Sql PortuguêS

13-5 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Privilégios de Sistema

� Há mais de 100 privilégios disponíveis.� O administrador de banco de dados tem privilégios

de sistema de alto nível para tarefas como:� Criar novos usuários� Remover usuários� Remover tabelas� Fazer backup de tabelas

Page 421: Oracle Sql PortuguêS

13-6 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Criando Usuários

O DBA cria usuários utilizando a instrução CREATE USER.

CREATE USER scottIDENTIFIED BY tiger;User created.

CREATE USER scottIDENTIFIED BY tiger;User created.User created.

CREATE USER usuário IDENTIFIED BY senha;

Page 422: Oracle Sql PortuguêS

13-7 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Privilégios de Sistema do Usuário

� Quando o usuário é criado, o DBA pode conceder aele privilégios de sistema específicos.

� Por exemplo, um desenvolvedor de aplicações podeter os seguintes privilégios de sistema:– CREATE SESSION

– CREATE TABLE

– CREATE SEQUENCE

– CREATE VIEW

– CREATE PROCEDURE

GRANT privilégio [, privilégio...]TO usuário [, usuário| atribuição, PUBLIC...];

GRANT privilégio [, privilégio...]TO usuário [, usuário| atribuição, PUBLIC...];

Page 423: Oracle Sql PortuguêS

13-8 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Concedendo Privilégios de Sistema

O DBA pode conceder a um usuário privilégios desistema específicos.

GRANT create session, create table, create sequence, create viewTO scott;Grant succeeded.

GRANT create session, create table, create sequence, create viewTO scott;Grant succeeded.Grant succeeded.

Page 424: Oracle Sql PortuguêS

13-9 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

O que é uma Atribuição?O que é uma Atribuição?

Alocando privilégiossem uma atribuição

Alocando privilégioscom uma atribuição

Privilégios

Usuários

Gerente

Page 425: Oracle Sql PortuguêS

13-10 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Criando e ConcedendoPrivilégios a uma Atribuição

Criando e ConcedendoPrivilégios a uma Atribuição

CREATE ROLE manager;Role created.

CREATE ROLE manager;Role created.Role created.

GRANT create table, create view TO manager; Grant succeeded.

GRANT create table, create view TO manager; Grant succeeded.Grant succeeded.

GRANT manager TO DEHAAN, KOCHHAR; Grant succeeded.

GRANT manager TO DEHAAN, KOCHHAR; Grant succeeded.Grant succeeded.

� Criar uma atribuição

� Conceder privilégios a uma atribuição

� Conceder uma atribuição aos usuários

Page 426: Oracle Sql PortuguêS

13-11 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Alterando sua Senha

� O DBA cria a sua conta de usuário e inicializa asua senha.

� Você pode alterar sua senha usando a instruçãoALTER USER.

ALTER USER scott IDENTIFIED BY lion;User altered.User altered.

Page 427: Oracle Sql PortuguêS

13-12 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Privilégio de Objeto Tabela View Seqüência Procedimento

ALTER √√√√ √√√√

DELETE √√√√ √√√√

EXECUTE √√√√

INDEX √√√√

INSERT √√√√ √√√√

REFERENCES √√√√ √√√√

SELECT √√√√ √√√√ √√√√

UPDATE √√√√ √√√√

Privilégios de ObjetoPrivilégios de Objeto

Page 428: Oracle Sql PortuguêS

13-13 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Privilégios de Objeto

� Os privilégios variam de um objeto para outro.� Um proprietário tem todos os privilégios sobre

o objeto.� Um proprietário pode conceder privilégios

específicos sobre seus objetos.

GRANT priv_objeto [(colunas)] ON objeto TO {usuário|atribuição|PUBLIC} [WITH GRANT OPTION];

GRANT priv_objeto [(colunas)] ON objeto TO {usuário|atribuição|PUBLIC} [WITH GRANT OPTION];

Page 429: Oracle Sql PortuguêS

13-14 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Concedendo Privilégios de Objeto

� Conceder privilégios de consulta na tabela EMPLOYEES

� Conceder aos usuários e atribuições privilégios paraatualizar colunas específicas

GRANT selectON employeesTO sue, rich;Grant succeeded.

GRANT selectON employeesTO sue, rich;Grant succeeded.Grant succeeded.

GRANT update (department_name, location_id)ON departmentsTO scott, manager;Grant succeeded.

GRANT update (department_name, location_id)ON departmentsTO scott, manager;Grant succeeded.Grant succeeded.

Page 430: Oracle Sql PortuguêS

13-15 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Usando as Palavras-ChaveWITH GRANT OPTION e PUBLIC

� Dar autoridade a um usuário para repassar osprivilégios

� Permitir que todos os usuários do sistemaconsultem dados na tabela DEPARTMENTS de Alice

GRANT select, insertON departmentsTO scottWITH GRANT OPTION;Grant succeeded.

GRANT select, insertON departmentsTO scottWITH GRANT OPTION;Grant succeeded.Grant succeeded.

GRANT selectON alice.departmentsTO PUBLIC;Grant succeeded.

GRANT selectON alice.departmentsTO PUBLIC;Grant succeeded.Grant succeeded.

Page 431: Oracle Sql PortuguêS

13-16 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Confirmando Privilégios ConcedidosConfirmando Privilégios ConcedidosView de Dicionário de Dados DescriçãoROLE_SYS_PRIVS Privilégios de sistema concedidos

a atribuiçõesROLE_TAB_PRIVS Privilégios de tabela concedidos

a atribuiçõesUSER_ROLE_PRIVS Atribuições acessíveis ao usuárioUSER_TAB_PRIVS_MADE Privilégios de objeto concedidos

sobre os objetos do usuárioUSER_TAB_PRIVS_RECD Privilégios de objeto concedidos ao

usuárioUSER_COL_PRIVS_MADE Privilégios de objeto concedidos

sobre as colunas dos objetos dousuário

USER_COL_PRIVS_RECD Privilégios de objeto concedidos aousuário sobre colunas específicas

USER_SYS_PRIVS Lista os privilégios de sistema concedidos ao usuário

Page 432: Oracle Sql PortuguêS

13-17 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Como Revogar Privilégios de Objeto

� Use a instrução REVOKE para revogar os privilégiosconcedidos a outros usuários.

� Os privilégios concedidos a outros usuários pormeio da cláusula WITH GRANT OPTION tambémserão revogados.

REVOKE {privilégio [, privilégio...]|ALL}ON objetoFROM {usuário[, usuário...]|atribuição|PUBLIC}[CASCADE CONSTRAINTS];

REVOKE {privilégio [, privilégio...]|ALL}ON objetoFROM {usuário[, usuário...]|atribuição|PUBLIC}[CASCADE CONSTRAINTS];

Page 433: Oracle Sql PortuguêS

13-18 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Revogando Privilégios de Objeto

No papel da usuária Alice, revogue os privilégiosSELECT e INSERT concedidos ao usuário Scott natabela DEPARTMENTS.

REVOKE select, insertON departmentsFROM scott;Revoke succeeded.

REVOKE select, insertON departmentsFROM scott;Revoke succeeded.Revoke succeeded.

Page 434: Oracle Sql PortuguêS

13-19 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Vínculos de Banco de Dados

Uma conexão de vínculo de banco de dados permiteque os usuários locais acessem dados em um bancode dados remoto.

Local Remoto

SELECT * FROMemp@HQ_ACME.COM;

Banco de dadosHQ_ACME.COM

Tabela EMP

Page 435: Oracle Sql PortuguêS

13-21 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Vínculos de Banco de Dados

� Criar o vínculo de banco de dados

� Criar instruções SQL que utilizem o vínculo debanco de dados

CREATE PUBLIC DATABASE LINK hq.acme.com USING 'sales';Database link created.

CREATE PUBLIC DATABASE LINK hq.acme.com USING 'sales';Database link created.

SELECT * FROM [email protected];

SELECT * FROM [email protected];

Page 436: Oracle Sql PortuguêS

13-22 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

ResumoResumo

Instrução AçãoCREATE USER Cria um usuário (geralmente executada por

um DBA)GRANT Concede a outros usuários privilégios para

acessar objetosCREATE ROLE Cria um conjunto de privilégios (geralmente

executada por um DBA)ALTER USER Altera a senha de um usuárioREVOKE Remove dos usuários os privilégios

referentes a um objeto

Nesta lição, você aprendeu detalhes sobre as instruçõesDCL que controlam o acesso ao banco de dados e aosrespectivos objetos:

Page 437: Oracle Sql PortuguêS

13-23 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Visão Geral do Exercício 13

Este exercício abrange os seguintes tópicos:� Concedendo a outros usuários privilégios sobre

uma tabela� Modificando a tabela de outro usuário através de

privilégios concedidos a você� Criando um sinônimo� Consultando as views de dicionário de dados

relacionadas aos privilégios

Page 438: Oracle Sql PortuguêS

14Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

SQL Workshop

Page 439: Oracle Sql PortuguêS

14-2 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Visão Geral do Workshop

Este workshop abrange:� Criação de tabelas e de seqüências� Modificação de dados nas tabelas� Modificação de definições de tabelas� Criação de views� Criação de scripts que contenham comandos SQL

e iSQL*Plus� Geração de um relatório simples

Page 440: Oracle Sql PortuguêS

15Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Usando Operadores SET

Page 441: Oracle Sql PortuguêS

15-2 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Objetivos

Após concluir esta lição, você poderá fazer o seguinte:� Descrever os operadores SET� Usar um operador SET para combinar várias consultas

em uma consulta simples� Controlar a ordem das linhas retornadas

Page 442: Oracle Sql PortuguêS

15-3 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Os Operadores SETA B

UNION/UNION ALL

A B

A B

INTERSECT

A B

MINUS

Page 443: Oracle Sql PortuguêS

15-4 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Tabelas Usadas nesta Lição

As tabelas usadas nesta lição são:� EMPLOYEES: fornece os detalhes relativos a todos os

funcionários atuais� JOB_HISTORY: registra os detalhes da data inicial e

da data final do cargo anterior, além do número deidentificação do cargo e do departamento, quandoum funcionário muda de cargo

Page 444: Oracle Sql PortuguêS

15-7 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

O Operador UNION

OO operador operador UNIONUNION retorna resultadosretorna resultados de de duas duas consultasconsultasapapós eliminar duplicaós eliminar duplicaççõesões..

A B

Page 445: Oracle Sql PortuguêS

15-8 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Usando o Operador UNION

Exiba os detalhes dos cargos anterior e atual de todos osfuncionários. Exiba cada funcionário somente uma vez.SELECT employee_id, job_idFROM employeesUNIONSELECT employee_id, job_idFROM job_history;

��

Page 446: Oracle Sql PortuguêS

15-10 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

O Operador UNION ALLA B

O operador UNION ALL retorna resultados das duasconsultas, incluindo todas as duplicações.OO operador operador UNION ALLUNION ALL retorna resultados das duasretorna resultados das duasconsultasconsultas,, incluindo todas incluindo todas as as duplica duplicaççõesões..

Page 447: Oracle Sql PortuguêS

15-11 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Usando o Operador UNION ALL

Exiba os departamentos anterior e atual de todos osfuncionários.SELECT employee_id, job_id, department_idFROM employeesUNION ALLSELECT employee_id, job_id, department_idFROM job_history ORDER BY employee_id;

Page 448: Oracle Sql PortuguêS

15-12 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

O Operador INTERSECT

A B

Page 449: Oracle Sql PortuguêS

15-13 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Usando o Operador INTERSECT

Exiba os IDs de funcionário e os IDs de cargo dosfuncionários com o mesmo cargo que ocupavam antesdo início do período de permanência na empresa.

SELECT employee_id, job_idFROM employeesINTERSECTSELECT employee_id, job_idFROM job_history;

Page 450: Oracle Sql PortuguêS

15-14 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

O Operador MINUS

A B

Page 451: Oracle Sql PortuguêS

15-15 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

O Operador MINUS

Exiba os IDs dos funcionários que nunca mudaram decargo.Exiba osExiba os IDs dos IDs dos funcion funcionários que nunca mudaramários que nunca mudaram de decargo.cargo.SELECT employee_id,job_idFROM employeesMINUSSELECT employee_id,job_idFROM job_history;

Page 452: Oracle Sql PortuguêS

15-16 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Diretrizes do Operador SET

� As expressões nas listas SELECT devem corresponderem número e tipo de dados.

� É possível usar parênteses para alterar a seqüência deexecução.

� A cláusula ORDER BY:� Pode aparecer somente no final da instrução� Aceitará o nome da coluna, os apelidos da primeira

instrução SELECT ou a notação posicional

Page 453: Oracle Sql PortuguêS

15-17 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

O Oracle Server e os Operadores SET

� As linhas duplicadas são eliminadas automaticamente,exceto em UNION ALL.

� Os nomes das colunas na primeira consulta aparecemno resultado.

� A saída é classificada em ordem crescente por default,exceto em UNION ALL.

Page 454: Oracle Sql PortuguêS

15-18 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Correspondendo às Instruções SELECTCom oCom o operador operador UNIONUNION, s, são exibidosão exibidos o ID do o ID do departamento departamento,,o local e a data deo local e a data de admiss admissãoão de de todos os funcion todos os funcionáriosários..SELECT department_id, TO_NUMBER(null) location, hire_dateFROM employeesUNIONSELECT department_id, location_id, TO_DATE(null)FROM departments;

Page 455: Oracle Sql PortuguêS

15-19 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Correspondendo à Instrução SELECT

� Com o operador UNION, são exibidos o ID defuncionário, o ID de cargo e o salário de todosos funcionários.

SELECT employee_id, job_id,salaryFROM employeesUNIONSELECT employee_id, job_id,0FROM job_history;

Page 456: Oracle Sql PortuguêS

15-20 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Controlando a Ordem das Linhas

Produza uma frase em inglês com dois operadores UNION.COLUMN a_dummy NOPRINTSELECT 'sing' AS "My dream", 3 a_dummyFROM dualUNIONSELECT 'I''d like to teach', 1FROM dualUNIONSELECT 'the world to', 2FROM dualORDER BY 2;

Page 457: Oracle Sql PortuguêS

15-21 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Resumo

Nesta lição, você aprendeu a:� Usar UNION para retornar todas as linhas distintas� Usar UNION ALL para retornar todas as linhas,

incluindo as linhas duplicadas� Usar INTERSECT para retornar todas as linhas

compartilhadas pelas duas consultas� Usar MINUS para retornar todas as linhas distintas

selecionadas pela primeira consulta, mas não pelasegunda

� Usar ORDER BY somente no final da instrução

Page 458: Oracle Sql PortuguêS

15-22 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Visão Geral do Exercício 15

Este exercício abrange o uso das funções de data/horáriodo Oracle9i.

Page 459: Oracle Sql PortuguêS

16Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Funções de Data/Horário do Oracle9i

Page 460: Oracle Sql PortuguêS

16-2 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

ObjetivosApós concluir esta lição, você poderá usar as seguintesfunções de data/horário:� TZ_OFFSET

� CURRENT_DATE

� CURRENT_TIMESTAMP

� LOCALTIMESTAMP

� DBTIMEZONE

� SESSIONTIMEZONE

� EXTRACT

� FROM_TZ

� TO_TIMESTAMP

� TO_TIMESTAMP_TZ

� TO_YMINTERVAL

Page 461: Oracle Sql PortuguêS

16-3 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

FUSOS HORÁRIOS

-08:00

A imagem representa o horário emcada fuso horário quando forem12:00 no horário de Greenwich.

A imagem representa o horário emcada fuso horário quando forem12:00 no horário de Greenwich.

-05:00+02:00 +10:00

+07:00

Page 462: Oracle Sql PortuguêS

16-5 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Suporte a Data/Horário do Oracle9i

� No Oracle9i, você pode incluir o fuso horário nosseus dados de data e horário e fornecer suportepara segundos fracionários.

� Foram adicionados três novos tipos de dados aDATE:

� TIMESTAMP

� TIMESTAMP WITH TIME ZONE (TSTZ)

� TIMESTAMP WITH LOCAL TIME ZONE (TSLTZ)

� O Oracle9i fornece suporte ao horário de verãopara os tipos de dados de data/horário no servidor.

Page 463: Oracle Sql PortuguêS

16-7 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

TZ_OFFSET

SELECT TZ_OFFSET('US/Eastern') FROM DUAL;

SELECT TZ_OFFSET('Canada/Yukon') FROM DUAL;

SELECT TZ_OFFSET('Europe/London') FROM DUAL;

� Exibir o deslocamento do fuso horário 'US/Eastern'

� Exibir o deslocamento do fuso horário 'Canada/Yukon'

� Exibir o deslocamento do fuso horário 'Europe/London'

Page 464: Oracle Sql PortuguêS

16-9 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

CURRENT_DATE

� CURRENT_DATE distingue o fuso horário da sessão.� O valor retornado é uma data do calendário gregoriano.

ALTER SESSION SET TIME_ZONE = '-8:0';SELECT SESSIONTIMEZONE, CURRENT_DATE FROM DUAL;

ALTER SESSION SET TIME_ZONE = '-5:0';SELECT SESSIONTIMEZONE, CURRENT_DATE FROM DUAL;

� Exibir a data e o horário atuais no fuso horário da sessãoALTER SESSIONSET NLS_DATE_FORMAT = 'DD-MON-YYYY HH24:MI:SS';

Page 465: Oracle Sql PortuguêS

16-10 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

CURRENT_TIMESTAMP

ALTER SESSION SET TIME_ZONE = '-8:0';SELECT SESSIONTIMEZONE, CURRENT_TIMESTAMP FROM DUAL;

ALTER SESSION SET TIME_ZONE = '-5:0';SELECT SESSIONTIMEZONE, CURRENT_TIMESTAMP FROM DUAL;

� Exibir a data atual e o horário fracionário no fuso horárioda sessão

� CURRENT_TIMESTAMP distingue o fuso horário da sessão.� O valor retornado é do tipo de dados TIMESTAMP WITH

TIME ZONE.

Page 466: Oracle Sql PortuguêS

16-11 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

LOCALTIMESTAMP

ALTER SESSION SET TIME_ZONE = '-5:0';SELECT CURRENT_TIMESTAMP, LOCALTIMESTAMP FROM DUAL;

ALTER SESSION SET TIME_ZONE = '-8:0';SELECT CURRENT_TIMESTAMP, LOCALTIMESTAMP FROM DUAL;

� Exibir a data e o horário atuais no fuso horário dasessão em um valor de tipo de dados TIMESTAMP

� LOCALTIMESTAMP retorna um valor TIMESTAMP,enquanto CURRENT_TIMESTAMP retorna um valorTIMESTAMP WITH TIME ZONE.

Page 467: Oracle Sql PortuguêS

16-12 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

DBTIMEZONE e SESSIONTIMEZONE

SELECT DBTIMEZONE FROM DUAL;

SELECT SESSIONTIMEZONE FROM DUAL;

� Exibir o valor do fuso horário do banco de dados

� Exibir o valor do fuso horário da sessão

Page 468: Oracle Sql PortuguêS

16-13 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

EXTRACT

SELECT EXTRACT (YEAR FROM SYSDATE) FROM DUAL;

SELECT last_name, hire_date, EXTRACT (MONTH FROM HIRE_DATE)FROM employeesWHERE manager_id = 100;

� Exibir o componente YEAR de SYSDATE.

� Exibir o componente MONTH de HIRE_DATE para osfuncionários cujo MANAGER_ID é 100.

Page 469: Oracle Sql PortuguêS

16-14 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Conversão de TIMESTAMP Usando FROM_TZ

SELECT FROM_TZ(TIMESTAMP '2000-03-28 08:00:00','3:00')FROM DUAL;

� Exibir o valor de TIMESTAMP '2000-03-28 08:00:00'como um valor TIMESTAMP WITH TIME ZONE

SELECT FROM_TZ(TIMESTAMP '2000-03-28 08:00:00', 'Australia/North')FROM DUAL;

� Exibir o valor de TIMESTAMP '2000-03-28 08:00:00'como um valor TIMESTAMP WITH TIME ZONE paraa região de fuso horário 'Australia/North'

Page 470: Oracle Sql PortuguêS

16-15 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

SELECT TO_TIMESTAMP_TZ('1999-12-01 11:00:00 -8:00', 'YYYY-MM-DD HH:MI:SS TZH:TZM')FROM DUAL;

Conversão de STRING em TIMESTAMP UsandoTO_TIMESTAMP e TO_TIMESTAMP_TZ

SELECT TO_TIMESTAMP ('2000-12-01 11:00:00', 'YYYY-MM-DD HH:MI:SS')FROM DUAL;

� Exibir a string de caracteres '2000-12-01 11:00:00'como um valor de TIMESTAMP

� Exibir a string de caracteres '1999-12-01 11:00:00 -8:00'como um valor de TIMESTAMP WITH TIME ZONE

Page 471: Oracle Sql PortuguêS

16-16 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Conversão de Intervalo de Tempocom TO_YMINTERVAL

SELECT hire_date, hire_date + TO_YMINTERVAL('01-02') AS HIRE_DATE_YMININTERVALFROM EMPLOYEESWHERE department_id = 20;

� Exibir uma data um ano e dois meses posterior àdata de admissão dos funcionários que trabalhamno departamento com DEPARTMENT_ID 20

Page 472: Oracle Sql PortuguêS

16-17 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Resumo

� TZ_OFFSET

� FROM_TZ

� TO_TIMESTAMP

� TO_TIMESTAMP_TZ

� TO_YMINTERVAL

� CURRENT_DATE

� CURRENT_TIMESTAMP

� LOCALTIMESTAMP

� DBTIMEZONE

� SESSIONTIMEZONE

� EXTRACT

Nesta lição, você aprendeu a usar as seguintes funções:Nesta lição, você aprendeu a usar as seguintes funções:

Page 473: Oracle Sql PortuguêS

16-18 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Visão Geral do Exercício 16

Este exercício abrange o uso das funções dedata/horário no Oracle9i.

Page 474: Oracle Sql PortuguêS

17Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Aperfeiçoamentos da CláusulaGROUP BY

Page 475: Oracle Sql PortuguêS

17-2 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Objetivos

Após concluir esta lição, você poderá fazer o seguinte:� Usar a operação ROLLUP para produzir valores de

subtotais � Usar a operação CUBE para produzir valores de

tabulação cruzada� Usar a função GROUPING para identificar os valores

de linhas criados por uma operação ROLLUP ou CUBE� Usar GROUPING SETS para produzir um conjunto de

resultados simples

Page 476: Oracle Sql PortuguêS

17-3 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Revisão de Funções de Grupo

As funções de grupo operam em conjuntos de linhaspara fornecer um resultado por grupo.

SELECT [coluna,] função_de_grupo(coluna). . .FROM tabela[WHERE condição][GROUP BY expressão_group_by][ORDER BY coluna];

SELECT AVG(salary), STDDEV(salary),COUNT(commission_pct),MAX(hire_date)

FROM employeesWHERE job_id LIKE 'SA%';

Exemplo:Exemplo:

Page 477: Oracle Sql PortuguêS

17-4 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Revisão da Cláusula GROUP BY

SELECT department_id, job_id, SUM(salary), COUNT(employee_id)

FROM employeesGROUP BY department_id, job_id ;

SELECT [coluna,]FROM tabela[WHERE condição][GROUP BY expressão_group_by][ORDER BY coluna];

Exemplo:Exemplo:

Sintaxe:Sintaxe:função_de_grupo(coluna). . .

Page 478: Oracle Sql PortuguêS

17-5 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Revisão da Cláusula HAVING

� Use a cláusula HAVING para especificar os grupos que devem ser exibidos.

� Restrinja os grupos com base em uma condição de limite.

SELECT [coluna,] função_de_grupo(coluna). . .FROM tabela[WHERE condição][GROUP BY expressão_group_by][HAVING expressão_having] [ORDER BY coluna];

Page 479: Oracle Sql PortuguêS

17-6 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

GROUP BY com os Operadores ROLLUP e CUBE

� Use os operadores ROLLUP ou CUBE com a cláusula GROUP BY para produzir linhas superagregadas pela referência cruzada de colunas.

� O agrupamento ROLLUP produz um conjunto de resultados que contém as linhas agrupadas normais e os valores de subtotais.

� O agrupamento CUBE produz um conjunto de resultados que contém as linhas de ROLLUP e as linhas de tabulação cruzada.

Page 480: Oracle Sql PortuguêS

17-7 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Operador ROLLUP

� ROLLUP é uma extensão da cláusula GROUP BY.� Use a operação ROLLUP para produzir agregados

cumulativos, como subtotais.

SELECT [coluna,] função_de_grupo(coluna). . .FROM tabela[WHERE condição][GROUP BY [ROLLUP] expressão_group_by][HAVING expressão_having];[ORDER BY coluna];

Page 481: Oracle Sql PortuguêS

17-8 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Exemplo de Operador ROLLUP

SELECT department_id, job_id, SUM(salary)FROM employeesWHERE department_id < 60GROUP BY ROLLUP(department_id, job_id);

1 2

3

Page 482: Oracle Sql PortuguêS

17-9 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Operador CUBE

� CUBE é uma extensão da cláusula GROUP BY.� Você pode usar o operador CUBE para produzir valores

de tabulação cruzada com uma instrução SELECTsimples.

SELECT [coluna,] função_de_grupo(coluna). . .FROM tabela[WHERE condição][GROUP BY [CUBE] expressão_group_by][HAVING expressão_having] [ORDER BY coluna];

Page 483: Oracle Sql PortuguêS

17-10 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Operador CUBE: Exemplo

SELECT department_id, job_id, SUM(salary)FROM employeesWHERE department_id < 60GROUP BY CUBE (department_id, job_id) ;

12

3

4

Page 484: Oracle Sql PortuguêS

17-11 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Função GROUPING

� É possível usar a função GROUPING com o operador CUBE ou ROLLUP.

� Com a função GROUPING, você pode localizar os grupos que formam o subtotal em uma linha.

� Com a função GROUPING, você pode diferenciar valores NULL armazenados de valores NULL criados pelo operador ROLLUP ou CUBE.

� A função GROUPING retorna 0 ou 1.

SELECT [coluna,] função_de_grupo(coluna) . ,GROUPING(expr)

FROM tabela[WHERE condição][GROUP BY [ROLLUP][CUBE] expressão_group_by][HAVING expressão_having] [ORDER BY coluna];

Page 485: Oracle Sql PortuguêS

17-13 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Função GROUPING: Exemplo

SELECT department_id DEPTID, job_id JOB, SUM(salary),GROUPING(department_id) GRP_DEPT,GROUPING(job_id) GRP_JOB

FROM employeesWHERE department_id < 50GROUP BY ROLLUP(department_id, job_id);

21

3

Page 486: Oracle Sql PortuguêS

17-14 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

GROUPING SETS

� GROUPING SETS é uma extensão adicional da cláusulaGROUP BY.

� Você pode usar GROUPING SETS para definir vários agrupamentos na mesma consulta.

� O Oracle Server calcula todos os agrupamentos especificados na cláusula GROUPING SETS e combina os resultados de agrupamentos individuais com uma operação UNION ALL.

� Eficiência do conjunto de agrupamentos:� É necessária apenas uma análise da tabela-base.� Não é necessário criar instruções UNION complexas.� Quanto mais elementos a cláusula GROUPING SETS

tiver, maior será o desempenho.

Page 487: Oracle Sql PortuguêS

17-16 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

GROUPING SETS: Exemplo

SELECT department_id, job_id, manager_id,avg(salary)

FROM employeesGROUP BY GROUPING SETS ((department_id,job_id), (job_id,manager_id));

�1

2

Page 488: Oracle Sql PortuguêS

17-18 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Colunas Compostas

� Uma coluna composta é um conjunto de colunas tratadas como uma unidade.ROLLUP (a, , d)

� Para especificar colunas compostas, use a cláusula GROUP BY a fim de agrupar colunas entre parênteses de modo que o servidor Oracle trate essas colunas como uma unidade quando calcula operações ROLLUPou CUBE.

� Quando usadas com ROLLUP ou CUBE, as colunas compostas significam que a agregação é ignorada em alguns níveis.

(b,c)(b,c)(b,c)

Page 489: Oracle Sql PortuguêS

17-20 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Colunas Compostas: Exemplo

SELECT department_id, job_id, manager_id, SUM(salary)

FROM employees GROUP BY ROLLUP( department_id,(job_id, manager_id));

21

3�

Page 490: Oracle Sql PortuguêS

17-22 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Agrupamentos Concatenados

� Os agrupamentos concatenados oferecem uma maneira concisa de gerar combinações de agrupamentos úteis.

� Para especificar conjuntos de agrupamentos concatenados, separe vários conjuntos de agrupamentos e operações ROLLUP e CUBE por vírgulas de modo que o Oracle Server combine-os em uma cláusula GROUP BY simples.

� O resultado é um produto híbrido de agrupamentos de cada conjunto de agrupamentos.GROUP BY GROUPING SETS(a, b), GROUPING SETS(c, d)

Page 491: Oracle Sql PortuguêS

17-23 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Exemplo de Agrupamentos Concatenados

SELECT department_id, job_id, manager_id, SUM(salary)

FROM employeesGROUP BY department_id,

ROLLUP(job_id),CUBE(manager_id);

1

2

3

4

Page 492: Oracle Sql PortuguêS

17-24 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Resumo

Nesta lição, você aprendeu a:� Usar a operação ROLLUP para produzir valores de

subtotais � Usar a operação CUBE para produzir valores de

tabulação cruzada� Usar a função GROUPING para identificar os valores de

linhas criados por uma operação ROLLUP ou CUBE� Usar a sintaxe GROUPING SETS para definir vários

agrupamentos na mesma consulta� Usar a cláusula GROUP BY para combinar expressões

de várias maneiras:� Colunas compostas� Conjuntos de agrupamentos concatenados

Page 493: Oracle Sql PortuguêS

17-25 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Visão Geral do Exercício 17

Este exercício abrange os seguintes tópicos:� Uso do operador ROLLUP� Uso do operador CUBE� Uso da função GROUPING� Uso de GROUPING SETS

Page 494: Oracle Sql PortuguêS

18Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Subconsultas Avançadas

Page 495: Oracle Sql PortuguêS

18-2 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

ObjetivosApós concluir esta lição, você poderá fazer o seguinte:� Criar uma subconsulta de várias colunas� Descrever e explicar o comportamento de subconsultas

quando valores nulos são recuperados� Criar uma subconsulta em uma cláusula FROM� Usar subconsultas escalares em SQL� Descrever os tipos de problemas que as subconsultas

correlacionadas podem solucionar� Criar subconsultas correlacionadas� Atualizar e deletar linhas usando subconsultas

correlacionadas� Usar os operadores EXISTS e NOT EXISTS� Usar a cláusula WITH

Page 496: Oracle Sql PortuguêS

18-3 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

O que é uma Subconsulta?

Uma subconsulta é uma instrução SELECT incorporada a uma cláusula de outra instrução SQL.

SELECT ...FROM ...WHERE ...

(SELECT ...FROM ...WHERE ...)

ConsultaConsultaprincipalprincipal

SubconsultaSubconsulta

Page 497: Oracle Sql PortuguêS

18-4 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Subconsultas

� A subconsulta (consulta interna) é executada uma vez antes da consulta principal.

� O resultado da subconsulta é usado pela consulta principal (consulta externa).

SELECT lista_de_seleçãoFROM tabelaWHERE expr operador (SELECT lista_de_seleção

FROM tabela);

Page 498: Oracle Sql PortuguêS

18-5 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Usando uma Subconsulta

SELECT last_nameFROM employeesWHERE salary >

(SELECT salaryFROM employeesWHERE employee_id = 149) ;

10500

Page 499: Oracle Sql PortuguêS

18-6 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Subconsultas de Várias Colunas

Consulta principalWHERE (MANAGER_ID, DEPARTMENT_ID) IN

Subconsulta100 90102 60124 50

Cada linha da consulta principal Cada linha da consulta principal é comparada a valores é comparada a valores de uma subconsulta de vde uma subconsulta de várias linhas e colunas.árias linhas e colunas.

Page 500: Oracle Sql PortuguêS

18-7 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Comparações de Coluna

As comparações de coluna em uma subconsulta de várias colunas podem ser:� Comparações emparelhadas� Comparações não-emparelhadas

Page 501: Oracle Sql PortuguêS

18-8 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Subconsulta de Comparação Emparelhada

Exiba os detalhes dos funcionários que são gerenciados pelo mesmo gerente e que trabalham no mesmo departamento que os funcionários com EMPLOYEE_ID178 ou 174.

SELECT employee_id, manager_id, department_idFROM employeesWHERE (manager_id, department_id) IN

(SELECT manager_id, department_idFROM employeesWHERE employee_id IN (178,174))

AND employee_id NOT IN (178,174);

Page 502: Oracle Sql PortuguêS

18-9 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Subconsulta de Comparação Não-emparelhada

SELECT employee_id, manager_id, department_idFROM employeesWHERE manager_id IN

(SELECT manager_idFROM employeesWHERE employee_id IN (174,141))

AND department_id IN (SELECT department_idFROM employeesWHERE employee_id IN (174,141))

AND employee_id NOT IN(174,141);

Exiba os detalhes dos funcionários que são gerenciados pelo mesmo gerente e que trabalham no mesmo departamento que os funcionários com EMPLOYEE_ID174 ou 141.

Page 503: Oracle Sql PortuguêS

18-10 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

SELECT a.last_name, a.salary, a.department_id, b.salavg

FROM employees a, (SELECT department_id, AVG (salary) salavgFROM employeesGROUP BY department_id) b

WHERE a.department_id = b.department_idAND a.salary > b.salavg;

Usando uma Subconsulta na Cláusula FROM

Page 504: Oracle Sql PortuguêS

18-11 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Expressões de Subconsulta Escalar

� Uma expressão de subconsulta escalar é uma subconsulta que retorna exatamente um valor de coluna de uma linha.

� As subconsultas escalares eram suportadas no Oracle8i somente em um número limitado de casos, por exemplo, em:� Uma instrução SELECT (cláusulas FROM e WHERE)� Uma lista VALUES de uma instrução INSERT

� No Oracle9i, é possível usar subconsultas escalares em:� Uma condição e uma parte de expressão de

DECODE e CASE� Todas as cláusulas SELECT, exceto GROUP BY

Page 505: Oracle Sql PortuguêS

18-12 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Subconsultas Escalares: ExemplosSubconsultas Escalares em Expressões CASE

SELECT employee_id, last_name,

(CASE

WHEN department_id =

THEN 'Canada' ELSE 'USA' END) location

FROM employees;

(SELECT department_id FROM departments

WHERE location_id = 1800)

Subconsultas Escalares em Cláusulas ORDER BYSubconsultas Escalares em Cláusulas ORDER BYSELECT employee_id, last_name

FROM employees e

ORDER BY

20

(SELECT department_name

FROM departments d

WHERE e.department_id = d.department_id);

Page 506: Oracle Sql PortuguêS

18-14 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

USEvalores da consulta interna para

qualificar ou desqualificar a linha candidata

Subconsultas Correlacionadas

As subconsultas correlacionadas são usadas para processamento por linha. Cada subconsulta é executa uma vez para cada linha da consulta externa.

GETlinha candidata da consulta externa

EXECUTEconsulta interna que usa o valor

da linha candidata

Page 507: Oracle Sql PortuguêS

18-15 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Subconsultas Correlacionadas

SELECT coluna1, coluna2, ...FROM tabela1WHERE coluna1 operador

(SELECT coluna1, coluna2FROM tabela2WHERE expr1 =

.expr2);

A subconsulta faz referência a uma coluna de uma tabela na consulta mãe.A subconsulta faz referA subconsulta faz referência a uma coluna de uma tabela ência a uma coluna de uma tabela na consulta mna consulta mãe.ãe.

externa

Externa

Page 508: Oracle Sql PortuguêS

18-16 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

SELECT last_name, salary, department_idFROM employees outerWHERE salary >

Usando Subconsultas Correlacionadas

Sempre que uma linha da consulta externafor processada, aconsulta interna seráavaliada.

Localize todos os funcionários que ganham acima do salário médio de seus respectivos departamentos.

(SELECT AVG(salary)FROM employeesWHERE department_id =

outer.department_id) ;

Page 509: Oracle Sql PortuguêS

18-17 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Usando Subconsultas Correlacionadas

SELECT e.employee_id, last_name,e.job_id

FROM employees e

WHERE 2 <= (SELECT COUNT(*)

FROM job_history

WHERE employee_id = e.employee_id);

Exiba detalhes dos funcionários que mudaram de cargo no mínimo duas vezes.

Page 510: Oracle Sql PortuguêS

18-18 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Usando o Operador EXISTS

� O operador EXISTS testa a existência de linhas no conjunto de resultados da subconsulta.

� Se o valor da linha de uma subconsulta for encontrado:� A pesquisa na consulta interna não continuará� A condição será indicada por um flag TRUE

� Se o valor de linha de uma subconsulta não for encontrado:� A condição será indicada por um flag FALSE� A pesquisa continuará na consulta interna

Page 511: Oracle Sql PortuguêS

18-19 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

SELECT employee_id, last_name, job_id, department_idFROM employees outerWHERE EXISTS ( SELECT 'X'

FROM employeesWHERE manager_id =

outer.employee_id);

Usando o Operador EXISTS

Localize os funcionários com no mínimo uma pessoa subordinada a eles.

Page 512: Oracle Sql PortuguêS

18-20 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

SELECT department_id, department_nameFROM departments dWHERE NOT EXISTS (SELECT 'X'

FROM employeesWHERE department_id

= d.department_id);

Usando o Operador NOT EXISTS

Localize todos os departamentos sem funcionários.

Page 513: Oracle Sql PortuguêS

18-21 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

UPDATE Correlacionada

Use uma subconsulta correlacionada para atualizar as linhas de uma tabela com base nas linhas de outra tabela.

UPDATE tabela1 apelido1SET coluna = (SELECT expressão

FROM tabela2 apelido2WHERE apelido1.coluna =

apelido2.coluna);

Page 514: Oracle Sql PortuguêS

18-22 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

UPDATE Correlacionada

� Altere o padrão da tabela EMPLOYEES adicionando uma coluna para armazenar o nome do departamento.

� Preencha a tabela usando uma atualização correlacionada.

ALTER TABLE employeesADD(department_name VARCHAR2(14));

UPDATE employees eSET department_name =

(SELECT department_name FROM departments dWHERE e.department_id = d.department_id);

Page 515: Oracle Sql PortuguêS

18-24 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

DELETE FROM tabela1 apelido1WHERE coluna operador

(SELECT expressãoFROM tabela2 apelido2WHERE apelido1.coluna = apelido2.coluna);

DELETE Correlacionada

Use uma subconsulta correlacionada para deletar linhas de uma tabela com base nas linhas de outra tabela.

Page 516: Oracle Sql PortuguêS

18-25 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

DELETE FROM employees EWHERE employee_id =

(SELECT employee_idFROM emp_history WHERE employee_id = E.employee_id);

Use uma subconsulta correlacionada para deletar somente as linhas da tabela EMPLOYEES que também existem na tabela EMP_HISTORY.

DELETE Correlacionada

Page 517: Oracle Sql PortuguêS

18-26 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

A Cláusula WITH

� Com a cláusula WITH, você poderá usar o mesmo bloco de consultas em uma instrução SELECTquando ele ocorrer mais de uma vez em uma consulta complexa.

� A cláusula WITH recupera os resultados de um bloco de consultas e os armazena no tablespace temporário do usuário.

� A cláusula WITH melhora o desempenho.

Page 518: Oracle Sql PortuguêS

18-27 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Cláusula WITH: Exemplo

Com a cláusula WITH, crie uma consulta para exibir o nome do departamento e os salários totais dos departamentos cujo salário total é maior que o salário médio de todos os departamentos.

Page 519: Oracle Sql PortuguêS

18-28 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Cláusula WITH: Exemplo

WITH dept_costs AS (

SELECT d.department_name, SUM(e.salary) AS dept_totalFROM employees e, departments dWHERE e.department_id = d.department_idGROUP BY d.department_name),

avg_cost AS (SELECT SUM(dept_total)/COUNT(*) AS dept_avgFROM dept_costs)

SELECT *FROM dept_costsWHERE dept_total >

(SELECT dept_avg FROM avg_cost)

ORDER BY department_name;

Page 520: Oracle Sql PortuguêS

18-30 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Resumo

Nesta lição, você aprendeu que:� Uma subconsulta de várias colunas retorna mais de

uma coluna.� As comparações de várias colunas podem ser

emparelhadas ou não-emparelhadas.� Uma subconsulta de várias colunas também pode ser

usada na cláusula FROM de uma instrução SELECT.� As subconsultas escalares foram aperfeiçoadas

no Oracle9i.

Page 521: Oracle Sql PortuguêS

18-31 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Resumo

� As subconsultas correlacionadas são úteis sempre que uma subconsulta precisar retornar um resultado diferente para cada linha candidata.

� O operador EXISTS é um operador booleano que testa a presença de um valor.

� É possível usar subconsultas correlacionadas com instruções SELECT, UPDATE e DELETE.

� Você pode usar a cláusula WITH para usar o mesmo bloco de consultas em uma instrução SELECT quando ele ocorre mais de uma vez.

Page 522: Oracle Sql PortuguêS

18-32 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Visão Geral do Exercício 18

Este exercício abrange os seguintes tópicos:� Criando subconsultas de várias colunas� Criando subconsultas correlacionadas� Usando o operador EXISTS� Usando subconsultas escalares� Usando a cláusula WITH

Page 523: Oracle Sql PortuguêS

19Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Recuperação Hierárquica

Page 524: Oracle Sql PortuguêS

19-2 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Objetivos

Após concluir esta lição, você poderá fazer o seguinte:� Interpretar o conceito de uma consulta hierárquica� Criar um relatório estruturado em árvore� Formatar dados hierárquicos� Excluir ramificações da estrutura em árvore

Page 525: Oracle Sql PortuguêS

19-3 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Dados de Amostra da Tabela EMPLOYEES

Page 526: Oracle Sql PortuguêS

19-4 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Estrutura em Árvore Natural

EMPLOYEE_ID = 100 (Pai)

MANAGER_ID = 100 (Filho)

De HannDe Hann

KingKing

HunoldHunoldWhalenWhalen

KochharKochhar

HigginsHiggins

MourgosMourgos ZlotkeyZlotkey

RajsRajs DaviesDavies MatosMatos

GietzGietzErnstErnst LorentzLorentz

HartsteinHartstein

Fay Fay

AbelAbel TaylorTaylor GrantGrant

VargasVargas

Page 527: Oracle Sql PortuguêS

19-5 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Consultas Hierárquicas

WHERE condição:WHEREWHERE condicondiççãoão::expr operador_de_comparação expr

SELECT [LEVEL], coluna, expr...FROM tabela[WHERE condição(ões)][START WITH condição(ões)][CONNECT BY PRIOR condição(ões)] ;

Page 528: Oracle Sql PortuguêS

19-6 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Percorrendo a Árvore

Ponto Inicial

� Especificar a condição que deve ser atendida� Aceitar qualquer condição válida

Usando a tabela EMPLOYEES, comece com ofuncionário cujo sobrenome é Kochhar.

...START WITH last_name = 'Kochhar'

START WITH coluna1 = valor

Page 529: Oracle Sql PortuguêS

19-7 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Percorrendo a Árvore

Direção

De cima De cima para baixopara baixo

Coluna1 = Chave mColuna1 = Chave mãeãeColuna2 = Chave filhaColuna2 = Chave filha

De baixo De baixo para cimapara cima

Coluna1 = Chave filhaColuna1 = Chave filhaColuna2 = Chave mColuna2 = Chave mãeãe

Percorra a árvore de cima para baixo usando a tabela EMPLOYEES.Percorra a Percorra a árvore de cima para baixo usando a árvore de cima para baixo usando a tabela tabela EMPLOYEESEMPLOYEES..

CONNECT BY PRIOR coluna1 = coluna2

... CONNECT BY PRIOR employee_id = manager_id

Page 530: Oracle Sql PortuguêS

19-8 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Percorrendo a Árvore: de Baixo para Cima

SELECT employee_id, last_name, job_id, manager_idFROM employeesSTART WITH employee_id = 101CONNECT BY PRIOR manager_id = employee_id ;

Page 531: Oracle Sql PortuguêS

19-9 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Percorrendo a Árvore: de Cima para Baixo

SELECT last_name||' reports to '|| PRIOR last_name "Walk Top Down"FROM employees

START WITH last_name='King' CONNECT BY PRIOR employee_id = manager_id ;

Page 532: Oracle Sql PortuguêS

19-10 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Classificando Linhas coma Pseudocoluna LEVEL

De HannDe Hann

KingKing

HunoldHunoldWhalenWhalen

KochharKochhar

HigginsHiggins

MourgosMourgos ZlotkeyZlotkey

RajsRajs DaviesDavies MatosMatos

GietzGietzErnstErnst LorentzLorentz

HartsteinHartstein

FayFay

AbelAbel TaylorTaylor GrantGrant

VargasVargas

Nível 1raiz/mãe

Nível 2mãe/filha

Nível 3mãe/filha

/folha

Nível 4folha

Page 533: Oracle Sql PortuguêS

19-11 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Formatando Relatórios Hierárquicos Usando LEVEL e LPAD

Criar um relatório que exiba os níveis de gerenciamentoda empresa, começando com o nível mais alto erecuando cada um dos níveis a seguir.

COLUMN org_chart FORMAT A12

SELECT LPAD(last_name, LENGTH(last_name)+(LEVEL*2)-2,'_')

AS org_chartFROM employeesSTART WITH last_name='King' CONNECT BY PRIOR employee_id=manager_id

Page 534: Oracle Sql PortuguêS

19-13 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Compactando Ramificações

Usar a clUsar a cláusula áusula WHEREWHEREpara eliminar um npara eliminar um nó.ó.

Usar a clUsar a cláusula áusula CONNECT BYCONNECT BYpara eliminar uma ramificapara eliminar uma ramificaçção.ão.

WHERE last_name != 'Higgins'WHERE last_name != 'Higgins' CONNECT BY PRIOR CONNECT BY PRIOR employee_id = manager_id employee_id = manager_id AND last_name != 'Higgins'AND last_name != 'Higgins'KochharKochhar

HigginsHiggins

GietzGietz

WhalenWhalen

KochharKochhar

HigginsHigginsWhalenWhalen

GietzGietz

Page 535: Oracle Sql PortuguêS

19-14 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Resumo

Nesta lição, você aprendeu a:� Usar as consultas hierárquicas para exibir um

relacionamento hierárquico entre as linhas deuma tabela.

� Especificar a direção e o ponto inicial da consulta. � Compactar nós ou ramificações.

Page 536: Oracle Sql PortuguêS

19-15 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Visão Geral do Exercício 19

Este exercício abrange os seguintes tópicos:� Distinguindo consultas hierárquicas de consultas

não hierárquicas� Percorrendo uma árvore� Produzindo um relatório recuado com a

pseudocoluna LEVEL� Compactando ramificações da estrutura da árvore� Classificando a saída

Page 537: Oracle Sql PortuguêS

20Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Extensões do Oracle9i paraInstruções DML e DDL

Page 538: Oracle Sql PortuguêS

20-2 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Objetivos

Após concluir esta lição, você poderá fazer o seguinte:� Descrever os recursos de inserções multitabelas� Usar os seguintes tipos de inserções multitabelas:

– INSERT incondicional– INSERT de criação de pivôs– ALL INSERT condicional– FIRST INSERT condicional

� Criar e usar tabelas externas� Nomear o índice durante a criação de uma restrição

de chave primária

Page 539: Oracle Sql PortuguêS

20-3 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Revisão da Instrução INSERT

� Adicione novas linhas a uma tabela usando a instrução INSERT.

� Somente uma linha é inserida por vez com esta sintaxe.

INSERT INTO tabela [(coluna [, coluna...])]VALUES (valor [, valor...]);

INSERT INTO tabela [(coluna [, coluna...])]VALUES (valor [, valor...]);

INSERT INTO departments(department_id, department_name, manager_id, location_id)

VALUES (70, 'Public Relations', 100, 1700);1 row created.

Page 540: Oracle Sql PortuguêS

20-4 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Revisão da Instrução UPDATE

� Modifique linhas existentes com a instrução UPDATE.

� Atualize mais de uma linha por vez, se necessário.� Uma ou mais linhas específicas serão modificadas

se você especificar a cláusula WHERE.

UPDATE tabelaSET coluna = valor [, coluna = valor, ...][WHERE condição];

UPDATE tabelaSET coluna = valor [, coluna = valor, ...][WHERE condição];

UPDATE employeesSET department_id = 70WHERE employee_id = 142;1 row updated.1 row updated.

Page 541: Oracle Sql PortuguêS

20-5 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Visão Geral das Instruções INSERT Multitabelas

� É possível usar a instrução INSERT...SELECT para inserir linhas em várias tabelas como parte de uma única instrução DML.

� É possível usar instruções INSERT multitabelas em sistemas de data warehouse para transferir dados de uma ou mais origens operacionais para um conjunto de tabelas de destino.

� Elas fornecem uma melhoria significativa de desempenho em:� Uma única instrução DML versus várias instruções

INSERT...SELECT

� Uma única instrução DML versus um procedimento para executar várias inserções com a sintaxe IF...THEN

Page 542: Oracle Sql PortuguêS

20-7 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Tipos de Instruções INSERT Multitabelas

O Oracle9i apresenta os seguintes tipos de instruções INSERT multitabelas:

INSERT incondicionalALL INSERT condicionalFIRST INSERT condicionalINSERT de criação de pivôs

Page 543: Oracle Sql PortuguêS

20-8 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Instruções INSERT Multitabelas

INSERT [ALL] [conditional_insert_clause][insert_into_clause values_clause] (subconsulta)

[ALL] [FIRST][WHEN condição THEN] [insert_into_clause values_clause][ELSE] [insert_into_clause values_clause]

conditional_insert_clause

Sintaxe

Page 544: Oracle Sql PortuguêS

20-10 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

INSERT ALL Incondicional

� Selecione os valores de EMPLOYEE_ID, HIRE_DATE, SALARY e MANAGER_ID da tabela EMPLOYEES para os funcionários cujo EMPLOYEE_ID é maior que 200.

� Insira esses valores nas tabelas SAL_HISTORY e MGR_HISTORY usando um INSERT multitabelas.

INSERT ALLINTO sal_history VALUES(EMPID,HIREDATE,SAL)INTO mgr_history VALUES(EMPID,MGR,SAL)SELECT employee_id EMPID, hire_date HIREDATE,

salary SAL, manager_id MGR FROM employeesWHERE employee_id > 200;

8 rows created.8 rows created.

Page 545: Oracle Sql PortuguêS

20-11 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

INSERT ALL Condicional

� Selecione os valores de EMPLOYEE_ID, HIRE_DATE, SALARY e MANAGER_ID da tabela EMPLOYEES para os funcionários com EMPLOYEE_ID maior que 200.

� Se SALARY for superior a US$ 10.000, insira esses valores na tabela SAL_HISTORY usando uma instrução INSERT multitabelas condicional.

� Se MANAGER_ID for maior que 200, insira esses valores na tabela MGR_HISTORY usando uma instrução INSERTmultitabelas condicional.

Page 546: Oracle Sql PortuguêS

20-12 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

INSERT ALL Condicional

INSERT ALL

WHEN SAL > 10000 THEN

INTO sal_history VALUES(EMPID,HIREDATE,SAL)

WHEN MGR > 200 THEN

INTO mgr_history VALUES(EMPID,MGR,SAL)

SELECT employee_id EMPID,hire_date HIREDATE, salary SAL, manager_id MGR

FROM employeesWHERE employee_id > 200;

4 rows created.4 rows created.

Page 547: Oracle Sql PortuguêS

20-13 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

FIRST INSERT Condicional

� Selecione DEPARTMENT_ID, SUM(SALARY) e MAX(HIRE_DATE) na tabela EMPLOYEES.

� Se SUM(SALARY) for superior a US$ 25.000, insira esses valores em SPECIAL_SAL, usando uma instrução INSERT multitabelas FIRST condicional.

� Se a primeira cláusula WHEN for avaliada como verdadeira, as cláusulas WHEN subseqüentes para essa linha serão ignoradas.

� Insira as linhas que não atendem à primeira condição WHEN na tabela HIREDATE_HISTORY_00, HIREDATE_HISTORY_99 ou HIREDATE_HISTORY, com base no valor da coluna HIRE_DATE usando uma instrução INSERT multitabelas condicional.

Page 548: Oracle Sql PortuguêS

20-14 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

FIRST INSERT Condicional

INSERT FIRSTWHEN SAL > 25000 THENINTO special_sal VALUES(DEPTID, SAL)

WHEN HIREDATE like ('%00%') THENINTO hiredate_history_00 VALUES(DEPTID,HIREDATE)

WHEN HIREDATE like ('%99%') THENINTO hiredate_history_99 VALUES(DEPTID, HIREDATE)

ELSEINTO hiredate_history VALUES(DEPTID, HIREDATE)SELECT department_id DEPTID, SUM(salary) SAL,

MAX(hire_date) HIREDATEFROM employeesGROUP BY department_id;

8 rows created.8 rows created.

Page 549: Oracle Sql PortuguêS

20-15 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

INSERT de Criação de Pivôs

� Suponha que você receba um conjunto de registros de vendas de uma tabela de banco de dados não relacional, SALES_SOURCE_DATA, no seguinte formato:EMPLOYEE_ID, WEEK_ID, SALES_MON, SALES_TUE, SALES_WED, SALES_THUR, SALES_FRI

� Você poderia armazenar esses registros na tabela SALES_INFO em um formato relacional mais típico:EMPLOYEE_ID, WEEK, SALES

� Usando um INSERT de criação de pivôs, converta o conjunto de registros de vendas da tabela de banco de dados não relacional no formato relacional.

Page 550: Oracle Sql PortuguêS

20-16 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

INSERT de Criação de Pivôs

INSERT ALL

INTO sales_info VALUES (employee_id,week_id,sales_MON)

INTO sales_info VALUES (employee_id,week_id,sales_TUE)

INTO sales_info VALUES (employee_id,week_id,sales_WED)

INTO sales_info VALUES (employee_id,week_id,sales_THUR)

INTO sales_info VALUES (employee_id,week_id, sales_FRI)

SELECT EMPLOYEE_ID, week_id, sales_MON, sales_TUE,

sales_WED, sales_THUR,sales_FRI

FROM sales_source_data;5 rows created.5 rows created.

Page 551: Oracle Sql PortuguêS

20-18 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Tabelas Externas

� As tabelas externas são tabelas somente para leitura nas quais os dados são armazenados fora do banco de dados em arquivos simples.

� Os metadados para uma tabela externa são criados com uma instrução CREATE TABLE.

� Com a ajuda de tabelas externas, os dados Oracle podem ser armazenados ou descarregados como arquivos simples.

� Você pode consultar os dados usando SQL, mas não pode usar DML nem criar índices.

Page 552: Oracle Sql PortuguêS

20-19 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Criando uma Tabela Externa

� Use external_table_clause com a sintaxe CREATE TABLE para criar uma tabela externa.

� Especifique ORGANIZATION como EXTERNAL para indicar que a tabela está localizada fora do banco de dados.

� external_table_clause consiste nos drivers de acesso TYPE, external_data_properties e REJECT LIMIT.

� external_data_properties consiste no seguinte:– DEFAULT DIRECTORY

– ACCESS PARAMETERS

– LOCATION

Page 553: Oracle Sql PortuguêS

20-21 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Exemplo de Criação deuma Tabela Externa

Crie um objeto DIRECTORY que corresponda ao diretório no sistema de arquivos no qual a origem de dados externa reside.

CREATE DIRECTORY emp_dir AS '/flat_files' ;

Page 554: Oracle Sql PortuguêS

20-23 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Exemplo de Criação de uma Tabela Externa

CREATE TABLE oldemp ( empno NUMBER, empname CHAR(20), birthdate DATE)ORGANIZATION EXTERNAL(TYPE ORACLE_LOADERDEFAULT DIRECTORY emp_dirACCESS PARAMETERS(RECORDS DELIMITED BY NEWLINEBADFILE 'bad_emp' LOGFILE 'log_emp' FIELDS TERMINATED BY ',' (empno CHAR,empname CHAR,birthdate CHAR date_format date mask "dd-mon-yyyy"))LOCATION ('emp1.txt'))PARALLEL 5REJECT LIMIT 200;

Table created.Table created.

Page 555: Oracle Sql PortuguêS

20-25 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Consultando Tabelas Externas

SELECT * FROM oldemp

emp1.txt

Page 556: Oracle Sql PortuguêS

20-26 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

CREATE INDEX com a Instrução CREATE TABLE

CREATE TABLE NEW_EMP(employee_id NUMBER(6)

PRIMARY KEY USING INDEX

(CREATE INDEX emp_id_idx ON

NEW_EMP(employee_id)),first_name VARCHAR2(20),last_name VARCHAR2(25));Table created.Table created.

SELECT INDEX_NAME, TABLE_NAME FROM USER_INDEXESWHERE TABLE_NAME = 'NEW_EMP';

Page 557: Oracle Sql PortuguêS

20-27 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Resumo

Nesta lição, você aprendeu a:� Usar a instrução INSERT…SELECT para inserir

linhas em várias tabelas como parte de uma única instrução DML

� Criar tabelas externas� Nomear índices com a instrução CREATE INDEX e a

instrução CREATE TABLE

Page 558: Oracle Sql PortuguêS

20-28 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Visão Geral do Exercício 20

Este exercício abrange os seguintes tópicos:� Criando instruções INSERT incondicionais� Criando instruções ALL INSERT incondicionais� Instruções INSERT de criação de pivôs� Criando índices junto com o comando CREATE

TABLE

Page 559: Oracle Sql PortuguêS

CCopyright © Oracle Corporation, 2001. Todos os direitos reservados.

Usando o SQL*PlusUsando o SQL*Plus

Page 560: Oracle Sql PortuguêS

C-2 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

ObjetivosObjetivos

Após concluir este apêndice, você poderá fazero seguinte:� Efetuar logon no SQL*Plus� Editar comandos SQL� Formatar saídas usando comandos do SQL*Plus� Interagir com arquivos de script

Após concluir este apêndice, você poderá fazero seguinte:� Efetuar logon no SQL*Plus� Editar comandos SQL� Formatar saídas usando comandos do SQL*Plus� Interagir com arquivos de script

Page 561: Oracle Sql PortuguêS

C-3 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Interação entre SQL e SQL*PlusInteração entre SQL e SQL*Plus

SQL*PlusSQL*Plus

BufferBuffer

ServidorInstruções SQL

Resultados da consulta

ScriptsSQL

Page 562: Oracle Sql PortuguêS

C-5 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Instruções SQL VersusComandos do SQL*PlusInstruções SQL VersusComandos do SQL*Plus

InstruInstruççõesõesSQLSQL

SQLSQL�� Uma linguagemUma linguagem�� PadrPadrãoão ANSIANSI�� AsAs palavraspalavras--chavechave nnão ão

podempodem serser abreviadasabreviadas�� AsAs instruinstruçções ões

manipulam definimanipulam definiççõesõesde dados ede dados e tabelatabela nonobancobanco de dadosde dados

SQL*PlusSQL*Plus�� UmUm ambienteambiente�� Patenteado pelaPatenteado pela OracleOracle�� AsAs palavraspalavras--chave podemchave podem

serser abreviadasabreviadas�� OsOs comandoscomandos nnão ão

permitempermitem aa manipulamanipulaççãoãodosdos valoresvalores nono bancobancodede dadosdados

BufferBufferSQLSQL

ComandosComandos dodoSQL*PlusSQL*Plus

Buffer doBuffer doSQL*PlusSQL*Plus

Page 563: Oracle Sql PortuguêS

C-6 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

� Efetuar logon no SQL*Plus.� Descrever a estrutura de tabela.� Editar a instrução SQL.� Executar o código SQL a partir do SQL*Plus.� Salvar as instruções SQL em arquivos e anexar

as instruções SQL a arquivos.� Executar arquivos salvos.� Carregar comandos do arquivo para o buffer

e editá-los.

� Efetuar logon no SQL*Plus.� Descrever a estrutura de tabela.� Editar a instrução SQL.� Executar o código SQL a partir do SQL*Plus.� Salvar as instruções SQL em arquivos e anexar

as instruções SQL a arquivos.� Executar arquivos salvos.� Carregar comandos do arquivo para o buffer

e editá-los.

Visão Geral do SQL*PlusVisão Geral do SQL*Plus

Page 564: Oracle Sql PortuguêS

C-7 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Efetuando Logon no SQL*PlusEfetuando Logon no SQL*Plus

�� EmEm umum ambienteambiente Windows:Windows:

�� Em uma linhaEm uma linha dede comandoscomandos::

sqlplussqlplus [[nomenome_do__do_usuusuárioário[/[/senha senha

[@[@bancobanco_de_dados_de_dados]]]]]]

Page 565: Oracle Sql PortuguêS

C-9 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Exibindo a Estrutura de TabelaExibindo a Estrutura de Tabela

Use o comando DESCRIBE do SQL*Plus para exibir aestrutura de uma tabela.Use o comando DESCRIBE do SQL*Plus para exibir aestrutura de uma tabela.

DESC[RIBE] nome_da_tabela

Page 566: Oracle Sql PortuguêS

C-10 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Name Null? Type----------------------- -------- ------------DEPARTMENT_ID NOT NULL NUMBER(4)DEPARTMENT_NAME NOT NULL VARCHAR2(30)MANAGER_ID NUMBER(6)LOCATION_ID NUMBER(4)

Exibindo a Estrutura de TabelaExibindo a Estrutura de Tabela

SQL> DESCRIBE departments

Page 567: Oracle Sql PortuguêS

C-11 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Comandos de Edição do SQL*PlusComandos de Edição do SQL*Plus

� A[PPEND] texto

� C[HANGE] / antigo / novo

� C[HANGE] / texto /

� CL[EAR] BUFF[ER]

� DEL

� DEL n

� DEL m n

� A[PPEND] texto

� C[HANGE] / antigo / novo

� C[HANGE] / texto /

� CL[EAR] BUFF[ER]

� DEL

� DEL n

� DEL m n

Page 568: Oracle Sql PortuguêS

C-12 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Comandos de Edição do SQL*PlusComandos de Edição do SQL*Plus

� I[NPUT]

� I[NPUT] texto

� L[IST]

� L[IST] n

� L[IST] m n

� R[UN]

� n

� n texto

� 0 texto

� I[NPUT]

� I[NPUT] texto

� L[IST]

� L[IST] n

� L[IST] m n

� R[UN]

� n

� n texto

� 0 texto

Page 569: Oracle Sql PortuguêS

C-13 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

1 SELECT last_name2* FROM employees

SQL> LIST

1* SELECT last_name

SQL> A , job_id

1* SELECT last_name, job_id

1 SELECT last_name, job_id2* FROM employees

Usando LIST, n e APPENDUsando LIST, n e APPEND

SQL> 1

SQL> L

Page 570: Oracle Sql PortuguêS

C-14 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

1* SELECT * from employees

SQL> L

1* SELECT * from departments

SQL> c/employees/departments

1* SELECT * from departments

Usando o Comando CHANGEUsando o Comando CHANGE

SQL> L

Page 571: Oracle Sql PortuguêS

C-15 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Comandos de Arquivo do SQL*PlusComandos de Arquivo do SQL*Plus

� SAVE nome_de_arquivo

� GET nome_de_arquivo

� START nome_de_arquivo

� @ nome_de_arquivo

� EDIT nome_de_arquivo

� SPOOL nome_de_arquivo

� EXIT

� SAVE nome_de_arquivo

� GET nome_de_arquivo

� START nome_de_arquivo

� @ nome_de_arquivo

� EDIT nome_de_arquivo

� SPOOL nome_de_arquivo

� EXIT

Page 572: Oracle Sql PortuguêS

C-17 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Created file my_query

SQL> START my_query

SQL> L1 SELECT last_name, manager_id, department_id2* FROM employees

SQL> SAVE my_query

Usando os Comandos SAVE e STARTUsando os Comandos SAVE e START

LAST_NAME MANAGER_ID DEPARTMENT_ID------------------------- ---------- -------------King 90Kochhar 100 90...20 rows selected.

Page 573: Oracle Sql PortuguêS

C-18 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

ResumoResumo

Use o SQL*Plus como um ambiente para:� Executar instruções SQL� Editar instruções SQL� Formatar a saída� Interagir com arquivos de script

Use o SQL*Plus como um ambiente para:� Executar instruções SQL� Editar instruções SQL� Formatar a saída� Interagir com arquivos de script

Page 574: Oracle Sql PortuguêS

DCopyright © Oracle Corporation, 2001. Todos os direitos reservados.

Criando Scripts Avançados

Page 575: Oracle Sql PortuguêS

D-2 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Objetivos

Após concluir este apêndice, você poderá fazero seguinte:� Descrever os tipos de problemas solucionados

usando o SQL para gerar SQL� Criar um script que gere um script de instruções

DROP TABLE

� Criar um script que gere um script de instruções INSERT INTO

Page 576: Oracle Sql PortuguêS

D-3 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Usando o SQL para Gerar SQL

DicionDicionárioáriode de dadosdados

Script SQLScript SQL

SQL

� O SQL pode ser usado para gerar scripts em SQL� O dicionário de dados

� É um conjunto de tabelas e views que contém informações sobre o banco de dados

� É criado e mantido pelo servidor Oracle

� O SQL pode ser usado para gerar scripts em SQL� O dicionário de dados

� É um conjunto de tabelas e views que contém informações sobre o banco de dados

� É criado e mantido pelo servidor Oracle

Page 577: Oracle Sql PortuguêS

D-5 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Criando um Script Básico

SELECT 'CREATE TABLE ' || table_name || '_test '|| 'AS SELECT * FROM ' || table_name ||' WHERE 1=2;' AS "Create Table Script"

FROM user_tables;

Page 578: Oracle Sql PortuguêS

D-6 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

SPOOL dropem.sql

SPOOL OFF

Controlando o Ambiente

Defina variDefina variáveisáveis dodosistema como valores sistema como valores apropriadosapropriados..

Redefina variRedefina variáveisáveisdodo sistema parasistema para o o valor default.valor default.

INSTRUÇÃO SQL

SET ECHO OFFSET FEEDBACK OFFSET PAGESIZE 0

SET FEEDBACK ONSET PAGESIZE 24SET ECHO ON

Page 579: Oracle Sql PortuguêS

D-7 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

O Quadro Geral

SET ECHO OFFSET FEEDBACK OFFSET PAGESIZE 0

SELECT 'DROP TABLE ' || object_name || ';'FROM user_objectsWHERE object_type = 'TABLE'/

SET FEEDBACK ONSET PAGESIZE 24SET ECHO ON

Page 580: Oracle Sql PortuguêS

D-8 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Efetuando um Dump do Conteúdode uma Tabela para um Arquivo

SET HEADING OFF ECHO OFF FEEDBACK OFFSET PAGESIZE 0

SELECT'INSERT INTO departments_test VALUES(' || department_id || ', ''' || department_name ||''', ''' || location_id || ''');'AS "Insert Statements Script"

FROM departments/

SET PAGESIZE 24SET HEADING ON ECHO ON FEEDBACK ON

Page 581: Oracle Sql PortuguêS

D-9 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Efetuando um Dump do Conteúdode uma Tabela para um Arquivo

Origem

'''X'''

''''

''''||department_name||''''

''', '''

''');'

Resultado

'X'

'

'Administration'

','

');

Page 582: Oracle Sql PortuguêS

D-10 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Gerando um Predicado Dinâmico

COLUMN my_col NEW_VALUE dyn_where_clause

SELECT DECODE('&&deptno', null,DECODE ('&&hiredate', null, ' ','WHERE hire_date=TO_DATE('''||'&&hiredate'',''DD-MON-YYYY'')'),DECODE ('&&hiredate', null,'WHERE department_id = ' || '&&deptno','WHERE department_id = ' || '&&deptno' ||' AND hire_date = TO_DATE('''||'&&hiredate'',''DD-MON-YYYY'')')) AS my_col FROM dual;

SELECT last_name FROM employees &dyn_where_clause;

Page 583: Oracle Sql PortuguêS

D-12 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Resumo

Neste apêndice, você aprendeu o seguinte: � É possível criar um script SQL para gerar outro

script SQL� Os arquivos de script geralmente usam o

dicionário de dados� Você pode capturar a saída em um arquivo

Page 584: Oracle Sql PortuguêS

D-13 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Visão Geral do Exercício D

Este exercício abrange os seguintes tópicos:� Criar um script para descrever e selecionar os

dados das suas tabelas� Criar um script para revogar privilégios de usuários

Page 585: Oracle Sql PortuguêS

ECopyright © Oracle Corporation, 2001. Todos os direitos reservados.

Componentes Arquitetônicosdo Oracle

Page 586: Oracle Sql PortuguêS

E-2 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Objetivos

Após concluir este apêndice, você poderá fazero seguinte:� Descrever a arquitetura do Oracle Server e seus

principais componentes� Listar as estruturas envolvidas ao conectar um

usuário a uma instância Oracle� Listar os estágios no processamento de:

� Consultas� Instruções DML� Commits

Page 587: Oracle Sql PortuguêS

E-3 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Banco de Dados

Arquivosde

redo log

Arquivosde

controle

Arquivosde dados

Visão GeralVisão GeralProcesso

do usuário

Processodo servidor

PGA

Arquivosde log

redo log

Arquivo deparâmetros

Arquivode senhas

Instância

SGA

Buffer deredo log

Cache debuffer de

dados

Pool compartilhado

Cache dodic. de dados

Cache debiblioteca

PMONDBW0SMON LGWRCKPT Outros

Page 588: Oracle Sql PortuguêS

E-5 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Arquivos de Bancos de Dados OracleArquivos de Bancos de Dados Oracle

Banco de Dados

Arquivosde dados

Arquivosde log

redo log

Arquivo deparâmetros

Arquivode senhas

Arquivosde

redo log

Arquivosde

controle

Page 589: Oracle Sql PortuguêS

E-6 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Outras Estruturas Físicas ImportantesOutras Estruturas Físicas Importantes

Arquivo deparâmetros

Arquivode senhas Banco de Dados

Arquivosde log

redo log

Page 590: Oracle Sql PortuguêS

E-7 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Instância OracleInstância Oracle

ProcessosProcessos dedesegundo planosegundo plano

Uma instância Oracle:� É uma forma de acessar um banco de dados Oracle� Sempre abre apenas um banco de dados

Uma instância Oracle:� É uma forma de acessar um banco de dados Oracle� Sempre abre apenas um banco de dados

EstruturasEstruturasdede memmemóriaória

Instância

SGA

Buffer deredo log

Cache debuffer de

dados

Pool compartilhado

PMONDBW0SMON LGWRCKPT Outros

Page 591: Oracle Sql PortuguêS

E-9 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Processando uma Instrução SQLProcessando uma Instrução SQL

� Conecte-se a uma instância usando:� O processo do usuário� O processo do servidor

� Os componentes do Oracle Server que são usados dependem do tipo de instrução SQL:� As consultas retornam linhas� As instruções DML registram alterações� O commit garante a recuperação da transação

� Alguns componentes do Oracle Server não participam do processamento de instruções SQL

� Conecte-se a uma instância usando:� O processo do usuário� O processo do servidor

� Os componentes do Oracle Server que são usados dependem do tipo de instrução SQL:� As consultas retornam linhas� As instruções DML registram alterações� O commit garante a recuperação da transação

� Alguns componentes do Oracle Server não participam do processamento de instruções SQL

Page 592: Oracle Sql PortuguêS

E-10 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Conectando-se a uma InstânciaConectando-se a uma Instância

Usuário Servidor

ServidorUsuário

ClienteCliente

Usuário Servidor

Servidor Oracle

ServidorServidorApplication serverApplication server

BrowserBrowser

Page 593: Oracle Sql PortuguêS

E-12 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Processando uma ConsultaProcessando uma Consulta

� Análise:� Procurar instrução idêntica� Verificar sintaxe, nomes de objeto e privilégios� Bloquear objetos usados durante a análise� Criar e armazenar o plano de execução

� Execução: Identificar linhas selecionadas� Extração: Retornar linhas ao processo do usuário

� Análise:� Procurar instrução idêntica� Verificar sintaxe, nomes de objeto e privilégios� Bloquear objetos usados durante a análise� Criar e armazenar o plano de execução

� Execução: Identificar linhas selecionadas� Extração: Retornar linhas ao processo do usuário

Page 594: Oracle Sql PortuguêS

E-13 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

O Pool CompartilhadoO Pool Compartilhado

� O cache de biblioteca contém o texto da instruçãoSQL, o código analisado e o plano de execução

� O cache do dicionário de dados contém tabela,coluna e outras definições de objeto e privilégios

� O pool compartilhado é dimensionado por SHARED_POOL_SIZE

� O cache de biblioteca contém o texto da instruçãoSQL, o código analisado e o plano de execução

� O cache do dicionário de dados contém tabela,coluna e outras definições de objeto e privilégios

� O pool compartilhado é dimensionado por SHARED_POOL_SIZE

Cache dodicionáriode dados

Cache debiblioteca

Poolcompartilhado

Page 595: Oracle Sql PortuguêS

E-15 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Cache de Buffer do Banco de DadosCache de Buffer do Banco de Dados

� Armazena os blocos usados recentemente� Tamanho de um buffer baseado em DB_BLOCK_SIZE� Número de buffers definido por DB_BLOCK_BUFFERS

� Armazena os blocos usados recentemente� Tamanho de um buffer baseado em DB_BLOCK_SIZE� Número de buffers definido por DB_BLOCK_BUFFERS

Cache debuffer de dados

Page 596: Oracle Sql PortuguêS

E-16 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Área Global do Programa (PGA)Área Global do Programa (PGA)

� Não compartilhada� Gravável somente pelo processo do servidor� Contém:

� Área de classificação� Informações sobre a sessão� Estado do cursor� Espaço de pilha

� Não compartilhada� Gravável somente pelo processo do servidor� Contém:

� Área de classificação� Informações sobre a sessão� Estado do cursor� Espaço de pilha

Processo doservidor

PGA

Page 597: Oracle Sql PortuguêS

E-17 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

1

1

Processando uma Instrução DMLProcessando uma Instrução DML

2 34

UPDATE

employees ...

Processodo usuário

Processodo servidor

Banco de Dados

Arquivosde

redo log

Arquivosde

controle

Arquivosde dados

SGA

Buffer deredo log

Cache debuffer de

dados

Poolcompartilhado

Page 598: Oracle Sql PortuguêS

E-19 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Buffer de Redo LogBuffer de Redo Log

� Tem seu tamanho definido por LOG_BUFFER� Registra alterações efetuadas pela instância� É usado seqüencialmente� É um buffer circular

� Tem seu tamanho definido por LOG_BUFFER� Registra alterações efetuadas pela instância� É usado seqüencialmente� É um buffer circular

Buffer deredo log

Page 599: Oracle Sql PortuguêS

E-20 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Segmento de RollbackSegmento de Rollback

InstruInstruççãoão DMLDML

Imagem antigaImagem antiga

ImagemImagemnovanova

SegmentoSegmento de rollbackde rollbackTabelaTabela

Page 600: Oracle Sql PortuguêS

E-21 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Banco de Dados

Arquivosde

redo log

Arquivosde

controle

Arquivosde dados

SGA

Buffer deredo log

Cache debuffer de

dados

LGWR

Instância

Processamento de COMMITProcessamento de COMMIT

1

23

4

Processodo usuário

Processodo servidor

Poolcompartilhado

Page 601: Oracle Sql PortuguêS

E-23 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Banco de Dados

Arquivosde

redo log

Arquivosde

controle

Arquivosde dados

Log Writer (LGWR)Log Writer (LGWR)

O LGWR grava quando:� Há um COMMIT � Um-terço do buffer

de redo logestá cheio

� Há mais de 1 MB de redo

� Antes de gravaçõesDBW0

O LGWR grava quando:� Há um COMMIT � Um-terço do buffer

de redo logestá cheio

� Há mais de 1 MB de redo

� Antes de gravaçõesDBW0

SGA

Buffer deredo log

Cache debuffer de

dados

LGWR

Poolcompartilhado

Page 602: Oracle Sql PortuguêS

E-24 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Outros Processos de Instância

� Outros processos necessários:� Database Writer (DBW0)� Process Monitor (PMON)� System Monitor (SMON)� Checkpoint (CKPT)

� O processo de arquivamento (ARC0) geralmente é criado em um banco de dados de produção

Page 603: Oracle Sql PortuguêS

E-25 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Banco de Dados

Arquivosde

redo log

Arquivosde

controle

Arquivosde dados

Database Writer (DBW0)Database Writer (DBW0)

O DBW0 grava quando:� Há muitos buffers

sujos� Há alguns buffers

livres� Ocorre timeout� Ocorre checkpoint

O DBW0 grava quando:� Há muitos buffers

sujos� Há alguns buffers

livres� Ocorre timeout� Ocorre checkpoint

SGA

Buffer deredo log

Cache debuffer de

dados

DBW0

Poolcompartilhado

Page 604: Oracle Sql PortuguêS

E-26 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

SMON: System Monitor

� Recupera a instância automaticamente:� Submete a rollforward as alterações nos redo logs� Abre o banco de dados para acesso do usuário� Submete a rollback as transações não

submetidas a commit� Une o espaço livre� Desaloca segmentos temporários

Page 605: Oracle Sql PortuguêS

E-27 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

PMON: Process Monitor

Faz uma limpeza após falha dos processos daseguinte maneira:� Submete a transação a rollback� Libera bloqueios� Libera outros recursos

Page 606: Oracle Sql PortuguêS

E-28 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

Resumo

Neste apêndice, você aprendeu a:� Identificar arquivos de banco de dados: arquivos

de dados, arquivos de controle, redo logs on-line� Descrever estruturas de memória SGA: cache de

buffer do banco de dados, pool SQL compartilhadoe buffer de redo log

� Explicar os principais processos de segundo plano: DBW0, LGWR, CKPT, PMON, SMON e ARC0

� Listar as etapas de processamento SQL: análise,execução, extração