Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Volume I
OR8i
Abril/2000
Sumrio 1. Introduo................................................................................................................1
Objetivos.......................................................................................................................................2 Ciclo de Vida do Desenvolvimento de Sistemas..........................................................................3 Armazenamento de Dados em Diferentes Mdias........................................................................4 Conceito de Banco de Dados Relacional......................................................................................5 Definio de Banco de Dados Relacional.....................................................................................6 Modelos de Dados........................................................................................................................7 Modelo Entidade-Relacionamento...............................................................................................8 Convenes do Modelo Entidade-Relacionamento......................................................................9 Terminologia Utilizada em Bancos de Dados Relacionais.........................................................11 Relacionando Mltiplas Tabelas.................................................................................................12 Propriedades de um Banco de Dados Relacional .....................................................................13 Comunicando com um RDBMS utilizando SQL.......................................................................14 Sistema de Gerenciamento de Banco de Dados Relacional.......................................................15 Oracle8i: Sistema de Gerenciamento de Banco de Dados Objeto Relacional............................16 Definio de Objeto....................................................................................................................17 Utilizando um Modelo de Objeto...............................................................................................18 Caractersticas de Sistemas de Objeto........................................................................................19 Soluo Completa Oracle...........................................................................................................20 Comandos SQL...........................................................................................................................21 PL/SQL.......................................................................................................................................22 Ambiente PL/SQL......................................................................................................................23 Benefcios do PL/SQL................................................................................................................24 Tabelas Utilizadas no Curso.......................................................................................................28
Conectando com o SQL*Plus.....................................................................................................25 Exibindo a Estrutura de Tabelas.................................................................................................26 Comandos de Edio do SQL*Plus............................................................................................27 Comandos de Arquivo do SQL*Plus..........................................................................................28 Exerccios - 2..............................................................................................................................29
4. Funes Bsicas.......................................................................................................1
Objetivos.......................................................................................................................................2 Funes SQL.................................................................................................................................3 Tipos de Funes SQL..................................................................................................................4 Funes do Tipo Single-Row.......................................................................................................5 Funes de Caracteres..................................................................................................................7 Funes de Converso entre Maisculas/Minsculas..................................................................8 Utilizando Funes de Converso entre Maisculas/Minsculas.................................................9 Funes de Manipulao de Caracteres......................................................................................11 Utilizando as Funes de Manipulao de Caracteres................................................................12 Funes Numricas.....................................................................................................................14 Utilizando a Funo ROUND.....................................................................................................15 Utilizando a Funo TRUNC.....................................................................................................16 Utilizando a Funo MOD..........................................................................................................17 Trabalhando com Datas..............................................................................................................18 Clculos com Datas....................................................................................................................19 Utilizando Operadores Aritmticos com Datas..........................................................................20 Funes de Data..........................................................................................................................21 Utilizando Funes de Data........................................................................................................22 Funes de Converso................................................................................................................24
DBC Database Company II
Converso Explcita de Tipos de Dados.....................................................................................25 Funo TO_CHAR com Datas...................................................................................................26 Elementos de Formatao de Datas............................................................................................27 Utilizando a Funo TO_CHAR com Datas...............................................................................29 Funo TO_CHAR com Nmeros..............................................................................................30 Utilizando a Funo TO_CHAR com Nmeros.........................................................................31 Funes TO_NUMBER e TO_DATE........................................................................................32 Formato de Data RR...................................................................................................................33 Funo NVL...............................................................................................................................34 Utilizando a Funo NVL...........................................................................................................35 Funo DECODE.......................................................................................................................36 Utilizando a Funo DECODE...................................................................................................37 Aninhando Funes....................................................................................................................38 Exerccios 4..............................................................................................................................40
Utilizando a Clusula GROUP BY em Mltiplas Colunas........................................................18 Consultas Ilegais Utilizando Funes de Grupo.........................................................................19 Excluindo Resultados de Grupos................................................................................................21 Excluindo Resultados de Grupos: Clusula HAVING...............................................................22 Utilizando a Clusula HAVING.................................................................................................23 Aninhando Funes de Grupo....................................................................................................25 Exerccios 6..............................................................................................................................26
7. Subconsultas............................................................................................................1
Objetivos.......................................................................................................................................2 Utilizando uma Subconsulta para Resolver um Problema............................................................3 Subconsultas.................................................................................................................................4 Utilizando uma Subconsulta.........................................................................................................5 Diretrizes para Utilizao de Subconsultas..................................................................................6 Tipos de Subconsultas..................................................................................................................7 Subconsultas Single-Row.............................................................................................................8 Executando Subconsultas Single-Row.........................................................................................9 Utilizando Funes de Grupo em uma Subconsulta...................................................................10 Clusula HAVING com Subconsultas........................................................................................11 Qual o Erro deste Comando?......................................................................................................12 Este Comando Funcionar?........................................................................................................13 Subconsultas do Tipo Multiple-Row..........................................................................................14 Utilizando o Operador ANY em Subconsultas Multiple-Row...................................................15 Utilizando o Operador ALL em Subconsultas Multiple-Row....................................................16 Exerccios 7..............................................................................................................................17
8. Subconsultas Multiple-Column.............................................................................1
Objetivos.......................................................................................................................................2 Subconsultas Multiple-Column....................................................................................................3 Utilizando Subconsultas Multiple-Column..................................................................................4 Comparaes de Colunas..............................................................................................................5 Subconsulta com Comparao Tipo Nonpairwise........................................................................6 Modificando a Tabela EMP..........................................................................................................7 Subconsulta Tipo Pairwise............................................................................................................8 Subconsulta Tipo Nonpairwise.....................................................................................................9 Valores Nulos em uma Subconsulta...........................................................................................10 Utilizando uma Subconsulta na Clusula FROM.......................................................................11 Exerccios 8..............................................................................................................................12
Utilizando o Comando ACCEPT................................................................................................12 Comandos DEFINE e UNDEFINE............................................................................................13 Utilizando o Comando DEFINE.................................................................................................14 Customizando o Ambiente do SQL*Plus...................................................................................15 Variveis do Comando SET.......................................................................................................16 Salvando as Customizaes no Arquivo login.sql......................................................................17 Comandos de Formatao do SQL*Plus....................................................................................18 Comando COLUMN...................................................................................................................19 Utilizando o Comando COLUMN..............................................................................................20 Mscaras do Comando COLUMN.............................................................................................21 Utilizando o Comando BREAK.................................................................................................22 Utilizando os Comandos TTITLE e BTITLE.............................................................................23 Criando um Arquivo de Script para Executar um Relatrio.......................................................24 Relatrio de Exemplo.................................................................................................................25 Exerccios 9..............................................................................................................................26
Consultando uma Viso..............................................................................................................10 Modificando uma Viso..............................................................................................................11 Criando uma Viso Complexa....................................................................................................12 Regras para Executar Operaes DML em uma Viso..............................................................13 Utilizando a Clusula WITH CHECK OPTION........................................................................14 Impedindo Operaes DML.......................................................................................................15 Removendo uma Viso...............................................................................................................16 Exerccios 13............................................................................................................................17
Atributos %NOTFOUND e %ROWCOUNT.............................................................................15 Cursores e Registros...................................................................................................................16 Cursor FOR Loop.......................................................................................................................17 Cursor FOR Loop Utilizando Subconsultas...............................................................................19 Exerccios 21............................................................................................................................20
1. Introduo
Funes Bsicas
Objetivos
Discutir os aspectos tericos e fsicos de um Banco de Dados Relacional Descrever a implementao Oracle do RDBMS e ORDBMS Descrever como SQL e PL/SQL so utilizados nos produtos Oracle Descrever o uso e os benefcios do PL/SQL
Neste captulo, voc obter uma viso dos sistemas de gerenciamento de banco de dados relacionais (RDBMS) e dos sistemas de gerenciamento de banco de dados objeto relacionais (ORDBMS). Tambm ser apresentado: Comandos SQL que so especficos ao Oracle SQL*Plus, utilizado para executar cdigos SQL e PL/SQL PL/SQL, que a linguagem procedural do Oracle
Funes Bsicas
Do conceito produo, voc pode desenvolver um banco de dados utilizando as tcnicas do ciclo de vida do desenvolvimento de sistemas que contm vrias fases de desenvolvimento:
Anlise e Estratgia
Estudo e anlise das necessidades de negcio. Entrevistas com usurios e gerentes para identificar as necessidades de informaes. Construo dos modelos do sistema. Converso das narrativas em uma representao grfica de informaes e regras de negcio necessrias. Confirmao e refinamento do modelo com os analistas e peritos.
Design
Projete o banco de dados baseado no modelo desenvolvido na fase de anlise e estratgia.
Construo e Documentao
Construa o prottipo do sistema. Escreva e execute os comandos para criar as tabelas e os objetos de suporte para o banco de dados. Desenvolva a documentao de usurio, texto de ajuda, e os manuais de operao para auxiliar na utilizao do sistema.
Transio
Refine o prottipo. Coloque a aplicao em produo aps os testes dos usurios, convertendo os dados existentes. Efetue quaisquer modificaes necessrias.
Produo
Coloque o sistema em produo, monitorando sua operao e desempenho, efetuando melhorias e refinamentos necessrios.
Funes Bsicas
Armazenando Informaes
Toda organizao possui necessidades de informao. Uma biblioteca mantm uma lista de scios, livros, datas de entrega e multas. Uma empresa precisa armazenar informaes sobre empregados, departamentos e salrios. Estes pedaos de informao so chamados de dados. Organizaes podem armazenar dados em vrias mdias e em formatos diferentes. Por exemplo, uma cpia fsica de um documento pode estar armazenada em um arquivo, ou em dados armazenados em planilhas eletrnicas ou em bancos de dados. Um banco de dados um conjunto organizado de informaes. Para administrar um bancos de dados, voc precisa de sistemas de gerenciamento de banco de dados (DBMS). Um DBMS um programa que armazena, recupera, e modifica os dados sempre que solicitado. Existem quatro tipos principais de bancos de dados: hierrquico, de rede, relacionao, e mais recentemente relacional de objeto. Nota: Oracle7 um banco de dados relacional enquanto que Oracle8i um banco de dados objeto relacional.
Funes Bsicas
Funes Bsicas
Funes Bsicas
Modelos de Dados
Modelos so uma base de design. Engenheiros constroem um modelo de um carro para trabalhar qualquer detalhe antes de coloc-lo em produo. Da mesma maneira, projetistas de sistemas desenvolvem modelos para explorar idias e melhorar a compreenso do design de um banco de dados.
Funes Bsicas
Modelo Entidade-Relacionamento
Modelo ER
Em um sistema efetivo, os dados so divididos em categorias ou entidades distintas. Um modelo entidade-relacionamento (ER) uma ilustrao de vrias entidades em um negcio e as relaes entre elas. Um modelo ER derivado de especificaes empresariais ou narrativas e construdo durante a fase de anlise do ciclo de vida do desenvolvimento de sistemas. Modelos ER separam as informaes necessrias por um negcio a partir das atividades executadas dentro deste. Embora as empresas possam mudar suas atividades, o tipo de informao tende a permanecer constante. Portanto, as estruturas de dados tambm tendem a ser constantes.
Benefcios do Modelo ER
Informao de documentos para a organizao em um formato claro, preciso Prov um quadro claro do escopo de exigncia de informao Prov um mapa facilitador para o design do banco de dados
Componentes Chaves
Entidade: algo que possui significado sobre o qual informaes precisam ser conhecidas. Exemplos: departamentos, empregados e pedidos. Atributo: descreve ou qualifica uma entidade. Por exemplo, para a entidade de empregado, os atributos seriam o nmero de empregado, nome, cargo, data de admisso, nmero do departamento e assim por diante. Cada um dos atributos pode ser requerido ou opcional. Este estado chamado obrigatoriedade. Relacionamento: associao nomeada entre entidades mostrando a obrigatoriedade e grau. Exemplos: empregados e departamentos; pedidos e itens.
Funes Bsicas
Entidades
Para representar uma entidade em um modelo, utilize as seguintes convenes: Caixa com qualquer dimenso. Nome da entidade no singular, nico e em maisculo. Sinnimo opcional em maisculo dentro de parnteses: ().
Atributos
Smbolo Linha pontilhada Linha slida P de galinha Linha simples Descrio Elemento opcional indicando pode ser Elemento obrigatrio indicando deve ser Elemento de grau indicando um ou mais Elemento de grau indicando um e somente um
Para representar um atributo em um modelo, siga as seguintes convenes: Utilize nomes no singular em minsculo. Marque atributos obrigatrios, ou valores que devem ser conhecidos, com um asterisco: * Marque atributos opcionais, ou valores que podem ser conhecidos, com a letra o
Relacionamentos
Cada lado da relao contm: Um nome. Por exemplo: ensinado por ou designado para Uma obrigatoriedade: deve ser ou pode ser Um grau: ambos um e somente um ou um dos lados um ou mais Nota: O termo cardinalidade um sinnimo para o termo grau. Cada entidade de origem {pode ser | deve ser} nome da relao {um e somente um | um ou mais} entidade de destino.
Funes Bsicas
Identificadores nicos
Um identificador nico (UID) qualquer combinao de atributos ou relaes, ou ambos, que servem para distinguir ocorrncias distintas de uma mesma entidade. Cada ocorrncia da entidade deve ser exclusivamente identificada. Marque cada atributo que parte do UID com o smbolo: # Marque UIDs secundrios com o smbolo entre parnteses: (#)
10
Funes Bsicas
Um banco de dados relacional pode conter uma ou muitas tabelas. Uma tabela uma estrutura bsica de armazenamento em um RDBMS. Uma tabela armazena todos os dados necessrios sobre algo no mundo real, por exemplo: empregados, faturas ou clientes. A figura acima mostra o contedo da tabela ou relao EMP. Os nmeros indicam o seguinte: 1. linha ou tupla representando todos os dados necessrios para um nico empregado. Cada linha de uma tabela deve ser identificada por uma chave primria que no permite linhas duplicadas. A ordem das linhas insignificante; especifica-se a ordem das linhas quando os dados so recuperados. 2. coluna ou atributo que contm o nmero de empregado, sendo tambm a chave primria. Esta coluna identifica cada empregado da tabela EMP. Uma chave primria deve sempre conter um valor. 3. coluna que no um valor chave. Uma coluna representa um tipo de dado em uma tabela; no exemplo, o cargo de todos os empregados. A ordem das colunas insignificante quando armazenando dados; especifica-se a ordem das colunas quando os dados so recuperados. 4. coluna que contm o nmero do departamento, sendo tambm uma chave estrangeira. Uma chave estrangeira uma coluna que define como uma tabela se relaciona com outra. Uma chave estrangeira se referencia a uma chave primria ou uma chave nica em outra tabela. No exemplo, DEPTNO identifica um nico departamento da tabela DEPT. 5. um campo pode ser encontrado na interseo de uma linha com uma coluna. Somente um valor poder existir nesta interseo. 6. um campo pode no ter nenhum valor. Isto chamado de valor nulo. Na tabela EMP, somente os empregados com o cargo de vendedor possuem valor no campo COMM (comisso). Nota: Valores nulos sero discutidos mais adiante em captulos subseqentes.
On Targget Treinamento e Consultoria 11
Funes Bsicas
Cada tabela contm dados que descrevem exatamente uma entidade. Por exemplo, a tabela EMP contm informaes sobre empregados. Devido aos dados de diferentes entidades serem armazenados em diferentes tabelas, pode ser necessrio combinar duas ou mais tabelas para responder uma questo especfica. Por exemplo, pode-se querer saber a localizao do departamento onde um empregado trabalha. Neste caso, voc precisa de informaes da tabela EMP (que contm os dados sobre os empregados) e da tabela DEPT (que contm informaes sobre os departamentos). Um RDBMS permite relacionar os dados em uma tabela com os dados contidos em outra utilizando-se as chaves estrangeiras. Uma chave estrangeira uma coluna ou um conjunto de colunas que se referem a uma chave primria da mesma tabela ou de outra. A facilidade para relacionar dados em uma tabela com dados em outra tabela permite a organizao das informaes em unidades separadas. Os dados de empregados podem ser mantidos logicamente distintos de dados de departamentos armazenando-os em tabelas separadas.
12
Funes Bsicas
13
Funes Bsicas
14
Funes Bsicas
A Oracle fornece um RDBMS flexvel chamado Oracle8i. Suas caractersticas o permitem armazenar e administrar dados com todas as vantagens da estrutura relacional mais as vantagens do PL/SQL, uma ferramenta que lhe proporciona a capacidade para armazenar e executar unidades de programas. O Servidor oferece para os usurios opes para recuperar os dados baseado em tcnicas de otimizao. Inclui caractersticas de segurana que controlam como o banco de dados acessado e utilizado. Outra caracterstica a consistncia e a proteo dos dados atravs de mecanismos de bloqueio (lock). As aplicaes Oracle podem rodar no mesmo computador onde encontra-se o Servidor Oracle. Entretanto, voc pode rodar as aplicaes em um sistema local para o usurio e pode rodar o Servidor Oracle em um outro sistema (arquitetura cliente-servidor). Neste ambiente clienteservidor, pode ser utilizado um grande nmero de recursos de computao. Por exemplo, uma aplicao de reserva de linhas areas pode rodar em um computador pessoal cliente ao mesmo tempo em que obtm acesso aos dados de vos que so administrados convenientemente por um Servidor Oracle em um computador central.
15
Funes Bsicas
16
Funes Bsicas
Definio de Objeto
Objetos
Um objeto freqentemente considerado uma representao de alguma coisa do mundo real. Um objeto de empregado pode calcular suas dedues de folha de pagamento e um objeto de pedido pode efetuar seu transporte. A seguir apresentam-se algumas definies de objetos: Um objeto um "pacote" de software que contm um conjunto de procedimentos relacionados (mtodos) e dados (variveis). David Taylor Um objeto um conceito, abstrao, ou coisa com limites definidos e significado mo para o problema. James Rumbaugh
17
Funes Bsicas
Modelos de Objeto
A tecnologia de objeto foi projetada para modelar problemas empresariais. O modelo declarado no nvel das interaes entre os objetos. Trabalhando com objetos, os desenvolvedores pensam mais em termos de necessidades da aplicao e menos na arquitetura dos sistemas operacionais e nas exigncias do ambiente de desenvolvimento.
18
Funes Bsicas
19
Funes Bsicas
O principal produto da Oracle o seu sistema de gerenciamento de banco de dados relacional, incluindo o Servidor Oracle e vrias ferramentas com o objetivo de auxiliar os usurios na manuteno, monitoramento, e uso dos dados. O dicionrio de dados Oracle um dos componentes mais importantes do Servidor. Consiste em um conjunto de tabelas e vises que provem uma referncia somente de leitura para o banco de dados. O RDBMS administra tarefas como as seguintes: Administrao do armazenamento e definio dos dados Controla e restringe o acesso aos dados e a concorrncia Prov procedimentos de cpia e restaurao dos dados Interpreta comandos SQL e PL/SQL Nota: PL/SQL uma linguagem procedural desenvolvida pela Oracle que estende as definies do SQL adicionando-lhe lgica de aplicao. Comandos SQL e PL/SQL so utilizados por todos os programas e usurios para acessar e manipular dados armazenados no banco de dados Oracle. Utilizando programas aplicativos voc freqentemente pode ter acesso ao banco de dados sem utilizar SQL ou PL/SQL diretamente, porque voc pode apertar um boto ou selecionar um check box, por exemplo, mas os aplicativos implicitamente utilizam SQL ou PL/SQL para executar sua solicitao. SQL*Plus uma ferramenta Oracle que reconhece e envia comandos SQL e PL/SQL para serem executados no servidor e possui sua prpria linguagem de comandos. A Oracle oferece uma enorme variedade de interfaces grficas de usurio (GUI) em ferramentas voltadas para a construo de aplicaes empresariais como tambm um grande conjunto de softwares aplicativos para muitas reas de negcio e indstrias. Nota: Maiores informaes sobre o dicionrio de dados da Oracle sero vistas em captulos posteriores.
On Targget Treinamento e Consultoria 20
Funes Bsicas
Comandos SQL
O SQL Oracle segue os padres aceitos pela indstria. A Oracle assegura compatibilidade futura com a evoluo destes padres adicionando chaves prprias ao SQL definido pelos comits. Comits aceitos pela indstria so o Instituto de Padres Americano (ANSI) e a Organizao de Padres Internacional (ISO). ANSI e ISO adotaram o SQL como a linguagem padro para bancos de dados relacionais.
Comando SELECT INSERT UPDATE DELETE CREATE ALTER DROP RENAME TRUNCATE COMMIT ROLLBACK SAVEPOINT GRANT REVOKE Descrio Recupera dados a partir do banco de dados Respectivamente insere novas linhas, modifica registros existentes e remove linhas no desejadas a partir de tabelas do banco de dados. Coletivamente conhecidos como linguagem de manipulao de dados DML (data manipulation language) Cria, modifica e remove estruturas de dados a partir de tabelas. Coletivamente conhecidos como linguagem de definio de dados DDL (data definition language) Administra as mudanas efetuadas por comandos DML. As alteraes nos dados podem ser agrupadas em transaes lgicas. Fornece ou remove direitos de acesso ao banco de dados e as estruturas nele definidas. Coletivamente conhecidos como linguagem de controle de dados DCL (data control language)
21
Funes Bsicas
PL/SQL
PL/SQL uma linguagem procedural desenvolvida pela Oracle que estende as funcionalidades do SQL, linguagem padro para acesso aos banco de dados objeto-relacionais. PL/SQL oferece uma engenharia de software moderna que cria caractersticas como encapsulamento de dados, tratamento de excees, ocultamento de informao e orientao objetos. PL/SQL incorpora muitas das caractersticas avanadas desenvolvidas nas linguagens de programao projetadas durante o perodo de 1970 1980. Permite a incluso de comandos SQL de manipulao de dados e pesquisa em blocos estruturados e unidades procedurais de cdigo, tornando o PL/SQL uma poderosa linguagem de processamento transacional. Com PL/SQL, voc pode usar comandos SQL para recuperar dados do Oracle e comandos de controle PL/SQL para processar os dados.
22
Funes Bsicas
Ambiente PL/SQL
23
Funes Bsicas
Benefcios do PL/SQL
Integrao
PL/SQL representa um papel central tanto para o Servidor Oracle (atravs de stored procedures, stored functions, database triggers e packages) como para as ferramentas de desenvolvimento Oracle (atravs dos componentes de triggers do Developer/2000). Aplicaes desenvolvidas com Developer/2000 podem fazer uso de bibliotecas compartilhadas que armazenam cdigo (procedures e funes) e podem ser acessadas localmente ou remotamente. As ferramentas que compoem o Developer/2000 so o Oracle Forms, Oracle Reports e Oracle Graphics. Tipo de dados SQL tambm podem ser utilizados em PL/SQL. Combinado com o acesso direto que o SQL prov, estes tipos de dados compartilhados integram o PL/SQL com o dicionrio de dados do Servidor Oracle. O PL/SQL preenche a lacuna entre o acesso conveniente para tecnologia de banco de dados e a necessidade de caractersticas de programao procedural.
24
Funes Bsicas
Melhor Desempenho
PL/SQL pode melhorar o desempenho de uma aplicao. Os benefcios diferem dependendo do ambiente de execuo. PL/SQL pode ser usado para agrupar comandos SQL dentro de um nico bloco enviando-o ao servidor em uma nica chamada, reduzindo-se de forma considervel o trfico de rede. Sem PL/SQL, os comandos SQL seriam processadas um de cada vez. Cada comando SQL resultaria em outra chamada ao Servidor Oracle e aumento do trfego da rede. Em um ambiente de rede, o trfego pode tornar-se significativo. Como a figura ilustra, se sua aplicao utiliza SQL de forma intensiva, voc pode utilizar blocos PL/SQL e sub-programas para agrupar comandos SQL antes de envi-los ao Servidor Oracle para execuo. PL/SQL tambm pode cooperar com Servidor Oracle em ferramentas para o desenvolvimento de aplicaes como o Developer/2000 Forms e Reports. Somando poder de processamento procedural para estas ferramentas, o PL/SQL impulsiona o melhoramento do desempenho. Nota: Procedures e funes declaradas como parte de uma aplicao Developer/2000 so distintas das armazenadas no banco de dados, embora a estrutura geral delas seja a mesma. Stored procedures e funes so objetos do banco de dados so armazenados no Dicionrio de Dados. Eles podem ser acessados por qualquer aplicao, incluindo aplicaes desenvolvidas com o Developer/2000.
25
Funes Bsicas
A figura acima mostra uma variedade de diferentes tipos de construes PL/SQL que utilizam blocos PL/SQL bsicos. Eles esto disponveis dependendo do ambiente onde forem executados.
Portabilidade
Devido ao fato de o PL/SQL ser nativo ao Servidor Oracle, voc pode mover programas para qualquer ambiente servidor (sistema operacional ou plataforma) que suporte o Servidor Oracle e PL/SQL. Em outras palavras, programas PL/SQL podem ser executados em qualquer lugar onde o Servidor Oracle estiver rodando; voc no precisa efetuar modificaes para cada ambiente novo. Voc tambm pode mover cdigo entre o Servidor Oracle e sua aplicao. Voc pode escrever pacotes de programas portveis e pode criar bibliotecas que podem ser reutilizadas em ambientes diferentes.
Declarao de Identificadores
Declare variveis, cursores, constantes e excees e os utilize em comandos SQL e procedurais. Declare variveis com tipos de dados escalares, de referncia, compostos, e de objetos grandes (LOB). Declare variveis dinamicamente baseadas nas estruturas de dados de tabelas e colunas do banco de dados.
26
Funes Bsicas
Tratamento de Erros
Processe erros do Servidor Oracle com rotinas de tratamento de excees. Declare condies de erro definidas pelo usurio e processe-as tambm com rotinas de tratamento de excees.
27
Funes Bsicas
Sero usadas trs tabelas principais neste curso. Estas so: Tabela EMP, com informaes sobre empregados Tabela DEPT, com informaes sobre departamentos Tabela SALGRADE, com informaes de salrios para vrios graus A estrutura e dados para todas as tabelas esto apresentadas no Apndice B.
28
Funes Bsicas
Objetivos
Listar as caractersticas do comando SQL SELECT Executar um comando SELECT bsico Diferenciar comandos SQL de comandos SQL*Plus Para extrair dados a partir de um banco de dados voc precisa utilizar o comando SQL (structured query language) SELECT. Voc pode precisar restringir as colunas que sero exibidas. Este captulo descreve todos os comandos SQL que voc precisa para executar estas aes. Este captulo tambm cobre o uso de comandos SQL*Plus para executar comandos SQL.
Funes Bsicas
Um comando SELECT recupera informaes a partir do banco de dados. Usando um comando SELECT voc pode fazer o seguinte: Seleo: Voc pode usar a capacidade de seleo em SQL para escolher as linhas de uma tabela que voc deseja recuperar atravs de uma consulta. Voc pode usar vrios critrios para seletivamente restrinjir as linhas que sero visualizadas. Projeo: Voc pode usar a capacidade de projeo em SQL para escolher as colunas de uma tabela que voc deseja recuperar atravs de uma consulta. Voc pode escolher algumas ou todas as colunas de uma tabela, de acordo com sua necessidade. Join: Voc pode usar a capacidade de join em SQL para reunir dados que esto armazenados em tabelas diferentes, criando um vnculo atravs de colunas que ambas as tabelas compartilhem. Voc aprender mais sobre joins em um captulo posterior.
Funes Bsicas
Em sua forma mais simples, um comando SELECT deve incluir o seguinte: Uma clusula SELECT que especifica as colunas a serem exibidas. Um clusula FROM que especifica as tabelas que possuem as colunas listadas na clusula SELECT. Na sintaxe: SELECT DISTINCT * column alias FROM table uma lista de uma ou mais colunas. suprime duplicidades. seleciona todas as colunas. seleciona a coluna nomeada. fornece para as colunas selecionadas ttulos diferentes. especifica a tabela que contm as colunas.
Funes Bsicas
Funes Bsicas
DEPTNO --------10 20 30 40
Funes Bsicas
DEPTNO --------10 20 30 40
Funes Bsicas
ENAME HIREDATE SAL ---------- --------- --------KING 17-NOV-81 5000 BLAKE 01-MAY-81 2850 CLARK 09-JUN-81 2450 JONES 02-APR-81 2975 MARTIN 28-SEP-81 1250 ALLEN 20-FEB-81 1600 ... 14 rows selected.
Cabealhos de colunas tipo caracter e data podem ser truncados, enquanto cabealhos de colunas numricas no podem ser truncados. Normalmente os cabealhos de coluna aparecem em maisculas. Voc pode substituir os cabealhos de colunas por um alias. Alias de colunas sero vistos posteriormente neste captulo.
Funes Bsicas
Expresses Aritmticas
Voc pode precisar modificar a forma como os dados so exibidos, por exemplo, executando clculos. Isto possvel atravs do uso de expresses aritmticas. Uma expresso aritmtica pode conter nomes de colunas, valores numricos constantes, e os operadores aritmticos.
Operadores Aritmticos
A figura acima mostra os operadores aritmticos disponveis em SQL. Voc pode usar os operadores aritmticos em qualquer clusula de um comando SQL, exceto a clusula FROM.
Funes Bsicas
ENAME SAL SAL+300 ---------- --------- --------KING 5000 5300 BLAKE 2850 3150 CLARK 2450 2750 JONES 2975 3275 MARTIN 1250 1550 ALLEN 1600 1900 ... 14 rows selected.
O exemplo acima utiliza o operador de adio para calcular um aumento de salrio de $300 para todos os empregados e mostrar uma nova coluna SAL+300 na tela. Note que a coluna resultante SAL+300 no uma nova coluna da tabela EMP; sendo utilizada somente na exibio. Por default, o nome da coluna nova obtido a partir da expresso de clculo que a gerou, neste caso, SAL + 300. Nota: O SQL*Plus ignora espaos em branco antes e depois do operador aritmtico.
10
Funes Bsicas
Se uma expresso aritmtica possui mais de um operador, os de multiplicao e diviso so avaliados primeiro. Se os operadores dentro de uma expresso so da mesma prioridade, ento a avaliao feita da esquerda para direita. Voc pode usar parnteses para forar a expresso colocada dentro deles a ser avaliada primeiro. SQL> SELECT 2 FROM ename, sal, 12*sal+100 emp;
ENAME SAL 12*SAL+100 ---------- --------- ---------KING 5000 60100 BLAKE 2850 34300 CLARK 2450 29500 JONES 2975 35800 MARTIN 1250 15100 ALLEN 1600 19300 ... 14 rows selected.
O exemplo acima exibe o nome, salrio e a compensao anual dos empregados. Ele calcula a compensao anual multiplicando o salrio mensal por 12, mais uma gratificao nica de $100. Observe que a multiplicao executada antes da adio. Nota: Use parnteses para reforar a ordem padro de precedncia e melhorar a clareza do comando. Por exemplo, a expresso acima poderia ser escrita desta forma, sem mudana no resultado: (12*sal)+100.
11
Funes Bsicas
Utilizando Parnteses
SQL> SELECT 2 FROM ename, sal, 12*(sal+100) emp;
ENAME SAL 12*(SAL+100) ---------- --------- ----------KING 5000 61200 BLAKE 2850 35400 CLARK 2450 30600 JONES 2975 36900 MARTIN 1250 16200 ... 14 rows selected.
Voc pode alterar as regras de precedncia usando parnteses para especificar a ordem na qual devem ser executados os operadores. O exemplo acima exibe o nome, salrio, e a compensao anual dos empregados. Ele calcula a compensao anual somando o salrio mensal com uma gratificao mensal de $100, multiplicando o resultado por 12. Devido ao uso dos parnteses, a adio recebe prioridade sobre a multiplicao.
12
Funes Bsicas
ENAME JOB COMM ---------- --------- --------KING PRESIDENT BLAKE MANAGER ... TURNER SALESMAN 0 ... 14 rows selected.
13
Funes Bsicas
Se o valor de alguma coluna em uma expresso aritmtica nulo, o resultado da expresso tambm nulo. Por exemplo, se voc tentar executar uma diviso por zero, voc obtm um erro. Porm, se voc divide um nmero por nulo, o resultado nulo ou desconhecido. No exemplo acima, o empregado KING no um vendedor (SALESMAN) e no possui nenhuma comisso. Uma vez que a coluna COMM na expresso aritmtica nula, o resultado tambm nulo.
14
Funes Bsicas
15
Funes Bsicas
O primeiro exemplo exibe o nome e o salrio mensal de todos os empregados. Observe que a palavra chave opcional AS foi utilizada antes do nome do alias da coluna. O resultado da consulta seria o mesmo se a palavra chave AS fosse utilizada ou no. Observe tambm que o comando SQL tem os alias de coluna, nome e salrio em minsculas, sendo que o resultado da consulta exibe os cabealhos de coluna em maisculas. Como mencionado anteriormente, os ttulos de coluna aparecem em maisculas por default. O segundo exemplo exibe o nome e salrio anual de todos os empregados. Uma vez que o alias "Annual Salary" contm espaos, foi colocado entre aspas duplas. Observe que o cabealho da coluna ficou exatamente igual ao seu alias.
16
Funes Bsicas
Operador de Concatenao
Voc pode unir colunas com outras colunas, expresses aritmticas ou valores constantes para criar uma expresso de caracteres usando o operador de concatenao (||). Colunas em qualquer lado do operador so combinadas para fazer uma nica coluna de sada. SQL> SELECT 2 FROM ename||job AS "Employees" emp;
mployees ------------------KINGPRESIDENT BLAKEMANAGER CLARKMANAGER JONESMANAGER MARTINSALESMAN ALLENSALESMAN ... 14 rows selected.
No exemplo, so concatenadas as colunas ENAME e JOB, sendo que o resultado recebe o alias de "Employees". Observe que o nome do empregado e o cargo so combinados obtendo-se uma nica coluna de sada. A palavra chave AS antes do nome do alias torna a clusula SELECT mais legvel.
17
Funes Bsicas
Employee Details ------------------------KING is a PRESIDENT BLAKE is a MANAGER CLARK is a MANAGER JONES is a MANAGER MARTIN is a SALESMAN ... 14 rows selected.
O exemplo acima mostra os nomes e cargos de todos os empregados. A coluna possui o cabealho "Employee Details". Observe os espaos entre as aspas simples no comando SELECT. Os espaos melhoram a visualizao do resultado. No exemplo seguinte, o nome e salrio de cada empregado concatenado com um literal para dar mais significado as linhas retornadas. SQL> SELECT ename ||': '||'1'||' Month salary = '||sal Monthly 2 FROM emp;
18
Funes Bsicas
MONTHLY -------------------------------------------------------------KING: 1 Month salary = 5000 BLAKE: 1 Month salary = 2850 CLARK: 1 Month salary = 2450 JONES: 1 Month salary = 2975 MARTIN: 1 Month salary = 1250 ALLEN: 1 Month salary = 1600 TURNER: 1 Month salary = 1500 ... 14 rows selected.
19
Funes Bsicas
Linhas Duplicadas
SQL> SELECT 2 FROM deptno emp;
A menos que voc indique o contrrio, o SQL*Plus exibe os resultados de uma consulta sem eliminar as linhas duplicadas. O exemplo acima exibe todos os nmeros de departamento a partir da tabela EMP. Observe que os nmeros de departamento so repetidos.
20
Funes Bsicas
DEPTNO --------10 20 30
Para eliminar linhas duplicadas do resultado da consulta, inclua a palavra chave DISTINCT imediatamente aps a palavra SELECT. No exemplo acima, a tabela EMP na verdade possui quatorze linhas, mas existe somente trs departamentos diferentes na tabela. Voc pode especificar mltiplas colunas depois da palavra DISTINCT. O qualificador DISTINCT afeta todas as colunas selecionadas, e o resultado representa uma combinao distinta das colunas. SQL> SELECT 2 FROM DISTINCT deptno, job emp;
21
Funes Bsicas
SQL e SQL*Plus
SQL uma linguagem de comandos para comunicao com o Servidor Oracle a partir de qualquer ferramenta ou aplicao. O SQL Oracle possui muitas extenses. Quando voc entra um comando SQL, este armazenado em uma rea de memria chamada de SQL buffer e permanece l at que voc entre um novo comando. SQL*Plus uma ferramenta Oracle que reconhece e submete comandos SQL ao Servidor Oracle para execuo e contm sua prpria linguagem de comandos.
Caractersticas do SQL
Pode ser usado por uma grande variedade de usurios, inclusive por aqueles com pouca ou nenhuma experincia em programao. uma linguagem no procedural. Reduz a quantidade de tempo necessria para criar e manter sistemas. parecido com o idioma Ingls.
Caractersticas do SQL*Plus
Aceita a entrada de comandos SQL a partir de arquivos. Possui um editor de linha para modificar comandos SQL. Controles de configuraes de ambiente. Formatao do resultado de consultas em relatrios bsicos. Acessa banco de dados locais e remotos.
22
Funes Bsicas
23
Funes Bsicas
SQL*Plus
SQL*Plus um ambiente no qual voc pode fazer o seguinte: Executar comandos SQL para recuperar, modificar, adicionar e remover dados do banco de dados. Formatar, executar clculos, armazenar e imprimir o resultado de consultas na forma de relatrios. Criar arquivos com scripts para armazenar comandos SQL para uso repetitivo no futuro. Comandos SQL*Plus podem ser divididos nas seguintes categorias principais:
Categoria Ambiente Formatao Manipulao de Arquivos Execuo Edio Interao Diversos Propsito Afetam o comportamento geral dos comandos SQL na sesso Formatam os resultados das consultas Salvam, carregam e executam arquivos de script Enviam comandos SQL a partir do SQL buffer para o Servidor Oracle Modificam comandos SQL no buffer Permitem criar e passar variveis para comandos SQL, imprimir valores de variveis e imprimir mensagens na tela Existem vrios comandos para conectar ao banco de dados, manipular o ambiente do SQL*Plus e mostrar as definies de colunas
24
Funes Bsicas
A forma como voc executa o SQL*Plus depende do tipo de sistema operacional ou ambiente Windows que voc est executando. Para conectar atravs do ambiente Windows: 1. Clique Start>Programs>Oracle>SQL*Plus. 2. Preencha o nome do usurio, senha e o banco de dados. Para conectar em um ambiente de linha de comando: 1. Conecte com sua mquina. 2. Entre o comando SQL*Plus como mostrado na figura acima. No comando: username password @database o nome do seu usurio no banco de dados. sua senha no banco de dados; se voc colocar sua senha na linha de comando, ela estar visvel. a string de conexo para o banco de dados.
Nota: Para assegurar a integridade de sua senha, no coloque-a no prompt do sistema operacional. Ao contrrio, coloque apenas seu nome de usurio. Entre com sua senha somente no prompt de senha do SQL*Plus. Quando voc tiver conectado com o SQL*Plus, voc ver a seguinte mensagem:
SQL*Plus: Release 8.1.5.0.0 - Production on Ter Nov 23 20:49:53 1999 (c) Copyright 1999 Oracle Corporation. All rights reserved.
25
Funes Bsicas
No SQL*Plus, voc pode exibir a estrutura de uma tabela utilizando o comando DESCRIBE. O resultado do comando uma lista com os nomes de colunas e seus tipos de dados, bem como se a coluna origatria ou no. Na sintaxe: tablename o nome de qualquer tabela existente, viso, ou sinnimo acessvel ao usurio.
O exemplo acima exibe informaes sobre a estrutura da tabela DEPT. No resultado: Null? Type indica quando uma coluna deve conter dados; NOT NULL indica que a coluna obrigatria. mostra o tipo de dado da coluna.
Descrio Valor numrico contendo um nmero de mximo de dgitos definido por <p>, sendo o nmero de dgitos direita do ponto decimal definido por <s> valor caractere com tamanho varivel e mximo definido por <s> valor de data e hora entre 1 de Janeiro de 4712 A.C. e 31 de dezembro de 9999 D.C. valor caractere de tamanho fixo e mximo de definido por <s>
26
Funes Bsicas
27
Funes Bsicas
28
Funes Bsicas
Exerccios - 2
1. 2. Inicie uma sesso do SQL*Plus utilizando o usurio e senha fornecidos pelo instrutor. Comandos SQL*Plus acessam o banco de dados. Verdadeiro / Falso 3. O comando SELECT a seguir executar com sucesso? Verdadeiro / Falso SQL> SELECT 2 FROM ename, job, sal Salary emp;
4.
O comando SELECT abaixo executar com sucesso? Verdadeiro / Falso SQL> SELECT 2 FROM * salgrade;
5.
Existem trs erros de codificao neste comando. Voc pode os identificar? SQL> SELECT 2 3 FROM empno, ename salary x 12 ANNUAL SALARY emp;
6.
Mostre a estrutura da tabela DEPT. Selecione todos os dados da tabela DEPT. Name Null? ----------- -------DEPTNO NOT NULL DNAME LOC Type -----------NUMBER(2) VARCHAR2(14) VARCHAR2(13)
29
Funes Bsicas
DEPTNO -----10 20 30 40
7.
Mostre a estrutura da tabela EMP. Crie uma consulta para exibir o nome (ename), cargo (job), data de admisso (hiredate) e nmero do empregado (empno) para cada empregado, mostrando o nmero do empregado por primeiro. Salve o comando SQL para um arquivo chamado e2q7.sql. Name --------EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO Null? -------NOT NULL Type ------------NUMBER(4) VARCHAR2(10) VARCHAR2(9) NUMBER(4) DATE NUMBER(7,2) NUMBER(7,2) NUMBER(2)
NOT NULL
8.
Execute a consulta do arquivo e2q7.sql. EMPNO ENAME JOB ----- ------- ----------7839 KING PRESIDENT 7698 BLAKE MANAGER 7782 CLARK MANAGER 7566 JONES MANAGER 7654 MARTIN SALESMAN 7499 ALLEN SALESMAN 7844 TURNER SALESMAN 7900 JAMES CLERK 7521 WARD SALESMAN 7902 FORD ANALYST 7369 SMITH CLERK 7788 SCOTT ANALYST 7876 ADAMS CLERK 7934 MILLER CLERK 14 rows selected. HIREDATE --------17-NOV-81 01-MAY-81 09-JUN-81 02-APR-81 28-SEP-81 20-FEB-81 08-SEP-81 03-DEC-81 22-FEB-81 03-DEC-81 17-DEC-80 09-DEC-82 12-JAN-83 23-JAN-82
9.
Crie uma consulta para exibir cada cargo da tabela EMP uma nica vez.
30
Funes Bsicas
Se houver tempo, complete os seguintes exerccios: 10. Carregue e2q7.sql no SQL buffer. Altere os cabealhos das colunas para Emp#, Employee, Job e Hire Date, respectivamente. Execute sua consulta novamente. Emp # Employee Job ----- --------- ---------7839 KING PRESIDENT 7698 BLAKE MANAGER 7782 CLARK MANAGER 7566 JONES MANAGER 7654 MARTIN SALESMAN 7499 ALLEN SALESMAN 7844 TURNER SALESMAN 7900 JAMES CLERK 7521 WARD SALESMAN 7902 FORD ANALYST 7369 SMITH CLERK 7788 SCOTT ANALYST 7876 ADAMS CLERK 7934 MILLER CLERK 14 rows selected. Hire Date --------------17-NOV-81 01-MAY-81 09-JUN-81 02-APR-81 28-SEP-81 20-FEB-81 08-SEP-81 03-DEC-81 22-FEB-81 03-DEC-81 17-DEC-80 09-DEC-82 12-JAN-83 23-JAN-82
11.
Exiba o nome do empregado concatenado com o cargo, separados por uma vrgula e um espao, e nomeie o cabealho da coluna Employee and Title.
31
Funes Bsicas
Employee and Title ------------------KING, PRESIDENT BLAKE, MANAGER CLARK, MANAGER JONES, MANAGER MARTIN, SALESMAN ALLEN, SALESMAN TURNER, SALESMAN JAMES, CLERK WARD, SALESMAN FORD, ANALYST SMITH, CLERK SCOTT, ANALYST ADAMS, CLERK MILLER, CLERK 14 rows selected.
Se voc quiser um desafio extra, complete os exerccios seguintes: 12. Crie uma consulta para exibir todos os dados da tabela EMP. Separe cada coluna por uma vrgula. Coloque no cabealho da coluna resultante a string THE_OUTPUT. THE_OUTPUT -----------------------------------------------7839,KING,PRESIDENT,,17-NOV-81,5000,,10 7698,BLAKE,MANAGER,7839,01-MAY-81,2850,,30 7782,CLARK,MANAGER,7839,09-JUN-81,2450,,10 7566,JONES,MANAGER,7839,02-APR-81,2975,,20 7654,MARTIN,SALESMAN,7698,28-SEP-81,1250,1400,30 7499,ALLEN,SALESMAN,7698,20-FEB-81,1600,300,30 7844,TURNER,SALESMAN,7698,08-SEP-81,1500,0,30 7900,JAMES,CLERK,7698,03-DEC-81,950,,30 7521,WARD,SALESMAN,7698,22-FEB-81,1250,500,30 7902,FORD,ANALYST,7566,03-DEC-81,3000,,20 7369,SMITH,CLERK,7902,17-DEC-80,800,,20 7788,SCOTT,ANALYST,7566,09-DEC-82,3000,,20 7876,ADAMS,CLERK,7788,12-JAN-83,1100,,20 7934,MILLER,CLERK,7782,23-JAN-82,1300,,10 14 rows selected.
32
Funes Bsicas
Objetivos
Limitar as linhas recuperadas por uma consulta. Ordene as linhas recuperadas por uma consulta. Quando recuperar dados do banco de dados, voc pode necessitar restringir os registros que sero retornados ou especificar a ordem na qual as linhas sero exibidas. Este captulo explica os comandos SQL que voc utilizar para executar estas aes.
Funes Bsicas
No exemplo acima, assuma que voc quer exibir todos os empregados do departamento 10. O conjunto de linhas destacadas com o valor 10 na coluna DEPTNO so as nicas retornadas. Este mtodo de restrio a base da clusula WHERE em SQL.
Funes Bsicas
Voc pode restringir as linhas recuperadas pela consulta utilizando a clusula WHERE. A clusula WHERE contm uma condio que deve ser satisfeita, devendo estar imediatamente aps a clusula FROM. Na sintaxe: WHERE condition restringe a consulta para as linhas que satisfazem a condio. composta de nomes de coluna, expresses, constantes, e operadores de comparao.
A clusula WHERE pode comparar valores em colunas, valores literais, expresses aritmticas ou funes. A clusula WHERE consiste de trs elementos: Nome da coluna Operador de comparao Nome de coluna, constante ou lista de valores
Funes Bsicas
No exemplo, o comando SELECT recupera o nome, cargo e o nmero do departamento de todos os empregados cujo cargo CLERK. Observe que o cargo CLERK foi especificado em maisculas para assegurar que a comparao feita com a coluna cargo da tabela EMP esteja de acordo com os dados nela armazenados. Strings de caractere fazem distino entre maisculas e minsculas.
Funes Bsicas
Strings de caractere e datas na clusula WHERE devem ser inseridas entre aspas simples (''). Constantes numricas, entretanto, no devem estar entre aspas. Todas as pesquisas tipo caractere fazem distino entre maisculas e minsculas. No exemplo a seguir, nenhuma linha retornada porque a tabela EMP armazena todos os dados em maisculas. SQL> SELECT 2 FROM 3 WHERE ename, empno, job, deptno emp job='clerk';
O Oracle armazena datas em um formato numrico interno, representando o sculo, ano, ms, dia, horas, minutos e segundos. A exibio default de datas DD-MON-YY. Nota: A modificao do formato default de data ser visto no captulo 4. Valores numrico no devem ser inclusos dentro de aspas.
Funes Bsicas
Operadores de Comparao
Operadores de comparao so utilizados em condies que comparam uma expresso com outra. Eles so usados na clusula WHERE no seguinte formato: Sintaxe WHERE expr operator value
Exemplos WHERE hiredate = '01-JAN-95' WHERE sal >= 1500 WHERE ename = 'SMITH'
Funes Bsicas
No exemplo, o comando SELECT recupera o nome, salrio e comisso a partir da tabela EMP, quando o salrio do empregado for menor ou igual ao valor da sua comisso. Observe que no h nenhum valor explcito fornecido para a clusula WHERE. Os dois valores so comparados so obtidos a partir das colunas SAL e COMM da tabela EMP.
Funes Bsicas
Funes Bsicas
Operador BETWEEN
SQL> SELECT 2 FROM 3 WHERE ename, sal emp sal BETWEEN 1000 AND 1500;
Lower limit ENAME SAL ---------- --------MARTIN 1250 TURNER 1500 WARD 1250 ADAMS 1100 MILLER 1300
Higher limit
Voc pode exibir linhas baseadas em um intervalo de valores utilizando o operador BETWEEN. O intervalo que voc especifica composto por um limite inferior e um limite superior. O comando SELECT acima recupera linhas da tabela EMP para qualquer empregado cujo salrio est entre $1000 e $1500. Os valores especificados no operador BETWEEN fazem parte do intervalo, sendo tambm recuperados. Voc deve especificar o limite inferior por primeiro.
10
Funes Bsicas
Operador IN
SQL> SELECT 2 FROM 3 WHERE empno, ename, sal, mgr emp mgr IN (7902, 7566, 7788);
ENAME SAL MGR ---------- --------- --------FORD 3000 7566 SMITH 800 7902 SCOTT 3000 7566 ADAMS 1100 7788
Utilize o operador IN para executar a comparao com os valores de uma lista. O exemplo acima exibe o nmero do empregado, nome, salrio e o nmero do gerente de todos os empregados cujo o nmero do gerente 7902, 7566 ou 7788. O operador IN pode ser utilizado com qualquer tipo de dado. O exemplo a seguir recupera uma linha a partir da tabela EMP para cada empregado cujo nome encontre-se na lista de nomes da clusula WHERE. SQL> SELECT 2 FROM 3 WHERE empno, ename, mgr, deptno emp ename IN ('FORD' , 'ALLEN');
Se forem utilizadas strings de caractere ou datas na lista, estas devem estar entre aspas simples ('').
11
Funes Bsicas
Operador LIKE
SQL> SELECT 2 FROM 3 WHERE ename emp ename LIKE 'S%';
s vezes voc pode no saber o valor exato a pesquisar. Voc pode ento selecionar linhas que combinem com um padro de caracteres utilizando o operador LIKE. Podem ser utilizados dois smbolos para construir a string de procura.
Smbolo % _ Descrio Representa qualquer seqncia de zero ou mais caracteres Representa um nico caractere qualquer
O comando SELECT acima recupera o nome de empregado da tabela EMP para qualquer empregado cujo nome comea com um S. Observe que os nomes que comeam com um s minsculo no sero recuperados. O operador LIKE pode ser utilizado como um atalho para algumas comparaes normalmente executadas com o operador BETWEEN. O exemplo a seguir exibe os nomes e as datas de admisso de todos os empregados que foram contratados entre Janeiro de 1981 e Dezembro de 1981. SQL> 2 3 SELECT FROM WHERE ename, hiredate emp hiredate LIKE '%81';
12
Funes Bsicas
A opo de ESCAPE
Quando voc precisar de uma comparao exata para os caracteres "%" e "_", utilize a opo de ESCAPE. Para exibir os nomes de empregados cujo nome contm "A_B", utilize o seguinte comando SQL: SQL> SELECT 2 FROM 3 WHERE '\'; ename emp ename
LIKE
'%A\_%B'
ESCAPE
A opo de ESCAPE identifica a barra invertida (\) como o caracter de escape. No padro, o caractere de escape precede o underscore (_). Isto faz com que o Servidor Oracle interprete o underscore literalmente.
13
Funes Bsicas
Operador IS NULL
SQL> SELECT 2 FROM 3 WHERE ename, mgr emp mgr IS NULL;
O operador IS NULL testa os valores que so nulos. Um valor nulo um valor que indisponvel, no atribudo, desconhecido ou inaplicvel. Portanto, voc no pode test-los com (=) porque um valor nulo no pode ser igual ou diferente de qualquer valor. O exemplo acima recupera o nome e o gerente de todos os empregados que no possuem um gerente. Por exemplo, para exibir o nome, cargo e comisso para todos os empregados que no so intitulados para adquirir uma comisso, utilize o seguinte comando SQL: SQL> SELECT 2 FROM 3 WHERE ename, job, comm emp comm IS NULL;
14
Funes Bsicas
Operadores Lgicos
Um operador lgico combina o resultado de duas condies para produzir um nico resultado ou para inverter o resultado de uma nica condio. Trs operadores lgicos esto disponveis em SQL: AND OR NOT Todos os exemplos mostrados at o momento, especificaram somente uma condio na clusula WHERE. Voc pode usar vrias condies em uma clusula WHERE utilizandos os operadores AND e OR.
15
Funes Bsicas
Operador AND
SQL> SELECT 2 FROM 3 WHERE 4 AND empno, ename, job, sal emp sal >= 1100 job = 'CLERK';
No exemplo, ambas as condies devem ser verdadeiras para qualquer registro a ser selecionado. Portanto, um empregado que tem o cargo CLERK e ganha mais que $1100 ser selecionado. Todas as pesquisas do tipo caractere fazem distino entre maisculas e minsculas. Nenhuma linha retornada se CLERK no estiver em maisculo. Strings de caracteres devem ser includas entre aspas simples.
16
Funes Bsicas
Operador OR
SQL> SELECT 2 FROM 3 WHERE 4 OR empno, ename, job, sal emp sal >= 1100 job = 'CLERK';
EMPNO ENAME --------- ---------7839 KING 7698 BLAKE 7782 CLARK 7566 JONES 7654 MARTIN ... 14 rows selected.
JOB SAL --------- --------PRESIDENT 5000 MANAGER 2850 MANAGER 2450 MANAGER 2975 SALESMAN 1250
No exemplo, para um registro ser selecionado basta que uma das duas condies seja verdadeira. Portanto, um empregado que possui o cargo CLERK ou ganha mais que $1100 ser selecionado.
17
Funes Bsicas
Operador NOT
SQL> SELECT ename, job 2 FROM emp 3 WHERE job NOT IN ('CLERK','MANAGER','ANALYST');
O exemplo acima exibe o nome e o cargo de todos os empregados cujo cargo no seja CLERK, MANAGER ou ANALYST.
Nota: O operador NOT tambm pode ser utilizado com outros operadores SQL como BETWEEN, LIKE e NULL. ... ... ... ... WHERE WHERE WHERE WHERE NOT job IN ('CLERK', 'ANALYST') sal NOT BETWEEN 1000 AND 1500 ename NOT LIKE '%A%' comm IS NOT NULL
18
Funes Bsicas
Regras de Precedncia
JOB SAL --------- --------PRESIDENT 5000 SALESMAN 1250 SALESMAN 1600 SALESMAN 1500 SALESMAN 1250
No exemplo, existem duas condies: A primeira condio aquela onde o cargo deve ser PRESIDENT e o salrio deve ser maior que 1500. A segunda condio aquela em que o cargo deve ser SALESMAN. Portanto, l-se o comando SELECT como segue: Selecione a linha se o empregado for um presidente e ganhar mais do que $1500 ou se o empregado for um vendedor.
19
Funes Bsicas
No exemplo, existem duas condies: A primeira condio aquela onde o cargo deve ser PRESIDENT ou SALESMAN. A segunda condio aquela onde o salrio deve ser maior que 1500. Portanto, l-se o comando SELECT como segue: Selecione a linha se o empregado for um presidente ou vendedor e se o empregado ganhar mais do que $1500.
20
Funes Bsicas
Clusula ORDER BY
SQL> SELECT ename, job, deptno, hiredate 2 FROM emp 3 ORDER BY hiredate;
ENAME JOB DEPTNO HIREDATE ---------- --------- --------- --------SMITH CLERK 20 17-DEC-80 ALLEN SALESMAN 30 20-FEB-81 ... 14 rows selected.
A ordem das linhas recuperadas no resultado de uma consulta indefinida. A clusula ORDER BY pode ser utilizada para ordenar as linhas. Se utilizada, deve aparecer como a ltima clusula do comando SELECT. Voc pode ordenar por uma expresso ou por um alias de coluna. Sintaxe: SELECT FROM [WHERE [ORDER BY expr table condition(s)] {column, expr} [ASC | DESC]];
Onde: ORDER BY ASC DESC especifica a ordem na qual as linhas recuperadas sero exibidas. ordena as linhas em ordem ascendente. Esta a ordenao padro. ordena as linhas em ordem descendente.
Se a clusula ORDER BY no for utilizada, a ordem em que as linhas sero recuperadas indefinida, e o Servidor Oracle pode no recuperar as linhas duas vezes na mesma ordem para a mesma consulta. Utilize a clusula ORDER BY para exibir as linhas em uma ordem especfica.
21
Funes Bsicas
ENAME JOB DEPTNO HIREDATE ---------- --------- --------- --------ADAMS CLERK 20 12-JAN-83 SCOTT ANALYST 20 09-DEC-82 MILLER CLERK 10 23-JAN-82 JAMES CLERK 30 03-DEC-81 FORD ANALYST 20 03-DEC-81 KING PRESIDENT 10 17-NOV-81 MARTIN SALESMAN 30 28-SEP-81 ... 14 rows selected.
22
Funes Bsicas
EMPNO ENAME ANNSAL --------- ---------- --------7369 SMITH 9600 7900 JAMES 11400 7876 ADAMS 13200 7654 MARTIN 15000 7521 WARD 15000 7934 MILLER 15600 7844 TURNER 18000 ... 14 rows selected.
Voc pode utilizar um alias de coluna na clusula ORDER BY. O exemplo acima ordena os dados pelo salrio anual.
23
Funes Bsicas
ENAME DEPTNO SAL ---------- --------- --------KING 10 5000 CLARK 10 2450 MILLER 10 1300 FORD 20 3000 ... 14 rows selected.
Voc pode ordenar os resultados das consultas por mais de uma coluna. Na clusula ORDER BY, especifique as colunas separando-as por vrgulas. Se voc quiser inverter a ordem de uma coluna, especifique DESC depois de seu nome. Voc pode ordenar por colunas que no esto includas na lista da clusula SELECT. Exemplo: Mostre o nome e o salrio de todos os empregados. Ordene o resultado pelo nmero do departamento e depois por ordem descendente de salrio. SQL> SELECT ename, sal 2 FROM emp 3 ORDER BY deptno, sal DESC;
24
Funes Bsicas
Exerccios 3
1. Crie uma consulta para exibir o nome e o salrio dos empregados que esto ganhando mais que $2850. Salve o comando SQL para um arquivo chamado e3q1.sql. Execute sua consulta. ENAME -------KING JONES FORD SCOTT SAL ---5000 2975 3000 3000
2.
Crie uma consulta para exibir o nome do empregado e o nmero do departamento para o empregado nmero 7566. ENAME DEPTNO ------ -----JONES 20
3.
Altere a consulta em e3q1.sql para exibir o nome e o salrio para todos os empregados cujo salrio no est na faixa de valores de $1500 $2850. Salve o novo comando para um arquivo chamado e3q3.sql. Execute a consulta. ENAME SAL ------- ----KING 5000 JONES 2975 MARTIN 1250 JAMES 950 WARD 1250 FORD 3000 SMITH 800 SCOTT 3000 ADAMS 1100 MILLER 1300 10 rows selected.
4.
Mostre o nome do empregado, o cargo e a data de admisso dos empregados contratados entre 20 de Fevereiro de 1981 e 1 de Maio de 1981. Classifique a consulta em ordem ascendente de data de admisso.
25
Funes Bsicas
5.
Mostre o nome do empregado e o nmero do departamento de todos os empregados que esto no departamento 10 e 30 em ordem alfabtica por nome. ENAME DEPTNO -------- -----KING 10 BLAKE 30 CLARK 10 MARTIN 30 ALLEN 30 TURNER 30 JAMES 30 WARD 30 MILLER 10 9 rows selected.
6.
Altere a consulta em e3q3.sql para listar o nome e o salrio dos empregados que ganham mais do que $1500 e esto no departamento 10 ou 30. Coloque o alias para as colunas Employee e Monthly Salary, respectivamente. Salve o novo comando para um arquivo chamado e3q6.sql. Execute a consulta. Employee -------KING BLAKE CLARK ALLEN Monthly Salary -------------5000 2850 2450 1600
7.
Mostre o nome e a data de admisso de cada empregado que tenha sido contratado em 1982. ENAME -----SCOTT MILLER HIREDATE --------09-DEC-82 23-JAN-82
8.
Funes Bsicas
9.
Mostre o nome, o salrio e a comisso para todos os empregados que ganham comisses. Ordene os dados em ordem descendente de salrio e comisso. ENAME ------ALLEN TURNER MARTIN WARD SAL ---1600 1500 1250 1250 COMM ---300 0 1400 500
Se houver tempo, complete os seguintes exerccios: 10. Mostre o nome de todos os empregados quando a terceira letra de seu nome for um A. ENAME ----------BLAKE CLARK ADAMS
11.
Mostre o nome de todos os empregados que possuem duas letras L em seu nome e esto no departamento 30 ou seu gerente o empregado 7782. ENAME ---------ALLEN MILLER
Se voc quiser um desafio extra, complete os exerccios seguintes: 12. Mostre o nome, o cargo e o salrio para todos os empregados cujo cargo seja CLERK ou ANALYST e seu salrio no seja igual a $1000, $3000 ou $5000. Altere ENAMEa consulta em JOB ------ ------JAMES CLERK SMITH CLERK ADAMS CLERK MILLER CLERK e3q6.sql para mostrar o nome, salrio e comisso para todos os SAL ----950 800 1100 1300
27
13.
4. Funes Bsicas
Funes Bsicas
Objetivos
Descrever os vrios tipos de funes disponveis em SQL Utilizar funes do tipo caractere, numricas e de datas em comandos SELECT Descrever o uso de funes de converso Funes tornam o bloco de consulta bsico mais poderoso e so utilizadas para manipular valores de dados. Este o primeiro de dois captulos que exploram funes. Ser visto neste primeiro captulo funes do tipo caractere, numricas e de data que retornam valores baseadas em uma nica linha, como tambm funes que convertem dados de um tipo para outro, como por exemplo a converso de dados caractere para numrico.
Funes Bsicas
Funes SQL
Funes so uma caracterstica bastante til do SQL e podem ser utilizadas para fazer o seguinte: Executar clculos em dados Modifique itens de dados individuais Manipular um resultado para um grupos de linhas Formatar datas e nmeros para exibio Converter o tipo de dado de colunas
Funes SQL recebem argumento(s) e retornam valor(es). Nota: A maioria das funes descritas neste captulo so especficas verso de SQL da Oracle.
Funes Bsicas
Existem dois tipos distintos de funes: Funes do tipo single-row Funes do tipo multiple-row
Funes Bsicas
Funes do tipo single-row so utilizadas para manipular itens de dados. Elas recebem um ou mais argumentos e retornam um nico valor para cada linha recuperada pela consulta. Um argumento pode ser um dos seguintes: Uma constante fornecida pelo usurio Um valor varivel Um nome de coluna Uma expresso
Voc pode utiliz-las nas clusulas SELECT, WHERE e ORDER BY. Voc pode tambm aninhar funes. Na sintaxe: function_name column expression arg1, arg2 o nome da funo. qualquer coluna nomeada do banco de dados. qualquer string de caractere ou expresso calculada. so quaisquer argumentos a serem utilizadas pela funo.
Funes Bsicas
Este captulo explica as seguintes funes do tipo single-row: Funes de caracteres: Recebem parmetros caractere e podem retornar valores numricos ou caractere. Funes numricas: Recebem parmetros numricos e retornam valores numricos. Funes de data: Operam em valores do tipo de dado DATE. Todas as funes de data retornam um valor do tipo de dado data, exceto a funo MONTHS_BETWEEN que retorna um nmero. Funes de converso: Convertem um valor de um tipo de dado para outro. Funes genricas: NVL DECODE
Funes Bsicas
Funes de Caracteres
Funes de caracteres aceitam dados do tipo caractere como entrada e podem retornar valores do tipo caractere ou numrico. Funes de caracteres podem ser divididas em: Funes de converso entre maisculas/minsculas Funes de manipulao de caracteres
Funo LOWER(column|expression) UPPER(column|expression) INITCAP(column|expression) CONCAT(column1|expression1, column2|expression2) SUBSTR(column|expression,m[,n]) LENGTH(column|expression) INSTR(column|expression,m) LPAD(column|expression, n, 'string') Propsito Converte strings de caracteres para minsculas Converte strings de caracteres para maisculas Converte strings de caracteres deixando a primeira letra de cada palavra em maiscula e as demais em minsculas Concatena a primeira string de caracteres com a segunda. Equivalente ao operador de concatenao ( || ) Retorna os caracteres especificados a partir da string de caracteres, comeando na posio m,com tamanho de n caracteres. Se m for negativo, a contagem inicia a partir do final da string. Se n for omitido, so retornados todos os caracteres at o final da string Retorna o nmero de caracteres da string Retorna a posio numrica do caracter dentro da string Retorna uma string com tamanho total de n alinhada direita
Funes Bsicas
LOWER, UPPER e INITCAP so as trs funes de converso entre maisculas e minsculas. LOWER: converte todos os caracteres de uma string para minsculas UPPER: converte todos os caracteres de uma string para maisculas INITCAP: converte a primeira letra de cada palavra para maisculas e as demais para minsculas SQL> SELECT ' 2 3 FROM 'The job title for ' || INITCAP(ename) || ' is || LOWER(job) AS "EMPLOYEE DETAILS" emp;
EMPLOYEE DETAILS ----------------------------------------The job title for King is president The job title for Blake is manager The job title for Clark is manager ... 14 rows selected.
Funes Bsicas
O exemplo acima exibe o nmero de empregado, o nome e nmero do departamento do empregado BLAKE. A clusula WHERE do primeiro comando SQL especifica o nome de empregado como blake. Uma vez que todos os dados na tabela EMP esto armazenados em maisculas, o nome ' blake' no possui um correspondente na tabela EMP e como resultado nenhuma linha selecionada. A clusula WHERE do segundo comando SQL especifica que o nome do empregado na tabela EMP deve ser convertido para minsculas e ento comparado com blake. Considerando que ambos os nomes esto em minsculas agora, uma correspondncia encontrada e uma linha selecionada. A clusula WHERE pode ser reescrita da seguinte maneira para obter o mesmo resultado: WHERE ename = 'BLAKE'
O nome no resultado da consulta aparece como foi armazenado no banco de dados. Para exibir o nome somente com a primeira letra em maiscula, utilize a funo INITCAP no comando SELECT.
Funes Bsicas
10
Funes Bsicas
CONCAT, SUBSTR, LENGTH, INSTR e LPAD so as cinco funes de manipulao de caracteres apresentadas neste captulo. CONCAT: Concatena strings de caracteres, sendo limitado ao uso de apenas dois parmetros. SUBSTR: Extrai uma string de tamanho determinado. LENGTH: Exibe o tamanho de uma string como um valor numrico. INSTR: Encontra a posio numrica de um caractere na string. LPAD: Retorna uma string de caracteres do tamanho especificado alinhada direita. Nota: A funo de manipulao de caracteres RPAD semelhante a funo LPAD, porm retorna a string de caracteres alinhada esquerda.
11
Funes Bsicas
ENAME CONCAT(ENAME,JOB) LENGTH(ENAME) INSTR(ENAME,'A') ---------- ------------------- ---------------------------MARTIN MARTINSALESMAN 6 2 ALLEN ALLENSALESMAN 5 1 TURNER TURNERSALESMAN 6 0 WARD WARDSALESMAN 4 2
O exemplo acima exibe o nome do empregado concatenado com o cargo, o tamanho do nome do empregado e a posio numrica da letra A no nome, para todos os empregados que esto alocados em vendas. Exemplo: Modificando o comando SQL acima para exibir os dados para os empregados cujo nome termine com a letra N: SQL> SELECT 2 3 FROM WHERE ename, CONCAT(ename, job), LENGTH(ename), INSTR(ename, 'A') emp SUBSTR(ename, -1, 1) = 'N';
12
Funes Bsicas
ENAME CONCAT(ENAME,JOB) LENGTH(ENAME) INSTR(ENAME,'A') -------- ------------------- ---------------------------MARTIN MARTINSALESMAN 6 2 ALLEN ALLENSALESMAN 5 1
13
Funes Bsicas
Funes Numricas
Funes numricas recebem parmetros numricos e retornam valores numricos. Esta seo descreve algumas das funes numricas.
Funo ROUND(column|expression, n) Propsito Arredonda a coluna, expresso ou valor para n casas decimais. Se n for omitido, ser considerado como 0, ou seja, sem casas decimais. Se n for negativo, os nmeros esquerda do ponto decimal sero arredondados. Trunca a coluna, expresso ou valor para n casas decimais. Se n for omitido, ser considerado como 0. Se n for negativo, os nmeros esquerda do ponto decimal sero truncados para zero. Retorna o resto da diviso de m por n.
TRUNC(column|expression,n) MOD(m,n)
14
Funes Bsicas
A funo ROUND arredonda uma coluna, expresso ou valor para n casas decimais. Se o segundo argumento 0 ou no for informado, o valor arredondado para zero casas decimais. Se o segundo argumento 2, o valor arredondado para duas casas decimais. Reciprocamente, se o segundo argumento -2, o valor arredondado duas casas decimais para esquerda. A funo ROUND tambm pode ser utilizada com funes de data.
15
Funes Bsicas
A funo TRUNC trunca a coluna, expresso ou valor para n casas decimais. A funo TRUNC opera com argumentos semelhantes aos da funo ROUND. Se o segundo argumento 0 ou no for informado, o valor truncado para zero casas decimais. Se o segundo argumento 2, o valor truncado para duas casas decimais. Reciprocamente, se o segundo argumento -2, o valor truncado para duas casas decimais esquerda. Como a funo ROUND, a funo TRUNC tambm pode ser utilizada com funes de data.
16
Funes Bsicas
ENAME SAL COMM MOD(SAL,COMM) ---------- --------- --------- ------------MARTIN 1250 1400 1250 ALLEN 1600 300 100 TURNER 1500 0 1500 WARD 1250 500 250
A funo MOD encontra o resto da diviso do valor 1 pelo valor 2. O exemplo acima calcula o resto da diviso do salrio pela comisso para todos os empregados cujo cargo seja SALESMAN.
17
Funes Bsicas
SYSDATE
SYSDATE uma funo de data que retorna a data e hora atual. Voc pode utilizar SYSDATE da mesma maneira que voc utiliza qualquer outro nome de coluna. Por exemplo, voc pode exibir a data atual selecionando SYSDATE a partir de uma tabela. habitual selecionar SYSDATE a partir de uma tabela dummy chamada DUAL.
DUAL
A tabela DUAL pertence ao usurio SYS e pode ser acessada por todos os usurios. Contm uma coluna, DUMMY, e uma linha com o valor X. A tabela DUAL til quando voc quer retornar um valor uma nica vez, podendo este valor ser uma constante, pseudocoluna ou expresso que no so derivadas de uma tabela com dados de usurio. Exemplo: Mostre a data corrente utilizando a tabela DUAL. SQL> SELECT 2 FROM SYSDATE DUAL;
18
Funes Bsicas
19
Funes Bsicas
O exemplo acima exibe o nome e o nmero de semanas trabalhadas para todos os empregados do departamento 10. Ele subtrai a data atual (SYSDATE) a partir da data na qual o empregado foi contratado e divide o resultado por 7 para calcular o nmero de semanas que um trabalhador est empregado. Nota: SYSDATE uma funo SQL que retorna a data e hora atual. Seus resultados podem diferir do exemplo.
20
Funes Bsicas
Funes de Data
Funes de data operam em datas Oracle. Todas as funes de data retornam um valor do tipo de dado DATE, exceto a funo MONTHS_BETWEEN que retorna um valor numrico. MONTHS_BETWEEN(date1, date2): Encontra o nmero de meses entre date1 e date2. O resultado pode ser positivo ou negativo. Se date1 posterior a date2, o resultado positivo; se date1 mais recente que date2, o resultado negativo. A parte no inteira do resultado representa uma poro do ms. ADD_MONTHS(date, n): Adiciona n nmero de meses do calendrio para a data. n deve ser um inteiro e pode ser negativo. NEXT_DAY(date, 'char'): Encontra a data do prximo dia da semana ('char') a partir da data do parmetro date; 'char' pode ser um nmero representando um dia ou uma string de caracteres. LAST_DAY(date): Encontra a data do ltimo dia do ms a partir da data especificada no parmetro date. ROUND(date [, ' fmt']): Retorna a data arredondada para a unidade especificada pelo formato fmt. Se o formato fmt for omitido, a data arredondada para a data mais prxima. TRUNC(date [, ' fmt']): Retorna a data com a poro de tempo do dia truncada unidade especificada pelo formato fmt. Se o formato fmt for omitido, a data truncada para o dia mais prximo.
21
Funes Bsicas
Exemplo: Para todos os empregados contratados a menos de 200 meses, selecione o nmero do empregado, a data de admisso, o nmero de meses trabalhados, data de reviso com seis meses, primeira sexta-feira aps a data de admisso e o ltimo dia do ms em que foi contratado. SQL> SELECT empno, hiredate, 2 MONTHS_BETWEEN(SYSDATE, hiredate) MONTHS, 3 ADD_MONTHS(hiredate, 6) REVIEW, 4 NEXT_DAY(hiredate, 'FRIDAY'), LAST_DAY(hiredate) 5 FROM emp 6 WHERE MONTHS_BETWEEN (SYSDATE, hiredate) < 200;
EMPNO HIREDATE MONTHS REVIEW NEXT_DAY( --------- --------- --------- --------- --------7839 17-NOV-81 192.24794 17-MAY-82 20-NOV-81 7698 01-MAY-81 198.76407 01-NOV-81 08-MAY-81 ... 11 rows selected.
22
Funes Bsicas
As funes ROUND e TRUNC podem ser utilizadas para valores numricos e de data. Quando utilizadas com datas, elas arredondam ou truncam para o modelo de formato especificado. Portanto, voc pode arredondar datas para o mais prximo ano ou ms. Exemplo: Compare as datas de admisso para todos os empregados que comearam em 1987. Mostre o nmero do empregado, a data de admisso e o ms de incio utilizando as funes ROUND e TRUNC. SQL> SELECT 2 3 4 FROM 5 WHERE empno, hiredate, ROUND(hiredate, 'MONTH'), TRUNC(hiredate, 'MONTH') emp hiredate like '%87';
23
Funes Bsicas
Funes de Converso
Alm dos tipos de dados Oracle, as colunas de uma tabela no banco de dados Oracle8i podem ser definidas utilizando tipos de dados ANSI, DB2 e SQL/DS. Entretanto, o Servidor Oracle internamente converte tais tipos de dados para tipos de dados Oracle8i. Em alguns casos, o Servidor Oracle permite dados de um determinado tipo onde ele esperava dados de um tipo diferente. Isto permitido porque o Servidor Oracle pode converter os dados automaticamente para o tipo de dado esperado. Esta converso de tipo de dado pode ser feita implicitamente pelo Servidor Oracle ou explicitamente pelo usurio. Converses implcitas de tipo de dado ocorrem de acordo com as regras apresentadas a seguir. Converses explcitas de tipo de dado so feitas utilizando as funes de converso. As funes de converso convertem um valor de um tipo de dado para outro. Nota: Embora a converso de tipo de dado implcita esteja disponvel, recomendado que voc faa a converso explcita para assegurar confiabilidade de seus comandos SQL.
A atribuio tem sucesso se o Servidor Oracle puder converter o tipo de dado do valor utilizado na atribuio para o tipo de dado do destino da atribuio. Para a avaliao de uma expresso, o Servidor Oracle pode converter automaticamente o seguinte: VARCHAR2 ou CHAR para NUMBER VARCHAR2 ou CHAR para DATE Em geral, o Servidor Oracle utiliza a regra para expresses quando uma converso de tipo de dado necessria e a regra de converso em atribuies no pode ser aplicada. Nota: Converses de CHAR para NUMBER s tem sucesso se a string de caracteres representa um nmero vlido. Converses de CHAR para DATE s tem sucesso se a string de caracteres estiver no formato padro DD-MON-YY.
On Targget Treinamento e Consultoria 24
Funes Bsicas
O SQL prov trs funes para converter um valor de um tipo de dado para outro.
Funo TO_CHAR(number|date,['fmt']) TO_NUMBER(char) TO_DATE(char,['fmt']) Propsito Converte um valor numrico ou data para uma string de caracteres do tipo VARCHAR2 no formato fmt Converte uma string de caracteres contendo apenas dgitos para um nmero Converte uma string de caracteres representando uma data para um valor de data de acordo com o formato fmt especificado (Se fmt for omitido, o formato padro DD-MON-YY)
25
Funes Bsicas
26
Funes Bsicas
Formatos de Hora
Utilize os formatos listados na tabela abaixo para exibir informaes de hora e literais e para mudar nmeros para nmeros soletrados.
Elemento AM ou PM A.M. ou P.M. HH ou HH12 ou HH24 MI SS SSSSS Descrio Indicador meridiano Indicador meridiano com pontos Hora do dia ou hora (112) ou hora (023) Minuto (059) Segundo (059) Segundos desde meia noite (086399)
27
Funes Bsicas
Outros Formatos
Elemento / . , "of the" Descrio A pontuao reproduzida no resultado Strings entre aspas duplas so reproduzidas no resultado
28
Funes Bsicas
ENAME HIREDATE ---------- ----------------KING 17 November 1981 BLAKE 1 May 1981 CLARK 9 June 1981 JONES 2 April 1981 MARTIN 28 September 1981 ALLEN 20 February 1981 ... 14 rows selected.
O comando SQL acima exibe o nome e as datas de admisso para todos os empregados. A data de admisso formatada como '17 November 1981'. Exemplo: Modificando o comando acima para exibir as datas em um formato que se parece com 'Seventh of February of 1981 08:00:00 AM'. SQL> SELECT 2 3 HIREDATE 4 FROM ename, TO_CHAR(hiredate, 'fmDdspth "of" Month YYYY fmHH:MI:SS AM') emp;
ENAME HIREDATE ---------- -----------------------------------------------KING Seventeenth of November 1981 12:00:00 AM BLAKE First of May 1981 12:00:00 AM ... 14 rows selected.
29
Funes Bsicas
Quando trabalhar com valores numricos como se fossem strings de caractere, voc deve converter esses nmeros para o tipo de dado caractere utilizando a funo TO_CHAR que traduz um valor do tipo de dado NUMBER para o tipo de dado VARCHAR2. Esta tcnica especialmente til em concatenaes.
30
Funes Bsicas
SALARY -------$3,000
Diretrizes
O Servidor Oracle exibe uma string com o caractere (#) ao invs de um nmero quando o nmero de dgitos excedem o nmero de dgitos providos pela mscara. O Servidor Oracle arredonda o valor decimal armazenado para o nmero de espaos decimais providos pela mscara.
31
Funes Bsicas
TO_DATE(char[, 'fmt'])
Voc pode querer converter uma string de caracteres para um nmero ou uma data. Para realizar esta tarefa, voc utiliza as funes TO_NUMBER e TO_DATE. A mscara que voc pode escolher baseia-se nos elementos de formato apresentados anteriormente. Exemplo: Mostre os nomes e as datas de admisso de todos os empregados que foram admitidos em 22 de fevereiro de 1981 (February 22, 1981). SQL> SELECT 2 FROM 3 WHERE 1981', 4 ename, hiredate emp hiredate = TO_DATE('February 22, 'Month dd, YYYY');
32
Funes Bsicas
Formato de Data RR
O formato de data RR semelhante ao elemento YY, entretanto, permite especificar sculos diferentes. Voc pode utilizar o elemento de formatao de data RR no lugar do YY, de forma que o sculo do valor retornado varie de acordo com o ano de dois dgitos especificado e os ltimos dois dgitos do ano atual. A tabela no grfico acima resume o comportamento do elemento de RR.
Ano atual 1994 1994 2001 Data Especificada 27-OCT-95 27-OCT-17 27-OCT-17 (RR) 1995 2017 2017 (YY) 1995 1917 2017
33
Funes Bsicas
Funo NVL
NVL(comm,0) NVL(hiredate,'01-JAN-97') NVL(job,Cargo Desconhecido')
Para converter um valor nulo para outro valor do mesmo tipo, utilize a funo NVL Sintaxe: NVL(expr1, expr2)
Onde: expr1 expr2 o valor ou expresso de origem que pode conter nulo. o valor de destino utilizado quando o valor de origem for nulo.
Voc pode utilizar a funo NVL para converter qualquer tipo de dado, porm, o valor de retorno deve sempre ser do mesmo tipo de dado do parmetro expr1.
34
Funes Bsicas
ENAME SAL COMM (SAL*12)+NVL(COMM,0) ---------- --------- --------- -------------------KING 5000 60000 BLAKE 2850 34200 CLARK 2450 29400 JONES 2975 35700 MARTIN 1250 1400 16400 ALLEN 1600 300 19500 ... 14 rows selected.
Para calcular a compensao anual de todos os empregados, voc precisa multiplicar o salrio mensal por 12 e ento adicionar o valor da comisso. SQL> SELECT 2 FROM ename, sal, comm, (sal*12)+comm emp;
ENAME JOB (SAL*12)+COMM ---------- --------- ------------KING PRESIDENT BLAKE MANAGER CLARK MANAGER JONES MANAGER MARTIN SALESMAN 16400 ... 14 rows selected.
Observe que a compensao anual s calculada para aqueles empregados que ganham comisso. Se em uma expresso qualquer valor de coluna for nulo, o resultado tambm ser nulo. Para calcular valores para todos os empregados, voc deve converter o valor nulo para um nmero antes de aplicar o operador aritmtico. No exemplo acima, a funo NVL utilizada para converter valores nulos para zero.
On Targget Treinamento e Consultoria 35
Funes Bsicas
Funo DECODE
DECODE(col/expression, search1, result1 [, search2, result2,...,] [, default])
A funo DECODE decodifica uma expresso de modo semelhante a lgica IF-THEN-ELSE utilizada em diversas linguagens. A funo DECODE decodifica a expresso aps compar-la com cada valor de pesquisa. Se a expresso for igual ao valor de pesquisa, o resultado correspondente retornado. Se o valor default for omitido, um valor nulo ser retornado quando o parmetro col/expression no for igual a nenhum dos valores de pesquisa.
36
Funes Bsicas
JOB SAL REVISED_SALARY --------- --------- -------------PRESIDENT 5000 5000 MANAGER 2850 3420 MANAGER 2450 2940 ... 14 rows selected.
No comando SQL acima, o valor de JOB decodificado. Se JOB for ANALYST, o aumento de salrio de 10%; se JOB for CLERK, o aumento de salrio de 15%; se JOB for MANAGER, o aumento de salrio de 20%. Para todos os outros cargos, no h nenhum aumento de salrio. O mesmo comando pode ser escrito como um comando IF-THEN-ELSE: IF job = IF job = IF job = ELSE sal 'ANALYST' 'CLERK' 'MANAGER' = sal THEN sal = sal*1.1 THEN sal = sal*1.15 THEN sal = sal*1.20
37
Funes Bsicas
Aninhando Funes
Funes bsicas (single-row) podem ser aninhadas em qualquer nvel. Funes aninhadas so avaliadas do nvel mais interno para o nvel mais externo. Abaixo seguem alguns exemplos para mostrar a flexibilidade destas funes. SQL> SELECT 2 3 FROM 4 WHERE ename, NVL(TO_CHAR(mgr),'Sem Gerente') emp mgr IS NULL;
O exemplo acima exibe o presidente da companhia que no possui nenhum gerente. A avaliao do comando SQL envolve dois passos: 1. Avalia a funo interna para converter um valor numrico para uma string de caracteres. Resultado1 = TO_CHAR(mgr) 2. Avalia a funo externa para substituir o valor nulo por uma string de texto. NVL(Resultado1, 'Sem Gerente') A expresso inteira torna-se o cabealho da coluna, uma vez que nenhum alias de coluna foi especificado. Exemplo: Mostre a data da prxima sexta-feira seis meses aps a data de admisso. A data resultante deve ser formatada como 'Friday, March 12th, 1982'. Ordene o resultado pela data de admisso.
38
Funes Bsicas
TO_CHAR(NEXT_DAY(ADD_MONTHS (hiredate, 6), 'FRIDAY'), 'fmDay, Month ddth, YYYY') "Next 6 Month Review" emp hiredate;
39
Funes Bsicas
Exerccios 4
1. Escreva uma consulta para exibir a data atual. Coloque o alias de coluna como Date. Date --------28-OCT-97
2.
Mostre o nmero do empregado, o nome, o salrio e o salary com um aumento de 15%. Coloque o alias da coluna como New Salary. Salve o comando SQL para um arquivo chamado e4q2.sql. Execute a consulta do arquivo e4q2.sql. EMPNO ENAME SAL New Salary ----- ------- ----- ---------7839 KING 5000 5750 7698 BLAKE 2850 3278 7782 CLARK 2450 2818 7566 JONES 2975 3421 7654 MARTIN 1250 1438 7499 ALLEN 1600 1840 7844 TURNER 1500 1725 7900 JAMES 950 1093 7521 WARD 1250 1438 7902 FORD 3000 3450 7369 SMITH 800 920 7788 SCOTT 3000 3450 7876 ADAMS 1100 1265 7934 MILLER 1300 1495 14 rows selected.
3.
4.
Altere a consulta em e4q2.sql para adicionar uma nova coluna que subtraia o salrio antigo do novo salrio. Coloque o alias da coluna como Increase. Reexecute a consulta.
40
Funes Bsicas
ENAME SAL New Salary Increase ------ ----- ---------- -------KING 5000 5750 750 BLAKE 2850 3278 428 CLARK 2450 2818 368 JONES 2975 3421 446
5.
Mostre o nome do empregado, a data de admisso e data de reviso do salrio, que deve ser a primeira segunda-feira aps seis meses de trabalho. Coloque o alias da coluna como REVIEW. Formate a data para uma padro semelhante a Sunday, the Seventh of September, 1981.
ENAME HIREDATE REVIEW ----- -------- ----------------------------------------KING 17-NOV-81 Monday, the Twenty-Fourth of May, 1982 BLAKE 01-MAY-81 Monday, the Second of November, 1981 CLARK 09-JUN-81 Monday, the Fourteenth of December, 1981 JONES 02-APR-81 Monday, the Fifth of October, 1981 MARTIN 28-SEP-81 Monday, the Twenty-Ninth of March, 1982 ALLEN 20-FEB-81 Monday, the Twenty-Fourth of August, 1981 TURNER 08-SEP-81 Monday, the Fifteenth of March, 1982 JAMES 03-DEC-81 Monday, the Seventh of June, 1982 WARD 22-FEB-81 Monday, the Twenty-Fourth of August, 1981 FORD 03-DEC-81 Monday, the Seventh of June, 1982 SMITH 17-DEC-80 Monday, the Twenty-Second of June, 1981 SCOTT 09-DEC-82 Monday, the Thirteenth of June, 1983 ADAMS 12-JAN-83 Monday, the Eighteenth of July, 1983 MILLER 23-JAN-82 Monday, the Twenty-Sixth of July, 1982 14 rows selected.
6.
Mostre o nome de cada empregado e calcule o nmero de meses entre a data atual e a data na qual ele foi contratado. Coloque o alias da coluna como MONTHS_WORKED. Ordene o resultado pelo nmero de meses trabalhados. Arredonde o nmero de meses para o nmero inteiro mais prximo.
41
Funes Bsicas
ENAME MONTHS_WORKED ------------------ADAMS 177 SCOTT 178 MILLER 188 JAMES 190 FORD 190 KING 191 MARTIN 192 TURNER 193 CLARK 196 BLAKE 197 JONES 198 WARD 199 ALLEN 199 SMITH 202 14 rows selected
7.
Escreva uma consulta que reproduza o seguinte para cada empregado, colocando o alias da coluna como Dream Salaries: <nome do empregado> earns <salrio> monthly but wants <3 vezes o salrio>. Dream Salaries ---------------------------------------------------KING earns $5,000.00 monthly but wants $15,000.00. BLAKE earns $2,850.00 monthly but wants $8,550.00. CLARK earns $2,450.00 monthly but wants $7,350.00. JONES earns $2,975.00 monthly but wants $8,925.00. MARTIN earns $1,250.00 monthly but wants $3,750.00. ALLEN earns $1,600.00 monthly but wants $4,800.00 TURNER earns $1,500.00 monthly but wants $4,500.00. JAMES earns $950.00 monthly but wants $2,850.00. WARD earns $1,250.00 monthly but wants $3,750.00. FORD earns $3,000.00 monthly but wants $9,000.00. SMITH earns $800.00 monthly but wants $2,400.00. SCOTT earns $3,000.00 monthly but wants $9,000.00. ADAMS earns $1,100.00 monthly but wants $3,300.00 MILLER earns $1,300.00 monthly but wants $3,900.00. 14 rows selected.
Se houver tempo, complete os seguintes exerccios: 8. Crie uma consulta para exibir o nome e o salrio para todos os empregados. Formate o salrio para 15 caracteres de tamanho, preenchendo os espaos esquerda com o caractere $. Coloque o alias da coluna como SALARY.
42
Funes Bsicas
ENAME SALARY -------- --------------SMITH $$$$$$$$$$$$800 ALLEN $$$$$$$$$$$1600 WARD $$$$$$$$$$$1250 JONES $$$$$$$$$$$2975 MARTIN $$$$$$$$$$$1250 BLAKE $$$$$$$$$$$2850 CLARK $$$$$$$$$$$2450 SCOTT $$$$$$$$$$$3000 KING $$$$$$$$$$$5000 TURNER $$$$$$$$$$$1500 ADAMS $$$$$$$$$$$1100 JAMES $$$$$$$$$$$$950 FORD $$$$$$$$$$$3000 MILLER $$$$$$$$$$$1300 14 rows selected.
9.
Escreva uma consulta que mostre o nome do empregado com a primeira letra em maiscula e as demais em minsculas, juntamente com o tamanho de seu nome, para todos os empregados cujo nome inicie com a letra J, A ou M. Coloque um alias apropriado para cada coluna. Name Length ------- -----Jones 5 Martin 6 Allen 5 James 5 Adams 5 Miller 6 6 rows selected.
10.
Mostre o nome, a data de admisso e o dia da semana no qual o empregado comeou a trabalhar. Coloque o alias da coluna como DAY. Ordene o resultado pelo dia da semana, comeando com Monday.
43
Funes Bsicas
ENAME HIREDATE -------------MARTIN 28-SEP-81 CLARK 09-JUN-81 KING 17-NOV-81 TURNER 08-SEP-81 SMITH 17-DEC-80 ADAMS 12-JAN-83 JONES 02-APR-81 FORD 03-DEC-81 SCOTT 09-DEC-82 JAMES 03-DEC-81 ALLEN 20-FEB-81 BLAKE 01-MAY-81 MILLER 23-JAN-82 WARD 22-FEB-81 14 rows selected
DAY ----------MONDAY TUESDAY TUESDAY TUESDAY WEDNESDAY WEDNESDAY THURSDAY THURSDAY THURSDAY THURSDAY FRIDAY FRIDAY SATURDAY SUNDAY
Se voc quiser um desafio extra, complete os exerccios seguintes: 11. Crie uma consulta que mostre o nome do empregado e o valor da comisso. Se o empregado no recebe comisso, mostre a string No Commission. Coloque o alias de coluna como COMM.
44
ENAME -----SMITH ALLEN WARD JONES MARTIN BLAKE CLARK SCOTT KING TURNER ADAMS JAMES FORD MILLER 14 rows
COMM ----------No Commission 300 500 No Commission 1400 No Commission No Commission No Commission No Commission 0 No Commission No Commission No Commission No Commission selected.
Funes Bsicas
Objetivos
Escrever comandos SELECT para acessar dados de mais de uma tabela utilizando diversos tipos de joins. Visualizar dados que geralmente no correspondem a condio de join utilizando outer joins. Executar um join de uma tabela com ela mesma (self join). Este captulo discute como obter dados de vrias tabelas, utilizando os diferentes mtodos disponveis
Funes Bsicas
s vezes voc precisa utilizar dados de mais de uma tabela. No exemplo acima, o relatrio exibe dados de duas tabelas diferentes. EMPNO existe na tabela EMP. DEPTNO existe nas tabelas EMP e DEPT. LOC existe na tabela DEPT. Para produzir o relatrio, voc precisa unir as tabelas EMP e DEPT e acessar os dados a partir de ambas.
Funes Bsicas
O que um Join?
SELECT FROM WHERE table1.column, table2.column table1, table2 table1.column1 = table2.column2;
Quando dados de mais de uma tabela so requeridos, uma condio de join utilizada. Linhas em uma tabela podem ser unidas linhas em outra tabela de acordo com valores comuns que existem em colunas correspondentes, que normalmente so colunas de chaves primrias e estrangeiras. Para exibir dados de duas ou mais tabelas relacionadas, escreva uma condio de join simples na clusula WHERE. Sintaxe: table.column denota a tabela e coluna a partir da qual os dados so recuperados. table1.column1 a condio que une (ou relaciona) as tabelas. = table2.column2
Diretrizes
Quando escrever um comando SELECT que relaciona tabelas, preceda o nome das colunas com o nome da tabela para obter maior clareza e melhorar o acesso ao banco de dados. Se o mesmo nome de coluna existir em mais de uma tabela, o nome de coluna deve ser prefixado com o nome da tabela. Para unir n tabelas, voc precisa de um mnimo de (n-1) condies de join. Portanto, para unir quatro tabelas, um mnimo de trs joins so necessrios. Esta regra pode no se aplicar se a tabela possuir uma chave primria concatenada. Neste caso mais de uma coluna necessria para identificar cada linha de forma exclusiva.
Funes Bsicas
Produto Cartesiano
Quando uma condio de join invalida ou completamente omitida, o resultado um produto cartesiano no qual sero exibidas todas as combinaes das linhas. Todas as linhas da primeira tabela so unidas todas as linhas da segunda tabela. Um produto cartesiano tende a gerar um nmero grande de linhas, e seu resultado raramente til. Voc sempre deveria incluir uma condio de join vlida na clusula WHERE, a menos que voc tenha uma necessidade especfica para combinar todas as filas de todas as tabelas.
Funes Bsicas
Um produto cartesiano gerado se uma condio de join for omitida. O exemplo no grfico acima exibe o nome do empregado e o nome do departamento a partir das tabelas EMP e DEPT. Uma vez que nenhuma clusula WHERE foi especificada, todas as linhas (14 linhas) da tabela EMP so unidas com todas as linhas (4 linhas) da tabela DEPT, gerando um total de 56 linhas na consulta. SQL> SELECT 2 FROM ename, dname emp, dept;
ENAME DNAME ---------- -------------KING ACCOUNTING BLAKE ACCOUNTING ... KING RESEARCH BLAKE RESEARCH ... 56 rows selected.
Funes Bsicas
Tipos de Joins
Existem dois tipos principais de condies de join: Equijoins Non-equijoins Mtodos adicionais de join incluem o seguinte: Outer joins Self joins Set Operators
Funes Bsicas
O que um Equijoin?
Para determinar o nome do departamento de um empregado, voc compara o valor na coluna DEPTNO da tabela EMP com os valores de DEPTNO da tabela DEPT. A relao entre as tabelas EMP e DEPT um equijoin, ou seja, os valores na coluna DEPTNO em ambas as tabelas devem ser iguais. Freqentemente, este tipo de join envolve complementos de chave primria e estrangeira. Nota: Equijoins tambm so chamados de joins simples ou de inner joins.
Funes Bsicas
EMPNO ENAME DEPTNO DEPTNO LOC ----- ------ ------ ------ --------7839 KING 10 10 NEW YORK 7698 BLAKE 30 30 CHICAGO 7782 CLARK 10 10 NEW YORK 7566 JONES 20 20 DALLAS ... 14 rows selected.
No exemplo acima: A clusula SELECT especifica os nomes de coluna recuperar: nome de empregado, nmero do empregado e o nmero do departamento que so colunas da tabela EMP. nmero do departamento, nome do departamento e a localizao que so colunas da tabela DEPT. A clusula FROM especifica as duas tabelas que o banco de dados deve acessar: Tabela EMP. Tabela DEPT. A clusula WHERE especifica como as tabelas sero unidas: EMP.DEPTNO = DEPT.DEPTNO Uma vez que a coluna DEPTNO comum a ambas as tabelas, deve ser prefixada com o nome da tabela para evitar ambigidade.
Funes Bsicas
10
Funes Bsicas
Em adio ao join, voc pode ter critrios adicionais na clusula WHERE. Por exemplo, para exibir o nmero do empregado, o nome, o nmero do departamento e a localizao do departamento, apenas para o empregado KING, voc precisa de uma condio adicional na clusula WHERE. SQL> SELECT 2 FROM 3 WHERE 4 AND empno, ename, emp.deptno, loc emp, dept emp.deptno = dept.deptno INITCAP(ename) = 'King';
EMPNO ENAME DEPTNO LOC --------- ---------- --------- ------------7839 KING 10 NEW YORK
11
Funes Bsicas
Qualificar os nomes de coluna com os nomes de tabela pode consumir muito tempo, particularmente se os nomes de tabelas forem longos. Voc pode utilizar alias de tabela em vez de nomes de tabela. Da mesma maneira que um alias de coluna fornece um outro nome para uma coluna, um alias de tabela fornece um outro nome para uma tabela. Alias de tabela ajudam a manter o cdigo SQL menor, utilizando menos memria. Observe que no exemplo os alias de tabela so identificados na clusula FROM. O nome da tabela especificado por completo, seguido por um espao e ento pelo alias de tabela. A tabela EMP recebeu o alias E, enquanto que a tabela DEPT recebeu o alias D.
Diretrizes:
Alias de tabelas podem ter at 30 caracteres de tamanho, porm, quanto menor melhor. Se um alias de tabela for utilizado para um nome de tabela especfico na clusula FROM, ento este alias de tabela deve ser utilizado para substituir o nome da tabela em todo o comando SELECT. Alias de tabelas devem ser significativos. O alias de tabela s vlido para o comando SELECT no qual foi declarado.
12
Funes Bsicas
s vezes voc pode precisar unir mais de duas tabelas. Por exemplo, para exibir o nome, os pedidos emitidos, os nmeros dos itens de pedido, o total de cada item e o total de cada pedido do cliente TKB SPORT SHOP, voc ter que relacionar as tabelas CUSTOMER, ORD e ITEM.
c.name, o.ordid, i.itemid, i.itemtot, o.total customer c, ord o, item i c.custid = o.custid o.ordid = i.ordid c.name = 'TKB SPORT SHOP';
NAME ORDID ITEMID ITEMTOT TOTAL ------------ --------- --------- --------- --------TKB SPORT SHOP 610 3 58 101.4 TKB SPORT SHOP 610 1 35 101.4 TKB SPORT SHOP 610 2 8.4 101.4
13
Funes Bsicas
Non-Equijoins
A relao entre a tabela EMP e a tabela SALGRADE um non-equijoin, significando que nenhuma coluna da tabela EMP corresponde diretamente a uma coluna da tabela SALGRADE. A relao entre as duas tabela que a coluna SAL da tabela EMP est entre as colunas LOSAL e HISAL da tabela SALGRADE. A relao obtida utilizando um operador diferente de igual (=).
14
Funes Bsicas
ENAME SAL GRADE ---------- --------- --------JAMES 950 1 SMITH 800 1 ADAMS 1100 1 ... 14 rows selected.
O exemplo acima cria um non-equijoin para avaliar o nvel do salrio de um empregado. O salrio deve estar entre qualquer faixa de valor de menor e maior salrio. importante observar que todos os empregados aparecem precisamente uma nica vez quando a consulta executada. Nenhum empregado repetido na lista. Existem duas razes para isto: Nenhuma das linhas da tabela de nveis de salrio contm graus que se sobrepem. Ou seja, o valor do salrio de um empregado s pode estar entre os valores de menor e maior salrio de uma das linhas da tabela de nveis de salrio. Todos os salrios dos empregados esto dentro dos limites fornecidos pela tabela de nveis de salrio. Ou seja, nenhum empregado ganha menos que o menor valor contido na coluna LOSAL ou mais que o maior valor contido na coluna HISAL. Nota: Outros operadores como <= e >= podem ser utilizados, porm o operador BETWEEN o mais simples. Lembre-se de especificar o menor valor primeiro e o maior valor por ltimo quando utilizar o operador BETWEEN. Alias de tabela foram especificados por razes de desempenho, no por causa de possveis ambigidades.
15
Funes Bsicas
Outer Joins
Se uma linha no satisfaz a condio de join, esta linha no aparecer no resultado da consulta. Por exemplo, na condio de equijoin das tabelas EMP e DEPT, o departamento OPERAES no aparece porque ningum trabalha neste departamento. SQL> SELECT 2 FROM 3 WHERE e.ename, e.deptno, d.dname emp e, dept d e.deptno = d.deptno;
ENAME DEPTNO ---------- --------KING 10 BLAKE 30 CLARK 10 JONES 20 ... ALLEN 30 TURNER 30 JAMES 30 ... 14 rows selected.
16
Funes Bsicas
A(s) linha(s) sem correspondncia podem ser recuperadas se um operador de outer join for utilizado na condio de join. O operador o sinal de adio colocado entre parnteses (+), e colocado no lado do join que deficiente de informao. Este operador possui o efeito de criar uma ou mais linhas nulas, para as quais uma ou mais linhas da tabela no deficiente podem ser unidas. Sintaxe: table1.column = table2.column (+) a condio que relaciona (joins) as tabelas. o smbolo de outer join; ele pode ser colocado em qualquer lado da condio da clusula, porm, no pode ser colocado em ambos os lados. Coloque o smbolo de outer join logo aps o nome da coluna da tabela que pode no possuir dados para corresponder as linhas da outra tabela.
17
Funes Bsicas
ENAME DEPTNO DNAME ---------- --------- ------------KING 10 ACCOUNTING CLARK 10 ACCOUNTING ... 40 OPERATIONS 15 rows selected.
O exemplo acima exibe o nome dos empregados e o nmero e nome dos departamentos. O departamento OPERATIONS que no possui nenhum empregado tambm exibido.
18
Funes Bsicas
Self Joins
s vezes voc precisa relacionar uma tabela com ela mesma. Para encontrar o nome do gerente de cada empregado voc precisa unir a tabela EMP com ela mesma. Por exemplo, para achar o nome do gerente do empregado BLAKE, voc precisa: Encontrar o empregado BLAKE na tabela EMP pesquisando atravs da coluna ENAME. Encontrar o nmero do gerente de BLAKE atravs da coluna MGR. O nmero do gerente de BLAKE 7839. Encontrar o nome do gerente com EMPNO 7839 recuperando a coluna ENAME. O nmero do empregado KING 7839. Portanto, KING o gerente de BLAKE. Neste processo, voc pesquisa duas vezes na mesma tabela. A primeira vez voc pesquisa na tabela para encontrar BLAKE na coluna ENAME e o valor de MGR 7839. Na segunda vez voc pesquisa na coluna EMPNO pelo valor 7839 e recupera o contedo da coluna ENAME com o valor KING.
19
Funes Bsicas
WORKER.ENAME||'WORKSFOR'||MANAG ------------------------------BLAKE works for KING CLARK works for KING JONES works for KING MARTIN works for BLAKE ... 13 rows selected.
O exemplo acima relaciona a tabela EMP com ela mesma. Para simular duas tabelas na clusula FROM, existem dois alias, chamados WORKER e MANAGER, para a mesma tabela, EMP.
20
Funes Bsicas
Exerccios 5
1. Escreva uma consulta para exibir o nome, o nmero do departamento e o nome do departamento para todos os empregados. ENAME DEPTNO DNAME ------ ------ --------CLARK 10 ACCOUNTING KING 10 ACCOUNTING MILLER 10 ACCOUNTING SMITH 20 RESEARCH ADAMS 20 RESEARCH FORD 20 RESEARCH SCOTT 20 RESEARCH JONES 20 RESEARCH ALLEN 30 SALES BLAKE 30 SALES MARTIN 30 SALES JAMES 30 SALES TURNER 30 SALES WARD 30 SALES 14 rows selected.
2.
Crie uma lista nica de todos os cargos que esto no departamento 30. JOB --------CLERK MANAGER SALESMAN LOC ------------CHICAGO CHICAGO CHICAGO
3.
Escreva uma consulta para exibir o nome do empregado, o nome do departamento e a localizao de todos os empregados que ganham comisso.
21
Funes Bsicas
4.
Mostre o nome do empregado e o nome do departamento para todos os empregados que possuem a letra A no nome. Salve o comando SQL em um arquivo chamado e5q4.sql. ENAME DNAME ------- -----------CLARK ACCOUNTING ADAMS RESEARCH ALLEN SALES WARD SALES JAMES SALES MARTIN SALES BLAKE SALES 7 rows selected.
5.
Escreva uma consulta para exibir o nome, o cargo, o nmero do departamento e o nome do departamento para todos os empregados que trabalham em DALLAS. ENAME ------SMITH ADAMS FORD SCOTT JONES JOB DEPTNO DNAME ------- ------- ---------CLERK 20 RESEARCH CLERK 20 RESEARCH ANALYST 20 RESEARCH ANALYST 20 RESEARCH MANAGER 20 RESEARCH
6.
Mostre o nome e o nmero do empregado juntamento com o nome e o nmero de seu gerente. Coloque o alias de coluna como Employee, Emp#, Manager e Mgr#, respectivamente. Salve o comando SQL para um arquivo chamado e5q6.sql.
22
Funes Bsicas
Employee Emp# Manager -------- ------ ------SCOTT 7788 JONES FORD 7902 JONES ALLEN 7499 BLAKE WARD 7521 BLAKE JAMES 7900 BLAKE TURNER 7844 BLAKE MARTIN 7654 BLAKE MILLER 7934 CLARK ADAMS 7876 SCOTT JONES 7566 KING CLARK 7782 KING BLAKE 7698 KING SMITH 7369 FORD 13 rows selected.
Mgr# ---7566 7566 7698 7698 7698 7698 7698 7782 7788 7839 7839 7839 7902
7.
Modifique a consulta em e5q6.sql para exibir todos os empregados, incluindo o empregado com nome KING, que no possui gerente. Salve a nova consulta para um arquivo chamado e5q7.sql e execute-a. Employee Emp# Manager Mgr# -------- ------ ------- ----SCOTT 7788 JONES 7566 FORD 7902 JONES 7566 ALLEN 7499 BLAKE 7698 WARD 7521 BLAKE 7698 JAMES 7900 BLAKE 7698 TURNER 7844 BLAKE 7698 MARTIN 7654 BLAKE 7698 MILLER 7934 CLARK 7782 ADAMS 7876 SCOTT 7788 JONES 7566 KING 7839 CLARK 7782 KING 7839 BLAKE 7698 KING 7839 SMITH 7369 FORD 7902 KING 7839 14 rows selected.
Se houver tempo, complete os seguintes exerccios: 8. Crie uma consulta que mostre o nome do empregado, o nmero do departamento e todos os empregados que trabalham no mesmo departamento do empregado. Fornea para cada coluna um alias apropriado.
23
Funes Bsicas
DEPARTMENT EMPLOYEE ---------- -------10 CLARK 10 CLARK 10 KING 10 KING 10 MILLER 10 MILLER 20 ADAMS 20 ADAMS 20 ADAMS 20 ADAMS 20 FORD 20 FORD 20 FORD ... 56 rows selected.
COLLEAGUE --------KING MILLER CLARK MILLER CLARK KING FORD JONES SCOTT SMITH ADAMS JONES SCOTT
9.
Mostre a estrutura da tabela SALGRADE. Crie uma consulta que mostre o nome, o cargo, o nmero do departamento, o salrio e o nvel do salrio (grau) para todos os empregados. Name Null? ----------- -------GRADE LOSAL HISAL Type ------NUMBER NUMBER NUMBER
24
Funes Bsicas
ENAME -----MILLER CLARK KING SMITH SCOTT FORD ADAMS JONES JAMES BLAKE TURNER ALLEN WARD MARTIN 14 rows
JOB DNAME SAL GRADE ---------- ---------- ----- ----CLERK ACCOUNTING 1300 2 MANAGER ACCOUNTING 2450 4 PRESIDENT ACCOUNTING 5000 5 CLERK RESEARCH 800 1 ANALYST RESEARCH 3000 4 ANALYST RESEARCH 3000 4 CLERK RESEARCH 1100 1 MANAGER RESEARCH 2975 4 CLERK SALES 950 1 MANAGER SALES 2850 4 SALESMAN SALES 1500 3 SALESMAN SALES 1600 3 SALESMAN SALES 1250 2 SALESMAN SALES 1250 2 selected.
Se voc quiser um desafio extra, complete os exerccios seguintes: 10. Crie uma consulta para exibir o nome e a data de admisso de qualquer empregado admitido aps o empregado BLAKE. ENAME ------SMITH ALLEN WARD JONES HIREDATE --------17-DEC-80 20-FEB-81 22-FEB-81 02-APR-81
11.
Mostre os nomes dos empregados e as datas de admisso juntamente com o nome e a data de admisso do gerente para todos os empregados que foram admitidos antes do seu gerente. Coloque o alias das colunas como Employee, Emp Hiredate, Manager e Mgr Hiredate, respectivamente. Employee Emp Hiredate -------- ------------ALLEN 20-FEB-81 WARD 22-FEB-81 JONES 02-APR-81 CLARK 09-JUN-81 BLAKE 01-MAY-81 SMITH 17-DEC-80 6 rows selected. Manager ------BLAKE BLAKE KING KING KING FORD Mgr Hiredate -----------01-MAY-81 01-MAY-81 17-NOV-81 17-NOV-81 17-NOV-81 03-DEC-81
25
EMPLOYEE_AND_THEIR_SALARIES ---------------------------------------------------------KING ************************************************* FORD ***************************** SCOTT ***************************** JONES **************************** BLAKE *************************** CLARK *********************** ALLEN *************** TURNER ************** MILLER ************ MARTIN *********** WARD *********** ADAMS ********** JAMES ******** SMITH ******* 14 rows selected.
Funes Bsicas
Objetivos
Identificar as funes de grupo disponveis. Descrever o uso de funes de grupo. Agrupar dados utilizando a clusula GROUP BY. Incluir ou excluir linhas agrupadas utilizando a clusula HAVING.
Funes Bsicas
Diferentemente das funes bsicas (single-row), as funes de grupo atuam em conjuntos de linhas para obter um resultado por grupo. Estes conjuntos podem ser a tabela inteira ou a tabela dividida em grupos.
Funes Bsicas
Funes Bsicas
Funes Bsicas
AVG(SAL) MAX(SAL) MIN(SAL) SUM(SAL) -------- --------- --------- --------1400 1600 1250 5600
Voc pode utilizar as funes AVG, SUM, MIN e MAX em colunas que podem armazenar dados numricos. O exemplo acima exibe a mdia, o maior, o menor e a soma dos salrios mensais para todos os vendedores (SALESMEN).
Funes Bsicas
Voc pode utilizar as funes MAX e MIN para qualquer tipo de dado. O exemplo acima exibe o mais recente e o mais antigo empregado. O exemplo abaixo exibe o nome do primeiro empregado e o nome do ltimo empregado em uma lista alfabtica de todos os empregados. SQL> SELECT 2 FROM MIN(ename), MAX(ename) emp;
Nota: As funes AVG, SUM, VARIANCE e STDDEV s podem ser utilizadas com tipos de dados numricos.
Funes Bsicas
COUNT(*) --------6
A funo COUNT possui dois formatos: COUNT(*) COUNT(expr) COUNT(*) retorna o nmero de linhas em uma tabela, incluindo linhas duplicadas e linha que contm valores nulos. COUNT(expr), ao contrrio, retorna o nmero de linhas com valor diferente de nulo na coluna identificada por expr. O exemplo acima exibe o nmero de empregados do departamento 30. O exemplo abaixo exibe o nmero de empregados do departamento 30 que podem ganhar comisso. Observe que o resultado fornece um nmero total de 4 linhas porque dois empregados do departamento 30 no podem ganhar comisso e possuem um valor nulo na coluna COMM. SQL> SELECT 2 FROM 3 WHERE COUNT(comm) emp deptno = 30;
COUNT(COMM) ----------4
Funes Bsicas
COUNT(deptno) emp;
COUNT(DEPTNO) ------------14
Funes Bsicas
Mostre o nmero de departamentos distintos na tabela EMP. SQL> SELECT 2 FROM COUNT(DISTINCT (deptno)) emp;
COUNT(DISTINCT(DEPTNO)) ----------------------3
10
Funes Bsicas
AVG(COMM) --------550
Todas as funes de grupo exceto COUNT(*) ignoram os valores nulos da coluna. No exemplo acima, a mdia calculada baseada somente nas linhas da tabela onde um valor vlido est armazenado na coluna COMM. A mdia calculada dividindo a comisso total paga a todos os empregados pelo nmero de empregados que recebem comisso (4).
11
Funes Bsicas
AVG(NVL(COMM,0)) ---------------157.14286
A funo NVL fora as funes de grupo a considerarem os valores nulos no clculo. No exemplo acima, a mdia calculada baseada em todas as linhas da tabela embora existam valores nulos armazenados na coluna COMM. A mdia calculada dividindo a comisso total paga para todos os empregados pelo nmero total de empregados na empresa (14).
12
Funes Bsicas
At agora, todas as funes de grupo trataram a tabela como um grande grupo de informao. s vezes, voc precisa dividir a tabela em grupos menores. Isto pode ser feito utilizando a clusula GROUP BY.
13
Funes Bsicas
Voc pode utilizar a clusula GROUP BY para dividir as linhas de uma tabela em grupos. Voc pode ento utilizar as funes de grupo para devolver informao sumarizada para cada grupo. Sintaxe: group_by_expression especifica as colunas cujos valores determinam a base para o agrupamento das linhas.
Diretrizes
Se voc incluir uma funo de grupo em uma clusula SELECT, voc no pode selecionar resultados individuais a menos que a coluna individual aparea na clusula GROUP BY. Voc receber uma mensagem de erro caso no inclua a coluna na lista. Utilizando a clusula WHERE, voc pode excluir linhas antes de fazer a diviso dos grupos. Voc deve incluir as colunas na clusula GROUP BY. Voc no pode utilizar o alias de uma coluna na clusula GROUP BY. Por default, as linhas so classificadas em ordem ascendente das colunas includas na lista da clusula GROUP BY. Voc pode sobrepor esta ordenao utilizando a clusula ORDER BY.
14
Funes Bsicas
Quando utilizar a clusula GROUP BY, tenha certeza que todas as colunas da lista da clusula SELECT que no esto em funes de grupo estejam na lista da clusula GROUP BY. O exemplo acima exibe o nmero do departamento e a mdia de salrio de cada departamento. A seguir apresentado como o comando SELECT acima, contendo uma clusula GROUP BY, avaliado: A clusula SELECT especifica as colunas a serem recuperadas: A coluna contendo o nmero do departamento da tabela EMP. A mdia de todos os salrios no grupo especificado na clusula GROUP BY. A clusula FROM especifica as tabela que o banco de dados deve acessar: tabela EMP. A clusula WHERE especifica as linhas a serem recuperadas. Uma vez que no existe nenhuma clusula WHERE, por default todas as linhas sero recuperadas. A clusula GROUP BY especifica como as linhas devem ser agrupadas. As linhas esto sendo agrupadas atravs do nmero do departamento e, portanto, a funo AVG que est sendo aplicada coluna salrio calcular a mdia de salrio para cada departamento. SQL> SELECT AVG(sal) 2 FROM emp 3 GROUP BY deptno;
A coluna especificada na clusula GROUP BY no necessita estar na lista da clusula AVG(SAL) --------2916.6667 2175 1566.6667
15
Funes Bsicas
Voc pode utilizar as funes de grupo na clusula ORDER BY. SQL> 2 3 4 SELECT FROM GROUP BY ORDER BY deptno, AVG(sal) emp deptno AVG(sal);
16
Funes Bsicas
17
Funes Bsicas
DEPTNO JOB SUM(SAL) --------- --------- --------10 CLERK 1300 10 MANAGER 2450 10 PRESIDENT 5000 20 ANALYST 6000 20 CLERK 1900 ... 9 rows selected.
18
Funes Bsicas
Sempre que voc utilizar colunas individuais (DEPTNO) e funes de grupo (COUNT) no mesmo comando SELECT, voc deve incluir uma clusula GROUP BY que especifique as colunas individuais (neste caso, DEPTNO). Se a clusula GROUP BY no for informada, ento a mensagem de erro not a single-group group function aparece e um asterisco (*) aponta para a coluna que causou o erro. Voc pode corrigir o erro acima adicionando uma clusula GROUP BY. SQL> SELECT deptno, COUNT(ename) 2 FROM emp 3 GROUP BY deptno;
Qualquer coluna ou expresso na lista da clusula SELECT que no uma funo de agregao deve estar especificada na clusula GROUP BY.
A clusula WHERE no pode ser utilizada para restringir grupos. O comando SELECT acima resulta em um erro porque utiliza a clusula WHERE para restringir a exibio das mdias de salrios dos departamentos que possuem a mdia de salrio maior que $2000.
On Targget Treinamento e Consultoria 19
Funes Bsicas
Voc pode corrigir este erro utilizando a clusula HAVING para restringir grupos. SQL> 2 3 4 SELECT FROM GROUP BY HAVING deptno, AVG(sal) emp deptno AVG(sal) > 2000;
20
Funes Bsicas
Da mesma forma que voc utiliza a clusula WHERE para restringir as linhas selecionadas, voc utiliza a clusula HAVING para restringir grupos. Para encontrar o maior salrio de cada departamento, mas exibir somente os departamentos que possuem o seu maior salrio com mais de $2900, voc precisa fazer o seguinte: Encontrar o maior salrio para cada departamento agrupando pelo nmero de departamento. Restringir os grupos para esses departamentos, listando somente os que tiverem o maior salrio maior que $2900.
21
Funes Bsicas
Voc utiliza a clusula HAVING para especificar quais grupos sero exibidos. Portanto, voc restringe os grupos baseado em informaes agregadas. Sintaxe: group_condition restringe as linhas de grupos retornadas para aqueles grupos onde a condio especificada retornar TRUE. O Servidor Oracle executa os seguintes passos quando voc utiliza a clusula HAVING: As linhas so agrupadas. A funo de grupo aplicada ao grupo. Os grupos que correspondem ao critrio especificado na clusula HAVING so exibidos. A clusula HAVING pode preceder a clusula GROUP BY, mas recomendado que voc coloque a clusula GROUP BY primeiro porque mais lgico. Os grupos so formados e as funes de grupo so calculadas antes da clusula HAVING ser aplicada.
22
Funes Bsicas
O exemplo acima exibe os nmeros de departamento e o maior salrio daqueles departamentos cujo o maior salrio seja maior que $2900. Voc pode utilizar a clusula GROUP BY sem utilizar uma funo de grupo na lista da clusula SELECT. Se voc restringir linhas baseado no resultado de uma funo de grupo, voc deve especificar uma clusula GROUP BY e tambm um clusula HAVING. O exemplo abaixo exibe o nmero do departamento e a mdia de salrio para os departamentos cujo o salrio mximo seja maior que $2900. SQL> 2 3 4 SELECT FROM GROUP BY HAVING deptno, AVG(sal) emp deptno MAX(sal) > 2900;
23
Funes Bsicas
O exemplo abaixo exibe o cargo e o salrio mensal total de cada cargo para os cargos excedam o total de $5000. O exemplo exclui o cargo SALESMEN e ordena o resultado pelo salrio mensal total. SQL> 2 3 4 5 6 SELECT FROM WHERE GROUP BY HAVING ORDER BY job, SUM(sal) PAYROLL emp job NOT LIKE 'SALES%' job SUM(sal) > 5000 SUM(sal);
24
Funes Bsicas
MAX(AVG(SAL)) ------------2916.6667
Funes de grupo podem ser aninhadas em qualquer nvel. O exemplo acima exibe a maior mdia de salrio.
25
Funes Bsicas
Exerccios 6
Determine a validade das seguintes declaraes, circulando a palavra Verdadeiro ou Falso. 1. Funes de grupo atuam sobre muitas linhas para produzir um nico resultado. Verdadeiro / Falso 2. Funes de grupo incluem nulos nos clculos. Verdadeiro / Falso 3. A clusula WHERE restringe as linhas antes de inclu-las em um clculo de grupo. Verdadeiro / Falso 4. Mostre o maior, o menor, a soma e a mdia do salrio de todos os empregados. Coloque o alias das colunas como "Maximum", "Minimum", "Sum" e "Average", respectivamente. Arredonde os resultados para a posio decimal. Salve o comando SQL em um arquivo chamado e6q4.sql. Maximum Minimum Sum Average ------- ------- ----- ------5000 800 29025 2073
5.
Modifique a consulta em e6q4.sql para exibir o menor, o maior, a soma e a mdia do salrio para cada tipo de cargo. Salve o novo comando para e6q5.sql. Execute a consulta. JOB Maximum Minimum Sum Average ---------- -------- -------- ------- -------ANALYST 3000 3000 6000 3000 CLERK 1300 800 4150 1038 MANAGER 2975 2450 8275 2758 PRESIDENT 5000 5000 5000 5000 SALESMAN 1600 1250 5600 1400
6.
Escreva uma consulta para exibir o nmero de pessoas com o mesmo cargo.
26
Funes Bsicas
7.
Determine o nmero de gerentes sem list-los. Coloque o alias da coluna como Number of Managers. Number of Managers -----------------6
8.
Escreva uma consulta que mostre a diferena entre o maior e menor salrios. Coloque o alias da coluna como DIFFERENCE. DIFFERENCE ---------4200
Se houver tempo, complete os seguintes exerccios: 9. Mostre o nmero do gerente e o mais baixo salrio dentre os empregados associados para aquele gerente. Exclua qualquer um onde o cdigo do gerente no conhecido. Exclua qualquer grupo onde o salrio mnimo menor que $1000. Ordene o resultado em ordem descendente de salrio. MGR MIN(SAL) -------- -------7566 3000 7839 2450 7782 1300 7788 1100
10.
Escreva uma consulta para exibir o nome do departamento, o nome da localizao, o nmero de empregados e a mdia de salrio para todos os empregados daquele departamento. Coloque os alias de coluna como DNAME, LOC, Number of People e Salary, respectivamente.
27
Funes Bsicas
LOC Number of People Salary --------- ---------------- -------NEW YORK 3 DALLAS CHICAGO 5 6
Se voc quiser um desafio extra, complete os exerccios seguintes: 11. Crie uma consulta que mostre o nmero total de empregados e o nmero total de empregados contratados em 1980, 1981, 1982 e 1983. Fornea cabealhos de coluna apropriados. TOTAL 1980 ----- ----14 1 1981 ----10 1982 1983 ----- ----2 1
12.
Crie uma consulta tipo matriz para exibir o cargo, o salrio para aquele cargo baseado no nmero de departamento e o salrio total para aquele cargo para todos os departamentos, fornecendo para cada coluna um cabealho apropriado.
28
Job Dept 10 Dept 20 Dept 30 Total --------- ------- -------- -------- ------ANALYST 6000 6000 CLERK 1300 1900 950 4150 MANAGER 2450 2975 2850 8275 PRESIDENT 5000 5000 SALESMAN 5600 5600
7. Subconsultas
Funes Bsicas
Objetivos
Descrever os tipos de problemas que subconsultas podem resolver Definir subconsultas Listar os tipos de subconsultas Escrever subconsultas do tipo single-row e multiple-row
Neste captulo sero apresentadas caractersticas avanadas do comando SELECT. Voc pode escrever subconsultas na clusula WHERE de outro comando SQL para obter valores baseado em um valor condicional desconhecido. Este captulo discute as consultas do tipo single-row (que devem recuperar apenas uma linha) e multiple-row (que podem recuperar mais de uma linha).
Funes Bsicas
Suponha voc quer escrever uma consulta para encontrar quem ganha um salrio maior que o salrio de Jones. Para resolver este problema, voc precisa de duas consultas: uma consulta para encontrar quanto Jones ganha e uma segunda consulta para encontrar quem ganha mais que aquela quantia. Voc pode resolver este problema combinando as duas consultas e colocando uma consulta dentro da outra. Uma consulta interna ou subconsulta retorna um valor que utilizado pela consulta externa ou consulta principal. Utilizar uma subconsulta equivalente a executar duas consultas seqnciais e utilizar o resultado da primeira consulta como o valor de procura da segunda consulta.
Funes Bsicas
Subconsultas
SELECT FROM WHERE select_list table expr operator (SELECT FROM
select_list table);
Uma subconsulta um comando SELECT embutido em uma clusula de outro comando SELECT. Voc pode construir comandos poderosos utilizando subconsultas. Eles podem ser muito teis quando voc precisa selecionar linhas de uma tabela com uma condio que depende dos dados da prpria tabela. Voc pode colocar subconsultas em vrias clusulas SQL: Clusula WHERE Clusula HAVING Clusula FROM Sintaxe: operator inclui um operador de comparao como >, = ou IN Nota: Operadores de comparao entram em duas classes: operadores do tipo single-row (>, =, >=, <, <>, <=) e operadores do tipo multiple-row (IN, ANY, ALL). A subconsulta freqentemente chamada de SELECT aninhado, sub-select, ou comando SELECT interno. A subconsulta geralmente executada primeiro, e seu resultado utilizado para completar a condio da consulta principal ou externa.
Funes Bsicas
2975
No exemplo acima, a consulta interna determina o salrio do empregado 7566. A consulta externa recebe o resultado da consulta interna e utiliza este resultado para exibir todos os empregados que ganham mais que esta quantia.
Funes Bsicas
Funes Bsicas
Tipos de Subconsultas
Subconsultas single-row: consultas que retornam apenas uma linha a partir do comando SELECT interno. Subconsultas multiple-row: consultas que retornam mais de uma linha a partir do comando SELECT interno. Subconsultas multiple-column: consultas que retornam mais de uma coluna a partir do comando SELECT interno.
Funes Bsicas
Subconsultas Single-Row
Uma subconsulta do tipo single-row retorna uma linhas a partir do comando SELECT interno. Este tipo de subconsulta utiliza um operador do tipo single-row. O grfico acima exibe uma lista dos operadores single-row. Exemplo: Mostre os empregados cujo cargo seja igual ao cargo do empregado 7369. SQL> SELECT 2 FROM 3 WHERE 4 5 6 ename, job emp job = (SELECT FROM WHERE
Funes Bsicas
CLERK
AND
Um comando SELECT pode ser considerado como um bloco de consulta. O exemplo acima exibe os empregados cujo cargo o mesmo do empregado 7369 e cujo salrio maior que o do empregado 7876. O exemplo consiste de trs blocos de consulta: a consulta externa e as duas consultas internas. Os blocos de consulta internos so executados primeiro, produzindo os resultados da consulta: CLERK e 1100, respectivamente. O bloco de consulta externo ento processado e utiliza os valores retornados pelas consultas internas para completar as suas condies de pesquisa. Ambas as consultas internas retornam valores nicos (CLERK e 1100, respectivamente), sendo chamadas de subconsultas single-row. Nota: As consultas externa e interna podem obter dados de tabelas diferentes.
Funes Bsicas
Voc pode exibir dados de uma consulta principal utilizando uma funo de grupo em uma subconsulta para retornar uma nica linha. A subconsulta est entre parnteses e colocada aps o operador de comparao. O exemplo acima exibe o nome do empregado, o cargo e o salrio de todos os empregados cujo salrio igual ao menor salrio. A funo de grupo MIN retorna um nico valor (800) para a consulta externa.
10
Funes Bsicas
Alm da clusula WHERE, voc tambm pode utilizar subconsultas na clusula HAVING. O Servidor Oracle executa a subconsulta, e os resultados so retornados para a clusula HAVING da consulta principal. A comando SQL acima exibe todos os departamentos que possuem um salrio mnimo maior que o salrio mnimo do departamento 20. Exemplo: Encontre o cargo com a menor mdia de salrio. SQL> 2 3 4 5 6 SELECT FROM GROUP BY HAVING job, AVG(sal) emp job AVG(sal) = (SELECT MIN(AVG(sal)) FROM EMP GROUP BY job);
11
Funes Bsicas
Um erro comum em subconsultas mais de uma linha ser retornada para uma subconsulta do tipo single-row. No comando SQL acima, a subconsulta possui uma clusula GROUP BY (deptno), que implica que a subconsulta devolver mltiplas linhas, uma para cada grupo encontrado. Neste caso, o resultado da subconsulta ser 800, 1300, e 950. A consulta externa recebe os resultados da subconsulta (800, 950, 1300) e utiliza estes resultados em sua clusula WHERE. A clusula WHERE contm um operador igual (=), operador de comparao do tipo single-row que compara apenas um valor. O operador (=) no aceita mais de um valor a partir subconsulta e conseqentemente gera o erro. Para corrigir este erro, mude o operador (=) para IN.
12
Funes Bsicas
Um problema comum com subconsultas nenhuma linha ser retornada pela consulta interna. No comando SQL acima, a subconsulta contm uma clusula WHERE (ename = ' SMYTHE'). Presumivelmente, a inteno achar o empregado cujo nome Smythe. O comando parece estar correto, mas no seleciona nenhuma linha quando executado. O problema que Smythe est escrito de forma incorreta. No existe nenhum empregado chamado Smythe. Assim, a subconsulta no retorna nenhuma linha. A consulta externa recebe os resultados da subconsulta (null) e utiliza estes resultados na clusula WHERE. A consulta externa no encontra nenhum empregado com um cargo igual a nulo e assim no retorna nenhuma linha.
13
Funes Bsicas
Subconsultas que retornam mais que uma linha so chamadas subconsultas multiple-row. Voc utiliza operadores multiple-row, em vez de operadores single-row, com uma subconsulta multiple-row. O operador multiple-row aceita um ou mais valores.
SQL> SELECT ename, sal, deptno
2 3 4 5
FROM WHERE
Exemplo: Encontre os empregados que ganham um salrio igual ao menor salrio para os departamentos. A consulta interna executada primeiro e produz um resultado que contm trs linhas: 800, 950 e 1300. O bloco da consulta principal ento processado e utiliza os valores retornados pela consulta interna para completar sua condio de pesquisa. De fato, a consulta principal se pareceria com o seguinte para o Servidor Oracle: SQL> SELECT 2 FROM 3 WHERE ename, sal, deptno emp sal IN (800, 950, 1300);
14
Funes Bsicas
AND
O operador ANY compara um valor para cada valor retornado por uma subconsulta. O exemplo acima exibe os empregados cujo salrio menor que o salrio de qualquer empregado com o cargo CLERK e que no so deste cargo. O maior salrio que um empregado com o cargo CLERK ganha $1300. O comando SQL exibe todos os empregados que no possuem o cargo CLERK mas ganhem menos que $1300. < ANY significa menos que o mximo. > ANY significa mais que o mnimo. = ANY equivalente a IN.
15
Funes Bsicas
O operador ALL compara um valor com todos os valores retornados por uma subconsulta. O exemplo acima exibe os empregados cujo salrio maior que o salrio mdio de todos os departamentos. O maior salrio mdio de um departamento $2916.66, assim a consulta retorna aqueles empregados cujo salrio maior que $2916.66. > ALL significa mais que o mximo. < ALL significa menos que o mnimo. O operador NOT pode ser utilizado com os operadores IN, ANY e ALL.
16
Funes Bsicas
Exerccios 7
1. Escreva uma consulta para exibir o nome do empregado e a data de admisso para todos os empregados que esto no mesmo departamento do empregado BLAKE, excluindo-o do resultado. ENAME HIREDATE ------- --------------MARTIN 28-SEP-81 ALLEN 20-FEB-81 TURNER 08-SEP-81 JAMES 03-DEC-81 WARD 22-FEB-81 6 rows selected.
2.
Crie uma consulta para exibir o nmero do empregado e o nome para todos os empregados que ganham mais que a mdia de salrio. Classifique o resultado em ordem descendente de salrio. EMPNO ENAME ----- ----------7839 KING 7902 FORD 7788 SCOTT 7566 JONES 7698 BLAKE 7782 CLARK 6 rows selected.
3.
Escreva uma consulta que mostre o nmero do empregado e o nome para todos os empregados que trabalham em um departamento com qualquer empregado cujo nome contenha uma letra T. Salve o comando SQL para um arquivo chamado e7q3.sql. Mostre o nome do empregado, o nmero do departamento e o cargo para todos os EMPNO ENAME ------ -------7566 JONES 7788 SCOTT 7876 ADAMS 7369 SMITH 7902 FORD 7698 BLAKE 7654 MARTIN 7499 ALLEN 7844 TURNER 7900 JAMES 7521 WARD 11 rows selected.
17
4.
Funes Bsicas
5.
Mostre o nome do empregado e o salrio de todos os empregados gerenciados por KING. ENAME -----BLAKE CLARK JONES SAL ---2850 2450 2975
6.
Mostre o nmero do departamento, o nome e o cargo para todos os empregados que esto em um dos departamentos SALES. DEPTNO -----30 30 30 30 30 30 6 rows ENAME JOB -------- --------BLAKE MANAGER MARTIN SALESMAN ALLEN SALESMAN TURNER SALESMAN JAMES CLERK WARD SALESMAN selected.
Se houver tempo, complete os seguintes exerccios: 7. Modifique a consulta em e7q3.sql para exibir o nmero do empregado, o nome e o salrio para todos os empregados que ganham mais que a mdia de salrio e que trabalham em um departamento com qualquer empregado com um letra T em seu nome. Salve o novo comando para e7q7.sql e execute.
18
8. Subconsultas Multiple-Column
Funes Bsicas
Objetivos
Escrever uma subconsulta multiple-column Descrever e explicar o comportamento de subconsultas quando valores nulos so recuperados Escrever subconsultas em uma clusula FROM
Funes Bsicas
Subconsultas Multiple-Column
At agora voc escreveu subconsultas do tipo single-row e subconsultas do tipo multiple-row onde s uma coluna foi comparada na clusula WHERE ou na clusula HAVING do comando SELECT. Se voc quiser comparar duas ou mais colunas, voc deve escrever uma combinao na clusula WHERE utilizando os operadores lgicos. Subconsultas do tipo multiple-column permitem combinar condies WHERE duplicadas em uma nica clusula WHERE. Sintaxe: SELECT FROM WHERE column, column, ... table (column, column, ...) IN (SELECT column, column, ... FROM table WHERE condition);
Funes Bsicas
O exemplo acima uma subconsulta do tipo multiple-column, uma vez que a subconsulta retorna mais de uma coluna. Ele compara a coluna SAL e a coluna COMM. Ele exibe o nome, o nmero do departamento, o salrio e a comisso de qualquer empregado cujo salrio e comisso correspondam ambos ao salrio e comisso de qualquer empregado do departamento 30. O resultado do comando SQL acima ser o seguinte: ENAME DEPTNO SAL COMM ---------- --------- --------- --------JAMES 30 950 WARD 30 1250 500 MARTIN 30 1250 1400 TURNER 30 1500 0 ALLEN 30 1600 300 BLAKE 30 2850 6 rows selected.
Funes Bsicas
Comparaes de Colunas
Comparaes de coluna em uma subconsulta multiple-column podem ser do tipo pairwise ou nonpairwise. No grfico acima, uma comparao tipo pairwise foi executada na clusula WHERE. Cada linha candidata do comando SELECT deve ter o mesmo salrio e a mesma comisso de um empregado do departamento 30. Se voc quiser uma comparao tipo nonpairwise (um cross product), voc deve utilizar uma clusula WHERE com mltiplas condies.
Funes Bsicas
O exemplo acima faz uma comparao tipo nonpairwise das colunas. Exibe o nome, o nmero do departamento, o salrio, e a comisso de qualquer empregado cujo salrio e comisso correspondam ao salrio e comisso de qualquer empregado do departamento 30. O resultado do comando SQL acima ser o seguinte: ENAME DEPTNO SAL COMM ---------- --------- --------- --------JAMES 30 950 BLAKE 30 2850 TURNER 30 1500 0 ALLEN 30 1600 300 WARD 30 1250 500 MARTIN 30 1250 1400 6 rows selected.
Os resultados das ltimas duas consultas so idnticos embora as condies de comparao fossem diferentes. Os resultados foram obtidos por causa dos dados especficos da tabela EMP.
Funes Bsicas
Exemplo: Assuma que o salrio e a comisso do empregado o CLARK foram modificados de forma que ele tenha o mesmo salrio que um empregado do departamento 30 e a mesma comisso que um empregado diferente do departamento 30. O salrio para CLARK agora igual ao de TURNER ($1500) e a comisso de CLARK igual a de ALLEN ($300). Agora execute uma comparao do tipo pairwise e uma comparao do tipo nonpairwise para determinar o nmero de linhas retornadas por cada consulta. Nota: A sintaxe para atualizar dados em uma tabela ser discutida em um captulo subseqente.
Funes Bsicas
ENAME DEPTNO SAL COMM ---------- --------- --------- --------JAMES 30 950 WARD 30 1250 500 MARTIN 30 1250 1400 TURNER 30 1500 0 ALLEN 30 1600 300 BLAKE 30 2850 6 rows selected.
Funes Bsicas
ENAME DEPTNO SAL COMM ---------- --------- --------- --------JAMES 30 950 BLAKE 30 2850 TURNER 30 1500 0 CLARK 10 1500 300 ... 7 rows selected.
Os resultados da subconsulta nonpairwise incluem o empregado CLARK. O salrio de CLARK igual ao de TURNER e sua comisso igual a de ALLEN.
Funes Bsicas
O comando SQL acima tenta exibir todos os empregados que no possuem nenhum subordinado. Logicamente, este comando SQL deveria ter retornado oito linhas. Entretanto, o comando SQL no retorna nenhuma linha. Um dos valores retornados pela consulta interna um valor nulo e conseqentemente toda a consulta no retorna nenhuma linha. A razo que todas as condies que comparam um valor nulo resultam em nulo. Portanto, sempre que for provvel que valores nulos faam parte do conjunto resultante de uma subconsulta, no utilize o operador NOT IN. O operador NOT IN equivalente a != ALL. Observe que o valor nulo como parte do conjunto resultante de uma subconsulta no ser um problema se voc estiver utilizando o operador IN. O operador IN equivalente a = ANY. Por exemplo, para exibir os empregados que possuem subordinados, utilize o seguinte comando SQL: SQL> SELECT 2 FROM 3 WHERE 4 manager); employee.ename emp employee employee.empno IN (SELECT manager.mgr FROM emp
10
Funes Bsicas
ENAME SAL DEPTNO SALAVG ---------- --------- --------- ---------KING 5000 10 2916.6667 JONES 2975 20 2175 SCOTT 3000 20 2175 ... 6 rows selected.
Voc pode utilizar uma subconsulta na clusula FROM de um comando SELECT. O exemplo acima exibe os nomes dos empregados, os salrios, os nmeros de departamento e as mdias de salrios para todos os empregados que ganham mais que a mdia de salrio do seu departamento.
11
Funes Bsicas
Exerccios 8
1. Escreva uma consulta para exibir o nome, o nmero do departamento e o salrio de qualquer empregado cujo o nmero do departamento e o salrio correspondam ambos ao nmero do departamento e ao salrio de qualquer empregado que ganha comisso. ENAME DEPTNO SAL -------- ------ -----MARTIN 30 1250 WARD 30 1250 TURNER 30 1500 ALLEN 30 1600
2.
Mostre o nome, o nome do departamento e o salrio de qualquer empregado cujo salrio e comisso correspondam ambos ao salrio e comisso de qualquer empregado localizado em DALLAS. ENAME ------SMITH ADAMS JONES FORD SCOTT DNAME SAL --------- -----RESEARCH 800 RESEARCH 1100 RESEARCH 2975 RESEARCH 3000 RESEARCH 3000
3.
Crie uma consulta para exibir o nome, a data de admisso e o salrio para todos os empregados que possuem o mesmo salrio e comisso que SCOTT. ENAME HIREDATE SAL ------- --------- -----FORD 03-DEC-81 3000
4.
Crie uma consulta para exibir os empregados que ganham um salrio maior que o salrio de qualquer empregado com o cargo CLERK. Classifique o resultado do maior para o menor salrio.
12
ENAME JOB SAL ---------- --------- --------KING PRESIDENT 5000 FORD ANALYST 3000 SCOTT ANALYST 3000 JONES MANAGER 2975 BLAKE MANAGER 2850 CLARK MANAGER 2450 ALLEN SALESMAN 1600 TURNER SALESMAN 1500 8 rows selected.
Funes Bsicas
Objetivos
Produzir consultas que requerem uma varivel de entrada Customizar o ambiente do SQL*Plus Produzir resultados mais legveis Criar e executar arquivos de script Salvar customizaes
Neste captulo, voc aprender a incluir comandos SQL*Plus para produzir um resultado de SQL mais legvel. Voc pode criar um arquivo de comandos que contm um clusula WHERE que restringe as linhas exibidas. Para alterar a condio cada vez que o arquivo de comando executado, voc utiliza variveis de substituio. Variveis de substituio podem substituir valores na clusula WHERE, uma string de texto e at mesmo o nome de uma coluna ou tabela.
Funes Bsicas
Relatrios Interativos
Utilizando SQL*Plus, voc pode criar relatrios que solicitem ao usurio que fornea seus prprios valores para restringir o intervalo de dados retornados. Para criar relatrios interativos, voc pode embutir variveis de substituio em um arquivo de comandos ou em um comando SQL isolado. Uma varivel pode ser vista como um recipiente no qual os valores so armazenados temporariamente.
Funes Bsicas
Enter value for employee_num: 7369 EMPNO ENAME SAL DEPTNO --------- ---------- --------- --------7369 SMITH 800 20
Quando executam um relatrio, os usurios freqentemente necessitam restringir os dados retornados dinamicamente. O SQL*Plus prov esta flexibilidade por meio de variveis de usurio. Utilize o smbolo (&) para identificar cada varivel em seu comando SQL. Voc no precisa definir o valor de cada varivel.
Sintaxe &user_variable Descrio Indica uma varivel em um comando SQL; se a varivel no existe, o SQL*Plus solicita ao usurio um valor (o SQL*Plus descarta uma nova varivel uma vez que ela tenha sido utilizada).
O exemplo acima cria um comando SQL para solicitar ao usurio um nmero de empregado em tempo de execuo e exibe o nmero do empregado, o nome, o salrio, e o nmero do departamento para aquele empregado. Com o uso de um nico smbolo (&), o usurio solicitado cada vez que o comando executado, se a varivel no existir.
Funes Bsicas
Enter value for employee_num: 7369 old 3: WHERE empno = &employee_num new 3: WHERE empno = 7369 ...
Para confirmar as mudanas no comando SQL, utilizar o comando do SQL*Plus SET VERIFY. Ao executar SET VERIFY ON o SQL*Plus passa a exibir o texto de um comando antes e depois de efetuar a troca das variveis de substituio pelos valores. O exemplo acima exibe o antigo como tambm o novo valor da coluna EMPNO.
Funes Bsicas
Enter value for job_title: ANALYST ENAME DEPTNO SAL*12 ---------- --------- --------SCOTT 20 36000 FORD 20 36000
Em uma clusula WHERE, valores tipo data e caractere devem ser includos entre aspas simples. A mesma regra aplica-se s variveis de substituio. Para evitar a necessidade de entrar aspas em tempo de execuo, inclua a varivel entre aspas simples dentro do prprio comando SQL. O exemplo acima apresenta uma consulta para recuperar o nome do empregado, o nmero do departamento e o salrio anual de todos os empregados baseado no cargo fornecido pelo usurio no prompt. Nota: Voc tambm pode utilizar funes como UPPER e LOWER com o (&). Utilize UPPER('&job_title') de forma que o usurio no tenha que entrar o cargo em maisculas.
Funes Bsicas
Alm da clusula WHERE dos comandos SQL, voc pode utilizar as variveis de substituio para substituir nomes de coluna, expresses ou texto. Exemplo: Mostre o nmero do empregado e qualquer outra coluna e qualquer outra condio para os empregados. SQL> SELECT 2 FROM 3 WHERE empno, &column_name emp &condition;
Enter value for column_name: job Enter value for condition: deptno = 10 EMPNO --------7839 7782 7934 JOB --------PRESIDENT MANAGER CLERK
Se voc no entrar um valor para a varivel de substituio, voc receber um erro quando executar o comando acima.
Funes Bsicas
O exemplo abaixo exibe o nmero do empregado, o nome, o cargo e qualquer outra coluna especificada pelo usurio em tempo de execuo, a partir da tabela EMP. O usurio tambm pode especificar a condio para recuperao de linhas e o nome da coluna pela qual os dados resultantes devem ser ordenados. SQL> 2 3 4 SELECT FROM WHERE ORDER BY empno, ename, job, &column_name emp &condition &order_column;
Enter value for column_name: sal Enter value for condition: sal >= 3000 Enter value for order_column: ename EMPNO --------7902 7839 7788 ENAME ---------FORD KING SCOTT JOB SAL --------- --------ANALYST 3000 PRESIDENT 5000 ANALYST 3000
Funes Bsicas
Enter value for column_name: deptno EMPNO ENAME JOB DEPTNO --------- ---------- --------- --------7839 KING PRESIDENT 10 7782 CLARK MANAGER 10 7934 MILLER CLERK 10 ... 14 rows selected.
Voc pode utilizar variveis de substituio com o smbolo (&&) se voc quiser reutilizar o valor da varivel sem solicit-lo ao usurio cada vez. O usurio receber uma nica vez o prompt para o valor. No exemplo acima, o usurio solicitado a fornecer uma nica vez o valor para a varivel column_name. O valor fornecido pelo usurio (deptno) utilizado para exibir e ordenar os dados. O SQL*Plus armazena o valor fornecido utilizando o comando DEFINE; ele o reutilizar sempre que voc referenciar o nome da varivel. Se necessrio, voc pode utilizar o comando UNDEFINE para apagar uma varivel de usurio.
Funes Bsicas
10
Funes Bsicas
O Comando ACCEPT
ACCEPT variable [datatype] [FORMAT format] [PROMPT text] {HIDE}
Sintaxe: variable datatype o nome da varivel que armazena o valor. Se ela no existir, o SQL*Plus a criar. deve ser NUMBER, CHAR ou DATE. CHAR possui um tamanho mximo de 240 bytes. DATE verificado atravs de um modelo de formato, e o tipo de dado CHAR. especifica a mscara de formatao, por exemplo: A10 ou 9.999. exibe o texto antes do usurio poder entrar o valor. suprime o que o usurio digita, por exemplo, uma senha.
Nota: No prefixe o parmetro de substituio do SQL*Plus com (&) quando referenciar o parmetro no comando ACCEPT.
11
Funes Bsicas
Provide the department name: Sales DEPTNO DNAME LOC --------- -------------- ------------30 SALES CHICAGO
O comando ACCEPT l uma varivel chamada DEPT. O prompt exibido quando solicitar para o usurio a varivel "Provide the department name:". A comando SELECT ento recebe o valor de departamento que o usurio digitou e o utiliza para recuperar a linha apropriada da tabela DEPT. Se o usurio entrar um valor vlido para o nome do departamento, o comando SELECT executa da mesma forma que qualquer outro comando SELECT, pegando o valor entrado pelo usurio e o utilizando na clusula WHERE para comparar com DNAME. Observe que o carctere & no aparece com a varivel DEPT no comando ACCEPT. O & s aparece no comando SELECT. Diretrizes: Ambos os comandos ACCEPT e DEFINE criaro uma varivel se a varivel no existir; estes comandos redefinem automaticamente uma varivel caso j exista. Quando utilizar o comando DEFINE, utilize aspas simples ('') para incluir uma string que contenha espaos. Utilize o comando ACCEPT para: Fornecer um prompt customizado quando receber entrada de usurio; caso contrrio, voc ver uma mensagem padro Enter value for variable Explicitamente defina uma varivel do tipo NUMBER ou DATE Oculte a entrada do usurio por razes de segurana
12
Funes Bsicas
13
Funes Bsicas
DEFINE DEPTNAME
= "sales" (CHAR)
Voc pode utilizar o comando DEFINE para criar uma varivel e ento utilizar esta varivel como voc utilizaria qualquer outra varivel. O exemplo acima cria uma varivel DEPTNAME que contm o nome do departamento, SALES. O comando SQL ento utiliza esta varivel para exibir o nmero e a localizao do departamento SALES. DEPTNO DNAME LOC --------- ----------- ------------30 SALES CHICAGO
Para apagar a varivel, voc utiliza o comando UNDEFINE: SQL> UNDEFINE deptname SQL> DEFINE deptname symbol deptname is UNDEFINED
14
Funes Bsicas
Voc pode controlar o ambiente no qual SQL*Plus est operando utilizando os comandos SET. Sintaxe: system_variable uma varivel que controla um aspecto do ambiente da sesso. value um valor para a varivel de sistema. Voc pode verificar a configurao atual com o comando SHOW. O comando SHOW no exemplo acima confere se ECHO estava configurado para ON ou para OFF. Para ver todos os valores de variveis SET, utilize o comando SHOW ALL.
15
Funes Bsicas
Nota: O valor n representa um valor numrico. Os valores sublinhados apresentados acima indicam os valores default. Se voc no fornecer nenhum valor com a varivel, o SQL*Plus assume o valor default.
16
Funes Bsicas
17
Funes Bsicas
Diretrizes
Todos os comandos de formatao permanecem em efeito at o final da sesso do SQL*Plus ou at que o formato fixado seja sobrescrito ou limpo. Lembre-se de voltas suas configurao do SQL*Plus para os valores default depois de todo relatrio. No existe nenhum comando para configurar uma varivel do SQL*Plus para seu valor default; voc deve conhecer o valor especfico ou encerrar sua sesso e conectar novamente. Se voc fornecer um alias para sua coluna, voc deve referenciar o nome do alias, no o nome da coluna.
18
Funes Bsicas
Comando COLUMN
COL[UMN] [{column|alias} [option]]
Opo CLE[AR] FOR[MAT] format HEA[DING] text JUS[TIFY] {align} NOPRI[NT] NUL[L] text PRI[NT] TRU[NCATED] WRA[PPED]
Descrio Limpa qualquer formatao de coluna Modifica a exibio dos dados de uma coluna Configura o cabealho da coluna. O caractere pipe (|) pode forar uma quebra de linha no cabealho se voc no utilizar justificao Justifica o cabealho da coluna (no os dados) esquerda, centralizado ou direita Oculta a coluna Especifica o texto a ser exibido para valores nulos Mostra a coluna Trunca a string no final da primeira linha de exibio Coloca o final da string na prxima linha
19
Funes Bsicas
Descrio Exibe as configuraes atuais para a coluna especificada Exibe as configuraes atuais para todas as colunas Limpa as configuraes para a coluna especificada Limpa as configuraes para todas as colunas
Se voc tiver um comando muito longo, voc pode continu-lo na prxima linha terminando a linha atual com um hfen (-).
20
Funes Bsicas
O grfico acima exibe exemplos de formatao de colunas. O Servidor Oracle exibe uma string com o caractere (#) no lugar de um nmero inteiro cujos dgitos excedem o nmero de dgitos providos pela mscara. Tambm exibe uma string com o caractere (#) no lugar de um valor cuja mscara alfanumrica mas o valor atual numrico.
21
Funes Bsicas
Para dividir as linhas nas quebras do relatrio: SQL> BREAK ON ename SKIP 4 ON job SKIP2
Utilize o comando BREAK para dividir as linhas e suprimir valores duplicados. Para assegurar que o comando BREAK funcione corretamente, ordene pelas colunas nas quais voc est quebrando. Sintaxe: BREAK on column[|alias|row] [skip n|dup|page] on .. [on report]
Onde: page skip n avana uma pgina quando os valores da quebra mudam. avana n linhas quando os valores da quebra mudam. Quebras podem ser ativadas em: - Coluna - Linha - Pgina - Relatrio exibe valores duplicados.
duplicate
22
Funes Bsicas
Utilize o comando TTITLE para formatar cabealhos de pgina e o comando BTITLE para rodaps. Rodaps aparecem ao final de cada pgina de acordo com o valor de PAGESIZE. A sintaxe para BTITLE e TTITLE idntica. Voc pode utilizar o caractere pipe (|) para dividir o texto do ttulo em vrias linhas. Sintaxe: text representa o texto de ttulo. Coloque entre aspas simples se o texto for mais de uma palavra.
O exemplo de TTITLE acima configura o cabealho do relatrio para exibir Salary centralizado em uma linha e Report centralizado na linha seguinte. O exemplo de BTITLE configura o rodap do relatrio para exibir Confidential. TTITLE automaticamente coloque a data e nmero da pgina no relatrio.
23
Funes Bsicas
Diretrizes
Voc pode incluir linhas em branco entre os comandos do SQL*Plus em um script. Voc pode abreviar comandos do SQL*Plus. Inclua comandos de limpeza de formatao ao trmino do arquivo para restaurar o ambiente original do SQL*Plus.
24
Funes Bsicas
Relatrio de Exemplo
Exemplo: Crie um arquivo de script para criar um relatrio que mostre o cargo, o nome e o salrio para todo empregado cujo salrio menor que $3000. Adicione um cabealho centralizado, de duas linhas, com a string "Employee Report" e um rodap tambm centralizado com a string "Confidential". Renomeie a coluna cargo para "Job Category" dividida em duas linhas. Renomeie a coluna com o nome do empregado para "Employee". Renomeie a coluna salrio para "Salary", formatando-a como o seguinte exemplo: $2,500.00. SET PAGESIZE 37 SET LINESIZE 60 SET FEEDBACK OFF TTITLE 'Employee|Report' BTITLE 'Confidential' COLUMN job HEADING 'Job|Category' FORMAT A15 COLUMN ename HEADING 'Employee' FORMAT A15 COLUMN sal HEADING 'Salary' FORMAT $99,999.99 REM ** Insert SELECT statement SELECT job, ename, sal FROM emp WHERE sal < 3000 ORDER BY job, ename /
25
Funes Bsicas
Exerccios 9
Determine se as seguintes declaraes so verdadeiras ou falsas: 1. Uma varivel de substituio criada com o smbolo (&) solicitada ao usurio uma nica vez. Verdadeiro / Falso 2. O comando ACCEPT um comando SQL.
Verdadeiro / Falso 3. Escreva um arquivo de script para mostrar o nome do empregado, o cargo e a data de admisso para todos os empregados que foram admitidos entre um determinado perodo. Concatene o nome e o cargo, separando-os por uma vrgula e espao, e coloque o alias da coluna como Employees. Solicite ao usurio os dois intervalos do perodo utilizando o comando ACCEPT. Utilize o formato MM/DD/YY. Salve o script para um arquivo chamado e9q3.sql.
Please enter the low date range ('MM/DD/YY'): 01/01/81 Please enter the high date range ('MM/DD/YY'): 01/01/82 EMPLOYEES HIREDATE ----------------- --------------KING, PRESIDENT 17-NOV-81 BLAKE, MANAGER 01-MAY-81 CLARK, MANAGER 09-JUN-81 JONES, MANAGER 02-APR-81 MARTIN, SALESMAN 28-SEP-81 ALLEN, SALESMAN 20-FEB-81 TURNER, SALESMAN 08-SEP-81 JAMES, CLERK 03-DEC-81 WARD, SALESMAN 22-FEB-81 FORD, ANALYST 03-DEC-81 10 rows selected.
4.
Escreva um script para mostrar o nome do empregado, o cargo e o nome do departamento. A condio de pesquisa deve permitir que a procura no faa distino entre maisculas e minsculas. Salve o script para um arquivo chamado e9q4.sql. Modifique o arquivo location name: um relatrio contendo o nome do Please enter the e9q4.sql para criar Dallas EMPLOYEE NAME JOB DEPARTMENT NAME ------------- ------------ --------------JONES MANAGER RESEARCH FORD ANALYST RESEARCH SMITH CLERK RESEARCH SCOTT ANALYST RESEARCH ADAMS CLERK RESEARCH
26
5.
Please enter the location name: Chicago DEPARTMENT EMPLOYEE START NAME NAME DATE SALARY ---------- ----------- --------- --------SALES BLAKE 01-MAY-81 $2,850.00 MARTIN 28-SEP-81 $1,250.00 ALLEN 20-FEB-81 $1,600.00 TURNER 08-SEP-81 $1,500.00 JAMES 03-DEC-81 $950.00 WARD 22-FEB-81 $1,250.00
Funes Bsicas
Objetivos
Descrever cada comando DML Inserir linhas em uma tabela Atualizar linhas de uma tabela Remover linhas de uma tabela Controlar transaes
Neste captulo, voc aprender a inserir linhas em uma tabela, atualizar linhas existentes e apagar linhas de uma tabela. Voc tambm aprender a controlar transaes com os comandos COMMIT, SAVEPOINT e ROLLBACK.
Funes Bsicas
Funes Bsicas
Funes Bsicas
Comando INSERT
INSERT INTO VALUES table [(column [, column...])] (value [, value...]);
Voc pode adicionar linhas novas para uma tabela executando um comando INSERT. Sintaxe: table column value o nome da tabela. o nome da coluna da tabela que receber os valores. o valor correspondente para a coluna.
Nota: Este comando com a clusula VALUES adiciona apenas uma linha de cada vez para a tabela.
Funes Bsicas
Uma vez que voc pode inserir uma linha nova que contenha valores para cada coluna da tabela, a lista de colunas no obrigatria na clusula INSERT. Porm, se voc no utiliar a lista de colunas, os valores devem ser listados de acordo com a ordem default das colunas na tabela. SQL> DESCRIBE dept
Name Null? Type ------------------------------- ------------------DEPTNO NOT NULL NUMBER(2) DNAME VARCHAR2(14) LOC VARCHAR2(13)
Por questes de clareza, utilize a lista de colunas na clusula INSERT. Coloque valores caractere e data entre aspas simples; no inclua valores numricos entre aspas.
Funes Bsicas
Mtodo explcito: SQL> INSERT INTO 2 VALUES 1 row created. dept (70, 'FINANCE', NULL);
Descrio Omita a coluna da lista de colunas Especifique a palavra chave NULL na lista da clusula VALUES. Especifique uma string vazia ('') na lista da clusula VALUES para valores do tipo caractere e data
Tenha certeza que a coluna de destino permita valores nulos verificando o status da coluna Null? do comando DESCRIBE do SQL*Plus. O Servidor Oracle automaticamente verifica todos os tipos de dados, intervalos de valores e regras de integridade de dados. Qualquer coluna que no listada explicitamente recebe um valor nulo na linha nova.
Funes Bsicas
Voc pode utilizar pseudo colunas para entrar valores especiais em sua tabela. O exemplo acima armazena informaes para o empregado GREEN na tabela EMP. Ele armazena a data e hora atual na coluna HIREDATE, utilizando a funo SYSDATE. Voc tambm pode utillizar a funo USER quando inserir linhas em uma tabela. A funo USER armazena o nome do usurio atual.
EMPNO ENAME JOB HIREDATE COMM --------- ---------- --------- ---------------7196 GREEN SALESMAN 01-DEC-97
Funes Bsicas
Verifique sua insero: EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ----- ------- -------- ---- --------- ---- --------2296 AROMANO SALESMAN 7782 03-FEB-97 1300 10
O formato DD-MON-YY normalmente utilizado para inserir um valor de data. Com este formato, lembre-se que o sculo fica sendo o sculo atual. Uma vez que a data tambm possui informao de hora, a hora default meia-noite (00:00:00). Se uma data precisa ser entrada em outro sculo ou com uma hora especfica, utilize a funo TO_DATE. O exemplo acima armazena informaes para o empregado AROMANO na tabela EMP. O valor da coluna HIREDATE fica sendo 3 de fevereiro de 1997. Se o formato RR for utilizado, o sculo pode ento no ser o atual.
Funes Bsicas
Enter value for department_id: 80 Enter value for department_name: EDUCATION Enter value for location: ATLANTA 1 row created.
Voc pode produzir um comando INSERT que permite ao usurio adicionar valores interativamente utilizando variveis de substituio do SQL*Plus. O exemplo acima armazena informaes para um departamento na tabela DEPT. Ele solicita ao usurio o nmero do departamento, o nome do departamento e sua localizao. Para valores caractere e data, o smbolo (&) e o nome da varivel deve ficar entre aspas simples.
10
Funes Bsicas
Voc pode salvar seu comando com variveis de substituio para um arquivo e ento execut-lo. Cada vez que voc executa o comando, ele solicitar novos valores. Customize os prompts utilizando o comando ACCEPT do SQL*Plus. O exemplo acima armazena informaes para um departamento na tabela DEPT. Ele solicita ao usurio o nmero do departamento, o nome do departamento e sua localizao utilizando mensagens customizadas. Please enter the department number: 90 Please enter the department name: PAYROLL Please enter the location: HOUSTON 1 row created.
No prefixe parmetros de substituio do SQL*Plus com o smbolo (&) quando referencilos no comando ACCEPT. Utilize um hfen (-) para continuar um comando do SQL*Plus na prxima linha.
11
Funes Bsicas
Voc pode utilizar o comando INSERT para adicionar linhas para uma tabela onde os valores so derivados de outras tabelas. Ao invs de utilizar a clusula VALUES, utilize uma subconsulta. Sintaxe: INSERT INTO table [ column (, column) ] subquery;
Onde: table column subquery o nome da tabela. o nome da coluna da tabela que receber valores. uma subconsulta que retorna linhas para uma tabela.
O nmero de colunas e seus tipos de dados na lista da clusula INSERT deve corresponder ao nmero de valores e seus tipos de dados na subconsulta.
12
Funes Bsicas
13
Funes Bsicas
Comando UPDATE
UPDATE SET [WHERE table column = value [, column = value] condition];
Voc pode modificar linhas existentes utilizando o comando UPDATE. Sintaxe: table column value condition o nome da tabela. o nome da coluna a alterar. o valor correspondente ou subconsulta para a coluna. identifica as linhas a serem atualizadas; composto de nomes de colunas, expresses, constantes, subconsultas e operadores de comparao.
Confirme a operao de atualizao examinando a tabela e exibindo as linhas atualizadas. Nota: Em geral, utilize a chave primria para identificar uma nica linha. Utilizar outras colunas pode causar a atualizao indesejada de vrias linhas. Por exemplo, identificar uma nica linha da tabela EMP atravs do nome perigoso porque mais de um empregado pode ter o mesmo nome.
14
Funes Bsicas
Todas as linhas da tabela so modificadas se voc omitir a clusula WHERE. SQL> UPDATE employee 2 SET deptno = 20; 14 rows updated.
O comando UPDATE modifica linhas especificas, se a clusula WHERE for especificada. O exemplo acima transfere o empregado 7782 (CLARK) para o departamento 20. Se voc omitir a clusula WHERE, todas as linhas da tabela sero modificadas. SQL> SELECT 2 FROM ename, deptno employee;
ENAME DEPTNO ---------- --------KING 20 BLAKE 20 CLARK 20 JONES 20 MARTIN 20 ALLEN 20 TURNER 20 ... 14 rows selected.
15
Funes Bsicas
Subconsultas multiple-column podem ser implementadas na clusula SET de um comando UPDATE. Sintaxe: UPDATE SET table (column, column, ...) = (SELECT column, column, FROM table WHERE condition) condition;
WHERE
16
Funes Bsicas
Voc pode utilizar subconsultas em comandos UPDATE para atualizar linhas em uma tabela. O exemplo acima atualiza a tabela EMPLOYEE baseado nos valores da tabela EMP, modificando o nmero do departamento de todos os empregados com o mesmo cargo do empregado 7788 para o nmero do departamento do empregado 7788.
17
Funes Bsicas
Se voc tentar atualizar um registro com um valor que invalide uma constraint de integridade, voc receber um erro. No exemplo acima, o departamento nmero 55 no existe na tabela pai, DEPT, portanto voc recebe o erro "parent key violation", ORA-02291. Nota: Constraints de integridade asseguram que os dados sigam um conjunto pr-determinado de regras. Um captulo subseqente apresentar mais detalhes sobre as constraints de integridade.
18
Funes Bsicas
O grfico acima remove o departamento DEVELOPMENT da tabela DEPT (assumindo que no existem constraints definidas na tabela DEPT).
19
Funes Bsicas
Comando DELETE
DELETE [FROM] table [WHERE condition];
Voc pode remover linhas utilizando o comando DELETE. Sintaxe: table condition o nome da tabela. identifica as linhas a serem apagadas; composto de nomes de colunas, expresses, constantes, subconsultas e operadores de comparao.
20
Funes Bsicas
Todas as linhas da tabela so removidas se voc omitir a clusula WHERE. SQL> DELETE FROM 4 rows deleted. department;
Voc pode remover linhas especficas utilizando a clusula WHERE no comando DELETE. O exemplo acima remove o departamento DEVELOPMENT da tabela DEPARTMENT. Voc pode confirmar a operao de deleo tentando exibir as linhas removidas utilizando o comando SELECT. SQL> SELECT * 2 FROM department 3 WHERE dname = 'DEVELOPMENT'; no rows selected.
Exemplo: Remova todos os empregados que foram admitidos aps 1 de Janeiro de 1997. SQL> DELETE FROM 2 WHERE 'DD.MM.YY'); 1 row deleted. emp hiredate > TO_DATE('01.01.97',
21
Funes Bsicas
Voc pode utilizar subconsultas para remover linhas de uma tabela baseado em valores de outra tabela. O exemplo acima remove todos os empregados que esto no departamento 30. A subconsulta procura na tabela DEPT para encontrar o nmero do departamento SALES. A subconsulta retorna o nmero do departamento para a consulta principal que remove as linhas de dados da tabela EMPLOYEE com base neste nmero de departamento.
22
Funes Bsicas
Se voc tentar remover um registro com um valor que invalide uma constraint de integridade, voc receber um erro. O exemplo acima tenta remover o departamento nmero 10 da tabela DEPT, mas resulta em um erro porque o departamento utilizado como chave estrangeira na tabela EMP. Se o registro pai que voc tentou apagar possuir registros filhos, ento voc recebe a mensagem de erro "child reccord found violation", ORA-02292.
23
Funes Bsicas
Tipos de Transaes
Tipo Data manipulation language (DML) Data definition language (DDL) Data control language (DCL) Descrio Consiste de um nmero de comandos DML que o Servidor Oracle trata como uma nica entidade ou unidade lgica de trabalho Consiste de um nico comando DDL Consiste de um nico comando DCL
Depois que uma transao termina, o prximo comando SQL executado iniciar a prxima transao automaticamente. Um comando DDL ou DCL automaticamente confirmado (commit) e portanto implicitamente termina a transao.
24
Funes Bsicas
25
Funes Bsicas
Controlando Transaes
Voc pode controlar a lgica das transaes utilizando os comandos COMMIT, SAVEPOINT e ROLLBACK.
Comando COMMIT SAVEPOINT name ROLLBACK [TO SAVEPOINT name] Descrio Termina a transao corrente tornando todas as modificaes pendentes permanentes Coloca uma marca dentro da transao corrente ROLLBACK termina a transao corrente desfazendo todas as modificaes pendentes. ROLLBACK TO SAVEPOINT name desfaz todas as modificaes aps a marca de savepoint
26
Funes Bsicas
Nota: Um terceiro comando est disponvel no SQL*Plus. O comando do SQL*Plus AUTOCOMMIT pode ser alternado para ON ou OFF. Se for setado para ON, cada comando DML individual sofre commit assim que for executado. Voc no pode desfazer as mudanas. Se for setado para OFF, o COMMIT pode ser executado explicitamente. Tambm, o COMMIT efetuado quando um comando DDL executado ou quando voc encerra o SQL*Plus.
Falhas do Sistema
Quando uma transao interrompida por uma falha de sistema, a transao inteira desfeita automaticamente. Isto previne o erro de causar mudanas no desejadas para os dados e retorna as tabelas para o seu estado no momento do ltimo commit. Desta forma, o SQL protege a integridade das tabelas.
27
Funes Bsicas
28
Funes Bsicas
29
Funes Bsicas
Efetivando os Dados
Faa as alteraes: SQL> UPDATE emp 2 SET deptno = 10 3 WHERE empno = 7782; 1 row updated.
O exemplo acima atualiza a tabela EMP alterando o nmero do departamento para o empregado 7782 (CLARK) para 10. Depois ele torna a mudana permanente executando o comando COMMIT. Exemplo: Crie um novo departamento chamado ADVERTISING com pelo menos um empregado. Torne as mudanas nos dados permanente. SQL> INSERT INTO loc) 2 VALUES 1 row created. department(deptno, dname, (50, 'ADVERTISING', 'MIAMI');
SQL> UPDATE employee 2 SET deptno = 50 3 WHERE empno = 7876; 1 row updated.
30
Funes Bsicas
Descarte todas as mudanas pendentes utilizando o comando ROLLBACK. Aps o ROLLBACK: Modificaes para os dados so desfeitas. O estado anterior dos dados restaurado. Os locks nas linhas afetadas so liberados. Exemplo: Ao tentar remover um registro da tabela TESTE, voc pode acidentalmente apagar toda a tabela. Voc pode corrigir o engano, e ento executar o comando novamente de forma correta, tornando as mudanas permanentes. SQL> DELETE FROM test; 25,000 rows deleted. SQL> ROLLBACK; Rollback complete. SQL> DELETE FROM test 2 WHERE id = 100; 1 row deleted. SQL> SELECT * 2 FROM test 3 WHERE id = 100; No rows selected. SQL> COMMIT; Commit complete.
31
Funes Bsicas
Voc pode criar uma marca dentro da transao corrente utilizando o comando SAVEPOINT. A transao pode ser dividida ento em sees menores. Voc pode descartar as mudanas pendentes at aquela marca utilizando o comando ROLLBACK TO SAVEPOINT. Se voc criar um segundo savepoint com o mesmo nome de um savepoint anterior, o savepoint mais anterior removido.
32
Funes Bsicas
33
Funes Bsicas
Leitura Consistente
Usurios de banco de dados efetuam dois tipos de acesso ao banco de dados: Operaes de leitura (comando SELECT) Operaes de escrita (comandos INSERT, UPDATE e DELETE) Voc necessita de leitura consistente para que o seguinte acontea: A leitura e gravao do banco de dados garantida com uma viso consistente dos dados. Leituras no visualizam dados que ainda esto em processo de atualizao. Escritas para o banco de dados garantem que as mudanas so efetuadas de uma forma consistente. Mudanas feitas por um usurio no conflitam com mudanas que outro usurio est fazendo. O propsito da leitura consistente assegurar que cada usurio visualize os dados como eles ficaram antes do ltimo commit, antes da operao DML comear.
34
Funes Bsicas
Leitura consistente uma implementao automtica. Mantm uma cpia parcial do banco de dados em segmentos de rollback. Quando uma operao de insero, atualizao ou deleo feita no banco de dados, o Servidor Oracle faz uma cpia dos dados antes deles serem modificados e a armazena em um segmento de rollback. Todos os usurios, exceto o que executou a mudana, ainda visualizam o banco de dados como estava antes do incio das mudanas; eles visualizam um "snapshot" dos dados a partir dos segmentos de rollback. Antes das mudanas sofrerem commit no banco de dados, somente o usurio que est modificando os dados visualiza o banco de dados com as alteraes, qualquer outro usurio visualiza um snapshot no segmento de rollback. Isto garante que os leitores dos dados leiam dados consistentes que no esto sofrendo mudanas atualmente. Quando um comando DML sofre commit, as mudanas feitas ao banco de dados tornam-se visveis para qualquer usurio executando um comando SELECT. O espao ocupado pelos dados antigos no arquivo do segmento de rollback liberado para ser reutilizado. Se a transao sofrer rollback, as mudanas so desfeitas. O original, verso antiga, dos dados no segmento de rollback escrito de volta tabela. Todos os usurios visualizam o banco de dados como estava antes da transao iniciar.
35
Funes Bsicas
Lock
O que So Locks?
Locks so mecanismos que previnem interao destrutiva entre transaes que acessam o mesmo recurso, ou um objeto de usurio (como tabelas ou linhas) ou objetos de sistema no visveis aos usurios (como estruturas de dados compartilhados e linhas do dicionrio de dados).
Modos de Lock
O Oracle utiliza dois modos de lock em um banco de dados multiusurio.
Modo de Lock exclusive Descrio Previne que um recurso seja compartilhado. A primeira transao a efetuar um lock de um recurso exclusivamente, a nica transao que pode alterar o recurso at que o lock exclusivo seja liberado. Permite que o recurso seja compartilhado. Mltiplos usurios lendo dados podem compartilhar os dados, mantendo locks compartilhados para prevenir acesso concorrente por um usurio efetuando escrita (que necessita um lock exclusivo). Vrias transaes podem obter locks compartilhados sobre o mesmo recurso.
share lock
36
Funes Bsicas
Exerccios 10
Insira dados na tabela MY_EMPLOYEE. 1. Execute o script lab10_1.sql para construir a tabela MY_EMPLOYEE que ser utilizado nos exerccios. Descreva a estrutura da tabela MY_EMPLOYEE para identificar os nomes das colunas. Name Null? ------------ --------ID NOT NULL LAST_NAME FIRST_NAME USERID SALARY Type -----NUMBER(4) VARCHAR2(25) VARCHAR2(25) VARCHAR2(8) NUMBER(9,2)
2.
3.
ID 1 2 3 4 5
Adicione a primeira linha de dados na tabela MY_EMPLOYEE a partir do exemplo de dados abaixo. No liste as colunas na clusula INSERT.
LAST_NAME Patel Dancs Biri Newman Ropeburn FIRST_NAME Ralph Betty Ben Chad Audry USERID rpatel bdancs bbiri cnewman aropebur SALARY 795 860 1100 750 1550
4.
Popule a tabela MY_EMPLOYEE com a segunda linha do exemplo de dados acima. Neste momento, liste as colunas explicitamente na clusula INSERT. Confirme sua insero para a tabela. ID LAST_NAME FIRST_NAME --- ----------- ---------1 Patel Ralph 2 Dancs Betty USERID SALARY ------ -----rpatel 795 bdancs 860
5.
6.
Crie um script chamado loademp.sql para inserir linhas na tabela MY_EMPLOYEE interativamente. Solicite ao usurio o primeiro nome do empregado, o ltimo nome e o salrio. Concatene a primeira letra do primeiro nome com os primeiros sete caracteres do ltimo nome para produzir o valor para a coluna USERID. Popule a tabela com as prximas duas linhas de exemplo de dados executando o script criado.
7.
37
Funes Bsicas
8.
Confirme suas inseres para a tabela. ID --1 2 3 4 LAST_NAME ---------Patel Dancs Biri Newman FIRST_NAME ---------Ralph Betty Ben Chad USERID SALARY ------ -----rpatel 795 bdancs 860 bbiri 1100 cnewman 750
9.
Atualize e remova dados da tabela MY_EMPLOYEE. 10. 11. Modifique o ltimo nome do empregado 3 para Drexler. Modifique o salrio para 1000 para todos os empregados com o salrio menor que 900. Verifique suas modificaes para a tabela. LAST_NAME SALARY --------- -----Patel 1000 Dancs 1000 Biri 1100 Newman 1000
12.
13. 14.
Remova o empregado Betty Dancs da tabela MY_EMPLOYEE. Confirme suas modificaes para a tabela. ID --1 3 4 LAST_NAME ---------Patel Drexler Newman FIRST_NAME ---------Ralph Ben Chad USERID SALARY ------ -----rpatel 1000 bbiri 1100 cnewman 1000
15. 16.
Execute o commit de todas as modificaes pendentes. Popule a tabela com a ltima linha do exemplo de dados executando o script criado no exerccio 6.
38
Funes Bsicas
17.
Confirme sua insero para a tabela. ID --1 3 4 5 LAST_NAME --------Patel Drexler Newman Ropeburn FIRST_NAME ----------Ralph Ben Chad Audry USERID SALARY -------- -----rpatel 1000 bbiri 1100 cnewman 1000 aropebur 1500
Marque um ponto intermedirio no processamento da transao. Apague a tabela inteira. Confirme que a tabela est vazia. Descarte a mais recente operao DELETE sem descartar a operao de INSERT anterior. Confirme que a nova linha permanece intacta. ID --1 3 4 5 LAST_NAME --------Patel Biri Newman Ropeburn FIRST_NAME ---------Ralph Bem Chad Audry USERID SALARY --------- -----rpatel 795 bbiri 1100 cnewman 750 aropebur 1500
22.
23.
39
Funes Bsicas
Objetivos
Descrever os principais objetos do banco de dados Criar tabelas Descrever os tipos de dados que podem ser utilizados na definio de colunas Alterar a definio de tabelas Remover, renomear e truncar tabelas
Funes Bsicas
Um banco de dados Oracle pode conter vrias estruturas de dados. Cada estrutura deve ser pensada no design do banco de dados de forma que possa ser criada durante a fase de construo e desenvolvimento do mesmo. Tabela: Armazena os dados View: Subconjunto dos dados de um ou mais tabelas Sequence: Gera valores para chaves primrias Index: Melhora o desempenho de algumas consultas Synonym: Fornece nomes alternativos para os objetos
Funes Bsicas
Convenes de Nomes
Nomeie tabelas e colunas de acordo com o padro de nomenclatura para qualquer objeto do banco de dados Oracle: Nomes de tabela e colunas devem comear com uma letra e podem ter de 1 at 30 caracteres de tamanho. Nomes deven conter somente os caracteres AZ, az, 09, _ (underscore), $ e #. Nomes no devem possuir o mesmo nome de outro objeto criado pelo mesmo usurio do Servidor Oracle. Nomes no devem ser uma palavra reservada do Oracle.
Diretrizes de Nomenclatura
Utilize nomes descritivos para tabelas e outros objetos do banco de dados. Nomeie a mesma entidade consistentemente em tabelas diferentes. Por exemplo, a coluna do nmero do departamento chamada DEPTNO na tabela EMP e na tabela DEPT. Nota: Nomes no fazem distino entre maisculas e minsculas. Por exemplo, EMP tratado da mesma forma que eMP ou eMp.
Funes Bsicas
Crie tabelas para armazenar dados executando o comando SQL CREATE TABLE. Este comando um dos comandos da linguagem de definio de dados (DDL), que sero discutidos nos prximos captulos. Comandos DDL so um subconjunto dos comandos SQL utilizados para criar, modificar ou remover estruturas de banco de dados Oracle8i. Estes comandos possuem um efeito imediato no banco de dados, e eles tambm registram informaes no dicionrio de dados. Para criar uma tabela, o usurio deve possuir o privilgio CREATE TABLE e uma rea de armazenamento na qual criar os objetos. O administrador do banco de dados utiliza comandos da linguagem de controle de dados (DCL), que sero discutidos em um captulo posterior, para conceder privilgios aos usurios. Sintaxe: schema table igual ao nome do usurio dono do objeto. o nome da tabela.
DEFAULT expr especifica um valor default se um valor for omitido no comando INSERT. column datatype o nome da coluna. o tipo de dado e tamanho da coluna.
Funes Bsicas
Funes Bsicas
Opo DEFAULT
hiredate DATE DEFAULT SYSDATE,
Uma coluna pode receber um valor default atravs da opo DEFAULT. Esta opo impede que valores nulos entrem nas colunas se uma linha inserida sem um valor para esta coluna. O valor default pode ser uma literal, uma expresso ou uma funo SQL, como SYSDATE e USER, mas o valor no pode ser o nome de outra coluna ou uma pseudocoluna, como NEXTVAL ou CURRVAL. A expresso default deve corresponder ao tipo de dado da coluna.
Funes Bsicas
Criando Tabelas
Crie a tabela: SQL> CREATE TABLE 2 (deptno 3 dname 4 loc Table created. dept NUMBER(2), VARCHAR2(14), VARCHAR2(13));
Name Null? Type --------------------------- -------- --------DEPTNO NOT NULL NUMBER(2) DNAME VARCHAR2(14) LOC VARCHAR2(13)
O exemplo acima cria a tabela DEPT, com trs colunas chamadas DEPTNO, DNAME e LOC. Confirme a criao da tabela executando o comando DESCRIBE. Uma vez que o comando de criao de tabelas do tipo DDL, um commit automtico ocorre quando este comando executado.
Funes Bsicas
Visualize os tipos de objetos distintos criados pelo usurio: SQL> SELECT 2 FROM DISTINCT object_type user_objects;
Visualize as tabelas, vises, sinnimos e sequences criadas pelo usurio: SQL> SELECT 2 FROM * user_catalog;
Voc pode consultas as tabelas do dicionrio de dados para visualizar vrios objetos do banco de dados criados por voc. As tabelas do dicionrio de dados mais freqentemente utilizadas so: USER_TABLES USER_OBJECTS USER_CATALOG Nota: USER_CATALOG possui um sinnimo chamado CAT. Voc pode utilizar este sinnimo em vez de USER_CATALOG em comandos SQL. SQL> SELECT 2 FROM * CAT;
Funes Bsicas
Tipos de Dados
Tipo de Dado VARCHAR2(size) CHAR(size) NUMBER(p,s) DATE LONG CLOB RAW(size) LONG RAW BLOB BFILE Descrio Dados caractere de tamanho varivel (um tamanho (size) mximo deve ser especificado. Tamanho default e mnimo 1, enquanto o mximo 4000). Dados caractere de tamanho fixo de size bytes (tamanho default e mnimo 1, enquanto o mximo 2000). Nmero possuindo uma preciso de p e escala de s; a preciso o nmero total de dgitos decimais, e a escala o nmero de dgitos a direita do ponto decimal (a preciso deve estar na faixa de 1 at 38 e a escala na faixa de -84 at 127). Valores de data e hora entre 1 de Janeiro de 4712 A.C. e 31 de Dezembro de 9999 D.C. Dados caractere de tamanho varivel de at 2 gigabytes Dados caractere single-byte de at 4 gigabytes Dados binrios com tamanho especificado por size. Tamanho mximo 2000 (um tamanho mximo deve ser especificado.) Dados binrios de tamanho varivel de at 2 gigabytes Dados binrios de at 4 gigabytes Dados binrios armazenados em um arquivo externo de at 4 gigabytes
10
Funes Bsicas
Um segundo mtodo para criar uma tabela aplicar a clusula AS subquery para criar a tabela e j inserir as linhas retornadas pela subconsulta. Sintaxe: table column subquery o nome da tabela. o nome da coluna, valor default e constraints de integridade. o comando SELECT que define o conjunto de linhas a ser inserido na tabela nova.
Diretrizes
A tabela ser criada com os nomes de coluna especificados, e as linhas recuperadas pelo comando SELECT sero inseridas na tabela. A definio da coluna pode conter somente o nome e o valor default. Se as especificaes de coluna forem determinadas, o nmero de colunas deve ser igual ao nmero de colunas da lista da clusula SELECT da subconsulta. Se nenhuma especificao de coluna determinada, os nomes das colunas da tabela sero iguais aos nomes de coluna da subconsulta.
O exemplo acima cria uma tabela, DEPT30, que contm detalhes de todos os empregados que Name Null? Type trabalham no departamento 30. Observe que os dados para a tabela DEPT30 esto sendo obtidos a ---------------------------- -------- -----------partir da tabela EMP. EMPNO NOT NULL NUMBER(4) ENAME VARCHAR2(10) ANNSAL NUMBER On Targget Treinamento e Consultoria 11 HIREDATE DATE
Funes Bsicas
Voc pode verificar a existncia de uma tabela do banco de dados e suas definies de colunas utilizando o comando DESCRIBE do SQL*Plus. Fornea uma alias de coluna, quando estiver selecionando uma expresso.
12
Funes Bsicas
Depois de criar as suas tabelas, voc pode necessitar mudar a estrutura da tabela porque voc omitiu uma coluna ou sua definio de coluna precisa ser modificada. Voc pode fazer isto utilizando o comando ALTER TABLE. Voc pode adicionar colunas para uma tabela utilizando o comando ALTER TABLE com a clusula ADD. Sintaxe: table column datatype o nome da tabela. o nome da nova coluna. o tipo de dado e tamanho da nova coluna.
DEFAULT expr especifica o valor default para uma nova coluna. Voc pode modificar colunas existentes em uma tabela utilizando o comando ALTER TABLE com a clusula MODIFY. Nota: O grfico acima fornece uma sintaxe abreviada para o ALTER TABLE. Em um captulo posterior ser discutido mais a respeito deste comando.
13
Funes Bsicas
O grfico acima adiciona a coluna JOB para a tabela DEPT30. Observe que a nova coluna torna-se a ltima coluna na tabela. Voc utiliza a clusula ADD para adicionar colunas: SQL> ALTER TABLE dept30 2 ADD (job VARCHAR2(9)); Table altered.
A nova coluna torna-se a ltima coluna: EMPNO ENAME ANNSAL HIREDATE JOB --------- ---------- --------- --------- ---7698 BLAKE 34200 01-MAY-81 7654 MARTIN 15000 28-SEP-81 7499 ALLEN 19200 20-FEB-81 7844 TURNER 18000 08-SEP-81 ... 6 rows selected.
14
Funes Bsicas
Voc pode modificar uma definio de coluna utilizando o comando ALTER TABLE com a clusula MODIFY. A modificao de coluna pode incluir mudanas para o tipo de dado, o tamanho e valor default.
Diretrizes
Aumente a largura ou preciso de uma coluna numrica. Diminua a largura de uma coluna se ela possuir somente valores nulos ou se a tabela no possuir nenhuma linha. Modifique o tipo de dado se a coluna possuir somente valores nulos. Converta uma coluna do tipo de dado CHAR para VARCHAR2 ou converta uma coluna VARCHAR2 para o tipo de dado CHAR se a coluna possuir somente valores nulos ou se voc no modificar o tamanho. Uma mudana para o valor default de uma coluna afeta somente as inseres subseqentes para a tabela.
15
Funes Bsicas
O comando DROP TABLE remove a definio de uma tabela Oracle8i. Quando voc remove uma tabela, o banco de dados remove todos os dados da tabela e todos os ndices associados. Sintaxe: DROP TABLE table;
Diretrizes
Todo o dados so apagados da tabela. Quaisquer vises ou sinnimos permanecero, porm estaro invlidos. Qualquer transao pendente sofre commit. Somente o criador da tabela ou um usurio com o privilgio DROP ANY TABLE pode remover uma tabela.
O comando DROP TABLE, uma vez executado, irreversvel. O Servidor Oracle no questiona a ao quando voc emite o comando DROP TABLE. Se voc for o dono daquela tabela ou possui um privilgio de alto nvel, ento a tabela removida imediatamente. Todas os comandos DDL emitem um commit tornando a transao permanente.
16
Funes Bsicas
Os comandos DDL adicionais incluem o comando RENAME, utilizado para renomear uma tabela, viso, sequence ou sinnimo. Sintaxe: RENAME old_name TO new_name;
Onde: old_name new_name o nome antigo da tabela, viso, sequence ou sinnimo. o novo nome da tabela, viso, sequence ou sinnimo.
17
Funes Bsicas
Outro comando DDL o comando TRUNCATE TABLE, utilizado para remover todas as linhas de uma tabela e liberar o espao de armazenamento utilizado por ela. Quando utilizar o comando TRUNCATE TABLE, voc no pode efetuar roll back das linhas removidas. Sintaxe: TRUNCATE TABLE table;
Onde: table o nome da tabela. Voc deve ser o dono da tabela ou possuir o privilgio de sistema DELETE TABLE para truncar uma tabela. O comando DELETE tambm pode remover todas as linhas de uma tabela, porm ele no libera o espao de armazenamento ocupado por ela.
18
Funes Bsicas
Voc pode adicionar um comentrio de at 2000 bytes sobre uma coluna, tabela, viso ou snapshot utilizando o comando COMMENT. O comentrio armazenado no dicionrio de dados e pode ser visualizado em uma das seguintes vises do dicionrio de dados na coluna COMMENTS: ALL_COL_COMMENTS USER_COL_COMMENTS ALL_TAB_COMMENTS USER_TAB_COMMENTS
Onde: table column text o nome da tabela. o nome da coluna de uma tabela. o texto do comentrio.
Voc pode remover um comentrio do banco de dados atribuindo uma string vazia (''). SQL> COMMENT ON TABLE emp IS ' ';
19
Funes Bsicas
Exerccios 11
1. Crie a tabela DEPARTMENT baseado no grfico abaixo. Salve a sintaxe para um arquivo chamado e11q1.sql e ento execute-o para criar a tabela. Confirme que a tabela foi criada.
Nome da Coluna Tipo de Chave Nulos/Unique Tabela (FK) Coluna (FK) Tipo de Dado Tamanho ID NAME
Number 7
Varchar2 25
2.
Popule a tabela DEPARTMENT com dados a partir da tabela DEPT. Inclua somente as colunas necessrias. Crie a tabela EMPLOYEE baseado no grfico abaixo. Salve a sintaxe em um arquivo chamado e11q3.sql e execute-o para criar a tabela. Confirme que a tabela foi criada.
ID LAST_NAME FIRST_NAME DEPT_ID
3.
Nome da Coluna Tipo de Chave Nulos/Unique Tabela (FK) Coluna (FK) Tipo de Dado Tamanho
Number 7
Varchar2 25
Varchar2 25
Number 7
20
Funes Bsicas
4.
Modifique a coluna LAST_NAME da tabela EMPLOYEE para permitir o uso de nomes de maior tamanho. Confirme sua modificao. Name Null? ------------- -------ID LAST_NAME FIRST_NAME DEPT_ID Type ----------NUMBER(7) VARCHAR2(50) VARCHAR2(25) NUMBER(7)
5.
Confirme que as tabelas DEPARTMENT e EMPLOYEE esto armazenadas no dicionrio de dados (USER_TABLES). TABLE_NAME ------------------------DEPARTMENT EMPLOYEE
6.
Crie a tabela EMPLOYEE2 baseado na estrutura da tabela EMP, incluindo somente as colunas EMPNO, ENAME e DEPTNO. Coloque o nome das colunas na tabela nova como ID, LAST_NAME e DEPT_ID, respectivamente. Remova a tabela EMPLOYEE. Altere o nome da tabela EMPLOYEE2 para EMPLOYEE. Adicione um comentrio para a definio das tabelas DEPARTMENT e EMPLOYEE que as descreva. Confirme sua adio no dicionrio de dados.
7. 8. 9.
21
Funes Bsicas
Objetivos
Descrever constraints Criar e administrar constraints
Funes Bsicas
O Que so Constraints?
O Servidor Oracle utiliza constraints para prevenir entrada de dados invlidos em tabelas. Voc pode utilizar constraints para fazer o seguinte: Garantir regras nvel de tabela sempre que uma linha for inserida, atualizada ou apagada desta tabela. A constraint deve ser satisfeita para a operao para ter sucesso. Previnir a deleo de uma tabela se existirem dependncias em outras tabelas. Prover regras para ferramentas Oracle, como o Developer/2000.
Funes Bsicas
Funes Bsicas
Definindo Constraints
CREATE TABLE [schema.]table (column datatype [DEFAULT expr] [column_constraint], [table_constraint]);
CREATE TABLE
emp( empno NUMBER(4), ename VARCHAR2(10), deptno NUMBER(7,2) NOT NULL, CONSTRAINT emp_empno_pk PRIMARY KEY (EMPNO));
O grfico acima fornece a sintaxe para a definio de constraints durante a criao de uma tabela. Sintaxe: schema table DEFAULT expr column datatype o nome do usurio dono. o nome da tabela. especifica um valor default se um valor for omitido no comando INSERT. o nome da coluna. o tipo de dado e tamanho da coluna.
column_constraint uma constraint de integridade declarada como parte da definio da coluna. table_constraint uma constraint de integridade declarada como parte da definio da tabela.
Normalmente as constraints so criadas ao mesmo tempo que a tabela. Podem ser adicionadas constraints a uma tabela aps sua criao e tambm podem ser temporariamente desabilitadas. Podem ser definidas constraints em dois nveis diferentes:
Nvel da Constraint Coluna Tabela Descrio Referencia uma nica coluna e definida dentro da especificao da prpria coluna; pode-se definir qualquer tipo de constraint de integridade. Referencia uma ou mais colunas e definida separadamente das definies de colunas na tabela; pode-se definir qualquer tipo de constraint, exceto NOT NULL
5
Funes Bsicas
Funes Bsicas
A constraint NOT NULL assegura que valores nulos no so permitidos na coluna. Colunas sem a constraint NOT NULL podem conter valores nulos por default. A constraint NOT NULL pode ser especificada somente a nvel de coluna, e no a nvel de tabela. SQL> CREATE TABLE emp( 2 empno NUMBER(4), 3 ename VARCHAR2(10) NOT NULL, 4 job VARCHAR2(9), 5 mgr NUMBER(4), 6 hiredate DATE, 7 sal NUMBER(7,2), 8 comm NUMBER(7,2), 9 deptno NUMBER(7,2) NOT NULL);
O exemplo acima aplica a constraint NOT NULL para as colunas ENAME e DEPTNO da tabela EMP. Uma vez que estas constraints no possuem nomes definidos, o Servidor Oracle criar nomes para elas. Voc pode especificar o nome de uma constraint na sua prpria especificao: ... deptno NUMBER(7,2) CONSTRAINT emp_deptno_nn NOT NULL...
Nota: Todos os exemplos de constraints descritos neste captulo podem no estar presentes nas tabelas de exemplo fornecidas com este curso. Se desejar, estas constraints podem ser adicionadas as tabelas.
Funes Bsicas
Uma constraint de integridade do tipo UNIQUE faz com que cada valor em uma coluna ou conjunto de colunas (chave) seja nico, ou seja, duas linhas de uma tabela no podem ter valores duplicados na coluna especificada ou no conjunto de colunas. A coluna (ou conjunto de colunas) includa na definio da constraint UNIQUE chamada de chave nica. Se uma chave nica possuir mais de uma coluna, o grupo de colunas ser chamado de chave nica composta. Constraints UNIQUE permitem a insero de nulos a menos que voc tambm defina uma constraint NOT NULL para as mesmas colunas. De fato, qualquer nmero de linhas pode receber nulos para colunas sem a constraint NOT NULL porque nulos no so considerados iguais a nada. Um nulo em uma coluna (ou em todas as colunas de uma chave nica composta) sempre satisfaz a constraint UNIQUE. Nota: Devido ao mecanismo de procura das constraints UNIQUE com mais de uma coluna, voc no pode ter valores idnticos nas colunas no nulas de uma constraint de chave nica composta parcialmente nula. Constraints UNIQUE podem ser definidas a nvel de coluna ou tabela. Uma chave nica composta criada utilizando a definio a nvel de tabela. SQL> CREATE TABLE dept( 2 deptno NUMBER(2), 3 dname VARCHAR2(14), 4 loc VARCHAR2(13), 5 CONSTRAINT dept_dname_uk UNIQUE(dname));
O exemplo acima aplica a constraint UNIQUE para a coluna DNAME da tabela DEPT. O nome da constraint definido como DEPT_DNAME_UK. Nota: O Servidor Oracle implementa a constraint UNIQUE criando implicitamente um ndice nico na chave nica.
Funes Bsicas
Uma constraint PRIMARY KEY cria uma chave primria para a tabela. Somente uma chave primria pode ser criada para cada tabela. A constraint PRIMARY KEY uma coluna ou conjunto de colunas que identificam de forma nica cada linha em uma tabela. Esta constraint obriga a unicidade da coluna ou combinao de colunas e assegura que nenhuma coluna que faa parte da chave primria possa conter um valor nulo. Constraints PRIMARY KEY podem ser definidas a nvel de coluna ou a nvel de tabela. Uma chave primria composta criada utilizando a definio a nvel de tabela. SQL> CREATE TABLE dept( 2 deptno NUMBER(2), 3 dname VARCHAR2(14), 4 loc VARCHAR2(13), 5 CONSTRAINT dept_dname_uk UNIQUE (dname), 6 CONSTRAINT dept_deptno_pk PRIMARY KEY(deptno));
O exemplo acima define uma constraint PRIMARY KEY na coluna DEPTNO da tabela DEPT. O nome da constraint definido como DEPT_DEPTNO_PK. Nota: Um ndice nico criado automaticamente para uma coluna de chave primria.
Funes Bsicas
Uma FOREIGN KEY, ou constraint de integridade referencial, designa uma coluna ou combinao de colunas como chave estrangeira e estabelece uma relao entre uma chave primria ou uma chave nica para a mesma tabela ou para uma tabela diferente. No grfico acima, DEPTNO foi definida como a chave estrangeira na tabela EMP (tabela dependente ou filha); ela faz referncia a coluna DEPTNO da tabela DEPT (tabela referenciada ou pai). Um valor de chave estrangeira deve corresponder a um valor existente na tabela pai ou deve ser nulo. Chaves estrangeiras so baseadas nos valores dos dados e so puramente lgicas, no fsicas ou ponteiros. Constraints FOREIGN KEY podem ser definidas nvel de coluna ou de tabela. Uma chave estrangeira composta criada utilizando a definio a nvel de tabela. SQL> CREATE TABLE emp( 2 empno NUMBER(4), 3 ename VARCHAR2(10) NOT NULL, 4 job VARCHAR2(9), 5 mgr NUMBER(4), 6 hiredate DATE, 7 sal NUMBER(7,2), 8 comm NUMBER(7,2), 9 deptno NUMBER(7,2) NOT NULL, 10 CONSTRAINT emp_deptno_fk FOREIGN KEY (deptno) 11 REFERENCES dept (deptno));
O exemplo acima define uma constraint de chave estrangeira na coluna DEPTNO da tabela EMP. O nome da constraint definido como EMP_DEPTNO_FK.
10
Funes Bsicas
11
Funes Bsicas
Constraint CHECK
A constraint CHECK define uma condio que cada linha deve satisfazer. A condio pode utilizar a mesma construo que as condies de consultas, com as seguintes excees: Referncias para as pseudo colunas CURRVAL, NEXTVAL, LEVEL e ROWNUM Chamadas para as funes SYSDATE, UID, USER e USERENV Consultas que referenciam outros valores em outras linhas Uma nica coluna pode ter mltiplas constraints CHECK que referenciam a coluna em sua definio. No h nenhum limite quanto ao nmero de contraints CHECK que voc pode definir em uma coluna. Constraints CHECK podem ser definidas a nvel de coluna ou a nvel de tabela. ..., deptno NUMBER(2), CONSTRAINT emp_deptno_ck CHECK (DEPTNO BETWEEN 10 AND 99),...
12
Funes Bsicas
Voc pode adicionar uma constraint para tabelas existentes utilizando o comando ALTER TABLE com a clusula ADD. Sintaxe: table constraint type column o nome da tabela. o nome da constraint. o tipo de constraint. o nome da coluna afetada pela constraint.
A sintaxe do nome da constraint opcional, embora recomendada. Se voc no fornecer um nome para suas constraints, o sistema gerar nomes para elas.
Diretrizes
Voc pode adicionar, remover, habilitar ou desabilitar uma constraint, mas voc no pode modificar sua estrutura. Voc pode adicionar uma constraint NOT NULL para uma coluna existente utilizando a clusula MODIFY do comando ALTER TABLE. Nota: Voc pode definir uma coluna NOT NULL somente se a tabela no possuir nenhuma linha porque no podem ser especificados dados para linhas existentes ao mesmo tempo que a coluna adicionada. SQL> ALTER TABLE emp 2 ADD CONSTRAINT emp_mgr_fk 3 FOREIGN KEY(mgr) REFERENCES emp(empno); Table altered.
O exemplo acima cria uma constraint FOREIGN KEY na tabela EMP. A constraint garante que um gerente (mgr) exista como um empregado (empno) vlido na tabela EMP.
13
Funes Bsicas
Remova a constraint PRIMARY KEY da tabela DEPT e remova a constraint FOREIGN KEY associada da coluna EMP.DEPTNO: SQL> ALTER TABLE dept 2 DROP PRIMARY KEY CASCADE; Table altered.
Para remover uma constraint, voc pode identificar o seu nome a partir das vises do dicionrio de dados USER_CONSTRAINTS e USER_CONS_COLUMNS. Ento utilize o comando ALTER TABLE com a clusula DROP. A opo CASCADE da clusula DROP tambm remove qualquer constraint dependente. Sintaxe: ALTER TABLE table DROP PRIMARY KEY | UNIQUE (column) | CONSTRAINT constraint [CASCADE];
Onde: table column constraint o nome da tabela. o nome da coluna afetada pela constraint. o nome da constraint.
Quando voc remove uma constraint de integridade, esta constraint no mais verificada pelo Servidor Oracle e no fica mais disponvel no dicionrio de dados.
14
Funes Bsicas
Desabilitando Constraints
SQL> ALTER TABLE emp 2 DISABLE CONSTRAINT emp_empno_pk CASCADE; Table altered.
Voc pode desabilitar uma constraint sem remov-la ou recri-la utilizando o comando ALTER TABLE com a clusula DISABLE. Sintaxe: ALTER TABLE table DISABLE CONSTRAINT constraint [CASCADE];
Diretrizes
Voc pode utilizar a clusula DISABLE no comando CREATE TABLE e no comando ALTER TABLE. A clusula CASCADE desabilita as constraints de integridade dependentes.
15
Funes Bsicas
Habilitando Constraints
SQL> ALTER TABLE emp 2 ENABLE CONSTRAINT emp_empno_pk; Table altered.
Voc pode habilitar uma constraint sem remov-la ou recri-la utilizando o comando ALTER TABLE com a clusula ENABLE. Sintaxe: ALTER TABLE table ENABLE CONSTRAINT constraint;
Diretrizes
Se voc habilita uma constraint, esta constraint aplica-se a todos os dados da tabela. Todos os dados da tabela devem ajustar-se a constraint. Se voc habilita uma constraint UNIQUE key ou PRIMARY KEY, um ndice do tipo UNIQUE ou PRIMARY KEY criado automaticamente. Voc pode utilizar a clusula ENABLE no comando CREATE TABLE e no comando ALTER TABLE.
16
Funes Bsicas
Visualizando Constraints
SQL> SELECT 2 3 FROM 4 WHERE constraint_name, constraint_type, search_condition user_constraints table_name = 'EMP';
Aps criar uma tabela, voc pode confirmar sua existncia executando um comando DESCRIBE. A nica constraint que voc pode verificar desta forma a constraint NOT NULL. Para visualizar todas as constraints de sua tabela, consulte a tabela USER_CONSTRAINTS. O exemplo acima exibe todos as constraints da tabela EMP. Nota: Constraints que no receberam nomes na sua criao recebem um nome atribudo pelo sistema. Na coluna CONSTRAINT_TYPE, C representa CHECK, P representa PRIMARY KEY, R representa integridade referencial (FOREIGN KEY) e U representa UNIQUE key. Observe que as constraints NOT NULL na verdade so constraints CHECK.
17
Funes Bsicas
Voc pode visualizar os nomes de colunas envolvidos em constraints consultando a viso do dicionrio de dados USER_CONS_COLUMNS. Esta viso especialmente til para constraints que possuem o nome atribudo pelo sistema.
18
Funes Bsicas
Exerccios 12
1. Adicione a nvel de tabela uma constraint PRIMARY KEY para a tabela EMPLOYEE utilizando a coluna ID. A constraint deve ficar habilitada na criao. Crie uma constraint PRIMARY KEY na tabela DEPARTMENT utilizando a coluna ID. A constraint deve ficar habilitada na criao. Adicione uma referncia de chave estrangeira para a tabela EMPLOYEE que garanta que o empregado no seja associado para um departamento no existente. Confirme que as constraints foram adicionadas consultando a viso USER_CONSTRAINTS. Observe os tipos e nomes das constraints. Salve o comando em um arquivo chamado e12q4.sql. CONSTRAINT_NAME ----------------------DEPARTMENT_ID_PK EMPLOYEE_ID_PK EMPLOYEE_DEPT_ID_FK C P P R
2.
3.
4.
5.
Modifique a tabela EMPLOYEE. Adicione uma coluna SALARY com o tipo de dado NUMBER(7).
19
Funes Bsicas
Objetivos
Descrever uma viso Criar uma viso Recuperar dados atravs de uma viso Alterar a definio de uma viso Inserir, atualizar e remover dados atravs de uma viso Remover uma viso
Funes Bsicas
Funes Bsicas
Voc pode apresentar subconjuntos lgicos ou combinaes de dados criando vises das tabelas. Uma viso uma tabela lgica baseada em uma tabela ou outra viso. Uma viso no possui dados prprios mas como uma janela pela qual os dados das tabelas podem ser visualizados ou modificados. As tabelas nas quais uma viso baseada so chamadas de tabelas bsicas. A viso armazenada como um comando SELECT no dicionrio de dados.
Funes Bsicas
Vantagens de Vises
Restringem o acesso para o banco de dados porque a viso pode exibir uma poro seletiva do banco de dados. Permitem aos usurios fazer consultas simples para recuperar os resultados de consultas complexas. Por exemplo, vises permitem aos usurios consultar informaes de mltiplas tabelas sem saber escrever um comando de join. Prov independncia dos dados para os usurios e programas de aplicao. Uma viso pode ser utilizada para recuperar dados de vrias tabelas. Prov acesso aos dados para grupos de usurios de acordo com seus critrios particulares.
Funes Bsicas
Existem duas classificaes para as vises: simples e complexas. A diferena bsica est relacionada as operaes DML (INSERT, UPDATE e DELETE). Uma viso simples: Deriva dados de uma nica tabela No utiliza funes ou grupos de dados Pode executar operaes DML atravs da viso Uma viso complexa: Deriva dados de vrias tabelas Utiliza funes ou grupos de dados Normalmente no permite operaes DML atravs da viso
Funes Bsicas
Voc pode criar uma viso inserindo uma subconsulta dentro do comando CREATE VIEW. Sintaxe: OR REPLACE FORCE NOFORCE view alias recria a viso caso ela j exista. cria a viso mesmo que as tabelas bsicas no existam. cria a viso somente se as tabelas bsicas existem. Este o default. o nome da viso. especifica nomes para as expresses selecionadas pela consulta da viso. O nmero de alias deve corresponder ao nmero de expresses selecionadas pela viso. um comando SELECT completo. Voc pode utilizar alias para as colunas na lista da clusula SELECT.
subquery
WITH CHECK OPTION especifica que somente as linhas acessveis para a viso podem ser inseridas ou atualizadas. constraint WITH READ ONLY o nome atribudo a constraint da clusula CHECK OPTION. assegura que nenhuma operao DML possa ser executada nesta viso.
SQL> CREATE VIEW empvu10 2 AS SELECT empno, ename, job 3 FROM emp 4 WHERE deptno = 10; View created.
O exemplo acima cria uma viso que contm o nmero do empregado, o nome e o cargo para todos os empregados do departamento 10.
Funes Bsicas
Voc pode exibir a estrutura de uma viso utilizando o comando DESCRIBE do SQL*Plus. SQL> DESCRIBE empvu10
Name Null? Type ------------------------------- ------------------EMPNO NOT NULL NUMBER(4) ENAME VARCHAR2(10) JOB VARCHAR2(9)
O exemplo acima cria uma viso contendo o nmero do empregado com o alias EMPLOYEE_NUMBER, o nome com o alias NAME e o salrio com o alias SALARY para todos os empregados do departamento 30. Alternativamente, voc pode controlar os nomes das colunas incluindo alias de coluna na clusula CREATE VIEW.
Funes Bsicas
EMPLOYEE_NUMBER NAME SALARY --------------- ---------- --------7698 BLAKE 2850 7654 MARTIN 1250 7499 ALLEN 1600 7844 TURNER 1500 7900 JAMES 950 7521 WARD 1250 6 rows selected.
Voc pode recuperar dados de uma viso da mesma forma que qualquer tabela. Voc pode exibir o contedo de toda a viso ou apenas linhas e colunas especficas.
Funes Bsicas
10
Funes Bsicas
A opo OR REPLACE permite recriar uma viso mesmo se outra j existir com este nome, substituindo a verso anterior. Isto significa que a viso pode ser alterada sem ser removida, recriando-a e mantendo os privilgios de objeto. Nota: Quando atribuir alias de colunas na clusula CREATE VIEW, lembre-se que os alias so listados na mesma ordem das colunas na subconsulta.
11
Funes Bsicas
O exemplo acima cria uma viso complexa com os nomes de departamento, o salrio mnimo, o salrio mximo e salrio mdio por departamento. Observe os nomes alternativos que foram especificados para a viso. Esta uma exigncia se qualquer coluna da viso derivada de uma funo ou uma expresso. Voc pode ver a estrutura da viso utilizando o comando DESCRIBE do SQL*Plus. Mostre o contedo da viso executando um comando SELECT. SQL> SELECT 2 FROM * dept_sum_vu;
NAME MINSAL MAXSAL AVGSAL -------------- --------- --------- --------ACCOUNTING 1300 5000 2916.6667 RESEARCH 800 3000 2175 SALES 950 2850 1566.6667
12
Funes Bsicas
13
Funes Bsicas
possvel executar consistncias de integridade referencial atravs de vises. Voc pode tambm garantir constraint a nvel de banco de dados. A viso pode ser utilizada para proteger a integridade dos dados, mas seu uso muito limitado. A clusula WITH CHECK OPTION especifica que INSERTS e UPDATES executados pela viso no podem criar linhas que a viso no possa selecionar, e portanto ela permite constraints de integridade e consistncias de validao de dados a serem garantidas nos dados inseridos ou atualizados. Se houver uma tentativa de executar operaes DML em linhas que a viso no seleciona, um erro exibido, com o nome da constraint se ele tiver sido especificado. SQL> UPDATE empvu20 2 SET deptno = 10 3 WHERE empno = 7788; update empvu20 * ERROR at line 1: ORA-01402: view WITH CHECK OPTION where-clause violation
Nota: Nenhuma linha atualizada porque se o nmero do departamento fosse alterado para 10, a viso no poderia mais ver aquele empregado. Portanto, com a clusula WITH CHECK OPTION, a viso pode visualizar somente empregados do departamento 20 e no permite que o nmero do departamento desses empregados seja modificado pela viso.
14
Funes Bsicas
Voc pode assegurar que nenhuma operao DML execute sobre a viso criando ela com a opo WITH READ ONLY. O exemplo acima modifica a viso EMPVU10 para prevenir qualquer operao DML na viso. Qualquer tentativa de remover uma linha da viso resultar em um erro. SQL> DELETE FROM empvu10 2 WHERE employee_number = 7782; DELETE FROM empvu10 * ERROR at line 1: ORA-01752:Cannot delete from view without exactly one key-preserved table
15
Funes Bsicas
Voc utiliza o comando DROP VIEW para remover uma viso. O comando remove a definio da viso do banco de dados. Remover vises no possui nenhum efeito nas tabelas nas quais a viso estava baseada. Vises ou outras aplicaes baseadas em vises apagadas tornam-se invalidas. Somente o dono ou um usurio com o privilgio DROP ANY VIEW pode remover uma viso. Sintaxe: view o nome da viso.
16
Funes Bsicas
Exerccios 13
1. Crie uma viso chamada EMP_VU baseada no nmero do empregado, nome e no nmero do departamento a partir da tabela EMP. Modifique o cabealho para o nome do empregado para EMPLOYEE. Mostre o contedo da viso EMP_VU. EMPNO EMPLOYEE DEPTNO ----- -------- -----7839 KING 10 7698 BLAKE 30 7782 CLARK 10 7566 JONES 20 7654 MARTIN 30 7499 ALLEN 30 7844 TURNER 30 7900 JAMES 30 7521 WARD 30 7902 FORD 20 7369 SMITH 20 7788 SCOTT 20 7876 ADAMS 20 7934 MILLER 10 14 rows selected.
2.
3.
Selecione a coluna VIEW_NAME e TEXT a partir da tabela do dicionrio de dados USER_VIEWS. VIEW_NAME TEXT ----------------------------------------------EMP_VU SELECT empno, ename employee, deptno FROM emp
4.
Utilizando a viso EMP_VU, execute uma consulta para exibir todos os nomes de empregados e nmeros de departamentos.
17
Funes Bsicas
EMPLOYEE DEPTNO ---------- --------KING 10 BLAKE 30 CLARK 10 JONES 20 MARTIN 30 ... 14 rows selected.
18
Funes Bsicas
5.
Crie uma viso chamada DEPT20 que contenha o nmero do empregado, o nome e o nmero do departamento para todos os empregados do departamento 20. Coloque os alias das colunas da viso como EMPLOYEE_ID, EMPLOYEE e DEPARTMENT_ID. No permita que um empregado seja atribudo a outro departamento pela viso. Mostre a estrutura e o contedo da viso DEPT20. Name --------------EMPLOYEE_ID EMPLOYEE DEPARTMENT_ID Null? Type -------- -----------NOT NULL NUMBER(4) VARCHAR2(10) NOT NULL NUMBER(2)
6.
7.
Se houver tempo, complete os seguintes exerccios: 8. Crie uma viso chamada SALARY_VU baseada no nome do empregado, nome do departamento, salrio e nvel do salrio para todos os empregados. Coloque o alias das colunas como Employee, Department, Salary e Grade, respectivamente.
19
Funes Bsicas
Objetivos
Descrever alguns dos objetos do banco de dados e seu uso Criar, alterar e utilizar sequences Criar e alterar ndices Criar sinnimos privados e pblicos
Funes Bsicas
Funes Bsicas
Funes Bsicas
Automaticamente gere nmeros seqnciais utilizando o comando CREATE SEQUENCE. Sintaxe: sequence INCREMENT BY n o nome do gerador da seqncia. especifica o intervalo entre os nmeros da seqncia onde n um inteiro. Se esta clusula for omitida, a seqncia ser incrementada por 1. especifica o primeiro nmero da seqncia a ser gerado. Se esta clusula for omitida, a seqncia comear em 1. especifica o valor de mximo que seqncia pode gerar. especifica um valor de mximo de 10^27 para uma sequence ascendente e -1 para uma sequence descendente. Esta a opo default. especifica o valor mnimo da seqncia. especifica um valor mnimo de 1 para uma sequence ascendente e -(10^26) para uma sequence descendente. Esta a opo default. especifica que a sequence continua gerando valores depois de atingir seu valor mximo ou mnimo ou que ela no deve gerar valores adicionais. NOCYCLE a opo default.
MINVALUE n NOMINVALUE
CYCLE | NOCYCLE
CACHE n | NOCACHE especifica quantos valores o Servidor Oracle deve alocar e manter em memria. Por default, o Servidor Oracle mantm 20 valores em memria (cache).
Funes Bsicas
O exemplo acima cria uma sequence chamada DEPT_DEPTNO para ser utilizada para a coluna DEPTNO da tabela DEPT. A seqncia comea em 91, no permite cache e no permite que ela seja cclica. No utilize a opo CYCLE se a sequence for utilizada para gerar valores de chave primria a menos que voc possua um mecanismo que remova linhas antigas mais rapidamente que os ciclos da sequence.
Funes Bsicas
Confirmando Sequences
SQL> SELECT max_value, 2 3 FROM sequence_name, min_value, increment_by, last_number user_sequences;
Uma vez criada, a sequence documentada no dicionrio de dados. Considerando-se que uma sequence um objeto do banco de dados, voc pode identific-la na tabela do dicionrio de dados USER_OBJECTS. Voc pode tambm confirmar as configuraes da sequence selecionando a partir da tabela do dicionrio de dados USER_SEQUENCES. SEQUENCE_NAME MIN_VALUE MAX_VALUE INCREMENT_BY LAST_NUMBER -------------- ----------- --------- ---------------------CUSTID 1 1.000E+27 1 109 DEPT_DEPTNO 1 100 1 91 ORDID 1 1.000E+27 1 622 PRODID 1 1.000E+27 1 200381
Funes Bsicas
Funes Bsicas
O exemplo acima insere um novo departamento na tabela DEPT, utilizando a sequence DEPT_DEPTNO para gerar um novo nmero de departamento. Voc pode visualizar o valor atual da sequence: SQL> SELECT 2 FROM dept_deptno.CURRVAL dual;
CURRVAL ------91
Suponha agora voc quer contratar empregados para prover de pessoal o departamento novo. O comando INSERT que pode ser executado repetidamente para todos os novos empregados pode incluir o seguinte cdigo:
Nota: O exemplo acima assume que uma sequence EMP_EMPNO j foi criada para gerar um nmero de empregado novo.
Funes Bsicas
10
Funes Bsicas
Se voc atingir o limite MAXVALUE para uma sequence, no sero alocados valores adicionais da sequence e voc receber um erro que indica que o valor de MAXVALUE foi excedido. Para continuar utilizando a sequence, voc pode modific-la utilizando o comando ALTER SEQUENCE. Sintaxe: ALTER SEQUENCE sequence [INCREMENT BY n] [{MAXVALUE n | NOMAXVALUE}] [{MINVALUE n | NOMINVALUE}] [{CYCLE | NOCYCLE}] [{CACHE n | NOCACHE}];
11
Funes Bsicas
12
Funes Bsicas
Para remover uma sequence do dicionrio de dados, utilize o comando DROP SEQUENCE. Voc deve ser o dono da sequence ou ter o privilgio DROP ANY SEQUENCE para remov-la. Sintaxe: DROP SEQUENCE sequence;
13
Funes Bsicas
O que um ndice?
Um ndice do Servidor Oracle um objeto de um schema que pode acelerar a recuperao das linhas utilizando um ponteiro. Podem ser criados explicitamente ou automaticamente. Se voc no possuir um ndice em uma coluna, ento um mtodo de acesso chamado full table scan ocorrer. Um ndice fornece acesso direto e rpido para as linhas de uma tabela. Seu propsito reduzir a necessidade de I/O de disco utilizando um caminho indexado para localizar os dados rapidamente. O ndice automaticamente utilizado e mantido pelo Servidor Oracle. Uma vez criado, nenhuma atividade direta requerida por parte do usurio. ndices so lgica e fisicamente independentes da tabela que indexam. Isto significa que eles podem ser criados ou removidos a qualquer momento e no causam nenhum efeito nas tabelas ou outros ndices. Nota: Quando voc remove uma tabela, os ndices correspondentes tambm so removidos.
14
Funes Bsicas
15
Funes Bsicas
Criando um ndice
Crie um ndice em uma ou mais colunas: CREATE INDEX index ON table (column[, column]...);
Aumente a velocidade de acesso da consulta na coluna ENAME da tabela EMP: SQL> CREATE INDEX 2 ON Index created. emp_ename_idx emp(ename);
Crie um ndice em uma ou mais colunas executando o comando CREATE INDEX. Sintaxe: index table column o nome do ndice. o nome da tabela. o nome da coluna da tabela a ser indexada.
16
Funes Bsicas
17
Funes Bsicas
Confirmando ndices
SQL> SELECT 2 3 FROM 4 WHERE 5 AND ic.index_name, ic.column_name, ic.column_position col_pos, ix.uniqueness user_indexes ix, user_ind_columns ic ic.index_name = ix.index_name ic.table_name = 'EMP';
Confirme a existncia de ndices a partir da viso do dicionrio de dados USER_INDEXES. Voc tambm pode conferir as colunas envolvidas em um ndice examinando a viso USER_IND_COLUMNS. O exemplo acima exibe todos os ndices previamente criados, nomes das colunas afetadas e a unicidade para a tabela EMP. INDEX_NAME ----------------EMP_EMPNO_PK EMP_ENAME_IDX COLUMN_NAME COL_POS UNIQUENES --------------- ------- ---------EMPNO 1 UNIQUE ENAME 1 NONUNIQUE
18
Funes Bsicas
Removendo um ndice
Remova um ndice do dicionrio de dados: SQL> DROP INDEX index;
Remova o ndice EMP_ENAME_IDX do dicionrio de dados: SQL> DROP INDEX emp_ename_idx; Index dropped.
Voc no pode modificar ndices. Para alterar um ndice, voc deve remov-lo e ento cri-lo novamente. Remova a definio de um ndice do dicionrio de dados executando o comando DROP INDEX. Para remover um ndice, voc deve ser o dono do ndice ou possuir o privilgio DROP ANY INDEX. Sintaxe: index o nome do ndice.
19
Funes Bsicas
Sinnimos
CREATE [PUBLIC] SYNONYM synonym FOR object;
Para referenciar uma tabela criada por outro usurio, voc deve prefixar o nome da tabela com o nome do usurio que a criou seguido por um ponto. Criando um sinnimo voc elimina a necessidade de qualificar o nome do objeto com o schema e o prov um nome alternativo para uma tabela, viso, sequence, procedure ou outros objetos. Este mtodo pode ser especialmente til com nomes de objeto longos, como vises. Sintaxe: PUBLIC synonym object cria um sinnimo acessvel a todos os usurios. o nome do sinnimo a ser criado. identifica o objeto para o qual o sinnimo deve ser criado.
Diretrizes
O objeto no pode estar contido em uma package. Um nome de sinnimo privado deve ser distinto de todos os outros objetos criados pelo mesmo usurio.
20
Funes Bsicas
O exemplo acima cria um sinnimo para a viso DEPT_SUM_VU para uma referncia mais rpida. O DBA pode criar um sinnimo pblico acessvel para todos os usurios. O exemplo abaixo cria um sinnimo pblico chamado DEPT para a tabela DEPT do usurio ALICE: SQL> CREATE PUBLIC SYNONYM dept 2 FOR alice.dept; Synonym created.
Removendo um Sinnimo
Para remover um sinnimo, utilize o comando DROP SYNONYM. Somente um DBA pode remover um sinnimo pblico. SQL> DROP SYNONYM dept; Synonym dropped.
21
Funes Bsicas
Exerccios 14
1. Crie uma seqncia para ser utilizada com a coluna da chave primria da tabela DEPARTMENT. A seqncia deve iniciar em 60 e possuir um valor mximo de 200. Fornea para a seqncia um incremento de 10 e o nome como DEPT_ID_SEQ. Crie um arquivo de script para exibir a seguinte informao sobre suas seqncias: o nome da seqncia, o valor mximo, o incremento e o ltimo nmero fornecido. Coloque o nome do arquivo como e14q2.sql. Execute o script criado. SEQUENCE_NAME ------------CUSTID DEPT_ID_SEQ ORDID PRODID MAX_VALUE INCREMENT_BY LAST_NUMBER --------- ------------ ----------1.000E+27 1 109 200 1 60 1.000E+27 1 622 1.000E+27 1 200381
2.
3.
Escreva um script interativo para inserir uma linha na tabela DEPARTMENT. Coloque o nome do arquivo como e14q3.sql. Utilize a seqncia que voc criou para a coluna ID. Crie um prompt customizado para solicitar o nome do departamento. Execute o script adicionando dois departamentos chamados Education e Administration. Confirme as inseres. Crie um ndice no nico para a coluna definida como FOREIGN KEY na tabela EMPLOYEE. Mostre os ndices que existem no dicionrio de dados para a tabela EMPLOYEE. Salve o comando para um script chamado e14q5.sql.
4.
5.
22
Funes Bsicas
Objetivos
Criar usurios Criar roles para facilitar a configurao e manuteno do modelo de segurana Executar GRANT e REVOKE de privilgios de objeto
Funes Bsicas
Em um ambiente multiusurio, voc deve manter a segurana do acesso ao banco de dados. A segurana do servidor de banco de dados Oracle permite fazer o seguinte: Controlar o acesso ao banco de dados Fornecer acesso a objetos especficos do banco de dados Confirmar os privilgios fornecidos e recebidos com o dicionrio de dados do Oracle Criar sinnimos para os objetos do banco de dados
A segurana do banco de dados pode ser classificada em duas categorias: segurana do sistema e segurana dos dados. A segurana do sistema cobre o acesso e uso do banco de dados a nvel de sistema, como nomes de usurios e senhas, espao de disco alocado aos usurios e operaes de sistema permitidas aos usurios. A segurana do banco de dados cobre o acesso e uso dos objetos do banco de dados e as aes que esses usurios podem executar sobre os objetos.
Funes Bsicas
Privilgios
Privilgios fornecem a permisso para executar comandos SQL especficos. O administrador de banco de dados um usurio de alto nvel com capacidade para conceder aos usurios acesso ao banco de dados e seus objetos. Os usurios necessitam de privilgios de sistemas para obter acesso ao banco de dados e de privilgios de objeto para manipular o contedo dos objetos do banco de dados. Tambm pode ser fornecido aos usurios o privilgio para conceder privilgios adicionais a outros usurios ou roles, que so chamadas de grupos de privilgios relacionados.
Schema
Um schema uma coleo de objetos, como tabelas, vises e sequences. O schema associado a um usurio do banco de dados e possui o mesmo nome deste usurio.
Funes Bsicas
Privilgios de Sistema
Mais de 80 privilgios de sistemas esto disponveis para os usurios e roles. Privilgios de sistemas so normalmente concedidos pelo administrador de banco de dados.
Funes Bsicas
Criando Usurios
CREATE USER IDENTIFIED BY user password;
SQL> 2 User
scott tiger;
O DBA cria o usurio executando o comando CREATE USER. O usurio no possui nenhum privilgio neste momento. O DBA pode ento conceder vrios privilgios para o usurio. Estes privilgios determinam o que o usurio pode fazer a nvel de banco de dados. No exemplo acima fornecida uma sintaxe abreviada para a criao de um usurio. Sintaxe: user password o nome do usurio a ser criado. especifica que o usurio deve efetuar o login com esta senha.
Funes Bsicas
Uma vez criado o usurio, o DBA pode conceder privilgios a ele. Sintaxe: privilege user o privilgio de sistema a ser concedido. o nome do usurio
Na tabela abaixo so apresentados os principais privilgios de sistema necessrios para um desenvolvedor de aplicao:
Privilgio de Sistema CREATE SESSION CREATE TABLE CREATE SEQUENCE CREATE VIEW CREATE PROCEDURE Operaes Autorizadas Conectar ao banco de dados Criar tabelas no schema do usurio Criar sequences no schema do usurio Criar vises no schema do usurio Criar uma stored procedure, funo ou package no schema do usurio
Funes Bsicas
O DBA utiliza o comando GRANT para conceder privilgios de sistema para o usurio. Uma vez que os privilgios tenham sido concedidos, o usurio pode utiliz-los imediatamente. No exemplo acima, o usurio SCOTT recebeu os privilgios para criar tabelas, sequences e vises.
Funes Bsicas
Uma role um grupo nomeado de privilgios relacionados que podem ser concedidos ao usurio. Este mtodo torna a concesso e remoo de privilgios mais fcil de executar e manter. Um usurio pode ter acesso a vrias roles e vrios usurios podem ser associados a mesma role. As roles so normalmente criadas para uma aplicao de banco de dados.
Onde: role o nome da role a ser criada. Agora que a role foi criada, o DBA pode utilizar o comando GRANT para associar os usurios e conceder os privilgios para a role.
Funes Bsicas
O exemplo acima cria uma role chamada MANAGER e ento permite aos gerentes criar tabelas e vises. Depois a role MANAGER concedida aos usurios BLAKE e CLARK. Agora BLAKE e CLARK podem criar tabelas e vises.
10
Funes Bsicas
Modificando Senhas
SQL> ALTER USER scott 2 IDENTIFIED BY lion; User altered.
Cada usurio possui uma senha que inicializada pelo DBA quando o usurio criado. Voc pode modificar sua senha utilizando o comando ALTER USER. Sintaxe: ALTER USER user IDENTIFIED BY password;
Embora este comando possa ser utilizado para modificar sua senha, existem outras opes. Voc deve possuir o privilgio ALTER USER para modificar qualquer outra opo.
11
Funes Bsicas
Privilgios de Objeto
Um privilgio de objeto um privilgio ou direito para executar uma determinada ao em uma tabela, viso, sequence ou procedure especfica. Cada objeto possui um conjunto particular de privilgios concedveis. O grfico acima lista os privilgios para vrios tipos de objetos. Observe que os nicos privilgios que se aplicam a uma sequence so SELECT e ALTER. UPDATE, REFERENCES e INSERT podem ser restringidos especificando-se um subconjunto de colunas. Um SELECT pode ser restringido criando-se uma viso com um subconjunto de colunas e concedendo-se o privilgio de SELECT somente na viso. Uma concesso em um sinnimo convertida para uma concesso na tabela referenciada pelo sinnimo. Diferentes privilgios de objeto esto disponveis para tipos diferentes de objetos do schema. Um usurio automaticamente possui todos os privilgios de objeto para os objetos contidos em seu prprio schema. Um usurio pode conceder qualquer privilgio de objeto sobre qualquer objeto que ele possua para qualquer outro usurio ou role. Se a concesso incluir a opo GRANT OPTION, quem receber o privilgio de objeto pode futuramente conced-lo a outros usurios; caso contrrio, ele somente poder utilizar o privilgio e no poder conced-lo a outros usurios. GRANT object_priv [(columns)] ON object TO {user | role | PUBLIC} [WITH GRANT OPTION];
um privilgio de objeto a ser concedido. todos os privilgios de objeto. especificam as colunas da tabela ou viso sobre as quais os privilgios devem ser concedidos. o objeto sobre o qual os privilgios devem ser concedidos. identifica a quem o privilgio deve ser concedido. concede o privilgio de objeto para todos os usurios.
12
Funes Bsicas
WITH GRANT OPTION permite para quem receber o privilgio conced-lo a outros usurios e roles.
13
Funes Bsicas
Conceda privilgios de atualizao de colunas especficas para usurios e roles: SQL> GRANT update (dname, loc) 2 ON dept 3 TO scott, manager; Grant succeeded.
Diretrizes
Para conceder privilgios em um objeto, o objeto deve estar em seu prprio schema ou voc deve ter recebido o privilgio sobre o objeto com a opo WITH GRANT OPTION. Um dono do objeto pode conceder qualquer privilgio sobre o objeto para qualquer outro usurio ou role do banco de dados. O dono de um objeto automaticamente adquire todos os privilgios sobre o objeto. O primeiro exemplo acima concede para os usurios SUE e RICH o privilgio para consultar sua tabela EMP. O segundo exemplo concede o privilgio UPDATE em colunas especficas da tabela DEPT para o usurio SCOTT e para a role MANAGER. Nota: DBAs geralmente concedem privilgios de sistema; qualquer usurio que possui um objeto pode conceder privilgios sobre seus prprios objetos.
14
Funes Bsicas
O exemplo acima permite ao usurio SCOTT acessar a tabela DEPT com os privilgios para consultar e adicionar linhas para a tabela. Permita tambm ao usurio SCOTT repassar para outros usurios estes privilgios.
O exemplo acima permite a todos os usurios do sistema consultar dados da tabela DEPT do usurio ALICE.
15
Funes Bsicas
Se voc tentar executar uma operao no autorizada, por exemplo, remover uma linha de uma tabela para a qual voc no possui o privilgio DELETE, o Servidor Oracle no permitir que a operao execute. Se voc receber a mensagem de erro do Servidor Oracle table or view does not exist, o seguinte pode ter ocorrido: Voc forneceu um nome de tabela ou viso que no existe Voc tentou executar uma operao em uma tabela ou viso para a qual voc no possui o privilgio apropriado Voc pode acessar o dicionrio de dados para visualizar os privilgios que voc possui. O grfico acima descreve as vrias tabelas do dicionrio de dados que podem ser consultadas para este fim.
16
Funes Bsicas
Remova privilgios concedidos a outros usurios utilizando o comando REVOKE. Quando voc utiliza o comando REVOKE, os privilgios que voc especificou so revogados dos usurios que voc informa e de qualquer outro usurio para quem estes privilgios podem ter sido concedidos atravs do uso de GRANT OPTION. Sintaxe: CASCADE CONSTRAINTS necessria para remover qualquer constraint de integridade referente feita ao objeto por meio do privilgio REFERENCES.
17
Funes Bsicas
O exemplo acima revoga os privilgios SELECT e INSERT fornecidos ao usurio SCOTT na tabela DEPT. Nota: Se um usurio receber um privilgio com a opo WITH GRANT OPTION, este usurio tambm pode conceder o privilgio com WITH GRANT OPTION, de forma que pode-se formar uma cadeia longa de concesses, mas nenhuma concesso circular permitida. Se o dono do objeto revogar um privilgio de um usurio que concedeu o privilgio a outros usurios, o REVOKE remove o privilgio tambm destes outros usurios. Por exemplo, se o usurio A concede o privilgio SELECT em uma tabela para o usurio B incluindo a opo WITH GRANT OPTION, o usurio B pode conceder ao usurio C o privilgio SELECT tambm com WITH GRANT OPTION, e o usurio C pode conceder ento ao usurio D o privilgio SELECT. Se o usurio A revogar o privilgio do usurio B, ento os privilgios concedidos aos usurios C e D tambm so revogados.
18
Funes Bsicas
Exerccios 15
1. Que privilgio um usurio necessita para conectar ao Servidor Oracle? Este privilgio um privilgio de sistema ou objeto? Que privilgio necessrio fornecer para um usurio poder criar tabelas? Se voc criar uma tabela, quem pode fornecer privilgios para outros usurios sobre esta tabela? Voc um DBA e est criando vrios usurios que necessitam dos mesmos privilgios de sistema. O que voc pode utilizar para facilitar seu trabalho? Que comando voc utiliza para alterar a sua senha? Conceda a outro usurio acesso para a sua tabela DEPT. Solicite a este outro usurio que tambm conceda a voc acesso de consulta para a tabela DEPT dele. Consulte todas as linhas da sua tabela DEPT. DEPTNO -----10 20 30 40 DNAME ---------ACCOUNTING RESEARCH SALES OPERATIONS LOC --------NEW YORK DALLAS CHICAGO BOSTON
2. 3.
4.
5. 6.
7.
8.
Adicione uma nova linha para a tabela DEPT. O grupo 1 deve inserir Education como o departamento nmero 50. O grupo 2 deve inserir Administration tambm como o departamento nmero 50. Torne as modificaes permanentes. Crie um sinnimo para a tabela DEPT do outro grupo.
9.
19
Funes Bsicas
10.
Consulte todas as linhas da tabela DEPT do outro grupo utilizando o sinnimo. Resultado do comando SELECT para o grupo 1. DEPTNO DNAME LOC ------ -------------- --------10 ACCOUNTING NEW YORK 20 RESEARCH DALLAS 30 SALES CHICAGO 40 OPERATIONS BOSTON 50 ADMINISTRATION
Resultado do comando SELECT para o grupo 2. DEPTNO DNAME LOC ------ -------------- --------10 ACCOUNTING NEW YORK 20 RESEARCH DALLAS 30 SALES CHICAGO 40 OPERATIONS BOSTON 50 EDUCATION
11.
Consulte a viso do dicionrio de dados USER_TABLES para visualizar as tabelas que voc possui. TABLE_NAME ---------------BONUS CUSTOMER DEPARTMENT DEPT DUMMY EMP EMPLOYEE ITEM MY_EMPLOYEE ORD PRICE PRODUCT SALGRADE 13 rows selected.
12.
Consulte a viso do dicionrio de dados ALL_TABLES para visualizar todas as tabelas que voc possui acesso. Exclua as tabelas que foram criadas por voc.
20
Funes Bsicas
13.
21
Funes Bsicas
Objetivos
Reconhecer um bloco PL/SQL bsico e suas sees Descrever o significado de variveis em PL/SQL Distinguir entre variveis PL/SQL e no PL/SQL Declarar variveis PL/SQL Executar um bloco PL/SQL
Funes Bsicas
PL/SQL uma linguagem de blocos estruturados, significando que programas pode ser divididos em blocos lgicos. Um bloco PL/SQL composto de at trs sees: declarativa (opcional), executvel (obrigatria) e de tratamento de excees (opcional). Somente as palavras chaves BEGIN e END so obrigatrias. Voc pode declarar variveis locais no bloco que as utiliza. Condies de erro (conhecidas como excees) podem ser tratadas especificamente dentro do bloco para a qual elas se aplicam. Voc pode armazenar e modificar valores dentro de um bloco PL/SQL declarando e referenciando variveis e outros identificadores. A tabela abaixo descreve as trs sees de bloco.
Seo Declarativa Executvel Tratamento de Excees Descrio Contm todas as variveis, constantes, cursores e excees definidas pelo usurio que so referenciadas nas sees executvel e declarativa Contm os comandos SQL para manipular os dados no banco de dados e os comandos PL/SQL para manipular os dados no bloco Especifica as aes a serem executadas quando erros e condies anormais acontecerem na seo executvel Incluso Opcional Obrigatria Opcional
Funes Bsicas
Coloque um ponto-e-vrgula (;) no final de um comando SQL ou comando de controle PL/SQL. Coloque um barra (/) para executar o bloco PL/SQL annimo no SQL buffer. Quando o bloco executado com sucesso, sem erros no tratados ou erros de compilao, a mensagem resultante deve ser como a seguinte: PL/SQL procedure successfully completed
Coloque um ponto (.) para fechar o SQL buffer. Um bloco PL/SQL tratado como um comando contnuo no buffer, e os ponto-e-vrgula dentro do bloco no fecham ou executam o buffer. Nota: Em PL/SQL, um erro chamado de exceo. Palavras chaves de seo como DECLARE, BEGIN e EXCEPTION no so seguidas por ponto-e-vrgula. Entretanto, END e todas os outros comandos PL/SQL exigem um ponto-e-vrgula para terminar o comando. Voc pode escrever vrios comandos na mesma linha. Porm, este mtodo no recomendado para clareza e edio.
Funes Bsicas
Tipos de Blocos
Cada unidade de PL/SQL pode possuir um ou mais blocos. Estes blocos podem ser completamente separados ou aninhados um dentro do outro. As unidades bsicas (procedures e funes, tambm conhecidas como subprogramas, e blocos annimos) que fazem um programa PL/SQL so blocos lgicos, que podem conter qualquer nmero de subblocos aninhados. Portanto um bloco pode representar uma pequena parte de outro bloco, que por sua vez pode ser parte de uma unidade inteira de cdigo. Dos dois tipos de construes disponveis em PL/SQL, blocos annimos e subprogramas, apenas blocos annimos so discutidos neste curso.
Blocos annimos
Blocos annimos so blocos sem um nome especfico. Eles so declarados em um ponto de uma aplicao onde eles sero executados e passados ao PL/SQL engine em tempo de execuo. Voc pode inserir um bloco annimo dentro de um programa dos pr-compiladores e dentro do SQL*Plus ou Server Manager. Triggers dos componentes do Developer/2000 consistem deste tipo de bloco.
Subprogramas
Subprogramas so blocos PL/SQL nomeados que podem receber parmetros e serem invocados. Voc pode os declarar como procedures ou funes. Geralmente voc utiliza uma procedure para executar uma ao e uma funo para calcular um valor. Voc pode armazenar subprogramas no nvel do servidor ou da aplicao. Utilizando os componentes do Developer/2000 (Forms, Reports e Graphics) voc pode declarar procedures e funes como parte da aplicao (um form ou report), e execut-las a partir de outras procedures, funes e triggers dentro da mesma aplicao sempre que necessrio. Nota: Uma funo semelhante a uma procedure, a no ser pelo fato de que uma funo deve retornar um valor.
Funes Bsicas
Construes de Programas
A tabela abaixo exibe uma variedade de construes diferentes de programas PL/SQL que utilizam um bloco PL/SQL bsico. Eles esto disponveis dependendo do ambiente onde sero executados.
Construo Blocos Annimos Stored procedure ou funo Procedure ou funo de Aplicao Package Trigger de Banco de Dados Trigger de Aplicao Descrio Blocos PL/SQL no nomeados que so inseridos dentro de um aplicao ou executados de forma interativa Bloco PL/SQL nomeado armazenado dentro do Servidor Oracle que pode receber parmetros e ser invocado repetidamente pelo nome Bloco PL/SQL nomeado armazenado dentro de uma aplicao Developer/2000 ou biblioteca compartilhada que pode receber parmetros e ser invocado repetidamente pelo nome Mdulo PL/SQL nomeado que agrupa procedures, funes e identificadores relacionados Bloco PL/SQL que associado com uma tabela do banco de dados e executado automaticamente quando ativado por comandos DML Bloco PL/SQL que associado com um evento de aplicao e executado automaticamente Disponibilidade Todos os ambientes PL/SQL
Servidor Oracle
Componentes do Developer/2000 Servidor Oracle e componentes do Developer/2000 Servidor Oracle Componentes do Developer/2000
Funes Bsicas
Utilizao de Variveis
Com PL/SQL voc pode declarar variveis e ento utiliz-las em comando SQL e procedurais em qualquer lugar onde uma expresso pode ser utilizada. Armazenamento temporrio de dados Dados podem ser temporariamente armazenados em uma ou mais variveis para posterior utilizao no fluxo de processamento dos dados. Manipulao de valores armazenados Variveis podem ser utilizadas para clculos e outras manipulaes de dados sem acessar o banco de dados. Reutilizao Uma vez declaradas, as variveis podem ser utilizadas repetidamente dentro de uma aplicao simplesmente referenciando-as dentro de outros comandos, inclusive outros comandos de declarao. Facilidade de manuteno Quando utilizar %TYPE e %ROWTYPE (maiores informao sobre %ROWTYPE ser visto em um captulo subseqente) voc declara variveis, baseando as declaraes nas definies de colunas do banco de dados. Variveis PL/SQL ou variveis de cursor previamente declaradas dentro do escopo atual tambm podem utilizar o atributo %TYPE e %ROWTYPE como especificadores de tipo de dado. Se uma definio mudar, a varivel declarada com um destes atributos tambm se modifica em tempo de execuo. Isto fornece independncia de dados, reduz custos de manuteno e permite que programas se adptem as mudanas do banco de dados para satisfazer novas necessidades do negcio.
Funes Bsicas
Funes Bsicas
Tipos de Variveis
Todas as variveis PL/SQL possuem um tipo de dado, que especifica um formato de armazenamento, constraints e faixas de valores vlidos. O PL/SQL suporta quatro categorias de tipos de dados: escalares, compostos, de referncia e LOB (large object), que voc pode utilizar para declarar variveis, constantes e ponteiros. Tipos de dados escalares armazenam um nico valor. Os principais tipos de dados desta categoria correspondem aos tipos das colunas de tabelas do Servidor Oracle; PL/SQL tambm suporta variveis do tipo BOOLEAN. Tipos de dados compostos como registros permitem definir e manipular grupos de campos em blocos PL/SQL. Tipos de dados de referncia armazenam valores, chamados de ponteiros, que designam outros itens de programa. Tipos de dados LOB armazenam valores, chamados de localizadores, que especificam a localizao de objetos grandes (imagens grficas por exemplo) que so armazenados fora da linha. Variveis no PL/SQL incluem variveis host de linguagem declaradas em programas prcompiladores, campos de tela em aplicaes Forms e variveis host do SQL*Plus. Variveis de substituio no SQL*Plus permitem armazenar pores da sintaxe do comando e ento edit-las antes do comando ser executado.
Funes Bsicas
DATE; NUMBER(2) NOT NULL := 10; VARCHAR2(13) := 'Atlanta'; CONSTANT NUMBER := 1400;
Voc precisa declarar todos os identificadores PL/SQL dentro da seo de declarao antes de referenci-los dentro do bloco PL/SQL. Voc possui a opo de atribuir um valor inicial. Voc no precisa atribuir um valor a uma varivel para declar-la. Se voc referenciar outras variveis em uma declarao, tenha certeza de t-las declarado previamente em outro comando. Sintaxe: identifier CONSTANT datatype NOT NULL expr o nome da varivel. garante que o valor da varivel no pode ser modificado; constantes devem ser inicializadas. um tipo de dado escalar, composto, de referncia ou LOB. garante que a varivel deve conter um valor; variveis NOT NULL devem ser inicializadas. qualquer expresso PL/SQL que pode ser uma literal, outra varivel ou uma expresso envolvendo operadores e funes.
Diretrizes
A expresso atribuda pode ser uma literal, outra varivel ou uma expresso envolvendo operadores e funes. Nomeie o identificador de acordo com as mesmas regras utilizadas para objetos SQL. Voc pode utilizar convenes de nomenclatura, como por exemplo v_name para representar uma varivel e c_name para representar uma varivel constante. Inicialize a varivel com uma expresso utilizando o operador de atribuio (:=) ou com a palavra reservada DEFAULT. Se voc no atribuir um valor inicial, a nova varivel ser nula por default at que voc atribua uma valor posteriormente. Se voc utilizar a constraint NOT NULL, voc deve atribuir um valor. Declarando apenas um identificador por linha o cdigo torna-se mais legvel e facil de manter. Em declaraes de constantes, a palavra chave CONSTANT deve preceder o especificador de tipo. A declarao abaixo nomeia uma constante com o tipo de dado REAL (sub-tipo de NUMBER) e atribui o valor de 50000 para a constante. Uma constante deve ser
On Targget Treinamento e Consultoria 10
Funes Bsicas
inicializada em sua declarao, caso contrrio ocorre um erro de compilao quando a declarao for executada. v_sal CONSTANT REAL := 50000.00;
11
Funes Bsicas
Regras de Nomenclatura
Dois objetos podem possuir o mesmo nome, desde que sejam definidos em blocos diferentes. Onde eles coexistem, somente o objeto declarado no bloco atual pode ser utilizado. Voc no deve utilizar o mesmo nome (identificador) para uma varivel que o nome de colunas de tabelas utilizadas no bloco. Se ocorrer a situao de variveis PL/SQL em comandos SQL possurem o mesmo nome de uma coluna, o Servidor Oracle assume que somente a coluna est sendo referenciada. Embora o cdigo de exemplo acima funcione; o cdigo escrito utilizando o mesmo nome para uma tabela do banco de dados e para o nome de uma varivel no fcil de ler nem de manter. Considere a adoo de convenes de nomenclatura para vrios objetos como no exemplo abaixo. Utilizando v_ como prefixo para representar variveis e g_ para representar variveis globais, voc evita conflitos de nomes objetos do banco de dados. DECLARE v_hiredate g_deptno BEGIN ...
Nota: Identificadores no deve ser maiores que 30 caracteres. O primeiro caractere deve ser uma letra; os demais caracteres podem ser letras, nmeros ou smbolos especiais.
12
Funes Bsicas
v_hiredate := '31-DEC-98';
v_ename := 'Maduro';
Para atribuir ou reatribuir um valor para uma varivel, voc escreve um comando de atribuio PL/SQL. Voc deve explicitamente nomear a varivel para receber o novo valor esquerda do operador de atribuio (:=). Sintaxe: identifier expr o nome de uma varivel escalar. pode ser uma varivel, literal ou chamada de funo, mas no uma coluna do banco de dados.
Outra forma de atribuir valores para variveis selecionar ou recuperar valores do banco de dados para elas. No exemplo abaixo, voc calcula 10% de gratificao quando seleciona o salrio de um empregado e a atribui para uma varivel chamada "BONUS". SQL> 2 3 4 SELECT INTO FROM WHERE sal * 0.10 bonus emp empno = 7369;
Ento voc pode utilizar a varivel BONUS em outro clculo ou inserir seu valor em uma tabela do banco de dados. Nota: Para atribuir um valor para uma varivel a partir do banco de dados, utilize o comando SELECT ou FETCH.
13
Funes Bsicas
Uma vez que o formato de data default configurado dentro do Servidor Oracle pode diferir de banco de dados para banco de dados, voc deve atribuir valores de data de forma genrica, como no exemplo anterior. DEFAULT: Voc pode utililzar a palavra chave DEFAULT ao invs do operador de atribuio para inicializar variveis. Utilize DEFAULT para variveis que possuem um valor padro. g_mgr NUMBER(4) DEFAULT 7839;
NOT NULL: Imponha a constraint NOT NULL quando uma varivel deve conter um valor. Voc no pode atribuir nulos para uma varivel definida como NOT NULL. A constraint NOT NULL deve ser seguida por uma clusula de inicializao. v_location 'CHICAGO'; VARCHAR2(13) NOT NULL :=
Nota: String literais devem ser includas entre aspas simples. Se existir uma aspa simples dentro da string, repita uma aspa duas vezes, por exemplo: 'Account wasn''t found'.
14
Funes Bsicas
Nota: O tipo de dado LONG semelhante ao VARCHAR2, a no ser pelo tamanho mximo de um valor LONG que de 32,760 bytes. Portanto, valores maiores que 32,760 no podem ser selecionados a partir de uma coluna do banco de dados tipo LONG em uma varivel PL/SQL tipo LONG.
15
Funes Bsicas
Os exemplos de declarao de variveis apresentados acima so definidos como segue: Varivel declarada para armazenar um cargo de empregado. Varivel declarada para contar as repeties de um loop e inicializada com 0. Varivel declarada para acumular o salrio total para um departamento e inicializada com 0. Varivel declarada para armazenar a data de expedio de um pedido e inicializada com uma data uma semana frente. Varivel constante declarada para uma taxa de imposto que no se modifica durante a execuo do bloco PL/SQL. Flag declarado para indicar se uma parte dos dados est vlida ou invlida e inicializada com TRUE.
16
Funes Bsicas
Atributo %TYPE
Quando voc declara variveis PL/SQL para armazenar valores de coluna estima, voc deve garantir que a varivel seja do tipo de dado correto. Caso contrrio, um erro PL/SQL poder acontecer durante a execuo. Ao invs de codificar o tipo de dado e a preciso de uma varivel, voc pode utilizar o atributo %TYPE para declarar uma varivel de acordo com outra varivel previamente declarada ou coluna do banco de dados. O atributo %TYPE freqentemente utilizado quando o valor armazenado em uma varivel derivado de uma tabela do banco de dados ou se a varivel destinada a ser escrita nela. Para utilizar o atributo no lugar do tipo de dado necessrio na declarao da varivel, prefixe a varivel com o nome da tabela e coluna do banco de dados. Se estiver se referenciando a uma varivel previamente declarada, prefixe o atributo com o nome da varivel. O PL/SQL determina o tipo de dado e tamanho da varivel quando o bloco compilado, e desta forma permanece sempre compatvel com a coluna utilizada para popular a varivel. Esta definitivamente uma vantagem para escrever e manter o cdigo, uma vez que no h necessidade de se alterar o programa para refletir mudanas no tipo de dado da coluna a nvel do banco de dados. Voc tambm pode declarar uma varivel de acordo com outra previamente declarada prefixando o atributo %TYPE com o nome desta varivel.
17
Funes Bsicas
emp.ename%TYPE;
Declare variveis para armazenar o saldo de uma conta bancria, como tambm o saldo mnimo que inicia com 10. ... v_balance v_min_balance ...
A constraint NOT NULL da coluna no se aplica as variveis declaradas utilizando o atributo %TYPE. Portanto, se voc declara um varivel utilizando o atributo %TYPE utilizando uma coluna do banco de dados definida como NOT NULL, voc pode atribuir o valor NULL para a varivel.
18
Funes Bsicas
Declare e inicialize uma varivel boleana: v_comm_sal BOOLEAN := (v_sal1 < v_sal2);
19
Funes Bsicas
20
Funes Bsicas
Com os tipos de dados LOB (large object) do Oracle8i voc pode armazenar blocos de dados no estruturados (como textos, imagens grficas, vdeos e sons) de at 4 gigabytes de tamanho. Tipos de dados LOB permitem acesso eficiente aos dados e podem ser atributos de um tipo de objeto. LOBs tambm suportam acesso randmico aos dados. O tipo de dado CLOB (character large object) utilizado para armazenar blocos grandes de dados caractere do tipo single-byte no banco de dados. O tipo de dado BLOB (binary large object) utilizado para armazenar objetos binrios grandes no banco de dados dentro ou fora da linha. O tipo de dado BFILE (binary file) utilizado para armazenar objetos binrios grandes em arquivos do sistema operacional fora do banco de dados. O tipo de dado NCLOB (national language character large object) utilizado para armazenar blocos grandes de dados NCHAR do tipo single-byte ou multi-byte de tamanho fixo no banco de dados, dentro ou fora da linha.
21
Funes Bsicas
Uma varivel tipo bind uma varivel que voc declara em um ambiente host, e ento a utiliza para passar valores em tempo de execuo, para um ou mais programas PL/SQL que podem utiliz-la como qualquer outra varivel. Voc pode referenciar variveis declaradas em um ambiente host ou chamador em comandos PL/SQL, a menos que o comando esteja dentro de uma procedure, funo ou package. Isto inclui variveis host de linguagem declaradas em programas pr-compiladores, campos de tela em aplicaes Developer/2000 Forms e variveis bind do SQL*Plus.
Tanto o SQL quanto o SQL*Plus podem referenciar uma varivel bind, e o SQL*Plus pode exibir seu valor.
22
Funes Bsicas
Para referenciar variveis host, voc deve prefixar a referncia com o caractere (:) para distinguir de variveis PL/SQL declaradas. Exemplos: :host_var1 := v_sal; :global_var1 := 'YES';
23
Funes Bsicas
Exerccios 16
1. a. DECLARE v_id Analise cada uma das seguintes declaraes. Determine qual delas no esto corretas e explique o motivo.
NUMBER(4);
VARCHAR2(10);
c. DECLARE v_birthdate
d. DECLARE v_in_stock
BOOLEAN := 1;
24
Funes Bsicas
2. a.
Em cada uma das seguintes atribuies, determine o tipo de dado resultante da expresso.
d. v_flag := TRUE;
f. v_value := NULL;
3.
Crie um bloco annimo para exibir a frase My PL/SQL Block Works para a tela. G_MESSAGE ----------------------My PL/SQL Block Works
25
Funes Bsicas
Se houver tempo, complete os seguintes exerccios: 4. Crie um bloco que declare duas variveis. Atribua o valor destas variveis PL/SQL para variveis host do SQL*Plus e mostre os resultados das variveis PL/SQL na tela. Execute o bloco PL/SQL. Salve o bloco PL/SQL para um arquivo chamado e16q4.sql. V_CHAR V_NUM Character (tamanho varivel) Number
Atribua valores para estas variveis como segue: Varivel -------V_CHAR V_NUM Valor ------------------------------------A literal '42 is the answer' Os dois primeiros caracteres de V_CHAR
26
Funes Bsicas
Objetivos
Reconhecer o significado da seo executvel Escrever comandos dentro da seo executvel Descrever as regras do aninhamento de blocos Executar e testar um bloco PL/SQL Utilizar convenes de codificao
Funes Bsicas
Delimitadores
Delimitadores so smbolos simples ou compostos que possuem significado especial para PL/SQL.
Smbolo + * / = @ ; Smbolos Simples Significado Operador de Adio Operador de Subtrao/Negao Operador de Multiplicao Operador de Diviso Operador Relacional Indicador de Acesso Remoto Terminador de Comando Smbolo <> != || -/* */ := Smbolos Compostos Significado Operador Relacional Operador Relacional Operador de Concatenao Indicador de Comentrio em Linha Delimitador de nico de Comentrio Delimitador de Final de Comentrio Operador de Atribuio
Identificadores
Identificadores so utilizados para nomear itens e unidades de programas PL/SQL, que incluem constantes, variveis, excees, cursores, variveis de cursor, subprogramas e packages. Identificadores podem conter at 30 caracteres, mas devem iniciar com um caractere alfabtico. No escolha o mesmo nome para um identificador que colunas de uma tabela utilizada no bloco. Se identificadores PL/SQL que esto no mesmo comando SQL possuem o mesmo nome de uma coluna, ento o Oracle assume que somente a coluna est sendo referenciada. No podem ser utilizadas palavras reservadas como identificadores a menos que elas sejam colocadas entre aspas duplas (por exemplo, "SELECT").
Funes Bsicas
Literais
Um literal um valor numrico, caractere, string ou boleano explcito no representado por um identificador. Literais caractere incluem todos os caracteres imprimveis no conjunto de caracteres PL/SQL: letras, nmeros, espaos e smbolos especiais. Literais caractere e data devem ser colocados entre aspas simples. v_ename := 'Henderson';
Literais numricos podem ser representados por um valor simples (por exemplo, -32.5) ou atravs de notao cientfica (por exemplo, 2E5, significando 2*10 para a potncia 5 = 200000).
Funes Bsicas
Comentando o Cdigo
Comente o cdigo para documentar cada fase e auxiliar na depurao. Comente o cdigo PL/SQL com dois hfens (--) se o comentrio est em uma nica linha, ou inclua o comentrio entre os smbolos / * e * / se o comentrio estiver em vrias linhas. Bem colocados, comentrios so extremamente valiosos para a clareza do cdigo e futuras manutenes. Exemplo: Calcule o salrio anual a partir do salrio mensal. ... v_sal NUMBER(9,2); BEGIN /* Calcule o salrio anual baseado no salrio mensal fornecido pelo usurio */ v_sal := v_sal*12; END; -- Este o final da transao
Funes Bsicas
As seguintes funes no esto disponveis em comandos procedurais: DECODE Funes de grupo: AVG, MIN, MAX, COUNT, SUM, STDDEV e VARIANCE. Funes de grupo aplicam-se a grupos de linhas em uma tabela e portanto s esto disponveis dentro de comandos SQL em um bloco PL/SQL Exemplo: Calcule a soma de todos os nmeros armazenados na PL/SQL table NUMBER_TABLE. Este exemplo produz um erro de compilao. v_total := SUM(number_table);
Funes Bsicas
Funes PL/SQL
O PL/SQL fornece muitas funes para auxiliar a manipulao de dados. Estas funes dividem-se nas seguintes categorias: Informaes de Erros Numricas Caractere Converso Data Genricas
Exemplos: Construa o endereo para uma empresa. v_mailing_address := v_name||CHR(10)|| v_address||CHR(10)||v_state|| CHR(10)||v_zip;
CHR a funo SQL que converte um cdigo ASCII para o caractere correspondente; 10 o cdigo para uma quebra de linha.
Funes Bsicas
Onde: value fmt uma string de caracteres, nmeros ou datas. o modelo de formato utilizado para converter o valor.
Armazene um valor que composto do nome do usurio e da data atual. Este cdigo causa um erro de compilao. v_comment := USER||': '||SYSDATE;
Para corrigir o erro, converta SYSDATE para uma striing de caracteres com a funo de converso TO_CHAR. v_comment := USER||': '||TO_CHAR(SYSDATE);
O PL/SQL tenta converter se possvel, mas o sucesso depende das operaes que so executadas. uma boa prtica de programao executar explicitamente as converses de tipos de dados, porque elas podem afetar o desempenho de forma favoravel e podem permanecer vlidas at mesmo com uma mudana em verses do software.
Funes Bsicas
Escopo de Variveis
O escopo de um objeto a regio do programa que pode se referenciar ao objeto. Voc pode referenciar a varivel declarada dentro da seo executvel.
Identificadores
Um identificador visvel no bloco no qual declarado e em todos os subblocos aninhados, procedures e funes. Se o bloco no encontrar o identificador declarado localmente, ele procura na seo declarativa do bloco externo (bloco pai). O bloco nunca procura para baixo nos blocos inclusos (blocos filhos) ou lateralmente para blocos de mesmo nvel. O escopo se aplica para todos os objetos declarados, incluindo variveis, cursores, excees definidas pelo usurio e constantes. Nota: Qualifique um identificador utilizando como prefixo o label do bloco.
No bloco aninhado mostrado no grfico acima, a varivel y pode referenciar a varivel x. A varivel x, entretanto, no pode referenciar a varivel y. Se a varivel y no bloco aninhado tivesse recebido o mesmo nome da varivel x do bloco externo o valor seria vlido somente durante a execuo do bloco aninhado.
Escopo
O escopo de um identificador aquela regio de uma unidade de programa (bloco, subprograma ou package) na qual voc pode referenciar o identificador.
Funes Bsicas
Operadores em PL/SQL
As operaes dentro de uma expresso so executadas em uma ordem especfica que depende de sua precedncia (prioridade). A tabela abaixo mostra a ordem default de operaes de cima para baixo.
Operador **, NOT *, / +, -, || =, !=, <, >, <=, >=, IS NULL, LIKE, BETWEEN, IN AND OR Operao Exponenciao, negao lgica Multiplicao, diviso Adio, subtrao, concatenao Comparao Operador lgico AND Operador lgico OR
Nota: No necessrio utilizar parnteses com expresses boleanas, embora eles tornem o texto fcil de ler.
Exemplos
Incremente o ndice para um loop. v_count := v_count + 1;
Valide o nmero de um empregado se ele possuir um valor. v_valid := (v_empno IS NOT NULL);
Quando trabalhar com valores nulos, voc pode evitar alguns enganos comuns lembrando-se das seguintes regras: Comparaes que envolvem nulos sempre retornam NULL Aplicando o operador lgico NOT para um nulo o retorno NULL Em comandos de controle condicionais, se a condio retornar NULL, a seqncia de comandos associada no executada
10
Funes Bsicas
11
Funes Bsicas
Diretrizes de Programao
Torne a manuteno do cdigo mais simples: Documentando o cdigo com comentrios Desenvolvendo convenes para o cdigo Desenvolvendo convenes de nomenclatura para identificadores e outros objetos Melhore a clareza do programa identando o cdigo
Siga estas regras de programao para produzir um cdigo mais claro e reduzir a manuteno quando desenvolver um bloco PL/SQL.
Convenes de Cdigo
A tabela abaixo fornece diretrizes para escrever o cdigo em maisculas ou minsculas para ajudar a distinguir palavras chaves de nomes de objetos.
Categoria Comandos SQL Palavras chave PL/SQL Tipos de dados Identificadores e parmetros Tabela e colunas do banco Conveno Maisculas Maisculas Maisculas Minsculas Minsculas Exemplos SELECT, INSERT DECLARE, BEGIN, IF VARCHAR2, BOOLEAN v_sal, emp_cursor, g_sal, p_empno emp, orderdate, deptno
12
Funes Bsicas
Convenes de Nomenclatura
Evite ambigidade: Os nomes de variveis locais e parmetros possuem precedncia sobre os nomes de tabelas do banco de dados. Os nomes de colunas possuem precedncia sobre os nomes de variveis locais. A tabela abaixo exibe um conjunto de prefixos e sufixos para distinguir identificadores de outros identificadores, de objetos de banco de dados e de outros nomes de objetos.
Identificador Varivel Constante Cursor Exceo Tipo de PL/SQL table PL/SQL table Tipo de PL/SQL record PL/SQL record Parmetro de substituio do SQL*Plus Varivel global do SQL*Plus Conveno de Nomes v_name c_name name_cursere e_name name_table_type Name_table name_record_type name_record p_name g_name Exemplo v_sal c_company_name emp_cursor e_too_many amount_table_type order_total_table emp_record_type customer_record p_sal g_year_sal
13
Funes Bsicas
Identando o Cdigo
Para maior clareza idente cada nvel do cdigo. Compare os seguintes comandos IF: IF x>y THEN max:=x;ELSE max:=y;END IF;
DECLARE v_detpno NUMBER(2); v_location VARCHAR2(13); BEGIN SELECT deptno, location INTO v_deptno, v_location FROM dept WHERE dname = 'SALES'; ... END;
14
Funes Bsicas
Avalie o bloco PL/SQL acima. Determine cada um dos seguintes valores de acordo com as regras de escopo. 1. O valor de V_MESSAGE no sub-bloco. 2. O valor de V_TOTAL_COMP no bloco principal. 3. O valor de V_COMM no sub-bloco. 4. O valor de V_COMM no bloco principal. 5. O valor de V_MESSAGE no bloco principal.
15
Funes Bsicas
Exerccios 17
Bloco PL/SQL DECLARE v_weight v_message BEGIN
NUMBER(3) VARCHAR2(255)
SUB-BLOCO DECLARE v_weight NUMBER(3) := 1; v_message VARCHAR2(255) := 'Product 11001'; v_new_locn VARCHAR2(50) := 'Europe'; BEGIN v_weight := v_weight + 1; v_new_locn := 'Western ' || v_new_locn; END; v_weight := v_weight + 1; v_message := v_message || ' is in stock'; v_new_locn := 'Western ' || v_new_locn; END;
1.
Avalie o bloco PL/SQL acima e determine cada um dos seguintes valores de acordo com as regras de escopo. O valor de V_WEIGHT no sub-bloco
a.
b.
c.
d.
e.
16
Funes Bsicas
Exemplo de Escopo DECLARE v_customer v_credit_rating BEGIN DECLARE v_customer v_name BEGIN v_customer END; v_customer END; v_name v_credit_rating
VARCHAR2(50) := 'Womansport'; VARCHAR2(50) := 'EXCELLENT'; NUMBER(7) := 201; VARCHAR2(25) := 'Unisports'; v_name v_credit_rating
2.
Suponha que voc inseriu um sub-bloco dentro de um bloco, como apresentado acima. Voc declarou duas variveis, V_CUSTOMER e V_CREDIT_RATING, no bloco principal. Voc tambm declarou duas variveis, V_CUSTOMER e V_NAME, no sub-bloco. Determine os valores para cada um dos seguintes casos. O valor de V_CUSTOMER no sub-bloco
a.
b.
c.
d.
e.
f.
17
Funes Bsicas
3.
Crie e execute um bloco PL/SQL que receba dois nmeros atravs de variveis de substituio do SQL*Plus. O primeiro nmero deve ser dividido pelo segundo nmero e ento o segundo nmero deve ser adicionado ao resultado. O resultado deve ser escrito para uma varivel PL/SQL e mostrado na tela. Please enter the first number: 2 Please enter the second number: 4 PL/SQL procedure successfully completed. V_RESULT -------4.5
4.
Construa um bloco PL/SQL que calcule a gratificao total para um ano. O salrio anual e o percentual de bnus anual so passados para o bloco PL/SQL atravs de variveis de substituio e o bnus precisa ser convertido de um nmero inteiro para um nmero decimal (por exemplo, 15 para .15). Se o salrio for nulo, atribua ele para zero antes de calcular a gratificao total. Execute o bloco PL/SQL. Lembre-se: utilize a funo NVL para tratar valores nulos. Nota: Para testar a funo NVL escreva NULL no prompt; pressionando [Return] resulta em um erro de expresso.
18
Please enter the salary amount: 50000 Please enter the bonus percentage: 10 PL/SQL procedure successfully completed. G_TOTAL ------55000
Funes Bsicas
Objetivos
Escrever um comando SELECT em PL/SQL Declarar o tipo de dado e tamanho de variveis PL/SQL dinamicamente Escrever comandos DML em PL/SQL Controlar transaes em PL/SQL Determinar o resultado de comandos SQL DML
Funes Bsicas
Funes Bsicas
Utilize o comando SELECT para recuperar dados do banco de dados. Sintaxe: select_list variable_name record_name table condition uma lista com pelo menos uma coluna, e pode incluir expresses SQL, funes de linha ou funes de grupo. a varivel escalar para armazenar o valor recuperado. o PL/SQL RECORD para armazenar todos os valores recuperados. especifica o nome da tabela do banco de dados. composta de nomes de coluna, expresses, constantes e operadores de comparao, inclusive variveis e constantes PL/SQL.
Tire proveito de toda a sintaxe fornecida pelo Servidor Oracle para o comando SELECT. Lembre-se que variveis host devem ser prefixadas com o caractere (:).
Clusula INTO
DECLARE v_deptno v_loc BEGIN SELECT INTO FROM WHERE ... END;
O clusula INTO obrigatria e deve estar entre as clusulas SELECT e FROM. utilizada para especificar os nomes das variveis para armazenar os valores que o SQL retorna da clusula SELECT. Voc deve fornecer uma varivel para cada item selecionado, e a ordem delas deve corresponder aos itens selecionados. Voc utiliza a clusula INTO para popular variveis PL/SQL ou variveis host.
Funes Bsicas
Funes Bsicas
Diretrizes
Siga estas diretrizes para recuperar dados em PL/SQL: Termine cada comando SQL com um ponto-e-vrgula (;). A clusula INTO obrigatria para o comando SELECT embutido em PL/SQL. A clusula WHERE opcional e pode ser utilizada para especificar variveis de entrada, constantes, literais ou expresses PL/SQL. Especifique o mesmo nmero de variveis na clusula INTO que colunas do banco de dados na clusula SELECT. Esteja seguro que elas correspondam a posio da coluna e que os tipos de dados sejam compatveis. Para assegurar que os tipos de dados dos identificadores correspondam aos tipos de dados das colunas utilize o atributo %TYPE. O tipo de dado e nmero de variveis na clusula INTO devem corresponder aos da lista da clusula SELECT. Utilize funes de grupo, como SUM, em um comando SQL, porque funes de grupo aplicam-se a grupos de linhas de uma tabela. Nota: Funes de grupo no podem ser utilizadas em sintaxes PL/SQL, elas so utilizadas em comandos SQL dentro de um bloco PL/SQL. Exemplo: Retorne a soma dos salrios de todos os empregados do departamento especificado.
Funes Bsicas
emp.sal%TYPE; NUMBER NOT NULL := 10; SUM(sal) -- group function v_sum_sal emp deptno = v_deptno;
Funes Bsicas
Voc manipula dados no banco de dados utilizando comandos DML (manipulao de dados). Voc pode executar OS comandos DML INSERT, UPDATE e DELETE sem restries em PL/SQL. Incluindo os comandos COMMIT ou ROLLBACK no cdigo PL/SQL, os locks de linha (e locks de tabela) so liberados. O comando INSERT adiciona novas linhas de dados para a tabela. O comando UPDATE modifica linhas existentes da tabela. O comando DELETE remove linhas no desejadas da tabela.
Funes Bsicas
Inserindo Dados
Adicione informaes de um novo empregado para a tabela EMP: DECLARE v_empno emp.empno%TYPE; BEGIN SELECT empno_sequence.NEXTVAL INTO v_empno FROM dual; INSERT INTO emp (empno, ename, job, deptno) VALUES(v_empno, 'HARDING', 'CLERK', 10); END;
Utilize funes SQL, como USER e SYSDATE. Gere valores de chaves primrias utilizando sequences do banco de dados. Derive valores no bloco PL/SQL. Adicione valores default de coluna.
Nota: No existe a possibilidade de ambigidade entre identificadores e nomes de coluna no comando INSERT. Qualquer identificador na clusula INSERT deve ser um nome de coluna do banco de dados.
Funes Bsicas
Atualizando Dados
Aumente o salrio dos empregados que possuem o cargo ANALYST na tabela EMP: DECLARE v_sal_increase emp.sal%TYPE := 2000; BEGIN UPDATE emp SET sal = sal + v_sal_increase WHERE job = 'ANALYST'; END;
Pode haver ambigidade na clusula SET do comando UPDATE porque embora o identificador na esquerda do operador de atribuio sempre uma coluna do banco de dados, o identificador direita pode ser uma coluna do banco de dados ou uma varivel PL/SQL. Lembre-se que a clusula WHERE utilizada para determinar quais linhas so afetadas. Se nenhuma linha for modificada, nenhum erro acontece, ao contrrio do comando SELECT em PL/SQL. Nota: Atribuio de variveis PL/SQL sempre utilizam := e atribuies de colunas SQL sempre utilizam =. Lembre-se que nomes de colunas e nomes de identificadores so idnticos na clusula WHERE, o Servidor Oracle pesquisa primeiro no banco de dados pelo nome.
10
Funes Bsicas
Removendo Dados
Remova as linhas que pertencem ao departamento 10 da tabela EMP: DECLARE v_deptno emp.deptno%TYPE := 10; BEGIN DELETE FROM emp WHERE deptno = v_deptno; END;
Remova um pedido especfico: DECLARE v_ordid ord.ordid%TYPE := 605; BEGIN DELETE FROM item WHERE ordid = v_ordid; END;
11
Funes Bsicas
Convenes de Nomenclatura
Evite ambigidade no clusula WHERE aderindo a uma conveno de nomes que faa distino entre colunas do banco de dados e nomes de variveis PL/SQL. Colunas do banco de dados e identificadores deve possuir nomes distintos. Erros de sintaxe podem surgir porque o PL/SQL confere primeiro o banco de dados por uma coluna de tabela. Exemplo: Recupere a data do pedido e a data de expedio a partir da tabela ORD quando a data de expedio for igual a data atual. Este exemplo causa uma exceo no tratada em tempo de execuo. DECLARE order_date ord.orderdate%TYPE; ship_date ord.shipdate%TYPE; v_date DATE := SYSDATE; BEGIN SELECT orderdate, shipdate INTO order_date, ship_date FROM ord WHERE shipdate = v_date; -- unhandled exception: -- NO_DATA_FOUND END; SQL> / DECLARE * ERROR at line 1: ORA-01403: no data found ORA-06512: at line 6
O PL/SQL confere se um identificador uma coluna do banco de dados; caso contrrio, assumido que um identificador do PL/SQL. Nota: No existe possibilidade de ambigidade na clusula SELECT porque qualquer identificador na clusula SELECT deve ser um nome de coluna do banco de dados. No existe possibilidade de ambigidade na clusula INTO porque identificadores na clusula INTO devem ser variveis PL/SQL. Somente na clusula WHERE existe a possibilidade de confuso.
12
Funes Bsicas
Comando COMMIT
O COMMIT encerra a transao corrente tornando todas as mudanas pendentes no banco de dados permanentes. Sintaxe: COMMIT [WORK];
ROLLBACK [WORK];
Onde: WORK para compatibilidade com o padro ANSI. Nota: Os comandos de controle de transao so todos vlidos dentro do PL/SQL, embora o ambiente host pode colocar alguma restrio no seu uso. Voc tambm pode incluir comandos de lock explcitos (como LOCK TABLE e SELECT...FOR UPDATE) em um bloco. Eles permanecem em efeito at o final da transao. Tambm, um bloco PL/SQL necessariamente no implica em uma transao.
13
Funes Bsicas
Cursor SQL
Sempre que voc executa um comando SQL, o Servidor Oracle abre uma rea de memria na qual o comando analisado e executado. Esta rea chamada cursor. Quando a parte executvel de um bloco emite um comando SQL, o PL/SQL cria um cursor implcito que possui o identificador SQL. O PL/SQL administra este cursor automaticamente. Um cursor explcito declarado explicitamente e nomeado pelo programador. Existem quatro atributos disponvel em PL/SQL que pode ser aplicado a cursores. Nota: Maiores informaes sobre cursores explcitos sero apresentadas em um captulo subseqente.
14
Funes Bsicas
Atributos do cursor SQL permitem avaliar o que ocorreu quando o cursor implcito foi utilizado pela ltima vez. Voc utiliza estes atributos em comando PL/SQL da mesma forma que as funes. Voc no os pode utilizar em comandos SQL. Voc pode utilizar os atributos SQL%ROWCOUNT, SQL%FOUND, SQL%NOTFOUND e SQL%ISOPEN na seo de tratamento de excees de um bloco para obter informaes sobre a execuo de um comando de manipulao de dados. O PL/SQL no considera um comando DML que no afetou nenhuma linha como uma falha, ao contrrio do comando SELECT que retorna uma exceo. Exemplo: Remova as linhas que possuem o nmero de pedido especificado a partir da tabela ITEM. Mostre o nmero de linhas removidas. VARIABLE rows_deleted DECLARE v_ordid NUMBER := 605; BEGIN DELETE FROM item WHERE ordid = v_ordid; rows_deleted := SQL%ROWCOUNT ||' rows deleted.'); END; PRINT rows_deleted
15
Funes Bsicas
Exerccios 18
1. Crie um bloco PL/SQL que seleciona o maior nmero de departamento na tabela DEPT e armazene ele em uma varivel do SQL*Plus. Mostre o resultado na tela. Salve o bloco PL/SQL para um arquivo chamado e18q1.sql. G_MAX_DEPTNO -----------40
2.
Crie um bloco PL/SQL que insira um novo departamento na tabela DEPT. Salve o bloco PL/SQL para um arquivo chamado e18q2.sql. Utilize o nmero de departamento recuperado no exerccio 1 e adicione 10 para ele como entrada do nmero do departamento para o novo departamento. Utilize um parmetro para o nome do departamento. Deixe a localizao nula por enquanto. Execute o bloco PL/SQL. Please enter the department number: 50 Please enter the department name: EDUCATION PL/SQL procedure successfully completed.
a. b. c. d.
e.
Mostre o novo departamento que voc criou. DEPTNO DNAME LOC ------ ---------- ----50 EDUCATION
3.
Crie um bloco PL/SQL que atualize a localizao para um departamento existente. Save o bloco PL/SQL para um arquivo chamado e18q3.sql. Utilize um parmetro para o nmero do departamento. Utilize um parmetro para a localizao do departamento. Teste o bloco PL/SQL.
a. b. c.
16
Funes Bsicas
Please enter the department number: 50 Please enter the department location: HOUSTON PL/SQL procedure successfully completed.
17
Funes Bsicas
d.
Mostre o nmero, o nome e a localizao para o departamento atualizado. DEPTNO DNAME LOC ------ --------- --------------50 EDUCATION HOUSTON
4.
Crie um bloco PL/SQL que remova o departamento criado no exerccio 2. Salve o bloco PL/SQL para um arquivo chamado e18q4.sql. Utilize um parmetro para o nmero do departamento. Mostre na tela o nmero de linhas afetadas. Teste o bloco PL/SQL. Please enter the department number: 50 PL/SQL procedure successfully completed. G_RESULT -----------------------------------------------1 row(s) deleted.
a. b. c.
d.
O que acontece se voc fornecer um nmero de departamento que no existe? Please enter the department number: 99 PL/SQL procedure successfully completed. G_RESULT -----------------------------------------------0 row(s) deleted.
e.
18
no rows selected
Funes Bsicas
Objetivos
Identificar a utilizao e os tipos de estruturas de controle Construir um comando IF Construir e identificar diferentes comandos de loop Utilizar tabelas lgicas Controlar o fluxo de um bloco utilizando loops aninhados e labels
Funes Bsicas
Funes Bsicas
Comandos IF
IF condition THEN statements; [ELSIF condition THEN statements;] [ELSE statements;] END IF;
A estrutura do comando IF do PL/SQL semelhante estrutura dos comandos IF de outras linguagens procedurais. Ele permite ao PL/SQL executar aes seletivamente baseado em condies. Sintaxe: condition uma varivel ou expresso boleana (TRUE, FALSE ou NULL). Ela associada com uma seqncia de comandos, que so executados somente se a expresso retornar TRUE. uma clusula que associa a expresso boleana que a precede com a seqncia de comandos que a seguem. podem ser um ou mais comandos PL/SQL ou SQL. Eles podem conter outros comandos IF formando vrios IFs, ELSEs e ELSIFs aninhados. uma palavra chave que introduz uma expresso boleana. Se a primeira condio retornar FALSE ou NULL ento a palavra chave ELSIF fornece condies adicionais. uma palavra chave que determina que a seqncia de comandos que a segue deve ser executada caso todas as condies anteriores retornem FALSE ou NULL.
THEN statments
ELSIF
ELSE
Funes Bsicas
Comandos IF Simples
Exemplo: Atribua o cargo para SALESMAN, o nmero do departamento para 35 e a comisso para 20% do salrio atual se o nome do empregado for MILLER. . . . IF v_ename = 'MILLER' THEN v_job := 'SALESMAN'; v_deptno := 35; v_new_comm := sal * 0.20; END IF; . . .
No exemplo acima, o PL/SQL executa duas aes (atribuindo as variveis v_job, v_deptno e v_new_comm) somente se condio for TRUE. Se a condio for FALSE ou NULL, o PL/SQL as ignora. Em qualquer caso, o controle retoma ao prximo comando no programa aps o END IF.
Diretrizes
Voc pode executar aes seletivamente baseado em condies conhecidas. Quando escrever o cdigo, lembre-se da ortografia das palavras chaves: ELSIF uma nica palavra. END IF so duas palavras. Se a condio boleana de controle for TRUE, a seqncia de comandos associada executada; se a condio boleana de controle for FALSE ou NULL, a seqncia de comandos associada ignorada. Qualquer nmero de clusulas ELSIF permitido. Pode haver no mximo uma clusula ELSE. Idente os comandos executados condicionalmente para maior clareza do cdigo.
Funes Bsicas
Se a condio for FALSE ou NULL, voc pode utilizar a clusula ELSE para executar outras aes. Da mesma forma que o comando IF simples, o controle retoma no programa aps o END IF. IF condition1 THEN statement1; ELSE statement2; END IF;
Comandos IF Aninhados
Qualquer conjunto de aes do resultado do primeiro comando IF pode incluir outros comandos IF antes das aes especificadas serem executadas. As clusula THEN e ELSE podem incluir comandos IF. Cada comando IF aninhado deve ser terminado com um END IF correspondente. IF condition1 THEN statement1; ELSE IF condition2 THEN statement2; END IF; END IF;
Funes Bsicas
Comandos IF-THEN-ELSE
Exemplos: Atribua um flag para pedidos onde exista menos de 5 dias entre a data do pedido e a data de expedio. ... IF v_shipdate v_orderdate < 5 THEN v_ship_flag := Acceptable; ELSE v_ship_flag := Unacceptable; END IF; ...
Atribua o cargo para MANAGER se o nome do empregado for KING. Se o nome do empregado diferente de KING atribua o cargo para CLERK. IF v_ename = 'KING' THEN v_job := 'MANAGER'; ELSE v_job := 'CLERK'; END IF;
Funes Bsicas
Na tela de entrada de uma aplicao Oracle Forms, fornea o nmero do departamento do novo empregado para determinar sua gratificao. ... IF :dept.deptno = 10 THEN v_comm := 5000; ELSIF :dept.deptno = 20 THEN v_comm := 7500; ELSE v_comm := 2000; END IF; ...
No exemplo, a varivel v_comm utilizada para popular um campo da tela com o valor da gratificao do empregado e :dept.deptno representa o valor fornecido no campo da tela.
Funes Bsicas
Comandos IF-THEN-ELSIF
Exemplo: Para um determinado valor fornecido, retorne um valor calculado. . . . IF v_start > 100 THEN v_start := 2 * v_start; ELSIF v_start >= 50 THEN v_start := .5 * v_start; ELSE v_start := .1 * v_start; END IF; . . .
Quando possvel, utilize a clusula ELSIF ao invs de aninhar comandos IF. O cdigo fica mais fcil de ler e entender, e a lgica identificada claramente. Se a ao na clusula ELSE consiste puramente em outro comando IF, mais conveniente utilizar a clusula ELSIF. Isto torna o cdigo mais claro eliminando a necessidade de END IFs aninhados ao trmino de cada conjunto adicional de condies e aes. IF condition1 THEN statement1; ELSIF condition2 THEN statement2; ELSIF condition3 THEN statement3; END IF;
Funes Bsicas
v_sal * 1.1
As expresses acima retornam NULL se v_sal for nulo em qualquer um dos exemplos. No prximo exemplo a expresso no retorna NULL mesmo se a varivel v_string for nula. 'PL'||v_string||'SQL'
10
Funes Bsicas
Tabelas de Lgica
11
Funes Bsicas
Condies Boleanas
Qual o valor de V_FLAG em cada caso? v_flag := v_reorder_flag AND v_available_flag;
A tabela lgica AND pode auxiliar voc a avaliar as possibilidades para as condies boleanas apresentadas.
12
Funes Bsicas
Nota: Outro tipo de FOR LOOP, o cursor FOR LOOP ser discutido em um captulo subseqente.
13
Funes Bsicas
Loop Bsico
Sintaxe: LOOP statement1; . . . EXIT [WHEN condition]; END LOOP; -----delimitador comandos comandos comando EXIT delimitador
Onde: condition uma varivel ou expresso boleana (TRUE, FALSE ou NULL) A forma mais simples dos comandos de loop o loop bsico (ou infinito), que possui uma seqncia de comandos entre as palavras chaves LOOP e END LOOP. Cada vez que o fluxo de execuo atinge o comando END LOOP, o controle retornado para o comando LOOP correspondente. Um loop bsico executa pelo menos uma vez seus comandos, at mesmo se a condio j for conhecida ao entrar no loop. Sem o comando EXIT, o loop torna-se infinito.
Comando EXIT
Voc pode encerrar um loop utilizando o comando EXIT. O controle passa para o prximo comando aps o comando END LOOP. Voc pode executar um EXIT como uma ao dentro de um comando IF, ou como um comando independente dentro do loop. O comando EXIT deve ser colocado dentro do loop. No caso anterior, voc pode adicionar a clusula WHEN para permitir o encerramento condicional do loop. Quando o comando EXIT encontrado, a condio da clusula WHEN avaliada. Se a condio retornar TRUE, o loop encerra e o controle passa ao prximo comando aps o loop. Um loop bsico pode conter mltiplos comandos EXIT. Exemplo: DECLARE v_ordid item.ordid%TYPE := 101; v_counter NUMBER(2) := 1; BEGIN LOOP INSERT INTO item (ordid, itemid) VALUES (v_ordid, v_counter); v_counter := v_counter + 1; EXIT WHEN v_counter > 10; END LOOP; END;
O exemplo de loop bsico apresentado acima definido como segue: insira as 10 primeiras linhas de itens para o pedido nmero 101. Nota: Um loop bsico permite a execuo de seus comandos pelo menos uma vez, mesmo se a condio for conhecida ao entrar no loop.
On Targget Treinamento e Consultoria 14
Funes Bsicas
FOR Loop
Sintaxe: FOR counter in [REVERSE] lower_bound..upper_bound LOOP statement1; statement2; . . . END LOOP;
FOR loops possuem a mesma estrutura geral que o loop bsico. Em adio, eles possuem uma declarao de controle antes da palavra chave LOOP para determinar o nmero de repeties que o PL/SQL deve executar. Sintaxe: counter um inteiro implicitamente declarado cujo valor automaticamente incrementado ou reduzido (diminui se a palavra chave REVERSE for utilizada) por 1 em cada repetio do loop at que o limite superior ou inferior atingido. causa a reduo do ndice para cada repetio a partir do limite superior at o limite inferior. Observe que o limite inferior ainda referenciado por primeiro. especifica o limite inferior para a faixa de valores do ndice. especifica o limite superior para a faixa de valores do ndice.
REVERSE
lower_bound upper_bound
No declare o contador (ndice); ele declarado implicitamente como um inteiro. Nota: A seqncia de comandos executada cada vez que o contador incrementado, como determinado pelos dois limites. Os limites inferior e superior do loop podem ser literais, variveis ou expresses, mas devem retornar inteiros. Se o limite inferior retornar um inteiro maior que o limite superior, a seqncia de comandos no ser executada. No exemplo abaixo, statement1 executado apenas uma vez.
15
Funes Bsicas
Nota: Os limites inferior e superior de um comando LOOP no necessitam ser literais numricas. Eles podem ser expresses que retornem valores numricos. Exemplo: DECLARE v_lower NUMBER := 1; v_upper NUMBER := 100; BEGIN FOR i IN v_lower..v_upper LOOP ... END LOOP; END;
Diretrizes
Referencie o contador somente dentro do loop; ele indefinido fora dele. Utilize uma expresso para referenciar o valor existente de um contador. No referencie o contador como o destino de uma atribuio. Exemplo: Insira as 10 primeiras linhas de itens para o pedido nmero 101. DECLARE v_ordid item.ordid%TYPE := 101; BEGIN FOR i IN 1..10 LOOP INSERT INTO item(ordid, itemid) VALUES(v_ordid, i); END LOOP; END;
16
Funes Bsicas
WHILE Loop
WHILE condition LOOP statement1; statement2; . . . END LOOP; A condio avaliada no incio de cada repetio.
Voc pode utilizar o WHILE loop para repetir uma seqncia de comandos at que a condio de controle no seja mais TRUE. A condio avaliada no incio de cada repetio. O loop encerra quando a condio for FALSE. Se a condio for FALSE j no incio do loop, ento nenhuma repetio executada. Sintaxe: condition statement uma varivel ou expresso boleano (TRUE, FALSE ou NULL). pode ser um ou mais comandos PL/SQL ou SQL.
Se as variveis envolvidas nas condies no se modificarem durante a execuo do loop, ento a condio permanece TRUE e o loop no termina. Nota: Se a condio retornar NULL, o loop ignorado e o controle passa para o prximo comando. Exemplo: ACCEPT p_price PROMPT 'Enter the price of the item: ' ACCEPT p_itemtot PROMPT 'Enter the maximum total for purchase of item: ' DECLARE ... v_qty NUMBER(8) := 1; v_running_total NUMBER(7,2) := 0; BEGIN ... WHILE v_running_total < &p_itemtot LOOP ... v_qty := v_qty + 1; v_running_total := v_qty * &p_price; END LOOP; ...
No exemplo acima, a quatidade aumenta com cada repetio do loop at que a quantidade multiplicada pelo preo seja maior que o valor mximo permitido para o item.
17
Funes Bsicas
18
Funes Bsicas
Exerccios 19
1. Execute o script lab19_1.sql para criar a tabela MESSAGES. Escreva um bloco PL/SQL para inserir nmeros na tabela MESSAGES. Insira os nmeros de 1 a 10 excluindo o 6 e 8. b. c. Execute um COMMIT antes do final do bloco.
a.
Selecione os dados da tabela MESSAGES para verificar se o bloco executou corretamente. RESULTS --------1 2 3 4 5 7 9 10
2.
Crie um bloco PL/SQL que calcule a commisso para o empregado especificado baseado no salrio do empregado. Execute o script lab19_2.sql para inserir um novo empregado na tabela EMP. Receba o nmero do empregado como uma varivel de substituio do SQL*Plus. Se o salrio do empregado for menor que $1,000, atribua para a comisso do empregado o valor de 10% do seu salrio. Se o salrio do empregado est entre $1,000 e $1,500, atribua para a comisso do empregado o valor de 15% do seu salrio. Se o salrio do empregado for maior que $1,500, atribua para a comisso do empregado o valor de 20% do seu salrio. Se o salrio do empregado for NULL, atribua para a comisso do empregado para 0. Efetue o commit das modificaes. Teste o bloco PL/SQL para cada um dos seguintes casos e verifique cada atualizao da comisso.
Nmero do Empregado 7369 7934 7499 Salrio 800 1300 1600 Comisso Resultante 80 195 320
19
a. b. c. d. e. f. g. h.
Funes Bsicas
8000
NULL
NULL
ENAME SAL COMM ------ ----- --------DOE 0 ALLEN 1600 320 MILLER 1300 195 SMITH 800 80
Se houver tempo, complete os seguintes exerccios: 3. Modifique o arquivo e16q4.sql para inserir o texto Number is odd ou Numer is even na tabela MESSAGES dependendo se o valor informado mpar ou par. Consulte a tabela MESSAGES para determinar se o bloco PL/SQL executou corretamente. RESULTS --------------Number is even
4. 5.
Adicione uma nova coluna para a tabela EMP para armazenar asteriscos (*). Crie um bloco PL/SQL que armazene na coluna STARS da tabela EMP um asterisco para cada $100 do salrio do empregado. Arredonde o salrio para o nmero inteiro mais prximo. Salve o bloco PL/SQL para um arquivo chamado e19q5.sql. Receba o nmero do empregado como uma varivel de substituio do SQL*Plus. Inicialize a varivel que conter a string de asteriscos. Concatene um asterisco para a string para cada $100 do valor do salrio. Por exemplo, se o empregado possui um salrio de $800, a string deve possuir oito asteriscos. Atualize a coluna STARS para o empregado com a string de asteriscos. Efetue o commit das modificaes. Teste o bloco para empregados que no possuem salrio e para empregados que possuem um salrio.
a. b. c. d. e. f.
20
employee number: 7934 successfully completed. employee number: 8000 successfully completed.
Funes Bsicas
Objetivos
Criar PL/SQL records definidos pelo usurio Criar um PL/SQL record com o atributo %ROWTYPE Criar uma PL/SQL table de registros Descrever a diferena entre PL/SQL records, tables e tables of records
Funes Bsicas
Funes Bsicas
PL/SQL Records
Um registro um grupo de itens de dados relacionados armazenados em campos, cada um com seu prprio nome e tipo de dado. Por exemplo, suponha voc possui tipos de dados diferentes sobre um empregado como nome, salrio, data de admisso e assim por diante. Este dados so diferentes em tipo mas logicamente relacionados. Um registro que contm tais campos como o nome, salrio e data de admisso de um empregado permite tratar os dados como uma unidade lgica. Quando voc declara um tipo RECORD para estes campos, eles podem ser manipulados como uma unidade. Cada registro definido pode possuir tantos campos quanto necessrio. Podem ser atribudos valores iniciais e podem ser definidos como NOT NULL. Campos sem valores iniciais so inicializados com NULL. A palavra chave DEFAULT tambm podem ser utilizada quando definindo campos. Voc pode definir tipos RECORD e declarar registros definidos pelo usurio na parte declarativa de qualquer bloco, subprograma ou package. Voc pode declarar e referncia registros aninhados. Um registro pode ser o componente de outro registro.
Funes Bsicas
Onde field_delaration significa: field_name {field_type | variable%TYPE | table.column%TYPE | table%ROWTYPE} [[NOT NULL] {:= | DEFAULT} expr]
o nome do tipo RECORD. Este identificador utilizado para declarar os registros. o nome de um campo dentro do registro. o tipo de dado do campo. Representa qualquer tipo de dado PL/SQL exceto REF CURSOR. Voc pode utilizar o atributo %TYPE e %ROWTYPE. o um valor inicial.
expr
A constraint NOT NULL previne a atribuio de nulos para estes campos. Voc deve inicializar campos NOT NULL. Exemplo: Declare variveis para armazenar o nome, o cargo e o salrio de um novo empregado. ... TYPE emp_record_type IS RECORD (ename VARCHAR2(10), job VARCHAR2(9), sal NUMBER(7,2)); emp_record ... emp_record_type;
Declaraes de campos so como declaraes de variveis. Cada campo possui um nome nico e um tipo de dado especfico. No existem tipos de dados pr-definidos para PL/SQL records, como para variveis escalares. Portanto, voc deve criar primeiro o tipo de dado e ento declarar um identificador que utilize este tipo de dado.
On Targget Treinamento e Consultoria 5
Funes Bsicas
O exemplo a seguir mostra que voc pode utilizar o atributo %TYPE para especificar o tipo de dado de um campo: DECLARE TYPE emp_record_type IS RECORD (empno NUMBER(4) NOT NULL := 100, ename emp.ename%TYPE, job emp.job%TYPE); emp_record ... emp_record_type;
Nota: Voc pode adicionar a constraint NOT NULL para qualquer declarao de campo e assim prevenir a atribuio de nulos para este campo. Lembre-se que devem ser inicializados os campos declarados como NOT NULL.
Funes Bsicas
Por exemplo, voc referncia o campo job do registro emp_record como segue: emp_record.job ...
Voc pode atribuir um valor para um campo do registro como segue: emp_record.job := 'CLERK';
Em uma bloco ou subprograma, registros definidos pelo usurio so inicializados quando voc acessa o bloco ou subprograma e deixam de existir quando voc encerra o bloco ou subprograma.
Funes Bsicas
Atributo %ROWTYPE
Para declarar um registro baseado em uma coleo de colunas de uma tabela ou viso do bancco de dados, voc utiliza o atributo %ROWTYPE. Os campos no registros possuem seus nomes e tipos de dados baseados nas colunas da tabela ou viso. O registro pode tambm armazenar um linha inteira de dados recuperada a partir de um cursor ou varivel de cursor. No exemplo abaixo um registro declarado utilizando %ROWTYPE como especificador do tipo de dado. DECLARE emp_record
emp%ROWTYPE;
O registro emp_record consite dos seguintes campos, que refletem todos os campos existentes na tabela EMP. (ename job sal comm VARCHAR2(10), VARCHAR2(9), NUMBER, NUMBER)
Declare uma varivel para armazenar a mesma informao de um empregado como ela armazenada na tabela EMP. emp_record emp%ROWTYPE;
A primeira declarao cria um registro com os mesmos nomes de campos e tipos de dados que uma linha da tabela DEPT. Os campos so DEPTNO, DNAME e LOC.
On Targget Treinamento e Consultoria 8
Funes Bsicas
A segunda declarao acima cria um registro com os mesmos nomes de campos e tipos de dados que uma linha da tabela EMP. Os campos so EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM e DEPTNO. No exemplo seguinte, voc seleciona valores de colunas para um registro chamado item_record. DECLARE item_record item%ROWTYPE; ... BEGIN SELECT * INTO item_record FROM item WHERE ...
Funes Bsicas
PL/SQL Tables
Objetos do tipo TABLE so chamados PL/SQL tables. Eles so modelados como tabelas do banco de dados. PL/SQL tables utilizam uma chave primria para fornecer um vetor de acesso as linhas. Uma PL/SQL table: semelhante a um array Deve conter dois componentes: Uma chave primria do tipo de dado BINARY_INTEGER que indexa a PL/SQL table. Uma coluna do tipo de dado escalar ou record, que armazena os elementos da PL/SQL table. Podem crescer dinamicamente.
10
Funes Bsicas
Exemplo: Declare uma varivel PL/SQL para armazenar um nome. ... TYPE ename_table_type IS TABLE OF emp.ename%TYPE INDEX BY BINARY_INTEGER; ename_table ename_table_type; ...
Existem duas etapas envolvidas na criao de uma PL/SQL table. 1. 2. Sintaxe: type_name o nome do tipo de dado da tabela (TABLE type). Ele um especificador de tipo utilizado em declaraes subseqentes de PL/SQL tables. qualquer tipo de dado escalar (no composto) como VARCHAR2, DATE ou NUMBER. Voc pode utilizar o atributo %TYPE para prover o tipo de dado de uma coluna. o nome do identificador que representa uma PL/SQL table. Declare o tipo de dado da tabela PL/SQL (TABLE type). Declare uma varivel com este tipo de dado.
column_type
identifier
A constraint NOT NULL previne que nulos sejam atribudos para a PL/SQL table definida com aquele tipo. No inicialize a PL/SQL table. Declare uma varivel PL/SQL para armazenar datas.
11
Funes Bsicas
12
Funes Bsicas
Da mesma forma que o tamanho de uma tabela do banco de dados, o tamanho de uma PL/SQL table indefinido. Ou seja, o nmero de linhas em uma PL/SQL table pode crescer dinamicamente, medida que novas linhas forem adicionadas. PL/SQL tables devem possuir uma coluna e uma chave primria, nenhuma das quais pode ser nomeada. A coluna pode ser de um tipo de dado escalar ou record, mas a chave primria deve ser do tipo BINARY_INTEGER. Voc no pode inicializar uma PL/SQL table na sua declarao.
13
Funes Bsicas
Referencie a terceira linha de uma PL/SQL table chamada ename_table. ename_table(3) ...
A faixa de valores de um BINARY_INTEGER -2147483647...2147483647, de modo que o valor da chave primrio pode ser negativo. O indexador no necessita iniciar em 1. Nota: O comando table.EXISTS(i) retorna TRUE se pelo menos uma linha com o ndice i for retornada. Utilize o comando EXITS para prevenir um erro que ocorre na referncia para um elemento no existente da tabela.
14
Funes Bsicas
Uma vez que somente uma definio de tabela necessria para armazenar informaes sobre todos os campos de uma tabela do banco de dados, uma tabela com registros aumenta a funcionalidade das PL/SQL tables.
LOC representa um campo da tabela DEPT. Nota: Voc pode utilizar o atributo %ROWTYPE para declarar um registro que represente uma linha da tabela do banco de dados.
15
Funes Bsicas
TRIM DELETE
Descrio Retorna TRUE se o elemento n existe um uma PL/SQL table. Retorna o nmero de elementos que uma PL/SQL table possui. Retorna o primeiro e ltimo (menor e maior) nmeros do ndice em uma PL.SQL table. Retorna NULL se a PL/SQL table est vazia. Retorna o nmero do ndice anterior a n. Retorna o nmero do ndice posterior a n. Para aumentar o tamanho de uma PL/SQL table. EXTEND adiciona um elemento nulo. EXTEND(n) adiciona n elementos nulos. EXTEND(n, i) adiciona n cpias do elemento i. TRIM remove um elemento do final da PL/SQL table. TRIM(n) remove n elementos do final da PL/SQL table. DELETE remove todos os elementos de uma PL/SQL table. DELETE(n) remove o elemento n da PL/SQL table. DELETE(m, n) remove todos os elementos na faixa m...n da PL/SQL table.
16
Funes Bsicas
Exerccios 20
1. Execute o comando abaixo para criar uma nova tabela para armazenar os empregados e seus salrios. SQL> CREATE TABLE top_dogs 2 (name VARCHAR2(25), 3 salary NUMBER(11,2));
2.
Escreva um bloco PL/SQL para recuperar o nome e o salrio do empregado fornecido a partir da tabela EMP baseado no nmero do empregado, utilizando PL/SQL tables. Declare duas PL/SQL tables, ENAME_TABLE temporariamente armazenar os nomes e salrios. e SAL_TABLE, para
a. b. c. d.
Como cada nome e salrio recuperado dentro do loop, armazene eles nas PL/SQL tables. Fora do loop, transfira os nomes e salrios das PL/SQL tables para a tabela TOP_DOGS. Remova as linhas da tabela TOP_DOGS e teste o exerccio.
17
Please enter the employee number: 7934 PL/SQL procedure successfully completed. NAME SALARY --------------- --------MILLER 1300 Please enter the employee number: 7876 PL/SQL procedure successfully completed. NAME SALARY --------------- --------ADAMS 1100
Funes Bsicas
Objetivos
Diferenciar cursores implcitos e explcitos Utilizar uma varivel PL/SQL record Escrever estruturas Cursor FOR loop
Funes Bsicas
Cursores
O Servidor Oracle utiliza reas de trabalho chamadas private SQL areas para executar comandos SQL e para armazenar informaes de processamento. Voc pode utilizar cursores PL/SQL para nomear uma dessas reas e acessar suas informaes armazenadas. O cursor direciona todas as fases de processamento.
Tipo de Cursor Implcito Explcito Descrio Cursores implcitos so declarados pelo PL/SQL implicitamente para todos os comandos DML e PL/SQL SELECT, incluindo consultas que retornam somente uma linha. Para consultas que retornam mais de uma linha, um cursor explcito pode ser declarado e nomeado pelo programador e manipulado atravs de comandos especficos no bloco PL/SQL.
O Servidor Oracle implicitamente abre um cursor para processar cada comando SQL no associado com um cursor declarado explicitamente. O PL/SQL permite referenciar o cursor implcito mais recente como o cursor chamado SQL. Voc no pode utilizar os comandos OPEN, FETCH e CLOSE para controle o cursor SQL, mas voc pode utilizar atributos de cursor para obter informaes sobre o comando SQL mais recentemente executado.
Funes Bsicas
Cursores Explcitos
Utilize cursores explcitos para individualmente processar cada linha retornada por um comando SELECT multi-row. O conjunto de linhas retornadas por uma consulta multi-row denominado result set. Seu tamanho o nmero de linhas que satisfazem o critrio de pesquisa. O diagrama acima apresenta como um cursor explcito aponta para a linha corrente no result set. Isto permite ao programa processar as linhas uma de cada vez. Um programa PL/SQL abre um cursor, processa as linhas retornadas pela consulta e ento fecha o cursor. O cursor marca a posio corrente no result set.
Funes Bsicas
Agora que voc possui um entendimento conceitual de cursores, revise os passos para utilizlos. A sintaxe para cada passo pode ser encontrada nas prximas pginas.
3.
4.
Funes Bsicas
Voc utiliza os comandos OPEN, FETCH e CLOSE para controlar um cursor. O comando OPEN executa a consulta associada com o cursor, identifica o result set e posiciona o cursor (ponteiro) antes da primeira linha. O comando FETCH recupera a linha corrente e avana o cursor para a prxima linha. Quando a ltima linha foi processada, o comando CLOSE fecha o cursor.
Funes Bsicas
Declarando o Cursor
CURSOR cursor_name IS select_statement;
Utilize o comando CURSOR para declarar um cursor explcito. Voc pode referenciar variveis dentro da consulta, mas voc deve declar-las antes do comando CURSOR. Sintaxe: cursor_name um identificador PL/SQL. select_statement um comando SELECT sem a clusula INTO. Nota: No inclua a clusula INTO na declarao do cursor porque ela deve ser utilizada depois, no comando FETCH. Exemplos: DECLARE CURSOR c1 IS SELECT empno, ename FROM emp; CURSOR c2 IS SELECT * FROM dept WHERE deptno = 10; BEGIN ...
emp.empno%TYPE; emp.ename%TYPE;
Nota: Voc pode referenciar variveis na consulta, mas voc deve declar-las antes do comando CURSOR.
Funes Bsicas
Abrindo um Cursor
OPEN cursor_name;
Abra o cursor para executar a consulta e identificar o result set, que consiste de todas as linhas que satisfaam o critrio de pesquisa da consulta. O cursor neste momento aponta para a primeira linha no result set. Sintaxe: cursor_name o nome do cursor previamente declarado. OPEN um comando executvel que efetua as seguintes operaes: 1. Dinamicamente aloca memria para uma context area que eventualmente contm informaes importantes de processamento. 2. Executa o parse do comando SELECT. 3. Recebe as variveis de entrada, ou seja, atribui o valor para as variveis de entrada obtendo seus endereos de memria. 4. Identifica o result set, ou seja, o conjunto de linhas que satisfaa o critrio de pesquisa. Linhas do result set no so recuperadas para variveis quando o comando OPEN executado. O comando FETCH quem recupera as linhas. 5. Posiciona o ponteiro antes da primeira linha no active set. Nota: Se a consulta no retornar nenhuma linha quando o cursor for aberto, o PL/SQL no dispara nenhuma exceo. Porm, voc pode testar o status do cursor aps um fetch. Para cursores declarados utilizando a clusula FOR UPDATE, o comando OPEN tambm efetua o lock das linhas.
Funes Bsicas
O comando FETCH recupera as linhas do result set uma de cada vez. Aps cada fetch, o cursor avana para a prxima linha no result set. Sintaxe: cursor_name variable record_name o nome do cursor previamente declarado. uma varivel para armazenar os resultados. o nome do registro no qual os dados recuperados so armazenados. A varivel tipo record pode ser declarada utilizando o atributo %ROWTYPE.
Diretrizes
Inclua o mesmo nmero de variveis na clusula INTO do comando FETCH que as colunas do comando SELECT, e garanta que os tipos de dados sejam compatveis. Garanta que cada varivel corresponda a uma coluna. Alternativamente, defina um registro para o cursor e referencie o registro na clusula FETCH INTO. Teste para ver se o cursor possui linhas. Se um fetch no receber valores, no resta nenhuma linha para processar no active set e nenhum erro retornado. Nota: O comando FETCH executa as seguintes operaes: 1. 2. 5. Avana o ponteiro para a prxima linha no active set. L os dados da linha corrente para variveis PL/SQL. Encerra o Cursor FOR Loop se o ponteiro estiver posicionado no final do active set.
Voc utiliza o comando FETCH para recuperar os valores da linha corrente para variveis. ... OPEN defined_cursor; LOOP FETCH defined_cursor INTO defined_variables EXIT WHEN ...; ... -- Processa os dados recuperados ... On Targget Treinamento e Consultoria 9 END;
Funes Bsicas
Recupere os primeiros dez empregados um por um. DECLARE v_empno emp.empno%TYPE; v_ename emp.ename%TYPE; i NUMBER := 1; CURSOR c1 IS SELECT empno, ename FROM emp; BEGIN OPEN c1; FOR i IN 1..10 LOOP FETCH c1 INTO v_empno, v_ename; ... END LOOP; END ;
10
Funes Bsicas
Fechando um Cursor
CLOSE cursor_name;
O comando CLOSE desabilita o cursor e o result set torna-se indefinido. Feche o cursor aps completar o processamento do comando SELECT. Este passo permite que o cursor seja reaberto, se neccessrio. Portanto, voc pode estabelecer um active set vrias vezes. Sintaxe: cursor_name o nome do cursor previamente declarado. No tente recuperar dados de um cursor uma vez que ele esteja fechado, ou a exceo INVALID_CURSOR ser disparada. Nota: O comando CLOSE libera a context area. Embora seja possvel encerrar o bloco PL/SQL sem fechar os cursores, voc deve adquirir o hbito de fechar qualquer cursor que tenha declarado explicitamente para liberar os recursos utilizados. Existe um limite mximo para o nmero de cursores abertos por usurio, que determinado pelo parmetro OPEN_CURSORS do banco de dados. Por default, OPEN_CURSORS igual a 50. Exemplo: ... FOR i IN 1..10 LOOP FETCH c1 INTO v_empno, v_ename; ... END LOOP; CLOSE c1; END;
11
Funes Bsicas
Como com cursores implcitos, existem quatro atributos para obter informaes de status sobre um cursor. Quando adicionado para o cursor ou varivel de cursor, estes atributos retornam informaes teis sobre a execuo de um comando de manipulao de dados. Nota: Voc no pode referenciar atributos de cursor diretamente em um comando SQL.
12
Funes Bsicas
13
Funes Bsicas
Atributo %ISOPEN
IF NOT c1%ISOPEN THEN OPEN c1; END IF; LOOP FETCH c1...
Voc pode recuperar linhas somente quando o cursor estiver aberto. Utilize o atributo de cursor %ISOPEN para determinar quando o cursor est aberto, se necessrio. Recupe linhas em um loop. Utilize os atributos de cursor para determinar quando sair do loop. Utilize o atributo de cursor %ROWCOUNT para recuperar um nmero exato de linhas. Nota: %ISOPEN retorna o status do cursor; TRUE se aberto e FALSE caso contrrio. Normalmente no necessrio utilizar %ISOPEN.
14
Funes Bsicas
emp.empno%TYPE; emp.ename%TYPE;
CURSOR c1 IS SELECT empno, ename FROM emp; BEGIN OPEN c1; LOOP FETCH c1 INTO v_empno, v_ename; EXIT WHEN c1%ROWCOUNT > 10 OR c1%NOTFOUND; ... END LOOP; CLOSE c1; END;
Nota: Antes do primeiro fetch, %NOTFOUND retorna NULL. Assim se um FETCH nunca executar com sucesso, o loop nunca ser encerrado. Isto porque o comando EXIT WHEN executa somente se sua condio WHEN retornar TRUE. Por garantia, voc deve utilizar o seguinte comando EXIT: EXIT WHEN c1%NOTFOUND OR c1%NOTFOUND IS NULL;
15
Funes Bsicas
Cursores e Registros
... CURSOR c1 IS SELECT empno, ename FROM emp; emp_record c1%ROWTYPE; BEGIN OPEN c1; . . . FETCH c1 INTO emp_record;
Alm de utilizar registros para definir uma estrutura com as colunas de uma tabela, voc tambm pode definir um registro baseado na lista de colunas selecionadas em um cursor explcito. Isto conveniente para o processamento das linhas do active set, porque pode simplificar o fetch para um registro. Portanto, os valores da linha so carregados diretamente para campos correspondentes do registro.
16
Funes Bsicas
Um Cursor FOR Loop um mtodo conveniente para processar as linhas em um cursor explcito. O cursor aberto, as linhas so recuperadas uma para cada repetio do loop, e o cursor fechado automaticamente quando todas as linhas foram processadas. O loop terminado automaticamente no final da repetio onde a ltima linha foi recuperada. Sintaxe: record_name cursor_name o nome do registro implicitamente declarado. um identificador PL/SQL para o cursor previamente declarado.
Diretrizes
No declare o registro que controla o loop. Seu escopo somente no loop. Teste os atributos de cursor durante o loop, se necessrio. Fornea parmetros para um cursor, se necessrio, entre parnteses seguinte o nome do cursor em um comando FOR. Maiores informaes sobre parmetros de cursor sero vistos em um captulo subseqente. No utilize um Cursor FOR Loop quando as operaes do cursor devam ser tratadas manualmente. Nota: Voc pode definir uma consulta no incio do prprio loop. A expresso da consulta chamada de subcomando SELECT, e o cursor fica interno ao FOR loop. Porque o cursor no foi declarado com um nome, voc no pode testar seus atributos. Exemplo: Recupere os empregados um por um at no restar mais nenhum.
17
Funes Bsicas
DECLARE CURSOR c1 IS SELECT empno, ename FROM emp; BEGIN FOR emp_record IN c1 LOOP -- open implcito e fetch implcito ocorrem IF emp_record.empno = 7839 THEN ... END LOOP; -- close implcito ocorre END;
18
Funes Bsicas
19
Funes Bsicas
Exerccios 21
1. a. Crie um bloco PL/SQL que determine os empregados com os maiores salrios. Receba um nmero n atravs de um parmetro de substituio do SQL*Plus. b. c. d. e. Em um loop, obtenha os nomes e salrios dos n empregados com os maiores salrios da tabela EMP. Armazena os nomes e salrios na tabela TOP_DOGS. Assuma que dois empregados no possuem o mesmo salrio. Teste uma variedade de casos especiais, como n = 0 ou n maior que o nmero de empregados da tabela EMP. Remova as linhas da tabela TOP_DOGS aps cada teste.
Please enter the number of top money makers: 5 NAME SALARY ----------- -----KING 5000 FORD 3000 SCOTT 3000 JONES 2975 BLAKE 2850
2.
Considere o caso onde vrios empregados possuem o mesmo salrio. Se uma pessoa listada, ento todas as pessoas que possuem o mesmo salrio devem tambm ser listadas. Por exemplo, se o usurio fornecer o valor 2 para n, ento KING, FORD e SCOTT devem ser exibidos. b. c. Se o usurio fornecer o valor 3, ento KING, FORD, SCOTT e JONES devem ser exibidos. Remova todas as linhas da tabela TOP_DOGS e teste o exerccio.
a.
Please enter the number of top money makers: 2 NAME SALARY ------------ -----KING 5000 FORD 3000 SCOTT 3000
20
Please enter the number of top money makers: 3 NAME SALARY ------------ -----KING 5000 FORD 3000 SCOTT 3000 JONES 2975
Funes Bsicas
Objetivos
Escrever um cursor que utilize parmetros Determinar quando uma clusula FOR UPDATE em um cursor necessria Determinar quando utilizar a clusula WHERE CURRENT OF Escrever um cursor que utilize uma subconsulta
Funes Bsicas
Parmetros permitem que valores sejam passados para um cursor quando ele for aberto para serem utilizados na subconsulta quando ela executar. Isto significa que voc pode abrir e fechar um cursor explcito vrias vezes em um bloco, retornando um active set diferente em cada ocasio. Cada parmetro na declarao do cursor deve possuir um parmetro atual correspondente no comando OPEN. Tipos de dados de parmetros so os mesmo que para variveis escalares, mas voc no deve fornecer o tamanho. Os nomes dos parmetros servem para referncia na consulta do cursor. Sintaxe: cursor_name um identificador PL/SQL para o nome do cursor. parameter_name o nome de um parmetro Parmetros devem atender seguinte sintaxe: cursor_parameter_name [IN] datatype [{:= | DEFAULT} expr]
datatype
select_statement um comando SELECT sem a clusula INTO. Quando o cusor for aberto, voc deve passar valores para cada um dos parmetros posicionalmente. Voc pode passar valores a partir de variveis PL/SQL ou host como tambm literais. Nota: A notao de parmetro no oferece grande funcionalidade; ele simplesmente permite a voc especificar valoes de entrada e forma fcil e clara. Isto particularmente til quando o mesmo cursor referenciado repetidamente. Exemplo: Passe o nmero do departamento e o cargo para a clusula WHERE.
Funes Bsicas
DECLARE CURSOR c1 (v_deptno NUMBER, v_job VARCHAR2) IS SELECT empno, ename FROM emp WHERE deptno = v_deptno AND job = v_job; BEGIN OPEN c1(10, 'CLERK'); ...
No exemplo seguinte, duas variveis e um cursor so declaradas. O cursor definido com dois parmetros: DECLARE job_emp emp.job%TYPE := 'CLERK'; v_ename emp.ename%TYPE; CURSOR c1 (v_deptno NUMBER, v_job VARCHAR2) is SELECT ...
Cada um dos seguintes comandos abre o cursor. OPEN c1(10, job_emp); OPEN c1(20, 'ANALYST');
Voc pode passar parmetros para um cursor utilizado em um Cursor FOR Loop: DECLARE CURSOR c1 (v_deptno NUMBER, v_job VARCHAR2) is SELECT ... BEGIN FOR emp_record IN c1(10, 'ANALYST') LOOP ...
Funes Bsicas
Voc pode querer bloquear as linhas antes de atualiz-las ou remov-las. Adicione a clusula FOR UPDATE na consulta do cursor para efetuar o lock nas linhas afetadas quando o cursor for aberto. Uma vez que o Servidor Oracle libera os locks no final da transao, voc no deve executar um commit entre os fetch de um cursor explcito quando FOR UPDATE for utilizado. Sintaxe: column_reference uma coluna de uma tabela onde a consulta executada. Uma lista de colunas tambm pode ser utilizada. NOWAIT retorna um erro do Oracle caso as linhas j estejam bloqueadas por outra sesso.
A clusula FOR UPDATE deve ser a ltima clusula de um comando SELECT, mesmo se um ORDER BY existir. Quando consultar mltiplas tabelas, voc pode utilizar a clusula FOR UPDATE para mantendo o lock de linha apenas para uma tabela especfica. Linhas em uma tabela so bloqueadas somente se a clusula FOR UPDATE referenciar uma coluna desta tabela. Exemplo: DECLARE CURSOR c1 IS SELECT empno, ename FROM emp FOR UPDATE NOWAIT;
Nota: Caso o Servidor Oracle no obtenha os locks nas linhas necessrias em um SELECT FOR UPDATE, ele aguarda indefinidamente. Voc pode utilizar a clusula NOWAIT no comando SELECT FOR UPDATE e testar pelo cdigo de erro que retorna caso ocorra uma falha na obteno dos locks em um loop. Portanto, voc pode tentar abrir o cursor n vezes antes de encerrar o bloco PL/SQL. Caso voc possua uma tabela muito grande, voc pode obter uma melhor performance utilizando o comando LOCK TABLE para bloquear todas as linhas da tabela. Entretanto, quando utilizar LOCK TABLE, voc no pode utilizar a clusula WHERE CURRENT OF e deve utilizar a notao WHERE column = identifier.
Funes Bsicas
Quando voc quiser referenciar a linha atual de um cursor explcito, utilize a clusula WHERE CURRENT OF. Isto permite a voc aplicar atualizaes e delees para a linha atualmente endereada pelo cursor, sem a necessidade de explicitamente referenciar o ROWID. Voc deve incluir a clusula FOR UPDATE na consulta do cursor para que as linhas sejam bloqueadas na abertura do cursor. Sintaxe: cursor Exemplo: DECLARE CURSOR c1 IS SELECT ... FOR UPDATE NOWAIT; BEGIN ... FOR emp_record IN c1 LOOP UPDATE ... WHERE CURRENT OF c1; ... END LOOP; COMMIT; END; o nome do cursor declarado. O cursor deve ser declarado com a clusula FOR UPDATE.
Voc pode atualizar linhas baseado no critrio de um cursor. Adicionalmente, voc pode escrever o comando DELETE ou UPDATE contendo a clusula WHERE CURRENT OF cursor_name para referenciar a ltima linha processada pelo comando FETCH. Quanto voc utiliza esta clusula, o cursor referenciado deve existir e deve conter a clusula FOR UPDATE na consulta do cursor, caso contrrio um erro ser retornado.
Funes Bsicas
Uma subconsulta uma consulta que aparece dentro de outro comando SQL. Quando analisada, a subconsulta fornece um valor ou conjunto de valores para o comando. Subconsultas so normalmente utilizadas na clusula WHERE de um comando SELECT. Elas tambm podem ser utilizadas na clusula FROM como no exemplo acima.
Funes Bsicas
Exerccios 22
1. Escreva uma consulta para recuperar todos os departamentos e empregados em cada departamento. Insira o resultado na tabela MESSAGES. Utilize um cursor para recuperar o nmero do departamento e passe o nmero do departamento para um cursor recuperar os empregados deste departamento. RESULTS -----------------------KING - Department 10 CLARK - Department 10 MILLER - Department 10 JONES - Department 20 FORD - Department 20 SMITH - Department 20 SCOTT - Department 20 ADAMS - Department 20 BLAKE - Department 30 MARTIN - Department 30 ALLEN - Department 30 TURNER - Department 30 JAMES - Department 30 WARD - Department 30 14 rows selected.
2.
Modifique o arquivo e19q5.sql para incorporar as funcionalidades de FOR UPDATE e WHERE CURRENT OF no processamento do cursor.
EMPNO SAL STARS ----- ------ --------------------8000 7900 950 ********** 7844 1500 ***************
Funes Bsicas
Objetivos
Definir excees PL/SQL Reconhecer excees no tratadas Utilizar diferentes tipos de tratamento de excees PL/SQL Tratar erros inesperados Descrever o efeito da propagao de excees em blocos aninhados Customizar mensagens de excees PL/SQL
Funes Bsicas
Funes Bsicas
Tratamento de Excees
Funes Bsicas
Tipos de Excees
Existem trs tipos de excees.
Exceo Erro pr-definido do Servidor Oracle Erro no pr-definido do Servidor Oracle Erro definido pelo usurio Descrio Um de aproximadamente 20 erros que ocorrem com maior freqncia no cdigo PL/SQL. Qualquer outro erro padro do Servidor Oracle. Uma condio que o desenvolvedor determina como anormal. Diretrizes para Tratamento No declare a exceo, e permita que o Servidor Oracle a dispare implicitamente. Declare dentro da seo declarativa, e permita que o Servidor Oracle a dispare implicitamente. Declare dentro da seo declarativa, e a dispare explicitamente.
Nota: Algumas ferramentas com suporte PL/SQL, como o Developer/2000 Forms, possuem suas prprias excees.
Funes Bsicas
Tratando Excees
EXCEPTION WHEN exception1 [OR exception2 . . .] THEN statement1; statement2; . . . [WHEN exception3 [OR exception4 . . .] THEN statement1; statement2; . . .] [WHEN OTHERS THEN statement1; statement2; . . .]
Voc pode tratar qualquer erro incluindo uma rotina correspondente dentro da seo de tratamento de excees do bloco PL/SQL. Cada tratamento consiste de uma clusula WHERE, que especifica uma exceo, seguida pela seqncia de comandos a serem executados quando esta exceo for disparada. Sintaxe: exception statment OTHERS o nome padro de uma exceo pr-definida ou o nome de uma exceo definida pelo usurio declarada dentro da seo declarativa. so um ou mais comandos PL/SQL ou SQL. uma clusula de tratamento de exceo opcional que trata excees no especificadas.
Funes Bsicas
Funes Bsicas
Funes Bsicas
Excees Pr-Definidas
BEGIN SELECT ... COMMIT; EXCEPTION WHEN NO_DATA_FOUND THEN statement1; statement2; WHEN TOO_MANY_ROWS THEN statement1; WHEN OTHERS THEN statement1; statement2; statement3; END;
No exemplo acima, para cada exceo, uma mensagem pode ser devolvida para o usurio. Somente uma exceo disparada e tratada cada vez.
Funes Bsicas
...
10
Funes Bsicas
Solues Exerccios 2
1. 2. 3. Inicie uma sesso do SQL*Plus utilizando o usurio e senha fornecidos pelo instrutor. Comandos SQL*Plus acessam o banco de dados. Falso O comando SELECT a seguir executar com sucesso? Verdadeiro SQL> SELECT 2 FROM ename, job, sal Salary emp;
4.
O comando SELECT abaixo executar com sucesso? Verdadeiro SQL> SELECT 2 FROM * salgrade;
5.
Existem trs erros de codificao neste comando. Voc pode os identificar? SQL> SELECT 2 3 FROM empno, ename salary x 12 ANNUAL SALARY emp;
A tabela EMP no possui uma coluna chamada SALARY. A coluna correta SAL. O operador de multiplicao *, e no x, como apresentado na linha 2. O alias ANNUAL SALARY no pode incluir espaos. O alias deveria ser ANNUAL_SALARY ou ser colocado entre aspas duplas. 6. Mostre a estrutura da tabela DEPT. Selecione todos os dados da tabela DEPT.
7.
Mostre a estrutura da tabela EMP. Crie uma consulta para exibir o nome (ename), cargo (job), data de admisso (hiredate) e nmero do empregado (empno) para cada empregado, mostrando o nmero do empregado por primeiro. Salve o comando SQL para um arquivo chamado e2q7.sql.
A-2
Funes Bsicas
SQL> SELECT empno, ename, job, hiredate 2 FROM emp; SQL> SAVE e2q7.sql Wrote file e2q7.sql
8.
9.
Crie uma consulta para exibir cada cargo da tabela EMP uma nica vez. SQL> SELECT 2 FROM DISTINCT job emp;
Se houver tempo, complete os seguintes exerccios: 10. Carregue e2q7.sql no SQL buffer. Altere os cabealhos das colunas para Emp#, Employee, Job e Hire Date, respectivamente. Execute sua consulta novamente. SQL> GET e2q7.sql 1 SELECT empno, ename, job, hiredate 2* FROM emp SQL> 1 SELECT empno "Emp #", ename "Employee", SQL> i 2i job "Job", hiredate "Hire Date" 3i SQL> SAVE e2q7.sql REPLACE Wrote file e2q7.sql SQL> START e2q7.sql
11.
Exiba o nome do empregado concatenado com o cargo, separados por uma vrgula e um espao, e nomeie o cabealho da coluna Employee and Title.
Se voc quiserSELECT ename||', '||job "Employee and SQL> um desafio extra, complete os exerccios seguintes: Title" 2 FROM emp;
A-3
Funes Bsicas
12.
Crie uma consulta para exibir todos os dados da tabela EMP. Separe cada coluna por uma vrgula. Coloque no cabealho da coluna resultante a string THE_OUTPUT. empno || ',' || ename || ','|| job || ',' || mgr || ',' || hiredate || ',' || sal || ',' comm || ',' || deptno THE_OUTPUT emp;
A-4
Funes Bsicas
Solues Exerccios 3
1. Crie uma consulta para exibir o nome e o salrio dos empregados que esto ganhando mais que $2850. Salve o comando SQL para um arquivo chamado e3q1.sql. Execute sua consulta. SQL> SELECT ename, sal 2 FROM emp 3 WHERE sal > 2850; SQL> SAVE e3q1.sql Created file e3q1.sql;
2.
Crie uma consulta para exibir o nome do empregado e o nmero do departamento para o empregado nmero 7566. SQL> SELECT 2 FROM 3 WHERE ename, deptno emp empno = 7566;
3.
Altere a consulta em e3q1.sql para exibir o nome e o salrio para todos os empregados cujo salrio no est na faixa de valores de $1500 $2850. Salve o novo comando para um arquivo chamado e3q3.sql. Execute a consulta. SQL> EDIT e3q1.sql SELECT FROM WHERE / ename, sal emp sal NOT BETWEEN 1500 AND 2850
4.
Mostre o nome do empregado, o cargo e a data de admisso dos empregados contratados entre 20 de Fevereiro de 1981 e 1 de Maio de 1981. Classifique a consulta em ordem ascendente de data de admisso. SELECT FROM WHERE ORDER BY ename, job, hiredate emp hiredate BETWEEN '20-Feb-81' AND '01-May-81' hiredate;
SQL> 2 3 4
5.
Mostre o nome do empregado e o nmero do departamento de todos os empregados que esto no departamento 10 e 30 em ordem alfabtica por nome.
A-5
Funes Bsicas
SQL> 2 3 4
6.
Altere a consulta em e3q3.sql para listar o nome e o salrio dos empregados que ganham mais do que $1500 e esto no departamento 10 ou 30. Coloque o alias para as colunas Employee e Monthly Salary, respectivamente. Salve o novo comando para um arquivo chamado e3q6.sql. Execute a consulta. SQL> EDIT e3q3.sql SELECT FROM WHERE / SQL> START e3q6.sql ename "Employee", sal "Monthly Salary" emp sal > 1500 AND deptno IN (10, 30)
7.
Mostre o nome e a data de admisso de cada empregado que tenha sido contratado em 1982. SQL> SELECT 2 FROM 3 WHERE ename, hiredate emp hiredate LIKE '%82';
8.
Mostre o nome e o cargo de todos os empregados que no possuem gerente. SQL> SELECT 2 FROM 3 WHERE ename, job emp mgr IS NULL;
9.
Mostre o nome, o salrio e a comisso para todos os empregados que ganham comisses. Ordene os dados em ordem descendente de salrio e comisso.
A-6
Funes Bsicas
SQL> 2 3 4
ename, sal, comm emp comm IS NOT NULL sal DESC, comm DESC;
Se houver tempo, complete os seguintes exerccios: 10. Mostre o nome de todos os empregados quando a terceira letra de seu nome for um A. SQL> SELECT 2 FROM 3 WHERE ename emp ename LIKE '__A%';
11.
Mostre o nome de todos os empregados que possuem duas letras L em seu nome e esto no departamento 30 ou seu gerente o empregado 7782. SQL> SELECT 2 FROM 3 WHERE 4 AND 5 OR ename emp ename LIKE '%L%L%' deptno = 30 mgr = 7782;
Se voc quiser um desafio extra, complete os exerccios seguintes: 12. Mostre o nome, o cargo e o salrio para todos os empregados cujo cargo seja CLERK ou ANALYST e seu salrio no seja igual a $1000, $3000 ou $5000. SQL> SELECT 2 FROM 3 WHERE 4 AND ename, job, sal emp job IN ('CLERK', 'ANALYST') sal NOT IN (1000, 3000, 5000);
13.
Altere a consulta em e3q6.sql para mostrar o nome, salrio e comisso para todos os empregados cujo o valor da comisso seja maior que seu salrio incrementado por 10%. Salve o novo comando em um arquivo chamado e3q13.sql. Execute a consulta.
A-7
Funes Bsicas
SQL> EDIT e3q6.sql SELECT comm FROM WHERE / ename "Employee", sal "Monthly Salary", emp comm > sal * 1.1
A-8
Funes Bsicas
Solues Exerccios 4
1. Escreva uma consulta para exibir a data atual. Coloque o alias de coluna como Date. SQL> SELECT 2 FROM sysdate "Date" dual;
2.
Mostre o nmero do empregado, o nome, o salrio e o salary com um aumento de 15%. Coloque o alias da coluna como New Salary. Salve o comando SQL para um arquivo chamado e4q2.sql. SQL> SELECT empno, ename, sal, 2 ROUND(sal * 1.15, 0) "New Salary" 3 FROM emp; SQL> SAVE e4q2.sql Created file e4q2.sql;
3.
4.
Altere a consulta em e4q2.sql para adicionar uma nova coluna que subtraia o salrio antigo do novo salrio. Coloque o alias da coluna como Increase. Reexecute a consulta. SQL> EDIT e4q2.sql SELECT FROM / empno, ename, sal, ROUND(sal * 1.15, 0) "New Salary", ROUND(sal * 1.15, 0) - sal "Increase" emp
5.
Mostre o nome do empregado, a data de admisso e data de reviso do salrio, que deve ser a primeira segunda-feira aps seis meses de trabalho. Coloque o alias da coluna como REVIEW. Formate a data para uma padro semelhante a Sunday, the Seventh of September, 1981.
A-9
Funes Bsicas
ename, hiredate, TO_CHAR(NEXT_DAY(ADD_MONTHS(hiredate, 6), 'MONDAY'), 'fmDay, "the" Ddspth "of" Month, YYYY') emp;
A-10
Funes Bsicas
6.
Mostre o nome de cada empregado e calcule o nmero de meses entre a data atual e a data na qual ele foi contratado. Coloque o alias da coluna como MONTHS_WORKED. Ordene o resultado pelo nmero de meses trabalhados. Arredonde o nmero de meses para o nmero inteiro mais prximo. SQL> SELECT 2 3 FROM 4 ORDER BY ename, ROUND(MONTHS_BETWEEN (SYSDATE, hiredate)) MONTHS_WORKED emp MONTHS_BETWEEN(SYSDATE, hiredate);
7.
Escreva uma consulta que reproduza o seguinte para cada empregado, colocando o alias da coluna como Dream Salaries. SQL> SELECT ename || ' earns ' 2 || TO_CHAR(sal, 'fm$99,999.00') 3 || ' monthly but wants ' 4 || TO_CHAR(sal * 3, 'fm$99,999.00') 5 || '.' "Dream Salaries" 6 FROM emp;
Se houver tempo, complete os seguintes exerccios: 8. Crie uma consulta para exibir o nome e o salrio para todos os empregados. Formate o salrio para 15 caracteres de tamanho, preenchendo os espaos esquerda com o caractere $. Coloque o alias da coluna como SALARY. SQL> SELECT 2 3 FROM ename, LPAD(sal, 15, '$') SALARY emp;
9.
Escreva uma consulta que mostre o nome do empregado com a primeira letra em maiscula e as demais em minsculas, juntamente com o tamanho de seu nome, para todos os empregados cujo nome inicie com a letra J, A ou M. Coloque um alias apropriado para cada coluna.
A-11
Funes Bsicas
INITCAP(ename) "Name", LENGTH(ename) "Length" emp ename LIKE 'J%' ename LIKE 'M%' ename LIKE 'A%';
10.
Mostre o nome, a data de admisso e o dia da semana no qual o empregado comeou a trabalhar. Coloque o alias da coluna como DAY. Ordene o resultado pelo dia da semana, comeando com Monday. SQL> SELECT 2 3 FROM 4 ORDER BY ename, hiredate, TO_CHAR(hiredate, 'DAY') DAY emp TO_CHAR(hiredate - 1, 'd');
Se voc quiser um desafio extra, complete os exerccios seguintes: 11. Crie uma consulta que mostre o nome do empregado e o valor da comisso. Se o empregado no recebe comisso, mostre a string No Commission. Coloque o alias de coluna como COMM. SQL> SELECT 2 COMM 3 FROM ename, NVL(TO_CHAR(comm), 'No Commission') emp;
A-12
Funes Bsicas
Solues Exerccios 5
1. Escreva uma consulta para exibir o nome, o nmero do departamento e o nome do departamento para todos os empregados. SQL> SELECT 2 FROM 3 WHERE e.ename, e.deptno, d.dname emp e, dept d e.deptno = d.deptno;
2.
Crie uma lista nica de todos os cargos que esto no departamento 30. SQL> SELECT 2 FROM 3 WHERE 4 AND DISTINCT e.job, d.loc emp e, dept d e.deptno = d.deptno e.deptno = 30;
3.
Escreva uma consulta para exibir o nome do empregado, o nome do departamento e a localizao de todos os empregados que ganham comisso. SQL> SELECT 2 FROM 3 WHERE 4 AND e.ename, d.dname, d.loc emp e, dept d e.deptno = d.deptno e.comm IS NOT NULL;
4.
Mostre o nome do empregado e o nome do departamento para todos os empregados que possuem a letra A no nome. Salve o comando SQL em um arquivo chamado e5q4.sql. SQL> SELECT 2 FROM 3 WHERE 4 AND e.ename, d.dname emp e, dept d e.deptno = d.deptno e.ename LIKE '%A%';
5.
Escreva uma consulta para exibir o nome, o cargo, o nmero do departamento e o nome do departamento para todos os empregados que trabalham em DALLAS.
A-13
Funes Bsicas
e.ename, e.job, e.deptno, d.dname emp e, dept d e.deptno = d.deptno d.loc = 'DALLAS';
6.
Mostre o nome e o nmero do empregado juntamento com o nome e o nmero de seu gerente. Coloque o alias de coluna como Employee, Emp#, Manager e Mgr#, respectivamente. Salve o comando SQL para um arquivo chamado e5q6.sql. SQL> SELECT e.ename "Employee", e.empno "Emp#", 2 m.ename "Manager", m.empno "Mgr#" 3 FROM emp e, emp m 4 WHERE e.mgr = m.empno; SQL> SAVE e5q6.sql Created file e54q6.sql
7.
Modifique a consulta em e5q6.sql para exibir todos os empregados, incluindo o empregado com nome KING, que no possui gerente. Salve a nova consulta para um arquivo chamado e5q7.sql e execute-a. SQL> EDIT e5q6.sql SELECT FROM WHERE / e.ename "Employee", e.empno "Emp#", m.ename "Manager", m.empno "Mgr#" emp e, emp m e.mgr = m.empno(+)
Se houver tempo, complete os seguintes exerccios: 8. Crie uma consulta que mostre o nome do empregado, o nmero do departamento e todos os empregados que trabalham no mesmo departamento do empregado. Fornea para cada coluna um alias apropriado.
A-14
Funes Bsicas
SQL> 2 3 4 5 6
SELECT
e.deptno department, e.ename employee, c.ename colleague FROM emp e, emp c WHERE e.deptno = c.deptno AND e.empno <> c.empno ORDER BY e.deptno, e.ename, c.ename;
9.
Mostre a estrutura da tabela SALGRADE. Crie uma consulta que mostre o nome, o cargo, o nmero do departamento, o salrio e o nvel do salrio (grau) para todos os empregados. SQL> DESCRIBE SQL> SELECT s.grade 2 FROM 3 WHERE 4 AND salgrade e.ename, e.job, d.dname, e.sal, emp e, dept d, salgrade s e.deptno = d.deptno e.sal BETWEEN s.losal AND s.hisal;
Se voc quiser um desafio extra, complete os exerccios seguintes: 10. Crie uma consulta para exibir o nome e a data de admisso de qualquer empregado admitido aps o empregado BLAKE. SQL> SELECT 2 FROM 3 WHERE 4 AND emp.ename, emp.hiredate emp, emp blake blake.ename = 'BLAKE' blake.hiredate < emp.hiredate;
11.
Mostre os nomes dos empregados e as datas de admisso juntamente com o nome e a data de admisso do gerente para todos os empregados que foram admitidos antes do seu gerente. Coloque o alias das colunas como Employee, Emp Hiredate, Manager e Mgr Hiredate, respectivamente. e.ename "Employee", e.hiredate "Emp m.ename "Manager", m.hiredate "Mgr Hiredate" emp e, emp m e.mgr = m.empno e.hiredate < m.hiredate;
12.
Crie uma consulta que mostre o nome dos empregados e o valor dos salrios indicado atravs de asteriscos. Cada asterisco deve representar cem dlares. Ordene os dados em ordem descendente de salrio. Coloque o alias da coluna como EMPLOYEE_AND_THEIR_SALARIES.
A-15
Funes Bsicas
A-16
Funes Bsicas
Solues Exerccios 6
Determine a validade das seguintes declaraes, circulando a palavra Verdadeiro ou Falso. 1. 2. 3. 4. Funes de grupo atuam sobre muitas linhas para produzir um nico resultado. Verdadeiro Funes de grupo incluem nulos nos clculos. Falso A clusula WHERE restringe as linhas antes de inclu-las em um clculo de grupo. Verdadeiro Mostre o maior, o menor, a soma e a mdia do salrio de todos os empregados. Coloque o alias das colunas como "Maximum", "Minimum", "Sum" e "Average", respectivamente. Arredonde os resultados para a posio decimal. Salve o comando SQL em um arquivo chamado e6q4.sql. SQL> SELECT ROUND(MAX(sal),0) 2 ROUND(MIN(sal),0) 3 ROUND(SUM(sal),0) 4 ROUND(AVG(sal),0) 5 FROM emp; SQL> SAVE e6q4.sql Created file e6q4.sql "Maximum", "Minimum", "Sum", "Average"
5.
Modifique a consulta em e6q4.sql para exibir o menor, o maior, a soma e a mdia do salrio para cada tipo de cargo. Salve o novo comando para e6q5.sql. Execute a consulta. SQL> EDIT e6q4.sql SELECT job, ROUND(MAX(sal),0) ROUND(MIN(sal),0) ROUND(SUM(sal),0) ROUND(AVG(sal),0) FROM emp GROUP BY job / SQL> START e6q5.sql "Maximum", "Minimum", "Sum", "Average"
6.
Escreva uma consulta para exibir o nmero de pessoas com o mesmo cargo.
A-17
Funes Bsicas
7.
Determine o nmero de gerentes sem list-los. Coloque o alias da coluna como Number of Managers. SQL> SELECT 2 FROM COUNT(DISTINCT mgr) "Number of Managers" emp;
8.
Escreva uma consulta que mostre a diferena entre o maior e menor salrios. Coloque o alias da coluna como DIFFERENCE. SQL> SELECT 2 FROM MAX(sal) - MIN(sal) DIFFERENCE emp;
Se houver tempo, complete os seguintes exerccios: 9. Mostre o nmero do gerente e o mais baixo salrio dentre os empregados associados para aquele gerente. Exclua qualquer um onde o cdigo do gerente no conhecido. Exclua qualquer grupo onde o salrio mnimo menor que $1000. Ordene o resultado em ordem descendente de salrio. SQL> 2 3 4 5 6 SELECT FROM WHERE GROUP BY HAVING ORDER BY mgr, MIN(sal) emp mgr IS NOT NULL mgr MIN(sal) > 1000 MIN(sal) DESC;
10.
Escreva uma consulta para exibir o nome do departamento, o nome da localizao, o nmero de empregados e a mdia de salrio para todos os empregados daquele departamento. Coloque os alias de coluna como DNAME, LOC, Number of People e Salary, respectivamente.
A-18
Funes Bsicas
SQL> 2 3 4 5
SELECT
d.dname, d.loc, COUNT(*) "Number of People", ROUND(AVG(sal),2) "Salary" FROM emp e, dept d WHERE e.deptno = d.deptno GROUP BY d.dname, d.loc;
Se voc quiser um desafio extra, complete os exerccios seguintes: 11. Crie uma consulta que mostre o nmero total de empregados e o nmero total de empregados contratados em 1980, 1981, 1982 e 1983. Fornea cabealhos de coluna apropriados. SQL> SELECT COUNT(*) total, 2 SUM(DECODE(TO_CHAR(hiredate, 'YYYY'), 3 1980,1,0)) "1980", 4 SUM(DECODE(TO_CHAR(hiredate, 'YYYY'), 5 1981,1,0)) "1981", 6 SUM(DECODE(TO_CHAR(hiredate, 'YYYY'), 7 1982,1,0)) "1982", 8 SUM(DECODE(TO_CHAR(hiredate, 'YYYY'), 9 1983,1,0)) "1983" 10 FROM emp;
12.
Crie uma consulta tipo matriz para exibir o cargo, o salrio para aquele cargo baseado no nmero de departamento e o salrio total para aquele cargo para todos os departamentos, fornecendo para cada coluna um cabealho apropriado. job "Job", SUM(DECODE(deptno, 10, sal)) "Dept 10", SUM(DECODE(deptno, 20, sal)) "Dept 20", SUM(DECODE(deptno, 30, sal)) "Dept 30", SUM(sal) "Total" emp job;
A-19
Funes Bsicas
Solues Exerccios 7
1. Escreva uma consulta para exibir o nome do empregado e a data de admisso para todos os empregados que esto no mesmo departamento do empregado BLAKE, excluindo-o do resultado. SQL> SELECT 2 FROM 3 WHERE 4 5 'BLAKE') 6 AND ename, hiredate emp deptno IN (SELECT FROM WHERE ename != 'BLAKE';
2.
Crie uma consulta para exibir o nmero do empregado e o nome para todos os empregados que ganham mais que a mdia de salrio. Classifique o resultado em ordem descendente de salrio. SQL> 2 3 4 5 SELECT FROM WHERE empno, ename emp sal > (SELECT AVG(sal) FROM emp) ORDER BY sal DESC;
3.
Escreva uma consulta que mostre o nmero do empregado e o nome para todos os empregados que trabalham em um departamento com qualquer empregado cujo nome contenha uma letra T. Salve o comando SQL para um arquivo chamado e7q3.sql. SQL> SELECT empno, ename 2 FROM emp 3 WHERE deptno IN (SELECT deptno 4 FROM emp 5 WHERE ename LIKE '%T %'); SQL> SAVE e7q3.sql Created file e7q3.sql
4.
Mostre o nome do empregado, o nmero do departamento e o cargo para todos os empregados cujo o departamento localize-se em DALLAS.
A-20
Funes Bsicas
ename, deptno, job emp deptno IN (SELECT deptno FROM dept WHERE loc =
5.
Mostre o nome do empregado e o salrio de todos os empregados gerenciados por KING. SQL> SELECT 2 FROM 3 WHERE 4 5 ename, sal emp mgr IN (SELECT FROM WHERE
6.
Mostre o nmero do departamento, o nome e o cargo para todos os empregados que esto em um dos departamentos SALES. SQL> SELECT 2 FROM 3 WHERE 4 5 'SALES'); deptno, ename, job emp deptno IN (SELECT deptno FROM dept WHERE dname =
Se houver tempo, complete os seguintes exerccios: 7. Modifique a consulta em e7q3.sql para exibir o nmero do empregado, o nome e o salrio para todos os empregados que ganham mais que a mdia de salrio e que trabalham em um departamento com qualquer empregado com um letra T em seu nome. Salve o novo comando para e7q7.sql e execute.
A-21
Funes Bsicas
SQL> EDIT e7q3.sql SELECT FROM WHERE AND / SQL> START e7q7.sql empno, ename, sal emp sal > (SELECT AVG(sal) FROM emp) deptno IN (SELECT deptno FROM emp WHERE ename LIKE '%T%')
A-22
Funes Bsicas
Solues Exerccios 8
1. Escreva uma consulta para exibir o nome, o nmero do departamento e o salrio de qualquer empregado cujo o nmero do departamento e o salrio correspondam ambos ao nmero do departamento e ao salrio de qualquer empregado que ganha comisso. SQL> SELECT 2 FROM 3 WHERE 4 5 6 ename, deptno, sal emp (sal, deptno) IN (SELECT sal, deptno FROM emp WHERE comm IS NOT NULL);
2.
Mostre o nome, o nome do departamento e o salrio de qualquer empregado cujo salrio e comisso correspondam ambos ao salrio e comisso de qualquer empregado localizado em DALLAS. SQL> SELECT 2 FROM 3 WHERE 4 AND 5 6 7 8 ename, dname, sal emp e, dept d e.deptno = d.deptno (sal, NVL(comm,0)) IN (SELECT sal, NVL(comm,0) FROM emp e, dept d WHERE e.deptno = d.deptno AND d.loc = 'DALLAS');
3.
Crie uma consulta para exibir o nome, a data de admisso e o salrio para todos os empregados que possuem o mesmo salrio e comisso que SCOTT. SQL> SELECT 2 FROM 3 WHERE 4 5 6 7 AND ename, hiredate, sal emp (sal, NVL(comm,0)) IN (SELECT sal, NVL(comm,0) FROM emp WHERE ename = 'SCOTT') ename != 'SCOTT';
4.
Crie uma consulta para exibir os empregados que ganham um salrio maior que o salrio de qualquer empregado com o cargo CLERK. Classifique o resultado do maior para o menor salrio.
A-23
Funes Bsicas
SQL> 2 3 4 5 6
ename, job, sal emp sal > ALL (SELECT FROM WHERE ORDER BY sal DESC;
A-24
Funes Bsicas
Solues Exerccios 9
Determine se as seguintes declaraes so verdadeiras ou falsas: 1. Uma varivel de substituio criada com o smbolo (&) solicitada ao usurio uma nica vez. Verdadeiro 2. 3. O comando ACCEPT um comando SQL. Falso Escreva um arquivo de script para mostrar o nome do empregado, o cargo e a data de admisso para todos os empregados que foram admitidos entre um determinado perodo. Concatene o nome e o cargo, separando-os por uma vrgula e espao, e coloque o alias da coluna como Employees. Solicite ao usurio os dois intervalos do perodo utilizando o comando ACCEPT. Utilize o formato MM/DD/YY. Salve o script para um arquivo chamado e9q3.sql.
A-25
Funes Bsicas
SET ECHO OFF SET VERIFY OFF ACCEPT low_date DATE FORMAT 'MM/DD/YY' PROMPT 'Please enter the low date range (''MM/DD/YY''): ' ACCEPT high_date DATE FORMAT 'MM/DD/YY' PROMPT 'Please enter the high date range (''MM/DD/YY''): ' COLUMN EMPLOYEES FORMAT A25 SELECT FROM WHERE ename ||', '|| job EMPLOYEES, hiredate emp hiredate BETWEEN TO_DATE('&low_date', 'MM/DD/YY') AND TO_DATE('&high_date', 'MM/DD/YY')
/ UNDEFINE low_date UNDEFINE high_date COLUMN EMPLOYEES CLEAR SET VERIFY ON SET ECHO ON SQL> START e9q3.sql;
4.
Escreva um script para mostrar o nome do empregado, o cargo e o nome do departamento. A condio de pesquisa deve permitir que a procura no faa distino entre maisculas e minsculas. Salve o script para um arquivo chamado e9q4.sql.
A-26
Funes Bsicas
SET ECHO OFF SET VERIFY OFF ACCEPT p_location PROMPT 'Please enter the location name: ' COLUMN ename HEADING "EMPLOYEE NAME" FORMAT A15 COLUMN dname HEADING "DEPARTMENT NAME" FORMAT A15 SELECT FROM WHERE e.ename, e.job, d.dname emp e, dept d e.deptno = d.deptno AND LOWER(d.loc) LIKE LOWER('%&p_location%')
/ UNDEFINE p_location COLUMN ename CLEAR COLUMN dname CLEAR SET VERIFY ON SET ECHO ON SQL> START e9q4.sql
5.
Modifique o arquivo e9q4.sql para criar um relatrio contendo o nome do departamento, o nome do empregado, a data de admisso, o salrio e o salrio anual para todos os empregados em uma determinada localizao. Solicite ao usurio a localizao. Coloque o alias das colunas como DEPARTMENT NAME, EMPLOYEE NAME, START DATE, SALARY, ANNUAL SALARY, colocando os alias em mltiplas linhas. Save o novo script para um arquivo chamado e9q5.sql.
A-27
Funes Bsicas
SET ECHO OFF SET FEEDBACK OFF SET VERIFY OFF BREAK ON dname ACCEPT p_location PROMPT 'Please enter the location name: ' COLUMN dname HEADING "DEPARTMENT|NAME" FORMAT A15 COLUMN ename HEADING "EMPLOYEE|NAME" FORMAT A15 COLUMN hiredate HEADING "START|DATE" FORMAT A15 COLUMN sal HEADING "SALARY" FORMAT $99,990.00 COLUMN asal HEADING "ANNUAL|SALARY" FORMAT $99,990.00 SELECT d.dname, e.ename, e.hiredate, e.sal, e.sal * 12 asal FROM emp e, dept d WHERE e.deptno = d.deptno AND LOWER(d.loc) LIKE LOWER('%&p_location%') ORDER BY dname / UNDEFINE p_location COLUMN dname CLEAR COLUMN ename CLEAR COLUMN hiredate CLEAR COLUMN sal CLEAR COLUMN asal CLEAR CLEAR BREAK SET VERIFY ON SET FEEDBACK ON SET ECHO ON SQL> START e9q5.sql
A-28
Funes Bsicas
Solues Exerccios 10
Insira dados na tabela MY_EMPLOYEE. 1. Execute o script lab10_1.sql para construir a tabela MY_EMPLOYEE que ser utilizado nos exerccios. SQL> START lab9_1.sql
2.
Descreva a estrutura da tabela MY_EMPLOYEE para identificar os nomes das SQL> DESCRIBE my_employee
colunas. 3.
ID 1 2 3 4 5
Adicione a primeira linha de dados na tabela MY_EMPLOYEE a partir do exemplo de dados abaixo. No liste as colunas na clusula INSERT.
LAST_NAME Patel Dancs Biri Newman Ropeburn FIRST_NAME Ralph Betty Ben Chad Audry USERID rpatel bdancs bbiri cnewman aropebur SALARY 795 860 1100 750 1550
SQL> INSERT INTO my_employee 2 VALUES (1, 'Patel', 'Ralph', 'rpatel', 795);
4.
Popule a tabela MY_EMPLOYEE com a segunda linha do exemplo de dados acima. Neste momento, liste as colunas explicitamente na clusula INSERT.
SQL> INSERT INTO my_employee (id, last_name, first_name, 2 userid, salary) 3 VALUES (2, 'Dancs', 'Betty', 'bdancs', 860);
5.
A-29
Funes Bsicas
* my_employee;
6.
Crie um script chamado loademp.sql para inserir linhas na tabela MY_EMPLOYEE interativamente. Solicite ao usurio o primeiro nome do empregado, o ltimo nome e o salrio. Concatene a primeira letra do primeiro nome com os primeiros sete caracteres do ltimo nome para produzir o valor para a coluna USERID. SET ECHO OFF SET VERIFY OFF ACCEPT p_first_name PROMPT 'Please ACCEPT p_last_name PROMPT 'Please ACCEPT p_id PROMPT 'Please ACCEPT p_salary PROMPT 'Please INSERT INTO VALUES &p_salary) / SET VERIFY ON SET ECHO ON
enter the employee's first name: ' enter the employee's last name: ' enter the employee number: ' enter the employee's salary: '
7.
Popule a tabela com as prximas duas linhas de exemplo de dados executando o script criado. SQL> START loademp.sql SQL> START loademp.sql
8.
9.
Funes Bsicas
10.
Modifique o ltimo nome do empregado 3 para Drexler. SQL> UPDATE 2 SET 3 WHERE my_employee last_name = 'Drexler' id = 3;
11.
Modifique o salrio para 1000 para todos os empregados com o salrio menor que 900. SQL> UPDATE 2 SET 3 WHERE my_employee salary = 1000 salary < 900;
12.
Verifique suas modificaes para a tabela. SQL> SELECT 2 FROM last_name, salary my_employee;
13.
Remova o empregado Betty Dancs da tabela MY_EMPLOYEE. SQL> DELETE 2 FROM my_employee 3 WHERE last_name = 'Dancs' 4 AND first_name = 'Betty';
14.
15.
16. 17.
Popule a tabela com a ltima linha do exemplo de dados executando o script criado no exerccio 6. Confirme sua insero para a tabela. SQL> START loademp.sql SQL> SELECT 2 FROM * my_employee;
A-31
Funes Bsicas
18.
19.
20.
21.
Descarte a mais recente operao DELETE sem descartar a operao de INSERT anterior. SQL> ROLLBACK TO SAVEPOINT a;
22.
Confirme que a nova linha permanece intacta. SQL> SELECT 2 FROM * my_employee;
23.
A-32
Funes Bsicas
Solues Exerccios 11
1. Crie a tabela DEPARTMENT baseado no grfico abaixo. Salve a sintaxe para um arquivo chamado e11q1.sql e ento execute-o para criar a tabela. Confirme que a tabela foi criada.
Nome da Coluna Tipo de Chave Nulos/Unique Tabela (FK) Coluna (FK) Tipo de Dado Tamanho ID NAME
Number 7
Varchar2 25
SQL> EDIT e11q1.sql CREATE TABLE department (id NUMBER(7), name VARCHAR2(25)) / SQL> START e11q1.sql SQL> DESCRIBE department
2.
Popule a tabela DEPARTMENT com dados a partir da tabela DEPT. Inclua somente as colunas necessrias. SQL> INSERT INTO department 2 SELECT deptno, dname 3 FROM dept;
3.
Crie a tabela EMPLOYEE baseado no grfico abaixo. Salve a sintaxe em um arquivo chamado e11q3.sql e execute-o para criar a tabela. Confirme que a tabela foi criada.
ID LAST_NAME FIRST_NAME DEPT_ID
Nome da Coluna Tipo de Chave Nulos/Unique Tabela (FK) Coluna (FK) Tipo de Dado Tamanho
Number 7
Varchar2 25
Varchar2 25
Number 7
A-33
Funes Bsicas
CREATE TABLE employee (id NUMBER(7), last_name VARCHAR2(25), first_name VARCHAR2(25), dept_id NUMBER(7)) / SQL> START e11q3.sql SQL> DESCRIBE employee
A-34
Funes Bsicas
4.
Modifique a coluna LAST_NAME da tabela EMPLOYEE para permitir o uso de nomes de maior tamanho. Confirme sua modificao. SQL> ALTER TABLE employee 2 MODIFY (last_name VARCHAR2(50)); SQL> DESCRIBE employee
5.
Confirme que as tabelas DEPARTMENT e EMPLOYEE esto armazenadas no dicionrio de dados (USER_TABLES). SQL> SELECT 2 FROM 3 WHERE 'EMPLOYEE'); table_name user_tables table_name IN ('DEPARTMENT',
6.
Crie a tabela EMPLOYEE2 baseado na estrutura da tabela EMP, incluindo somente as colunas EMPNO, ENAME e DEPTNO. Coloque o nome das colunas na tabela nova como ID, LAST_NAME e DEPT_ID, respectivamente.
SQL> CREATE TABLE employee2 AS 2 SELECT empno id, ename last_name, deptno dept_id 3 FROM emp;
7.
8.
Altere o nome da tabela EMPLOYEE2 para EMPLOYEE. SQL> RENAME employee2 TO employee;
9.
Adicione um comentrio para a definio das tabelas DEPARTMENT e EMPLOYEE que as descreva. Confirme sua adio no dicionrio de dados.
A-35
Funes Bsicas
SQL> COMMENT ON TABLE employee IS 'Employee Information'; SQL> COMMENT ON TABLE department IS 'Department Information'; SQL> COLUMN table_name FORMAT A15 SQL> COLUMN table_type FORMAT A10 SQL> COLUMN comments FORMAT A40 SQL> SELECT * 2 FROM user_tab_comments 3 WHERE table_name = 'DEPARTMENT' 4 OR table_name = 'EMPLOYEE';
A-36
Funes Bsicas
Solues Exerccios 12
1. Adicione a nvel de tabela uma constraint PRIMARY KEY para a tabela EMPLOYEE utilizando a coluna ID. A constraint deve ficar habilitada na criao. SQL> ALTER TABLE employee 2 ADD CONSTRAINT employee_id_pk PRIMARY KEY (id);
2.
Crie uma constraint PRIMARY KEY na tabela DEPARTMENT utilizando a coluna ID. A constraint deve ficar habilitada na criao. SQL> ALTER TABLE department 2 ADD CONSTRAINT department_id_pk PRIMARY KEY(id);
3.
Adicione uma referncia de chave estrangeira para a tabela EMPLOYEE que garanta que o empregado no seja associado para um departamento no existente.
SQL> ALTER TABLE employee 2 ADD CONSTRAINT employee_dept_id_fk FOREIGN KEY (dept_id) 3 REFERENCES department(id);
4.
Confirme que as constraints foram adicionadas consultando a viso USER_CONSTRAINTS. Observe os tipos e nomes das constraints. Salve o comando em um arquivo chamado e12q4.sql. SQL> SELECT constraint_name, constraint_type 2 FROM user_constraints 3 WHERE table_name IN ('EMPLOYEE', 'DEPARTMENT'); SQL> SAVE e12q4.sql
5.
Modifique a tabela EMPLOYEE. Adicione uma coluna SALARY com o tipo de dado NUMBER(7). SQL> ALTER TABLE employee 2 ADD (salary NUMBER(7));
A-37
Funes Bsicas
Solues Exerccios 13
1. Crie uma viso chamada EMP_VU baseada no nmero do empregado, nome e no nmero do departamento a partir da tabela EMP. Modifique o cabealho para o nome do empregado para EMPLOYEE. SQL> CREATE VIEW emp_vu AS 2 SELECT empno, ename employee, deptno 3 FROM emp;
2.
3.
Selecione a coluna VIEW_NAME e TEXT a partir da tabela do dicionrio de dados USER_VIEWS. SQL> SQL> SQL> 2 COLUMN view_name FORMAT A30 COLUMN text FORMAT A50 SELECT view_name, text FROM user_views;
4.
Utilizando a viso EMP_VU, execute uma consulta para exibir todos os nomes de empregados e nmeros de departamentos. SQL> SELECT 2 FROM employee, deptno emp_vu;
5.
Crie uma viso chamada DEPT20 que contenha o nmero do empregado, o nome e o nmero do departamento para todos os empregados do departamento 20. Coloque os alias das colunas da viso como EMPLOYEE_ID, EMPLOYEE e DEPARTMENT_ID. No permita que um empregado seja atribudo a outro departamento pela viso.
A-38
Funes Bsicas
SQL> 2 3 4 5 6
CREATE VIEW dept20 AS SELECT empno employee_id, ename employee, deptno department_id FROM emp WHERE deptno = 20 WITH CHECK OPTION CONSTRAINT emp_dept_20;
A-39
Funes Bsicas
6.
Mostre a estrutura e o contedo da viso DEPT20. SQL> DESCRIBE dept20 SQL> SELECT * 2 FROM dept20;
7.
Tente alterar o departamento do empregado SMITH para 30 atravs da viso. SQL> UPDATE 2 SET 3 WHERE dept20 department_id = 30 employee = 'SMITH';
Se houver tempo, complete os seguintes exerccios: 8. Crie uma viso chamada SALARY_VU baseada no nome do empregado, nome do departamento, salrio e nvel do salrio para todos os empregados. Coloque o alias das colunas como Employee, Department, Salary e Grade, respectivamente. SQL> 2 3 4 5 6 CREATE VIEW salary_vu AS SELECT ename employee, dname department, sal salary, grade FROM emp e, dept d, salgrade s WHERE e.deptno = d.deptno AND e.sal between s.losal and s.hisal;
A-40
Funes Bsicas
Solues Exerccios 14
1. Crie uma seqncia para ser utilizada com a coluna da chave primria da tabela DEPARTMENT. A seqncia deve iniciar em 60 e possuir um valor mximo de 200. Fornea para a seqncia um incremento de 10 e o nome como DEPT_ID_SEQ. SQL> 2 3 4 CREATE SEQUENCE dept_id_seq START WITH 60 INCREMENT BY 10 MAXVALUE 200;
2.
Crie um arquivo de script para exibir a seguinte informao sobre suas seqncias: o nome da seqncia, o valor mximo, o incremento e o ltimo nmero fornecido. Coloque o nome do arquivo como e14q2.sql. Execute o script criado. SQL> EDIT e14q2.sql SELECT sequence_name, max_value, increment_by, last_number user_sequences
3.
Escreva um script interativo para inserir uma linha na tabela DEPARTMENT. Coloque o nome do arquivo como e14q3.sql. Utilize a seqncia que voc criou para a coluna ID. Crie um prompt customizado para solicitar o nome do departamento. Execute o script adicionando dois departamentos chamados Education e Administration. Confirme as inseres.
4. Crie um ndice no nico para a coluna definida como FOREIGN KEY na tabela SQL> EDIT e14q3.sql SET ECHO OFF SET VERIFY OFF ACCEPT name PROMPT 'Please enter the department name: ' INSERT INTO department (id, name) VALUES (dept_id_seq.NEXTVAL, '&name') / SET VERIFY ON SET ECHO ON SQL> START e14q3.sql SQL> SELECT * 2 FROM department;
A-41
Funes Bsicas
5. Mostre os ndices que existem no dicionrio de dados para a tabela EMPLOYEE. Salve o comando para um script chamado e14q5.sql. SQL> 2 3 SQL> SELECT index_name, table_name, uniqueness FROM user_indexes WHERE table_name = 'EMPLOYEE'; SAVE e14q5.sql
A-42
Funes Bsicas
Solues Exerccios 15
1. Que privilgio um usurio necessita para conectar ao Servidor Oracle? Este privilgio um privilgio de sistema ou objeto? CREATE SESSION Privilgio de sistema 2. 3. Que privilgio necessrio fornecer para um usurio poder criar tabelas? CREATE TABLE Se voc criar uma tabela, quem pode fornecer privilgios para outros usurios sobre esta tabela? Voc ou qualquer um para quem voc tenha passado os privilgios com WITH GRANT OPTION. 4. Voc um DBA e est criando vrios usurios que necessitam dos mesmos privilgios de sistema. O que voc pode utilizar para facilitar seu trabalho? Crie uma role contendo os privilgios de sistema e passe a role para os usurios. 5. 6. Que comando voc utiliza para alterar a sua senha? ALTER USER Conceda a outro usurio acesso para a sua tabela DEPT. Solicite a este outro usurio que tambm conceda a voc acesso de consulta para a tabela DEPT dele. Grupo 2. SQL> GRANT select 2 ON dept 3 TO <user1>; Grupo 1. SQL> GRANT select 2 ON dept 3 TO <user2>;
7.
A-43
Funes Bsicas
* dept;
8.
Adicione uma nova linha para a tabela DEPT. O grupo 1 deve inserir Education como o departamento nmero 50. O grupo 2 deve inserir Administration tambm como o departamento nmero 50. Torne as modificaes permanentes. Grupo 1. SQL> INSERT INTO dept (deptno, dname) 2 VALUES (50, 'Education'); SQL> COMMIT; Grupo 2. SQL> INSERT INTO dept (deptno, dname) 2 VALUES (50, 'Administration'); SQL> COMMIT;
9.
Crie um sinnimo para a tabela DEPT do outro grupo. Grupo 1. SQL> CREATE SYNONYM grupo2 2 FOR <user2>.DEPT; Grupo 2. SQL> CREATE SYNONYM grupo1 2 FOR <user1>.DEPT;
10.
Consulte todas as linhas da tabela DEPT do outro grupo utilizando o sinnimo. Grupo 1. SQL> SELECT 2 FROM Grupo 2. SQL> SELECT 2 FROM
* grupo2; * grupo1;
11. 12.
Consulte a viso do dicionrio de dados USER_TABLES para visualizar as tabelas que voc possui. Consulte a viso do dicionrio de dados ALL_TABLES para visualizar todas as SQL> SELECT table_name 2 FROM user_tables;
A-44
Funes Bsicas
13.
Revogue o privilgio SELECT do outro grupo. Grupo 1. SQL> REVOKE 2 ON 3 FROM Grupo 2. SQL> REVOKE 2 ON 3 FROM
A-45
Funes Bsicas
Solues Exerccios 16
1. a. Analise cada uma das seguintes declaraes. Determine qual delas no esto corretas e explique o motivo. Correto DECLARE v_id
NUMBER(4);
b.
Incorreto porque s permitido um identificador por declarao. DECLARE v_x, v_y, v_z
VARCHAR2(10);
c.
Incorreto porque uma varivel NOT NULL deve ser inicializada. DECLARE v_birthdate
d.
BOOLEAN := 1;
e.
Correto. DECLARE TYPE name_table_type IS TABLE OF VARCHAR2(20) INDEX BY BINARY_INTEGER; dept_name_table name_table_type;
A-46
Funes Bsicas
2. a.
Em cada uma das seguintes atribuies, determine o tipo de dado resultante da expresso. Numrico v_days_to_go := v_due_date - SYSDATE;
b.
c.
Incorreto. PL/SQL no converte smbolos especiais VARCHAR2 para NUMBER v_sum := $100,000 + $250,000;
d.
e.
f.
3.
Crie um bloco annimo para exibir a frase My PL/SQL Block Works para a tela. VARIABLE g_message VARCHAR2(30) BEGIN :g_message := 'My PL/SQL Block Works'; END; / PRINT g_message SQL> START e16q3.sql
A-47
Funes Bsicas
Se houver tempo, complete os seguintes exerccios: 4. Crie um bloco que declare duas variveis. Atribua o valor destas variveis PL/SQL para variveis host do SQL*Plus e mostre os resultados das variveis PL/SQL na tela. Execute o bloco PL/SQL. Salve o bloco PL/SQL para um arquivo chamado e16q4.sql. VARIABLE g_char VARCHAR2(30) VARIABLE g_num NUMBER DECLARE v_char VARCHAR2(30); v_num NUMBER(11,2); BEGIN v_char := '42 is the answer'; v_num := TO_NUMBER(SUBSTR(v_char,1,2)); :g_char := v_char; :g_num := v_num; END; / PRINT g_char PRINT g_num SQL> START e16q4.sql
A-48
Funes Bsicas
Solues Exerccios 17
Bloco PL/SQL DECLARE v_weight v_message BEGIN
NUMBER(3) VARCHAR2(255)
SUB-BLOCO DECLARE v_weight NUMBER(3) := 1; v_message VARCHAR2(255) := 'Product 11001'; v_new_locn VARCHAR2(50) := 'Europe'; BEGIN v_weight := v_weight + 1; v_new_locn := 'Western ' || v_new_locn; END; v_weight := v_weight + 1; v_message := v_message || ' is in stock'; v_new_locn := 'Western ' || v_new_locn; END;
1.
Avalie o bloco PL/SQL acima e determine cada um dos seguintes valores de acordo com as regras de escopo. O valor de V_WEIGHT no sub-bloco 2 e o tipo de dado NUMBER b. c. d. e. O valor de V_NEW_LOCN no sub-bloco O valor de V_WEIGHT no bloco principal O valor de V_MESSAGE no bloco principal O valor de V_NEW_LOCN no bloco principal Western Europe e o tipo de dado VARCHAR2 601 e o tipo de dado NUMBER Product 10012 is in stock e o tipo de dado VARCHAR2 Ilegal porque V_NEW_LOCN no visvel fora do sub-bloco
a.
A-49
Funes Bsicas
Exemplo de Escopo DECLARE v_customer v_credit_rating BEGIN DECLARE v_customer v_name BEGIN v_customer END; v_customer END; v_name v_credit_rating
VARCHAR2(50) := 'Womansport'; VARCHAR2(50) := 'EXCELLENT'; NUMBER(7) := 201; VARCHAR2(25) := 'Unisports'; v_name v_credit_rating
2.
Suponha que voc inseriu um sub-bloco dentro de um bloco, como apresentado acima. Voc declarou duas variveis, V_CUSTOMER e V_CREDIT_RATING, no bloco principal. Voc tambm declarou duas variveis, V_CUSTOMER e V_NAME, no sub-bloco. Determine os valores para cada um dos seguintes casos. O valor de V_CUSTOMER no sub-bloco 201 e o tipo de dado NUMBER b. O valor de V_NAME no sub-bloco Unisports e o tipo de dado VARCHAR2
a.
c. d. e. f.
O valor de V_CREDIT_RATING no sub-bloco EXCELLENT e o tipo de dado VARCHAR2 O valor de V_CUSTOMER no bloco principal Womansport e o tipo de dado VARCHAR2 O valor de V_NAME no bloco principal V_NAME no visvel no bloco principal. O valor de V_CREDIT_RATING no bloco principal EXCELLENT e o tipo de dado VARCHAR2
A-50
Funes Bsicas
3.
Crie e execute um bloco PL/SQL que receba dois nmeros atravs de variveis de substituio do SQL*Plus. O primeiro nmero deve ser dividido pelo segundo nmero e ento o segundo nmero deve ser adicionado ao resultado. O resultado deve ser escrito para uma varivel PL/SQL e mostrado na tela.
SET VERIFY OFF VARIABLE v_result NUMBER ACCEPT p_num1 PROMPT 'Please enter the first number: ' ACCEPT p_num2 PROMPT 'Please enter the second number: ' DECLARE v_num1 NUMBER(9,2) := &p_num1; v_num2 NUMBER(9,2) := &p_num2; BEGIN :v_result := (v_num1/v_num2) + v_num2; END; / PRINT v_result SET VERIFY ON SQL> START e17q3.sql
A-51
Funes Bsicas
ACCEPT p_num1 PROMPT 'Please enter the first number: ' ACCEPT p_num2 PROMPT 'Please enter the second number: ' DECLARE v_num1 NUMBER(9,2) := &p_num1; v_num2 NUMBER(9,2) := &p_num2; BEGIN dbms_output.put_line(TO_CHAR(v_num1/v_num2) + v_num2); END; /
4.
Construa um bloco PL/SQL que calcule a gratificao total para um ano. O salrio anual e o percentual de bnus anual so passados para o bloco PL/SQL atravs de variveis de substituio e o bnus precisa ser convertido de um nmero inteiro para um nmero decimal (por exemplo, 15 para .15). Se o salrio for nulo, atribua ele para zero antes de calcular a gratificao total. Execute o bloco PL/SQL. Lembre-se: utilize a funo NVL para tratar valores nulos. Nota: Para testar a funo NVL escreva NULL no prompt; pressionando [Return] resulta em um erro de expresso.
SET VERIFY OFF VARIABLE g_total NUMBER ACCEPT p_salary PROMPT 'Please enter the salary amount: ' ACCEPT p_bonus PROMPT 'Please enter the bonus percentage: ' DECLARE v_salary NUMBER := &p_salary; v_bonus NUMBER := &p_bonus; BEGIN :g_total := NVL(v_salary, 0) * (1 + NVL(v_bonus, 0) / 100); END; / PRINT g_total SET VERIFY ON SQL> START e17q4.sql
A-52
Funes Bsicas
Solues Exerccios 18
1. Crie um bloco PL/SQL que seleciona o maior nmero de departamento na tabela DEPT e armazene ele em uma varivel do SQL*Plus. Mostre o resultado na tela. Salve o bloco PL/SQL para um arquivo chamado e18q1.sql. VARIABLE g_max_deptno NUMBER DECLARE v_max_deptno NUMBER; BEGIN SELECT MAX(deptno) INTO v_max_deptno FROM dept; :g_max_deptno := v_max_deptno; END; / PRINT g_max_deptno SQL> START e18q1.sql
2.
Crie um bloco PL/SQL que insira um novo departamento na tabela DEPT. Salve o bloco PL/SQL para um arquivo chamado e18q2.sql. Utilize o nmero de departamento recuperado no exerccio 1 e adicione 10 para ele como entrada do nmero do departamento para o novo departamento. Utilize um parmetro para o nome do departamento. Deixe a localizao nula por enquanto.
a. b. c.
SET VERIFY OFF ACCEPT p_deptno PROMPT 'Please enter the department number: ' ACCEPT p_dept_name PROMPT 'Please enter the department name: ' BEGIN INSERT INTO dept (deptno, dname, loc) VALUES (&p_deptno, '&p_dept_name', NULL); COMMIT; END; / SET VERIFY ON
d.
e.
Funes Bsicas
3.
Crie um bloco PL/SQL que atualize a localizao para um departamento existente. Save o bloco PL/SQL para um arquivo chamado e18q3.sql. Utilize um parmetro para o nmero do departamento. Utilize um parmetro para a localizao do departamento. Teste o bloco PL/SQL. Mostre o nmero, o nome e a localizao para o departamento atualizado.
a. b. c. d.
SET VERIFY OFF ACCEPT p_deptno PROMPT 'Please enter the department number: ' ACCEPT p_loc PROMPT 'Please enter the department location: ' BEGIN UPDATE dept SET loc = '&p_loc' WHERE deptno = &p_deptno; COMMIT; END; / SET VERIFY ON SQL> START e18q3.sql
4.
Crie um bloco PL/SQL que remova o departamento criado no exerccio 2. Salve o bloco PL/SQL para um arquivo chamado e18q4.sql. Utilize um parmetro para o nmero do departamento. Mostre na tela o nmero de linhas afetadas. Teste o bloco PL/SQL.
a. b. c.
A-54
Funes Bsicas
SET VERIFY OFF VARIABLE g_result VARCHAR2(40) ACCEPT p_deptno PROMPT 'Please enter the department number: ' DECLARE v_result NUMBER(2); BEGIN DELETE FROM dept WHERE deptno = &p_deptno; v_result := SQL%ROWCOUNT; :g_result := (TO_CHAR(v_result) || ' row(s) deleted.'); COMMIT; END; / SET VERIFY ON PRINT g_result SQL> START e18q4.sql
d. e.
O que acontece se voc fornecer um nmero de departamento que no existe? Confirme que o departamento foi removido. SQL> SELECT 2 FROM 3 WHERE * dept deptno = &p_deptno;
A-55
Funes Bsicas
Solues Exerccios 19
1. Execute o script lab19_1.sql para criar a tabela MESSAGES. Escreva um bloco PL/SQL para inserir nmeros na tabela MESSAGES. CREATE TABLE messages (results VARCHAR2 (60)) /
a. b.
Insira os nmeros de 1 a 10 excluindo o 6 e 8. Execute um COMMIT antes do final do bloco. BEGIN FOR i IN 1..10 LOOP IF i = 6 or i = 8 THEN null; ELSE INSERT INTO messages(results) VALUES (i); END IF; COMMIT; END LOOP; END; /
c.
Selecione os dados da tabela MESSAGES para verificar se o bloco executou corretamente. SQL> SELECT 2 FROM * messages;
2.
Crie um bloco PL/SQL que calcule a commisso para o empregado especificado baseado no salrio do empregado. Execute o script lab19_2.sql para inserir um novo empregado na tabela EMP. SQL> START lab19_2.sql
a.
b. c.
Receba o nmero do empregado como uma varivel de substituio do SQL*Plus. Se o salrio do empregado for menor que $1,000, atribua para a comisso do empregado o valor de 10% do seu salrio.
A-56
Funes Bsicas
d. e. f. g.
Se o salrio do empregado est entre $1,000 e $1,500, atribua para a comisso do empregado o valor de 15% do seu salrio. Se o salrio do empregado for maior que $1,500, atribua para a comisso do empregado o valor de 20% do seu salrio. Se o salrio do empregado for NULL, atribua para a comisso do empregado para 0. Efetue o commit das modificaes. ACCEPT p_empno PROMPT 'Please enter employee number: ' DECLARE v_empno emp.empno%TYPE := &p_empno; v_sal emp.sal%TYPE; v_comm emp.comm%TYPE; BEGIN SELECT sal INTO v_sal FROM emp WHERE empno = v_empno; IF v_sal < 1000 THEN v_comm := .10; ELSIF v_sal BETWEEN 1000 and 1500 THEN v_comm := .15; ELSIF v_sal > 1500 THEN v_comm := .20; ELSE v_comm := 0; END IF; UPDATE emp SET comm = sal * v_comm WHERE empno = v_empno; COMMIT; END; /
h.
Teste o bloco PL/SQL para cada um dos seguintes casos e verifique cada atualizao da comisso.
Nmero do Empregado 7369 7934 7499 8000 Salrio 800 1300 1600 NULL Comisso Resultante 80 195 320 NULL
A-57
Funes Bsicas
SQL> 2 3 4
Se houver tempo, complete os seguintes exerccios: 3. Modifique o arquivo e16q4.sql para inserir o texto Number is odd ou Numer is even na tabela MESSAGES dependendo se o valor informado mpar ou par. Consulte a tabela MESSAGES para determinar se o bloco PL/SQL executou corretamente. DECLARE v_char VARCHAR2(30); v_num NUMBER(11,2); BEGIN v_char := '42 is the answer'; v_num := TO_NUMBER(SUBSTR(v_char,1,2)); IF mod(v_num, 2) = 0 THEN INSERT INTO messages (results) VALUES ('Number is even'); ELSE INSERT INTO messages (results) VALUES ('Number is odd'); END IF; END; / SQL> SELECT * 2 FROM messages;
4.
Adicione uma nova coluna para a tabela EMP para armazenar asteriscos (*). SQL> ALTER TABLE 2 ADD stars emp VARCHAR2(100);
A-58
Funes Bsicas
5.
Crie um bloco PL/SQL que armazene na coluna STARS da tabela EMP um asterisco para cada $100 do salrio do empregado. Arredonde o salrio para o nmero inteiro mais prximo. Salve o bloco PL/SQL para um arquivo chamado e19q5.sql. Receba o nmero do empregado como uma varivel de substituio do SQL*Plus. Inicialize a varivel que conter a string de asteriscos. Concatene um asterisco para a string para cada $100 do valor do salrio. Por exemplo, se o empregado possui um salrio de $800, a string deve possuir oito asteriscos. Atualize a coluna STARS para o empregado com a string de asteriscos. Efetue o commit das modificaes. Teste o bloco para empregados que no possuem salrio e para empregados que possuem um salrio.
a. b. c. d. e. f.
SET VERIFY OFF ACCEPT p_empno PROMPT 'Please enter the employee number: ' DECLARE v_empno emp.empno%TYPE := &p_empno; v_asterisk emp.stars%TYPE := NULL; v_sal emp.sal%TYPE; BEGIN SELECT NVL(ROUND(sal/100), 0) INTO v_sal FROM emp WHERE empno = v_empno; FOR i IN 1..v_sal LOOP v_asterisk := v_asterisk ||'*'; END LOOP; UPDATE emp SET stars = v_asterisk WHERE empno = v_empno; COMMIT; END; / SET VERIFY ON SQL> START e19q5.sql SQL> SELECT empno, sal, stars 2 FROM emp 3 WHERE empno IN (7934, 8000);
A-59
Funes Bsicas
Solues Exerccios 20
1. Execute o comando abaixo para criar uma nova tabela para armazenar os empregados e seus salrios. SQL> CREATE TABLE top_dogs 2 (name VARCHAR2(25), 3 salary NUMBER(11,2));
2.
Escreva um bloco PL/SQL para recuperar o nome e o salrio do empregado fornecido a partir da tabela EMP baseado no nmero do empregado, utilizando PL/SQL tables. Declare duas PL/SQL tables, ENAME_TABLE temporariamente armazenar os nomes e salrios. e SAL_TABLE, para
a. b. c. d.
Como cada nome e salrio recuperado dentro do loop, armazene eles nas PL/SQL tables. Fora do loop, transfira os nomes e salrios das PL/SQL tables para a tabela TOP_DOGS. Remova as linhas da tabela TOP_DOGS e teste o exerccio. SQL> DELETE 2 FROM top_dogs;
A-60
Funes Bsicas
SET VERIFY OFF ACCEPT p_empno PROMPT 'Please enter the employee number: ' DECLARE TYPE ename_table_type IS TABLE OF VARCHAR2(10) INDEX BY BINARY_INTEGER; TYPE sal_table_type IS TABLE OF NUMBER(7,2) INDEX BY BINARY_INTEGER; v_empno emp.empno%TYPE := &p_empno; v_ename emp.ename%TYPE; v_sal emp.sal%TYPE; ename_table ename_table_type; sal_table sal_table_type; i BINARY_INTEGER := 0; BEGIN DELETE FROM top_dogs; SELECT ename, sal INTO v_ename, v_sal FROM emp WHERE empno = &p_empno; ename_table(i) := v_ename; sal_table(i) := v_sal; INSERT INTO top_dogs (name, salary) VALUES (ename_table(i), sal_table(i)); COMMIT; END; / SET VERIFY ON SQL> START e20q2.sql SQL> SELECT * 2 FROM top_dogs;
A-61
Funes Bsicas
Solues Exerccios 21
1. a. b. c. d. e. Crie um bloco PL/SQL que determine os empregados com os maiores salrios. Receba um nmero n atravs de um parmetro de substituio do SQL*Plus. Em um loop, obtenha os nomes e salrios dos n empregados com os maiores salrios da tabela EMP. Armazena os nomes e salrios na tabela TOP_DOGS. Assuma que dois empregados no possuem o mesmo salrio. Teste uma variedade de casos especiais, como n = 0 ou n maior que o nmero de empregados da tabela EMP. Remova as linhas da tabela TOP_DOGS aps cada teste.
A-62
Funes Bsicas
ACCEPT p_num PROMPT 'Please enter the number of top money makers: ' DECLARE v_num NUMBER(3) := &p_num; v_ename emp.ename%TYPE; v_sal emp.sal%TYPE; CURSOR emp_cursor IS SELECT ename, sal FROM emp WHERE sal IS NOT NULL ORDER BY sal DESC; BEGIN OPEN emp_cursor; FETCH emp_cursor INTO v_ename, v_sal; WHILE emp_cursor%ROWCOUNT <= v_num AND emp_cursor%FOUND LOOP INSERT INTO top_dogs (name, salary) VALUES (v_ename, v_sal); FETCH emp_cursor INTO v_ename, v_sal; END LOOP; CLOSE emp_cursor; COMMIT; END; / SQL> DELETE 2 FROM top_dogs; SQL> START e21q1.sql SQL> SELECT * 2 FROM top_dogs;
2.
Considere o caso onde vrios empregados possuem o mesmo salrio. Se uma pessoa listada, ento todas as pessoas que possuem o mesmo salrio devem tambm ser listadas. Por exemplo, se o usurio fornecer o valor 2 para n, ento KING, FORD e SCOTT devem ser exibidos. Se o usurio fornecer o valor 3, ento KING, FORD, SCOTT e JONES devem ser exibidos. Remova todas as linhas da tabela TOP_DOGS e teste o exerccio.
a. b. c.
A-63
Funes Bsicas
ACCEPT p_num PROMPT 'Please ' DECLARE v_num v_ename v_current_sal v_last_sal
enter the number of top money makers: NUMBER(3) := &p_num; emp.ename%TYPE; emp.sal%TYPE; emp.sal%TYPE := -1;
CURSOR emp_cursor IS SELECT ename, sal FROM emp WHERE sal IS NOT NULL ORDER BY sal DESC; BEGIN OPEN emp_cursor; FETCH emp_cursor INTO v_ename, v_current_sal; WHILE (emp_cursor%ROWCOUNT <= v_num OR v_current_sal = v_last_sal) AND emp_cursor%FOUND LOOP INSERT INTO top_dogs (name, salary) VALUES (v_ename, v_current_sal); v_last_sal := v_current_sal; FETCH emp_cursor INTO v_ename, v_current_sal; END LOOP; CLOSE emp_cursor; COMMIT; END; / SQL> DELETE 2 FROM top_dogs; SQL> START e21q2.sql SQL> SELECT * 2 FROM top_dogs;
A-64
Funes Bsicas
Solues Exerccios 22
1. Escreva uma consulta para recuperar todos os departamentos e empregados em cada departamento. Insira o resultado na tabela MESSAGES. Utilize um cursor para recuperar o nmero do departamento e passe o nmero do departamento para um cursor recuperar os empregados deste departamento.
dept.deptno%TYPE; VARCHAR2(50);
CURSOR dept_cursor IS SELECT deptno FROM dept ORDER BY deptno; CURSOR emp_cursor(v_deptno NUMBER) IS SELECT ename||' Department '||TO_CHAR(deptno) FROM emp WHERE deptno = v_deptno; BEGIN OPEN dept_cursor; LOOP FETCH dept_cursor INTO v_current_deptno; EXIT WHEN dept_cursor%NOTFOUND; IF emp_cursor%ISOPEN THEN CLOSE emp_cursor; END IF; OPEN emp_cursor (v_current_deptno); LOOP FETCH emp_cursor INTO v_emp; EXIT WHEN emp_cursor%NOTFOUND; INSERT INTO messages (results) VALUES (v_emp); END LOOP; CLOSE emp_cursor; END LOOP; CLOSE dept_cursor; COMMIT; END; / SQL> START e22q1.sql SQL> SELECT * 2 FROM messages;
3.
Modifique o arquivo e19q5.sql para incorporar as funcionalidades de FOR UPDATE e WHERE CURRENT OF no processamento do cursor.
A-65
Funes Bsicas
SET VERIFY OFF ACCEPT p_empno PROMPT 'Please enter the employee number: ' DECLARE v_empno emp.empno%TYPE := &p_empno; v_asterisk emp.stars%TYPE := NULL; CURSOR emp_cursor IS SELECT empno, NVL(ROUND(sal/100), 0) sal FROM emp WHERE empno = v_empno FOR UPDATE; BEGIN FOR emp_record IN emp_cursor LOOP FOR i IN 1..emp_record.sal LOOP v_asterisk := v_asterisk ||'*'; END LOOP; UPDATE emp SET stars = v_asterisk WHERE CURRENT OF emp_cursor; v_asterisk := NULL; END LOOP; COMMIT; END; / SET VERIFY ON SQL> START e22q2.sql SQL> SELECT empno, sal, stars 2 FROM emp 3 WHERE empno IN (7844, 7900, 8000);
A-66