Escolar Documentos
Profissional Documentos
Cultura Documentos
D64260BP10
Edição 1.0
Outubro de 2011
D74865
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
Apêndice A
Exercícios e Soluções
8) Salve a instrução SQL em um arquivo de script utilizando o item File > Save As, no
menu.
a) Selecione File > Save As.
COUNT(*)
----------------------
8
1 rows selected
COUNT(*)
----------------------
107
1 rows selected
COUNT(*)
----------------------
25
1 rows selected
1 rows selected
COUNT(*)
----------------------
23
1 rows selected
1 rows selected
COUNT(*)
----------------------
19
1 rows selected
COUNT(*)
----------------------
10
1 rows selected
1. Qual privilégio um usuário deve ter para efetuar logon no servidor Oracle? É um
privilégio de sistema ou de objeto?
_________________________________________________________________
2. Que privilégio deve ser concedido a um usuário para que ele possa criar tabelas?
_________________________________________________________________
3. Se você criar uma tabela, quem poderá conceder privilégios a outros usuários na sua
tabela?
...
13. Adicione uma nova linha à sua tabela DEPARTMENTS. A equipe 1 deve adicionar
Education como número do departamento 500. A equipe 2 deve adicionar Human
Resources como número do departamento 510. Consulte a tabela da outra equipe.
14. Crie um sinônimo para a tabela DEPARTMENTS da outra equipe.
15. Consulte todas as linhas na tabela DEPARTMENTS da outra equipe usando seu
sinônimo.
Resultados da instrução SELECT da Equipe 1:
1. Qual privilégio um usuário deve ter para efetuar logon no servidor Oracle? Este é
um sistema ou privilégio de objeto?
O privilégio de sistema CREATE SESSION
4. Você é o DBA. Você cria muitos usuários que precisam dos mesmos privilégios
de sistema.
O que você deve fazer para tornar seu trabalho mais fácil?
Criar uma função contendo os privilégios do sistema e conceder a função aos
usuários.
11. Conceda a outro usuário acesso à sua tabela DEPARTMENTS. Faça com que o
usuário conceda com grant acesso de consulta à respectiva tabela DEPARTMENTS.
SELECT *
FROM departments;
13. Adicione uma nova linha à sua tabela DEPARTMENTS. A equipe 1 deve adicionar
Education como número do departamento 500. A equipe 2 deve adicionar
Human Resources como número do departamento 510. Consulte a tabela da
outra equipe.
17. Remova a linha que você inseriu na tabela DEPARTMENTS na etapa 8 e salve as
alterações.
4. Modifique a tabela EMP2 para que aceite sobrenomes mais longos de funcionários.
20. Crie a tabela emp_books e preencha-a com os dados. Defina a chave primária como
adiada e observe o que acontece no final da transação.
a. Execute o arquivo lab_02_20_a.sql para criar a tabela emp_books.
Observe que a chave primária emp_books_pk não é criada como adiável.
DESCRIBE dept2
3. Crie a tabela EMP2 com base no gráfico de instâncias de tabela a seguir. Informe a
sintaxe na Planilha SQL. Em seguida, execute a instrução para criar a tabela.
Confirme que a tabela foi criada.
DESCRIBE emp2
4. Modifique a tabela EMP2 para que aceite sobrenomes mais longos de funcionários.
DESCRIBE emp2
DESCRIBE employees2
DESCRIBE employees2
DESCRIBE employees2
13. Crie uma restrição PRIMARY KEY do nível de tabela à tabela DEPT2 na coluna ID.
A restrição deve ser nomeada na criação. Nomeie a restrição my_dept_id_pk.
15. Modifique a tabela EMP2. Adicione uma coluna COMMISSION do tipo de dados
NUMBER, precisão 2, escala 2. Adicione uma constraint à coluna COMMISSION que
garanta que o valor da comissão seja maior que zero.
16. Elimine as tabelas EMP2 e DEPT2 para que não seja possível restaurá-las. Verifique a
lixeira.
20. Crie a tabela emp_books e preencha-a com os dados. Defina a chave primária como
adiada e observe o que acontece no final da transação.
O seguinte erro deverá ser exibido: “ORA-02447: Não é possível diferir uma
constraint que não pode ser diferida”.
3. Em uma tabela específica, crie um script que mostre os nomes das colunas, os tipos
de dados, o comprimento dos tipos de dados e se são permitidos valores nulos.
Solicite ao usuário que informe o nome da tabela. Forneça apelidos apropriados às
colunas DATA_PRECISION e DATA_SCALE . Salve esse script em um arquivo
com o nome lab_03_01.sql.
Por exemplo, se o usuário informar DEPARTMENTS, serão obtidos os seguintes
resultados:
8. Localize os nomes das suas sequências. Crie uma consulta em um script para exibir as
seguintes informações sobre as suas sequências: nome, valor máximo, tamanho do
incremento e último número da sequência. Salve o script com o nome
lab_03_08.sql. Execute a instrução no seu script.
2. Consulte a view do dicionário para obter informações sobre as tabelas que você pode
acessar. Exclua tabelas que você possui.
SELECT table_name, owner
FROM all_tables
WHERE owner <>'ORAxx';
3. Para obter uma determinada tabela, crie um script que informe nomes das colunas,
SELECT COMMENTS
FROM user_tab_comments
WHERE table_name = 'DEPARTMENTS';
7. Execute o arquivo lab_03_07.sql para criar a view dept50 para este exercício.
É necessário determinar os nomes e as definições de todas as views em seu esquema.
Crie um relatório que recupere informações da view: o nome e o texto da view a
partir da view do dicionário de dados USER_VIEWS.
Observação: Você obterá a definição completa da view se usar Run Script (ou
pressionar F5) no SQL Developer. Se usar Execute Statement (ou pressionar F9) no
SQL Developer, role horizontalmente no painel de resultados. Se você usar o
SQL*Plus, para obter mais conteúdo de uma coluna LONG, use o comando SET
LONG n, em que n é o valor do número de caracteres da coluna LONG que você
deseja ver.
Observação:No Exercício 2, você deve ter eliminado as tabelas DEPT2 e EMP2 para
que elas não pudessem ser restauradas.
9. Confirme se as tabelas DEPT2 e EMP2 estão armazenadas no dicionário de dados.
SELECT table_name
FROM user_tables
WHERE table_name IN ('DEPT2', 'EMP2');
10. Consulte o dicionário de dados para descobrir os nomes e os tipos das constraints nas
duas tabelas.
12. Crie a tabela SALES_DEPT com base no seguinte gráfico de instância de tabela.
Nomeie o índice para a coluna PRIMARY KEY como SALES_PK_IDX. Em seguida,
consulte a view do dicionário de dados para exibir o nome do índice, o nome da
tabela e saber se o índice é exclusivo.
8.
a. Execute o script lab_04_08_a.sql na pasta lab para criar a tabela
SALES_WEEK_DATA.
b. Execute o script lab_04_08b.sql na pasta do laboratório para inserir registros
na tabela SALES_WEEK_DATA.
11. Crie a tabela EMP3 usando o script lab_04_11.sql. Na tabela EMP3, altere o
departamento Kochhar para 60 e submeta sua alteração a commit. Em seguida,
altere o departamento Kochhar para 50 e submeta sua alteração a commit. Rastreie
as alterações de Kochhar usando o recurso Row Versions.
DESC sal_history
DESC mgr_history
DESC special_sal
INSERT ALL
WHEN SAL > 20000 THEN
INTO special_sal VALUES (EMPID, SAL)
ELSE
INTO 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 employees
WHERE employee_id < 125;
DESC sales_week_data
DESC emp_sales_info
INSERT ALL
INTO emp_sales_info VALUES (id, week_id, QTY_MON)
INTO emp_sales_info VALUES (id, week_id, QTY_TUE)
INTO emp_sales_info VALUES (id, week_id, QTY_WED)
INTO emp_sales_info VALUES (id, week_id, QTY_THUR)
INTO emp_sales_info VALUES (id, week_id, QTY_FRI)
SELECT ID, week_id, QTY_MON, QTY_TUE, QTY_WED,
QTY_THUR,QTY_FRI FROM sales_week_data;
11. Crie a tabela EMP3 usando o script lab_04_11.sql. Na tabela EMP3, altere o
departamento Kochhar para 60 e submeta sua alteração a commit. Em seguida,
altere o departamento Kochhar para 50 e submeta sua alteração a commit.
Rastreie as alterações em Kochhar com o recurso Row Versions.
- Egito
7. Crie uma consulta para recuperar os sobrenomes com base na tabela EMPLOYEES e
calcular o status da avaliação. Se o ano de contratação for 1998, exiba Needs
Review para o status da avaliação, caso contrário, exiba not this year!
Nomeie a coluna de status da avaliação como Review. Classifique os resultados pela
coluna HIRE_DATE.
Dica: Use uma expressão CASE com a função EXTRACT para calcular o status da
avaliação.
…
8. Crie uma consulta para imprimir os sobrenomes e o tempo de serviço (em anos) de
cada funcionário. Se o funcionário estiver empregado há 5 anos ou mais, imprima 5
...
3. Crie uma consulta para exibir o sobrenome, a data de contratação e o salário de todos
os funcionários com o mesmo salário e comissão de Kochhar.
Observação:Não exiba Kochhar no conjunto de resultados.
4. Crie uma consulta para exibir os funcionários que ganham um salário maior que o
salário de qualquer gerentes de vendas (JOB_ID = 'SA_MAN'). Classifique os
resultados desde o maior até o menor.
6. Crie uma consulta para localizar todos os funcionários que ganham acima do salário
b. Isso pode ser feito com o operador NOT IN? Como ou por que não?
8. Crie uma consulta para exibir o sobrenome dos funcionários quem ganham menos
que o salário médio em seus respectivos departamentos.
10. Crie uma consulta para exibir o ID, os sobrenomes e os nomes de departamento de
todos os funcionários.
Observação: Use uma subconsulta escalar para recuperar o nome do departamento
na instrução SELECT.
6. Crie uma consulta para localizar todos os funcionários que ganham acima do
salário médio em seus departamentos. Exiba sobrenome, salário, ID do
departamento e salário médio do departamento. Classifique pelo salário médio.
Use apelidos para as colunas obtidas pela consulta, como mostrado na saída de
amostra.
SELECT e.last_name ename, e.salary salary,
e.department_id deptno, AVG(a.salary) dept_avg
FROM employees e, employees a
WHERE e.department_id = a.department_id
AND e.salary > (SELECT AVG(salary)
FROM employees
WHERE department_id = e.department_id )
GROUP BY e.last_name, e.salary, e.department_id
ORDER BY AVG(a.salary);
SELECT outer.last_name
FROM employees outer
WHERE NOT EXISTS (SELECT 'X'
FROM employees inner
WHERE inner.manager_id =
outer.employee_id);
SELECT outer.last_name
FROM employees outer
WHERE outer.employee_id
NOT IN (SELECT inner.manager_id
FROM employees inner);
Essa solução alternativa não é aconselhável. A subconsulta escolhe um valor NULL, por
isso nenhuma linha é retornada em toda a consulta. O motivo é que todas as condições
que comparam um valor NULL resultam em NULL. Sempre que houver probabilidade
de valores NULL fazerem parte do conjunto de valores não use NOT IN como substituto
de NOT EXISTS.
8. Crie uma consulta para exibir o sobrenome dos funcionários quem ganham menos
que o salário médio em seus respectivos departamentos.
SELECT last_name
FROM employees outer
WHERE outer.salary < (SELECT AVG(inner.salary)
FROM employees inner
WHERE inner.department_id
= outer.department_id);
9. Crie uma consulta para exibir o sobrenome dos funcionários quem têm um ou
mais colegas em seus departamentos que foram contratados depois mas que
ganham salários maiores.
SELECT last_name
FROM employees outer
WHERE EXISTS (SELECT 'X'
FROM employees inner
WHERE inner.department_id =
outer.department_id
AND inner.hire_date > outer.hire_date
10. Crie uma consulta para exibir o ID, os sobrenomes e os nomes de departamento
de todos os funcionários.
Observação: Use uma subconsulta escalar para recuperar o nome do
departamento na instrução SELECT.
11. Crie uma consulta para exibir o nome dos departamentos cujos totais de salários
sejam superiores a 1/8 do total de salários de toda a empresa. Use a cláusula
WITH para criar essa consulta. Nomeie a consulta como SUMMARY.
WITH
summary AS (
SELECT d.department_name, SUM(e.salary) AS dept_total
FROM employees e, departments d
WHERE e.department_id = d.department_id
GROUP BY d.department_name)
SELECT department_name, dept_total
FROM summary
WHERE dept_total > ( SELECT SUM(dept_total) * 1/8
FROM summary )
ORDER BY dept_total DESC;
3. Crie uma consulta que exiba “St” substituído por “Street” na coluna
STREET_ADDRESS da tabela LOCATIONS. Tome cuidado para não afetar nenhuma
linha que já contenha “Street”. Exiba somente as linhas afetadas.
6. Crie uma consulta para localizar o número de ocorrências do padrão de DNA ctc na
string gtctcgtctcgttctgtctgtcgttctg. Ignore a distinção de maiúsculas e
minúsculas.
3. Crie uma consulta para exibir “St” substituído por “Street” na coluna
STREET_ADDRESS da tabela LOCATIONS. Tenha cuidado para não afetar as linhas
que já têm o termo “Street”. Mostre apenas as linhas que serão afetadas.
LOCATION
HR DEPARTAMENTS
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 EMPLOYEES
end_date employee_id
job_id first_name
last_name
COUNTRY
department_id country_id
Objetivos
Neste apêndice, você será apresentado à ferramenta gráfica chamada SQL Developer. Você
aprenderá a usar o SQL Developer nas tarefas de desenvolvimento de seu banco de dados. Você
aprenderá a usar a Planilha SQL para executar instruções e scripts SQL.
1 2
2 4 6 8
Os resultados são
mostrados aqui.
F9 F5
Identifique um local,
2 informe um nome de
Antes da
formatação
Usando Snippets
Você poderá usar determinados fragmentos de códigos quando usar a Planilha SQL ou criar ou
editar uma função ou um procedure PL/SQL. O SQL Developer possui o recurso chamado
Snippets. Snippets são fragmentos de códigos como funções SQL, dicas do Optimizer e diversas
técnicas de programação de PL/SQL. Você pode arrastar snippets para a janela Editor.
Para exibir os Snippets, selecione View > Snippets.
A janela Snippets será exibida à direita. Você poderá usar a lista drop-down para selecionar um
grupo. O botão Snippets é exibido na margem da janela à direita para que você possa exibir a
janela Snippets se ela ficar oculta.
Inserindo
um snippet
Atalhos para
ferramentas usadas
com frequência
1
Definindo Preferências
Você pode personalizar muitos aspectos da interface e do ambiente do SQL Developer
modificando as preferências do SQL Developer de acordo com suas preferências e necessidades.
Para modificar as preferências do SQL Developer, selecione Tools e Preferences.
As preferências estão agrupadas nas seguintes categorias:
• Environment
• Accelerators (atalhos do teclado)
• Code Editors
• Database
• Debugger
• Documentation
• Extensions
• File Types
• Migration
• PL/SQL Compilers
• PL/SQL Debugger e assim por diante
Sumário
O SQL Developer é uma ferramenta gráfica gratuita que simplifica as tarefas de
desenvolvimento de banco de dados. Com o SQL Developer, você pode criar, editar e navegar
por objetos de banco de dados. Você pode usar a Planilha SQL para executar scripts e instruções
SQL. O SQL Developer permite que você crie e salve seu próprio conjunto especial de relatórios
para reutilização.
Objetivos
É possível criar instruções SELECT que possam ser usadas indefinidamente. Este apêndice também
aborda o uso de comandos do SQL*Plus para executar instruções SQL. Você aprenderá a formatar a
saída usando comandos do SQL*Plus, a editar comandos SQL e a salvar scripts no SQL*Plus.
Instruções SQL
Servidor
SQL*Plus
Resultados da consulta
SQL
SQL
SQL e SQL*Plus
SQL é uma linguagem de comando usada para comunicação com o servidor Oracle por meio de
qualquer ferramenta ou aplicativo. O Oracle SQL contém diversas extensões. Quando você informa
uma instrução SQL, ela é armazenada em uma parte da memória chamada de buffer SQL e
permanece lá até que você especifique uma nova instrução SQL. O SQL*Plus é uma ferramenta da
Oracle que reconhece e envia instruções SQL para o Oracle9i Server para serem executadas. Ele
contém sua própria linguagem de comandos.
Recursos da linguagem SQL
• Ela pode ser usada por diferentes usuários, incluindo aqueles com pouca ou nenhuma
experiência em
programação
• É uma linguagem não procedural
• Reduz a quantidade de tempo necessária para a criação e a manutenção de sistemas
• É uma linguagem semelhante ao idioma inglês
Recursos do SQL*Plus
• Aceita a entrada ad hoc de instruções
• Aceita a entrada SQL de arquivos
• Oferece um editor de linha para a modificação de instruções SQL
• Controla as configurações do ambiente
• Formata os resultados da consulta em relatórios básicos
• Acessa bancos de dados locais e remotos
Oracle Database: Fundamentos de SQL II D - 3
Instruções SQL Versus
Comandos do SQL*Plus
SQL SQL*Plus
• Uma linguagem • Um ambiente
• Padrão ANSI • Proprietário da Oracle
• Palavras-chave não • Palavras-chave podem
podem ser abreviadas. ser abreviadas.
• Instruções manipulam • Os comandos não
SQL SQL*Plus
É uma linguagem para a comunicação com Reconhece instruções SQL e as envia ao servidor
o servidor Oracle a fim de acessar os dados
É baseada no padrão ANSI (American É a interface proprietária da Oracle para a
National Standards Institute) SQL execução de instruções SQL
Manipula dados e definições de tabelas no Não permite a manipulação de valores no banco
banco de dados de dados
É incluída no buffer SQL em uma ou mais É incluído em uma linha de cada vez; não é
linhas armazenado no buffer SQL
Não tem um caractere de continuação Utiliza um traço (–) como caractere de
continuação se o comando ultrapassa uma linha
Não pode ser abreviada Pode ser abreviado
Utiliza um caractere de finalização para Não requer caracteres de finalização; executa os
executar os comandos imediatamente comandos imediatamente
Utiliza funções para aplicar formatação Utiliza comandos para formatar dados
SQL*Plus
O SQL*Plus é um ambiente no qual você pode:
• Executar instruções SQL para recuperar, modificar, adicionar e remover dados do banco de
dados
• Formatar, executar cálculos, armazenar e imprimir resultados de consultas no formato de
relatórios
• Criar arquivos de script para armazenar instruções SQL para uso repetido no futuro
Os comandos do SQL*Plus podem ser divididos nas seguintes categorias principais:
Categoria Objetivo
Environment Afeta o comportamento geral das instruções SQL na sessão.
Format Formata os resultados da consulta.
File manipulation Salva, carrega e executa arquivos de script.
Execution Envia instruções SQL do buffer SQL para o servidor Oracle.
Edit Modifica as instruções SQL no buffer.
Interaction Cria e especifica variáveis para instruções SQL, imprime valores de
variáveis e imprime mensagens na tela.
Miscellaneous Conecta-se ao banco de dados, manipula o ambiente SQL*Plus e exibe
definições de colunas.
DESC[RIBE] tablename
DESCRIBE departments
• A[PPEND] text
• C[HANGE] / old / new
• C[HANGE] / text /
• CL[EAR] BUFF[ER]
• DEL
• DEL n
• I[NPUT]
• I[NPUT] text
• L[IST]
• L[IST] n
• L[IST] m n
• R[UN]
LIST
1 SELECT last_name
2* FROM employees
1
1* SELECT last_name
LIST
1 SELECT last_name, job_id
2* FROM employees
LIST
1* SELECT * from employees
c/employees/departments
LIST
1* SELECT * from departments
LIST
1 SELECT last_name, manager_id, department_id
2* FROM employees
SAVE my_query
Created file my_query
Comando SERVEROUTPUT
A maioria dos programas PL/SQL executa entrada e saída por meio de instruções SQL, para
armazenar dados em tabelas de banco de dados ou consultar essas tabelas. Toda a entrada/saída
PL/SQL restante é feita por meio de APIs que interagem com outros programas. Por exemplo, o
pacote DBMS_OUTPUT possui procedures como PUT_LINE. Para ver o resultado fora do código
PL/SQL, é necessário outro programa, como o SQL*Plus, para ler e exibir os dados passados para
DBMS_OUTPUT.
O SQL*Plus não exibirá os dados de DBMS_OUTPUT a não ser que você primeiro envie o comando
SET SERVEROUTPUT ON do SQL*Plus conforme a seguir:
SET SERVEROUTPUT ON
Observação
• SIZE define o número de bytes da saída, que pode ser armazenado em buffer no servidor do
Oracle Database. O default é UNLIMITED. n não pode ser menor que 2000 ou mais que
1.000.000.
• Para obter informações adicionais sobre SERVEROUTPUT, consulte o Oracle Database PL/SQL
User’s Guide and Reference 11g.
Opção Descrição
file_name[.ext] Envia a saída para o nome de arquivo especificado
SET AUTOTRACE ON
-- The AUTOTRACE report includes both the optimizer
-- execution path and the SQL statement execution
-- statistics
Sumário
O SQL*Plus é um ambiente de execução que pode ser usado para enviar comandos SQL para o
servidor de banco de dados e para editar e salvar comandos SQL. Você pode executar comandos no
prompt do SQL ou em um arquivo de script.
Objetivos
Neste apêndice, você será apresentado à ferramenta JDeveloper. Você aprenderá a usar o
JDeveloper nas tarefas de desenvolvimento de seu banco de dados.
Oracle JDeveloper
O Oracle JDeveloper é um IDE (Integrated Development Environment) para o desenvolvimento
e a disponibilização de aplicações Java e serviços Web. Ele suporta todos os estágios do SDLC
(Software Development Life Cycle), desde a modelagem até a implantação. Também dispõe dos
recursos que permitem usar os padrões mais recentes do setor para Java, XML e SQL no
desenvolvimento de aplicações.
O Oracle JDeveloper 11g introduz uma nova abordagem para o desenvolvimento em J2EE ao
oferecer recursos que permitem desenvolvimento visual e declarativo. Essa abordagem
inovadora torna o desenvolvimento em J2EE simples e eficiente.
Database Navigator
Usando o Oracle JDeveloper, é possível armazenar em um objeto denominado “connection”
(conexão) as informações necessárias para se conectar a um banco de dados. Uma conexão é
armazenada como parte das definições do IDE e pode ser exportada e importada, a fim de
facilitar o compartilhamento entre grupos de usuários. As conexões são usadas para várias
finalidades, desde a navegação no banco de dados e a criação de aplicações até a implantação.
3 Teste a conexão.
4 Clique em OK.
3
Esqueleto da função
Compilando
Após editar a definição de esqueleto, você precisa compilar a unidade de programa. Clique com
o botão direito do mouse no objeto PL/SQL a ser compilado no Connection Navigator e
selecione Compile. Como alternativa, também é possível pressionar CTRL + SHIFT + F9 para
fazer a compilação.
Janela Structure
A janela Structure permite uma visão estrutural dos dados do documento selecionado na janela
ativa, que pode ser um dos elementos que formam a estrutura: navegadores, editores, modos de
exibição e o Property Inspector.
Na janela Structure, é possível exibir os dados do documento de várias maneiras. As estruturas
que estão disponíveis para exibição se baseiam no tipo do documento. No caso de um arquivo
Java, é possível exibir a estrutura de código, a estrutura da interface do usuário ou os dados de
modelo da interface do usuário. No caso de um arquivo XML, é possível exibir a estrutura XML,
a estrutura do projeto ou os dados de modelo da interface do usuário.
A janela Structure é dinâmica, controlando sempre a seleção atual da janela ativa (a menos que
você congele o conteúdo da janela em uma view específica), como acontece com o editor ativo
no momento. Quando a seleção atual é um nó no navegador, o editor default é utilizado. Se
quiser alterar a view da estrutura para a seleção atual, escolha outra tab de estrutura.
Janela Editor
É possível exibir todos os arquivos de projeto em apenas uma janela do editor, abrir várias views
do mesmo arquivo ou abrir views de arquivos diferentes.
Na parte superior da janela do editor, encontram-se as tabs de documentos. A seleção de uma tab
de documento coloca esse arquivo em destaque, trazendo-o para o primeiro plano da janela do
editor atual.
Na parte inferior da janela do editor referente a um determinado arquivo, estão as tabs de editor.
A seleção de uma dessas tabs abre o arquivo no editor correspondente.
Application Navigator
O Application Navigator permite uma visão lógica da aplicação e dos dados contidos nela. Esse
navegador fornece uma infraestrutura à qual as diversas extensões podem se conectar. Essas
extensões também podem usar a infraestrutura para organizar seus dados e menus de forma
consistente e abstrata. Embora o Application Navigator possa conter arquivos individuais (como
arquivos-fonte Java), ele foi projetado para consolidar dados complexos. Nesse navegador, os
tipos de dados complexos, como objetos de entidades, diagramas UML (Unified Modeling
Language), EJBs (Enterprise JavaBeans) ou serviços Web aparecem como nós únicos. Os
arquivos brutos que compõem esses nós abstratos são exibidos na janela Structure.
Tutoriais do Oracle
http://www.oracle.com/technology/obe/obe11jdev/11/index.html
JDeveloper 11g
Objetivos
Neste apêndice, você será apresentado à ferramenta JDeveloper. Você aprenderá a usar o
JDeveloper nas tarefas de desenvolvimento de seu banco de dados.
Objetivos
Neste apêndice, você aprenderá a:
• Agrupar dados para obter os valores de subtota, usando o operador ROLLUP
• Agrupar dados para obter os valores de tabulação cruzada, usando o operador CUBE
• Use a função GROUPING para identificar o nível de agregação no conjunto de resultados
produzido por um operador ROLLUP ou CUBE
• Usar GROUPING SETS para produzir um único conjunto de resultados que seja equivalente
a uma abordagem UNION ALL
Funções de grupo
Você pode usar a cláusula GROUP BY para dividir as linhas de uma tabela em grupos. Em
seguida, você poderá usar as funções de grupo para retornar as informações resumidas para cada
grupo. As funções de grupo podem aparecer nas listas de seleção e nas cláusulas ORDER BY e
HAVING. O Oracle Server aplica tais funções a cada grupo de linhas e retorna uma única linha
de resultados para cada grupo.
Tipos de funções de grupo: Cada uma das funções de grupo (AVG, SUM, MAX, MIN, COUNT,
STDDEV e VARIANCE) aceita um argumento. As funções AVG, SUM, STDDEV e VARIANCE
operam apenas em valores numéricos. MAX e MIN podem operar em valores de dados
numéricos, de caracteres e de data. COUNT retorna o número de linhas não NULAS para
determinada expressão. O exemplo no slide calcula o salário médio, o desvio padrão no salário,
o número de funcionários que recebem comissão e a data de contratação máxima dos
funcionários cujo JOB_ID inicia com SA.
Diretrizes para utilização das funções de grupo
• Os tipos de dados dos argumentos podem ser CHAR, VARCHAR2, NUMBER ou DATE.
• Todas as funções de grupo, exceto COUNT(*), ignoram valores nulos. Para substituir um
valor por valores nulos, use a função NVL. COUNT retorna um número ou zero.
• O Oracle Server classifica implicitamente o conjunto de resultados em ordem crescente das
colunas de agrupamento especificadas, quando você usa uma cláusula GROUP BY. Para
substituir a ordenação padrão, use DESC em uma cláusula ORDER BY.
Oracle Database: Fundamentos de SQL II F - 3
Análise da cláusula GROUP BY
• Sintaxe:
SELECT [column,] group_function(column). . .
FROM table
[WHERE condition]
[GROUP BY group_by_expression]
[ORDER BY column];
Cláusula HAVING
Os grupos são formados e as funções de grupo são calculadas antes de a cláusula HAVING ser
aplicada aos grupos. A cláusula HAVING pode preceder a cláusula GROUP BY, mas é
recomendável que você insira a cláusula GROUP BY antes, porque é mais lógico.
O Oracle Server executa as seguintes etapas quando você usa a cláusula HAVING:
1. Agrupas linhas.
2. Aplica as funções de grupo aos grupos e exibe os aqueles que correspondem aos critérios
na cláusula HAVING.
Operador ROLLUP
O operador ROLLUP retorna agregações e superagregações para as expressões dentro de uma
instrução GROUP BY. O operador ROLLUP pode ser usado pelos autores de relatórios para
extrair estatística e informações resumidas de conjuntos de resultados. As agregações
cumulativas podem ser usadas em relatórios, gráficos e diagramas.
O operador ROLLUP cria agrupamentos por mover em uma direção, da direita para a esquerda,
juntamente com a lista de colunas especificada na cláusula GROUP BY. Ele aplica a função de
agregação a esses agrupamentos.
Observação
• Para gerar subtotais em n dimensões (ou seja, n colunas na cláusula GROUP BY), sem um
operador ROLLUP, n+1 instruções SELECT devem estar vinculadas a UNION ALL. Isso
torna a execução de consultas ineficiente porque cada instrução SELECT provoca um
acesso a tabela. O operador ROLLUP coleta os resultados com apenas um acesso à tabela. O
operador ROLLUP é útil quando há muitas colunas envolvidas na geração de subtotais.
• Os subtotais e os totais são produzidos com ROLLUP. CUBE também produz totais e faz um
roll-up eficiente dos valores em todas as direções possíveis, produzindo dados de referência
cruzada.
Operador CUBE
O operador CUBE é uma alternância adicional na cláusula GROUP BY em uma instrução
SELECT. O operador CUBE pode ser aplicado a todas as funções agregadas, incluindo AVG,
SUM, MAX, MIN e COUNT. É usado para produzir conjuntos de resultados normalmente
utilizados para relatórios com tabela cruzada. ROLLUP produz apenas uma fração das
combinações de subtotais possíveis, ao passo que CUBE produz subtotais para todas as
combinações possíveis de agrupamentos especificadas na cláusula GROUP BY, e um total geral.
O operador CUBE é utilizado com uma função de agregação para gerar linhas adicionais em um
conjunto de resultados. As colunas incluídas na cláusula GROUP BY são de referência cruzada
para a geração de superconjuntos de grupos. A função de agregação especificada na lista de
seleção é aplicada a esses grupos para produzir valores de sumarização para as linhas adicionais
de superagregação. O número de grupos extra no conjunto de resultados é determinado pelo
número de colunas incluídas na cláusula GROUP BY.
Na verdade, cada combinação possível de colunas ou expressões na cláusula GROUP BY é usada
para produzir superagregações. Para n colunas ou expressões na cláusula GROUP BY, há 2n
combinações possíveis de superagregação. Matematicamente, essas combinações formam um
cubo n-dimensional, de onde o operador derivou seu nome.
Com o uso de ferramentas de aplicação ou de programação, esses valores superagregados podem
ser alimentados em gráficos e tabelas que transportam resultados e relacionamentos de maneira
visual e eficaz.
Oracle Database: Fundamentos de SQL II F - 9
Operador CUBE: Exemplo
A função GROUPING:
• É usada com o operador CUBE ou ROLLUP
• É usada para localizar os grupos que formam o subtotal
em uma linha
• É usada para diferenciar os valores NULL armazenados
dos valores NULL criados por ROLLUP ou CUBE
• Retorna 0 ou 1
Função GROUPING
A função GROUPING pode ser usada com o operador CUBE ou ROLLUP para ajudar no
entendimento de como um valor sumarizado foi obtido.
A função GROUPING usa uma única coluna como argumento. A expr na função GROUPING
deve corresponder a uma das expressões na cláusula GROUP BY. A função retorna um valor
igual a 0 ou 1.
Os valores retornados pela função GROUPING são úteis para:
• Determinar o nível de agregação de determinado subtotal (ou seja, o grupo ou os grupos em
que o subtotal se baseia)
• Identifica se um valor NULL na coluna da expressão de uma linha do conjunto de resultados
indica:
- Um valor NULL da tabela base (valor NULL armazenado)
- Um valor NULL criado por ROLLUP ou CUBE (como resultado de uma função de
agrupamento nessa expressão)
Um valor igual a 0 retornado pela função GROUPING que se baseia em uma expressão que
indica uma das seguintes condições:
• A expressão foi usada para calcular o valor agregado.
• O valor NULL na coluna da expressão é um valor NULL armazenado.
Um valor igual a 1 retornado pela função GROUPING que se baseia em uma expressão que
indica uma das seguintes condições:
• A expressão não foi usada para calcular o valor agregado.
• O valor NULL na coluna da expressão é criado por ROLLUP ou CUBE como um resultado
de agrupamento.
Oracle Database: Fundamentos de SQL II F - 11
Função GROUPING: Exemplo
SELECT department_id DEPTID, job_id JOB,
SUM(salary),
GROUPING(department_id) GRP_DEPT,
GROUPING(job_id) GRP_JOB
FROM employees
WHERE department_id < 50
GROUP BY ROLLUP(department_id, job_id);
GROUPING SETS
GROUPING SETS é uma extensão adicional da cláusula GROUP BY e você pode usar para
especificar vários agrupamentos de dados. Isso facilita a agregação de eficiência e, portanto,
simplifica a análise dos dados em várias dimensões.
É possível agora escrever uma única instrução SELECT usando GROUPING SETS para
especificar vários agrupamentos (que também podem incluir os operadores ROLLUP ou CUBE),
em vez de várias instruções SELECT combinadas por operadores UNION ALL. Por exemplo:
SELECT department_id, job_id, manager_id, AVG(salary)
FROM employees
GROUP BY
GROUPING SETS
((department_id, job_id, manager_id),
(department_id, manager_id),(job_id, manager_id));
Essa instrução calcula agregações sobre três agrupamentos:
(department_id, job_id, manager_id), (department_id,
manager_id)and (job_id, manager_id)
Sem esse recurso, várias consultas combinadas com UNION ALL são necessárias para obter a
saída da instrução SELECT precedente. Uma abordagem multiconsulta é ineficiente porque
requer várias varreduras dos mesmos dados.
2
…
Colunas compostas
Uma coluna composta é uma coleção de colunas que são tratadas como uma unidade durante o
processamento dos agrupamentos. Você especifica as colunas em parênteses como nas
instruções a seguir: ROLLUP (a, (b, c), d)
Aqui, (b, c) formam uma coluna composta e são tratadas como uma unidade. No geral, as
colunas compostas são úteis em ROLLUP, CUBE e GROUPING SETS. Por exemplo, em CUBE
ou ROLLUP, as colunas compostas precisarão ignorar a agregação em determinados níveis.
Ou seja, GROUP BY ROLLUP(a, (b, c) )é equivalente a:
GROUP BY a, b, c UNION ALL
GROUP BY a UNION ALL
GROUP BY ()
Aqui, (b, c) é tratado como unidade e ROLLUP não é aplicado em (b, c). É similar a ter
um alias - por exemplo, z como alias para (b, c) - e reduzir a expressão GROUP BY para:
GROUP BY ROLLUP(a, z).
Observação: GROUP BY( ) é, normalmente, uma instrução SELECT com valores NULL para
as colunas a e b e é apenas a função agregada. Normalmente, é usado para produzir totais
gerais.
SELECT NULL, NULL, aggregate_col
FROM <table_name>
GROUP BY ();
Oracle Database: Fundamentos de SQL II F - 17
Colunas compostas (continuação)
Compare isso com o ROLLUP normal como em:
GROUP BY ROLLUP(a, b, c)
Isso seria:
GROUP BY a, b, c UNION ALL
GROUP BY a, b UNION ALL
GROUP BY a UNION ALL
GROUP BY ()
Similarmente:
GROUP BY CUBE((a, b), c)
Isso seria equivalente a:
GROUP BY a, b, c UNION ALL
GROUP BY a, b UNION ALL
4
Copyright © 2011, Oracle. Todos os direitos reservados.
Agrupamentos concatenados
Os agrupamentos concatenados oferecem uma maneira concisa para gerar combinações úteis de
agrupamentos. Os agrupamentos concatenados são especificados listando vários conjuntos de
agrupamentos, CUBEs e ROLLUPs, e separando-os por vírgulas. Este é um exemplo de
conjuntos de agrupamentos concatenados:
GROUP BY GROUPING SETS(a, b), GROUPING SETS(c, d)
Esse exemplo de SQL define os seguintes agrupamentos:
(a, c), (a, d), (b, c), (b, d)
A concatenação de conjuntos de agrupamento é muito útil pelos seguintes motivos:
• Facilidade de desenvolvimento de consulta: Não é necessário enumerar manualmente
todos os agrupamentos.
• Uso por aplicações: A SQL gerada pelo OLAP (online analytical processing)
frequentemente envolve concatenação de conjuntos de agrupamentos, com cada
GROUPING SET definindo os agrupamentos necessários para uma dimensão.
Sumário
• ROLLUP e CUBE são extensões da cláusula GROUP BY.
• ROLLUP é usado para exibir valores de subtotais e de total geral.
• CUBE é usado para exibir os valores da tabela de referência cruzada.
• A função GROUPING permite que você determine se uma linha é uma
agregação produzida por um operador CUBE or ROLLUP.
• Com a sintaxe GROUPING SETS, é possível definir vários agrupamentos na mesma
consulta. GROUP BY calcula todos os agrupamentos e usa UNION ALLpara combiná-los.
• Dentro da cláusula GROUP BY, é possível combinar expressões de diversos modos:
- Para especificar colunas compostas, agrupe colunas entre parênteses de modo que o
Oracle Server as trate como uma unidade ao calcular as operações ROLLUP ou CUBE.
- Para especificar conjuntos de agrupamentos concatenados, separe por vírgulas vários
conjuntos de agrupamentos e operações ROLLUP e CUBE, de modo que o Oracle
Server os combine em uma única cláusula GROUP BY. O resultado são agrupamentos
de produtos híbridos em cada conjunto de agrupamentos.
Objetivos
Neste apêndice, você aprenderá a usar as consultas hierárquicas para criar relatórios estruturados
em árvore.
Fay
Palavras-chave e cláusulas
As consultas hierárquicas podem ser identificadas pela presença das cláusulas CONNECT BY e
START WITH.
Na sintaxe:
SELECT É a cláusula SELECT padrão
LEVEL Para cada linha retornada pela consulta hierárquica, a pseudocoluna LEVEL
retorna 1 para uma linha-raiz, 2 para um filho de uma raiz e assim por
diante.
FROM table Especifica a tabela, a view ou o snapshot que contém as colunas. É possível
selecionar em uma tabela apenas.
WHERE Restringe as linhas retornadas pela consulta sem afetar as linhas
da hierarquia
condition É uma comparação com as expressões
START WITH Especifica as linhas-raiz da hierarquia (onde iniciar). Essa cláusula é
necessária para se obter uma consulta hierárquica verdadeira.
CONNECT BY Especifica as colunas em que há o relacionamento entre linhas
PRIOR mãe e filha. Essa cláusula é necessária para se obter uma consulta
hierárquica.
Ponto inicial
• Especifica a condição que deve ser correspondida
• Aceita qualquer condição válida
START WITH column1 = value
Percorrendo a árvore
A linha ou as linhas que serão a raiz da árvore são determinadas pela cláusula START WITH. A
cláusula START WITH pode conter qualquer condição válida.
Exemplos
Usando a tabela EMPLOYEES, inicie com King, o presidente da empresa.
... START WITH manager_id IS NULL
Usando a tabela EMPLOYEES, inicie com o funcionário Kochhar. Uma condição START WITH
pode conter uma subconsulta.
... START WITH employee_id = (SELECT employee_id
FROM employees
WHERE last_name = 'Kochhar')
Se a cláusula START WITH for omitida, o percurso da árvore iniciará com todas as linhas na
tabela como linhas-raiz.
Observação: as cláusulas CONNECT BY e START WITH não são do padrão ANSI SQL.
Nível 1
King raiz/
pai
Nível 2
Kochhar De Haan Mourgos Zlotkey Hartstein pai/
filho/folha
No slide, King é raiz ou o pai (LEVEL = 1). Kochhar, De Haan, Mourgos, Zlotkey, Hartstein,
Higgens e Hunold são filhos e, ao mesmo tempo, pais (LEVEL = 2). Whalen, Rajs, Davies,
Matos, Vargas, Gietz, Ernst, Lorentz, Abel, Taylor, Grant e Fay são filhos e folhas (LEVEL = 3 e
LEVEL = 4).
Observação: um nó-raiz é o nó mais elevado dentro de uma árvore invertida. Um nó-filho é
qualquer nó que não-raiz. Um nó-pai é qualquer nó que tenha filhos. Um nó-folha é qualquer nó
sem filhos. O número de níveis retornados por uma consulta hierárquica pode ser limitado pela
memória disponível do usuário.
Oracle Database: Fundamentos de SQL II G - 10
Formatando relatórios hierárquicos usando
LEVEL e LPAD
Gietz Gietz
Limpando ramificações
É possível usar as cláusulas WHERE e CONNECT BY para limpar a árvore (ou seja, controlar
quais nós ou linhas são exibidos). O predicado utilizado aciona uma condição Booleana.
Exemplos
A partir da raiz, percorra de cima para baixo e elimine o funcionário Higgins no resultado, mas
processe as linhas-filha.
SELECT department_id, employee_id,last_name, job_id, salary
FROM employees
WHERE last_name != 'Higgins'
START WITH manager_id IS NULL
CONNECT BY PRIOR employee_id = manager_id;
A partir da raiz, percorra de cima para baixo e elimine o funcionário Higgins e todas as linhas-
filha.
SELECT department_id, employee_id,last_name, job_id, salary
FROM employees
START WITH manager_id IS NULL
CONNECT BY PRIOR employee_id = manager_id
AND last_name != 'Higgins';
Sumário
É possível usar consultas hierárquicas para recuperar dados com base em um relacionamento
hierárquico natural entre as linhas em uma tabela. A pseudocoluna LEVEL conta a profundidade
na árvore hierárquica que você atingiu. É possível especificar a direção da consulta usando a
cláusula CONNECT BY PRIOR. Você pode especificar o ponto de partida usando a cláusula
START WITH. Para limpar as ramificações da árvore, use as cláusulas WHERE e CONNECT BY.
Objetivos
Neste apêndice, você aprenderá a gravar um script SQL para gerar um script SQL.
Script SQL
Um script básico
O exemplo no slide produz um relatório com as instruções CREATE TABLE em cada tabela de
sua propriedade. Cada instrução CREATE TABLE produzida no relatório inclui a sintaxe para
criar uma tabela usando o nome da tabela com um sufixo _test e tendo apenas a estrutura da
tabela existente correspondente. O nome antigo da tabela é obtido da coluna TABLE_NAME da
view de dicionário de dados USER_TABLES.
A próxima etapa é melhorar o relatório para automatizar o processo.
Observação: Você pode consultar as tabelas do dicionário de dados para exibir vários objetos
de banco de dados de sua propriedade. As views do dicionário de dados frequentemente usadas
incluem:
• USER_TABLES: Exibe a descrição das tabelas de propriedade do usuário
• USER_OBJECTS: Exibe todos os objetos de propriedade do usuário
• USER_TAB_PRIVS_MADE: Exibe todas as concessões nos objetos de propriedade do
usuário
• USER_COL_PRIVS_MADE: Exibe todas as concessões nas colunas de objetos de
propriedade do usuário
SET FEEDBACK ON
SET PAGESIZE 24 Defina as variáveis do
SET ECHO ON sistema novamente
para os valores
default.
Controlando o ambiente
Para executar as instruções SQL geradas, você deve capturá-las em um arquivo que possa ser
executado. Você também dever planejar a limpeza da saída gerada e confirmar a supressão dos
elementos, como cabeçalhos, mensagens de feedback, títulos superiores e assim por diante. No
SQL Developer, é possível salvar essas instruções em um script. Para salvar o conteúdo da caixa
Informar Instrução SQL, clique no ícone Salvar ou use o item de menu Arquivo > Salvar. Além
disso, é possível clicar com o botão direito do mouse na caixa Informar Instrução SQL e
selecionar a opção Salvar Arquivo no menu drop-down.
Observação: Algumas instruções SQL*Plus não são suportadas pela Planilha SQL. Para obter a
lista completa de instruções SQL*Plus com ou sem suporte na Planilha SQL, consulte o tópico
Instruções SQL*Plus com e sem Suporte na Planilha SQL na Ajuda on-line do SQL Developer.
SET FEEDBACK ON
SET PAGESIZE 24
SET ECHO ON
O quadro completo
A saída do comando no slide é salva em um arquivo denominado dropem.sql no SQL
Developer. Para salvar a saída em um arquivo no SQL Developer, use a opção Salvar Arquivo
no painel Saída do Script. O arquivo dropem.sql contém os seguintes dados. Esse arquivo
pode agora ser iniciado a partir do SQL Developer localizando, carregando e executando o
arquivo de script.
SELECT
'INSERT INTO departments_test VALUES
SET PAGESIZE 24
SET HEADING ON ECHO ON FEEDBACK ON
Aplicativo de Resultado
'''X''' 'X'
'''' '
''''||department_name||'''' 'Administration'
''');' ');
Quando o primeiro exemplo no slide é executado, o usuário recebe uma solicitação para
informar os valores DEPTNO e HIREDATE:
Quando o segundo exemplo no slide for executado, a seguinte saída será gerada:
Sumário
A SQL pode ser usada para gerar scripts SQL. Esses scripts podem ser usados para impedir
código repetitivo, eliminar ou recriar objetos, obter ajuda a partir do dicionário de dados e gerar
predicados dinâmicos que contenham parâmetros de tempo de execução.
Objetivos
Este apêndice apresenta uma visão geral da arquitetura do Oracle Database. Você conhecerá as
estruturas físicas e lógicas e os diversos componentes do Oracle Database com suas respectivas
funções.
Biblioteca
Cache de ASM
Buffer de
buffer do
redo log Cache do
banco de dados
dicionário
Processo Processo de dados
do usuário do servidor
Estruturas de
armazenamento
Arquivos Arquivos
Arquivos de de redo log
de dados controle on-line
Conexão
Instância
Processo Processo
do usuário do servidor SGA
Shared pool
Cache de Biblioteca
buffer do Buffer de ASM
banco de redo log Cache do
dados dicionário
de dados
PGA
Processos de background
Processo Processo
do usuário do servidor DBWn CKPT LGWR SMON PMON
ARCn RECO Outros
Arquitetura de Processo
Os processos em um servidor de banco de dados Oracle podem ser categorizados em dois grupos
principais:
• Os processos de usuário que executam a aplicação ou o código da ferramenta Oracle
• Os processos do banco de dados Oracle que executam o código do servidor de banco de
dados Oracle. Esses incluem os processos de servidor e os processos de segundo plano.
Quando um usuário executa um programa aplicativo ou uma ferramenta Oracle (por exemplo,
SQL*Plus), o banco de dados Oracle cria um processo de usuário para executar o aplicativo do
usuário. O banco de dados Oracle também cria um processo de servidor para executar os
comandos emitidos pelo processo de usuário. Além disso, o servidor Oracle também cria um
conjunto de processos de segundo plano para uma instância, que interagem entre si e com o
sistema operacional, no intuito de gerenciar estruturas da memória e executar assincronamente
E/S para fins de gravação de dados em disco e execução de outras tarefas necessárias.
A estrutura dos processos varia nas diferentes configurações do Oracle Database, dependendo do
sistema operacional e das opções selecionadas para o banco de dados. O código dos usuários
conectados pode ser configurado como um servidor dedicado ou um servidor compartilhado.
• Com o servidor dedicado, para cada usuário, o aplicativo do banco de dados é executado
pelo processo do usuário, que é servido pelo processo de servidor dedicado que executa o
código do servidor do banco de dados Oracle.
• Um servidor compartilhado elimina a necessidade de um processo de servidor dedicado
para cada conexão. Um dispatcher encaminha várias solicitações de sessão de rede
recebidas a um pool de processos de servidor compartilhado. Um processo de servidor
compartilhado atende a qualquer solicitação do cliente.
Oracle Database: Fundamentos de SQL II I - 10
Arquitetura de processo (continuação)
Processos de Servidor
O Oracle Database cria processos de servidor para atender às solicitações dos processos de
usuário conectados à instância. Em algumas situações, quando o aplicativo e o banco de dados
Oracle operam no mesmo computador, é possível combinar o processo de usuário e o processo
de servidor correspondente em um único processo, a fim de reduzir o overhead do sistema.
Contudo, quando eles operarem em computadores diferentes, um processo de usuário sempre se
comunicará com o banco de dados Oracle usando um processo de servidor separado.
Os processos de servidor criados em nome de cada aplicação do usuário podem executar uma ou
mais das seguintes ações:
• Analisar por parse e executar instruções SQL por meio do aplicativo.
• Ler os blocos de dados necessários dos arquivos de dados em disco, nos buffers de banco de
dados compartilhados da SGA, caso os blocos ainda não estejam presentes na SGA.
Processo
checkpoint
Arquivos
de dados
Processo checkpoint
Um checkpoint é uma estrutura de dados que define um SCN no thread de redo de um banco de
dados. Os checkpoints são registrados no arquivo de controle e em cada cabeçalho de arquivo de
dados e são essenciais para recuperação.
Na ocorrência de um checkpoint, o banco de dados Oracle deve atualizar os cabeçalhos de todos
os arquivos de dados para registrar os detalhes do checkpoint. Isso é feito pelo processo CKPT.
O processo CKPT não grava blocos no disco; o DBWn sempre executa esse trabalho. Os SCNs
registrados nos cabeçalhos de arquivo garantem que todas as alterações feitas nos blocos de
banco de dados antes desse SCN sejam gravadas em disco.
Os checkpoints DBWR estatísticos exibidos pelo monitor SYSTEM_STATISTICS no Oracle
Enterprise Manager indicam o número de solicitações de checkpoint concluídas.
Processo
monitor do
sistema
Segmento
temporário
PMON Usuário
Processo de
Processo do usuário com
monitor do falha
Buffer cache do
processo
banco de dados
Database
Arquivo de parâmetros
Arquivo de senha
Arquivos de rede
Arquivos de alerta Arquivos de backup Arquivos de log arquivados
e de rastreamento
Lógicos Arquitetura
Database
Extensão
• Efetuar parse:
– Procure uma instrução idêntica.
– Verifique a sintaxe, os nomes de objeto e os privilégios.
– Bloqueie os objetos usados durante a parse.
– Crie e armazene o plano de execução.
• Executar: Identifique as linhas selecionadas.
Shared pool
Cache do
dicionário
de dados
Shared pool
Durante o estágio Efetuar Parse, o processo do servidor usa a área na SGA conhecida como
shared pool para compilar a instrução. O shared pool tem dois componentes primários:
• Cache de biblioteca
• Cache de dicionário de dados
Cache de biblioteca
O cache de biblioteca armazena informações sobre as instruções SQL usadas mais recentemente
em uma estrutura de memória conhecida como uma área SQL compartilhada. A área SQL
compartilhada contém:
• O texto da instrução SQL
• A árvore de parse, que é uma versão compilada da instrução
• O plano de execução, com as etapas envolvidas na execução da instrução
O otimizador é a função no Oracle Server que determina o plano de execução ideal.
Se uma instrução SQL for reexecutada e uma área SQL compartilhada já contiver o plano de
execução da instrução, o processo do servidor não precisará efetuar o parse da instrução. O
cache de biblioteca melhora o desempenho dos aplicativos que reutilizam instruções SQL,
reduzindo o tempo de parse e os requisitos de memória. Se a instrução SQL não for reutilizada,
ela será, eventualmente, eliminada do cache de biblioteca.
Buffer cache
• Não compartilhada
• Gravável apenas por processo de servidor
• Contém:
– Área de classificação
– Informações da sessão
– Estado do cursor
Processo
do servidor
PGA
Database
Imagem antiga
Segmento de
rollback Nova imagem
Instrução DML
Segmento de rollback
Antes de fazer uma alteração, o processo de servidor salva os valores de dados antigos em um
segmento de rollback. Essa “imagem anterior” é utilizada para:
• Desfazer as alterações se a transação for submetida a rollback
• Prover consistência na leitura assegurando que outras transações não vejam alterações não
submetidas a commit que sejam realizadas pela instrução DML
• Recuperar o banco de dados para um estado consistente no caso de falhas
Os segmentos de rollback (por exemplo, tabelas e índices) existem nos arquivos de dados e os
blocos de rollback são inseridos no buffer cache do banco de dados conforme necessário. Os
segmentos de rollback são criados pelo DBA.
As alterações nos segmentos de rollback são registradas no buffer de redo log.
1 Instância
SGA Shared pool
Processo Cache de
do servidor buffer do Buffer de
4 banco redo log
de dados
3
Database
Processamento de COMMIT
O Oracle Server usa um mecanismo rápido de COMMIT, o que garante que as alterações
submetidas a commit possam ser recuperadas no caso de falha da instância.
System Change Number
Sempre que uma transação for submetida a commit, o Oracle Server designa um SCN de commit
para a transação. O SCN é incrementado sequencialmente e é exclusivo dentro do banco de
dados. O Oracle Server o utiliza como um timestamp interno para sincronizar os dados e
oferecer consistência na leitura quando os dados forem recuperados a partir dos arquivos de
dados. O uso do SCN permite que o Oracle Server execute verificações de consistência sem
depender da data e hora do sistema operacional.
Etapas no processamento de COMMITs
Quando um COMMIT for emitido, as seguintes etapas serão executadas:
1. O processo de servidor coloca um registro de commit junto com o SCN no buffer de redo
log.
2. O LGWR executa uma gravação contígua de todas as entradas do buffer de redo log até e
inclusive
o registro de commit para os arquivos de redo log. Depois desse ponto, o Oracle Server
pode garantir que as alterações não serão perdidas mesmo depois de uma falha na
instância.
Oracle Database: Fundamentos de SQL II I - 31
Processamento de COMMIT (continuação)
3. O usuário é informado que o COMMIT foi concluído.
4. O processo de servidor registra as informações para indicar que a transação foi concluída e
que os bloqueios de recursos podem ser liberados.
A descarga dos buffers sujos para os arquivos de dados é executada pelo DBW0 de modo
independente e pode ocorrer antes ou depois do commit.
Vantagens do COMMIT Rápido
O mecanismo de COMMIT rápido assegura a recuperação de dados gravando as alterações para o
buffer de redo log em vez de para os arquivos de dados. Apresenta as seguintes vantagens:
• As gravações sequenciais para os arquivos de log são mais rápidas do que as gravações para
blocos diferentes no arquivo de dados.
• Apenas as informações mínimas necessárias para registrar as alterações são gravadas nos
arquivos de log; a gravação para os arquivos de dados requer que blocos inteiros de dados
SGA
Shared pool
Biblioteca
Cache de ASM
Buffer de
buffer do
redo log
banco de dados Cache do
dicion. de dados
PGA
Processo
Arquivos
Processo de redo
do usuário Arquivos Arquivos arquivados
de controle de redo log
Arquivos
de dados Database on-line
SPECIAL_SAL
SAL_HISTORY
MGR_HISTORY
3. Nita, a DBA, precisa que você crie uma tabela que contenham uma restrição de
chave primária, mas ela solicita que você dê ao índice um nome diferente da
restrição. Crie a tabela LOCATIONS_NAMED_INDEX com base no seguinte
gráfico de instância de tabela. Nomeie o índice para a coluna PRIMARY KEY
como LOCATIONS_PK_IDX.
4. Consulte a tabela USER_INDEXES para exibir o USER_INDEXES da tabela
LOCATIONS_NAMED_INDEX.
6.
a. Crie consultas para exibir os deslocamentos do fuso horário (TZ_OFFSET)
para os seguintes fusos horários:
- Chile/Ilha da Páscoa
10. Nita, a DBA, quer remover informações antigas do banco de dados. Um dos itens
que ela considera desnecessários é o registro de antigos funcionários. Ela pede
que você faça o seguinte:
Crie uma consulta para deletar a linha JOB_HISTORY mais antiga de um
funcionário procurando na tabela JOB_HISTORY o item MIN(START_DATE) do
funcionário. Delete somente os registros desses funcionários que alteraram pelo
menos dois cargos.
Dica: Utilize um comando DELETE correlacionado.
12. A crise econômica está forçando a gerência a tomar medidas para reduzir os
custos. O presidente da empresa quer analisar os salários mais altos da empresa.
Você é responsável por fornecer uma lista ao presidente da empresa com base nas
seguintes especificações:
Veja, a seguir, um diagrama das tabelas e colunas que você criou para a aplicação de
vídeo:
3. Você deseja criar alguns usuários que tenham acesso somente aos seus próprios
aluguéis. Crie uma usuária chamada Carmen e conceda a ela o privilégio de
selecionar opções da tabela RENTAL.
Observação: Certifique-se de adicionar o prefixo da sua conta do banco de dados
ao nome do usuário. Por exemplo, se você for o usuário oraxx, crie um usuário
chamado oraxx_Carmen.
4. Adicione uma coluna de preço (número 4,2) à tabela TITLE para armazenar o
valor do aluguel do título.
7. Não será mais necessário armazenar reservas. Você pode remover a tabela.
9. Mostre uma lista dos 10 títulos mais alugados nos últimos meses agrupados por
categoria.
11. Mostre uma lista dos sócios que já alugaram duas ou mais vezes.
13. Mostre uma lista dos sócios que têm “99” no número do telefone.
Os exercícios a seguir podem ser utilizados como prática adicional após a discussão
sobre instruções de DML (data manipulation language) e DDL (data definition
language) nas aulas intituladas “Gerenciando Gerenciando... e Manipulando... Please
check the Styke Guide: 4.2 Títulos de tópicos do sistema de ajuda e da documentação
Observação: Execute os scripts lab_ap_cre_special_sal.sql,
lab_ap_cre_sal_history.sql e lab_ap_cre_mgr_history.sql na
pasta labs para criar as tabelas SPECIAL_SAL, SAL_HISTORY e MGR_HISTORY
.
INSERT ALL
WHEN SAL < 5000 THEN
INTO special_sal VALUES (EMPID, SAL)
ELSE
INTO 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 employees
WHERE employee_id >=200;
ALTER SESSION
SET NLS_DATE_FORMAT = ‘DD-MON-YYYY HH24:MI:SS’;
6.
Os exercícios a seguir podem ser utilizados como prática adicional após a discussão
sobre subconsultas avançadas:
Observação: Se você tiver convertido a coluna HIRE_DATE a TIMESTAMP usando
code_05_12_sb.sql, a exibição da coluna HIRE_DATE seria como 13-JAN-00
12.00.00.000000000 AM
10. Nita, a DBA, quer remover informações antigas do banco de dados. Um dos itens
que ela considera desnecessários é o registro de antigos funcionários. Ela pede
que você faça o seguinte:
Crie uma consulta para deletar a linha JOB_HISTORY mais antiga de um
funcionário procurando na tabela JOB_HISTORY o item MIN(START_DATE)
do funcionário. Delete somente os registros desses funcionários que alteraram
pelo menos dois cargos.
Dica: Utilize um comando DELETE correlacionado.
ROLLBACK;
12. A crise econômica está forçando a gerência a tomar medidas para reduzir os
custos. O presidente da empresa quer analisar os salários mais altos da empresa.
Você é responsável por fornecer uma lista ao presidente da empresa com base nas
seguintes especificações:
Crie uma consulta para exibir os IDs de cargos cujo salário máximo está acima da
metade do salário máximo da empresa. Use a cláusula WITH para criar essa
consulta. A consulta deve ter o nome MAX_SAL_CALC.
WITH
MAX_SAL_CALC AS (SELECT job_title, MAX(salary) AS
job_total
FROM employees, jobs
WHERE employees.job_id = jobs.job_id
GROUP BY job_title)
SELECT job_title, job_total
FROM MAX_SAL_CALC
WHERE job_total > (SELECT MAX(job_total) * 1/2
FROM MAX_SAL_CALC)
ORDER BY job_total DESC;
Primeiro, execute o script dropvid.sql na pasta labs para remover tabelas que já
existem. Em seguida, execute o script buildvid.sql na pasta labs para criar e
preencher as tabelas.
3. Você deseja criar alguns usuários que tenham acesso somente aos seus próprios
aluguéis. Crie uma usuária chamada Carmen e conceda a ela o privilégio de
selecionar opções da tabela RENTAL.
Observação: Certifique-se de adicionar o prefixo da sua conta do banco de dados
ao nome do usuário. Por exemplo, se você for o usuário oraxx, crie um usuário
chamado oraxx_Carmen.
CREATE USER oraxx_carmen IDENTIFIED BY oracle ;
GRANT select ON rental TO oraxx_carmen;
4. Adicione uma coluna de preço (número 4,2) à tabela TITLE para armazenar o
valor do aluguel do título.
ALTER TABLE title ADD(price NUMBER(6))
7. Não será mais necessário armazenar reservas. Você pode remover a tabela.
DROP TABLE reservation cascade constraints;
9. Mostre uma lista dos 10 títulos mais alugados nos últimos meses agrupados por
categoria.
SELECT t.CATEGORY, t.TITLE
FROM TITLE t, RENTAL r
WHERE t.TITLE_ID = r.TITLE_ID AND
r. BOOK_DATE > (SYSDATE - 30) AND
10. Você pode calcular a multa por atraso (preço da diária do título) se o sócio
devolver o vídeo com seis dias de atraso.
SELECT t.title, m.member_id, t.price, (t.price*6) latefee
FROM title t, member m, rental r
WHERE t.TITLE_ID = r.TITLE_ID AND
m.member_id = r.member_id AND
r.act_ret_date is null;
11. Mostre uma lista dos sócios que já alugaram duas ou mais vezes.
SELECT member_id, last_name, first_name FROM member m
where 2 <= (select count(*) from rental_history where
member_id = m.member_id);
13. Mostre uma lista dos sócios que têm “99” no número do telefone.
SELECT REGEXP_COUNT(phone,'99',1,'i') position, member_id,
last_name, first_name
FROM member
WHERE REGEXP_COUNT(phone,'99',1,'i') > 0;