Oracle Sql PortuguêS

Loading...

Flash Player 9 (or above) is needed to view presentations.
We have detected that you do not have it on your computer. To install it, go here.

2 comments

Comments 1 - 2 of 2 previous next Post a comment

Post a comment
Embed Video
Edit your comment Cancel

3 Favorites

Oracle Sql PortuguêS - Presentation Transcript

  1. Introdução ao Oracle9i: SQL Apresentação Eletrônica 40049BP11 Produção 1.1 Fevereiro de 2002 D34392 1-1 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  2. Autores Copyright © Oracle Corporation, 2000, 2001. Todos os direitos reservados. Nancy Greenberg Priya Nathan Esta documentação contém informações patenteadas pela Oracle Corporation. É fornecida sob um contrato de licença que contém restrições sobre seu uso e sua divulgação, sendo também protegida pela legislação de direitos autorais. Não é Colaboradores Técnicos permitida a engenharia reversa do programa de computador. Se esta documentação e Revisores for entregue/distribuída a uma Agência do Departamento de Defesa do Governo dos Estados Unidos da América do Norte, será então entregue/distribuída com Direitos Josephine Turner Restritos e a seguinte legenda será aplicável: Martin Alvarez Anna Atkinson Legenda de Direitos Restritos Don Bates O uso, duplicação ou divulgação por aquele Governo estão sujeitos às restrições Marco Berbeek aplicáveis aos programas comerciais de computadores e serão considerados como Andrew Brannigan programas de computador com Direitos Restritos de acordo com a legislação federal Laszlo Czinkoczki daquele Governo, conforme descrito no subparágrafo da legislação norte-americana Michael Gerlach (c)(1)(ii) de DFARS 252.227-7013, Direitos sobre Dados Técnicos e Programas de Sharon Gray Computador (outubro de 1988). Rosita Hanoman Proibida a reprodução total ou parcial desta documentação sem a expressa Mozhe Jalali autorização prévia por escrito da Oracle Corporation ou da Oracle do Brasil Sistemas Sarah Jones Ltda. A cópia deste material, de qualquer forma ou por qualquer meio, eletrônico, Charbel Khouri mecânico ou de outra natureza, inclusive através de processos xerográficos, de Christopher Lawless fotocópia e de gravação, constitui violação da legislação de direitos autorais e será Diana Lorentz punida civil e/ou criminalmente na forma da lei. Nina Minchen Cuong Nguyen Se esta documentação for entregue/distribuída a uma Agência do Governo dos Daphne Nougier Estados Unidos da América do Norte que não esteja subordinada ao Departamento Patrick Odell de Defesa, será então entregue/distribuída com \"Direitos Restritos\" conforme definido no FAR 52.227-14, Direitos sobre Dados - Geral, inclusive a Alternativa III (junho Laura Pezzini de 1987). Stacey Procter Maribel Renau As informações contidas neste documento estão sujeitas a alterações sem aviso Bryan Roberts prévio. Se você encontrar algum problema na documentação, envie a Education Helen Robertson Products - Oracle Corporation ou a Education - Oracle do Brasil Sistemas Ltda. Sunshine Salmon uma descrição de tal problema por escrito. A Oracle Corporation e a Oracle do Casa Sharif Brasil Sistemas Ltda. não garantem que este documento esteja isento de erros. Bernard Soleillant Oracle e todos os demais produtos Oracle citados nesta documentação são marcas Craig Spoonemore comerciais ou marcas comerciais registradas da Oracle Corporation. Ruediger Steffan Karla Villasenor Todos os outros nomes de produtos ou de empresas são aqui mencionados Andree Wheeley apenas para fins de identificação e podem ser marcas comerciais de seus Lachlan Williams respectivos proprietários. Editor Nita Brozowski 1-2 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  3. Mapa de Cursos Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  4. Currículo de Linguagens do Oracle9i Introdução ao Introduction to Oracle9i ou Oracle9i: SQL for Oracle9i: SQL for Oracle9i: SQL for End Users End Users Introduction to Oracle9i: Experienced SQL Users Oracle9i: SQL inClass inClass Basics (Introdução Advanced SQL (Introdução ao Oracle9i para ao Oracle9i: (Oracle9i: SQL Usuários Experientes em SQL) SQL Básico) Avançado) inClass inClass Oracle9i: Program with PL/SQL (Oracle9i: Unidades de Programas PL/SQL) Oracle9i: PL/SQL Oracle9i: Develop PL/SQL Oracle9i: Develop PL/SQL Fundamentals Program Units Program Units inClass Oracle9i: Advanced PL/SQL Oracle9i: Advanced PL/SQL inClass inClass Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  5. I Introdução Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  6. Objetivos Após concluir esta lição, você poderá fazer o seguinte: • Listar os recursos do Oracle9i • Discutir os aspectos teóricos e físicos de um banco de dados relacional • Descrever a implementação Oracle do RDBMS e ORDBMS I-2 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  7. Oracle9i Escalabilidade Um fornecedor Uma interface Confiabilidade de gerenciamento Modelo de Conjuntos desenvolvimento de habilidades único comuns I-3 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  8. Oracle9i I-4 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  9. Oracle9i Application Server Portais A Aplicações Transacionais P A C Business Intelligence intelligence H E Integração I-5 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  10. Oracle9i Database Dados Relacionais de Objetos Documentos XML XML Multimídia Mensagens I-6 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  11. Sistema de Gerenciamento de Banco de Dados Relacional de Objetos e Relacional • Modelo relacional e modelo relacional de objetos • Objetos e tipos de dados definidos pelo usuário • Compatibilidade total com o banco de dados relacional • Suporte de objetos grandes e multimídia • Recursos de servidor de banco de dados de alta qualidade I-7 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  12. Oracle Internet Platform Clientes Qualquer Qualquer cliente Qualquer navegador de correio cliente FTP Ferramentas de desenvolvimento Gerenciamento de sistema Aplicações para Internet SQL SQL Lógica comercial Apresentação e e dados lógica comercial PL/SQL PL/SQL Bancos Servidores de de dados aplicações Java Java Serviços de rede I-8 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  13. Ciclo de Vida Útil de Desenvolvimento do Sistema Estratégia e análise Projeto Construção e documentação Transição Produção I-9 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  14. Armazenamento de Dados em Diferentes Mídias Banco de Dados Planilha Arquivo físico eletrônica I-11 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  15. Conceito de Banco de Dados Relacional • O Dr. E. F. Codd propôs o modelo relacional de sistemas de bancos de dados em 1970. • Ele é a base para o RDBMS (relational database management system). • O modelo relacional consiste nos seguintes itens: – Conjunto de objetos ou relações – Conjunto de operadores para agir sobre as relações – Integridade de dados para fins de precisão e consistência I-12 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  16. Definição de Banco de Dados Relacional Um banco de dados relacional é um conjunto de relações ou tabelas bidimensionais. Servidor Oracle Nome da Tabela: EMPLOYEES Nome da Tabela: DEPARTMENTS … … I-13 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  17. Modelos de Dados Modelo de sistema na mente Modelo de entidade do cliente do modelo do cliente Modelo de tabela do modelo de entidade Servidor Oracle Tabelas em disco I-14 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  18. Modelo de Relacionamento de Entidades • • Crie um diagrama de relacionamento de entidades a Crie um diagrama de relacionamento de entidades a partir de narrativas ou especificações de negócios partir de narrativas ou especificações de negócios EMPLOYEE DEPARTMENT atribuído a #* número #* número * nome * nome composto de o cargo o local • • Cenário Cenário – – \". .. .. Atribua um ou mais funcionários a um \". Atribua um ou mais funcionários a um departamento. .. .\" departamento. .\" – – \". .. .. Alguns departamentos ainda não têm \". Alguns departamentos ainda não têm funcionários atribuídos a eles. .. .\" funcionários atribuídos a eles. .\" I-15 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  19. Convenções de Modelo para Relacionamento de Entidades Entidade Atributo \"Soft box\" Nome individual Nome exclusivo individual Letras minúsculas Letras maiúsculas Obrigatório marcado com \"*\" Sinônimo entre parênteses Opcional marcado com \"o\" EMPLOYEE atribuído a DEPARTMENT #* número #* número * nome * nome composto de o cargo o local UID (Identificador Exclusivo) Principal marcado com \"#\" Secundário marcado com \"(#)\" I-17 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  20. Relacionando Várias Tabelas • Cada linha de dados de uma tabela é identificada com exclusividade por uma chave primária (PK). • Você pode relacionar logicamente dados de várias tabelas usando as chaves estrangeiras (FK). Nome da Tabela: DEPARTMENTS Nome da Tabela: EMPLOYEES … Chave primária Chave estrangeira Chave primária I-19 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  21. Terminologia de Banco de Dados Relacional 3 4 2 6 5 1 I-21 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  22. Propriedades de Banco de Dados Relacional Um banco de dados relacional: • Pode ser acessado e modificado com a execução de instruções SQL (Structured Query Language) • Contém um conjunto de tabelas sem ponteiros físicos • Usa um conjunto de operadores I-23 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  23. Comunicando-se com um RDBMS Usando o Código SQL A instrução SQL é informada. A instrução é SELECT department_name SELECT department_name enviada ao Oracle FROM FROM departments; departments; Server. Servidor Oracle I-24 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  24. Sistema de Gerenciamento de Banco de Dados Relacional Servidor Oracle Tabelas de Dicionário usuários de dados I-25 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  25. Instruções SQL SELECT Recuperação de dados INSERT UPDATE DML (Data Manipulation Language) DELETE MERGE CREATE ALTER DROP DDL (Data Definition Language) RENAME TRUNCATE COMMIT ROLLBACK Controle de transação SAVEPOINT GRANT REVOKE DCL (Data Control Language) I-26 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  26. Tabelas Usadas no Curso EMPLOYEES DEPARTMENTS JOB_GRADES I-27 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  27. Resumo • O Oracle9i Server é o banco de dados de computação na Internet. • O Oracle9i é baseado no ORDBMS. • Os bancos de dados relacionais são compostos por relações, gerenciados por operações relacionais e regidos por restrições de integridade de dados. • Com o Oracle Server, você pode armazenar e gerenciar informações usando a linguagem SQL e o mecanismo PL/SQL. I-28 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  28. 1 Criando Instruções SELECT SQL Básicas Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  29. Objetivos Após concluir esta lição, você poderá fazer o seguinte: • Listar os recursos das instruções SELECT SQL • Executar uma instrução SELECT básica • Diferenciar instruções SQL de comandos do iSQL*Plus 1-2 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  30. Recursos das Instruções SELECT SQL Projeção Seleção Tabela 1 Tabela 1 Junção Tabela 1 Tabela 2 1-3 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  31. Instrução SELECT Básica SELECT SELECT *|{[DISTINCT] coluna|expressão [apelido],...} *|{[DISTINCT] coluna|expressão [apelido],...} FROM FROM tabela; tabela; • SELECT identifica quais colunas • FROM identifica qual tabela 1-4 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  32. Selecionando Todas as Colunas SELECT * FROM departments; 1-6 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  33. Selecionando Colunas Específicas SELECT department_id, location_id FROM departments; 1-7 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  34. Criando Instruções SQL • As instruções SQL não fazem distinção entre maiúsculas e minúsculas. • As instruções SQL podem estar em uma ou mais linhas. • As palavras-chave não podem ser abreviadas ou dividas de uma linha para outra. • Normalmente, as cláusulas são colocadas em linhas separadas. • Os recuos são usados para aperfeiçoar a legibilidade. 1-8 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  35. Defaults de Cabeçalho de Coluna • iSQL*Plus: – Justificação de cabeçalho default: centralizada – Exibição de cabeçalho default: maiúsculas • SQL*Plus: – Os cabeçalhos das colunas de caracteres e datas são justificados à esquerda – Os cabeçalhos das colunas de números são justificados à direita – Exibição de cabeçalho default: maiúsculas 1-9 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  36. Expressões Aritméticas Crie expressões com dados numéricos e de datas usando operadores aritméticos. Operador Descrição + Adicionar - Subtrair * Multiplicar / Dividir 1-10 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  37. Usando Operadores Aritméticos SELECT last_name, salary, salary + 300 FROM employees; … 1-11 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  38. Precedência de Operadores _ * / + • A multiplicação e a divisão têm prioridade sobre a adição e a subtração. • Os operadores com a mesma prioridade são avaliados da esquerda para a direita. • Os parênteses são usados para forçar a avaliação priorizada e para esclarecer as instruções. 1-12 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  39. Precedência de Operadores SELECT last_name, salary, 12*salary+100 FROM employees; … 1-13 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  40. Usando Parênteses SELECT last_name, salary, 12*(salary+100) FROM employees; … 1-14 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  41. Definindo um Valor Nulo • Nulo é um valor que não está disponível, não é atribuído, é desconhecido ou não é aplicável. • Um valor nulo não é o mesmo que um zero ou um espaço em branco. SELECT last_name, job_id, salary, commission_pct FROM employees; … … 1-15 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  42. Valores Nulos nas Expressões Aritméticas As expressões aritméticas que contêm um valor nulo são avaliadas como nulas. SELECT last_name, 12*salary*commission_pct FROM employees; … … 1-16 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  43. Definindo um Apelido de Coluna Um apelido de coluna: • Renomeia um cabeçalho de coluna • É útil para cálculos • Segue imediatamente o nome da coluna. Também pode haver a palavra-chave AS opcional entre o nome da coluna e o apelido • Necessita de aspas duplas caso contenha espaços ou caracteres especiais ou faça distinção entre maiúsculas e minúsculas 1-17 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  44. Usando Apelidos de Coluna SELECT last_name AS name, commission_pct comm FROM employees; … SELECT last_name \"Name\", salary*12 \"Annual Salary\" FROM employees; … 1-18 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  45. Operador de Concatenação Um operador de concatenação: • Concatena colunas ou strings de caracteres a outras colunas • É representado por duas barras verticais (||) • Cria uma coluna resultante que é uma expressão de caracteres 1-19 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  46. Usando o Operador de Concatenação SELECT last_name||job_id AS \"Employees\" FROM employees; … 1-20 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  47. Strings de Caracteres Literais • Um literal é um caractere, um número ou uma data incluída na lista SELECT. • Os valores literais de caracteres e datas devem estar entre aspas simples. • Cada string de caracteres é gerada uma vez para cada linha retornada. 1-21 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  48. Usando Strings de Caracteres Literais SELECT last_name ||' is a '||job_id AS \"Employee Details\" FROM employees; … 1-22 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  49. Linhas Duplicadas A exibição default das consultas é de todas as linhas, incluindo linhas duplicadas. SELECT department_id SELECT department_id FROM FROM employees; employees; … 1-23 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  50. Eliminando Linhas Duplicadas Elimine linhas duplicadas usando a palavra-chave DISTINCT na cláusula SELECT. SELECT DISTINCT department_id FROM employees; 1-24 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  51. Interação entre SQL e iSQL*Plus Instruções SQL iSQL*Plus Servidor Internet Oracle Browser iSQL*Plus Resultados da consulta Comandos Relatório formatado Cliente 1-25 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  52. Instruções SQL Versus Comandos do iSQL*Plus SQL iSQL*Plus • Uma linguagem • Um ambiente • Padrão ANSI • Patenteado pela Oracle • A palavra-chave não • As palavras-chave podem ser pode ser abreviada abreviadas • As instruções • Os comandos não permitem a manipulam definições manipulação dos valores no banco de dados e tabela no de dados banco de dados • É executado em um browser • Carregado centralmente, não precisa ser implementado em cada máquina SQL iSQL*Plus SQL iSQL*Plus 1-26 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  53. Visão Geral do iSQL*Plus Após efetuar login no iSQL*Plus, você poderá: • Descrever a estrutura de tabela • Editar a instrução SQL • Executar o SQL no iSQL*Plus • Salvar instruções SQL em arquivos e anexá-las a arquivos • Executar instruções armazenadas em arquivos salvos • Carregar comandos de um arquivo de texto na janela Edit (Editar) do iSQL*Plus 1-27 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  54. Efetuando Login no iSQL*Plus No seu ambiente de browser Windows: 1-29 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  55. O Ambiente do iSQL*Plus 10 8 9 6 1 7 2 3 4 5 1-30 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  56. Exibindo a Estrutura de Tabela Use o comando DESCRIBE do iSQL*Plus para exibir a estrutura de uma tabela. DESC[RIBE] nome_da_tabela DESC[RIBE] nome_da_tabela 1-31 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  57. Exibindo a Estrutura de Tabela DESCRIBE employees DESCRIBE employees 1-32 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  58. Interagindo com Arquivos de Script SELECT last_name, hire_date, salary FROM employees; 1 2 1-33 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  59. Interagindo com Arquivos de Script 1 D:\\temp\\emp_sql.htm SELECT last_name, hire_date, salary 2 FROM employees; 3 1-34 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  60. Interagindo com Arquivos de Script DESCRIBE employees SELECT first_name, last_name, job_id 1 FROM employees; 3 2 1-35 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  61. Resumo Nesta lição, você aprendeu a: • Criar uma instrução SELECT que: – Retorne todas as linhas e colunas de uma tabela – Retorne colunas especificadas de uma tabela – Use apelidos de coluna para fornecer cabeçalhos de coluna descritivos • Use o ambiente do iSQL*Plus para criar, salvar e executar instruções SQL e comandos do iSQL*Plus. SELECT SELECT *|{[DISTINCT] coluna|expressão [apelido],...} *|{[DISTINCT] coluna|expressão [apelido],...} FROM FROM tabela; tabela; 1-36 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  62. Visão Geral do Exercício 1 Este exercício abrange os seguintes tópicos: • Selecionando todos os dados a partir de tabelas diferentes • Descrevendo a estrutura de tabelas • Executando cálculos aritméticos e especificando nomes de colunas • Usando o iSQL*Plus 1-37 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  63. 2 Restringindo e Classificando Dados Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  64. Objetivos Após concluir esta lição, você poderá fazer o seguinte: • Limitar as linhas recuperadas por uma consulta • Classificar as linhas recuperadas por uma consulta 2-2 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  65. Limitando Linhas Usando uma Seleção EMPLOYEES … \"recuperar todos os funcionários do departamento 90\" 2-3 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  66. Limitando as Linhas Selecionadas • Restrinja as linhas retornadas usando a cláusula WHERE. SELECT *|{[DISTINCT] coluna|expressão [apelido],...} FROM tabela [WHERE condição(ões)]; • A cláusula WHERE segue a cláusula FROM. 2-4 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  67. Usando a Cláusula WHERE SELECT employee_id, last_name, job_id, department_id FROM employees WHERE department_id = 90; 2-5 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  68. Strings de Caracteres e Datas • As strings de caracteres e valores de data aparecem entre aspas simples. • Os valores de caractere fazem distinção entre maiúsculas e minúsculas e os valores de data fazem distinção entre formatos. • O formato de data default é DD-MON-RR. SELECT last_name, job_id, department_id FROM employees WHERE last_name = 'Whalen'; 2-6 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  69. Condições de Comparação Operador Significado = Igual a > Maior que >= Maior que ou igual a < Menor que <= Menor que ou igual a <> Diferente de 2-7 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  70. Usando Condições de Comparação SELECT last_name, salary FROM employees WHERE salary <= 3000; 2-8 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  71. Outras Condições de Comparação Operador Significado BETWEEN Entre dois valores (inclusive), ...AND... IN(set) Corresponde qualquer valor de uma lista LIKE Corresponde um padrão de caractere IS NULL É um valor nulo 2-9 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  72. Usando a Condição BETWEEN Use a condição BETWEEN para exibir linhas baseadas em uma faixa de valores. SELECT last_name, salary FROM employees WHERE salary BETWEEN 2500 AND 3500; Limite inferior Limite superior 2-10 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  73. Usando a Condição IN Use a condição de associação IN para testar valores em uma lista. SELECT employee_id, last_name, salary, manager_id FROM employees WHERE manager_id IN (100, 101, 201); 2-11 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  74. Usando a Condição LIKE • Use a condição LIKE para executar pesquisas curingas de valores válidos de string de pesquisa. • As condições de pesquisa podem conter caracteres literais ou números: – % denota zero ou muitos caracteres. – _ denota um caractere. SELECT first_name FROM employees WHERE first_name LIKE 'S%'; 2-12 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  75. Usando a Condição LIKE • Você pode combinar caracteres de correspondência de padrão. SELECT last_name FROM employees WHERE last_name LIKE '_o%'; • É possível usar o identificador ESCAPE para procurar pelos símbolos % e _. 2-13 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  76. Usando as Condições NULL Teste para valores nulos com o operador IS NULL. SELECT last_name, manager_id FROM employees WHERE manager_id IS NULL; 2-14 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  77. Condições Lógicas Operador Significado AND Retorna TRUE se ambas as condições de componentes forem verdadeiras OR Retorna TRUE se uma das condições de componente for verdadeira NOT Retorna TRUE se a condição seguinte for falsa 2-15 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  78. Usando o Operador AND AND exige que ambas as condições sejam verdadeiras. SELECT employee_id, last_name, job_id, salary FROM employees WHERE salary >= 10000 AND job_id LIKE '%MAN%'; 2-16 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  79. Usando o Operador OR OR exige que uma das condições seja verdadeira. OR exige que uma das condições seja verdadeira. SELECT employee_id, last_name, job_id, salary FROM employees WHERE salary >= 10000 OR job_id LIKE '%MAN%'; 2-17 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  80. Usando o Operador NOT SELECT last_name, job_id FROM employees WHERE job_id NOT IN ('IT_PROG', 'ST_CLERK', 'SA_REP'); 2-18 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  81. Regras de Precedência Ordem de Avaliação Operador 1 Operadores aritméticos 2 Operador de concatenação 3 Condições de comparação 4 IS [NOT] NULL, LIKE, [NOT] IN 5 [NOT] BETWEEN 6 Condição lógica NOT 7 Condição lógica AND 8 Condição lógica OR Sobreponha regras de precedência usando parênteses. 2-19 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  82. Regras de Precedência SELECT last_name, job_id, salary FROM employees WHERE job_id = 'SA_REP' OR job_id = 'AD_PRES' AND salary > 15000; 2-20 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  83. Regras de Precedência Use parênteses para forçar a prioridade. Use parênteses para forçar a prioridade. SELECT last_name, job_id, salary FROM employees WHERE (job_id = 'SA_REP' OR job_id = 'AD_PRES') AND salary > 15000; 2-21 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  84. Cláusula ORDER BY • Classifique linhas com a cláusula ORDER BY – ASC: ordem crescente, default – DESC: ordem decrescente • A cláusula ORDER BY aparece por último na instrução SELECT. SELECT last_name, job_id, department_id, hire_date FROM employees ORDER BY hire_date; … 2-22 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  85. Classificando em Ordem Decrescente SELECT last_name, job_id, department_id, hire_date FROM employees ORDER BY hire_date DESC ; … 2-23 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  86. Classificando por Apelido de Coluna SELECT employee_id, last_name, salary*12 annsal FROM employees ORDER BY annsal; … 2-24 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  87. Classificando por Várias Colunas • A ordem da lista ORDER BY é a ordem de classificação. SELECT last_name, department_id, salary FROM employees ORDER BY department_id, salary DESC; … • Você pode classificar por uma coluna que não esteja na lista SELECT. 2-25 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  88. Resumo Nesta lição, você aprendeu a: • Usar a cláusula WHERE para restringir linhas de saída – Usar as condições de comparação – Usar as condições BETWEEN, IN, LIKE e NULL – Aplicar os operadores lógicos AND, OR e NOT • Usar a cláusula ORDER BY para classificar linhas de saída SELECT *|[DISTINCT] coluna|expressão [apelido],...} FROM tabela [WHERE condição(ões)] [ORDER BY coluna, expr, apelido [ASC|DESC]]; 2-26 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  89. Visão Geral do Exercício 2 Este exercício abrange os seguintes tópicos: • Selecionando dados e alterando a ordem das linhas exibidas • Restringindo linhas usando a cláusula WHERE • Classificando linhas usando a cláusula ORDER BY 2-27 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  90. 3 Funções de uma Única Linha Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  91. Objetivos Após concluir esta lição, você poderá fazer o seguinte: • Descrever vários tipos de funções disponíveis em SQL • Usar funções de data, número e caractere em instruções SELECT • Descrever o uso das funções de conversão 3-2 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  92. Funções SQL Entrada Saída Função arg 1 A função executa a ação arg 2 Valor resultante arg n 3-3 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  93. Dois Tipos de Funções SQL Funções Funções de Funções de uma única linha várias linhas 3-4 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  94. Funções de uma Única Linha Funções de uma única linha: • Manipulam itens de dados • Aceitam argumentos e retornam um valor • Agem em cada linha retornada • Retornam um resultado por linha • Podem modificar o tipo de dados • Podem ser aninhadas • Aceitam argumentos que podem ser uma coluna ou uma expressão nome_função [(arg1, arg2,...)] nome_função [(arg1, arg2,...)] 3-5 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  95. Funções de uma Única Linha Caractere Gerais Numéricas Funções de uma única linha Conversão Data 3-6 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  96. Funções de Caractere Funções de caractere Funções de Funções de manipulação de manipulação de maiúsc./minúsc. caracteres LOWER CONCAT UPPER SUBSTR INITCAP LENGTH INSTR LPAD | RPAD TRIM REPLACE 3-7 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  97. Funções de Manipulação de Maiúsculas e Minúsculas Essas funções convertem letras maiúsculas em minúsculas e vice-versa nas strings de caracteres. Função Resultado LOWER('SQL Course') sql course UPPER('SQL Course') SQL COURSE INITCAP('SQL Course') Sql Course 3-9 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  98. Usando Funções de Manipulação de Maiúsculas e Minúsculas Exibir o número, o nome e o número do departamento do funcionário Higgins: SELECT employee_id, last_name, department_id SELECT employee_id, last_name, department_id FROM FROM employees employees WHERE last_name = 'higgins'; WHERE last_name = 'higgins'; no rows selected no rows selected SELECT employee_id, last_name, department_id FROM employees WHERE LOWER(last_name) = 'higgins'; 3-10 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  99. Funções de Manipulação de Caracteres Estas funções manipulam strings de caracteres: Função Resultado CONCAT('Hello', 'World') HelloWorld SUBSTR('HelloWorld',1,5) Hello LENGTH('HelloWorld') 10 INSTR('HelloWorld', 'W') 6 LPAD(salary,10,'*') *****24000 RPAD(salary, 10, '*') 24000***** TRIM('H' FROM 'HelloWorld') elloWorld 3-11 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  100. Usando as Funções de Manipulação de Caracteres 1 SELECT employee_id, CONCAT(first_name, last_name) NAME, job_id, LENGTH (last_name), 2 INSTR(last_name, 'a') \"Contains 'a'?\" FROM employees 3 WHERE SUBSTR(job_id, 4) = 'REP'; 1 2 3 3-12 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  101. Funções Numéricas • ROUND: arredonda o valor para o decimal especificado ROUND(45.926, 2) 45.93 • TRUNC: trunca o valor para o decimal especificado TRUNC(45.926, 2) 45.92 • MOD: retorna o resto da divisão MOD(1600, 300) 100 3-13 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  102. Usando a Função ROUND 1 2 SELECT ROUND(45.923,2), ROUND(45.923,0), ROUND(45.923,-1) 3 FROM DUAL; 1 2 3 DUAL é uma tabela fictícia usada para exibir resultados de funções e cálculos. 3-14 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  103. Usando a Função TRUNC 1 2 SELECT TRUNC(45.923,2), TRUNC(45.923), TRUNC(45.923,-2) 3 FROM DUAL; 1 2 3 3-15 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  104. Usando a Função MOD Calcule o que resta de um salário após dividi-lo por 5.000 para todos os funcionários cujo cargo seja representante de vendas. SELECT last_name, salary, MOD(salary, 5000) FROM employees WHERE job_id = 'SA_REP'; 3-16 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  105. Trabalhando com Datas • O banco de dados Oracle armazena datas em um formato de número interno: século, ano, mês, dia, horas, minutos, segundos. • O formato de exibição de data default é DD-MON-RR. – Permite que você armazene datas do século 21 no século 20 especificando apenas os dois últimos dígitos do ano. – Permite que você armazene datas do século 20 no século 21 da mesma maneira. SELECT last_name, hire_date FROM employees WHERE last_name like 'G%'; 3-17 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  106. Trabalhando com Datas SYSDATE é uma função que retorna: • Data • Hora 3-18 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  107. Aritmética com Datas • Adicionar ou subtrair um número de, ou para, uma data para um valor de data resultante. • Subtrair duas datas para localizar o número de dias entre estas datas. • Adicionar horas para uma data dividindo o número de horas por 24. 3-19 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  108. Usando Operadores Aritméticos com Datas SELECT last_name, (SYSDATE-hire_date)/7 AS WEEKS FROM employees WHERE department_id = 90; 3-20 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  109. Funções de Data Função Descrição MONTHS_BETWEEN Número de meses entre duas datas ADD_MONTHS Adiciona meses do calendário à data NEXT_DAY Dia seguinte à data especificada LAST_DAY Último dia do mês ROUND Arredonda a data TRUNC Trunca a data 3-21 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  110. Usando Funções de Data • MONTHS_BETWEEN ('01-SEP-95','11-JAN-94') 19.6774194 • ADD_MONTHS ('11-JAN-94',6) '11-JUL-94' • NEXT_DAY ('01-SEP-95','FRIDAY') '08-SEP-95' • LAST_DAY('01-SEP-95') '28-FEB-95' 3-22 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  111. Usando Funções de Data Suponha que SYSDATE = '25-JUL-95': • ROUND(SYSDATE,'MONTH') 01-AUG-95 • ROUND(SYSDATE ,'YEAR') 01-JAN-96 • TRUNC(SYSDATE ,'MONTH') 01-JUL-95 • TRUNC(SYSDATE ,'YEAR') 01-JAN-95 3-23 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  112. Exercício 3, Parte Um: Visão Geral Este exercício abrange os seguintes tópicos: • Criando uma consulta que exibe a data atual • Criando consultas que exigem o uso de funções numéricas, de caractere e de data • Executando cálculos de anos e meses de serviço de um funcionário 3-24 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  113. Funções de Conversão Conversão de tipo de dados Conversão de tipo de Conversão de tipo de dados implícita dados explícita 3-25 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  114. Conversão de Tipo de Dados Implícita Nas designações, o servidor Oracle pode converter automaticamente o seguinte: De Em VARCHAR2 ou CHAR NUMBER VARCHAR2 ou CHAR DATE NUMBER VARCHAR2 DATE VARCHAR2 3-26 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  115. Conversão de Tipo de Dados Implícita Na avaliação de expressões, o Oracle Server pode converter automaticamente o seguinte: De Em VARCHAR2 ou CHAR NUMBER VARCHAR2 ou CHAR DATE 3-27 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  116. Conversão de Tipo de Dados Explícita TO_NUMBER TO_DATE NUMBER CHARACTER DATE TO_CHAR TO_CHAR 3-28 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  117. Conversão de Tipo de Dados Explícita TO_NUMBER TO_DATE NUMBER CHARACTER DATE TO_CHAR TO_CHAR 3-29 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  118. Usando a Função TO_CHAR com Datas TO_CHAR(data, 'modelo_formato') TO_CHAR(data, 'modelo_formato') O modelo de formato: • Deve ser delimitado por aspas simples e fazer distinção entre maiúsculas e minúsculas • Pode incluir qualquer elemento de formato de data válido • Tem um elemento fm para remover espaços de preenchimento ou suprimir zeros à esquerda • É separado do valor de data por uma vírgula 3-31 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  119. Elementos do Modelo de Formato de Data YYYY Ano completo em números YEAR Ano por extenso MM Valor de dois dígitos para o mês MONTH Nome completo do mês MON Abreviação de três letras do mês Abreviação de três letras do dia DY da semana DAY Nome completo do dia da semana DD Dia do mês numérico 3-32 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  120. Elementos do Modelo de Formato de Data • Os elementos de hora formatam a parte de hora da data. HH24:MI:SS AM 15:45:32 PM • Adicionar strings de caracteres colocando-as entres aspas. DD \"of\" MONTH 12 of OCTOBER • Os sufixos de número escrevem os números por extenso. ddspth fourteenth 3-34 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  121. Usando a Função TO_CHAR com Datas SELECT last_name, TO_CHAR(hire_date, 'fmDD Month YYYY') AS HIREDATE FROM employees; … 3-36 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  122. Usando a Função TO_CHAR com Números TO_CHAR(número, 'modelo_formato') TO_CHAR(número, 'modelo_formato') Estes são alguns dos elementos de formato que podem ser usados com a função TO_CHAR para exibir um valor numérico como um caractere: 9 Representa um número 0 Força a exibição de um zero $ Coloca um símbolo de dólar flutuante L Usa o símbolo da moeda local flutuante . Imprime uma vírgula decimal , Imprime um indicador de milhar 3-37 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  123. Usando a Função TO_CHAR com Números SELECT TO_CHAR(salary, '$99,999.00') SALARY FROM employees WHERE last_name = 'Ernst'; 3-39 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  124. Usando as Funções TO_NUMBER e TO_DATE • Converter uma string de caracteres em um formato de número usando a função TO_NUMBER: TO_NUMBER(caract[, 'modelo_formato']) TO_NUMBER(caract[, 'modelo_formato']) • Converter uma string de caracteres em um formato de data usando a função TO_DATE: TO_DATE(caract[, 'modelo_formato']) TO_DATE(caract[, 'modelo_formato']) • Essas funções têm um modificador fx. Esse modificador especifica a correspondência exata para o argumento de caractere e o modelo de formato de data de uma função TO_DATE 3-40 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  125. Usando as Funções TO_NUMBER e TO_DATE • Converter uma string de caracteres em um formato de número usando a função TO_NUMBER: TO_NUMBER(caract[, 'modelo_formato']) TO_NUMBER(caract[, 'modelo_formato']) • Converter uma string de caracteres em um formato de data usando a função TO_DATE: TO_DATE(caract[, 'modelo_formato']) TO_DATE(caract[, 'modelo_formato']) • Essas funções têm um modificador fx. Esse modificador especifica a correspondência exata para o argumento de caractere e o modelo de formato de data de uma função TO_DATE 3-41 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  126. Formato de Data RR Ano Atual Data Especificada Formato RR Formato YY 1995 27-OCT-95 1995 1995 1995 27-OCT-17 2017 1917 2001 27-OCT-17 2017 2017 2001 27-OCT-95 1995 2095 Se o ano de dois dígitos especificado for: 0–49 50–99 Se os dois A data retornada A data retornada dígitos do 0–49 estará no século estará no século ano atual atual anterior forem: A data retornada A data retornada 50–99 estará no século estará no século seguinte atual 3-42 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  127. Exemplo de Formato de Data RR Para determinar os funcionários admitidos antes de 1990, use oformato RR, que produz os mesmos resultados independentemente de o comando ser executado em 1999 ou agora: SELECT last_name, TO_CHAR(hire_date, 'DD-Mon-YYYY') FROM employees WHERE hire_date < TO_DATE('01-Jan-90', 'DD-Mon-RR'); 3-43 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  128. Aninhando Funções • As funções de uma única linha podem ser aninhadas em qualquer nível. • As funções aninhadas são avaliadas do nível mais interno para o mais externo. F3(F2(F1(col,arg1),arg2),arg3) Etapa 1 = Resultado 1 Etapa 2 = Resultado 2 Etapa 3 = Resultado 3 3-44 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  129. Aninhando Funções SELECT last_name, NVL(TO_CHAR(manager_id), 'No Manager') FROM employees WHERE manager_id IS NULL; 3-45 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  130. Funções gerais Essas funções operam com qualquer tipo de dados e pertencem ao uso de valores nulos. • NVL (expr1, expr2) • NVL2 (expr1, expr2, expr3) • NULLIF (expr1, expr2) • COALESCE (expr1, expr2, ..., exprn) 3-46 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  131. Função NVL Converte um valor nulo em um valor real. • É possível usar os tipos de dados de data, de caractere e de número. • Os tipos de dados devem corresponder a: – NVL(commission_pct,0) – NVL(hire_date,'01-JAN-97') – NVL(job_id,'No Job Yet') 3-47 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  132. Usando a Função NVL SELECT last_name, salary, NVL(commission_pct, 0), 1 (salary*12) + (salary*12*NVL(commission_pct, 0)) AN_SAL 2 FROM employees; … 1 2 3-48 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  133. Usando a Função NVL2 SELECT last_name, salary, commission_pct, 1 NVL2(commission_pct, 'SAL+COMM', 'SAL') income 2 FROM employees WHERE department_id IN (50, 80); 1 2 3-49 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  134. Usando a Função NULLIF 1 SELECT first_name, LENGTH(first_name) \"expr1\", last_name, LENGTH(last_name) \"expr2\", 2 NULLIF(LENGTH(first_name), LENGTH(last_name)) result 3 FROM employees; … 1 2 3 3-50 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  135. Usando a Função COALESCE • A vantagem da função COALESCE em relação à função NVL é que ela pode apresentar diversos valores alternativos. • Se a primeira expressão não for nula, a função retornará essa expressão; caso contrário, a função unirá as expressões restantes. 3-51 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  136. Usando a Função COALESCE SELECT last_name, COALESCE(commission_pct, salary, 10) comm FROM employees ORDER BY commission_pct; … 3-52 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  137. Expressões Condicionais • Propiciam o uso da lógica IF-THEN-ELSE em uma instrução SQL • Use dois métodos: – Expressão CASE – Função DECODE 3-53 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  138. A Expressão CASE Facilita as pesquisas condicionais funcionando como uma instrução IF-THEN-ELSE: CASE expr WHEN CASE expr WHEN comparação_expr1 comparação_expr1 THEN THEN retorna_expr1 retorna_expr1 [WHEN [WHEN comparação_expr2 comparação_expr2 THEN THEN retorna_expr2 retorna_expr2 WHEN WHEN comparação_exprn comparação_exprn THEN THEN retorna_exprn retorna_exprn ELSE ELSE else_expr] else_expr] END END 3-54 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  139. Usando a Expressão CASE Facilita as pesquisas condicionais funcionando como uma instrução IF-THEN-ELSE: SELECT last_name, job_id, salary, CASE job_id WHEN 'IT_PROG' THEN 1.10*salary WHEN 'ST_CLERK' THEN 1.15*salary WHEN 'SA_REP' THEN 1.20*salary ELSE salary END \"REVISED_SALARY\" FROM employees; … … 3-55 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  140. A Função DECODE Facilita as pesquisas condicionais funcionando como uma instrução CASE ou IF-THEN-ELSE DECODE(col|expressão, pesquisa1, resultado1 DECODE(col|expressão, pesquisa1, resultado1 [, pesquisa2, resultado2,...,] [, pesquisa2, resultado2,...,] [, default]) [, default]) 3-56 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  141. Usando a Função DECODE SELECT last_name, job_id, salary, DECODE(job_id, 'IT_PROG', 1.10*salary, 'ST_CLERK', 1.15*salary, 'SA_REP', 1.20*salary, salary) REVISED_SALARY FROM employees; … … 3-57 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  142. Usando a Função DECODE Exibir a alíquota de imposto aplicável para cada funcionário do departamento 80. SELECT last_name, salary, DECODE (TRUNC(salary/2000, 0), 0, 0.00, 1, 0.09, 2, 0.20, 3, 0.30, 4, 0.40, 5, 0.42, 6, 0.44, 0.45) TAX_RATE FROM employees WHERE department_id = 80; 3-58 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  143. Resumo Nesta lição, você aprendeu a: • Executar cálculos nos dados usando funções • Modificar itens de dados individuais usando funções • Manipular a saída para grupos de linhas usando funções • Alterar formatos de data para exibição usando funções • Converter tipos de dados de coluna usando funções • Usar funções NVL • Usar a lógica IF-THEN-ELSE 3-59 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  144. Exercício 3, Parte Dois: Visão Geral Este exercício abrange os seguintes tópicos: • Criando consultas que exigem o uso de funções numéricas, de caractere e de data • Usando a concatenação com funções • Criando consultas que diferenciam entre letras maiúsculas e minúsculas para testar a utilidade das funções de caractere • Executando cálculos de anos e meses de serviço de um funcionário • Determinando a data de revisão para um funcionário 3-60 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  145. 4 Exibindo Dados de Várias Tabelas Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  146. Objetivos Após concluir esta lição, você poderá fazer o seguinte: • Criar instruções SELECT para obter acesso a dados de mais de uma tabela usando eqüijunções e não- eqüijunções • Exibir dados que, em geral, não correspondem a uma condição de junção usando junções externas • Unir uma tabela a ela mesma por meio de uma autojunção 4-2 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  147. Obtendo Dados de Várias Tabelas EMPLOYEES DEPARTMENTS … … 4-3 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  148. Produtos Cartesianos • Um produto cartesiano será formado quando: – Uma condição de junção for omitida. – Uma condição de junção for inválida. – Todas as linhas da primeira tabela forem unidas a todas as linhas da segunda tabela. • Para evitar um produto Cartesiano, sempre inclua uma condição de junção válida em uma cláusula WHERE. 4-4 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  149. Gerando um Produto Cartesiano EMPLOYEES (20 linhas) DEPARTMENTS (8 linhas) … Produto cartesiano: 20x8=160 linhas … 4-5 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  150. Tipos de Junções Junções Patenteadas pela Junções Patenteadas pela Junções Compatíveis com Junções Compatíveis com Oracle (8i e anterior): Oracle (8i e anterior): o SQL: 1999: o SQL: 1999: • Eqüijunção • Junções híbridas • Não-eqüijunção • Junções naturais • Junção externa • Cláusula Using • Autojunção • Junções externas de dois lados ou completas • Condições de junção arbitrárias para junções externas 4-6 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  151. Unindo Tabelas Usando a Sintaxe Oracle Usar uma junção para consultar dados de uma ou mais tabelas. SELECT SELECT tabela1.coluna, tabela2.coluna tabela1.coluna, tabela2.coluna FROM FROM tabela1, tabela2 tabela1, tabela2 WHERE WHERE tabela1.coluna1 = tabela2.coluna2; tabela1.coluna1 = tabela2.coluna2; • Crie uma condição de junção na cláusula WHERE. • Coloque o nome da tabela antes do nome da coluna quando aparecer o mesmo nome de coluna em mais de uma tabela. 4-7 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  152. O Que é uma Eqüijunção? EMPLOYEES DEPARTMENTS … … Chave Chave estrangeira primária 4-9 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  153. Recuperando Registros com Eqüijunções SELECT employees.employee_id, employees.last_name, employees.department_id, departments.department_id, departments.location_id FROM employees, departments WHERE employees.department_id = departments.department_id; … 4-10 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  154. Condições de Pesquisa Adicionais Usando o Operador AND EMPLOYEES DEPARTMENTS … … 4-11 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  155. Qualificando Nomes de Colunas Ambíguos • Use prefixos de tabela para qualificar nomes de colunas que estão em várias tabelas. • Melhore o desempenho usando prefixos de tabela. • Diferencie colunas que possuem nomes idênticos, mas que residam em tabelas diferentes usando apelidos de coluna. 4-12 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  156. Usando Apelidos de Tabela • Simplifique consultas usando apelidos de tabela. • Melhore o desempenho usando prefixos de tabela. SELECT e.employee_id, e.last_name, e.department_id, d.department_id, d.location_id FROM employees e, departments d WHERE e.department_id = d.department_id; 4-13 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  157. Unindo Mais de Duas Tabelas EMPLOYEES DEPARTMENTS LOCATIONS … • Para unir n tabelas, é necessário um mínimo de n-1 condições de junção. Por exemplo, para unir três tabelas, é necessário um mínimo de duas junções. 4-14 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  158. Não-eqüijunções EMPLOYEES JOB_GRADES Os salários na tabela EMPLOYEES devem estar … entre o menor e o maior salário da tabela JOB_GRADES 4-15 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  159. Recuperando Registros com Não-eqüijunções SELECT e.last_name, e.salary, j.grade_level FROM employees e, job_grades j WHERE e.salary BETWEEN j.lowest_sal AND j.highest_sal; … 4-16 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  160. Junções Externas DEPARTMENTS EMPLOYEES … Não há funcionários no departamento 190. 4-17 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  161. Sintaxe de Junções Externas • Usar uma junção externa para ver também todas as linhas que não atendem à condição de junção. • O operador de junção externa é o sinal de mais (+). SELECT SELECT tabela1.coluna, tabela2.coluna tabela1.coluna, tabela2.coluna FROM FROM tabela1, tabela2 tabela1, tabela2 WHERE WHERE tabela1.coluna(+) = tabela2.coluna; tabela1.coluna(+) = tabela2.coluna; SELECT SELECT tabela1.coluna, tabela2.coluna tabela1.coluna, tabela2.coluna FROM FROM tabela1, tabela2 tabela1, tabela2 WHERE WHERE tabela1.coluna = tabela2.coluna(+); tabela1.coluna = tabela2.coluna(+); 4-18 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  162. Usando Junções Externas SELECT e.last_name, e.department_id, d.department_name FROM employees e, departments d WHERE e.department_id(+) = d.department_id ; … 4-19 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  163. Autojunções EMPLOYEES (WORKER) EMPLOYEES (MANAGER) … … MANAGER_ID na tabela WORKER é igual a EMPLOYEE_ID na tabela MANAGER. 4-20 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  164. Unindo uma Tabela a ela Mesma SELECT worker.last_name || ' works for ' || manager.last_name FROM employees worker, employees manager WHERE worker.manager_id = manager.employee_id ; … 4-21 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  165. Exercício 4, Parte Um: Visão Geral Este exercício aborda a criação de consultas para unir tabelas usando a sintaxe Oracle. 4-22 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  166. Unindo Tabelas Usando a Sintaxe SQL: 1999 Usar uma junção para consultar dados de uma ou mais tabelas. SELECT SELECT tabela1.coluna, tabela2.coluna tabela1.coluna, tabela2.coluna FROM FROM tabela1 tabela1 [CROSS JOIN tabela2] | [CROSS JOIN tabela2] | [NATURAL JOIN tabela2] | [NATURAL JOIN tabela2] | [JOIN tabela2 USING (nome_coluna)] | [JOIN tabela2 USING (nome_coluna)] | [JOIN tabela2 [JOIN tabela2 ON(tabela1.nome_coluna = tabela2.nome_coluna)] | ON(tabela1.nome_coluna = tabela2.nome_coluna)] | [LEFT|RIGHT|FULL OUTER JOIN tabela2 [LEFT|RIGHT|FULL OUTER JOIN tabela2 ON (tabela1.nome_coluna = tabela2.nome_coluna)]; ON (tabela1.nome_coluna = tabela2.nome_coluna)]; 4-23 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  167. Criando Junções Híbridas • A cláusula CROSS JOIN cria o produto híbrido de duas tabelas. • Esse processo equivale ao produto cartesiano entre as duas tabelas. SELECT last_name, department_name FROM employees CROSS JOIN departments ; … 4-24 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  168. Criando Junções Naturais • A cláusula NATURAL JOIN baseia-se em todas as colunas com o mesmo nome nas duas tabelas. • Ela seleciona linhas das duas tabelas que têm valores iguais em todas as colunas correspondentes. • Se as colunas com os mesmos nomes tiverem tipos de dados diferentes, será retornado um erro. 4-25 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  169. Recuperando Registros com Junções Naturais SELECT department_id, department_name, location_id, city FROM departments NATURAL JOIN locations ; 4-26 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  170. Criando Junções com a Cláusula USING • Se várias colunas tiverem os mesmos nomes mas se os tipos de dados não forem correspondentes, a cláusula NATURAL JOIN poderá ser modificada com a cláusula USING para especificar as colunas que devem ser usadas em uma eqüijunção. • Usar a cláusula USING para estabelecer a correspondência com apenas uma coluna quando mais de uma coluna for correspondente. • Não usar um apelido ou nome de tabela nas colunas às quais foram feitas referências. • As cláusulas NATURAL JOIN e USING são mutuamente excludentes. 4-27 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  171. Recuperando Registros com a Cláusula USING SELECT e.employee_id, e.last_name, d.location_id FROM employees e JOIN departments d USING (department_id) ; … 4-28 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  172. Criando Junções com a Cláusula ON • A condição da junção natural é basicamente uma eqüijunção de todas as colunas com o mesmo nome. • Para especificar condições arbitrárias ou colunas a serem unidas, é usada a cláusula ON. • A condição de junção é separada de outras condições de pesquisa. • A cláusula ON facilita a compreensão do código. 4-29 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  173. Recuperando Registros com a Cláusula ON SELECT e.employee_id, e.last_name, e.department_id, d.department_id, d.location_id FROM employees e JOIN departments d ON (e.department_id = d.department_id) ; … 4-30 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  174. Criando Junções Triplas com a Cláusula ON SELECT employee_id, city, department_name FROM employees e JOIN departments d ON d.department_id = e.department_id JOIN locations l ON d.location_id = l.location_id; … 4-31 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  175. Junções INNER Versus OUTER • Na sintaxe SQL: 1999, a junção de duas tabelas que retorna apenas linhas correspondentes é uma junção interna. • Uma junção entre duas tabelas que retorna os resultados da junção interna assim como linhas não correspondentes em tabelas esquerdas (ou direitas) é uma junção externa esquerda (ou direita). • Uma junção entre duas tabelas que retorna os resultados de uma junção interna assim como os resultados de uma junção esquerda ou direita é uma junção externa completa. 4-32 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  176. LEFT OUTER JOIN SELECT e.last_name, e.department_id, d.department_name FROM employees e LEFT OUTER JOIN departments d ON (e.department_id = d.department_id) ; … 4-33 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  177. RIGHT OUTER JOIN SELECT e.last_name, e.department_id, d.department_name FROM employees e RIGHT OUTER JOIN departments d ON (e.department_id = d.department_id) ; … 4-34 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  178. FULL OUTER JOIN SELECT e.last_name, e.department_id, d.department_name FROM employees e FULL OUTER JOIN departments d ON (e.department_id = d.department_id) ; … 4-35 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  179. Condições Adicionais SELECT e.employee_id, e.last_name, e.department_id, d.department_id, d.location_id FROM employees e JOIN departments d ON (e.department_id = d.department_id) AND e.manager_id = 149 ; 4-36 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  180. Resumo Nesta lição, você aprendeu a usar junções para exibir os dados de várias tabelas na: • Sintaxe patenteada pela Oracle para versões 8i e anteriores • Sintaxe compatível com SQL: 1999 para a versão 9i 4-37 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  181. Exercício 4, Parte Dois: Visão Geral Este exercício abrange os seguintes tópicos: • Unindo tabelas usando uma eqüijunção • Efetuando junções externas e autojunções • Adicionando condições 4-38 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  182. Agregando Dados 5 Usando Funções de Grupo Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  183. Objetivos Após concluir esta lição, você poderá fazer o seguinte: • Identificar as funções de grupo disponíveis • Descrever o uso de funções de grupo • Agrupar dados usando a cláusula GROUP BY • Incluir ou excluir linhas agrupadas usando a cláusula HAVING 5-2 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  184. O que são Funções de Grupo? As funções de grupo operam em conjuntos de linhas para fornecer um resultado por grupo. EMPLOYEES O salário máximo na tabela EMPLOYEES. … 5-3 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  185. Tipos de Funções de Grupo • AVG • COUNT • MAX • MIN • STDDEV • SUM • VARIANCE 5-4 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  186. Sintaxe de Funções de Grupo SELECT [coluna,] função_de_grupo(coluna), ... FROM tabela [WHERE condição] [GROUP BY coluna] [ORDER BY coluna]; 5-5 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  187. Usando as Funções AVG e SUM Você pode usar AVG e SUM para dados numéricos. SELECT AVG(salary), MAX(salary), MIN(salary), SUM(salary) FROM employees WHERE job_id LIKE '%REP%'; 5-6 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  188. Usando as Funções MIN e MAX Você pode usar MIN e MAX para qualquer tipo de dados. SELECT MIN(hire_date), MAX(hire_date) FROM employees; 5-7 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  189. Usando a Função COUNT COUNT(*) retorna o número de linhas em uma tabela. SELECT COUNT(*) FROM employees WHERE department_id = 50; 5-8 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  190. Usando a Função COUNT • COUNT(expr) retorna o número de linhas com valores não-nulos para a expr. • Exiba o número de valores de departamento na tabela EMPLOYEES, excluindo os valores nulos. SELECT COUNT(commission_pct) FROM employees WHERE department_id = 80; 5-9 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  191. Usando a Palavra-Chave DISTINCT • COUNT(DISTINCT expr) retorna o número de valores não-nulos distintos da expr. • Exiba o número de valores de departamento distintos na tabela EMPLOYEES. SELECT COUNT(DISTINCT department_id) FROM employees; 5-10 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  192. Funções de Grupo e Valores Nulos As funções de grupo ignoram valores nulos na coluna. SELECT AVG(commission_pct) FROM employees; 5-11 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  193. Usando a Função NVL com Funções de Grupo A função NVL força as funções de grupo a incluírem valores nulos. SELECT AVG(NVL(commission_pct, 0)) FROM employees; 5-12 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  194. Criando Grupos de Dados EMPLOYEES 4400 9500 O salário 3500 médio na tabela 6400 EMPLOYEES para cada departamento. 10033 … 5-13 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  195. Criando Grupos de Dados: A Sintaxe da Cláusula GROUP BY SELECT coluna, função_de_grupo(coluna) FROM tabela [WHERE condição] [GROUP BY expressão_group_by] [ORDER BY coluna]; Divida linhas de uma tabela em grupos menores usando a cláusula GROUP BY. 5-14 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  196. Usando a Cláusula GROUP BY Todas as colunas da lista SELECT que não estejam em funções de grupo devem estar na cláusula GROUP BY. SELECT department_id, AVG(salary) FROM employees GROUP BY department_id; 5-15 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  197. Usando a Cláusula GROUP BY A coluna GROUP BY não precisa estar na lista SELECT. SELECT AVG(salary) FROM employees GROUP BY department_id; 5-16 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  198. Agrupando por mais de uma Coluna EMPLOYEES Adicione os salários na tabela EMPLOYEES para cada cargo, agrupado por … departamento. 5-17 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  199. Usando a Cláusula GROUP BY em Várias Colunas SELECT department_id dept_id, job_id, SUM(salary) FROM employees GROUP BY department_id, job_id ; 5-18 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  200. Consultas Inválidas Usando Funções de Grupo Qualquer coluna ou expressão na lista SELECT que não seja uma função agregada deve estar na cláusula GROUP BY. SELECT SELECT department_id, COUNT(last_name) department_id, COUNT(last_name) FROM FROM employees; employees; SELECT department_id, COUNT(last_name) SELECT department_id, COUNT(last_name) * * ERROR at line 1: ERROR at line 1: ORA-00937: not a single-group group function ORA-00937: not a single-group group function Coluna ausente na cláusula GROUP BY Coluna ausente na cláusula GROUP BY 5-19 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  201. Consultas Inválidas Usando Funções de Grupo • Não é possível usar a cláusula WHERE para restringir grupos. • Use a cláusula HAVING para restringir grupos. • Não é possível usar funções de grupo na cláusula WHERE. SELECT SELECT department_id, AVG(salary) department_id, AVG(salary) FROM FROM employees employees WHERE WHERE AVG(salary) > 8000 AVG(salary) > 8000 GROUP BY GROUP BY department_id; department_id; WHERE AVG(salary) > 8000 WHERE AVG(salary) > 8000 * * ERROR at line 3: ERROR at line 3: ORA-00934: group function is not allowed here ORA-00934: group function is not allowed here Não é possívell usar a cláusula WHERE para restringir grupos Não é possíve usar a cláusula WHERE para restringir grupos 5-20 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  202. Excluindo Resultados do Grupo EMPLOYEES O salário máximo por departamento quando for maior que US$ 10.000 … 5-21 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  203. Excluindo Resultados do Grupo: A Cláusula HAVING Use a cláusula HAVING para restringir grupos: 1. As linhas são agrupadas. 2. A função de grupo é aplicada. 3. Os grupos que correspondem à cláusula HAVING são exibidos. SELECT coluna, função_de_grupo FROM tabela [WHERE condição] [GROUP BY expressão_group_by] [HAVING condição_de_grupo] [ORDER BY coluna]; 5-22 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  204. Usando a Cláusula HAVING SELECT department_id, MAX(salary) FROM employees GROUP BY department_id HAVING MAX(salary)>10000 ; 5-23 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  205. Usando a Cláusula HAVING SELECT job_id, SUM(salary) PAYROLL FROM employees WHERE job_id NOT LIKE '%REP%' GROUP BY job_id HAVING SUM(salary) > 13000 ORDER BY SUM(salary); 5-24 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  206. Aninhando Funções de Grupo Exiba o salário médio máximo. SELECT MAX(AVG(salary)) FROM employees GROUP BY department_id; 5-25 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  207. Resumo Nesta lição, você aprendeu a: • Usar as funções de grupo COUNT, MAX, MIN e AVG • Criar consultas que usem a cláusula GROUP BY • Criar consultas que usem a cláusula HAVING SELECT coluna, função_de_grupo(coluna) FROM tabela [WHERE condição] [GROUP BY expressão_group_by] [HAVING condição_de_grupo] [ORDER BY coluna]; 5-26 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  208. Visão Geral do Exercício 5 Este exercício abrange os seguintes tópicos: • Criando consultas que usem as funções de grupo • Agrupando por linhas para obter mais de um resultado • Excluindo grupos usando a cláusula HAVING 5-27 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  209. 6 Subconsultas Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  210. Objetivos Após concluir esta lição, você poderá fazer o seguinte: • Descrever os tipos de problemas que as subconsultas podem resolver • Definir as subconsultas • Listar os tipos de subconsultas • Criar subconsultas de uma única linha e de várias linhas 6-2 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  211. Usando uma Subconsulta para Resolver um Problema Quem tem um salário maior que o de Abel? Consulta Principal: Que funcionários têm salários maiores ? que o de Abel? Subconsulta ? Qual é o salário de Abel? 6-3 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  212. Sintaxe de Subconsulta SELECT lista_de_seleção FROM tabela WHERE operador expr (SELECT lista_de_seleção FROM tabela); • A subconsulta (consulta interna) é executada uma vez antes da consulta principal. • O resultado da subconsulta é usado pela consulta principal (consulta externa). 6-4 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  213. Usando uma Subconsulta SELECT last_name FROM employees 11000 WHERE salary > (SELECT salary FROM employees WHERE last_name = 'Abel'); 6-5 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  214. Diretrizes para o Uso de Subconsultas • Coloque as subconsultas entre parênteses. • Coloque as subconsultas no lado direito da condição de comparação. • A cláusula ORDER BY na subconsulta não é necessária, a menos que você esteja executando a análise Top-N. • Use operadores de uma única linha com subconsultas de uma única linha e use operadores de várias linhas com subconsultas de várias linhas. 6-6 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  215. Tipos de Subconsultas • Subconsulta de uma única linha Consulta principal retorna Subconsulta ST_CLERK • Subconsulta de várias linhas Consulta principal retorna ST_CLERK Subconsulta SA_MAN 6-7 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  216. Subconsultas de uma Única Linha • Retorne somente uma linha • Use operadores de comparação de uma única linha Operador Significado = Igual a > Maior que >= Maior que ou igual a < Menor que <= Menor que ou igual a <> Diferente de 6-8 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  217. Executando Subconsultas de uma Única Linha SELECT last_name, job_id, salary FROM employees WHERE job_id = ST_CLERK (SELECT job_id FROM employees WHERE employee_id = 141) AND salary > 2600 (SELECT salary FROM employees WHERE employee_id = 143) ; 6-9 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  218. Usando Funções de Grupo em uma Subconsulta SELECT last_name, job_id, salary FROM employees 2500 WHERE salary = (SELECT MIN(salary) FROM employees); 6-10 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  219. A Cláusula HAVING com Subconsultas • O servidor Oracle executa primeiro as subconsultas. • O servidor Oracle retorna os resultados para a cláusula HAVING da consulta principal. SELECT department_id, MIN(salary) FROM employees GROUP BY department_id 2500 HAVING MIN(salary) > (SELECT MIN(salary) FROM employees WHERE department_id = 50); 6-11 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  220. O que há de Errado com esta Instrução? SELECT employee_id, last_name FROM employees WHERE salary = (SELECT MIN(salary) FROM employees GROUP BY department_id); ERROR at line 4: ERROR at line 4: ORA-01427: single-row subquery returns more than ORA-01427: single-row subquery returns more than one row one row Operador de uma única linha com subconsulta de várias linhas 6-12 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  221. Esta Instrução Retornará Linhas? SELECT last_name, job_id FROM employees WHERE job_id = (SELECT job_id FROM employees WHERE last_name = 'Haas'); no rows selected no rows selected A subconsulta não retorna nenhum valor A subconsulta não retorna nenhum valor 6-13 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  222. Subconsultas de Várias Linhas • Retorne mais de uma linha • Use operadores de comparação de várias linhas Operador Significado IN Igual a qualquer membro da lista ANY Compare o valor a cada valor retornado pela subconsulta Compare o valor a todo valor retornado ALL pela subconsulta 6-14 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  223. Usando o Operador ANY em Subconsultas de Várias Linhas SELECT employee_id, last_name, job_id, salary FROM employees 9000, 6000, 4200 WHERE salary < ANY (SELECT salary FROM employees WHERE job_id = 'IT_PROG') AND job_id <> 'IT_PROG'; … 6-15 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  224. Usando o Operador ALL em Subconsultas de Várias Linhas SELECT employee_id, last_name, job_id, salary FROM employees 9000, 6000, 4200 WHERE salary < ALL (SELECT salary FROM employees WHERE job_id = 'IT_PROG') AND job_id <> 'IT_PROG'; 6-16 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  225. Valores Nulos em uma Subconsulta SELECT emp.last_name FROM employees emp WHERE emp.employee_id NOT IN (SELECT mgr.manager_id FROM employees mgr); no rows selected 6-17 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  226. Resumo Nesta lição, você aprendeu a: • Identificar quando uma subconsulta pode ajudar a resolver um problema • Criar subconsultas quando uma consulta se basear em valores desconhecidos SELECT lista_de_seleção FROM tabela WHERE operador expr (SELECT lista_de_seleção FROM tabela); 6-18 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  227. Visão Geral do Exercício 6 Este exercício abrange os seguintes tópicos: • Criando subconsultas para valores de consulta com base em critérios desconhecidos • Usando subconsultas para descobrir quais valores existem em um conjunto de dados e não em outro 6-19 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  228. 7 Produzindo uma Saída que Pode Ser Lida com o iSQL*Plus Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  229. Objetivos Após concluir esta lição, você poderá fazer o seguinte: • Produzir consultas que exijam uma variável de substituição • Personalizar o ambiente do iSQL*Plus • Produzir saídas mais legíveis • Criar e executar arquivos de script 7-2 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  230. Variáveis de Substituição Desejo executar uma consulta com valores ... salary = ? … diferentes. … department_id = ? … ... last_name = ? ... Usuário 7-3 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  231. Variáveis de Substituição Use as variáveis de substituição do iSQL*Plus para: • Armazenar valores temporariamente – \"E\" comercial simples (&) – \"E\" comercial duplo (&&) – Comando DEFINE • Passar os valores das variáveis entre as instruções SQL • Alterar cabeçalhos e rodapés dinamicamente 7-4 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  232. Usando a Variável de Substituição & Usando a Variável de Substituição & Use uma variável precedida de um \"e\" comercial (&) para Use uma variável precedida de um \"e\" comercial (&) para solicitar um valor ao usuário. solicitar um valor ao usuário. SELECT employee_id, last_name, salary, department_id FROM employees WHERE employee_id = &employee_num; 7-5 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  233. Usando a Variável de Substituição & Usando a Variável de Substituição & 2 101 1 7-6 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  234. Valores de Caractere e Data com Variáveis de Substituição Use aspas simples para valores de data e de caractere. SELECT last_name, department_id, salary*12 FROM employees WHERE job_id = '&job_title' ; 7-7 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  235. Especificando Nomes de Colunas, Expressões e Textos Use variáveis de substituição para complementar o seguinte: • Condições WHERE • Cláusulas ORDER BY • Expressões de coluna • Nomes de tabela • Instruções SELECT inteiras 7-8 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  236. Especificando Nomes de Colunas, Expressões e Textos SELECT employee_id, last_name, job_id, &column_name FROM employees WHERE &condition ORDER BY &order_column ; 7-9 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  237. Definindo Variáveis de Substituição • Você pode predefinir variáveis usando o comando DEFINE do iSQL*Plus. DEFINE variável = valor cria uma variável de usuário com o tipo de dados CHAR. • Se você precisar predefinir uma variável que inclua espaços, deverá colocar o valor entre aspas simples quando usar o comando DEFINE. • Uma variável definida está disponível para a sessão. 7-10 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  238. Comandos DEFINE e UNDEFINE • A variável permanece definida até você: – Usar o comando UNDEFINE para removê-la – Sair do iSQL*Plus • Você pode verificar suas alterações com o comando DEFINE. DEFINE job_title = IT_PROG DEFINE job_title DEFINE JOB_TITLE = \"IT_PROG\" (CHAR) UNDEFINE job_title DEFINE job_title SP2-0135: symbol job_title is UNDEFINED 7-11 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  239. Usando o Comando DEFINE com a Variável de Substituição & • Crie a variável de substituição usando o comando DEFINE. DEFINE employee_num = 200 • Use a variável precedida de um \"e\" comercial (&) para substituir o valor na instrução SQL. SELECT employee_id, last_name, salary, department_id FROM employees WHERE employee_id = &employee_num; 7-12 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  240. Usando a Variável de Substituição && Use o \"e\" comercial duplo (&&) para reutilizar o valor da variável sem precisar solicitar sempre um valor ao usuário. SELECT employee_id, last_name, job_id, &&column_name FROM employees ORDER BY &column_name; … 7-13 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  241. Usando o Comando VERIFY Use o comando VERIFY para alternar a exibição da variável de substituição, antes e depois de o iSQL*Plus trocar as variáveis de substituição por valores. SET VERIFY ON SELECT employee_id, last_name, salary, department_id FROM employees WHERE employee_id = &employee_num; old 3: WHERE employee_id = &employee_num new 3: WHERE employee_id = 200 7-14 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  242. Personalizando o Ambiente do iSQL*Plus • Use os comandos SET para controlar a sessão atual. SET variável_sistema valor SET variável_sistema valor • Verifique o que você definiu usando o comando SHOW. SHOW SET ECHO ON SET ECHO ON SHOW SHOW ECHO ECHO echo echo ON ON 7-15 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  243. Variáveis do Comando SET • ARRAYSIZE {20 | n} • FEEDBACK {6 | n |OFF | ON} • HEADING {OFF | ON} • LONG {80 | n| ON | texto} SET HEADING OFF SET HEADING OFF SHOW HEADING SHOW HEADING HEADING OFF HEADING OFF 7-16 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  244. Comandos de Formato do iSQL*Plus • COLUMN [opção da coluna] • TTITLE [texto | OFF | ON] • BTITLE [texto | OFF | ON] • BREAK [ON elemento_relatório] 7-17 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  245. O Comando COLUMN Controla a exibição de uma coluna: COL[UMN] [{coluna|apelido} [opção]] COL[UMN] [{coluna|apelido} [opção]] • CLE[AR]: remove todos os formatos de coluna • HEA[DING] texto: define o cabeçalho da coluna • FOR[MAT] formato: altera a exibição da coluna usando um modelo de formato • NOPRINT | PRINT • NULL 7-18 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  246. Usando o Comando COLUMN • Crie cabeçalhos de coluna. COLUMN COLUMN last_name HEADING 'Employee|Name' last_name HEADING 'Employee|Name' COLUMN COLUMN salary JUSTIFY LEFT FORMAT $99,990.00 salary JUSTIFY LEFT FORMAT $99,990.00 COLUMN COLUMN manager FORMAT 999999999 NULL 'No manager' manager FORMAT 999999999 NULL 'No manager' • Exiba a definição atual da coluna LAST_NAME. COLUMN last_name COLUMN last_name • Remova as definições da coluna LAST_NAME. COLUMN last_name CLEAR COLUMN last_name CLEAR 7-19 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  247. Modelos de Formato COLUMN Elemento Descrição Exemplo Resultado 9 Dígito de supressão de um 999999 1234 único zero 0 Aplica o zero à esquerda 099999 001234 $ Símbolo de dólar flutuante $9999 $1234 L Moeda local L9999 L1234 . Posição do ponto decimal 9999.99 1234.00 , Separador de milhar 9,999 1,234 7-20 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  248. Usando o Comando BREAK Use o comando BREAK para suprimir duplicatas. BREAK ON job_id BREAK ON job_id 7-21 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  249. Usando os Comandos TTITLE e BTITLE • Exibir cabeçalhos e rodapés. TTI[TLE] [texto|OFF|ON] TTI[TLE] [texto|OFF|ON] • Definir o cabeçalho do relatório. TTITLE 'Salary|Report' TTITLE 'Salary|Report' • Definir o rodapé do relatório. BTITLE 'Confidential' BTITLE 'Confidential' 7-22 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  250. Criando um Arquivo de Script para Executar um Relatório 1. Crie e teste a instrução SQL SELECT. 2. Salve a instrução SELECT em um arquivo de script. 3. Carregue o arquivo de script em um editor. 4. Adicione comandos de formatação antes da instrução SELECT. 5. Verifique se o caractere de finalização está situado após a instrução SELECT. 7-23 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  251. Criando um Arquivo de Script para Executar um Relatório 6. Remova os comandos de formatação depois da instrução SELECT. 7. Salve o arquivo de script. 8. Carregue o arquivo de script na janela de texto do iSQL*Plus e clique no botão Execute (Executar). 7-24 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  252. Exemplo de Relatório … 7-25 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  253. Exemplo de Relatório … 7-26 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  254. Resumo Nesta lição, você aprendeu a: • Usar as variáveis de substituição do iSQL*Plus para armazenar valores temporariamente • Usar os comandos SET para controlar o ambiente atual do iSQL*Plus • Usar o comando COLUMN para controlar a exibição de uma coluna • Usar o comando BREAK para suprimir duplicações e dividir linhas em seções • Usar os comandos TTITLE e BTITLE para exibir cabeçalhos e rodapés 7-27 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  255. Visão Geral do Exercício 7 Este exercício abrange os seguintes tópicos: • Criando uma consulta para exibir valores usando variáveis de substituição • Iniciando um arquivo de comando contendo variáveis 7-28 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  256. 8 Manipulando Dados Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  257. Objetivos Após concluir esta lição, você poderá fazer o seguinte: • Descrever cada instrução DML • Inserir linhas em uma tabela • Atualizar linhas em uma tabela • Deletar linhas de uma tabela • Intercalar linhas em uma tabela • Controlar transações 8-2 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  258. DML (Data Manipulation Language) • Uma instrução DML é executada quando você: – Adiciona novas linhas a uma tabela – Modifica linhas existentes em uma tabela – Remove linhas existentes de uma tabela • Uma transação consiste em um conjunto de instruções DML que formam uma unidade lógica de trabalho. 8-3 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  259. Adicionando uma Nova Linha a uma Tabela Nova DEPARTMENTS linha …insira uma nova linha na tabela DEPARTMENTS… 8-4 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  260. A Sintaxe da Instrução INSERT • Adicione novas linhas a uma tabela usando a instrução INSERT. INSERT INTO INSERT INTO tabela tabela [(coluna [, coluna...])] [(coluna [, coluna...])] VALUES VALUES (valor (valor [, valor...]); [, valor...]); • Somente uma linha é inserida por vez com esta sintaxe. 8-5 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  261. Inserindo Novas Linhas • Insira uma nova linha contendo valores para cada coluna. • Liste valores na ordem default das colunas na tabela. • Opcionalmente, liste as colunas na cláusula INSERT. INSERT INTO departments(department_id, department_name, manager_id, location_id) VALUES (70, 'Public Relations', 100, 1700); 1 row created. • Coloque os valores de data e de caractere entre aspas simples. 8-6 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  262. Inserindo Linhas com Valores Nulos • Método implícito: omite a coluna da lista de colunas. INSERT INTO departments (department_id, department_name ) VALUES (30, 'Purchasing'); 1 row created. • Método explícito: especifica a palavra-chave NULL na cláusula VALUES. INSERT INTO departments VALUES (100, 'Finance', NULL, NULL); 1 row created. 8-7 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  263. Inserindo Valores Especiais A função SYSDATE registra a data e a hora atuais. INSERT INTO employees (employee_id, first_name, last_name, email, phone_number, hire_date, job_id, salary, commission_pct, manager_id, department_id) VALUES (113, 'Louis', 'Popp', 'LPOPP', '515.124.4567', SYSDATE, 'AC_ACCOUNT', 6900, NULL, 205, 100); 1 row created. 8-8 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  264. Inserindo Valores de Data Específicos • Adicione um novo funcionário. INSERT INTO employees VALUES (114, 'Den', 'Raphealy', 'DRAPHEAL', '515.127.4561', TO_DATE('FEB 3, 1999', 'MON DD, YYYY'), 'AC_ACCOUNT', 11000, NULL, 100, 30); 1 row created. • Verifique sua adição. 8-9 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  265. Criando um Script • Use a variável de substituição & em uma instrução SQL para solicitar valores. • & é um marcador de espaço para o valor da variável. INSERT INTO departments (department_id, department_name, location_id) VALUES (&department_id, '&department_name',&location); 1 row created. 8-10 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  266. Copiando Linhas de Outra Tabela • Crie sua instrução INSERT com uma subconsulta. INSERT INTO sales_reps(id, name, salary, commission_pct) SELECT employee_id, last_name, salary, commission_pct FROM employees WHERE job_id LIKE '%REP%'; 4 rows created. • Não use a cláusula VALUES. • Estabeleça a correspondência entre o número de colunas da cláusula INSERT e o da subconsulta. 8-11 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  267. Alterando os Dados em uma Tabela EMPLOYEES Atualize linhas na tabela EMPLOYEES. 8-12 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  268. A Sintaxe da Instrução UPDATE • Modifique linhas existentes com a instrução UPDATE. UPDATE UPDATE tabela tabela SET SET coluna = valor [, coluna = valor, ...] coluna = valor [, coluna = valor, ...] [WHERE [WHERE condição]; condição]; • Atualize mais de uma linha por vez, se necessário. 8-13 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  269. Atualizando Linhas em uma Tabela • Uma ou mais linhas específicas serão modificadas se você especificar a cláusula WHERE. UPDATE employees SET department_id = 70 WHERE employee_id = 113; 1 row updated. • Se você omitir a cláusula WHERE, todas as linhas da tabela serão modificadas. UPDATE copy_emp UPDATE copy_emp SET SET department_id = 110; department_id = 110; 22 rows updated. 22 rows updated. 8-14 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  270. Atualizando Duas Colunas com uma Subconsulta Atualize o cargo e o salário do funcionário 114 para que correspondam aos do funcionário 205. UPDATE employees SET job_id = (SELECT job_id FROM employees WHERE employee_id = 205), salary = (SELECT salary FROM employees WHERE employee_id = 205) WHERE employee_id = 114; 1 row updated. 8-15 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  271. Atualizando Linhas com Base em Outra Tabela Use subconsultas nas instruções UPDATE para atualizar as linhas de uma tabela com base em valores de outra tabela. UPDATE copy_emp SET department_id = (SELECT department_id FROM employees WHERE employee_id = 100) WHERE job_id = (SELECT job_id FROM employees WHERE employee_id = 200) ; 1 row updated. 8-16 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  272. Atualizando Linhas: Erro de Restrição de Integridade UPDATE UPDATE employees employees SET SET department_id department_id = = 55 55 WHERE WHERE department_id department_id = = 110; 110; UPDATE employees UPDATE employees * * ERROR at line 1: ERROR at line 1: ORA-02291: integrity constraint (HR.EMP_DEPT_FK) ORA-02291: integrity constraint (HR.EMP_DEPT_FK) violated - parent key not found violated - parent key not found [restrição de integridade (HR.EMP_DEPT_FK) [restrição de integridade (HR.EMP_DEPT_FK) violada - chave mãe não encontrada] violada - chave mãe não encontrada] Não existe o número de departamento 55 8-17 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  273. Removendo uma Linha de uma Tabela DEPARTMENTS Delete uma linha da tabela DEPARTMENTS. 8-18 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  274. A Instrução DELETE Você pode remover linhas de uma tabela usando a instrução DELETE. DELETE [FROM] DELETE [FROM] tabela tabela [WHERE [WHERE condição]; condição]; 8-19 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  275. Deletando Linhas de uma Tabela • Se você especificar a cláusula WHERE, linhas específicas serão deletadas. DELETE FROM departments DELETE FROM departments WHERE department_name = 'Finance'; WHERE department_name = 'Finance'; 1 row deleted. 1 row deleted. • Se você omitir a cláusula WHERE, todas as linhas da tabela serão deletadas. DELETE FROM copy_emp; DELETE FROM copy_emp; 22 rows deleted. 22 rows deleted. 8-20 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  276. Deletando Linhas com Base em Outra Tabela Use subconsultas nas instruções DELETE para remover linhas de uma tabela com base em valores de outra tabela. DELETE FROM employees WHERE department_id = (SELECT department_id FROM departments WHERE department_name LIKE '%Public%'); 1 row deleted. 8-22 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  277. Deletando Linhas: Erro de Restrição de Integridade DELETE FROM departments DELETE FROM departments WHERE WHERE department_id = 60; department_id = 60; DELETE FROM departments DELETE FROM departments * * ERROR at line 1: ERROR at line 1: ORA-02292: integrity constraint (HR.EMP_DEPT_FK) ORA-02292: integrity constraint (HR.EMP_DEPT_FK) violated - child record found violated - child record found [restrição de integridade (HR.EMP_DEPT_FK) [restrição de integridade (HR.EMP_DEPT_FK) violada - registro filho encontrado] violada - registro filho encontrado] Você não pode deletar uma linha que contenha uma chave primária usada como chave estrangeira em outra tabela. 8-23 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  278. Usando uma Subconsulta em uma Instrução INSERT INSERT INTO INSERT INTO (SELECT employee_id, last_name, (SELECT employee_id, last_name, email, hire_date, job_id, salary, email, hire_date, job_id, salary, department_id department_id FROM FROM employees employees WHERE department_id = 50) WHERE department_id = 50) VALUES (99999, 'Taylor', 'DTAYLOR', VALUES (99999, 'Taylor', 'DTAYLOR', TO_DATE('07-JUN-99', 'DD-MON-RR'), TO_DATE('07-JUN-99', 'DD-MON-RR'), 'ST_CLERK', 5000, 50); 'ST_CLERK', 5000, 50); 1 row created. 1 row created. 8-24 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  279. Usando uma Subconsulta em uma Instrução INSERT • Verifique os resultados SELECT employee_id, last_name, email, hire_date, SELECT employee_id, last_name, email, hire_date, job_id, salary, department_id job_id, salary, department_id FROM FROM employees employees WHERE department_id = 50; WHERE department_id = 50; 8-25 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  280. Usando a Palavra-Chave WITH CHECK OPTION em Instruções DML • Uma subconsulta é usada para identificar a tabela e as colunas da instrução DML. • A palavra-chave WITH CHECK OPTION proíbe que você altere linhas que não estejam na subconsulta. INSERT INTO (SELECT employee_id, last_name, email, INSERT INTO (SELECT employee_id, last_name, email, hire_date, job_id, salary hire_date, job_id, salary FROM FROM employees employees WHERE department_id = 50 WITH CHECK OPTION) WHERE department_id = 50 WITH CHECK OPTION) VALUES (99998, 'Smith', 'JSMITH', VALUES (99998, 'Smith', 'JSMITH', TO_DATE('07-JUN-99', 'DD-MON-RR'), TO_DATE('07-JUN-99', 'DD-MON-RR'), 'ST_CLERK', 5000); 'ST_CLERK', 5000); INSERT INTO INSERT INTO ** ERROR at line 1: ERROR at line 1: ORA-01402: view WITH CHECK OPTION where-clause violation ORA-01402: view WITH CHECK OPTION where-clause violation (violação da cláusula where WITH CHECK OPTION na view) (violação da cláusula where WITH CHECK OPTION na view) 8-26 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  281. Visão Geral do Recurso Explicit Default (Default Explícito) • Com o recurso Explicit Default, você pode usar a palavra-chave DEFAULT como um valor de coluna onde o valor default é desejado. • Esse recurso foi adicionado para fins de compatibilidade com o SQL: 1999 Standard. • Isso permite que o usuário controle onde e quando o valor default deve ser aplicado aos dados. • Os valores default explícitos podem ser usados nas instruções INSERT e UPDATE. 8-27 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  282. Usando Valores Default Explícitos • DEFAULT com INSERT: INSERT INTO departments INSERT INTO departments (department_id, department_name, manager_id) (department_id, department_name, manager_id) VALUES (300, 'Engineering', DEFAULT); VALUES (300, 'Engineering', DEFAULT); • DEFAULT com UPDATE: UPDATE departments UPDATE departments SET manager_id = DEFAULT WHERE department_id = 10; SET manager_id = DEFAULT WHERE department_id = 10; 8-28 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  283. A Instrução MERGE • Fornece a habilidade de atualizar ou inserir dados condicionalmente em uma tabela de banco de dados • Executa uma operação UPDATE se a linha existir e uma operação INSERT se for uma nova linha: – Evita atualizações separadas – Aumenta o desempenho e a facilidade de utilização – É útil em aplicações de data warehousing 8-29 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  284. A Sintaxe da Instrução MERGE Você pode inserir ou atualizar linhas condicionalmente em uma tabela usando a instrução MERGE. MERGE INTO nome_tabela apelido_tabela MERGE INTO nome_tabela apelido_tabela USING (tabela|view|subconsulta) apelido USING (tabela|view|subconsulta) apelido ON (condição de junção) ON (condição de junção) WHEN MATCHED THEN WHEN MATCHED THEN UPDATE SET UPDATE SET col1 = col_val1, col1 = col_val1, col2 = col2_val col2 = col2_val WHEN NOT MATCHED THEN WHEN NOT MATCHED THEN INSERT (lista_colunas) INSERT (lista_colunas) VALUES (valores_colunas); VALUES (valores_colunas); 8-30 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  285. Intercalando Linhas Insira ou atualize linhas na tabela COPY_EMP para que corresponda à tabela EMPLOYEES. MERGE INTO copy_emp c USING employees e ON (c.employee_id = e.employee_id) WHEN MATCHED THEN UPDATE SET c.first_name = e.first_name, c.last_name = e.last_name, ... c.department_id = e.department_id WHEN NOT MATCHED THEN INSERT VALUES(e.employee_id, e.first_name, e.last_name, e.email, e.phone_number, e.hire_date, e.job_id, e.salary, e.commission_pct, e.manager_id, e.department_id); 8-31 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  286. Intercalando Linhas SELECT * SELECT * FROM COPY_EMP; FROM COPY_EMP; no rows selected no rows selected MERGE INTO copy_emp c MERGE INTO copy_emp c USING employees e USING employees e ON (c.employee_id = e.employee_id) ON (c.employee_id = e.employee_id) WHEN MATCHED THEN WHEN MATCHED THEN UPDATE SET UPDATE SET ... ... WHEN NOT MATCHED THEN WHEN NOT MATCHED THEN INSERT VALUES...; INSERT VALUES...; SELECT * SELECT * FROM COPY_EMP; FROM COPY_EMP; 20 rows selected. 20 rows selected. 8-33 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  287. Transações de Banco de Dados Uma transação de banco de dados consiste no seguinte: • Instruções DML que fazem uma alteração consistente nos dados • Uma instrução DDL • Uma instrução DCL 8-34 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  288. Transações de Banco de Dados • Iniciam quando a primeira instrução SQL DML é executada • Terminam com um dos seguintes eventos: – Uma instrução COMMIT ou ROLLBACK é emitida – Um instrução DDL ou DCL é executada (commit automático) – O usuário sai do iSQL*Plus – Ocorre uma falha no sistema 8-35 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  289. Vantagens das Instruções COMMIT e ROLLBACK Com as instruções COMMIT e ROLLBACK, você pode: • Garantir a consistência dos dados • Visualizar as alterações nos dados antes de fazer alterações permanentes • Agrupar operações relacionadas logicamente 8-36 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  290. Controlando Transações Tempo COMMIT Transação DELETE SAVEPOINT A INSERT UPDATE SAVEPOINT B INSERT ROLLBACK ROLLBACK ROLLBACK to SAVEPOINT B to SAVEPOINT A 8-37 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  291. Fazendo Rollback de Alterações até um Marcador • Crie um marcador em uma transação atual usando a instrução SAVEPOINT. • Faça o rollback até esse marcador usando a instrução ROLLBACK TO SAVEPOINT. UPDATE... SAVEPOINT update_done; Savepoint created. INSERT... ROLLBACK TO update_done; Rollback complete. 8-38 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  292. Processamento de Transação Implícita • Um commit automático ocorre nas seguintes circunstâncias: – A emissão de uma instrução DDL – A emissão de uma instrução DCL – A saída normal do iSQL*Plus, sem emitir explicitamente as instruções COMMIT ou ROLLBACK • Um rollback automático ocorre quando há um término anormal do iSQL*Plus ou uma falha do sistema. 8-39 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  293. Estado dos Dados Antes de COMMIT ou ROLLBACK • O estado anterior dos dados pode ser recuperado. • O usuário atual pode revisar os resultados das operações DML usando a instrução SELECT. • Os outros usuários não podem ver os resultados das instruções DML do usuário atual. • As linhas afetadas são bloqueadas; os outros usuários não poderão alterar os dados contidos nessas linhas. 8-40 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  294. Estado dos Dados Após COMMIT • As alterações nos dados se tornam permanentes no banco de dados. • O estado anterior dos dados é perdido permanentemente. • Todos os usuários podem ver os resultados. • As linhas afetadas são desbloqueadas; essas linhas estão disponíveis para que outros usuários as manipulem. • Todos os pontos de salvamento são apagados. 8-41 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  295. Submetendo Dados a Commit • Faça as alterações. DELETE FROM employees DELETE FROM employees WHERE employee_id = 99999; WHERE employee_id = 99999; 1 row deleted. 1 row deleted. INSERT INTO departments INSERT INTO departments VALUES (290, 'Corporate Tax', NULL, 1700); VALUES (290, 'Corporate Tax', NULL, 1700); 1 row inserted. 1 row inserted. • Submeta as alterações a commit. COMMIT; Commit complete. 8-42 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  296. Estado dos Dados Após ROLLBACK Descarte todas as alterações pendentes usando a instrução ROLLBACK: • As alterações nos dados são desfeitas. • O estado anterior dos dados é restaurado. • As linhas afetadas são desbloqueadas. DELETE FROM copy_emp; 22 rows deleted. ROLLBACK; Rollback complete. 8-43 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  297. Rollback no Nível da Instrução • Se ocorrer falha durante a execução de uma única instrução DML, será feito o rollback somente dessa instrução. • O servidor Oracle implementará um ponto de salvamento implícito. • Todas as outras alterações serão mantidas. • O usuário deve finalizar as transações explicitamente executando uma instrução COMMIT ou ROLLBACK. 8-45 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  298. Consistência na Leitura • A consistência na leitura garante sempre uma exibição consistente dos dados. • As alterações feitas por um usuário não entram em conflito com as alterações feitas por outro usuário. • A consistência na leitura garante que nos mesmos dados: – Os leitores não esperem pelos autores. – Os autores não esperem pelos leitores. 8-46 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  299. Implementação da Consistência na Leitura Usuário A UPDATE employees Blocos de SET salary = 7000 dados WHERE last_name = 'Goyal'; Segmentos de rollback dados alterados SELECT * e dados FROM userA.employees; Imagem da inalterados consistência dados na leitura \"antigos\" antes das alterações Usuário B 8-47 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  300. Bloqueio Em um banco de dados Oracle, os bloqueios: • Impedem a interação destrutiva entre transações simultâneas • Não requerem ações do usuário • Usam automaticamente o nível mais baixo de restrição • São mantidos durante a transação • São de dois tipos: bloqueios explícitos e implícitos 8-48 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  301. Bloqueio Implícito • Dois modos de bloqueio: – Exclusivo: bloqueia o acesso de outros usuários – De compartilhamento: permite o acesso de outros usuários • Nível elevado de concorrência dos dados: – DML: compartilhamento de tabela, linha exclusiva – Consultas: não são necessários bloqueios – DDL: protege as definições de objeto • Os bloqueios são mantidos até o commit ou rollback 8-49 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  302. Resumo Nesta lição, você aprendeu a usar instruções DML e a controlar transações. Instrução Descrição INSERT Adiciona uma nova linha à tabela UPDATE Modifica linhas existentes na tabela DELETE Remove linhas existentes da tabela MERGE Insere ou atualiza dados condicionalmente em uma tabela COMMIT Torna permanentes todas as alterações pendentes SAVEPOINT É usada para fazer rollback até o marcador de ponto de salvamento ROLLBACK Descarta todas as alterações pendentes nos dados 8-50 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  303. Visão Geral do Exercício 8 Este exercício abrange os seguintes tópicos: • Inserindo linhas nas tabelas • Atualizando e deletando linhas na tabela • Controlando transações 8-51 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  304. Exemplo de Consistência na Leitura Saída Tempo Sessão 1 Sessão 2 24000 t1 SELECT salary FROM employees WHERE last_name='King'; UPDATE employees t2 SET salary=salary+10000 WHERE last_name='King'; 24000 t3 SELECT salary FROM employees WHERE last_name='King'; t4 COMMIT; SELECT salary FROM employees 34000 t5 WHERE last_name='King'; 8-55 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  305. 9 Criando e Gerenciando Tabelas Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  306. Objetivos Após concluir esta lição, você poderá fazer o seguinte: • Descrever os principais objetos de banco de dados • Criar tabelas • Descrever os tipos de dados que podem ser usados ao se especificar a definição da coluna • Alterar definições de tabela • Eliminar, renomear e truncar tabelas 9-2 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  307. Objetos de Banco de Dados Objeto Descrição Tabela Unidade básica de armazenamento, composta de linhas e colunas View Representa logicamente subconjuntos de dados de uma ou mais tabelas Seqüência Gerador de valores numéricos Índice Melhora o desempenho de algumas consultas Sinônimo Atribui nomes alternativos a objetos 9-3 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  308. Regras para Nomeação Nomes de tabelas e de colunas: • Devem ser iniciados por uma letra • Devem ter de 1 a 30 caracteres • Devem conter somente AZ, az, 09, _, $ e # • Não devem duplicar o nome de outro objeto de propriedade do mesmo usuário • Não devem ser uma palavra reservada do servidor Oracle 9-4 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  309. A Instrução CREATE TABLE • Você deve ter: – O privilégio CREATE TABLE – Uma área de armazenamento CREATE TABLE [esquema.]tabela (coluna tipo_de_dados [DEFAULT expr][, ...]); • Especifique: – O nome da tabela – O nome, o tipo de dados e o tamanho da coluna 9-5 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  310. Fazendo Referência a Tabelas de Outro Usuário • As tabelas que pertencem a outros usuários não estão no esquema do usuário. • Você deve usar o nome do proprietário como prefixo dessas tabelas. 9-6 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  311. A Opção DEFAULT • Especifique um valor default para uma coluna durante uma inserção. ... hire_date DATE DEFAULT SYSDATE, ... • Valores literais, expressões ou funções SQL são valores válidos. • O nome de outra coluna ou uma pseudocoluna são valores inválidos. • O tipo de dados default deve corresponder ao tipo de dados da coluna. 9-7 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  312. Criando Tabelas • Crie a tabela. CREATE TABLE dept (deptno NUMBER(2), dname VARCHAR2(14), loc VARCHAR2(13)); Table created. • Confirme a criação da tabela. DESCRIBE dept 9-8 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  313. Tabelas no Banco de Dados Oracle • Tabelas do Usuário: – São um conjunto de tabelas criadas e mantidas pelo usuário – Contêm informações sobre o usuário • Dicionário de Dados: – É um conjunto de tabelas criadas e mantidas pelo servidor Oracle – Contém informações sobre o banco de dados 9-9 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  314. Consultando o Dicionário de Dados • • Veja os nomes de tabelas de propriedade do usuário. Veja os nomes de tabelas de propriedade do usuário. SELECT table_name FROM user_tables ; • • Exiba tipos de objetos distintos de propriedade do Exiba tipos de objetos distintos de propriedade do usuário. usuário. SELECT DISTINCT object_type FROM user_objects ; • • Exiba tabelas, views, sinônimos e seqüências de Exiba tabelas, views, sinônimos e seqüências de propriedade do usuário. propriedade do usuário. SELECT * FROM user_catalog ; 9-11 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  315. Tipos de Dados Tipo de Dados Descrição VARCHAR2(tamanho) Dados de caractere de comprimento variável CHAR(tamanho) Dados de caractere de comprimento fixo NUMBER(p,s) Dados numéricos de comprimento variável DATE Valores de data e horário LONG Dados de caractere de comprimento variável de até 2 gigabytes CLOB Dados de caractere de até 4 gigabytes RAW e LONG RAW Dados binários brutos BLOB Dados binários de até 4 gigabytes BFILE Dados binários armazenados em um arquivo externo; até 4 gigabytes ROWID Um sistema numérico de base 64 que representa o endereço exclusivo de uma linha na tabela 9-12 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  316. Tipos de Dados de Data/Horário Melhorias de data/horário no Oracle9i: • Foram introduzidos novos tipos de dados de data/horário. • Está disponível um novo armazenamento de tipos de dados. • Foram feitas melhorias nos fusos horários e no fuso horário local. Tipo de Dados Descrição TIMESTAMP Data com frações de segundo INTERVAL YEAR TO MONTH Armazenado como um intervalo de anos e meses INTERVAL DAY TO SECOND Armazenado como um intervalo de dias, horas, minutos e segundos 9-14 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  317. Tipos de Dados de Data/Horário • O tipo de dados TIMESTAMP é uma extensão do tipo de dados DATE. • Ele armazena o ano, o mês e o dia do tipo de dados DATE, além dos valores de horas, minutos e segundos, assim como o valor das frações de segundo. • O tipo de dados TIMESTAMP é especificado da seguinte forma: TIMESTAMP[(fractional_seconds_precision)] 9-15 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  318. Tipo de Dados TIMESTAMP WITH TIME ZONE • TIMESTAMP WITH TIME ZONE é uma variante de TIMESTAMP que inclui um deslocamento de fuso horário em seu valor. • O deslocamento de fuso horário é a diferença, em horas e minutos, entre o horário local e o UTC (\"Coordinated Universal Time\"). TIMESTAMP[(fractional_seconds_precision)] WITH TIME ZONE 9-16 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  319. Tipo de Dados TIMESTAMP WITH LOCAL TIME ZONE • TIMESTAMP WITH LOCAL TIME ZONE é outra variante de TIMESTAMP que inclui um deslocamento de fuso horário em seu valor. • Os dados armazenados no banco de dados são normalizados para o fuso horário do banco de dados. • O deslocamento de fuso horário não é armazenado como parte dos dados das colunas; o Oracle retorna os dados no fuso horário local da sessão dos usuários. • O tipo de dados TIMESTAMP WITH LOCAL TIME ZONE é especificado da seguinte forma: TIMESTAMP[(fractional_seconds_precision)] WITH LOCAL TIME ZONE 9-17 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  320. Tipo de Dados INTERVAL YEAR TO MONTH • INTERVAL YEAR TO MONTH armazena um período de tempo usando os campos de data/horário YEAR e MONTH. INTERVAL YEAR [(year_precision)] TO MONTH INTERVAL '123-2' YEAR(3) TO MONTH Indica um intervalo de 123 anos, 2 meses. INTERVAL '123' YEAR(3) Indica um intervalo de 123 anos, 0 meses. INTERVAL '300' MONTH(3) Indica um intervalo de 300 meses. INTERVAL '123' YEAR Retorna um erro, porque a precisão default é 2 e '123' tem 3 dígitos. 9-18 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  321. Tipo de Dados INTERVAL DAY TO SECOND • INTERVAL DAY TO SECOND armazena um período de tempo em termos de dias, horas, minutos e segundos. INTERVAL DAY [(day_precision)] TO SECOND [(fractional_seconds_precision)] INTERVAL '4 5:12:10.222' DAY TO SECOND(3) Indica 4 dias, 5 horas, 12 minutos, 10 segundos e 222 milésimos de segundo. INTERVAL '7' DAY Indica 7 dias. INTERVAL '180' DAY(3) Indica 180 dias. 9-20 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  322. Tipo de Dados INTERVAL DAY TO SECOND • INTERVAL DAY TO SECOND armazena um período de tempo em termos de dias, horas, minutos e segundos. INTERVAL '4 5:12:10.222' DAY TO SECOND(3) Indica 4 dias, 5 horas, 12 minutos, 10 segundos e 222 milésimos de segundo. INTERVAL '4 5:12' DAY TO MINUTE Indica 4 dias, 5 horas e 12 minutos. INTERVAL '400 5' DAY(3) TO HOUR Indica 400 dias e 5 horas. INTERVAL '11:12:10.2222222' HOUR TO SECOND(7) Indica 11 horas, 12 minutos e 10,2222222 segundos. 9-21 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  323. Criando uma Tabela Usando uma Sintaxe de Subconsulta • Crie uma tabela e insira linhas combinando a instrução CREATE TABLE e a opção AS subconsulta. CREATE TABLE tabela [(coluna, coluna...)] AS subconsulta; • Estabeleça uma correspondência entre o número de colunas especificadas e o número de colunas da subconsulta. • Defina colunas com nomes de colunas e valores default. 9-22 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  324. Criando uma Tabela Usando uma Subconsulta CREATE TABLE dept80 AS SELECT employee_id, last_name, salary*12 ANNSAL, hire_date FROM employees WHERE department_id = 80; Table created. DESCRIBE dept80 9-23 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  325. A Instrução ALTER TABLE Use a instrução ALTER TABLE para: • Adicionar uma nova coluna • Modificar uma coluna existente • Definir um valor default para a nova coluna • Eliminar uma coluna 9-24 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  326. A Instrução ALTER TABLE Use a instrução ALTER TABLE para adicionar, modificar ou eliminar colunas. ALTER TABLE tabela ADD (coluna tipo_de_dados [DEFAULT expr] [,coluna tipo_de_dados]...); ALTER TABLE tabela MODIFY (coluna tipo_de_dados [DEFAULT expr] [,coluna tipo_de_dados]...); ALTER TABLE tabela DROP (coluna); 9-25 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  327. Adicionando uma Coluna Nova coluna DEPT80 \"Adicione uma nova coluna à tabela DEPT80.\" DEPT80 9-26 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  328. Adicionando uma Coluna • Use a cláusula ADD para adicionar colunas. ALTER TABLE dept80 ADD (job_id VARCHAR2(9)); Table altered. • A nova coluna torna-se a última coluna. 9-27 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  329. Modificando uma Coluna • Você pode alterar o tipo de dados, o tamanho e o valor default de uma coluna. ALTER TABLE dept80 MODIFY (last_name VARCHAR2(30)); Table altered. • Uma alteração no valor default afeta somente as inserções subseqüentes na tabela. 9-28 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  330. Eliminando uma Coluna Use a cláusula DROP COLUMN para eliminar colunas que não são mais necessárias na tabela. ALTER TABLE dept80 DROP COLUMN job_id; Table altered. 9-29 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  331. A Opção SET UNUSED • Use a opção SET UNUSED para marcar uma ou mais colunas como não usadas. • Use a opção DROP UNUSED COLUMNS para remover as colunas que estiverem marcadas como não usadas. ALTER ALTER TABLE TABLE tabela tabela SET SET UNUSED UNUSED (coluna); (coluna); OU ALTER ALTER TABLE TABLE tabela tabela SET SET UNUSED UNUSED COLUMN coluna; COLUMN coluna; ALTER ALTER TABLE TABLE tabela tabela DROP DROP UNUSED UNUSED COLUMNS; COLUMNS; 9-30 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  332. Eliminando uma Tabela • Todos os dados e a estrutura da tabela serão excluídos. • Todas as transações pendentes sofrerão commit. • Todos os índices serão eliminados. • Você não pode fazer rollback da instrução DROP TABLE. DROP TABLE dept80; Table dropped. 9-32 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  333. Alterando o Nome de um Objeto • Para alterar o nome de uma tabela, view, seqüência ou sinônimo, execute a instrução RENAME. RENAME dept TO detail_dept; Table renamed. • Você deve ser o proprietário do objeto. 9-33 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  334. Truncando uma Tabela • A Instrução TRUNCATE TABLE: – Remove todas as linhas de uma tabela – Libera o espaço de armazenamento usado por essa tabela TRUNCATE TABLE detail_dept; Table truncated. • Você não poderá fazer rollback da remoção de linhas quando usar TRUNCATE. • Você também tem a opção de remover as linhas usando a instrução DELETE. 9-34 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  335. Adicionando Comentários a uma Tabela • Você pode adicionar comentários a uma tabela ou coluna usando a instrução COMMENT. COMMENT ON TABLE employees IS 'Employee Information'; Comment created. • Os comentários podem ser exibidos através das views de dicionário de dados: – ALL_COL_COMMENTS – USER_COL_COMMENTS – ALL_TAB_COMMENTS – USER_TAB_COMMENTS 9-35 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  336. Resumo Nesta lição, você aprendeu a usar instruções DDL para criar, alterar, eliminar e renomear tabelas. Instrução Descrição CREATE TABLE Cria uma tabela ALTER TABLE Modifica a estrutura da tabela DROP TABLE Remove as linhas e a estrutura da tabela RENAME Altera o nome de uma tabela, view, seqüência ou sinônimo TRUNCATE Remove todas as linhas de uma tabela e libera o espaço de armazenamento COMMENT Adiciona comentários a uma tabela ou view 9-36 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  337. Visão Geral do Exercício 9 Este exercício abrange os seguintes tópicos: • Criando novas tabelas • Criando uma nova tabela usando a sintaxe CREATE TABLE AS • Modificando definições de coluna • Verificando se que as tabelas existem • Adicionando comentários às tabelas • Eliminando tabelas • Alterando tabelas 9-38 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  338. 10 Incluindo Restrições Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  339. Objetivos Após concluir esta lição, você poderá fazer o seguinte: • Descrever restrições • Criar e manter restrições 10-2 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  340. O que São Restrições? • As restrições impõem regras no nível da tabela. • As restrições evitam que uma tabela seja deletada se houver dependências. • Os seguintes tipos de restrições são válidos: – NOT NULL – UNIQUE – PRIMARY KEY – FOREIGN KEY – CHECK 10-3 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  341. Diretrizes sobre Restrições • Dê um nome à restrição ou deixe o servidor Oracle gerar um nome usando o formato SYS_Cn. • Crie uma restrição: – No momento em que a tabela for criada ou – Depois que a tabela tiver sido criada • Defina uma restrição no nível da coluna ou da tabela. • Exiba uma restrição no dicionário de dados. 10-4 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  342. Definindo Restrições CREATE TABLE [esquema.]tabela (coluna tipo_de_dados [DEFAULT expr] [restrição_de_coluna], ... [restrição_de_tabela][,...]); CREATE TABLE employees( employee_id NUMBER(6), first_name VARCHAR2(20), ... job_id VARCHAR2(10) NOT NULL, CONSTRAINT emp_emp_id_pk PRIMARY KEY (EMPLOYEE_ID)); 10-5 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  343. Definindo Restrições • Nível de restrição da coluna coluna [CONSTRAINT nome_da_restrição] tipo_de_restrição, coluna [CONSTRAINT nome_da_restrição] tipo_de_restrição, • Nível de restrição da tabela coluna,... coluna,... [CONSTRAINT nome_da_restrição] tipo_de_restrição [CONSTRAINT nome_da_restrição] tipo_de_restrição (coluna, ...), (coluna, ...), 10-6 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  344. A Restrição NOT NULL Assegura que não sejam permitidos valores nulos para a coluna: … Restrição NOT NULL Restrição Ausência da restrição (Nenhuma linha pode NOT NULL NOT NULL (Qualquer conter um valor nulo linha pode conter nesta coluna.) um valor nulo nesta coluna.) 10-7 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  345. A Restrição NOT NULL É definida no nível da coluna: CREATE TABLE employees( employee_id NUMBER(6), last_name VARCHAR2(25) NOT NULL, Nomeado salary NUMBER(8,2), pelo commission_pct NUMBER(2,2), sistema hire_date DATE CONSTRAINT emp_hire_date_nn Nomeado NOT NULL, pelo usuário ... 10-8 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  346. A Restrição UNIQUE Restrição UNIQUE EMPLOYEES … INSERT INTO Permitido Não permitido: já existe 10-9 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  347. A Restrição UNIQUE Definida no nível da tabela ou da coluna: CREATE TABLE employees( employee_id NUMBER(6), last_name VARCHAR2(25) NOT NULL, email VARCHAR2(25), salary NUMBER(8,2), commission_pct NUMBER(2,2), hire_date DATE NOT NULL, ... CONSTRAINT emp_email_uk UNIQUE(email)); 10-10 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  348. A Restrição de PRIMARY KEY DEPARTMENTS PRIMARY KEY … Não permitido INSERT INTO (Valor nulo) Não permitido (50 já existe) 10-11 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  349. A Restrição de PRIMARY KEY Definida no nível da tabela ou da coluna: CREATE TABLE departments ( department_id NUMBER(4), department_name VARCHAR2(30) CONSTRAINT dept_name_nn NOT NULL, manager_id NUMBER(6), location_id NUMBER(4), CONSTRAINT dept_id_pk PRIMARY KEY(department_id)); 10-12 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  350. A Restrição de FOREIGN KEY DEPARTMENTS PRIMARY KEY … EMPLOYEES FOREIGN KEY … Não permitido INSERT INTO (9 não existe) Permitido 10-13 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  351. A Restrição de FOREIGN KEY Definida no nível da tabela ou da coluna: CREATE TABLE employees( employee_id NUMBER(6), last_name VARCHAR2(25) NOT NULL, email VARCHAR2(25), salary NUMBER(8,2), commission_pct NUMBER(2,2), hire_date DATE NOT NULL, ... department_id NUMBER(4), CONSTRAINT emp_dept_fk FOREIGN KEY (department_id) REFERENCES departments(department_id), CONSTRAINT emp_email_uk UNIQUE(email)); 10-14 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  352. Palavras-chave da Restrição de FOREIGN KEY • FOREIGN KEY: define a coluna na tabela filha no nível de restrição da tabela. • REFERENCES: identifica a tabela e a coluna na tabela mãe. • ON DELETE CASCADE: deleta as linhas dependentes da tabela filha quando uma linha da tabela mãe é deletada. • ON DELETE SET NULL: converte valores de chave estrangeira dependentes em valores nulos. 10-15 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  353. A Restrição CHECK • Define uma condição que cada linha deve satisfazer • As expressões a seguir não são permitidas: – Referências às pseudocolunas CURRVAL, NEXTVAL, LEVEL e ROWNUM – Chamadas para as funções SYSDATE, UID, USER e USERENV – Consultas que se referem a outros valores em outras linhas ..., salary NUMBER(2) CONSTRAINT emp_salary_min CHECK (salary > 0),... 10-16 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  354. Adicionando uma Sintaxe de Restrição Use a instrução ALTER TABLE para: • Adicionar ou eliminar uma restrição sem modificar sua estrutura • Ativar ou desativar restrições • Adicionar uma restrição NOT NULL usando a cláusula MODIFY ALTER TABLE tabela ALTER TABLE tabela ADD [CONSTRAINT restrição] tipo (coluna); ADD [CONSTRAINT restrição] tipo (coluna); 10-17 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  355. Adicionando uma Restrição Adicione uma restrição de FOREIGN KEY à tabela EMPLOYEES indicando que já deve existir um gerente como um funcionário válido na tabela EMPLOYEES. ALTER TABLE employees ADD CONSTRAINT emp_manager_fk FOREIGN KEY(manager_id) REFERENCES employees(employee_id); Table altered. 10-18 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  356. Eliminando uma Restrição • Remova a restrição de gerente da tabela EMPLOYEES. ALTER TABLE ALTER TABLE employees employees DROP CONSTRAINT emp_manager_fk; DROP CONSTRAINT emp_manager_fk; Table altered. Table altered. • Remova a restrição de PRIMARY KEY da tabela DEPARTMENTS e elimine a restrição de FOREIGN KEY associada da coluna EMPLOYEES.DEPARTMENT_ID. ALTER TABLE departments ALTER TABLE departments DROP PRIMARY KEY CASCADE; DROP PRIMARY KEY CASCADE; Table altered. Table altered. 10-19 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  357. Desativando Restrições • Execute a cláusula DISABLE da instrução ALTER TABLE para desativar uma restrição de integridade. • Aplique a opção CASCADE para desativar restrições de integridade dependentes. ALTER TABLE ALTER TABLE employees employees DISABLE CONSTRAINT emp_emp_id_pk CASCADE; DISABLE CONSTRAINT emp_emp_id_pk CASCADE; Table altered. Table altered. 10-20 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  358. Ativando Restrições • Ative uma restrição de integridade desativada no momento na definição da tabela, usando a cláusula ENABLE. ALTER TABLE ALTER TABLE employees employees ENABLE CONSTRAINT ENABLE CONSTRAINT emp_emp_id_pk; emp_emp_id_pk; Table altered. Table altered. • Um índice UNIQUE ou PRIMARY KEY será automaticamente criado se você ativar uma restrição de chave UNIQUE ou PRIMARY KEY. 10-21 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  359. Restrições em Cascata • A cláusula CASCADE CONSTRAINTS é usada em conjunto com a cláusula DROP COLUMN. • A cláusula CASCADE CONSTRAINTS elimina todas as restrições de integridade referenciais que remetam às chaves exclusivas e primária definidas nas colunas eliminadas. • A cláusula CASCADE CONSTRAINTS também elimina todas as restrições de várias colunas definidas nas colunas eliminadas. 10-22 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  360. Restrições em Cascata Exemplo: ALTER TABLE test1 ALTER TABLE test1 DROP (pk) CASCADE CONSTRAINTS; DROP (pk) CASCADE CONSTRAINTS; Table altered. Table altered. ALTER TABLE test1 ALTER TABLE test1 DROP (pk, fk, col1) CASCADE CONSTRAINTS; DROP (pk, fk, col1) CASCADE CONSTRAINTS; Table altered. Table altered. 10-23 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  361. Verificando Restrições Consulte a tabela USER_CONSTRAINTS para ver todos os nomes e definições de restrições. SELECT constraint_name, constraint_type, search_condition FROM user_constraints WHERE table_name = 'EMPLOYEES'; … 10-24 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  362. Verificando Colunas Associadas a Restrições Veja as colunas associadas aos nomes de restrições na view USER_CONS_COLUMNS. SELECT constraint_name, column_name FROM user_cons_columns WHERE table_name = 'EMPLOYEES'; … 10-25 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  363. Resumo Nesta lição, você aprendeu a criar restrições. • Tipos de restrições: – NOT NULL – UNIQUE – PRIMARY KEY – FOREIGN KEY – CHECK • Você pode consultar a tabela USER_CONSTRAINTS para ver todos os nomes e definições de restrições. 10-26 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  364. Visão Geral do Exercício 10 Este exercício abrange os seguintes tópicos: • Adicionando restrições às tabelas existentes • Adicionando mais colunas a uma tabela • Exibindo informações nas views de dicionário de dados 10-27 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  365. 11 Criando Views Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  366. Objetivos Objetivos Após concluir esta lição, você poderá fazer o seguinte: Após concluir esta lição, você poderá fazer o seguinte: • Descrever uma view • Descrever uma view • • Criar uma view, eliminá-la e alterar sua definição Criar uma view, eliminá-la e alterar sua definição • • Recuperar dados através de uma view Recuperar dados através de uma view • • Inserir, atualizar e deletar dados através de uma view Inserir, atualizar e deletar dados através de uma view • • Criar e usar uma view em linha Criar e usar uma view em linha • • Executar a análise \"Top-N\" Executar a análise \"Top-N\" 11-2 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  367. Objetos de Banco de Dados Objetos de Banco de Dados Objeto Descrição Tabela Unidade básica de armazenamento, composta de linhas e colunas View Representa logicamente subconjuntos de dados de uma ou mais tabelas Seqüência Gera valores de chave primária Índice Melhora o desempenho de algumas consultas Sinônimo Nome alternativo para um objeto 11-3 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  368. O que é uma View? O que é uma View? Tabela EMPLOYEES: 11-4 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  369. Por que Usar Views? Por que Usar Views? • • Para restringir o acesso a dados Para restringir o acesso a dados • • Para facilitar as consultas complexas Para facilitar as consultas complexas • • Para permitir a independência dos dados Para permitir a independência dos dados • • Para apresentar diferentes visualizações Para apresentar diferentes visualizações dos mesmos dados dos mesmos dados 11-5 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  370. Views Simples e Views Simples e Views Complexas Views Complexas Recurso Views Simples Views Complexas Número de tabelas Uma Uma ou mais Contém funções Não Sim Contém grupos de dados Não Sim Operações DML através de uma view Sim Nem sempre 11-6 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  371. Criando uma View • Incorpore uma subconsulta na instrução CREATE VIEW. CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW view CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW view [(apelido[, apelido]...)] [(apelido[, apelido]...)] AS subconsulta AS subconsulta [WITH CHECK OPTION [CONSTRAINT restrição]] [WITH CHECK OPTION [CONSTRAINT restrição]] [WITH READ ONLY [CONSTRAINT restrição]]; [WITH READ ONLY [CONSTRAINT restrição]]; • A subconsulta pode conter uma sintaxe SELECT complexa. 11-7 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  372. Criando uma View • Crie uma view, EMPVU80, que contenha detalhes dos funcionários do departamento 80. CREATE VIEW empvu80 AS SELECT employee_id, last_name, salary FROM employees WHERE department_id = 80; View created. • Descreva a estrutura da view usando o comando DESCRIBE do iSQL*Plus. DESCRIBE empvu80 DESCRIBE empvu80 11-8 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  373. Criando uma View • Crie uma view usando apelidos de coluna na subconsulta. CREATE VIEW salvu50 AS SELECT employee_id ID_NUMBER, last_name NAME, salary*12 ANN_SALARY FROM employees WHERE department_id = 50; View created. • Selecione as colunas nesta view pelos nomes de apelidos atribuídos. 11-9 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  374. Recuperando Dados de uma View Recuperando Dados de uma View SELECT * FROM salvu50; 11-10 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  375. Consultando uma View Consultando uma View Servidor Oracle iSQL*Plus USER_VIEWS SELECT * EMPVU80 FROM empvu80; SELECT employee_id, last_name, salary FROM employees WHERE department_id=80; EMPLOYEES 11-11 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  376. Modificando uma View • Modifique a view EMPVU80 usando a cláusula CREATE OR REPLACE VIEW. Adicione um apelido para cada nome de coluna. CREATE OR REPLACE VIEW empvu80 (id_number, name, sal, department_id) AS SELECT employee_id, first_name || ' ' || last_name, salary, department_id FROM employees WHERE department_id = 80; View created. • Os apelidos de coluna na cláusula CREATE VIEW estão listados na mesma ordem que as colunas na subconsulta. 11-12 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  377. Criando uma View Complexa Crie uma view complexa que contenha funções de grupo para exibir os valores de duas tabelas. CREATE VIEW dept_sum_vu (name, minsal, maxsal, avgsal) AS SELECT d.department_name, MIN(e.salary), MAX(e.salary),AVG(e.salary) FROM employees e, departments d WHERE e.department_id = d.department_id GROUP BY d.department_name; View created. 11-13 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  378. Regras para Executar Operações DML em uma View • Você poderá executar operações DML em views simples. • Você não poderá remover uma linha se a view contiver: – Funções de grupo – Uma cláusula GROUP BY – A palavra-chave DISTINCT – A palavra-chave ROWNUM da pseudocoluna 11-14 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  379. Regras para Executar Operações DML em uma View Você não poderá modificar dados em uma view se ela contiver: • Funções de grupo • Uma cláusula GROUP BY • A palavra-chave DISTINCT • A palavra-chave ROWNUM da pseudocoluna • Colunas definidas por expressões 11-15 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  380. Regras para Executar Operações DML em uma View Não será possível adicionar dados através de uma view se ela incluir: • Funções de grupo • Uma cláusula GROUP BY • A palavra-chave DISTINCT • A palavra-chave ROWNUM da pseudocoluna • Colunas definidas por expressões • Colunas NOT NULL nas tabelas-base que não sejam selecionadas pela view 11-16 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  381. Usando a Cláusula WITH CHECK OPTION • Você pode garantir que as operações DML executadas na view permaneçam no domínio da view usando a cláusula WITH CHECK OPTION. CREATE OR REPLACE VIEW empvu20 AS SELECT * FROM employees WHERE department_id = 20 WITH CHECK OPTION CONSTRAINT empvu20_ck ; View created. • Qualquer tentativa de alterar o número de departamento em qualquer linha da view resultará em falha porque será violada a restrição WITH CHECK OPTION. 11-17 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  382. Negando Operações DML • Você pode assegurar que nenhuma operação DML ocorra adicionando a opção WITH READ ONLY à definição de view. • Qualquer tentativa de executar uma operação DML em uma linha da view resultará em erro no servidor Oracle. 11-19 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  383. Negando Operações DML CREATE OR REPLACE VIEW empvu10 (employee_number, employee_name, job_title) AS SELECT employee_id, last_name, job_id FROM employees WHERE department_id = 10 WITH READ ONLY; View created. 11-20 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  384. Removendo uma View Removendo uma View Você pode remover uma view sem perder dados porque Você pode remover uma view sem perder dados porque ela se baseia em tabelas subjacentes no banco de dados. ela se baseia em tabelas subjacentes no banco de dados. DROP VIEW view; DROP VIEW view; DROP VIEW empvu80; View dropped. 11-21 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  385. Views em Linha Views em Linha • • Uma view em linha é uma subconsulta com um Uma view em linha é uma subconsulta com um apelido (ou nome de correlação) que pode ser apelido (ou nome de correlação) que pode ser usada em uma instrução SQL. usada em uma instrução SQL. • • Uma subconsulta com um determinado nome na Uma subconsulta com um determinado nome na cláusula FROM da consulta principal é um exemplo cláusula FROM da consulta principal é um exemplo de view em linha. de view em linha. • • Uma view em linha não é um objeto de esquema. Uma view em linha não é um objeto de esquema. 11-22 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  386. Análise Top-N • As consultas Top-N procuram os n maiores ou menores valores de uma coluna. Por exemplo: – Quais são os dez produtos mais vendidos? – Quais são os dez produtos menos vendidos? • Tanto o conjunto dos maiores como o dos menores valores são considerados consultas Top-N. 11-24 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  387. Executando a Análise Top-N A estrutura de nível superior de uma consulta de análise \"Top-N\" é: SELECT SELECT[lista_de_colunas], ROWNUM [lista_de_colunas], ROWNUM FROM FROM (SELECT [lista_de_colunas] (SELECT [lista_de_colunas] FROM tabela FROM tabela ORDER BY coluna_Top-N) ORDER BY coluna_Top-N) WHERE ROWNUM <= N; WHERE ROWNUM <= N; 11-25 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  388. Exemplo de Análise Top-N Exemplo de Análise Top-N Para exibir os nomes e os salários dos três funcionários Para exibir os nomes e os salários dos três funcionários mais bem remunerados da tabela EMPLOYEES: mais bem remunerados da tabela EMPLOYEES: 1 2 3 SELECT ROWNUM as RANK, last_name, salary FROM (SELECT last_name,salary FROM employees ORDER BY salary DESC) WHERE ROWNUM <= 3; 1 2 3 11-26 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  389. Resumo Nesta lição, você aprendeu que uma view é derivada dos dados contidos em outras tabelas ou views e oferece as seguintes vantagens: • Restringe o acesso a bancos de dados • Simplifica as consultas • Permite a independência dos dados • Proporciona várias visualizações dos mesmos dados • Pode ser eliminada sem remover os dados subjacentes • Uma view em linha é uma subconsulta com um nome apelido • Pode-se efetuar uma análise \"Top-N\" usando subconsultas e consultas externas 11-27 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  390. Visão Geral do Exercício 11 Este exercício abrange os seguintes tópicos: • Criando uma view simples • Criando uma view complexa • Criando uma view com restrição de verificação • Tentando modificar dados na view • Exibindo definições de view • Removendo views 11-28 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  391. 12 Outros Objetos de Banco de Dados Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  392. Objetivos Após concluir esta lição, você poderá fazer o seguinte: • Criar, manter e usar seqüências • Criar e manter índices • Criar sinônimos privados e públicos 12-2 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  393. Objetos de Banco de Dados Objetos de Banco de Dados Objeto Descrição Tabela Unidade básica de armazenamento, composta de linhas e colunas View Representa logicamente subconjuntos de dados de uma ou mais tabelas Seqüência Gera valores de chave primária Índice Melhora o desempenho de algumas consultas Sinônimo Nome alternativo para um objeto 12-3 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  394. O que é uma Seqüência? Uma seqüência: • Gera números exclusivos automaticamente • É um objeto compartilhável • É geralmente usada para criar um valor de chave primária • Substitui o código de aplicação • Acelera a eficácia do acesso a valores de seqüência quando estão no cache na memória 12-4 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  395. A Sintaxe da Instrução CREATE SEQUENCE Defina uma seqüência para gerar números seqüenciais automaticamente: CREATE SEQUENCE seqüência CREATE SEQUENCE seqüência [INCREMENT BY n] [INCREMENT BY n] [START WITH n] [START WITH n] [{MAXVALUE n | NOMAXVALUE}] [{MAXVALUE n | NOMAXVALUE}] [{MINVALUE n | NOMINVALUE}] [{MINVALUE n | NOMINVALUE}] [{CYCLE | NOCYCLE}] [{CYCLE | NOCYCLE}] [{CACHE n | NOCACHE}]; [{CACHE n | NOCACHE}]; 12-5 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  396. Criando uma Seqüência • Crie uma seqüência denominada DEPT_DEPTID_SEQ para ser usada na chave primária da tabela DEPARTMENTS. • Não use a opção CYCLE. CREATE SEQUENCE dept_deptid_seq CREATE SEQUENCE dept_deptid_seq INCREMENT BY 10 INCREMENT BY 10 START WITH 120 START WITH 120 MAXVALUE 9999 MAXVALUE 9999 NOCACHE NOCACHE NOCYCLE; NOCYCLE; Sequence created. Sequence created. 12-7 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  397. Confirmando Seqüências • Verifique seus valores de seqüência na tabela de dicionário de dados USER_SEQUENCES. SELECT SELECT sequence_name, min_value, max_value, sequence_name, min_value, max_value, increment_by, last_number increment_by, last_number FROM FROM user_sequences; user_sequences; • A coluna LAST_NUMBER exibirá o próximo número de seqüência disponível se NOCACHE for especificado. 12-8 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  398. Pseudocolunas NEXTVAL e CURRVAL • NEXTVAL retorna o próximo valor de seqüência disponível. Ela retorna um valor exclusivo sempre que é feita referência a ela, até mesmo para diferentes usuários. • CURRVAL obtém o valor de seqüência atual. • NEXTVAL deve ser emitido para a seqüência antes que CURRVAL contenha um valor. 12-9 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  399. Usando uma Seqüência • Insira um novo departamento denominado \"Support\" no ID de local 2500. INSERT INTO departments(department_id, INSERT INTO departments(department_id, department_name, location_id) department_name, location_id) VALUES VALUES (dept_deptid_seq.NEXTVAL, (dept_deptid_seq.NEXTVAL, 'Support', 2500); 'Support', 2500); 1 row created. 1 row created. • Exiba o valor atual da seqüência DEPT_DEPTID_SEQ. SELECT SELECT dept_deptid_seq.CURRVAL dept_deptid_seq.CURRVAL FROM FROM dual; dual; 12-11 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  400. Usando uma Seqüência • Se os valores de seqüência forem armazenados no cache na memória, o acesso a eles será mais rápido. • Podem ocorrer intervalos em valores de seqüência quando: – Ocorre um rollback – Ocorre uma falha no sistema – Uma seqüência é usada em outra tabela • Se a seqüência tiver sido criada com NOCACHE, exiba o próximo valor disponível, consultando a tabela USER_SEQUENCES. 12-12 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  401. Modificando uma Seqüência Altere o valor de incremento, o valor máximo, o valor mínimo, a opção de ciclo ou a opção de cache. ALTER SEQUENCE dept_deptid_seq ALTER SEQUENCE dept_deptid_seq INCREMENT BY 20 INCREMENT BY 20 MAXVALUE 999999 MAXVALUE 999999 NOCACHE NOCACHE NOCYCLE; NOCYCLE; Sequence altered. Sequence altered. 12-13 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  402. Diretrizes para Modificar uma Seqüência • Você deve ser o proprietário ou ter o privilégio ALTER referente à seqüência. • Somente os números de seqüência futuros são afetados. • A seqüência deve ser eliminada e recriada para que seja reiniciada em um número diferente. • Um certo grau de validação é executado. 12-14 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  403. Removendo uma Seqüência • Remova uma seqüência do dicionário de dados usando a instrução DROP SEQUENCE. • Após remover a seqüência, você não poderá mais fazer referência a ela. DROP SEQUENCE dept_deptid_seq; DROP SEQUENCE dept_deptid_seq; Sequence dropped. Sequence dropped. 12-15 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  404. O que é um Índice? Um índice: • É um objeto de esquema • É usado pelo servidor Oracle para acelerar a recuperação de linhas usando um ponteiro • Pode reduzir a E/S do disco usando um método de acesso rápido a caminhos a fim de localizar os dados rapidamente • É independente da tabela que indexa • É usado e mantido automaticamente pelo servidor Oracle 12-16 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  405. Como os Índices São Criados? • Automaticamente: um índice exclusivo é criado automaticamente quando você define uma restrição de PRIMARY KEY ou UNIQUE KEY em uma definição de tabela. • Manualmente: os usuários podem criar índices não exclusivos em colunas para acelerar o acesso às linhas. 12-17 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  406. Criando um Índice • Crie um índice em uma ou mais colunas. CREATE INDEX índice CREATE INDEX índice ON tabela (coluna[, coluna]...); ON tabela (coluna[, coluna]...); • Aumente a velocidade de acesso de consulta à coluna LAST_NAME da tabela EMPLOYEES. CREATE INDEX emp_last_name_idx CREATE INDEX emp_last_name_idx ON ON employees(last_name); employees(last_name); Index created. Index created. 12-18 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  407. Quando Criar um Índice Você deverá criar um índice se: • Uma coluna contiver uma ampla faixa de valores • Uma coluna contiver um grande número de valores nulos • Uma ou mais colunas forem usadas juntas com freqüência em uma cláusula WHERE ou em uma condição de junção • A tabela for grande e a expectativa for de que a maioria das consultas recuperará menos que 2 a 4% das linhas 12-19 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  408. Quando Não Criar um Índice Geralmente, não será vantajoso criar um índice se: • A tabela for pequena • As colunas não forem utilizadas com freqüência como uma condição na consulta • A expectativa for de que a maioria das consultas recuperará mais que 2 a 4% das linhas da tabela • A tabela for atualizada com freqüência • Forem feitas referências às colunas indexadas como parte de uma expressão 12-20 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  409. Confirmando Índices • A view de dicionário de dados USER_INDEXES contém o nome do índice e sua exclusividade. • A view USER_IND_COLUMNS contém os nomes do índice, da tabela e da coluna. SELECT ic.index_name, ic.column_name, ic.column_position col_pos,ix.uniqueness FROM user_indexes ix, user_ind_columns ic WHERE ic.index_name = ix.index_name AND ic.table_name = 'EMPLOYEES'; 12-21 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  410. Índices Baseados em Função • Um índice baseado em função é aquele que se baseia em expressões. • Uma expressão de índice é elaborada a partir de colunas de tabela, constantes, funções SQL e funções definidas pelo usuário. CREATE INDEX upper_dept_name_idx ON departments(UPPER(department_name)); Index created. SELECT * FROM departments WHERE UPPER(department_name) = 'SALES'; 12-22 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  411. Removendo um Índice • Remova um índice do dicionário de dados usando o comando DROP INDEX. DROP INDEX índice; DROP INDEX índice; • Remova o índice UPPER_LAST_NAME_IDX do dicionário de dados. DROP INDEX upper_last_name_idx; DROP INDEX upper_last_name_idx; Index dropped. Index dropped. • Para eliminar um índice, você deve ser o proprietário do índice ou ter o privilégio DROP ANY INDEX. 12-23 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  412. Sinônimos Simplifique o acesso aos objetos criando um sinônimo (outro nome para um objeto). Com os sinônimos, você pode: • Referir-se facilmente a uma tabela de propriedade de outro usuário • Abreviar nomes de objeto longos CREATE CREATE [PUBLIC] SYNONYM sinônimo [PUBLIC] SYNONYM sinônimo FOR FOR objeto; objeto; 12-24 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  413. Criando e Removendo Sinônimos • Crie um nome abreviado para a view DEPT_SUM_VU. CREATE SYNONYM d_sum CREATE SYNONYM d_sum FOR dept_sum_vu; FOR dept_sum_vu; Synonym Created. Synonym Created. • Elimine um sinônimo. DROP SYNONYM d_sum; DROP SYNONYM d_sum; Synonym dropped. Synonym dropped. 12-25 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  414. Resumo Nesta lição, você aprendeu a: • Gerar números de seqüência automaticamente usando um gerador de seqüência • Exibir informações sobre seqüências na tabela de dicionário de dados USER_SEQUENCES • Criar índices para melhorar a velocidade de recuperação da consulta • Exibir informações sobre índices na tabela de dicionário USER_INDEXES • Usar sinônimos para criar nomes alternativos de objetos 12-26 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  415. Visão Geral do Exercício 12 Este exercício abrange os seguintes tópicos: • Criando seqüências • Usando seqüências • Criando índices não-exclusivos • Exibindo informações do dicionário de dados sobre seqüências e índices • Eliminando índices 12-28 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  416. 13 Controlando o Acesso do Usuário Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  417. Objetivos Após concluir esta lição, você poderá fazer o seguinte: • Criar usuários • Criar funções para facilitar a configuração e manutenção do modelo de segurança • Usar as instruções GRANT e REVOKE para conceder e revogar privilégios de objeto • Criar e acessar vínculos de banco de dados 13-2 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  418. Controlando o Acesso do Usuário Controlando o Acesso do Usuário Administrador de banco de dados Nome de usuário e senha Privilégios Usuários 13-3 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  419. Privilégios • Segurança de banco de dados: – Segurança de sistema – Segurança de dados • Privilégios de sistema: obtendo acesso ao banco de dados • Privilégios de objeto: manipulando o conteúdo dos objetos de banco de dados • Esquemas: coleções de objetos, como tabelas, views e seqüências 13-4 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  420. Privilégios de Sistema • Há mais de 100 privilégios disponíveis. • O administrador de banco de dados tem privilégios de sistema de alto nível para tarefas como: – Criar novos usuários – Remover usuários – Remover tabelas – Fazer backup de tabelas 13-5 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  421. Criando Usuários O DBA cria usuários utilizando a instrução CREATE USER. CREATE USER usuário IDENTIFIED BY senha; CREATE USER scott CREATE USER scott IDENTIFIED BY IDENTIFIED BY tiger; tiger; User created. User created. 13-6 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  422. Privilégios de Sistema do Usuário • Quando o usuário é criado, o DBA pode conceder a ele privilégios de sistema específicos. GRANT privilégio [, privilégio...] GRANT privilégio [, privilégio...] TO usuário [, usuário| atribuição, PUBLIC...]; TO usuário [, usuário| atribuição, PUBLIC...]; • Por exemplo, um desenvolvedor de aplicações pode ter os seguintes privilégios de sistema: – CREATE SESSION – CREATE TABLE – CREATE SEQUENCE – CREATE VIEW – CREATE PROCEDURE 13-7 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  423. Concedendo Privilégios de Sistema O DBA pode conceder a um usuário privilégios de sistema específicos. GRANT create session, create table, GRANT create session, create table, create sequence, create view create sequence, create view TO TO scott; scott; Grant succeeded. Grant succeeded. 13-8 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  424. O que é uma Atribuição? O que é uma Atribuição? Usuários Gerente Privilégios Alocando privilégios Alocando privilégios sem uma atribuição com uma atribuição 13-9 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  425. Criando e Concedendo Criando e Concedendo Privilégios a uma Atribuição Privilégios a uma Atribuição • Criar uma atribuição CREATE ROLE manager; CREATE ROLE manager; Role created. Role created. • Conceder privilégios a uma atribuição GRANT create table, create view GRANT create table, create view TO manager; TO manager; Grant succeeded. Grant succeeded. • Conceder uma atribuição aos usuários GRANT GRANT manager TO DEHAAN, KOCHHAR; manager TO DEHAAN, KOCHHAR; Grant Grant succeeded. succeeded. 13-10 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  426. Alterando sua Senha • O DBA cria a sua conta de usuário e inicializa a sua senha. • Você pode alterar sua senha usando a instrução ALTER USER. ALTER USER scott IDENTIFIED BY lion; User altered. 13-11 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  427. Privilégios de Objeto Privilégios de Objeto Privilégio de Objeto Tabela View Seqüência Procedimento ALTER √ √ DELETE √ √ EXECUTE √ INDEX √ INSERT √ √ REFERENCES √ √ SELECT √ √ √ UPDATE √ √ 13-12 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  428. Privilégios de Objeto • Os privilégios variam de um objeto para outro. • Um proprietário tem todos os privilégios sobre o objeto. • Um proprietário pode conceder privilégios específicos sobre seus objetos. GRANT GRANT priv_objeto [(colunas)] priv_objeto [(colunas)] ON ON objeto objeto TO TO {usuário|atribuição|PUBLIC} {usuário|atribuição|PUBLIC} [WITH GRANT OPTION]; [WITH GRANT OPTION]; 13-13 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  429. Concedendo Privilégios de Objeto • Conceder privilégios de consulta na tabela EMPLOYEES GRANT GRANT select select ON ON employees employees TO TO sue, rich; sue, rich; Grant Grant succeeded. succeeded. • Conceder aos usuários e atribuições privilégios para atualizar colunas específicas GRANT GRANT update (department_name, location_id) update (department_name, location_id) ON ON departments departments TO TO scott, manager; scott, manager; Grant Grant succeeded. succeeded. 13-14 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  430. Usando as Palavras-Chave WITH GRANT OPTION e PUBLIC • Dar autoridade a um usuário para repassar os privilégios GRANT GRANT select, insert select, insert ON ON departments departments TO TO scott scott WITH WITH GRANT OPTION; GRANT OPTION; Grant Grant succeeded. succeeded. • Permitir que todos os usuários do sistema consultem dados na tabela DEPARTMENTS de Alice GRANT GRANT select select ON ON alice.departments alice.departments TO TO PUBLIC; PUBLIC; Grant Grant succeeded. succeeded. 13-15 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  431. Confirmando Privilégios Concedidos Confirmando Privilégios Concedidos View de Dicionário de Dados Descrição ROLE_SYS_PRIVS Privilégios de sistema concedidos a atribuições ROLE_TAB_PRIVS Privilégios de tabela concedidos a atribuições USER_ROLE_PRIVS Atribuições acessíveis ao usuário USER_TAB_PRIVS_MADE Privilégios de objeto concedidos sobre os objetos do usuário USER_TAB_PRIVS_RECD Privilégios de objeto concedidos ao usuário USER_COL_PRIVS_MADE Privilégios de objeto concedidos sobre as colunas dos objetos do usuário USER_COL_PRIVS_RECD Privilégios de objeto concedidos ao usuário sobre colunas específicas USER_SYS_PRIVS Lista os privilégios de sistema concedidos ao usuário 13-16 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  432. Como Revogar Privilégios de Objeto • Use a instrução REVOKE para revogar os privilégios concedidos a outros usuários. • Os privilégios concedidos a outros usuários por meio da cláusula WITH GRANT OPTION também serão revogados. REVOKE {privilégio [, privilégio...]|ALL} REVOKE {privilégio [, privilégio...]|ALL} ON ON objeto objeto FROM FROM {usuário[, usuário...]|atribuição|PUBLIC} {usuário[, usuário...]|atribuição|PUBLIC} [CASCADE CONSTRAINTS]; [CASCADE CONSTRAINTS]; 13-17 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  433. Revogando Privilégios de Objeto No papel da usuária Alice, revogue os privilégios SELECT e INSERT concedidos ao usuário Scott na tabela DEPARTMENTS. REVOKE REVOKE select, insert select, insert ON ON departments departments FROM FROM scott; scott; Revoke Revoke succeeded. succeeded. 13-18 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  434. Vínculos de Banco de Dados Uma conexão de vínculo de banco de dados permite que os usuários locais acessem dados em um banco de dados remoto. Local Remoto Tabela EMP SELECT * FROM Banco de dados emp@HQ_ACME.COM; HQ_ACME.COM 13-19 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  435. Vínculos de Banco de Dados • Criar o vínculo de banco de dados CREATE PUBLIC DATABASE LINK hq.acme.com CREATE PUBLIC DATABASE LINK hq.acme.com USING 'sales'; USING 'sales'; Database link created. Database link created. • Criar instruções SQL que utilizem o vínculo de banco de dados SELECT * SELECT * FROM emp@HQ.ACME.COM; FROM emp@HQ.ACME.COM; 13-21 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  436. Resumo Resumo Nesta lição, você aprendeu detalhes sobre as instruções DCL que controlam o acesso ao banco de dados e aos respectivos objetos: Instrução Ação CREATE USER Cria um usuário (geralmente executada por um DBA) GRANT Concede a outros usuários privilégios para acessar objetos CREATE ROLE Cria um conjunto de privilégios (geralmente executada por um DBA) ALTER USER Altera a senha de um usuário REVOKE Remove dos usuários os privilégios referentes a um objeto 13-22 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  437. Visão Geral do Exercício 13 Este exercício abrange os seguintes tópicos: • Concedendo a outros usuários privilégios sobre uma tabela • Modificando a tabela de outro usuário através de privilégios concedidos a você • Criando um sinônimo • Consultando as views de dicionário de dados relacionadas aos privilégios 13-23 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  438. 14 SQL Workshop Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  439. Visão Geral do Workshop Este workshop abrange: • Criação de tabelas e de seqüências • Modificação de dados nas tabelas • Modificação de definições de tabelas • Criação de views • Criação de scripts que contenham comandos SQL e iSQL*Plus • Geração de um relatório simples 14-2 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  440. 15 Usando Operadores SET Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  441. Objetivos Após concluir esta lição, você poderá fazer o seguinte: • Descrever os operadores SET • Usar um operador SET para combinar várias consultas em uma consulta simples • Controlar a ordem das linhas retornadas 15-2 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  442. Os Operadores SET A B A B UNION/UNION ALL A B INTERSECT A B MINUS 15-3 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  443. Tabelas Usadas nesta Lição As tabelas usadas nesta lição são: • EMPLOYEES: fornece os detalhes relativos a todos os funcionários atuais • JOB_HISTORY: registra os detalhes da data inicial e da data final do cargo anterior, além do número de identificação do cargo e do departamento, quando um funcionário muda de cargo 15-4 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  444. O Operador UNION A B O operador UNION retorna resultados de duas consultas após eliminar duplicações. 15-7 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  445. Usando o Operador UNION Exiba os detalhes dos cargos anterior e atual de todos os funcionários. Exiba cada funcionário somente uma vez. SELECT employee_id, job_id FROM employees UNION SELECT employee_id, job_id FROM job_history; … … 15-8 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  446. O Operador UNION ALL A B O operador UNION ALL retorna resultados das duas O operador UNION ALL retorna resultados das duas consultas, incluindo todas as duplicações. consultas, incluindo todas as duplicações. 15-10 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  447. Usando o Operador UNION ALL Exiba os departamentos anterior e atual de todos os funcionários. SELECT employee_id, job_id, department_id FROM employees UNION ALL SELECT employee_id, job_id, department_id FROM job_history ORDER BY employee_id; … … 15-11 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  448. O Operador INTERSECT A B 15-12 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  449. Usando o Operador INTERSECT Exiba os IDs de funcionário e os IDs de cargo dos funcionários com o mesmo cargo que ocupavam antes do início do período de permanência na empresa. SELECT employee_id, job_id FROM employees INTERSECT SELECT employee_id, job_id FROM job_history; 15-13 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  450. O Operador MINUS A B 15-14 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  451. O Operador MINUS Exiba os IDs dos funcionários que nunca mudaram de Exiba os IDs dos funcionários que nunca mudaram de cargo. cargo. SELECT employee_id,job_id FROM employees MINUS SELECT employee_id,job_id FROM job_history; … 15-15 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  452. Diretrizes do Operador SET • As expressões nas listas SELECT devem corresponder em número e tipo de dados. • É possível usar parênteses para alterar a seqüência de execução. • A cláusula ORDER BY: – Pode aparecer somente no final da instrução – Aceitará o nome da coluna, os apelidos da primeira instrução SELECT ou a notação posicional 15-16 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  453. O Oracle Server e os Operadores SET • As linhas duplicadas são eliminadas automaticamente, exceto em UNION ALL. • Os nomes das colunas na primeira consulta aparecem no resultado. • A saída é classificada em ordem crescente por default, exceto em UNION ALL. 15-17 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  454. Correspondendo às Instruções SELECT Com o operador UNION, são exibidos o ID do departamento, o local e a data de admissão de todos os funcionários. SELECT department_id, TO_NUMBER(null) location, hire_date FROM employees UNION SELECT department_id, location_id, TO_DATE(null) FROM departments; … 15-18 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  455. Correspondendo à Instrução SELECT • Com o operador UNION, são exibidos o ID de funcionário, o ID de cargo e o salário de todos os funcionários. SELECT employee_id, job_id,salary FROM employees UNION SELECT employee_id, job_id,0 FROM job_history; … 15-19 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  456. Controlando a Ordem das Linhas Produza uma frase em inglês com dois operadores UNION. COLUMN a_dummy NOPRINT SELECT 'sing' AS \"My dream\", 3 a_dummy FROM dual UNION SELECT 'I''d like to teach', 1 FROM dual UNION SELECT 'the world to', 2 FROM dual ORDER BY 2; 15-20 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  457. Resumo Nesta lição, você aprendeu a: • Usar UNION para retornar todas as linhas distintas • Usar UNION ALL para retornar todas as linhas, incluindo as linhas duplicadas • Usar INTERSECT para retornar todas as linhas compartilhadas pelas duas consultas • Usar MINUS para retornar todas as linhas distintas selecionadas pela primeira consulta, mas não pela segunda • Usar ORDER BY somente no final da instrução 15-21 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  458. Visão Geral do Exercício 15 Este exercício abrange o uso das funções de data/horário do Oracle9i. 15-22 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  459. 16 Funções de Data/Horário do Oracle9i Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  460. Objetivos Após concluir esta lição, você poderá usar as seguintes funções de data/horário: • TZ_OFFSET • CURRENT_DATE • CURRENT_TIMESTAMP • LOCALTIMESTAMP • DBTIMEZONE • SESSIONTIMEZONE • EXTRACT • FROM_TZ • TO_TIMESTAMP • TO_TIMESTAMP_TZ • TO_YMINTERVAL 16-2 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  461. FUSOS HORÁRIOS +07:00 -08:00 +02:00 +10:00 -05:00 A imagem representa o horário em A imagem representa o horário em cada fuso horário quando forem cada fuso horário quando forem 12:00 no horário de Greenwich. 12:00 no horário de Greenwich. 16-3 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  462. Suporte a Data/Horário do Oracle9i • No Oracle9i, você pode incluir o fuso horário nos seus dados de data e horário e fornecer suporte para segundos fracionários. • Foram adicionados três novos tipos de dados a DATE: – TIMESTAMP – TIMESTAMP WITH TIME ZONE (TSTZ) – TIMESTAMP WITH LOCAL TIME ZONE (TSLTZ) • O Oracle9i fornece suporte ao horário de verão para os tipos de dados de data/horário no servidor. 16-5 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  463. TZ_OFFSET • Exibir o deslocamento do fuso horário 'US/Eastern' SELECT TZ_OFFSET('US/Eastern') FROM DUAL; • Exibir o deslocamento do fuso horário 'Canada/Yukon' SELECT TZ_OFFSET('Canada/Yukon') FROM DUAL; • Exibir o deslocamento do fuso horário 'Europe/London' SELECT TZ_OFFSET('Europe/London') FROM DUAL; 16-7 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  464. CURRENT_DATE • Exibir a data e o horário atuais no fuso horário da sessão ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MON-YYYY HH24:MI:SS'; ALTER SESSION SET TIME_ZONE = '-5:0'; SELECT SESSIONTIMEZONE, CURRENT_DATE FROM DUAL; ALTER SESSION SET TIME_ZONE = '-8:0'; SELECT SESSIONTIMEZONE, CURRENT_DATE FROM DUAL; • CURRENT_DATE distingue o fuso horário da sessão. • O valor retornado é uma data do calendário gregoriano. 16-9 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  465. CURRENT_TIMESTAMP • Exibir a data atual e o horário fracionário no fuso horário da sessão ALTER SESSION SET TIME_ZONE = '-5:0'; SELECT SESSIONTIMEZONE, CURRENT_TIMESTAMP FROM DUAL; ALTER SESSION SET TIME_ZONE = '-8:0'; SELECT SESSIONTIMEZONE, CURRENT_TIMESTAMP FROM DUAL; • CURRENT_TIMESTAMP distingue o fuso horário da sessão. • O valor retornado é do tipo de dados TIMESTAMP WITH TIME ZONE. 16-10 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  466. LOCALTIMESTAMP • Exibir a data e o horário atuais no fuso horário da sessão em um valor de tipo de dados TIMESTAMP ALTER SESSION SET TIME_ZONE = '-5:0'; SELECT CURRENT_TIMESTAMP, LOCALTIMESTAMP FROM DUAL; ALTER SESSION SET TIME_ZONE = '-8:0'; SELECT CURRENT_TIMESTAMP, LOCALTIMESTAMP FROM DUAL; • LOCALTIMESTAMP retorna um valor TIMESTAMP, enquanto CURRENT_TIMESTAMP retorna um valor TIMESTAMP WITH TIME ZONE. 16-11 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  467. DBTIMEZONE e SESSIONTIMEZONE • Exibir o valor do fuso horário do banco de dados SELECT DBTIMEZONE FROM DUAL; • Exibir o valor do fuso horário da sessão SELECT SESSIONTIMEZONE FROM DUAL; 16-12 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  468. EXTRACT • Exibir o componente YEAR de SYSDATE. SELECT EXTRACT (YEAR FROM SYSDATE) FROM DUAL; • Exibir o componente MONTH de HIRE_DATE para os funcionários cujo MANAGER_ID é 100. SELECT last_name, hire_date, EXTRACT (MONTH FROM HIRE_DATE) FROM employees WHERE manager_id = 100; 16-13 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  469. Conversão de TIMESTAMP Usando FROM_TZ • Exibir o valor de TIMESTAMP '2000-03-28 08:00:00' como um valor TIMESTAMP WITH TIME ZONE SELECT FROM_TZ(TIMESTAMP '2000-03-28 08:00:00','3:00') FROM DUAL; • Exibir o valor de TIMESTAMP '2000-03-28 08:00:00' como um valor TIMESTAMP WITH TIME ZONE para a região de fuso horário 'Australia/North' SELECT FROM_TZ(TIMESTAMP '2000-03-28 08:00:00', 'Australia/North') FROM DUAL; 16-14 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  470. Conversão de STRING em TIMESTAMP Usando TO_TIMESTAMP e TO_TIMESTAMP_TZ • Exibir a string de caracteres '2000-12-01 11:00:00' como um valor de TIMESTAMP SELECT TO_TIMESTAMP ('2000-12-01 11:00:00', 'YYYY-MM-DD HH:MI:SS') FROM DUAL; • Exibir a string de caracteres '1999-12-01 11:00:00 -8:00' como um valor de TIMESTAMP WITH TIME ZONE SELECT TO_TIMESTAMP_TZ('1999-12-01 11:00:00 -8:00', 'YYYY-MM-DD HH:MI:SS TZH:TZM') FROM DUAL; 16-15 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  471. Conversão de Intervalo de Tempo com TO_YMINTERVAL • Exibir uma data um ano e dois meses posterior à data de admissão dos funcionários que trabalham no departamento com DEPARTMENT_ID 20 SELECT hire_date, hire_date + TO_YMINTERVAL('01-02') AS HIRE_DATE_YMININTERVAL FROM EMPLOYEES WHERE department_id = 20; 16-16 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  472. Resumo Nesta lição, você aprendeu a usar as seguintes funções: Nesta lição, você aprendeu a usar as seguintes funções: • TZ_OFFSET • CURRENT_DATE • FROM_TZ • CURRENT_TIMESTAMP • TO_TIMESTAMP • LOCALTIMESTAMP • TO_TIMESTAMP_TZ • DBTIMEZONE • TO_YMINTERVAL • SESSIONTIMEZONE • EXTRACT 16-17 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  473. Visão Geral do Exercício 16 Este exercício abrange o uso das funções de data/horário no Oracle9i. 16-18 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  474. 17 Aperfeiçoamentos da Cláusula GROUP BY Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  475. Objetivos Após concluir esta lição, você poderá fazer o seguinte: • Usar a operação ROLLUP para produzir valores de subtotais • Usar a operação CUBE para produzir valores de tabulação cruzada • Usar a função GROUPING para identificar os valores de linhas criados por uma operação ROLLUP ou CUBE • Usar GROUPING SETS para produzir um conjunto de resultados simples 17-2 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  476. Revisão de Funções de Grupo As funções de grupo operam em conjuntos de linhas para fornecer um resultado por grupo. SELECT [coluna,] função_de_grupo(coluna). . . FROM tabela [WHERE condição] [GROUP BY expressão_group_by] [ORDER BY coluna]; Exemplo: Exemplo: SELECT AVG(salary), STDDEV(salary), COUNT(commission_pct),MAX(hire_date) FROM employees WHERE job_id LIKE 'SA%'; 17-3 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  477. Revisão da Cláusula GROUP BY Sintaxe: Sintaxe: SELECT [coluna,] função_de_grupo(coluna). . . FROM tabela [WHERE condição] [GROUP BY expressão_group_by] [ORDER BY coluna]; Exemplo: Exemplo: SELECT department_id, job_id, SUM(salary), COUNT(employee_id) FROM employees GROUP BY department_id, job_id ; 17-4 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  478. Revisão da Cláusula HAVING SELECT [coluna,] função_de_grupo(coluna). . . FROM tabela [WHERE condição] [GROUP BY expressão_group_by] [HAVING expressão_having] [ORDER BY coluna]; • Use a cláusula HAVING para especificar os grupos que devem ser exibidos. • Restrinja os grupos com base em uma condição de limite. 17-5 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  479. GROUP BY com os Operadores ROLLUP e CUBE • Use os operadores ROLLUP ou CUBE com a cláusula GROUP BY para produzir linhas superagregadas pela referência cruzada de colunas. • O agrupamento ROLLUP produz um conjunto de resultados que contém as linhas agrupadas normais e os valores de subtotais. • O agrupamento CUBE produz um conjunto de resultados que contém as linhas de ROLLUP e as linhas de tabulação cruzada. 17-6 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  480. Operador ROLLUP SELECT [coluna,] função_de_grupo(coluna). . . FROM tabela [WHERE condição] [GROUP BY [ROLLUP] expressão_group_by] [HAVING expressão_having]; [ORDER BY coluna]; • ROLLUP é uma extensão da cláusula GROUP BY. • Use a operação ROLLUP para produzir agregados cumulativos, como subtotais. 17-7 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  481. Exemplo de Operador ROLLUP SELECT department_id, job_id, SUM(salary) FROM employees WHERE department_id < 60 GROUP BY ROLLUP(department_id, job_id); 1 2 3 17-8 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  482. Operador CUBE SELECT [coluna,] função_de_grupo(coluna). . . FROM tabela [WHERE condição] [GROUP BY [CUBE] expressão_group_by] [HAVING expressão_having] [ORDER BY coluna]; • CUBE é uma extensão da cláusula GROUP BY. • Você pode usar o operador CUBE para produzir valores de tabulação cruzada com uma instrução SELECT simples. 17-9 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  483. Operador CUBE: Exemplo SELECT department_id, job_id, SUM(salary) FROM employees WHERE department_id < 60 GROUP BY CUBE (department_id, job_id) ; 1 2 3 4 17-10 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  484. Função GROUPING SELECT [coluna,] função_de_grupo(coluna) . , GROUPING(expr) FROM tabela [WHERE condição] [GROUP BY [ROLLUP][CUBE] expressão_group_by] [HAVING expressão_having] [ORDER BY coluna]; • É possível usar a função GROUPING com o operador CUBE ou ROLLUP. • Com a função GROUPING, você pode localizar os grupos que formam o subtotal em uma linha. • Com a função GROUPING, você pode diferenciar valores NULL armazenados de valores NULL criados pelo operador ROLLUP ou CUBE. • A função GROUPING retorna 0 ou 1. 17-11 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  485. 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); 1 2 3 17-13 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  486. GROUPING SETS • GROUPING SETS é uma extensão adicional da cláusula GROUP BY. • Você pode usar GROUPING SETS para definir vários agrupamentos na mesma consulta. • O Oracle Server calcula todos os agrupamentos especificados na cláusula GROUPING SETS e combina os resultados de agrupamentos individuais com uma operação UNION ALL. • Eficiência do conjunto de agrupamentos: – É necessária apenas uma análise da tabela-base. – Não é necessário criar instruções UNION complexas. – Quanto mais elementos a cláusula GROUPING SETS tiver, maior será o desempenho. 17-14 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  487. GROUPING SETS: Exemplo SELECT department_id, job_id, manager_id,avg(salary) FROM employees GROUP BY GROUPING SETS ((department_id,job_id), (job_id,manager_id)); 1 … 2 17-16 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  488. Colunas Compostas • Uma coluna composta é um conjunto de colunas tratadas como uma unidade. ROLLUP (a,(b,c), d) (b,c) • Para especificar colunas compostas, use a cláusula GROUP BY a fim de agrupar colunas entre parênteses de modo que o servidor Oracle trate essas colunas como uma unidade quando calcula operações ROLLUP ou CUBE. • Quando usadas com ROLLUP ou CUBE, as colunas compostas significam que a agregação é ignorada em alguns níveis. 17-18 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  489. Colunas Compostas: Exemplo SELECT department_id, job_id, manager_id, SUM(salary) FROM employees GROUP BY ROLLUP( department_id,(job_id, manager_id)); 2 1 … 3 17-20 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  490. Agrupamentos Concatenados • Os agrupamentos concatenados oferecem uma maneira concisa de gerar combinações de agrupamentos úteis. • Para especificar conjuntos de agrupamentos concatenados, separe vários conjuntos de agrupamentos e operações ROLLUP e CUBE por vírgulas de modo que o Oracle Server combine-os em uma cláusula GROUP BY simples. • O resultado é um produto híbrido de agrupamentos de cada conjunto de agrupamentos. GROUP BY GROUPING SETS(a, b), GROUPING SETS(c, d) 17-22 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  491. Exemplo de Agrupamentos Concatenados SELECT department_id, job_id, manager_id, SUM(salary) FROM employees GROUP BY department_id, ROLLUP(job_id), CUBE(manager_id); 1 … 2 … 3 … 4 17-23 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  492. Resumo Nesta lição, você aprendeu a: • Usar a operação ROLLUP para produzir valores de subtotais • Usar a operação CUBE para produzir valores de tabulação cruzada • Usar a função GROUPING para identificar os valores de linhas criados por uma operação ROLLUP ou CUBE • Usar a sintaxe GROUPING SETS para definir vários agrupamentos na mesma consulta • Usar a cláusula GROUP BY para combinar expressões de várias maneiras: – Colunas compostas – Conjuntos de agrupamentos concatenados 17-24 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  493. Visão Geral do Exercício 17 Este exercício abrange os seguintes tópicos: • Uso do operador ROLLUP • Uso do operador CUBE • Uso da função GROUPING • Uso de GROUPING SETS 17-25 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  494. 18 Subconsultas Avançadas Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  495. Objetivos Após concluir esta lição, você poderá fazer o seguinte: • Criar uma subconsulta de várias colunas • Descrever e explicar o comportamento de subconsultas quando valores nulos são recuperados • Criar uma subconsulta em uma cláusula FROM • Usar subconsultas escalares em SQL • Descrever os tipos de problemas que as subconsultas correlacionadas podem solucionar • Criar subconsultas correlacionadas • Atualizar e deletar linhas usando subconsultas correlacionadas • Usar os operadores EXISTS e NOT EXISTS • Usar a cláusula WITH 18-2 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  496. O que é uma Subconsulta? Uma subconsulta é uma instrução SELECT incorporada a uma cláusula de outra instrução SQL. Consulta SELECT ... principal FROM ... WHERE ... (SELECT ... Subconsulta FROM ... WHERE ...) 18-3 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  497. Subconsultas SELECT lista_de_seleção FROM tabela WHERE expr operador (SELECT lista_de_seleção FROM tabela); • A subconsulta (consulta interna) é executada uma vez antes da consulta principal. • O resultado da subconsulta é usado pela consulta principal (consulta externa). 18-4 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  498. Usando uma Subconsulta SELECT last_name FROM employees 10500 WHERE salary > (SELECT salary FROM employees WHERE employee_id = 149) ; 18-5 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  499. Subconsultas de Várias Colunas Consulta principal WHERE (MANAGER_ID, DEPARTMENT_ID) IN Subconsulta 100 90 102 60 124 50 Cada linha da consulta principal é comparada a valores de uma subconsulta de várias linhas e colunas. 18-6 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  500. Comparações de Coluna As comparações de coluna em uma subconsulta de várias colunas podem ser: • Comparações emparelhadas • Comparações não-emparelhadas 18-7 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  501. Subconsulta de Comparação Emparelhada Exiba os detalhes dos funcionários que são gerenciados pelo mesmo gerente e que trabalham no mesmo departamento que os funcionários com EMPLOYEE_ID 178 ou 174. SELECT employee_id, manager_id, department_id FROM employees WHERE (manager_id, department_id) IN (SELECT manager_id, department_id FROM employees WHERE employee_id IN (178,174)) AND employee_id NOT IN (178,174); 18-8 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  502. Subconsulta de Comparação Não-emparelhada Exiba os detalhes dos funcionários que são gerenciados pelo mesmo gerente e que trabalham no mesmo departamento que os funcionários com EMPLOYEE_ID 174 ou 141. SELECT employee_id, manager_id, department_id FROM employees WHERE manager_id IN (SELECT manager_id FROM employees WHERE employee_id IN (174,141)) AND department_id IN (SELECT department_id FROM employees WHERE employee_id IN (174,141)) AND employee_id NOT IN(174,141); 18-9 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  503. Usando uma Subconsulta na Cláusula FROM SELECT a.last_name, a.salary, a.department_id, b.salavg FROM employees a, (SELECT department_id, AVG (salary) salavg FROM employees GROUP BY department_id) b WHERE a.department_id = b.department_id AND a.salary > b.salavg; 18-10 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  504. Expressões de Subconsulta Escalar • Uma expressão de subconsulta escalar é uma subconsulta que retorna exatamente um valor de coluna de uma linha. • As subconsultas escalares eram suportadas no Oracle8i somente em um número limitado de casos, por exemplo, em: – Uma instrução SELECT (cláusulas FROM e WHERE) – Uma lista VALUES de uma instrução INSERT • No Oracle9i, é possível usar subconsultas escalares em: – Uma condição e uma parte de expressão de DECODE e CASE – Todas as cláusulas SELECT, exceto GROUP BY 18-11 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  505. Subconsultas Escalares: Exemplos Subconsultas Escalares em Expressões CASE SELECT employee_id, last_name, (CASE 20 WHEN department_id = (SELECT department_id FROM departments WHERE location_id = 1800) THEN 'Canada' ELSE 'USA' END) location FROM employees; Subconsultas Escalares em Cláusulas ORDER BY Subconsultas Escalares em Cláusulas ORDER BY SELECT employee_id, last_name FROM employees e ORDER BY (SELECT department_name FROM departments d WHERE e.department_id = d.department_id); 18-12 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  506. Subconsultas Correlacionadas As subconsultas correlacionadas são usadas para processamento por linha. Cada subconsulta é executa uma vez para cada linha da consulta externa. GET linha candidata da consulta externa EXECUTE consulta interna que usa o valor da linha candidata USE valores da consulta interna para qualificar ou desqualificar a linha candidata 18-14 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  507. Subconsultas Correlacionadas SELECT coluna1, coluna2, ... FROM tabela1 externa WHERE coluna1 operador (SELECT coluna1, coluna2 FROM tabela2 WHERE expr1 = Externa .expr2); A subconsulta faz referência a uma coluna de uma tabela A subconsulta faz referência a uma coluna de uma tabela na consulta mãe. na consulta mãe. 18-15 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  508. Usando Subconsultas Correlacionadas Localize todos os funcionários que ganham acima do salário médio de seus respectivos departamentos. SELECT last_name, salary, department_id FROM employees outer WHERE salary > (SELECT AVG(salary) FROM employees WHERE department_id = outer.department_id) ; Sempre que uma linha da consulta externa for processada, a consulta interna será avaliada. 18-16 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  509. Usando Subconsultas Correlacionadas Exiba detalhes dos funcionários que mudaram de cargo no mínimo duas vezes. SELECT e.employee_id, last_name,e.job_id FROM employees e WHERE 2 <= (SELECT COUNT(*) FROM job_history WHERE employee_id = e.employee_id); 18-17 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  510. Usando o Operador EXISTS • O operador EXISTS testa a existência de linhas no conjunto de resultados da subconsulta. • Se o valor da linha de uma subconsulta for encontrado: – A pesquisa na consulta interna não continuará – A condição será indicada por um flag TRUE • Se o valor de linha de uma subconsulta não for encontrado: – A condição será indicada por um flag FALSE – A pesquisa continuará na consulta interna 18-18 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  511. Usando o Operador EXISTS Localize os funcionários com no mínimo uma pessoa subordinada a eles. SELECT employee_id, last_name, job_id, department_id FROM employees outer WHERE EXISTS ( SELECT 'X' FROM employees WHERE manager_id = outer.employee_id); 18-19 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  512. Usando o Operador NOT EXISTS Localize todos os departamentos sem funcionários. SELECT department_id, department_name FROM departments d WHERE NOT EXISTS (SELECT 'X' FROM employees WHERE department_id = d.department_id); 18-20 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  513. UPDATE Correlacionada UPDATE tabela1 apelido1 SET coluna = (SELECT expressão FROM tabela2 apelido2 WHERE apelido1.coluna = apelido2.coluna); Use uma subconsulta correlacionada para atualizar as linhas de uma tabela com base nas linhas de outra tabela. 18-21 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  514. UPDATE Correlacionada • Altere o padrão da tabela EMPLOYEES adicionando uma coluna para armazenar o nome do departamento. • Preencha a tabela usando uma atualização correlacionada. ALTER TABLE employees ADD(department_name VARCHAR2(14)); UPDATE employees e SET department_name = (SELECT department_name FROM departments d WHERE e.department_id = d.department_id); 18-22 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  515. DELETE Correlacionada DELETE FROM tabela1 apelido1 WHERE coluna operador (SELECT expressão FROM tabela2 apelido2 WHERE apelido1.coluna = apelido2.coluna); Use uma subconsulta correlacionada para deletar linhas de uma tabela com base nas linhas de outra tabela. 18-24 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  516. DELETE Correlacionada Use uma subconsulta correlacionada para deletar somente as linhas da tabela EMPLOYEES que também existem na tabela EMP_HISTORY. DELETE FROM employees E WHERE employee_id = (SELECT employee_id FROM emp_history WHERE employee_id = E.employee_id); 18-25 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  517. A Cláusula WITH • Com a cláusula WITH, você poderá usar o mesmo bloco de consultas em uma instrução SELECT quando ele ocorrer mais de uma vez em uma consulta complexa. • A cláusula WITH recupera os resultados de um bloco de consultas e os armazena no tablespace temporário do usuário. • A cláusula WITH melhora o desempenho. 18-26 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  518. Cláusula WITH: Exemplo Com a cláusula WITH, crie uma consulta para exibir o nome do departamento e os salários totais dos departamentos cujo salário total é maior que o salário médio de todos os departamentos. 18-27 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  519. Cláusula WITH: Exemplo WITH dept_costs 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), avg_cost AS ( SELECT SUM(dept_total)/COUNT(*) AS dept_avg FROM dept_costs) SELECT * FROM dept_costs WHERE dept_total > (SELECT dept_avg FROM avg_cost) ORDER BY department_name; 18-28 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  520. Resumo Nesta lição, você aprendeu que: • Uma subconsulta de várias colunas retorna mais de uma coluna. • As comparações de várias colunas podem ser emparelhadas ou não-emparelhadas. • Uma subconsulta de várias colunas também pode ser usada na cláusula FROM de uma instrução SELECT. • As subconsultas escalares foram aperfeiçoadas no Oracle9i. 18-30 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  521. Resumo • As subconsultas correlacionadas são úteis sempre que uma subconsulta precisar retornar um resultado diferente para cada linha candidata. • O operador EXISTS é um operador booleano que testa a presença de um valor. • É possível usar subconsultas correlacionadas com instruções SELECT, UPDATE e DELETE. • Você pode usar a cláusula WITH para usar o mesmo bloco de consultas em uma instrução SELECT quando ele ocorre mais de uma vez. 18-31 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  522. Visão Geral do Exercício 18 Este exercício abrange os seguintes tópicos: • Criando subconsultas de várias colunas • Criando subconsultas correlacionadas • Usando o operador EXISTS • Usando subconsultas escalares • Usando a cláusula WITH 18-32 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  523. 19 Recuperação Hierárquica Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  524. Objetivos Após concluir esta lição, você poderá fazer o seguinte: • Interpretar o conceito de uma consulta hierárquica • Criar um relatório estruturado em árvore • Formatar dados hierárquicos • Excluir ramificações da estrutura em árvore 19-2 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  525. Dados de Amostra da Tabela EMPLOYEES 19-3 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  526. Estrutura em Árvore Natural EMPLOYEE_ID = 100 (Pai) King MANAGER_ID = 100 (Filho) Kochhar De Hann Mourgos Zlotkey Hartstein Whalen Higgins Hunold Rajs Davies Matos Vargas Fay Gietz Abel Taylor Grant Ernst Lorentz 19-4 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  527. Consultas Hierárquicas SELECT [LEVEL], coluna, expr... FROM tabela [WHERE condição(ões)] [START WITH condição(ões)] [CONNECT BY PRIOR condição(ões)] ; WHERE condição: WHERE condição: expr operador_de_comparação expr 19-5 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  528. Percorrendo a Árvore Ponto Inicial • Especificar a condição que deve ser atendida • Aceitar qualquer condição válida START WITH coluna1 = valor Usando a tabela EMPLOYEES, comece com o funcionário cujo sobrenome é Kochhar. ...START WITH last_name = 'Kochhar' 19-6 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  529. Percorrendo a Árvore CONNECT BY PRIOR coluna1 = coluna2 Percorra a árvore de cima para baixo usando a Percorra a árvore de cima para baixo usando a tabela EMPLOYEES. tabela EMPLOYEES. ... CONNECT BY PRIOR employee_id = manager_id Direção De cima Coluna1 = Chave mãe para baixo Coluna2 = Chave filha De baixo Coluna1 = Chave filha para cima Coluna2 = Chave mãe 19-7 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  530. Percorrendo a Árvore: de Baixo para Cima SELECT employee_id, last_name, job_id, manager_id FROM employees START WITH employee_id = 101 CONNECT BY PRIOR manager_id = employee_id ; 19-8 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  531. Percorrendo a Árvore: de Cima para Baixo SELECT last_name||' reports to '|| PRIOR last_name \"Walk Top Down\" FROM employees START WITH last_name='King' CONNECT BY PRIOR employee_id = manager_id ; … 19-9 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  532. Classificando Linhas com a Pseudocoluna LEVEL Nível 1 raiz/mãe King Nível 2 mãe/filha Kochhar De Hann Mourgos Zlotkey Hartstein Nível 3 mãe/filha Whalen Higgins Hunold Rajs Davies Matos Vargas /folha Fay Gietz Nível 4 Abel Taylor Grant Ernst Lorentz folha 19-10 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  533. Formatando Relatórios Hierárquicos Usando LEVEL e LPAD Criar um relatório que exiba os níveis de gerenciamento da empresa, começando com o nível mais alto e recuando cada um dos níveis a seguir. COLUMN org_chart FORMAT A12 SELECT LPAD(last_name, LENGTH(last_name)+(LEVEL*2)-2,'_') AS org_chart FROM employees START WITH last_name='King' CONNECT BY PRIOR employee_id=manager_id 19-11 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  534. Compactando Ramificações Usar a cláusula WHERE Usar a cláusula CONNECT BY para eliminar um nó. para eliminar uma ramificação. WHERE last_name != 'Higgins' CONNECT BY PRIOR employee_id = manager_id Kochhar AND last_name != 'Higgins' Kochhar Whalen Higgins Whalen Higgins Gietz Gietz 19-13 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  535. Resumo Nesta lição, você aprendeu a: • Usar as consultas hierárquicas para exibir um relacionamento hierárquico entre as linhas de uma tabela. • Especificar a direção e o ponto inicial da consulta. • Compactar nós ou ramificações. 19-14 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  536. Visão Geral do Exercício 19 Este exercício abrange os seguintes tópicos: • Distinguindo consultas hierárquicas de consultas não hierárquicas • Percorrendo uma árvore • Produzindo um relatório recuado com a pseudocoluna LEVEL • Compactando ramificações da estrutura da árvore • Classificando a saída 19-15 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  537. 20 Extensões do Oracle9i para Instruções DML e DDL Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  538. Objetivos Após concluir esta lição, você poderá fazer o seguinte: • Descrever os recursos de inserções multitabelas • Usar os seguintes tipos de inserções multitabelas: – INSERT incondicional – INSERT de criação de pivôs – ALL INSERT condicional – FIRST INSERT condicional • Criar e usar tabelas externas • Nomear o índice durante a criação de uma restrição de chave primária 20-2 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  539. Revisão da Instrução INSERT • Adicione novas linhas a uma tabela usando a instrução INSERT. INSERT INTO INSERT INTO tabela tabela [(coluna [, coluna...])] [(coluna [, coluna...])] VALUES VALUES (valor (valor [, valor...]); [, valor...]); • Somente uma linha é inserida por vez com esta sintaxe. INSERT INTO departments(department_id, department_name, manager_id, location_id) VALUES (70, 'Public Relations', 100, 1700); 1 row created. 20-3 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  540. Revisão da Instrução UPDATE • Modifique linhas existentes com a instrução UPDATE. UPDATE UPDATE tabela tabela SET SET coluna = valor [, coluna = valor, ...] coluna = valor [, coluna = valor, ...] [WHERE [WHERE condição]; condição]; • Atualize mais de uma linha por vez, se necessário. • Uma ou mais linhas específicas serão modificadas se você especificar a cláusula WHERE. UPDATE employees SET department_id = 70 WHERE employee_id = 142; 1 row updated. 20-4 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  541. Visão Geral das Instruções INSERT Multitabelas • É possível usar a instrução INSERT...SELECT para inserir linhas em várias tabelas como parte de uma única instrução DML. • É possível usar instruções INSERT multitabelas em sistemas de data warehouse para transferir dados de uma ou mais origens operacionais para um conjunto de tabelas de destino. • Elas fornecem uma melhoria significativa de desempenho em: – Uma única instrução DML versus várias instruções INSERT...SELECT – Uma única instrução DML versus um procedimento para executar várias inserções com a sintaxe IF...THEN 20-5 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  542. Tipos de Instruções INSERT Multitabelas O Oracle9i apresenta os seguintes tipos de instruções INSERT multitabelas: INSERT incondicional ALL INSERT condicional FIRST INSERT condicional INSERT de criação de pivôs 20-7 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  543. Instruções INSERT Multitabelas Sintaxe INSERT [ALL] [conditional_insert_clause] [insert_into_clause values_clause] (subconsulta) conditional_insert_clause [ALL] [FIRST] [WHEN condição THEN] [insert_into_clause values_clause] [ELSE] [insert_into_clause values_clause] 20-8 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  544. INSERT ALL Incondicional • Selecione os valores de EMPLOYEE_ID, HIRE_DATE, SALARY e MANAGER_ID da tabela EMPLOYEES para os funcionários cujo EMPLOYEE_ID é maior que 200. • Insira esses valores nas tabelas SAL_HISTORY e MGR_HISTORY usando um INSERT multitabelas. INSERT ALL 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; 8 rows created. 20-10 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  545. INSERT ALL Condicional • Selecione os valores de EMPLOYEE_ID, HIRE_DATE, SALARY e MANAGER_ID da tabela EMPLOYEES para os funcionários com EMPLOYEE_ID maior que 200. • Se SALARY for superior a US$ 10.000, insira esses valores na tabela SAL_HISTORY usando uma instrução INSERT multitabelas condicional. • Se MANAGER_ID for maior que 200, insira esses valores na tabela MGR_HISTORY usando uma instrução INSERT multitabelas condicional. 20-11 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  546. INSERT ALL Condicional INSERT ALL WHEN SAL > 10000 THEN INTO sal_history VALUES(EMPID,HIREDATE,SAL) WHEN MGR > 200 THEN INTO mgr_history VALUES(EMPID,MGR,SAL) SELECT employee_id EMPID,hire_date HIREDATE, salary SAL, manager_id MGR FROM employees WHERE employee_id > 200; 4 rows created. 20-12 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  547. FIRST INSERT Condicional • Selecione DEPARTMENT_ID, SUM(SALARY) e MAX(HIRE_DATE) na tabela EMPLOYEES. • Se SUM(SALARY) for superior a US$ 25.000, insira esses valores em SPECIAL_SAL, usando uma instrução INSERT multitabelas FIRST condicional. • Se a primeira cláusula WHEN for avaliada como verdadeira, as cláusulas WHEN subseqüentes para essa linha serão ignoradas. • Insira as linhas que não atendem à primeira condição WHEN na tabela HIREDATE_HISTORY_00, HIREDATE_HISTORY_99 ou HIREDATE_HISTORY, com base no valor da coluna HIRE_DATE usando uma instrução INSERT multitabelas condicional. 20-13 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  548. FIRST INSERT Condicional INSERT FIRST WHEN SAL > 25000 THEN INTO special_sal VALUES(DEPTID, SAL) WHEN HIREDATE like ('%00%') THEN INTO hiredate_history_00 VALUES(DEPTID,HIREDATE) WHEN HIREDATE like ('%99%') THEN INTO hiredate_history_99 VALUES(DEPTID, HIREDATE) ELSE INTO hiredate_history VALUES(DEPTID, HIREDATE) SELECT department_id DEPTID, SUM(salary) SAL, MAX(hire_date) HIREDATE FROM employees GROUP BY department_id; 8 rows created. 20-14 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  549. INSERT de Criação de Pivôs • Suponha que você receba um conjunto de registros de vendas de uma tabela de banco de dados não relacional, SALES_SOURCE_DATA, no seguinte formato: EMPLOYEE_ID, WEEK_ID, SALES_MON, SALES_TUE, SALES_WED, SALES_THUR, SALES_FRI • Você poderia armazenar esses registros na tabela SALES_INFO em um formato relacional mais típico: EMPLOYEE_ID, WEEK, SALES • Usando um INSERT de criação de pivôs, converta o conjunto de registros de vendas da tabela de banco de dados não relacional no formato relacional. 20-15 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  550. INSERT de Criação de Pivôs INSERT ALL INTO sales_info VALUES (employee_id,week_id,sales_MON) INTO sales_info VALUES (employee_id,week_id,sales_TUE) INTO sales_info VALUES (employee_id,week_id,sales_WED) INTO sales_info VALUES (employee_id,week_id,sales_THUR) INTO sales_info VALUES (employee_id,week_id, sales_FRI) SELECT EMPLOYEE_ID, week_id, sales_MON, sales_TUE, sales_WED, sales_THUR,sales_FRI FROM sales_source_data; 5 rows created. 20-16 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  551. Tabelas Externas • As tabelas externas são tabelas somente para leitura nas quais os dados são armazenados fora do banco de dados em arquivos simples. • Os metadados para uma tabela externa são criados com uma instrução CREATE TABLE. • Com a ajuda de tabelas externas, os dados Oracle podem ser armazenados ou descarregados como arquivos simples. • Você pode consultar os dados usando SQL, mas não pode usar DML nem criar índices. 20-18 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  552. Criando uma Tabela Externa • Use external_table_clause com a sintaxe CREATE TABLE para criar uma tabela externa. • Especifique ORGANIZATION como EXTERNAL para indicar que a tabela está localizada fora do banco de dados. • external_table_clause consiste nos drivers de acesso TYPE, external_data_properties e REJECT LIMIT. • external_data_properties consiste no seguinte: – DEFAULT DIRECTORY – ACCESS PARAMETERS – LOCATION 20-19 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  553. Exemplo de Criação de uma Tabela Externa Crie um objeto DIRECTORY que corresponda ao diretório no sistema de arquivos no qual a origem de dados externa reside. CREATE DIRECTORY emp_dir AS '/flat_files' ; 20-21 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  554. Exemplo de Criação de uma Tabela Externa CREATE TABLE oldemp ( empno NUMBER, empname CHAR(20), birthdate DATE) ORGANIZATION EXTERNAL (TYPE ORACLE_LOADER DEFAULT DIRECTORY emp_dir ACCESS PARAMETERS (RECORDS DELIMITED BY NEWLINE BADFILE 'bad_emp' LOGFILE 'log_emp' FIELDS TERMINATED BY ',' (empno CHAR, empname CHAR, birthdate CHAR date_format date mask \"dd-mon-yyyy\")) LOCATION ('emp1.txt')) PARALLEL 5 REJECT LIMIT 200; Table created. 20-23 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  555. Consultando Tabelas Externas SELECT * FROM oldemp emp1.txt 20-25 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  556. CREATE INDEX com a Instrução CREATE TABLE CREATE TABLE NEW_EMP (employee_id NUMBER(6) PRIMARY KEY USING INDEX (CREATE INDEX emp_id_idx ON NEW_EMP(employee_id)), first_name VARCHAR2(20), last_name VARCHAR2(25)); Table created. SELECT INDEX_NAME, TABLE_NAME FROM USER_INDEXES WHERE TABLE_NAME = 'NEW_EMP'; 20-26 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  557. Resumo Nesta lição, você aprendeu a: • Usar a instrução INSERT…SELECT para inserir linhas em várias tabelas como parte de uma única instrução DML • Criar tabelas externas • Nomear índices com a instrução CREATE INDEX e a instrução CREATE TABLE 20-27 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  558. Visão Geral do Exercício 20 Este exercício abrange os seguintes tópicos: • Criando instruções INSERT incondicionais • Criando instruções ALL INSERT incondicionais • Instruções INSERT de criação de pivôs • Criando índices junto com o comando CREATE TABLE 20-28 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  559. C Usando o SQL*Plus Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  560. Objetivos Objetivos Após concluir este apêndice, você poderá fazer Após concluir este apêndice, você poderá fazer o seguinte: o seguinte: • Efetuar logon no SQL*Plus • Efetuar logon no SQL*Plus • • Editar comandos SQL Editar comandos SQL • • Formatar saídas usando comandos do SQL*Plus Formatar saídas usando comandos do SQL*Plus • • Interagir com arquivos de script Interagir com arquivos de script C-2 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  561. Interação entre SQL e SQL*Plus Interação entre SQL e SQL*Plus Instruções SQL Servidor SQL*Plus Resultados da consulta Buffer Scripts SQL C-3 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  562. Instruções SQL Versus Instruções SQL Versus Comandos do SQL*Plus Comandos do SQL*Plus SQL SQL*Plus • Uma linguagem • Um ambiente • Padrão ANSI • Patenteado pela Oracle • As palavras-chave não • As palavras-chave podem podem ser abreviadas ser abreviadas • As instruções • Os comandos não manipulam definições permitem a manipulação de dados e tabela no dos valores no banco banco de dados de dados Instruções Buffer Comandos do Buffer do SQL SQL SQL*Plus SQL*Plus C-5 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  563. Visão Geral do SQL*Plus Visão Geral do SQL*Plus • • Efetuar logon no SQL*Plus. Efetuar logon no SQL*Plus. • • Descrever a estrutura de tabela. Descrever a estrutura de tabela. • • Editar a instrução SQL. Editar a instrução SQL. • • Executar o código SQL a partir do SQL*Plus. Executar o código SQL a partir do SQL*Plus. • • Salvar as instruções SQL em arquivos e anexar Salvar as instruções SQL em arquivos e anexar as instruções SQL a arquivos. as instruções SQL a arquivos. • • Executar arquivos salvos. Executar arquivos salvos. • • Carregar comandos do arquivo para o buffer Carregar comandos do arquivo para o buffer e editá-los. e editá-los. C-6 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  564. Efetuando Logon no SQL*Plus Efetuando Logon no SQL*Plus • Em um ambiente Windows: • Em uma linha de comandos: sqlplus [nome_do_usuário[/senha [@banco_de_dados]]] C-7 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  565. Exibindo a Estrutura de Tabela Exibindo a Estrutura de Tabela Use o comando DESCRIBE do SQL*Plus para exibir a Use o comando DESCRIBE do SQL*Plus para exibir a estrutura de uma tabela. estrutura de uma tabela. DESC[RIBE] nome_da_tabela C-9 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  566. Exibindo a Estrutura de Tabela Exibindo a Estrutura de Tabela SQL> DESCRIBE departments Name Null? Type ----------------------- -------- ------------ DEPARTMENT_ID NOT NULL NUMBER(4) DEPARTMENT_NAME NOT NULL VARCHAR2(30) MANAGER_ID NUMBER(6) LOCATION_ID NUMBER(4) C-10 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  567. Comandos de Edição do SQL*Plus Comandos de Edição do SQL*Plus • • A[PPEND] A[PPEND] texto texto • • C[HANGE] C[HANGE] / antigo / novo / antigo / novo • • C[HANGE] / texto / C[HANGE] / texto / • • CL[EAR] BUFF[ER] CL[EAR] BUFF[ER] • • DEL DEL • • DEL n DEL n • • DEL m n DEL m n C-11 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  568. Comandos de Edição do SQL*Plus Comandos de Edição do SQL*Plus • • I[NPUT] I[NPUT] • • I[NPUT] texto I[NPUT] texto • • L[IST] L[IST] • • L[IST] n L[IST] n • • L[IST] m n L[IST] m n • • R[UN] R[UN] • • n n • • n texto n texto • • 0 texto 0 texto C-12 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  569. Usando LIST, n e APPEND Usando LIST, n e APPEND SQL> LIST 1 SELECT last_name 2* FROM employees SQL> 1 1* SELECT last_name SQL> A , job_id 1* SELECT last_name, job_id SQL> L 1 SELECT last_name, job_id 2* FROM employees C-13 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  570. Usando o Comando CHANGE Usando o Comando CHANGE SQL> L 1* SELECT * from employees SQL> c/employees/departments 1* SELECT * from departments SQL> L 1* SELECT * from departments C-14 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  571. Comandos de Arquivo do SQL*Plus Comandos de Arquivo do SQL*Plus • • SAVE nome_de_arquivo SAVE nome_de_arquivo • • GET nome_de_arquivo GET nome_de_arquivo • • START nome_de_arquivo START nome_de_arquivo • • @ nome_de_arquivo @ nome_de_arquivo • • EDIT nome_de_arquivo EDIT nome_de_arquivo • • SPOOL nome_de_arquivo SPOOL nome_de_arquivo • • EXIT EXIT C-15 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  572. Usando os Comandos SAVE e START Usando os Comandos SAVE e START SQL> L 1 SELECT last_name, manager_id, department_id 2* FROM employees SQL> SAVE my_query Created file my_query SQL> START my_query LAST_NAME MANAGER_ID DEPARTMENT_ID ------------------------- ---------- ------------- King 90 Kochhar 100 90 ... 20 rows selected. C-17 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  573. Resumo Resumo Use o SQL*Plus como um ambiente para: Use o SQL*Plus como um ambiente para: • Executar instruções SQL • Executar instruções SQL • • Editar instruções SQL Editar instruções SQL • • Formatar a saída Formatar a saída • • Interagir com arquivos de script Interagir com arquivos de script C-18 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  574. D Criando Scripts Avançados Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  575. Objetivos Após concluir este apêndice, você poderá fazer o seguinte: • Descrever os tipos de problemas solucionados usando o SQL para gerar SQL • Criar um script que gere um script de instruções DROP TABLE • Criar um script que gere um script de instruções INSERT INTO D-2 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  576. Usando o SQL para Gerar SQL Dicionário SQL de dados Script SQL • • O SQL pode ser usado para gerar scripts em SQL O SQL pode ser usado para gerar scripts em SQL • • O dicionário de dados O dicionário de dados – É um conjunto de tabelas e views que contém – É um conjunto de tabelas e views que contém informações sobre o banco de dados informações sobre o banco de dados – É criado e mantido pelo servidor Oracle – É criado e mantido pelo servidor Oracle D-3 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  577. Criando um Script Básico SELECT 'CREATE TABLE ' || table_name || '_test ' || 'AS SELECT * FROM ' || table_name ||' WHERE 1=2;' AS \"Create Table Script\" FROM user_tables; D-5 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  578. Controlando o Ambiente SET ECHO OFF SET FEEDBACK OFF Defina variáveis do SET PAGESIZE 0 sistema como valores apropriados. SPOOL dropem.sql INSTRUÇÃO SQL SPOOL OFF SET FEEDBACK ON SET PAGESIZE 24 Redefina variáveis SET ECHO ON do sistema para o valor default. D-6 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  579. O Quadro Geral SET ECHO OFF SET FEEDBACK OFF SET PAGESIZE 0 SELECT 'DROP TABLE ' || object_name || ';' FROM user_objects WHERE object_type = 'TABLE' / SET FEEDBACK ON SET PAGESIZE 24 SET ECHO ON D-7 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  580. Efetuando um Dump do Conteúdo de uma Tabela para um Arquivo SET HEADING OFF ECHO OFF FEEDBACK OFF SET PAGESIZE 0 SELECT 'INSERT INTO departments_test VALUES (' || department_id || ', ''' || department_name || ''', ''' || location_id || ''');' AS \"Insert Statements Script\" FROM departments / SET PAGESIZE 24 SET HEADING ON ECHO ON FEEDBACK ON D-8 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  581. Efetuando um Dump do Conteúdo de uma Tabela para um Arquivo Origem Resultado '''X''' 'X' '''' ' ''''||department_name||'''' 'Administration' ''', ''' ',' ''');' '); D-9 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  582. Gerando um Predicado Dinâmico COLUMN my_col NEW_VALUE dyn_where_clause SELECT DECODE('&&deptno', null, DECODE ('&&hiredate', null, ' ', 'WHERE hire_date=TO_DATE('''||'&&hiredate'',''DD-MON-YYYY'')'), DECODE ('&&hiredate', null, 'WHERE department_id = ' || '&&deptno', 'WHERE department_id = ' || '&&deptno' || ' AND hire_date = TO_DATE('''||'&&hiredate'',''DD-MON-YYYY'')')) AS my_col FROM dual; SELECT last_name FROM employees &dyn_where_clause; D-10 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  583. Resumo Neste apêndice, você aprendeu o seguinte: • É possível criar um script SQL para gerar outro script SQL • Os arquivos de script geralmente usam o dicionário de dados • Você pode capturar a saída em um arquivo D-12 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  584. Visão Geral do Exercício D Este exercício abrange os seguintes tópicos: • Criar um script para descrever e selecionar os dados das suas tabelas • Criar um script para revogar privilégios de usuários D-13 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  585. E Componentes Arquitetônicos do Oracle Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  586. Objetivos Após concluir este apêndice, você poderá fazer o seguinte: • Descrever a arquitetura do Oracle Server e seus principais componentes • Listar as estruturas envolvidas ao conectar um usuário a uma instância Oracle • Listar os estágios no processamento de: – Consultas – Instruções DML – Commits E-2 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  587. Visão Geral Visão Geral Instância Processo do usuário SGA Pool compartilhado Cache de Cache de biblioteca Buffer de buffer de Processo redo log Cache do dados do servidor dic. de dados PGA SMON DBW0 PMON CKPT LGWR Outros Arquivos Arquivos Arquivos Arquivo de de de parâmetros de dados controle redo log Arquivos de log Arquivo redo log de senhas Banco de Dados E-3 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  588. Arquivos de Bancos de Dados Oracle Arquivos de Bancos de Dados Oracle Arquivos Arquivos Arquivos de de Arquivo de de dados controle redo log parâmetros Arquivos de log redo log Arquivo de senhas Banco de Dados E-5 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  589. Outras Estruturas Físicas Importantes Outras Estruturas Físicas Importantes Arquivo de parâmetros Arquivos de log redo log Arquivo de senhas Banco de Dados E-6 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  590. Instância Oracle Instância Oracle Uma instância Oracle: Uma instância Oracle: • É uma forma de acessar um banco de dados Oracle • É uma forma de acessar um banco de dados Oracle • • Sempre abre apenas um banco de dados Sempre abre apenas um banco de dados Instância SGA Pool compartilhado Estruturas Cache de de memória Buffer de buffer de redo log dados SMON DBW0 PMON CKPT LGWR Outros Processos de segundo plano E-7 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  591. Processando uma Instrução SQL Processando uma Instrução SQL • • Conecte-se a uma instância usando: Conecte-se a uma instância usando: – O processo do usuário – O processo do usuário – O processo do servidor – O processo do servidor • • Os componentes do Oracle Server que são Os componentes do Oracle Server que são usados dependem do tipo de instrução SQL: usados dependem do tipo de instrução SQL: – As consultas retornam linhas – As consultas retornam linhas – – As instruções DML registram alterações As instruções DML registram alterações – – O commit garante a recuperação da transação O commit garante a recuperação da transação • • Alguns componentes do Oracle Server não Alguns componentes do Oracle Server não participam do processamento de instruções SQL participam do processamento de instruções SQL E-9 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  592. Conectando-se a uma Instância Conectando-se a uma Instância Usuário Servidor Servidor Oracle Usuário Servidor Cliente Application server Servidor Usuário Servidor Browser E-10 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  593. Processando uma Consulta Processando uma Consulta • • Análise: Análise: – Procurar instrução idêntica – Procurar instrução idêntica – – Verificar sintaxe, nomes de objeto e privilégios Verificar sintaxe, nomes de objeto e privilégios – – Bloquear objetos usados durante a análise Bloquear objetos usados durante a análise – Criar e armazenar o plano de execução – Criar e armazenar o plano de execução • • Execução: Identificar linhas selecionadas Execução: Identificar linhas selecionadas • • Extração: Retornar linhas ao processo do usuário Extração: Retornar linhas ao processo do usuário E-12 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  594. O Pool Compartilhado O Pool Compartilhado Pool compartilhado Cache de biblioteca Cache do dicionário de dados • • O cache de biblioteca contém o texto da instrução O cache de biblioteca contém o texto da instrução SQL, o código analisado e o plano de execução SQL, o código analisado e o plano de execução • • O cache do dicionário de dados contém tabela, O cache do dicionário de dados contém tabela, coluna e outras definições de objeto e privilégios coluna e outras definições de objeto e privilégios • • O pool compartilhado é dimensionado por O pool compartilhado é dimensionado por SHARED_POOL_SIZE SHARED_POOL_SIZE E-13 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  595. Cache de Buffer do Banco de Dados Cache de Buffer do Banco de Dados Cache de buffer de dados • • Armazena os blocos usados recentemente Armazena os blocos usados recentemente • • Tamanho de um buffer baseado em DB_BLOCK_SIZE Tamanho de um buffer baseado em DB_BLOCK_SIZE • • Número de buffers definido por DB_BLOCK_BUFFERS Número de buffers definido por DB_BLOCK_BUFFERS E-15 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  596. Área Global do Programa (PGA) Área Global do Programa (PGA) • • Não compartilhada Não compartilhada • • Gravável somente pelo processo do servidor Gravável somente pelo processo do servidor • • Contém: Contém: – Área de classificação – Área de classificação – – Informações sobre a sessão Informações sobre a sessão – – Estado do cursor Estado do cursor Processo do – Espaço de pilha – Espaço de pilha servidor PGA E-16 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  597. Processando uma Instrução DML Processando uma Instrução DML SGA Pool Processo compartilhado do usuário Cache de Buffer de buffer de redo log dados UPDATE employees ... 4 1 2 3 Processo do servidor Arquivos Arquivos Arquivos de dados de de controle redo log 1 Banco de Dados E-17 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  598. Buffer de Redo Log Buffer de Redo Log Buffer de redo log • • Tem seu tamanho definido por LOG_BUFFER Tem seu tamanho definido por LOG_BUFFER • • Registra alterações efetuadas pela instância Registra alterações efetuadas pela instância • • É usado seqüencialmente É usado seqüencialmente • • É um buffer circular É um buffer circular E-19 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  599. Segmento de Rollback Segmento de Rollback Imagem antiga Imagem nova Tabela Segmento de rollback Instrução DML E-20 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  600. Processamento de COMMIT Processamento de COMMIT Instância 1 SGA Pool compartilhado Cache de Buffer de Processo buffer de redo log do servidor dados 4 LGWR 3 2 Arquivos Arquivos Arquivos de dados de de Processo controle redo log do usuário Banco de Dados E-21 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  601. Log Writer (LGWR) Log Writer (LGWR) SGA Pool compartilhado O LGWR grava quando: O LGWR grava quando: Cache de buffer de Buffer de • Há um COMMIT • Há um COMMIT redo log dados • • Um-terço do buffer Um-terço do buffer de redo log de redo log LGWR está cheio está cheio • • Há mais de 1 MB Há mais de 1 MB de redo de redo Arquivos Arquivos Arquivos de dados de de • • Antes de gravações Antes de gravações controle redo log DBW0 DBW0 Banco de Dados E-23 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  602. Outros Processos de Instância • Outros processos necessários: – Database Writer (DBW0) – Process Monitor (PMON) – System Monitor (SMON) – Checkpoint (CKPT) • O processo de arquivamento (ARC0) geralmente é criado em um banco de dados de produção E-24 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  603. Database Writer (DBW0) Database Writer (DBW0) SGA Pool compartilhado O DBW0 grava quando: O DBW0 grava quando: Cache de buffer de Buffer de • Há muitos buffers • Há muitos buffers redo log sujos sujos dados • Há alguns buffers • Há alguns buffers DBW0 livres livres • Ocorre timeout • Ocorre timeout Arquivos Arquivos Arquivos • • Ocorre checkpoint Ocorre checkpoint de dados de de controle redo log Banco de Dados E-25 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  604. SMON: System Monitor • Recupera a instância automaticamente: – Submete a rollforward as alterações nos redo logs – Abre o banco de dados para acesso do usuário – Submete a rollback as transações não submetidas a commit • Une o espaço livre • Desaloca segmentos temporários E-26 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  605. PMON: Process Monitor Faz uma limpeza após falha dos processos da seguinte maneira: • Submete a transação a rollback • Libera bloqueios • Libera outros recursos E-27 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.
  606. Resumo Neste apêndice, você aprendeu a: • Identificar arquivos de banco de dados: arquivos de dados, arquivos de controle, redo logs on-line • Descrever estruturas de memória SGA: cache de buffer do banco de dados, pool SQL compartilhado e buffer de redo log • Explicar os principais processos de segundo plano: DBW0, LGWR, CKPT, PMON, SMON e ARC0 • Listar as etapas de processamento SQL: análise, execução, extração E-28 Copyright © Oracle Corporation, 2001. Todos os direitos reservados.

+ diogolopezdiogolopez, 2 years ago

custom

2183 views, 3 favs, 0 embeds more stats

Curso de SQL oficial da Oracle

More info about this document

© All Rights Reserved

Go to text version

  • Total Views 2183
    • 2183 on SlideShare
    • 0 from embeds
  • Comments 2
  • Favorites 3
  • Downloads 164
Most viewed embeds

more

All embeds

less

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate. If needed, use the feedback form to let us know more details.

Cancel
File a copyright complaint
Having problems? Go to our helpdesk?

Categories