Escolar Documentos
Profissional Documentos
Cultura Documentos
D64260BP10
Edição 1.0
Outubro de 2011
D74864
Autores Copyright © 2011, Oracle. Todos os direitos reservados.
Revisores e Este curso, em qualquer formato, incluindo seu material prático e impresso, contém
informações proprietárias exclusivas da Oracle. Este curso e as informações contidas
Colaboradores Técnicos aqui não podem ser divulgadas, copiadas, reproduzidas nem distribuídas sem a
permissão por escrito da Oracle. Seu conteúdo não faz parte do contrato de licença e
Claire Bennett nem pode ser incluído em nenhum acordo contratual com a Oracle, suas empresas
Ken Cooper subsidiárias ou afiliadas.
Yanti Chang
Este curso se destina apenas a fins informativos e tem como único objetivo auxiliar
Laszlo Czinkoczki você no planejamento para implementação e atualização dos recursos descritos do
Burt Demchick produto. Não é assumido o compromisso de fornecimento de qualquer material,
código ou funcionalidade e não há a implicação em decisões de compra. O
Gerlinde Frenzen desenvolvimento, a liberação e a duração de qualquer recurso ou funcionalidade
Joel Goodman
Designer Gráfico
Satish Bettegowda
Editores
Veena Narasimhan
Pavithran Adka
Conteúdo
I Introdução
Objetivos da Lição I-2
Agenda de Lições I-3
Objetivos do Curso I-4
Pré-Requisitos do Curso I-5
Agenda do Curso I-6
iii
Alterando a Senha 1-13
Agenda de Lições 1-14
Privilégios de Objeto 1-15
Concedendo Privilégios de Objeto 1-17
Repassando seus Privilégios 1-18
Confirmando Privilégios Concedidos 1-19
Agenda de Lições 1-20
Revogando Privilégios de Objeto 1-21
Questionário 1-23
Sumário 1-24
Exercício 1: Visão Geral 1-25
iv
Agenda de Lições 2-36
Tabelas Temporárias 2-37
Criando uma Tabela Temporária 2-38
Agenda de Lições 2-39
Tabelas Externas 2-40
Criando um Diretório para a Tabela Externa 2-41
Criando um Diretório para a Tabela Externa 2-43
Criando uma Tabela Externa Usando o ORACLE_LOADER 2-45
Consultando Tabelas Externas 2-47
Criando uma Tabela Externa Usando o ORACLE_DATAPUMP: Exemplo 2-48
Questionário 2-49
v
Questionário 3-27
Sumário 3-28
Exercício 3: Visão Geral 3-29
vi
Fusos Horários 5-4
Parâmetro de Sessão TIME_ZONE 5-5
CURRENT_DATE, CURRENT_TIMESTAMP e LOCALTIMESTAMP 5-6
Comparando Data/Horário no Fuso Horário de uma Sessão 5-7
DBTIMEZONE e SESSIONTIMEZONE 5-9
Tipos de dados TIMESTAMP 5-10
Campos TIMESTAMP 5-11
Diferença Entre DATE e TIMESTAMP 5-12
Comparando Tipos de Dados de TIMESTAMP 5-13
Agenda de Lições 5-14
Tipos de Dados de INTERVAL 5-15
vii
Usando o Operador EXISTS 6-20
Localize Todos os Departamentos que Não Possuem Funcionários 6-22
UPDATE Correlacionada 6-23
Usando uma Instrução UPDATE Correlacionada 6-24
DELETE Correlacionada 6-26
Usando a Instrução DELETE Correlacionada 6-27
Agenda de Lições 6-28
Cláusula WITH 6-29
Cláusula WITH: Exemplo 6-30
Cláusula Recursiva WITH 6-32
Cláusula Recursiva WITH: Exemplo 6-33
viii
Sumário 7-26
Exercício 7: Visão Geral 7-27
ix
Comandos de Edição do SQL*Plus D-9
Usando LIST, n e APPEND D-11
Usando o Comando CHANGE D-12
Comandos de Arquivo do SQL*Plus D-13
Usando os Comandos SAVE e START D-14
Comando SERVEROUTPUT D-15
Usando o Comando SPOOL do SQL*Plus D-16
Usando o Comando AUTOTRACE D-17
Sumário D-18
x
Função GROUPING: Exemplo F-12
GROUPING SETS F-13
GROUPING SETS: Exemplo F-15
Colunas compostas F-17
Colunas compostas: Exemplo F-19
Agrupamentos concatenados F-21
Agrupamentos concatenados: Exemplo F-22
Sumário F-23
xi
Processo log writer I-13
Processo checkpoint I-14
Processo monitor do sistema I-15
Processo do monitor do processo I-16
Arquitetura de armazenamento do banco de dados Oracle I-17
Estruturas Lógicas e Físicas do Banco de Dados I-19
Processando uma instrução SQL I-21
Processando uma consulta I-22
Shared Pool I-23
Buffer cache do banco de dados I-25
PGA (Program Global Area) I-26
xii
Introdução
Pré-Requisitos do Curso
A preparação exigida para este curso é o Oracle Database: Fundamentos de SQL I.
Este curso apresenta uma introdução à tecnologia de Oracle Database. Você aprenderá os
conceitos básicos de bancos de dados relacionais e a avançada linguagem de programação SQL.
São apresentadas as habilidades essenciais em SQL que permitem criar consultas para uma única
tabela ou várias, manipular dados nas tabelas, criar objetos de bancos de dados e consultar
metadados.
• Dia 1:
– Introdução
– Controlando o Acesso do Usuário
– Gerenciando Objetos de Esquema
– Gerenciando Objetos com Views do Dicionário de Dados
• Dia 2:
DEPARTAMENT LOCATION
department_id location_id
department_name street_address
manager_id postal_code
location_id cidade
state_province
country_id
JOB_HISTORY
employee_id
start_date EMPLOYEE
employee_id
end_date
first_name
job_id
Ambientes de Desenvolvimento
SQL Developer
Este curso foi desenvolvido usando o Oracle SQL Developer como a ferramenta para a execução
das instruções SQL abordadas nos exemplos no slide e nos exercícios.
• O SQL Developer versão 1.5.4 acompanha o Oracle Database 11g Release 2 e é a
ferramenta default desta aula.
• Além disso, o SQL Developer versão 1.5.4 também está disponível na máquina da sala de
aula e poderá ser instalado para uso. No momento da publicação deste curso, a versão 1.5.3
era a versão mais recente do SQL Developer.
SQL*Plus
O ambiente SQL*Plus também poderá ser usado para executar todos os comandos SQL
abordados neste curso.
Observação
• Consulte o Apêndice C, "Usando o SQL Developer", para obter informações sobre o uso do
SQL Developer, incluindo instruções simples sobre a instalação da versão 1.5.4.
• Consulte o Apêndice D, "Usando o SQL*Plus", para obter informações sobre como usar o
SQL*Plus.
Agenda de Lições
Os próximos slides apresentam uma breve visão geral de alguns dos conceitos básicos que você
aprendeu no curso Oracle Database: Fundamentos de SQL I.
…
Copyright © 2011, Oracle. Todos os direitos reservados.
Funções
Caracteres
• AVG
• COUNT
• MAX
• MIN
Group
• STDDEV funções
• SUM
A subconsulta (consulta interna) é executada uma vez antes da consulta principal (consulta
externa). O resultado da subconsulta é usado pela consulta principal.
Uma subconsulta de linha única usa um operador de linha única, como =, >, <, >=, <=, e <>.
Com uma subconsulta de várias linhas, você usa um operador de várias linhas como IN, ANY e
ALL.
Exemplo: Exibir detalhes de funcionários cujo salário seja igual ao salário mínimo.
SELECT last_name, salary, job_id
FROM employees
WHERE salary = (SELECT MIN(salary)
FROM employees );
No exemplo, a função de agrupamento MIN retorna um único valor para a consulta externa.
Observação: Neste curso, você aprenderá como usar subconsultas de várias colunas. As
subconsultas de várias colunas retornam mais de uma coluna da instrução SELECT interna.
Oracle Database: Fundamentos de SQL II I - 17
Verificação de Manipulando Dados
Função Descrição
É possível usar a instrução INSERT para adicionar linhas a uma tabela em que os valores sejam
derivados de tabelas existentes. Em substituição da cláusula VALUES, use uma subconsulta. O
número de colunas e os tipos de dados na lista de coluna da cláusula INSERT devem
corresponder ao número de valores e seus tipos de dados na subconsulta.
A instrução UPDATE modificará linhas específicas se você especificar a cláusula WHERE.
UPDATE table
SET column = value [, column = value, ...]
[WHERE condition];
Você pode remover as linhas existentes usando a instrução DELETE. É possível deletar
determinadas linhas especificando a cláusula WHERE na instrução DELETE.
DELETE [FROM] table
[WHERE condition];
Mais informações sobre a instrução MERGE podem ser obtidas na lição “Manipulando Grandes
Conjuntos de Dados”.
Oracle Database: Fundamentos de SQL II I - 18
Agenda de Lições
Objetivos
Nesta lição, você aprenderá a controlar o acesso a objetos específicos no banco de dados e
adicionar usuários com diferentes níveis de privilégios de acesso.
• Privilégios de sistema
• Criando uma função
• Privilégios de objeto
• Revogando privilégios de objeto
Banco de dados
Privilégios
Um privilégio é o direito de executar instruções SQL específicas. O administrador do banco de
dados (DBA) é um usuário de alto nível com a capacidade de criar usuários e conceder a eles
acesso ao banco de dados e seus objetos. Os usuários requerem privilégios de sistema para
acessar o banco de dados e privilégios de objeto para manipular o conteúdo dos objetos no banco
de dados. Os usuários também podem receber o privilégio para conceder privilégios adicionais a
outros usuários ou a funções, que são grupos nomeados de privilégios relacionados.
Esquemas
Um esquema é um conjunto de objetos como tabelas, views e sequências. O esquema pertence a
um usuário do banco de dados e o nome é igual ao do usuário.
Um privilégio do sistema é o direito de executar uma determinada ação ou executar uma ação
em qualquer objeto de esquema de um tipo específico. Um privilégio de objeto fornece ao
usuário a capacidade de executar uma determinada ação em um objeto de esquema específico.
Para obter mais informações, consulte o manual de referência do Oracle Database 2 Day DBA
for 10g or 11g database.
Privilégios de Sistema
Mais de 100 privilégios de sistema distintos estão disponíveis para usuários e funções.
Geralmente, os privilégios de sistema são fornecidos pelo DBA (Administrador do Banco de
Dados).
Privilégios Típicos para DBA
Criando Usuários
O DBA cria o usuário executando a instrução CREATE USER. O usuário não tem nenhum
privilégio nesse ponto. O DBA pode conceder privilégios a esse usuário. Esses privilégios
determinam o que o usuário pode fazer no nível do banco de dados.
O slide fornece a sintaxe resumida para criação de um usuário.
Na sintaxe:
user É o nome do usuário a ser criado
Password Especifica que o usuário deve efetuar login com essa senha
Para obter mais informações, consulte Oracle Database SQL Reference for 10g or 11g
database.
Observação: A partir do Oracle Database 11g, as senhas apresentam distinção entre maiúsculas
e minúsculas.
• Privilégios de sistema
• Criando uma função
• Privilégios de objeto
• Revogando privilégios de objeto
Usuários
Privilégios
Alterando a Senha
O DBA cria uma conta e inicializa uma senha para cada usuário. Você pode alterar sua senha
usando a instrução ALTER USER.
O exemplo do slide mostra que o usuário demo altera a senha usando a instrução ALTER USER.
Sintaxe
ALTER USER user IDENTIFIED BY password;
Na sintaxe:
user É o nome do usuário
password Especifica a nova senha
Embora essa instrução possa ser usada para alterar sua senha, há muitas outras opções. Você
deve ter o privilégio ALTER USER para alterar qualquer outra opção.
Para obter mais informações, consulte Oracle Database SQL Reference for 10g or 11g database.
Observação: A SQL*Plus possui um comando PASSWORD (PASSW) que pode ser usado para
alterar a senha de um usuário quando ele tiver efetuado login. Esse comando não está disponível
no SQL Developer.
• Privilégios de sistema
• Criando uma função
• Privilégios de objeto
• Revogando privilégios de objeto
Privilégio
de objeto Tabela View Sequência
ALTER
DELETE
INDEX
REFERENCES
SELECT
UPDATE
Privilégios de Objeto
Um privilégio de objeto é um privilégio ou direito de executar uma determinada ação em uma
tabela, view, sequência ou procedimento específico. Cada objeto possui um determinado
conjunto de privilégios concessíveis. A tabela no slide lista os privilégios de vários objetos.
Observe que os únicos privilégios que se aplicam a uma sequência são SELECT e ALTER.
UPDATE, REFERENCES e INSERT podem ser restringidos com a especificação de um
subconjunto de colunas atualizáveis.
Um privilégio SELECT pode ser restringido com a criação de uma view com um subconjunto de
colunas e concessão do privilégio SELECT apenas na view. Um privilégio concedido sobre um
sinônimo é convertido em um privilégio na tabela de base referenciada pelo sinônimo.
Observação: Com o privilégio REFERENCES, você pode garantir que os outros usuários
possam criar constraints FOREIGN KEY que façam referência à sua tabela.
Diretrizes
• Para conceder privilégios sobre um objeto, o objeto deve estar em seu próprio esquema ou
você deve possuir privilégios de objeto WITH GRANT OPTION.
• Um proprietário do objeto pode conceder qualquer privilégio de objeto sobre o objeto a
qualquer outro usuário ou função do banco de dados.
• O proprietário de um objeto adquire automaticamente todos os privilégios de objeto sobre
esse objeto.
O primeiro exemplo no slide concede ao usuário demo o privilégio para consultar sua tabela
EMPLOYEES. O segundo exemplo concede privilégios UPDATE sobre colunas específicas na
tabela DEPARTMENTS ao usuário demo e à função manager .
Por exemplo, se o seu esquema for oraxx, e o usuário demo quiser usar uma instrução
SELECT para obter dados de sua tabela EMPLOYEES, a sintaxe a ser usada será:
SELECT * FROM oraxx.employees;
Como alternativa, o usuário demo pode criar um sinônimo para a tabela e emitir uma instrução
SELECT com base no sinônimo:
CREATE SYNONYM emp FOR oraxx.employees;
SELECT * FROM emp;
Observação: Os DBAs geralmente alocam privilégios do sistema; qualquer usuário proprietário
de um objeto pode conceder privilégios de objeto.
Oracle Database: Fundamentos de SQL II 1 - 17
Repassando seus Privilégios
GRANT select
LIGADO alice.departments
TO PUBLIC;
• Privilégios de sistema
• Criando uma função
• Privilégios de objeto
• Revogando privilégios de objeto
Respostas: 1, 3, 4
Sumário
Os DBAs estabelecem a segurança inicial de banco de dados para usuários atribuindo privilégios
a eles.
• O DBA cria usuários que devem ter uma senha. O DBA também é responsável por
estabelecer privilégios iniciais do sistema para um usuário.
• Depois que o usuário tiver criado um objeto, ele poderá repassar qualquer um dos
privilégios de objeto disponíveis a outros usuários ou a todos eles usando a instrução
GRANT.
• Um DBA pode criar funções usando a instrução CREATE ROLE para repassar um conjunto
de privilégios de sistema ou objeto a vários usuários. As funções facilitam a manutenção de
privilégios de concessão e revogação.
• Os usuários podem alterar suas senhas usando a instrução ALTER USER.
• Você pode remover privilégios de usuários usando a instrução REVOKE.
• Com as views do dicionário de dados, os usuários podem exibir os privilégios concedidos a
eles e aqueles concedidos sobre seus objetos.
Objetivos
Esta lição contém informações sobre a criação de índices e restrições, além da alteração de
objetos existentes. Você também aprenderá sobre tabelas externas e a condição para nomear o
índice no momento da criação de uma restrição PRIMARY KEY.
ON DELETE
Usando a cláusula ON DELETE, você pode determinar como o Oracle Database manipula a
integridade referencial, se você remover um valor de chave primário ou referenciado.
ON DELETE CASCADE:
A ação ON DELETE CASCADE permite a deleção, mas não a atualização, de dados da
chave mãe referenciados pela tabela filha. Quando os dados na chave pai são deletados,
todas as linhas na tabela filha, que dependem dos valores deletados da chave pai, também
são deletadas. Para especificar essa ação referencial, inclua a opção ON DELETE
CASCADE na definição da restrição FOREIGN KEY .
ON DELETE SET NULL
Quando os dados da chave pai forem deletados, a ação ON DELETE SET NULL fará com
que todas as linhas da tabela filha que dependam do valor da chave pai deletada sejam
convertidos a nulos.
Se você omitir essa cláusula, a Oracle não permitirá que você delete valores chaves
referenciados na tabela pai que tenham linhas dependentes na tabela filha.
Alterando um atributo
SET CONSTRAINTS dept2_id_pk IMMEDIATE de restrição específico
Adiando Restrições
Você pode adiar as restrições de verificação de validade até o final da transação. Uma restrição é
adiada se o sistema não verificar se ela foi satisfeita, até que uma instrução COMMIT seja
enviada. Se uma restrição adiada for violada, o banco de dados retornará um erro, a transação
não será confirmada e será submetida a rollback. Se uma restrição for imediata (não adiada), ela
será verificada no final de cada instrução. Se ela for violada, será feito o rollback da instrução
imediatamente. Se uma restrição provocar uma ação (por exemplo, DELETE CASCADE), essa
ação será sempre tomada como parte da instrução que a provocou, seja ela adiada ou imediata.
Use a instrução SET CONSTRAINTS a fim de especificar, para uma determinada transação, se
uma restrição adiável é verificada seguindo cada instrução DML (data manipulation language)
ou quando a transação é submetida a commit. Para criar restrições adiáveis, você deve criar um
índice não-exclusivo para essa restrição.
Você pode definir restrições como adiáveis ou não adiáveis e inicialmente adiadas ou
inicialmente imediatas. Esses atributos podem ser diferentes para cada restrição.
Cenário de uso: A política da empresa determina que o número de departamento 40 deve ser
alterado para 45. A alteração da coluna DEPARTMENT_ID afeta funcionários designados a esse
departamento. Portanto, você torna as PRIMARY KEY e FOREIGN KEYsadiáveis e
inicialmente adiadas. As informações do departamento e do funcionário são atualizadas e, no
momento do commit, todas as linhas são validadas.
Exemplo 2: Insira uma linha que viole bonus_ck. Na instrução CREATE TABLE,
bonus_ck é especificada como uma restrição adiável e inicialmente adiada. Portanto, a
restrição não é verificada até que você use COMMIT ou defina o estado da restrição novamente
para imediato.
Oracle Database: Fundamentos de SQL II 2 - 16
Diferença Entre INITIALLY DEFERRED e INITIALLY IMMEDIATE (continuação)
INSERT INTO emp_new_sal VALUES(110, -1);
A inserção da linha foi executada com êxito. Mas observe que há um erro durante o commit da
transação.
COMMIT;
O commit falhou em razão de uma violação de restrição. Portanto, nesse momento, o banco de
dados faz o rollback da transação.
Exemplo 3: Defina o status DEFERRED para todas as restrições que possam ser adiadas.
Observe que você também pode definir o status DEFERRED para uma única restrição se
necessário.
Agora, se você tentar inserir uma linha que viole a restrição sal_ck, a instrução será executada
com êxito.
INSERT INTO emp_new_sal VALUES(90,5);
Mas observe que há um erro durante o commit da transação. A transação falha e é feito seu
rollback. Isso ocorre porque as duas restrições são verificadas depois de COMMIT.
COMMIT;
Exemplo 4: Defina o status IMMEDIATE para as duas restrições definidas como DEFERRED no
exemplo anterior.
SET CONSTRAINTS ALL IMMEDIATE;
Ocorrerá um erro se você tentar inserir uma linha que viole sal_ck ou bonus_ck.
INSERT INTO emp_new_sal VALUES(110, -1);
Observação: se você criar uma tabela sem especificar a capacidade de adiamento da restrição, a
restrição será marcada imediatamente no final de cada instrução. Por exemplo, com a instrução
CREATE TABLE da tabela newemp_details, se você não especificar a capacidade de
adiamento da restrição newemp_det_pk, a restrição será verificada imediatamente.
CREATE TABLE newemp_details(emp_id NUMBER, emp_name
VARCHAR2(20),
CONSTRAINT newemp_det_pk PRIMARY KEY(emp_id));
Durante a tentativa de adiar a restrição newemp_det_pk que não é adiável, ocorre o seguinte
erro:
SET CONSTRAINT newemp_det_pk DEFERRED;
Restrições em Cascata
Esta instrução ilustra o uso da cláusula CASCADE CONSTRAINTS. Suponha que a tabela
TEST1 seja criada como se segue:
CREATE TABLE test1 (
col1_pk NUMBER PRIMARY KEY,
col2_fk NUMBER,
col1 NUMBER,
col2 NUMBER,
CONSTRAINT fk_constraint FOREIGN KEY (col2_fk) REFERENCES
test1,
CONSTRAINT ck1 CHECK (col1_pk > 0 and col1 > 0),
CONSTRAINT ck2 CHECK (col2_fk > 0));
Um erro é retornado para as seguintes instruções:
ALTER TABLE test1 DROP (col1_pk); —col1_pk é uma chave pai.
ALTER TABLE test1 DROP (col1); —col1 é indicada pela restrição de
várias colunas, ck1.
Exemplo:
Removendo um índice
Não é possível modificar índices. Para alterar um índice, primeiro elimine, depois recrie.
Remova uma definição de índice do dicionário de dados emitindo a instrução DROP INDEX.
Para eliminar um índice, você deve ser o proprietário do índice ou ter o privilégio DROP ANY
INDEX.
Na sintaxe:
index É o nome do índice
Observação: Se você eliminar uma tabela, os índices, as restrições e os triggers serão
automaticamente eliminados, mas as views e as sequências permanecerão.
FLASHBACK TABLE[schema.]table[,
Quando a
sessão/transação
for concluída
Tabelas Temporárias
Uma tabela temporária é aquela que retém os dados existentes somente pela duração de uma
transação ou sessão. Os dados de uma tabela temporária são privados para a sessão, o que
significa que cada sessão só pode ver e modificar os próprios dados.
As tabelas temporárias são úteis em aplicações onde é necessário colocar um conjunto de
resultados em buffer. Por exemplo, um carrinho de compras em uma aplicação on-line pode ser
uma tabela temporária. Cada item é representado por uma linha na tabela temporária. Enquanto
você está comprando em uma loja on-line, pode continuar adicionando ou removendo itens do
carrinho. Durante a sessão, os dados desse carrinho são privados. Quando você finaliza a compra
e faz os pagamentos, a aplicação move a linha do carrinho escolhido para uma tabela
permanente. No fim da sessão, os dados da tabela temporária são automaticamente eliminados.
Como as tabelas temporárias são definidas estaticamente, você pode criar índices para elas. Os
índices criados em tabelas temporárias também são temporárias. Os dados do índice têm o
mesmo escopo da sessão ou transação que os dados da tabela temporária. Você também pode
criar uma view ou acionar uma tabela temporária.
Tabelas Externas
Uma tabela externa é uma tabela somente para leitura cujos metadados são armazenados no
banco de dados, mas cujos dados são armazenados fora do banco de dados. Essa definição de
tabela externa pode ser considerada como uma view usada para executar qualquer consulta SQL
de dados externos sem precisar que os dados externos sejam carregados primeiro no banco de
dados. Os dados da tabela externa podem ser consultados e associados diretamente e em paralelo
sem requerer que os dados externos sejam carregados primeiro no banco de dados. Você pode
usar SQL, PL/SQL e Java para consultar os dados de uma tabela externa.
A diferença principal entre as tabelas externas e as comuns é que as tabelas organizadas
externamente são somente para leitura. Não é possível executar nenhuma operação DML (Data
Manipulation Language) e nenhum índice pode ser criado. Entretanto, você pode criar uma
tabela externa e descarregar dados usando o comando CREATE TABLE AS SELECT.
O Oracle Server oferece dois drivers de acesso principais para tabelas externas. Um, o driver de
acesso do carregador (ou ORACLE_LOADER), é usado para ler dados de arquivos externos cujo
formato possa ser interpretado pelo utilitário SQL*Loader. Observe que nem toda
funcionalidade do SQL*Loader é compatível com tabelas externas. O driver de acesso
ORACLE_DATAPUMP pode ser usado para importar e exportar dados usando um formato
independente da plataforma. O driver de acesso ORACLE_DATAPUMP grava linhas de uma
instrução SELECT para serem carregadas em uma tabela externa como parte de uma instrução
CREATE TABLE ...ORGANIZATION EXTERNAL...AS SELECT. Em seguida, você pode
usar SELECT para ler dados desse arquivo de dados. Também é possível criar uma definição de
tabela externa em outro sistema e usar esse arquivo de dados. Isso permite que os dados sejam
movidos entre os bancos de dados Oracle.
Oracle Database: Fundamentos de SQL II 2 - 40
Criando um Diretório para a Tabela Externa
SELECT *
FROM oldemp
Resposta: 2
Resposta: 2
Sumário
Nesta lição, você aprendeu a executar as seguintes tarefas para gerenciamento de objeto de
esquema:
• Alterar tabelas para adicionar ou modificar colunas ou restrições.
• Criar índices baseados ou não em function usando a instrução CREATE INDEX.
• Eliminar colunas não usadas.
• Usar mecanismos de FLASHBACK para restaurar tabelas.
• Usar a cláusula ORGANIZATION EXTERNAL da instrução CREATE TABLE para
criar uma tabela externa. Uma tabela externa é uma tabela somente para leitura cujos
metadados são armazenados no banco de dados, mas cujos dados são armazenados fora do
banco de dados.
• Usar tabelas externas para consultar dados sem carregá-los primeiro no banco de dados.
• Nomear índices da coluna PRIMARY KEY durante a criação da tabela com a instrução
CREATE TABLE.
Objetivos
Nesta lição, você conhecerá as views do dicionário de dados. Aprenderá que as views do
dicionário de dados podem ser usadas para recuperar metadados e criar relatórios sobre seus
objetos de esquema.
Oracle Server
Dicionário de Dados
As tabelas do usuário são criadas pelo usuário e contêm dados comerciais, como EMPLOYEES.
Há outro conjunto de tabelas e views no banco de dados Oracle conhecido como dicionário de
dados Esse conjunto é criado e mantido pelo Oracle Server e contém informações sobre o banco
de dados. O dicionário de dados é estruturado em tabelas e views, da mesma forma que outros
dados do banco de dados. Não é apenas a central do dicionário de dados de cada banco de dados
Oracle, mas é uma ferramenta importante para todos os usuários, desde os usuários finais até
designers de aplicação e administradores de banco de dados.
O dicionário de dados é acessado por meio de instruções SQL. Como o dicionário de dados é
somente para leitura, você só pode consultar suas tabelas e views.
Podem ser consultadas views do dicionário baseadas nas tabelas do dicionário para localizar
informações como:
• Definições de todos os objetos de esquema no banco de dados (tabelas, views, índices,
sinônimos, sequências, procedures, functions, packages, triggers etc.)
• Valores padrão para colunas
• Informações de constraint de integridade
• Nomes de usuários Oracle
• Privilégios e funções que cada usuário recebeu
• Outras informações gerais do banco de dados
Oracle Server
Consiste em:
USER_OBJECTS:
• Consulte USER_OBJECTS para ver todos os objetos que
pertencem a você
• Usando USER_OBJECTS, você pode obter uma lista de
todos os nomes e tipos de objeto em seu esquema, além
das seguintes informações adicionais:
Observação: Esta não é uma lista completa de colunas. Para obter uma lista completa, consulte
"USER_OBJECTS” no Oracle Database Reference.
Você também pode consultar a view ALL_OBJECTS para obter uma lista de todos os objetos
aos quais tem acesso.
USER_OBJECTS View
O exemplo mostra nomes, tipos, datas de criação e status de todos os objetos pertencentes a este
usuário.
A coluna OBJECT_TYPE contém os valores de TABLE, VIEW, SEQUENCE, INDEX,
PROCEDURE, FUNCTION, PACKAGE ou TRIGGER.
A coluna STATUS contém o valor VALID, INVALID ou N/A. Embora as tabelas sejam sempre
válidas, as views, os procedures, as functions, os packages e os triggers podem ser inválidos.
A View CAT
Para obter uma consulta e resultado simplificados, você pode consultar a view CAT. Essa view
contém apenas duas colunas: TABLE_NAME e TABLE_TYPE. Ela fornece os nomes de todos os
objetos INDEX, TABLE, CLUSTER, VIEW, SYNONYM, SEQUENCE ou UNDEFINED.
Observação: CAT é um sinônimo para USER_CATALOG—uma view que lista tabelas, views,
sinônimos e sequências pertencentes ao usuário.
USER_TABLES:
DESCRIBE user_tables
Informações da Tabela
Você pode usar a view USER_TABLES para obter os nomes de todas as suas tabelas. A view
USER_TABLES contém informações sobre suas tabelas. Além de fornecer o nome da tabela, ela
contém informações detalhadas sobre o armazenamento.
A view TABS é um sinônimo da view USER_TABLES. Ela pode ser consultada para obter uma
lista de tabelas pertencentes a você:
SELECT table_name
FROM tabs;
Observação: Para obter uma lista completa de colunas na view USER_TABLES, consulte
“USER_TABLES” no Oracle Database Reference.
Você também pode consultar a view ALL_TABLES para obter uma lista de todas as tabelas às
quais tem acesso.
USER_TAB_COLUMNS:
DESCRIBE user_tab_columns
Informações da Coluna
Consulte a view USER_TAB_COLUMNS para localizar informações detalhadas sobre as colunas
em suas tabelas. Embora a view USER_TABLES forneça informações sobre nomes de tabela e
armazenamento, informações detalhadas sobre a coluna estão localizadas na view
USER_TAB_COLUMNS.
Essa view contém informações como:
• Nomes de colunas
• Tipos de dados de coluna
• Comprimento dos tipos de dados
• Precisão e escala para colunas NUMBER
• Se os nulos são permitidos (Há uma constraint NOT NULL na coluna?)
• Valor padrão
Observação: Para obter uma lista e descrição completas das colunas na view
USER_TAB_COLUMNS, consulte “USER_TAB_COLUMNS” no Oracle Database Reference.
Informações de Constraint
Você pode descobrir os nomes e o tipo de constraints, o nome da tabela à qual a constraint se
aplica, a condição das constraints de verificação, as informações de constraint da chave
estrangeira, a regra de deleção de constraints de chave estrangeira, o status e muitos outros tipos
de informações.
Observação: Para obter uma lista e descrição completas das colunas na view
USER_CONSTRAINTS, consulte “USER_CONSTRAINTS” no Oracle Database Reference.
USER_CONSTRAINTS: Exemplo
No exemplo mostrado, a view USER_CONSTRAINTS é consultada para localizar nomes, tipos,
verificar condições, nome da constraint exclusiva a que a chave estrangeira faz referência, regra
de deleção de uma chave estrangeira e status da constraint na tabelaEMPLOYEES.
CONSTRAINT_TYPE pode ser:
• C (constraint de verificação em uma tabela ou NOT NULL)
• P (chave primária)
• U (chave exclusiva)
• R (integridade referencial)
• V (com a opção de verificação, em uma view)
• O (com a opção somente para leitura, em uma view)
DESCRIBE user_cons_columns
…
Copyright © 2011, Oracle. Todos os direitos reservados.
Consultando USER_CONS_COLUMNS
Para localizar os nomes das colunas às quais uma constraint se aplica, consulte a view de
dicionário USER_CONS_COLUMNS. Essa view informa o nome do proprietário de uma
constraint, o nome da constraint, a tabela e as colunas que contêm a constraint e a posição
original da coluna ou atributo na definição do objeto.
Observação: Uma constraint pode ser aplicada a mais de uma coluna.
Você também pode criar uma join entre USER_CONSTRAINTS e USER_CONS_COLUMNS a
fim de criar um resultado personalizado com base nas duas tabelas.
1 DESCRIBE user_views
Informações da View
Depois de criar a view, você pode consultar a view de dicionário de dados USER_VIEWS para
obter o nome e a definição da view. O texto da instrução SELECT que constitui sua view é
armazenado na coluna LONG. A coluna LENGTH representa o número de caracteres na instrução
SELECT. Por padrão, quando você seleciona a coluna LONG, são exibidos somente os 80
primeiros caracteres do valor da coluna. Para ver mais de 80 caracteres no SQL*Plus, use o
comando SET LONG:
SET LONG 1000
Nos exemplos do slide:
1. As colunas USER_VIEWS são exibidas. Note que essa é uma lista parcial.
2. Os nomes de suas views são recuperados
3. A instrução SELECT para EMP_DETAILS_VIEW é exibida a partir do dicionário
Acesso a Dados Usando Views
Quando você acessa dados usando uma view, o Oracle Server executa as seguintes operações:
• Ele recupera a definição da view da tabela de dicionário de dados USER_VIEWS.
• Ele verifica os privilégios de acesso para a tabela-base da view.
• Ele converte a consulta da view em uma operação equivalente na tabela(s)-base
subjacente(s). Ou seja, os dados são recuperados das tabelas-base ou uma atualização é feita
nelas.
DESCRIBE user_sequences
Informações de Sequência
A view USER_SEQUENCES descreve todas as sequências pertencentes a você. Ao criar a
sequência, você especifica critérios que são armazenados na view USER_SEQUENCES. As
colunas nesta view são:
• SEQUENCE_NAME: Nome da sequência
• MIN_VALUE: Valor mínimo da sequência
• MAX_VALUE: Valor máximo da sequência
• INCREMENT_BY: Valor pelo qual a sequência é incrementada
• CYCLE_FLAG: A sequência é quebrada em linhas ao atingir o limite?
• ORDER_FLAG: Os números da sequência são gerados na ordem?
• CACHE_SIZE: Números de sequência em cache
• LAST_NUMBER: Número da última sequência gravada em disco. Se uma sequência usar a
gravação em cache, o número gravado no disco será o último número colocado no cache de
sequência. É provável que esse número seja maior que o da última sequência usada.
Confirmando Sequências
Depois de criar sua sequência, ela é documentada no dicionário de dados. Como uma sequência
é um objeto de banco de dados, você pode identificá-la na tabela de dicionário de dados
USER_OBJECTS.
Também é possível confirmar as configurações da sequência por meio da seleção da view de
dicionário de dados USER_SEQUENCES .
Exibindo o Próximo Valor de Sequência Disponível Sem Incrementá-lo
Se a sequência tiver sido criada com NOCACHE, será possível exibir o próximo valor de
sequência disponível sem incrementá-lo consultando a tabela USER_SEQUENCES.
DESCRIBE user_indexes
Informações do Índice
Consulte a view USER_INDEXES para descobrir os nomes dos índices, da tabela em que o
índice foi criado e se o índice é exclusivo.
Observação: Para obter uma lista e descrição completas das colunas na view USER_INDEXES,
consulte “USER_INDEXES” no Oracle Database Reference for 10g or 11g database.
USER_INDEXES: Exemplo
No exemplo do slide a, a view USER_INDEXES é consultada para localizar o nome do índice e
da tabela na qual o índice foi criado e se o índice é exclusivo.
No exemplo do slide b, observe que o Oracle Server fornece um nome genérico ao índice criado
para a coluna PRIMARY KEY. A tabela EMP_LIB é criada com o uso do seguinte código:
CREATE TABLE EMP_LIB
(book_id NUMBER(6)PRIMARY KEY ,
title VARCHAR2(25),
category VARCHAR2(20));
DESCRIBE user_ind_columns
Consultando USER_IND_COLUMNS
A view de dicionário USER_IND_COLUMNS fornece informações, como nome do índice e
nome da tabela indexada, nome de uma coluna no índice e posição da coluna no índice.
Para o exemplo do slide, a tabela emp_test e o índice LNAME_IDX são criados com o uso do
seguinte código:
CREATE TABLE emp_test AS SELECT * FROM employees;
CREATE INDEX LNAME_IDX ON emp_test(Last_Name);
DESCRIBE user_synonyms
Informações de Sinônimo
A view de dicionário USER_SYNONYMS descreve sinônimos particulares (sinônimos
pertencentes a você).
Essa view pode ser consultada para localizar sinônimos. Você pode consultar ALL_SYNONYMS
para saber o nome de todos os sinônimos disponíveis e os objetos aos quais esses sinônimos se
aplicam.
As colunas nesta view são:
• SYNONYM_NAME: Nome do sinônimo
• TABLE_OWNER: Proprietário do objeto referenciado pelo sinônimo
• TABLE_NAME: Nome da tabela ou view referenciada pelo sinônimo
• DB_LINK: Nome da referência do link de banco de dados (se houver)
Sintaxe
Na sintaxe:
table É o nome da tabela
column É o nome da coluna na tabela
text É o texto do comentário
Você pode eliminar um comentário do banco de dados configurando-o como string vazia (''):
COMMENT ON TABLE employees IS '';
Oracle Database: Fundamentos de SQL II 3 - 26
Questionário
Resposta: 5
Sumário
Nesta lição, você conheceu algumas views de dicionário disponíveis. Elas podem ser usadas para
localizar informações sobre suas tabelas, constraints, views, sequências e sinônimos.
Objetivos
Nesta lição, você aprenderá a manipular dados no banco de dados Oracle usando subconsultas.
Aprenderá a usar a palavra-chave DEFAULTnas instruções INSERT e UPDATE para identificar
um valor de coluna default. Você também aprenderá sobre instruções INSERT em várias
tabelas, a instrução MERGE e como controlar alterações no banco de dados.
Defaults Explícitos
A palavra-chave DEFAULT pode ser usada nas instruções INSERT e UPDATE para identificar
um valor de coluna default. Se não existir um valor default, será usado um valor nulo.
A opção DEFAULT o poupa de codificar o valor default nos seus programas ou de consulta ao
dicionário para localizá-lo, como era feito antes da introdução deste recurso. A codificação do
default é um problema no caso de alteração do default, porque o código consequentemente
precisa ser alterado. O acesso ao dicionário geralmente não é feito em uma aplicação, por isso
este é um recurso muito importante.
Target_a
Sourcetab
• conditional_insert_clause:
[ALL|FIRST]
Contratado
antes de 1995
EMP_HISTORY
EMP_SALES
INSERT ALL
INSERT ALL
WHEN job_id IN
(select job_id FROM jobs WHERE job_title LIKE '%Manager%')
THEN
INTO managers2(last_name,job_id,SALARY)
VALUES (last_name,job_id,SALARY)
WHEN SALARY>10000 THEN
INTO richpeople(last_name,job_id,SALARY)
VALUES (last_name,job_id,SALARY)
Resultado:
116 rows inserted
Cenário: Se o salário de
um funcionário for 2.000,
o registro será inserido
somente na tabela Salário < 5.000
SAL_LOW.
SAL_LOW
5000 <=
Salário <=
Caso
contrário,
SAL_HIGH
INSERT FIRST
WHEN salary < 5000 THEN
INTO sal_low VALUES (employee_id, last_name, salary)
WHEN salary between 5000 and 10000 THEN
INTO sal_mid VALUES (employee_id, last_name, salary)
176 6 2000
176 6 3000
176 6 4000
176 6 5000
176 6 6000
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,
DESC SALES_INFO
Observe no exemplo anterior que, durante a criação de um pivô com INSERT, uma linha da
tabela SALES_SOURCE_DATA é convertida em cinco registros para a tabela relacional,
SALES_INFO.
Instrução MERGE
O servidor Oracle suporta a instrução MERGE para operações com as instruções INSERT,
UPDATE e DELETE. Usando essa instrução, você pode atualizar, inserir ou deletar uma linha de
modo condicional em uma tabela, evitando várias instruções DML. A decisão de atualizar,
inserir ou deletar na tabela de destino é baseada em uma condição na cláusula ON.
Você deve ter os privilégios de objeto INSERT e UPDATE na tabela de destino e o privilégio de
objeto SELECT na tabela de origem. Para especificar a cláusula DELETE de
merge_update_clause, você também deve ter o privilégio de objeto DELETE na tabela de
destino.
A instrução MERGE é determinística. Você não pode atualizar a mesma linha da tabela de
destino várias vezes na mesma instrução MERGE.
Uma abordagem alternativa é o uso de loops PL/SQL e várias instruções DML. Entretanto, a
instrução MERGE é fácil de usar e expressada basicamente como uma única instrução SQL.
A instrução MERGE é adequada em várias aplicações de data warehouse. Por exemplo, em uma
aplicação de data warehousing, talvez você precise trabalhar com dados provenientes de várias
origens, algumas das quais podem ser duplicadas. Com a instrução MERGE, você pode adicionar
ou modificar linhas condicionalmente.
Intercalando Linhas
Você pode atualizar linhas existentes e inserir novas condicionalmente usando a instrução
MERGE. Com a instrução MERGE, você pode atualizar linhas ao mesmo tempo em que deleta as
antigas de uma tabela. Para fazer isso, inclua uma cláusula DELETE com sua própria cláusula
WHERE na sintaxe da instrução MERGE.
Na sintaxe:
Cláusula INTO Especifique a tabela de destino em que estiver inserindo ou atualizando
Cláusula USING Identifica a origem dos dados a serem atualizados ou inseridos; pode ser
uma tabela, view ou subconsulta
Cláusula ON A condição na qual a operação MERGE atualiza ou insere
WHEN MATCHED | Instrui o servidor sobre como responder aos resultados da condição de
join
WHEN NOT MATCHED
Observação: Para obter mais informações, consulte Oracle Database SQL Reference for 10g or
11g database.
...
Observe que há alguns funcionários com SALARY < 10000 e há dois com
COMMISSION_PCT.
O exemplo do slide corresponde a EMPLOYEE_ID na tabela COPY_EMP3 para o
EMPLOYEE_ID na tabela EMPLOYEES. Se houver uma correspondência, a linha na tabela
COPY_EMP3 é atualizada para corresponder à linha na tabela EMPLOYEES, e o salário do
funcionário será dobrado. Os registros dos dois funcionários com valores na coluna
COMMISSION_PCT são deletados. Se a correspondência não for localizada, as linhas serão
inseridas na tabela COPY_EMP3.
Consulta da
versão
SELECT
…
1 3
Resposta: 1
Sumário
Nesta lição, você aprendeu a manipular dados no banco de dados Oracle usando subconsultas.
Aprendeu também sobre instruções INSERT em várias tabelas, a instrução MERGE e
rastreamento de alterações no banco de dados.
Objetivos
Nesta lição, você aprenderá a usar tipos de dados semelhantes a DATE que armazenem frações
de segundos e rastreiem fusos horários. Esta lição trata de algumas das functions de data/horário
disponíveis no banco de dados Oracle.
• CURRENT_DATE, CURRENT_TIMESTAMP
e LOCALTIMESTAMP
• Tipos de dados INTERVAL
• Usando as seguintes functions:
– EXTRACT
– TZ_OFFSET
-08:00 +07:00
Fusos Horários
As horas do dia são medidas pela rotação da Terra. O horário do dia em um determinado
momento dependerá de sua localização. Quando for meio-dia em Greenwich, Inglaterra, será
meia-noite ao longo da Linha de Data Internacional. A Terra está dividida em 24 fusos horários,
um para cada hora do dia. O horário ao longo do principal meridiano em Greenwich, Inglaterra,
é conhecido como Tempo Médio de Greenwich, ou GMT. O GMT atualmente é conhecido
como Coordinated Universal Time - Hora Universal, ou UTC. O UTC é o horário padrão usado
como referência por todos os outros fusos horários do mundo. É igual durante todo o ano e não é
afetado pela estação de verão nem pelo horário de verão. A linha do meridiano é imaginária e se
estende do Polo Norte ao Polo Sul. É conhecida como de longitude zero e é a linha a partir da
qual todas as outras linhas de longitude são medidas. Todo o horário é medido em relação ao
UTC e todos os locais têm uma latitude (sua distância ao norte ou sul do Equador) e uma
longitude (sua distância a leste ou oeste do meridiano de Greenwich).
ALTER SESSION
SET NLS_DATE_FORMAT = 'DD-MON-YYYY HH24:MI:SS';
ALTER SESSION SET TIME_ZONE = '-5:00';
DBTIMEZONE e SESSIONTIMEZONE
O DBA define o fuso horário default do banco de dados ao especificar a cláusula SET
TIME_ZONE da instrução CREATE DATABASE . Se for omitido, o fuso horário default do
banco de dados será o fuso horário do sistema operacional. O fuso horário do banco de dados
não pode ser alterado em uma sessão com uma instrução ALTER SESSION.
A function DBTIMEZONE retorna o valor do fuso horário do banco de dados. O tipo de retorno é
um deslocamento de fuso horário (um tipo de caractere no formato: '[+|-]TZH:TZM') ou um
nome de região de fuso horário, dependendo de como o usuário especificou o valor do fuso
horário do banco de dados na instrução CREATE DATABASE ou ALTER DATABASE mais
recente. O exemplo do slide mostra que o fuso horário do banco de dados foi definido como “–
05:00,” pois o parâmetro TIME_ZONE está no formato:
TIME_ZONE = '[+ | -] hh:mm'
A function SESSIONTIMEZONE retorna o valor do fuso horário da sessão atual. O tipo de
retorno é um deslocamento de fuso horário (um tipo de caractere no formato '[+|-
]TZH:TZM') ou um nome de região de fuso horário, dependendo de como o usuário
especificou o valor do fuso horário da sessão na instrução ALTER SESSION mais recente. O
exemplo do slide mostra que o fuso horário da sessão é o deslocamento para UTC em –8 horas.
Observe que o fuso horário do banco de dados é diferente do da sessão atual.
Campos de TIMESTAMP
Cada tipo de dados de data/horário é composto de vários desses campos. Datas/horários só serão
mutuamente comparáveis e atribuíveis se tiverem os mesmos campos de data/horário.
A B
-- when hire_date is ALTER TABLE employees
of type DATE MODIFY hire_date TIMESTAMP;
• CURRENT_DATE, CURRENT_TIMESTAMP
e LOCALTIMESTAMP
• Tipos de dados de INTERVAL
• Usando as seguintes functions:
– EXTRACT
– TZ_OFFSET
MÊS 00 a 11
MINUTE 00 a 59
Campos INTERVAL
INTERVAL YEAR TO MONTH pode ter campos para YEAR e MONTH.
INTERVAL DAY TO SECOND podem ter campos para DAY, HOUR, MINUTE e SECOND.
O subconjunto real de campos que constitui um item do tipo de intervalo é definido por um
qualificador de intervalo e esse subconjunto é conhecido como precisão do item.
Os intervalos de ano-mês são mutuamente comparáveis e atribuíveis apenas a outros intervalos
de ano-mês, e os de dia-hora são mutuamente comparáveis e atribuíveis somente a outros
intervalos de dia-hora.
• CURRENT_DATE, CURRENT_TIMESTAMP
e LOCALTIMESTAMP
• Tipos de dados de INTERVAL
• Usando as seguintes functions:
– EXTRACT
– TZ_OFFSET
EXTRACT
A expressão EXTRACT extrai e retorna o valor de um campo de data/horário especificado de
uma expressão de valor de data/horário ou intervalo. Você pode extrair qualquer componente
citado na sintaxe anterior usando a function EXTRACT. A sintaxe da function EXTRACT é:
SELECT EXTRACT ([YEAR] [MONTH][DAY] [HOUR] [MINUTE][SECOND]
[TIMEZONE_HOUR] [TIMEZONE_MINUTE]
[TIMEZONE_REGION] [TIMEZONE_ABBR]
FROM [datetime_value_expression] [interval_value_expression]);
Quando você extrai TIMEZONE_REGION ou TIMEZONE_ABBR (abreviação), o valor
retornado é uma string que contém o nome ou a abreviação do fuso horário apropriado. Quando
extrai qualquer um dos outros valores, o valor retornado é uma data do calendário gregoriano.
Durante a extração de data/horário com um valor de fuso horário, o valor retornado está em
UTC.
No primeiro exemplo do slide, a function EXTRACT é usada para extrair YEAR de SYSDATE.
No segundo exemplo do slide, a function EXTRACT é usada a fim de extrair MONTH da coluna
HIRE_DATE da tabela EMPLOYEES para os funcionários que reportam ao gerente cujo
EMPLOYEE_ID seja 100.
SELECT TZ_OFFSET('US/Eastern'),
TZ_OFFSET('Canada/Yukon'),
TZ_OFFSET('Europe/London')
FROM DUAL;
TZ_OFFSET
A function TZ_OFFSET retorna o deslocamento de fuso horário correspondente ao valor
informado. O valor de retorno depende da data em que a instrução é executada. Por exemplo, se
a function TZ_OFFSET retornar um valor –08:00, esse valor indicará que o fuso horário em que
o comando foi executado está oito horas atrás do UTC. Você pode informar um nome de fuso
horário válido, um deslocamento de fuso horário do UTC (que retorna a si mesmo) ou a palavra-
chave SESSIONTIMEZONE ou DBTIMEZONE. A sintaxe da function TZ_OFFSET é:
TZ_OFFSET ( ['time_zone_name'] '[+ | -] hh:mm' ]
[ SESSIONTIMEZONE] [DBTIMEZONE]
A Ford Motor Company possui sede em Michigan, EUA, cujo fuso horário é o do leste dos
Estados Unidos. O presidente da empresa, sr. Ford, deseja conduzir uma conference call com os
vice-presidentes de operações do Canadá e da Europa, que estão nos fusos horários de
Canadá/Yukon e Europa/Londres, respectivamente. O sr. Ford deseja saber o horário em cada
um desses locais para confirmar a participação de sua gerência na reunião. Seu assistente, o sr.
Scott, ajuda emitindo as consultas mostradas no exemplo e obtém os seguintes resultados:
• O fuso horário 'US/Eastern' está atrasado quatro horas em relação ao UTC.
• O fuso horário 'Canada/Yukon' está atrasado sete horas em relação ao UTC.
• O fuso horário 'Europe/London' está uma hora adiantado em relação ao UTC.
SELECT FROM_TZ(TIMESTAMP
'2000-07-12 08:00:00', 'Australia/North')
FROM DUAL;
FROM_TZ
A function FROM_TZ converte um valor de TIMESTAMP em um valor de TIMESTAMP WITH
TIME ZONE .
A sintaxe da function FROM_TZ é:
FROM_TZ(TIMESTAMP timestamp_value, time_zone_value)
em que time_zone_value é uma string de caracteres no formato 'TZH:TZM' ou uma
expressão de caracteres que retorna uma string em TZR (região de fuso horário) com um formato
TZD opcional. TZD é uma string de fuso horário abreviada com informações sobre o horário de
verão. TZR representa a região do fuso horário nas strings de entrada de data/horário.
'Australia/North' e 'PST' são exemplos para o horário padrão EUA/Pacífico, 'PDT'
para horário de verão EUA/Pacífico etc.
O exemplo do slide converte um valor de TIMESTAMP em TIMESTAMP WITH TIME ZONE.
Observação: Para exibir uma lista de valores válidos para os elementos de formato TZR e TZD,
consulte a view dinâmica de desempenho V$TIMEZONE_NAMES .
TO_TIMESTAMP
A function TO_TIMESTAMP converte uma string de CHAR, VARCHAR2, NCHAR ou o tipo de
dados de NVARCHAR2 em um valor do tipo de dados TIMESTAMP. A sintaxe da function
TO_TIMESTAMP é:
TO_TIMESTAMP (char,[fmt],['nlsparam'])
O fmt opcional especifica o formato de char. Se você omitir fmt, a string deverá estar no
formato default do tipo de dados TIMESTAMP. O nlsparam opcional especifica o idioma no
qual abreviações e nomes de mês e dia são retornados. Este argumento pode ter o seguinte
formato:
'NLS_DATE_LANGUAGE = language'
Se você omitir nlsparams, essa function usará o idioma de data default para sua sessão.
O exemplo do slide converte uma string de caracteres em um valor de TIMESTAMP.
Observação: Você pode usar a function TO_TIMESTAMP_TZ para converter uma string de
CHAR, VARCHAR2, NCHAR, ou de tipo de dados NVARCHAR2 em um valor do tipo de dados
TIMESTAMP WITH TIME ZONE . Para obter mais informações sobre essa função, consulte
Oracle Database SQL Language Reference for 10g or 11g database.
SELECT hire_date,
hire_date + TO_YMINTERVAL('01-02') AS
HIRE_DATE_YMININTERVAL
TO_YMINTERVAL
A function TO_YMINTERVAL converte uma string de caracteres de CHAR, VARCHAR2,
NCHAR, ou tipo de dados de NVARCHAR2 em um tipo de dados de INTERVAL YEAR TO
MONTH. O tipo de dados de INTERVAL YEAR TO MONTH armazena um período usando os
campos de data/horário YEAR e MONTH. O formato de INTERVAL YEAR TO MONTH é:
INTERVAL YEAR [(year_precision)] TO MONTH
em que year_precision é o número de dígitos no campo de data/horário YEAR. O valor
default de year_precision é 2.
A sintaxe da function TO_YMINTERVAL é:
TO_YMINTERVAL (char)
em que char é a string de caracteres a ser convertida
O exemplo no slide calcula uma data de um ano e dois meses após a data de contratação dos
funcionários do departamento 20 da tabela EMPLOYEES.
SELECT last_name,
TO_CHAR(hire_date, 'mm-dd-yy:hh:mi:ss') hire_date,
TO_CHAR(hire_date +
TO_DSINTERVAL('100 10:00:00'),
'mm-dd-yy:hh:mi:ss') hiredate2
TO_DSINTERVAL
TO_DSINTERVAL converte uma string de caracteres de CHAR, VARCHAR2, NCHAR, ou de tipo
de dados de NVARCHAR2 em um tipo de dados de INTERVAL DAY TO SECOND.
No exemplo do slide, a data de 100 dias e 10 horas após a contratação é obtida.
Respostas: 2, 3, 4
Sumário
Esta lição trata de algumas das functions de data/horário disponíveis no banco de dados Oracle.
Objetivos
Nesta lição, você aprenderá a criar subconsultas de várias colunas e subconsultas na cláusula
FROM de uma instrução SELECT. Aprenderá também a solucionar problemas usando
subconsultas escalares correlacionadas e a cláusula WITH.
Consulta principal
WHERE (MANAGER_ID, DEPARTMENT_ID) IN
Subconsulta
GET
a linha candidata da consulta externa
USE
valores da consulta interna para qualificar
ou desqualificar a linha candidata
Subconsultas Correlacionadas
O servidor Oracle executa uma subconsulta correlacionada quando ela se refere a uma coluna de
uma tabela relacionada na instrução pai. Uma subconsulta correlacionada é avaliada uma vez
para cada linha processada pela instrução pai. Uma instrução pai pode ser uma instrução
SELECT, UPDATE ou DELETE.
Subconsultas Aninhadas Versus Subconsultas Correlacionadas
Com uma subconsulta aninhada normal, a consulta interna SELECT é executada primeiro e
apenas uma vez, retornando valores a serem usados pela consulta principal. Entretanto, uma
subconsulta correlacionada é executada uma vez para cada linha candidata considerada pela
consulta externa. Ou seja, a consulta interna é conduzida pela consulta externa.
Execução da Subconsulta Aninhada
• A consulta aninhada é executada primeiro e localiza um valor.
• A consulta externa é executada uma vez, usando o valor da consulta interna.
Execução da Subconsulta Correlacionada
• Obtenha uma linha candidata (extraída pela consulta externa).
• Execute a consulta interna usando o valor da linha candidata.
• Use os valores resultantes da consulta interna para qualificar ou desqualificar o candidato.
• Repita até que não reste nenhuma linha candidata.
Operador EXISTS
Com instruções SELECT de aninhamento, todos os operadores lógicos são válidos. Além disso,
você pode usar o operador EXISTS. Esse operador é frequentemente usado com subconsultas
correlacionadas para verificar se o valor recuperado pela consulta externa existe no conjunto de
resultados dos valores recuperados pela consulta interna. Se a subconsulta retornar pelo menos
uma linha, o operador retornará como TRUE. Se o valor não existir, ele retornará como FALSE.
Dessa forma, NOT EXISTS verifica se um valor recuperado pela consulta externa não faz parte
do conjunto de resultados dos valores recuperados pela consulta interna.
No entanto, NOT IN será avaliado como FALSE se um membro do conjunto for um valor NULL.
Portanto, sua consulta não retornará nenhuma linha mesmo que exista alguma linha na tabela
departments que atenda à condição WHERE.
UPDATE Correlacionada
No caso da instrução UPDATE, você pode usar uma subconsulta correlacionada para atualizar
linhas de uma tabela com base nas linhas de outra.
UPDATE empl6 e
DELETE Correlacionada
No caso de uma instrução DELETE, você pode usar uma subconsulta correlacionada para deletar
somente as linhas existentes também em outra tabela. Se você decidir que manterá apenas
os quatro últimos registros do histórico de cargos na tabela JOB_HISTORY, quando um
funcionário for transferido para um quinto cargo, você deletará a linha JOB_HISTORY
mais antiga pesquisando na tabela JOB_HISTORY a MIN(START_DATE) do
funcionário. O código a seguir ilustra a maneira como a operação anterior pode ser
executada usando uma instrução DELETE correlacionada:
DELETE FROM emp_history JH
WHERE employee_id =
(SELECT employee_id
FROM employees E
WHERE JH.employee_id = E.employee_id
AND START_DATE =
(SELECT MIN(start_date)
FROM job_history JH
WHERE JH.employee_id = E.employee_id)
AND 5 > (SELECT COUNT(*)
FROM job_history JH
WHERE JH.employee_id = E.employee_id
GROUP BY EMPLOYEE_ID
HAVING COUNT(*) >= 4));
Oracle Database: Fundamentos de SQL II 6 - 26
Usando a Instrução DELETE Correlacionada
Cláusula WITH
Com a cláusula WITH, é possível definir um bloco de consulta antes de usá-lo em uma consulta.
A cláusula WITH (formalmente conhecida como subquery_factoring_clause) permite
a reutilização do mesmo bloco de consulta em uma instrução SELECT quando ele ocorre mais
de uma vez em uma consulta complexa. Isso é particularmente útil quando uma consulta possui
muitas referências ao mesmo bloco de consulta e há joins e agregações.
Usando a cláusula WITH, você pode reutilizar a mesma consulta quando for dispendioso avaliar
o bloco de consulta e ele ocorrer mais de uma vez em uma consulta complexa. Com a cláusula
WITH, o servidor Oracle recupera os resultados de um bloco de consulta e os armazena no
tablespace temporário do usuário. Isso pode melhorar o desempenho.
Vantagens da Cláusula WITH
• Facilita a leitura da consulta
• Avalia uma cláusula apenas uma vez, mesmo que ela apareça várias vezes na consulta
• Na maioria dos casos, pode melhorar o desempenho de grandes consultas
WITH
dept_costs AS (
SELECT d.department_name, SUM(e.salary) AS dept_total
FROM employees e JOIN departments d
ON e.department_id = d.department_id
GROUP BY d.department_name),
avg_cost AS (
SELECT SUM(dept_total)/COUNT(*) AS dept_avg
FLIGHTS Table 1
Resposta: 2
Sumário
Você pode usar subconsultas de várias colunas para combinar várias condições WHERE em uma
única cláusula WHERE. As comparações de coluna em uma subconsulta de várias colunas podem
ser em pares ou não-pares.
Você pode usar uma subconsulta para definir uma tabela a ser operada por uma consulta que a
contém.
As subconsultas escalares podem ser usadas:
• Na condição e parte da expressão de DECODE e CASE
• Em todas as cláusulas SELECT, exceto GROUP BY
• Nas cláusulas SET e WHERE da instrução UPDATE
Sumário (continuação)
O servidor Oracle executa uma subconsulta correlacionada quando ela se refere a uma coluna de
uma tabela relacionada na instrução pai. Uma subconsulta correlacionada é avaliada uma vez
para cada linha processada pela instrução pai. Uma instrução pai pode ser SELECT, UPDATE ou
DELETE. Usando a cláusula WITH, você pode reutilizar a mesma consulta quando for
dispendioso reavaliar o bloco de consulta e ele ocorrer mais de uma vez em uma consulta
complexa.
Objetivos
Nesta lição, você aprenderá a usar o recurso de suporte a expressões comuns. O suporte à
expressão comum está disponível em SQL e PL/SQL.
Sintaxe Descrição
. Corresponde a qualquer caractere no conjunto de caracteres suportados, exceto
NULL
+ Corresponde a uma ou mais ocorrências
( ... ) Trata a expressão entre parênteses como uma unidade. A subexpressão pode
ser uma string de literais ou uma expressão complexa contendo operadores.
Sintaxe Descrição
\d Um caractere de dígito
[^:class:] Corresponde a qualquer caractere simples que não estiver na lista entre os
colchetes
• match_parameter:
- “ c ”: Usa correspondência que faz distinção entre maiúsculas e minúsculas (default)
- “ i ”: Usa correspondência sem distinção entre maiúsculas e minúsculas
- “ n ”: Permite o operador de correspondência de qualquer caractere
- “ m ”: Trata a string de origem como várias linhas
• subexpr: Fragmento de padrão incluído entre parênteses. Você aprenderá mais sobre as
subexpressões posteriormente nesta lição.
SELECT street_address,
REGEXP_INSTR(street_address,'[[:alpha:]]') AS
First_Alpha_Position
FROM locations;
Subexpressões
O Oracle Database 11g fornece parâmetro de suporte a expressões comuns para acessar uma
subexpressão. No exemplo do slide, uma string de dígitos é mostrada. Os parênteses identificam
as subexpressões na string de dígitos. Quando são lidas da esquerda para a direita e dos
parênteses externos para os internos, as subexpressões na string de dígitos são:
1. 123
2. 45678
3. 56
4. 78
Você pode pesquisar qualquer uma dessas subexpressões com as functions REGEXP_INSTR e
REGEXP_SUBSTR.
SELECT
REGEXP_INSTR
1 ('0123456789', -- source char or search value
2 '(123)(4(56)(78))', -- regular expression patterns
3 1, -- position to start searching
4 1, -- occurrence
SELECT
REGEXP_SUBSTR
1 ('acgctgcactgca', -- source char or search value
2 'acg(.*)gca', -- regular expression pattern
3 1, -- position to start searching
4 1, -- occurrence
5 'i', -- match option (case
REGEXP_SUBSTR: Exemplo
No exemplo do slide:
1. acgctgcactgca é a origem a ser pesquisada.
2. acg(.*)gca é o padrão a ser pesquisado. Localize acg seguido por gca com os
caracteres em potencial entre acg e gca.
3. Comece pesquisando no primeiro caractere da origem.
4. Pesquise a primeira ocorrência do padrão.
5. Use correspondência sem distinção entre maiúsculas e minúsculas na origem.
6. Use o valor inteiro não negativo que identifique a enésima subexpressão a ser enfocada.
Esse é o parâmetro de subexpressão. Nesse exemplo, 1 indica a primeira subexpressão.
Você pode usar um valor de 0–9. Um zero significa que nenhuma subexpressão foi
enfocada. O valor padrão para este parâmetro é 0.
Este exemplo é específico para a versão 11g do Oracle Database.
SELECT REGEXP_COUNT(
'ccacctttccctccactcctcacgttctcacctgtaaagcgtccctccctcatccccatgcccccttaccctgcag
ggtagagtaggctagaaaccagagagctccaagctccatctgtggagaggtgccatccttgggctgcagagagaggag
aatttgccccaaagctgcctgcagagcttcaccacccttagtctcacaaagccttgagttcatagcatttcttgagtt
ttcaccctgcccagcaggacactgcagcacccaaagggcttcccaggagtagggttgccctcaagaggctcttgggtc
Respostas: 1, 2, 3
Sumário
Nesta lição, você aprendeu a usar os recursos de suporte a expressões comuns. O suporte à
expressão comum está disponível em SQL e PL/SQL.