Sei sulla pagina 1di 597

Introduo ao Oracle: SQL e PL/SQL

Volume I

OR8i

Abril/2000

Introduo ao Oracle: SQL e PL/SQL

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

2. Executando Comandos SQL Bsicos.....................................................................1


Objetivos.......................................................................................................................................2 Caractersticas do Comando SQL SELECT.................................................................................3 Comando SELECT Bsico...........................................................................................................4 Escrevendo Comandos SQL.........................................................................................................5 Selecionando todas as Colunas.....................................................................................................6 Selecionando Colunas Especficas................................................................................................7 Padres de Cabealho de Colunas................................................................................................8 Expresses Aritmticas.................................................................................................................9 Utilizando Operadores Aritmticos............................................................................................10 Precedncia dos Operadores.......................................................................................................11 Utilizando Parnteses..................................................................................................................12 Definindo um Valor Nulo...........................................................................................................13 Valores Nulos em Expresses Aritmticas.................................................................................14 Definindo um Alias de Coluna...................................................................................................15 Utilizando Alias de Colunas.......................................................................................................16 Operador de Concatenao.........................................................................................................17 Strings de Caracteres Literais.....................................................................................................18 Linhas Duplicadas.......................................................................................................................20 Eliminando Linhas Duplicadas...................................................................................................21 Interao entre SQL e SQL*Plus................................................................................................22 Viso Geral do SQL*Plus...........................................................................................................24
DBC Database Company I

Introduo ao Oracle: SQL e PL/SQL

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

3. Restringindo e Ordenando Dados.........................................................................1


Objetivos.......................................................................................................................................2 Limitando Linhas Utilizando uma Seleo...................................................................................3 Limitando as Linhas Selecionadas................................................................................................4 Utilizando a Clusula WHERE.....................................................................................................5 Strings de Caractere e Datas.........................................................................................................6 Operadores de Comparao..........................................................................................................7 Utilizando os Operadores de Comparao....................................................................................8 Outros Operadores de Comparao..............................................................................................9 Operador BETWEEN.................................................................................................................10 Operador IN................................................................................................................................11 Operador LIKE..........................................................................................................................12 Operador IS NULL.....................................................................................................................14 Operadores Lgicos....................................................................................................................15 Operador AND............................................................................................................................16 Operador OR...............................................................................................................................17 Operador NOT............................................................................................................................18 Regras de Precedncia................................................................................................................19 Clusula ORDER BY.................................................................................................................21 Classificando em Ordem Descendente.......................................................................................22 Ordenando pelo Alias de Coluna................................................................................................23 Ordenando por Mltiplas Colunas..............................................................................................24 Exerccios 3..............................................................................................................................25

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

Introduo ao Oracle: SQL e PL/SQL

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

5. Exibindo Dados a Partir de Mltiplas Tabelas....................................................1


Objetivos.......................................................................................................................................2 Obtendo Dados a Partir de Mltiplas Tabelas..............................................................................3 O que um Join?..........................................................................................................................4 Produto Cartesiano........................................................................................................................5 Gerando um Produto Cartesiano...................................................................................................6 Tipos de Joins...............................................................................................................................7 O que um Equijoin?...................................................................................................................8 Recuperando Registros com Equijoins.........................................................................................9 Qualificando Nomes de Colunas Ambguos...............................................................................10 Condies Adicionais de Pesquisa com o Operador AND.........................................................11 Utilizando Alias de Tabela.........................................................................................................12 Relacionando mais de Duas Tabelas..........................................................................................13 Non-Equijoins.............................................................................................................................14 Recuperando Registros com Non-Equijoins...............................................................................15 Outer Joins..................................................................................................................................16 Utilizando Outer Joins................................................................................................................18 Self Joins.....................................................................................................................................19 Relacionando uma Tabela com Ela Mesma................................................................................20 Exerccios 5..............................................................................................................................21

6. Agregando Dados Utilizando Funes de Grupo.................................................1


Objetivos.......................................................................................................................................2 O que so Funes de Grupo?......................................................................................................3 Tipos de Funes de Grupo..........................................................................................................4 Utilizando Funes de Grupo.......................................................................................................5 Utilizando as Funes AVG e SUM.............................................................................................6 Utilizando as Funes MIN e MAX.............................................................................................7 Utilizando a Funo COUNT.......................................................................................................8 Funes de Grupo e Valores Nulos............................................................................................11 Utilizando a Funo NVL com Funes de Grupo.....................................................................12 Criando Grupos de Dados...........................................................................................................13 Criando Grupos de Dados: Clusula GROUP BY......................................................................14 Utilizando a Clusula GROUP BY.............................................................................................15 Agrupando por Mais de Uma Coluna.........................................................................................17
DBC Database Company III

Introduo ao Oracle: SQL e PL/SQL

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

9. Produzindo Resultados mais Legveis com SQL*Plus.........................................1


Objetivos.......................................................................................................................................2 Relatrios Interativos....................................................................................................................3 Utilizando Variveis de Substituio com (&).............................................................................4 Utilizando o Comando SET VERIFY..........................................................................................5 Valores Caractere e Data com Variveis de Substituio.............................................................6 Especificando Nomes de Colunas, Expresses e Textos em Tempo de Execuo......................................................................................................................7 Utilizando Variveis de Substituio com (&&)..........................................................................9 Definindo Variveis de Usurio.................................................................................................10 O Comando ACCEPT.................................................................................................................11
DBC Database Company IV

Introduo ao Oracle: SQL e PL/SQL

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

10. Manipulando Dados..............................................................................................1


Objetivos.......................................................................................................................................2 Linguagem de Manipulao de Dados..........................................................................................3 Inserindo uma Nova Linha em uma Tabela..................................................................................4 Comando INSERT........................................................................................................................5 Inserindo Novas Linhas................................................................................................................6 Inserindo Linhas com Valores Nulos............................................................................................7 Inserindo Valores Especiais..........................................................................................................8 Inserindo Valores de Data Especficos.........................................................................................9 Inserindo Valores Utilizando Variveis de Substituio............................................................10 Criando um Script com Prompts Customizados.........................................................................11 Copiando Linhas a Partir de Outra Tabela..................................................................................12 Alterando Dados em uma Tabela................................................................................................13 Comando UPDATE....................................................................................................................14 Alterando Linhas em uma Tabela...............................................................................................15 Atualizando com Subconsultas Multiple-Column......................................................................16 Atualizando Linhas com Valores de Outra Tabela.....................................................................17 Atualizando Linhas: Erro de Constraint de Integridade.............................................................18 Removendo uma Linha de uma Tabela......................................................................................19 Comando DELETE.....................................................................................................................20 Removendo Linhas de uma Tabela.............................................................................................21 Removendo Linhas com Base nos Valores de Outra Tabela......................................................22 Removendo Linhas: Erro de Constraint de Integridade..............................................................23 Transaes de Banco de Dados..................................................................................................24 Vantagens do COMMIT e ROLLBACK....................................................................................25 Controlando Transaes.............................................................................................................26 Processamento Implcito de Transaes.....................................................................................27 Situao dos Dados Antes do COMMIT ou ROLLBACK.........................................................28 Situao dos Dados Aps o COMMIT.......................................................................................29 Efetivando os Dados...................................................................................................................30 Situao dos Dados Aps o ROLLBACK..................................................................................31 Desfazendo as Alteraes At uma Marca.................................................................................32 Rollback a Nvel de Comando....................................................................................................33 Leitura Consistente.....................................................................................................................34 Implementao de Leitura Consistente.......................................................................................35
DBC Database Company V

Introduo ao Oracle: SQL e PL/SQL

Lock............................................................................................................................................36 Exerccios 10............................................................................................................................37

11. Criando e Gerenciando Tabelas..........................................................................1


Objetivos.......................................................................................................................................2 Objetos do Banco de Dados..........................................................................................................3 Convenes de Nomes..................................................................................................................4 Comando CREATE TABLE........................................................................................................5 Referenciando Tabelas de Outro Usurio.....................................................................................6 Opo DEFAULT.........................................................................................................................7 Criando Tabelas............................................................................................................................8 Consultando o Dicionrio de Dados.............................................................................................9 Tipos de Dados...........................................................................................................................10 Criando uma Tabela Utilizando uma Subconsulta.....................................................................11 Comando ALTER TABLE.........................................................................................................13 Adicionando uma Coluna...........................................................................................................14 Modificando uma Coluna...........................................................................................................15 Removendo uma Tabela.............................................................................................................16 Modificando o Nome de um Objeto...........................................................................................17 Truncando uma Tabela...............................................................................................................18 Adicionando Comentrios para Tabelas.....................................................................................19 Exerccios 11............................................................................................................................20

12. Implementando Constraints.................................................................................1


Objetivos.......................................................................................................................................2 O Que so Constraints?.................................................................................................................3 Diretrizes para Constraints............................................................................................................4 Definindo Constraints...................................................................................................................5 Constraint NOT NULL.................................................................................................................7 Constraint UNIQUE Key..............................................................................................................8 Constraint PRIMARY KEY.........................................................................................................9 Constraint FOREIGN KEY........................................................................................................10 Palavras Chave de Constraints FOREIGN KEY........................................................................11 Constraint CHECK.....................................................................................................................12 Adicionando uma Constraint......................................................................................................13 Removendo uma Constraint........................................................................................................14 Desabilitando Constraints...........................................................................................................15 Habilitando Constraints..............................................................................................................16 Visualizando Constraints............................................................................................................17 Visualizando as Colunas Associadas com Constraints...............................................................18 Exerccios 12............................................................................................................................19

13. Criando Vises.......................................................................................................1


Objetivos.......................................................................................................................................2 Objetos do Banco de Dados..........................................................................................................3 O que uma Viso?......................................................................................................................4 Porqu Utilizar Vises?................................................................................................................5 Vises Simples e Vises Complexas............................................................................................6 Criando uma Viso.......................................................................................................................7 Recuperando Dados de uma Viso...............................................................................................9
DBC Database Company VI

Introduo ao Oracle: SQL e PL/SQL

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

14. Outros Objetos do Banco de Dados.....................................................................1


Objetivos.......................................................................................................................................2 Objetos do Banco de Dados..........................................................................................................3 O que uma Sequence?................................................................................................................4 Comando CREATE SEQUENCE................................................................................................5 Criando uma Sequence.................................................................................................................6 Confirmando Sequences...............................................................................................................7 Pseudocolunas NEXTVAL e CURRVAL....................................................................................8 Utilizando uma Sequence.............................................................................................................9 Modificando uma Sequence........................................................................................................11 Diretrizes para Modificar uma Sequence....................................................................................12 Removendo uma Sequence.........................................................................................................13 O que um ndice?.....................................................................................................................14 Como os ndices so Criados?....................................................................................................15 Criando um ndice......................................................................................................................16 Diretrizes para a Criao de ndices...........................................................................................17 Confirmando ndices...................................................................................................................18 Removendo um ndice................................................................................................................19 Sinnimos...................................................................................................................................20 Criando e Removendo Sinnimos..............................................................................................21 Exerccios 14............................................................................................................................22

15. Controlando o Acesso dos Usurios....................................................................1


Objetivos.......................................................................................................................................2 Controlando o Acesso dos Usurios.............................................................................................3 Privilgios.....................................................................................................................................4 Privilgios de Sistema...................................................................................................................5 Criando Usurios..........................................................................................................................6 Privilgios de Sistema do Usurio................................................................................................7 Concedendo Privilgios de Sistema..............................................................................................8 O que uma Role?........................................................................................................................9 Criando e Concedendo Privilgios para uma Role.....................................................................10 Modificando Senhas...................................................................................................................11 Privilgios de Objeto..................................................................................................................12 Concedendo Privilgios de Objeto.............................................................................................14 Utilizando as Opes WITH GRANT OPTION e PUBLIC......................................................15 Confirmando Privilgios Concedidos.........................................................................................16 Como Revogar Privilgios de Objeto.........................................................................................17 Revogando Privilgios de Objeto...............................................................................................18 Exerccios 15............................................................................................................................19
DBC Database Company VII

Introduo ao Oracle: SQL e PL/SQL

16. Declarando Variveis............................................................................................1


Objetivos.......................................................................................................................................2 Estrutura de um Bloco PL/SQL....................................................................................................3 Tipos de Blocos............................................................................................................................5 Construes de Programas............................................................................................................6 Utilizao de Variveis.................................................................................................................7 Tratando Variveis em PL/SQL...................................................................................................8 Tipos de Variveis........................................................................................................................9 Declarando Variveis PL/SQL...................................................................................................10 Regras de Nomenclatura.............................................................................................................12 Atribuindo Valores para Variveis.............................................................................................13 Utilizando Variveis e Palavras Chaves.....................................................................................14 Tipos de Dados Escalares...........................................................................................................15 Declarao de Variveis Escalares.............................................................................................16 Atributo %TYPE.........................................................................................................................17 Declarando Variveis com o Atributo %TYPE..........................................................................18 Declarando Variveis BOOLEAN..............................................................................................19 Tipos de Dados Compostos........................................................................................................20 Variveis com Tipos de Dados LOB..........................................................................................21 Variveis Tipo Bind....................................................................................................................22 Referenciando Variveis No PL/SQL.......................................................................................23 Exerccios 16............................................................................................................................24

17. Escrevendo Comandos Executveis....................................................................1


Objetivos.......................................................................................................................................2 Sintaxe e Diretrizes de um Bloco PL/SQL...................................................................................3 Comentando o Cdigo..................................................................................................................5 Funes SQL em PL/SQL............................................................................................................6 Funes PL/SQL...........................................................................................................................7 Converso de Tipos de Dados......................................................................................................8 Blocos Aninhados e Escopo de Variveis....................................................................................9 Operadores em PL/SQL..............................................................................................................10 Utilizando Variveis Bind..........................................................................................................11 Diretrizes de Programao..........................................................................................................12 Convenes de Nomenclatura....................................................................................................13 Identando o Cdigo.....................................................................................................................14 Determine o Escopo das Variveis.............................................................................................15 Exerccios 17............................................................................................................................16

18. Interagindo com o Servidor Oracle.....................................................................1


Objetivos.......................................................................................................................................2 Comandos SQL em PL/SQL.........................................................................................................3 Comandos SELECT em PL/SQL.................................................................................................4 Recuperando Dados em PL/SQL..................................................................................................6 Manipulando Dados Utilizando PL/SQL......................................................................................8 Inserindo Dados............................................................................................................................9 Atualizando Dados......................................................................................................................10 Removendo Dados......................................................................................................................11 Convenes de Nomenclatura....................................................................................................12 Comandos COMMIT e ROLLBACK.........................................................................................13
DBC Database Company VIII

Introduo ao Oracle: SQL e PL/SQL

Cursor SQL.................................................................................................................................14 Atributos do Cursor SQL............................................................................................................15 Exerccios 18............................................................................................................................16

19. Escrevendo Estruturas de Controle....................................................................1


Objetivos.......................................................................................................................................2 Controlando o Fluxo de Execuo PL/SQL.................................................................................3 Comandos IF.................................................................................................................................4 Comandos IF Simples...................................................................................................................5 Fluxo de Execuo do Comando IF-THEN-ELSE.......................................................................6 Comandos IF-THEN-ELSE..........................................................................................................7 Fluxo de Execuo do Comando IF-THEN-ELSIF......................................................................8 Comandos IF-THEN-ELSIF.........................................................................................................9 Construindo Condies Lgicas.................................................................................................10 Tabelas de Lgica.......................................................................................................................11 Condies Boleanas...................................................................................................................12 Controle de Repeties: Comandos de LOOP............................................................................13 Loop Bsico................................................................................................................................14 FOR Loop...................................................................................................................................15 WHILE Loop..............................................................................................................................17 Loops Aninhados e Labels..........................................................................................................18 Exerccios 19............................................................................................................................19

20. Trabalhando com Tipos de Dados Compostos...................................................1


Objetivos.......................................................................................................................................2 Tipos de Dados Compostos..........................................................................................................3 PL/SQL Records...........................................................................................................................4 Criando um PL/SQL Record.........................................................................................................5 Estrutura de um PL/SQL Record..................................................................................................7 Atributo %ROWTYPE.................................................................................................................8 PL/SQL Tables...........................................................................................................................10 Criando uma PL/SQL Table.......................................................................................................11 Estrutura de uma PL/SQL Table.................................................................................................13 Criando uma PL/SQL Table.......................................................................................................14 PL/SQL Table com Registros.....................................................................................................15 Utilizando Mtodos de PL/SQL Tables......................................................................................16 Exerccios 20............................................................................................................................17

21. Escrevendo Cursores Explcitos..........................................................................1


Objetivos.......................................................................................................................................2 Cursores........................................................................................................................................3 Cursores Explcitos.......................................................................................................................4 Controlando Cursores Explcitos..................................................................................................5 Declarando o Cursor.....................................................................................................................7 Abrindo um Cursor.......................................................................................................................8 Recuperando Dados do Cursor.....................................................................................................9 Fechando um Cursor...................................................................................................................11 Atributos de Cursores Explcitos................................................................................................12 Controlando Mltiplos Fetch......................................................................................................13 Atributo %ISOPEN.....................................................................................................................14
DBC Database Company IX

Introduo ao Oracle: SQL e PL/SQL

Atributos %NOTFOUND e %ROWCOUNT.............................................................................15 Cursores e Registros...................................................................................................................16 Cursor FOR Loop.......................................................................................................................17 Cursor FOR Loop Utilizando Subconsultas...............................................................................19 Exerccios 21............................................................................................................................20

22. Conceitos Avanados de Cursores Explcitos.....................................................1


Objetivos.......................................................................................................................................2 Cursores com Parmetros.............................................................................................................3 Clusula FOR UPDATE...............................................................................................................5 Clusula WHERE CURRENT OF...............................................................................................6 Cursores com Subconsultas..........................................................................................................7 Exerccios 22..............................................................................................................................8

23. Tratamento de Excees.......................................................................................1


Objetivos.......................................................................................................................................2 Tratando Excees com PL/SQL..................................................................................................3 Tratamento de Excees...............................................................................................................4 Tipos de Excees........................................................................................................................5 Tratando Excees........................................................................................................................6 Diretrizes para o Tratamento de Excees...................................................................................7 Tratando Errors Pr-Definidos do Servidor Oracle......................................................................8 Excees Pr-Definidas................................................................................................................9 Tratando Erros No Pr-Definidos do Servidor Oracle..............................................................10

Apndice A Solues dos Exerccios......................................................................1


Solues Exerccios 2................................................................................................................2 Solues Exerccios 3................................................................................................................5 Solues Exerccios 4................................................................................................................9 Solues Exerccios 5..............................................................................................................13 Solues Exerccios 6..............................................................................................................17 Solues Exerccios 7..............................................................................................................20 Solues Exerccios 8..............................................................................................................23 Solues Exerccios 9..............................................................................................................25 Solues Exerccios 10............................................................................................................29 Solues Exerccios 11............................................................................................................33 Solues Exerccios 12............................................................................................................37 Solues Exerccios 13............................................................................................................38 Solues Exerccios 14............................................................................................................41 Solues Exerccios 15............................................................................................................43 Solues Exerccios 16............................................................................................................46 Solues Exerccios 17............................................................................................................49 Solues Exerccios 18............................................................................................................53 Solues Exerccios 19............................................................................................................56 Solues Exerccios 20............................................................................................................60 Solues Exerccios 21............................................................................................................62 Solues Exerccios 22............................................................................................................65

DBC Database Company

Introduo ao Oracle: SQL e PL/SQL

1. Introduo

On Targget Treinamento e Consultoria

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

On Targget Treinamento e Consultoria

Funes Bsicas

Ciclo de Vida do Desenvolvimento de Sistemas

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.

On Targget Treinamento e Consultoria

Funes Bsicas

Armazenamento de Dados em Diferentes Mdias

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.

On Targget Treinamento e Consultoria

Funes Bsicas

Conceito de Banco de Dados Relacional


Modelo Relacional
Os princpios do modelo relacional foram esboados pela primeira vez pelo Dr. E. F. Codd por volta de junho de 1970 em um paper intitulado Um Modelo Relacional de Dados para Grandes Bancos de Dados Compartilhados. Neste paper, o Dr. Codd props o modelo relacional para sistemas de banco de dados. Os modelos mais populares usados naquele momento eram hierrquicos e de rede, ou at mesmo arquivo de dados com estruturas simples. Sistemas de gerenciamento de banco de dados relacionais (RDBMS) logo tornaram-se muito populares, especialmente devido a sua facilidade de uso e flexibilidade na estrutura. Alm disso, haviam vrios vendedores inovadores, como a Oracle que completou o RDBMS com um conjunto poderoso de ferramentas para o desenvolvimento de aplicaes e produtos para o usurio, provendo uma soluo total.

Componentes do Modelo de Relacional


Conjunto de objetos ou relaes que armazenam os dados Conjunto de operadores que podem agir nas relaes para produzir outras relaes Integridade de dados para preciso e consistncia

On Targget Treinamento e Consultoria

Funes Bsicas

Definio de Banco de Dados Relacional

Banco de Dados Relacional


Um banco de dados relacional utiliza relaes ou tabelas bi-dimensionais para armazenar informaes. Por exemplo, voc poderia querer armazenar informaes sobre todos os empregados de sua companhia. Em um banco de dados relacional, voc cria vrias tabelas para armazenar pedaos diferentes de informao sobre seus empregados, como uma tabela de empregado, uma tabela de departamento, e uma tabela de salrio.

On Targget Treinamento e Consultoria

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.

Propsito dos Modelos


Modelos ajudam a disseminar os conceitos nas mentes das pessoas. Eles podem ser utilizados para os seguintes propsitos: Comunicar Categorizar Descrever Especificar Investigar Evoluir Analisar Imitar O objetivo produzir um modelo que rena vrios destes propsitos e que possa ao mesmo tempo ser entendido por um usurio final e conter detalhes suficientes para um desenvolvedor construir um sistema de banco de dados.

On Targget Treinamento e Consultoria

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.

On Targget Treinamento e Consultoria

Funes Bsicas

Convenes do Modelo Entidade-Relacionamento

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.

On Targget Treinamento e Consultoria

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: (#)

On Targget Treinamento e Consultoria

10

Funes Bsicas

Terminologia Utilizada em Bancos de Dados Relacionais

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

Relacionando Mltiplas Tabelas

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.

Diretrizes para Chaves Primrias e Chaves Estrangeiras


Nenhum valor duplicado permitido em uma chave primria. Geralmente, chaves primrias no podem ser alteradas. Chaves estrangeiras esto baseadas em valores de dados e so puramente lgicas, no sendo fsicas ou ponteiros. Um valor de chave estrangeira tem que existir como um valor de chave primria ou chave nica, ou ento ser NULO.

On Targget Treinamento e Consultoria

12

Funes Bsicas

Propriedades de um Banco de Dados Relacional


Em um banco de dados relacional, voc no especifica o caminho de acesso para as tabelas, e tambm no necessita saber como os dados esto organizados fisicamente. Para acessar o banco de dados, voc executa comandos SQL (structured query language), que a linguagem padro para operao sobre bancos de dados relacionais, definida pelo American National Standards Institute (ANSI). Esta linguagem possui um grande conjunto de operadores para dividir e combinar as relaes. O banco de dados pode ser modificado utilizando-se comandos SQL.

On Targget Treinamento e Consultoria

13

Funes Bsicas

Comunicando com um RDBMS utilizando SQL

Structured Query Language


A linguagem SQL lhe permite comunicar com o servidor e possui as seguintes vantagens: Eficincia. Fcil de aprender e utilizar. Completa funcionalidade. A linguagem SQL permite definir, recuperar, e manipular dados em tabelas.

On Targget Treinamento e Consultoria

14

Funes Bsicas

Sistema de Gerenciamento de Banco de Dados Relacional

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.

On Targget Treinamento e Consultoria

15

Funes Bsicas

Oracle8i: Sistema de Gerenciamento de Banco de Dados Objeto Relacional


Oracle8i
Primeiro banco de dados de objeto desenvolvido pela Oracle. Estende as capacidades do modelo de dados do Oracle7 para suportar o novo modelo objeto relacional. O Oracle8i provem uma nova fora que traz a programao orientada a objeto, tipos de dados complexos, objetos de negcio complexos, e total compatibilidade com o mundo relacional. Oracle8i implementa as caractersticas do Oracle7 de vrias formas. Inclui novas tcnicas para melhorar o desempenho e a funcionalidade do processo transacional online (OLTP) em aplicaes, como um melhor compartilhamento das estruturas de dados em tempo de execuo, buffer caches maiores, e constraints do tipo deferrable. Aplicaes de data warehouse podem beneficiar-se de melhoramentos na execuo paralela de operaes de insero, atualizao, e deleo; particionamento; e otimizao de consultas em paralelo. Operando dentro do conceito NCA (Network Computing Architecture), o Oracle8i suporta aplicaes cliente-servidor e baseadas na web. Oracle8i suporta milhares de usurios simultneos, at 512 petabytes, e pode administrar qualquer tipo de dado, incluindo textos, espaciais, imagens, som, vdeo, alm de dados estruturados tradicionais.

On Targget Treinamento e Consultoria

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

On Targget Treinamento e Consultoria

17

Funes Bsicas

Utilizando um Modelo de Objeto

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.

On Targget Treinamento e Consultoria

18

Funes Bsicas

Caractersticas de Sistemas de Objeto


Sistemas de objeto diferem de sistemas convencionais uma vez que possuem as seguintes caractersticas: Representam a informao como coisas auto-suficientes (objetos). Classificam objetos em tipos de objeto e os organizam em hierarquias tipo treelike onde um tipo de objeto pode ser um tipo especial de outro tipo de objeto (identificando metadado de tipo de objeto). Objetos podem herdar as caractersticas dos seus tipos de objeto (herana). Escondem dados e processos relacionados a cada objeto dentro do prprio objeto (encapsulamento). Isto permite mudanas em componentes especficos sem afetar outros componentes. Conexo com outros objetos. Reconhecem diferentes tipos de coisas e o comportamento esperado delas sem ter que analiz-las. Utiliza a mesma requisio para invocar implementaes diferentes da mesma ao para dois objetos diferentes (polimorfismo).

On Targget Treinamento e Consultoria

19

Funes Bsicas

Soluo Completa Oracle

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)

On Targget Treinamento e Consultoria

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.

On Targget Treinamento e Consultoria

22

Funes Bsicas

Ambiente PL/SQL

PL/SQL Engine e o Servidor Oracle


PL/SQL no um produto isolado da Oracle. uma tecnologia empregada pelo Servidor Oracle e por certas ferramentas da Oracle. Blocos de PL/SQL so passados para o PL/SQL Engine onde so processados, que pode residir dentro da ferramenta ou dentro do Servidor Oracle. O executor (engine) utilizado depende de onde o bloco PL/SQL foi invocado. Quando voc submete blocos PL/SQL a partir de um Pro* program, user-exit, SQL*Plus ou Server Manager, o PL/SQL Engine do Servidor Oracle quem executa o processamento. Ele divide as declaraes SQL dentro do bloco em comandos separados e os envia ao SQL Statement Executor. Isto significa que uma nica transferncia necessria para enviar o bloco a partir da aplicao para o Servidor Oracle, melhorando a desempenho, especialmente em uma rede clienteservidor. Programas armazenados dentro do banco de dados (stored procedures) podem ser referenciados por qualquer aplicao conectada ao Servidor Oracle.

On Targget Treinamento e Consultoria

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.

PL/SQL em Ferramentas Oracle


Muitas ferramentas Oracle, incluindo o Developer/2000, possuem seu prprio PL/SQL Engine, que independente do PL/SQL Engine presente no Servidor Oracle. O engine filtra os comandos SQL e os envia individualmente para o SQL Statement Executor do Servidor Oracle, processando os comandos procedurais restantes no Procedural Statement Executor, que est dentro do PL/SQL Engine. O Procedural Statement Executor processa os dados que so locais aplicao (o que j est dentro do ambiente do cliente, em lugar do banco de dados). Isto reduz o trabalho enviado ao Servidor Oracle e o nmero de cursores de memria necessrios.

On Targget Treinamento e Consultoria

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.

Estrutura dos Blocos PL/SQL


Toda unidade de PL/SQL inclui um ou mais blocos. Estes blocos podem ser completamente separados ou aninhados um dentro do outro. As unidades bsicas (procedures, funes e blocos annimos) compe um programa PL/SQL e formam bloco lgicos, que podem conter vrios 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.

On Targget Treinamento e Consultoria

25

Funes Bsicas

Construo de Programas PL/SQL

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.

Modularizao do Desenvolvimento de Programas


Agrupe logicamente comandos relacionados dentro de blocos. Aninhe sub-blocos dentro de blocos maiores para construir programas poderosos. Resolva um problema complexo com um conjunto de mdulos lgicos bem definido e implemente os mdulos com blocos. Coloque cdigos PL/SQL reutilizveis em bibliotecas compartilhadas entre as aplicaes desenvolvidas com as ferramentas do Developer/2000 ou ento armazene-os em um Servidor Oracle para torn-los acessveis para qualquer aplicao que possa interagir com um banco de dados Oracle.

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.

On Targget Treinamento e Consultoria

26

Funes Bsicas

Programe com Estruturas de Controle de Linguagem Procedural


Execute uma seqncia de comandos condicionalmente. Execute uma seqncia de comandos interativamente em um loop. Processe as linhas de uma consulta individualmente atravs do uso de cursores explcitos.

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.

On Targget Treinamento e Consultoria

27

Funes Bsicas

Tabelas Utilizadas no Curso

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.

On Targget Treinamento e Consultoria

28

Introduo ao Oracle: SQL e PL/SQL

2. Executando Comandos SQL Bsicos

On Targget Treinamento e Consultoria

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.

On Targget Treinamento e Consultoria

Funes Bsicas

Caractersticas do Comando SQL SELECT

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.

On Targget Treinamento e Consultoria

Funes Bsicas

Comando SELECT Bsico


SELECT FROM [DISTINCT] {*, column [alias],...} table;

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.

On Targget Treinamento e Consultoria

Funes Bsicas

Escrevendo Comandos SQL


Seguindo regras simples e as diretrizes apresentadas abaixo, voc pode construir comandos vlidos que so tanto fceis de ler quanto de editar: Comandos SQL no fazem distino entre maisculas e minsculas, a menos que especificado. Podem ser escritos em uma ou mais linhas. Palavras chaves (keywords) no podem ser divididas em mais de uma linha ou abreviadas. As diferentes clusulas so normalmente separadas em linhas distintas para facilitar a visualizao e edio do comando. Tabulaes e identaes podem ser utilizadas para tornar o cdigo mais legvel. Palavras chaves normalmente so escritas em maisculo, enquanto que as outras palavras, como nomes de tabelas e colunas, so escritas em minsculo. Dentro do SQL*Plus, um comando SQL escrito no prompt de SQL, e as linhas subseqentes so numeradas. Isto chamado de SQL buffer. Somente um comando pode estar no buffer de cada vez.

Executando Comandos SQL


Coloque um ponto-e-vrgula (;) ao trmino da ltima clusula. Coloque uma barra (/) na ltima linha do buffer. Coloque uma barra (/) no prompt de SQL. Execute o comando RUN do SQL*Plus no prompt de SQL.

On Targget Treinamento e Consultoria

Funes Bsicas

Selecionando todas as Colunas


SQL> SELECT 2 FROM * dept;

DEPTNO --------10 20 30 40

DNAME -------------ACCOUNTING RESEARCH SALES OPERATIONS

LOC ------------NEW YORK DALLAS CHICAGO BOSTON

Selecionando todas as Colunas e todas as Linhas


Voc pode exibir todas as colunas de dados de uma tabela colocando um asterisco (*) logo aps a palavra chave SELECT. No exemplo acima, a tabela de departamentos possui trs colunas: DEPTNO, DNAME e LOC. A tabela possui quatro linhas, uma para cada departamento. Voc tambm pode exibir todas as colunas da tabela listando-as depois da palavra chave SELECT. Por exemplo, o seguinte comando SQL, como no exemplo acima, tambm exibe todas as colunas e todas as linhas da tabela DEPT: SQL> SELECT 2 FROM deptno, dname, loc dept;

On Targget Treinamento e Consultoria

Funes Bsicas

Selecionando Colunas Especficas


SQL> SELECT 2 FROM deptno, loc dept;

DEPTNO --------10 20 30 40

LOC ------------NEW YORK DALLAS CHICAGO BOSTON

Selecionando Colunas Especficas e todas as Linhas


Voc pode usar o comando SELECT para exibir colunas especficas da tabela especificando os nomes das colunas, separados por vrgulas. O exemplo acima exibe todos os nmeros e localizaes de departamentos a partir da tabela DEPT. Na clusula SELECT, especifique as colunas que voc quer ver, na ordem na qual voc quer que elas sejam mostradas. Por exemplo, para exibir a localizao antes do nmero do departamento, voc utiliza o seguinte comando: SQL> SELECT 2 FROM loc, deptno dept;

LOC DEPTNO ------------- --------NEW YORK 10 DALLAS 20 CHICAGO 30 BOSTON 40

On Targget Treinamento e Consultoria

Funes Bsicas

Padres de Cabealho de Colunas


Cabealhos e dados de colunas tipo caractere bem como cabealhos e dados de colunas tipo data so alinhados esquerda dentro do tamanho da coluna. Cabealhos e dados de colunas numricas so alinhados direita. SQL> SELECT 2 FROM ename, hiredate, sal emp;

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.

On Targget Treinamento e Consultoria

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.

On Targget Treinamento e Consultoria

Funes Bsicas

Utilizando Operadores Aritmticos


SQL> SELECT 2 FROM ename, sal, sal+300 emp;

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.

On Targget Treinamento e Consultoria

10

Funes Bsicas

Precedncia dos Operadores

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.

On Targget Treinamento e Consultoria

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.

On Targget Treinamento e Consultoria

12

Funes Bsicas

Definindo um Valor Nulo


SQL> SELECT 2 FROM ename, job, comm emp;

ENAME JOB COMM ---------- --------- --------KING PRESIDENT BLAKE MANAGER ... TURNER SALESMAN 0 ... 14 rows selected.

Valores nulos (null values)


Se uma linha no possui valor para uma coluna especfica dito que o valor para esta coluna nulo, ou que ela contm nulo. Um valor nulo um valor que indisponvel, no atribudo, desconhecido, ou inaplicvel. Um valor nulo no o mesmo que zero ou um espao. Zero um nmero, e um espao um caractere. Colunas de qualquer tipo de dado podem conter valores nulos, a menos que a coluna tenha sido definida como NOT NULL ou como PRIMARY KEY (chave primria) quando criada. Na coluna COMM da tabela EMP, voc pode observar que somente um vendedor (SALESMAN) pode ganhar comisso. Outros empregados no devem ganhar comisso. Um valor nulo representa o fato. Turner, que um vendedor, no ganha nenhuma comisso. Observe que a comisso dele zero e no nula.

On Targget Treinamento e Consultoria

13

Funes Bsicas

Valores Nulos em Expresses Aritmticas


SQL> select 2 from 3 WHERE ename NAME, 12*sal+comm emp ename = 'KING';

NAME 12*SAL+COMM ---------- ----------KING

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.

On Targget Treinamento e Consultoria

14

Funes Bsicas

Definindo um Alias de Coluna


Para exibir o resultado de uma consulta, o SQL*Plus normalmente utiliza o nome da coluna selecionada como seu cabealho. Em muitos casos, este ttulo pode no ser descritivo e conseqentemente pode ser difcil de entender. Voc pode mudar o cabealho de uma coluna utilizando um alias (apelido) de coluna. Especifique o alias depois da coluna na lista da clusula SELECT utilizando um espao como separador. Por default, cabealhos baseados em alias aparecem em maisculas. Se o alias possui espaos, caracteres especiais (como # ou $), ou deve diferenciar maisculas e minsculas, coloque o alias entre aspas duplas (" ").

On Targget Treinamento e Consultoria

15

Funes Bsicas

Utilizando Alias de Colunas


SQL> SELECT 2 FROM ename AS name, sal salary emp;

NAME SALARY ------------- --------...

SQL> SELECT 2 3 FROM

ename "Name", sal*12 "Annual Salary" emp;

Name Annual Salary ------------- ------------...

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.

On Targget Treinamento e Consultoria

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.

On Targget Treinamento e Consultoria

17

Funes Bsicas

Strings de Caracteres Literais


Um literal qualquer caractere, expresso ou nmero includos na lista da clusula SELECT que no um nome de coluna ou um alias de coluna. Ele impresso para cada linha retornada. Podem ser includas strings literais de texto no resultado da consulta e podem ser tratadas como uma coluna da lista do SELECT. Literais do tipo data e caractere devem ser includas dentro de aspas simples (' '), enquanto que literais numricas no necessitam de aspas. SQL> SELECT job 2 3 FROM ename || ' ' || 'is a' || ' ' || AS "Employee Details" emp;

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;

On Targget Treinamento e Consultoria

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.

On Targget Treinamento e Consultoria

19

Funes Bsicas

Linhas Duplicadas
SQL> SELECT 2 FROM deptno emp;

DEPTNO --------10 30 10 20 ... 14 rows selected.

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.

On Targget Treinamento e Consultoria

20

Funes Bsicas

Eliminando Linhas Duplicadas


SQL> SELECT 2 FROM DISTINCT deptno emp;

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;

DEPTNO -----10 10 10 20 ... 9 rows

JOB --------CLERK MANAGER PRESIDENT ANALYST selected.

On Targget Treinamento e Consultoria

21

Funes Bsicas

Interao entre SQL e SQL*Plus

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.

On Targget Treinamento e Consultoria

22

Funes Bsicas

A tabela seguinte compara SQL e SQL*Plus:


SQL uma linguagem para comunicao com o Servidor Oracle para acessar os dados Est baseado no padro SQL ANSI (American National Standards Institute) Manipula dados e a definio de tabelas no banco de dados So entrados no SQL buffer em uma ou mais linhas No possui um caractere de continuao No pode ser abreviado Utiliza um caractere de terminao para executar o comando imediatamente Utiliza funes para executar algumas formataes SQL*Plus Reconhece comandos SQL e os envia ao Servidor Interface proprietria Oracle para executar comandos SQL No permite a manipulao de valores no banco de dados So entrados em uma linha de cada vez; no so armazenados no SQL buffer Possui um hfen (-) como caractere de continuao se o comando maior que uma linha Pode ser abreviado No requer caracteres de terminao; os comandos so executados imediatamente Utiliza comandos para formatar os dados

On Targget Treinamento e Consultoria

23

Funes Bsicas

Viso Geral do SQL*Plus


Conecte ao Servidor Oracle com o SQL*Plus. Descreva a estrutura de tabelas. Edite comandos SQL. Execute SQL a partir do SQL*Plus. Salve comandos SQL para arquivos e adicione comandos SQL para arquivos j existentes. Execute arquivos salvos. Carregue comandos a partir de um arquivo para o buffer para editar.

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

On Targget Treinamento e Consultoria

24

Funes Bsicas

Conectando com o SQL*Plus

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.

On Targget Treinamento e Consultoria

25

Funes Bsicas

Exibindo a Estrutura de Tabelas


DESC[RIBE] tablename

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.

SQL> DESCRIBE dept

Name Null? ----------------- -------DEPTNO NOT NULL DNAME LOC

Type -----------NUMBER(2) VARCHAR2(14) VARCHAR2(13)

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>

Os tipos de dados esto descritos na tabela seguinte:


Tipo de Dado NUMBER(p,s) VARCHAR2(s) DATE CHAR(s)

On Targget Treinamento e Consultoria

26

Funes Bsicas

Comandos de Edio do SQL*Plus


Comandos SQL*Plus so inseridos uma linha de cada vez e no so armazenados no SQL buffer:
Comando A[PPEND] text C[HANGE] / old / new C[HANGE] / text / CL[EAR] BUFF[ER] DEL I[NPU T] I[NPUT] text L[IST] L[IST] n L[IST] m n R[UN] n n text 0 text Descrio Adiciona o texto (text) no final da linha corrente Modifica o texto (old) para o novo (new) na linha corrente Remove o texto (text) da linha corrente Remove todas as linhas do SQL buffer Remove a linha corrente Insere um nmero indefinido de linhas Insere uma linha com o texto (text) Lista todas as linhas do SQL buffer Lista uma linha (especificada por n) Lista um intervalo de linhas (de m at n) Exibe e executa o comando SQL corrente no buffer Especifica qual linha deve tornar-se a corrente Substitui a linha (n) com o texto (text) Insere uma linha antes da linha 1

On Targget Treinamento e Consultoria

27

Funes Bsicas

Comandos de Arquivo do SQL*Plus


Comandos SQL comunicam com o Servidor Oracle. Comandos SQL*Plus controlam o ambiente, formatam o resultado das consultas e gerenciam arquivos. Voc pode utilizar os comandos identificados na tabela seguinte:
Comando SAV[E] filename[.ext] [REPLACE | APPEND] GET filename[.ext] STA[RT] filename[.ext] @filename ED[IT] ED[IT] [filename[.ext]] SPO[OL] [filename[.ext] | OFF | OUT] EXIT Descrio Salva o contedo atual do SQL buffer para um arquivo. Utilize a clusula APPEND para adicionar ao arquivo existente; utilize a clusula REPLACE para sobrescrever o arquivo existente. A extenso default .sql. Escreve o contedo de um arquivo previamente salvo para o SQL buffer. A extenso default para o arquivo .sql. Executa um arquivo de comandos previamente salvo. Executa um arquivo de comandos previamente salvo. Invoca o editor e salva o contedo do buffer para um arquivo chamado afiedt.buf. Invoca o editor para editar o contedo de um arquivo salvo. Armazena o resultado de consultas em um arquivo. OFF fecha o arquivo de spool. OUT fecha o arquivo de spool enviando-o para a impressora do sistema. Encerra o SQL*Plus

On Targget Treinamento e Consultoria

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)

On Targget Treinamento e Consultoria

29

Funes Bsicas

DEPTNO -----10 20 30 40

DNAME ---------ACCOUNTING RESEARCH SALES OPERATIONS

LOC ------------NEW YORK DALLAS CHICAGO BOSTON

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.

On Targget Treinamento e Consultoria

30

Funes Bsicas

JOB ----------ANALYST CLERK MANAGER PRESIDENT SALESMAN

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.

On Targget Treinamento e Consultoria

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.

On Targget Treinamento e Consultoria

32

Introduo ao Oracle: SQL e PL/SQL

3. Restringindo e Ordenando Dados

On Targget Treinamento e Consultoria

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.

On Targget Treinamento e Consultoria

Funes Bsicas

Limitando Linhas Utilizando uma Seleo

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.

On Targget Treinamento e Consultoria

Funes Bsicas

Limitando as Linhas Selecionadas


SELECT [DISTINCT] {*, column [alias], ...} FROM table [WHERE condition(s)];

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

On Targget Treinamento e Consultoria

Funes Bsicas

Utilizando a Clusula WHERE


SQL> SELECT 2 FROM 3 WHERE ename, job, deptno emp job = 'CLERK';

ENAME ---------JAMES SMITH ADAMS MILLER

JOB DEPTNO --------- --------CLERK 30 CLERK 20 CLERK 20 CLERK 10

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.

On Targget Treinamento e Consultoria

Funes Bsicas

Strings de Caractere e Datas


SQL> SELECT 2 FROM 3 WHERE ename, job, deptno emp ename = 'JAMES';

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.

On Targget Treinamento e Consultoria

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'

On Targget Treinamento e Consultoria

Funes Bsicas

Utilizando os Operadores de Comparao


SQL> SELECT 2 FROM 3 WHERE ename, sal, comm emp sal <= comm;

ENAME SAL COMM ---------- --------- --------MARTIN 1250 1400

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.

On Targget Treinamento e Consultoria

Funes Bsicas

Outros Operadores de Comparao

On Targget Treinamento e Consultoria

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.

On Targget Treinamento e Consultoria

10

Funes Bsicas

Operador IN
SQL> SELECT 2 FROM 3 WHERE empno, ename, sal, mgr emp mgr IN (7902, 7566, 7788);

EMPNO --------7902 7369 7788 7876

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 ('').

On Targget Treinamento e Consultoria

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';

Combinando Padres de Caractere


Os smbolos % e _ podem ser utilizados em qualquer combinao com literais de caracteres. O exemplo abaixo exibe os nomes de todos os empregados cujo nome possui a letra A como o segundo caractere. SQL> SELECT 2 FROM 3 WHERE ename emp ename LIKE '_A%';

On Targget Treinamento e Consultoria

12

Funes Bsicas

ENAME ---------JAMES WARD

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.

On Targget Treinamento e Consultoria

13

Funes Bsicas

Operador IS NULL
SQL> SELECT 2 FROM 3 WHERE ename, mgr emp mgr IS NULL;

ENAME MGR ---------- --------KING

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;

ENAME -------KING BLAKE CLARK ...

JOB COMM ----------- -----PRESIDENT MANAGER MANAGER

On Targget Treinamento e Consultoria

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.

On Targget Treinamento e Consultoria

15

Funes Bsicas

Operador AND
SQL> SELECT 2 FROM 3 WHERE 4 AND empno, ename, job, sal emp sal >= 1100 job = 'CLERK';

EMPNO --------7876 7934

ENAME ---------ADAMS MILLER

JOB SAL --------- --------CLERK 1100 CLERK 1300

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.

Combinaes de Resultados com o Operador AND


A tabela abaixo mostra o resultado da combinao de duas expresses com o operador AND:
AND TRUE FALSE UNKNOW TRUE TRUE FALSE UNKNOW FALSE FALSE FALSE FALSE UNKNOW UNKNOW FALSE UNKNOW

On Targget Treinamento e Consultoria

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.

Combinaes de Resultados com o Operador OR


A tabela abaixo mostra o resultado da combinao de duas expresses com o operador OR:
OR TRUE FALSE UNKNOW TRUE TRUE TRUE TRUE FALSE TRUE FALSE UNKNOW UNKNOW TRUE UNKNOW UNKNOW

On Targget Treinamento e Consultoria

17

Funes Bsicas

Operador NOT
SQL> SELECT ename, job 2 FROM emp 3 WHERE job NOT IN ('CLERK','MANAGER','ANALYST');

ENAME ---------KING MARTIN ALLEN TURNER WARD

JOB --------PRESIDENT SALESMAN SALESMAN SALESMAN SALESMAN

O exemplo acima exibe o nome e o cargo de todos os empregados cujo cargo no seja CLERK, MANAGER ou ANALYST.

Combinaes de Resultados com o Operador NOT


A tabela abaixo mostra o resultado da aplicao do operador NOT a uma condio:
NOT TRUE FALSE FALSE TRUE UNKNOW UNKNOW

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

On Targget Treinamento e Consultoria

18

Funes Bsicas

Regras de Precedncia

Exemplo de Precedncia do Operador AND


SQL> 2 3 4 5 SELECT FROM WHERE OR AND ename, job, sal emp job = 'SALESMAN' job = 'PRESIDENT' sal > 1500;

ENAME ---------KING MARTIN ALLEN TURNER WARD

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.

On Targget Treinamento e Consultoria

19

Funes Bsicas

Utilizando Parnteses para Alterar a Prioridade


SQL> 2 3 4 5 SELECT FROM WHERE OR AND ename, job, sal emp (job = 'SALESMAN' job = 'PRESIDENT') sal > 1500;

ENAME ---------KING ALLEN

JOB SAL --------- --------PRESIDENT 5000 SALESMAN 1600

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.

On Targget Treinamento e Consultoria

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.

On Targget Treinamento e Consultoria

21

Funes Bsicas

Classificando em Ordem Descendente


SQL> SELECT ename, job, deptno, hiredate 2 FROM emp 3 ORDER BY hiredate DESC;

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.

Ordenao Padro dos Dados


A ordenao padro dos dados ascendente: Valores numricos so exibidos com o valor mais baixo primeiro, por exemplo: 1999. Valores tipo data so exibidos com o valor mais antigo primeiro, por exemplo: 01-JAN-92 antes de 01-JAN-95. Valores caractere so exibidos em ordem alfabtica, por exemplo: A primeiro e Z por ltimo. Valores nulos so exibidos por ltimo para ordenaes ascendentes e por primeiro para ordenaes descendentes.

Invertendo a Ordem Padro


Para inverter a ordem na qual as linhas so exibidas, especifique o palavra chave DESC depois do nome da coluna na clusula ORDER BY. O exemplo acima ordena o resultado pelo empregado mais recentemente contratado.

On Targget Treinamento e Consultoria

22

Funes Bsicas

Ordenando pelo Alias de Coluna


SQL> SELECT empno, ename, sal*12 annsal 2 FROM emp 3 ORDER BY annsal;

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.

On Targget Treinamento e Consultoria

23

Funes Bsicas

Ordenando por Mltiplas Colunas


SQL> SELECT ename, deptno, sal 2 FROM emp 3 ORDER BY deptno, sal DESC;

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;

On Targget Treinamento e Consultoria

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.

On Targget Treinamento e Consultoria

25

Funes Bsicas

ENAME ------ALLEN WARD JONES BLAKE

JOB --------SALESMAN SALESMAN MANAGER MANAGER

HIREDATE ---------------20-FEB-81 22-FEB-81 02-APR-81 01-MAY-81

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.

Mostre o nome e o cargo de todos os empregados que no possuem gerente.


26

On Targget Treinamento e Consultoria

Funes Bsicas

ENAME JOB ----- --------KING PRESIDENT

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.

On Targget Treinamento e Consultoria

Introduo ao Oracle: SQL e PL/SQL

ENAME SAL COMM ------- ----- ----MARTIN 1250 1400

4. Funes Bsicas

On Targget Treinamento e Consultoria

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.

On Targget Treinamento e Consultoria

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.

On Targget Treinamento e Consultoria

Funes Bsicas

Tipos de Funes SQL

Existem dois tipos distintos de funes: Funes do tipo single-row Funes do tipo multiple-row

Funes do Tipo Single-Row


Estas funes operam em linhas nicas retornando um resultado para cada linha processada. Existem diferentes tipos de funes single-row. Este captulo explica os tipos listados abaixo: Caractere Numrica Data Converso

Funes do Tipo Multiple-Row


Estas funes manipulam grupos de linhas para obter um resultado para cada grupo processado e sero vistas em um captulo posterior.

On Targget Treinamento e Consultoria

Funes Bsicas

Funes do Tipo Single-Row


function_name (column|expression, [arg1, arg2,...])

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

Caractersticas de Funes Tipo Single-Row


Atuam sobre cada linha recuperada pela consulta. Retornam um resultado por linha. Podem retornar um valor com o tipo de dado diferente do referenciado. Podem receber um ou mais argumentos.

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.

On Targget Treinamento e Consultoria

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

On Targget Treinamento e Consultoria

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

On Targget Treinamento e Consultoria

Funes Bsicas

Funes de Converso entre Maisculas/Minsculas

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.

On Targget Treinamento e Consultoria

Funes Bsicas

Utilizando Funes de Converso entre Maisculas/Minsculas


SQL> SELECT empno, ename, deptno 2 FROM emp 3 WHERE ename = 'blake'; no rows selected

SQL> SELECT 2 FROM 3 WHERE

empno, ename, deptno emp LOWER(ename) = 'blake';

EMPNO ENAME DEPTNO --------- ---------- --------7698 BLAKE 30

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.

On Targget Treinamento e Consultoria

Funes Bsicas

SQL> SELECT 2 FROM 3 WHERE

empno, INITCAP(ename), deptno emp LOWER(ename) = 'blake';

On Targget Treinamento e Consultoria

10

Funes Bsicas

Funes de Manipulao de Caracteres

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.

On Targget Treinamento e Consultoria

11

Funes Bsicas

Utilizando as Funes de Manipulao de Caracteres


SQL> SELECT 2 3 FROM 4 WHERE ename, CONCAT (ename, job), LENGTH(ename), INSTR(ename, 'A') emp SUBSTR(job,1,5) = 'SALES';

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';

On Targget Treinamento e Consultoria

12

Funes Bsicas

ENAME CONCAT(ENAME,JOB) LENGTH(ENAME) INSTR(ENAME,'A') -------- ------------------- ---------------------------MARTIN MARTINSALESMAN 6 2 ALLEN ALLENSALESMAN 5 1

On Targget Treinamento e Consultoria

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)

On Targget Treinamento e Consultoria

14

Funes Bsicas

Utilizando a Funo ROUND


SQL> SELECT 2 3 FROM ROUND(45.923,2), ROUND(45.923,0), ROUND(45.923,-1) DUAL;

ROUND(45.923,2) ROUND(45.923,0) ROUND(45.923,-1) --------------- -------------- ----------------45.92 46 50

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.

On Targget Treinamento e Consultoria

15

Funes Bsicas

Utilizando a Funo TRUNC


SQL> SELECT 2 3 FROM TRUNC(45.923,2), TRUNC(45.923), TRUNC(45.923,-1) DUAL;

TRUNC(45.923,2) TRUNC(45.923) TRUNC(45.923,-1) --------------- ------------- ---------------45.92 45 40

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.

On Targget Treinamento e Consultoria

16

Funes Bsicas

Utilizando a Funo MOD


SQL> SELECT 2 FROM 3 WHERE ename, sal, comm, MOD(sal, comm) emp job = 'SALESMAN';

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.

On Targget Treinamento e Consultoria

17

Funes Bsicas

Trabalhando com Datas


Formato de Data Oracle
O Oracle armazena datas em um formato numrico interno, representando o sculo, ano, ms, dia, horas, minutos e segundos. O formato padro para exibio e entrada de datas DD-MON-YY. Datas vlidas do Oracle esto entre 1 de janeiro de 4712 A.C. e 31 de dezembro de 9999 D.C.

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;

On Targget Treinamento e Consultoria

18

Funes Bsicas

Clculos com Datas


Uma vez que o banco de dados armazena as como nmeros, voc pode executar clculos utilizando os operadores aritmticos como a adio e subtrao. Voc pode adicionar e subtrair constantes numricas e datas. Voc pode executar as seguintes operaes:
Operao data + nmero data - nmero data - data data + nmero/24 Resultado Data Data Nmero de dias Data Descrio Adiciona um nmero de dias para uma data Subtrai um nmero de dias a partir de uma data Subtrai uma data a partir de outra Adiciona um nmero de horas para uma data

On Targget Treinamento e Consultoria

19

Funes Bsicas

Utilizando Operadores Aritmticos com Datas


SQL> SELECT 2 FROM 3 WHERE ename, (SYSDATE-hiredate)/7 WEEKS emp deptno = 10;

ENAME ---------KING CLARK MILLER

WEEKS --------830.93709 853.93709 821.36566

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.

On Targget Treinamento e Consultoria

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.

On Targget Treinamento e Consultoria

21

Funes Bsicas

Utilizando Funes de Data

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.

LAST_DAY( --------30-NOV-81 31-MAY-81

On Targget Treinamento e Consultoria

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';

EMPNO --------7788 7876

HIREDATE --------19-APR-87 23-MAY-87

ROUND(HIR --------01-MAY-87 01-JUN-87

TRUNC(HIR --------01-APR-87 01-MAY-87

On Targget Treinamento e Consultoria

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.

Converso Implcita de Tipos de Dados


Para atribuies, o Servidor Oracle pode converter automaticamente o seguinte: VARCHAR2 ou CHAR para NUMBER VARCHAR2 ou CHAR para DATE NUMBER para VARCHAR2 DATE para VARCHAR2

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

Converso Explcita de Tipos de Dados

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)

On Targget Treinamento e Consultoria

25

Funes Bsicas

Funo TO_CHAR com Datas


TO_CHAR(date, 'fmt')

Exibindo uma Data em um Formato Especfico


Os valores de data no Oracle so exibidos por default no formato DD-MON-YY. A funo TO_CHAR permite converter uma data para um formato especfico. Diretrizes: A mscara de formatao deve ser includa entre aspas simples e faz distino entre maisculas e minsculas. A mscara de formatao pode incluir qualquer elemento de formato de data vlido. Os nomes de dias e meses so automaticamente preenchidos com espaos em branco. Para remover espaos em branco ou suprimir zeros esquerda, utilize o elemento de formatao fm (fill mode). Voc pode redimensionar a largura de exibio do campo caractere resultante com o comando COLUMN do SQL*Plus. A largura da coluna resultante por default 80 caracteres. SQL> SELECT Month_Hired 2 FROM 3 WHERE empno, TO_CHAR(hiredate, 'MM/YY') emp ename = 'BLAKE';

On Targget Treinamento e Consultoria

26

Funes Bsicas

Elementos de Formatao de Datas

Exemplos de Elementos de Formatao de Data Vlidos


Elemento SCC or CC YYYY ou SYYYY YYY ou YY ou Y Y,YYY IYYY, IYY, IY, I SYEAR ou YEAR BC ou AD B.C. ou A.D. Q MM MONTH MON RM WW ou W DDD ou DD ou D DAY DY J Descrio Sculo; S prefixa datas AC com Ano; S prefixa datas AC com ltimos 3, 2 ou 1 dgito(s) do ano Ano com uma vrgula nesta posio 4, 3, 2 ou 1 dgito(s) do ano baseado no padro ISO Ano soletrado; S prefixa datas AC com Indicador AC / DC Indicador AC / DC com pontos Quarto do ano Valor do ms com dois dgitos Nome do ms com brancos para completar o tamanho de 9 caracteres Nome do ms abreviado com trs letras Nmero do ms em Romano Semana do ano ou ms Dia do ano, ms ou semana Nome do dia com brancos para completar o tamanho de 9 caracteres Nome do dia abreviado com trs letras Dia Juliano; o nmero de dias desde 31 de dezembro de 4713 AC

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)

On Targget Treinamento e Consultoria

27

Funes Bsicas

Outros Formatos
Elemento / . , "of the" Descrio A pontuao reproduzida no resultado Strings entre aspas duplas so reproduzidas no resultado

Sufixos podem Influenciar a Exibio de Nmeros


Elemento TH SP SPTH ou THSP Descrio Nmero ordinal (por exemplo, DDTH para 4TH) Nmero soletrado (por exemplo, DDSP para FOUR) Nmero ordinal soletrado (por exemplo, DDSPTH para FOURTH)

On Targget Treinamento e Consultoria

28

Funes Bsicas

Utilizando a Funo TO_CHAR com Datas


SQL> SELECT 2 HIREDATE 3 FROM ename, TO_CHAR(hiredate, 'fmDD Month YYYY') emp;

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.

Observe que o ms segue o modelo de formato especificado para a palavra Month.

On Targget Treinamento e Consultoria

29

Funes Bsicas

Funo TO_CHAR com Nmeros


TO_CHAR(number, 'fmt')

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.

Elementos de Formatao de Nmeros


Se voc est convertendo um nmero para o tipo de dado caractere, voc pode utilizar os elementos listados abaixo:
Elemento 9 0 $ L . , MI PR EEEE V B Descrio Posio numrica (o nmero de 9s determina o tamanho da exibio) Complementa com zeros a partir da posio especificada Indicador de dlar flutuante Smbolo flutuante da moeda local Ponto decimal na posio especificada Vrgula na posio especificada Sinal de menos direita (valores negativos) Nmeros negativos entre parnteses Notao cientfica (o formato deve especificar quatro Es) Multiplica o valor por 10 n vezes (n = nmero de 9s aps V) Exibe o valor zero como brancos, e no como 0 Exemplo 999999 099999 $999999 L999999 999999.99 999,999 999999MI 999999PR 99.999EEEE 9999V99 B9999.99 Resultado 1234 001234 $1234 FF1234 1234.00 1,234 1234<1234> 1.234E+03 123400 1234.00

On Targget Treinamento e Consultoria

30

Funes Bsicas

Utilizando a Funo TO_CHAR com Nmeros


SQL> SELECT 2 FROM 3 WHERE TO_CHAR(sal,'$99,999') SALARY emp ename = 'SCOTT';

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.

On Targget Treinamento e Consultoria

31

Funes Bsicas

Funes TO_NUMBER e TO_DATE


TO_NUMBER(char)

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');

ENAME HIREDATE ---------- -------WARD 22-FEB-81

On Targget Treinamento e Consultoria

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

On Targget Treinamento e Consultoria

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.

Converses NVL para Vrios Tipos de Dados


Tipo de Dado NUMBER DATE CHAR ou VARCHAR2 Exemplo de Converso NVL(number_column, 9) NVL(date_column, '01-JAN-95') NVL(character_column, 'Unavailable')

On Targget Treinamento e Consultoria

34

Funes Bsicas

Utilizando a Funo NVL


SQL> SELECT 2 FROM ename, sal, comm, (sal*12)+NVL(comm,0) emp;

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.

On Targget Treinamento e Consultoria

36

Funes Bsicas

Utilizando a Funo DECODE


SQL> SELECT 2 3 4 5 6 7 FROM job, sal, DECODE(job, 'ANALYST', SAL*1.1, 'CLERK', SAL*1.15, 'MANAGER', SAL*1.20, SAL) REVISED_SALARY emp;

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

On Targget Treinamento e Consultoria

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;

ENAME NVL(TO_CHAR(MGR),'SEMGERENTE') ---------- -----------------------------KING Sem Gerente

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.

On Targget Treinamento e Consultoria

38

Funes Bsicas

SQL> SELECT 2 3 4 5 FROM 6 ORDER BY

TO_CHAR(NEXT_DAY(ADD_MONTHS (hiredate, 6), 'FRIDAY'), 'fmDay, Month ddth, YYYY') "Next 6 Month Review" emp hiredate;

On Targget Treinamento e Consultoria

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.

On Targget Treinamento e Consultoria

40

Funes Bsicas

EMPNO ----7839 7698 7782 7566

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.

On Targget Treinamento e Consultoria

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.

On Targget Treinamento e Consultoria

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.

On Targget Treinamento e Consultoria

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.

On Targget Treinamento e Consultoria

44

Introduo ao Oracle: SQL e PL/SQL

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.

5. Exibindo Dados a Partir de Mltiplas Tabelas

On Targget Treinamento e Consultoria

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

On Targget Treinamento e Consultoria

Funes Bsicas

Obtendo Dados a Partir de Mltiplas Tabelas

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.

On Targget Treinamento e Consultoria

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.

On Targget Treinamento e Consultoria

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.

On Targget Treinamento e Consultoria

Funes Bsicas

Gerando um Produto Cartesiano

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.

On Targget Treinamento e Consultoria

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

On Targget Treinamento e Consultoria

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.

On Targget Treinamento e Consultoria

Funes Bsicas

Recuperando Registros com Equijoins


SQL> SELECT 2 3 FROM 4 WHERE emp.empno, emp.ename, emp.deptno, dept.deptno, dept.loc emp, dept emp.deptno = dept.deptno;

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.

On Targget Treinamento e Consultoria

Funes Bsicas

Qualificando Nomes de Colunas Ambguos


Voc precisa qualificar os nomes das colunas na clusula WHERE com o nome da tabela para evitar ambigidade. Sem os prefixos de tabela, a coluna DEPTNO poderia ser da tabela DEPT ou da tabela EMP. necessrio adicionar o prefixo de tabela para executar a consulta. Se no existir nenhum nome de coluna comum entre as duas tabelas, no h necessidade de qualificar as colunas. Entretanto, voc ganhar desempenho utilizando o prefixo de tabela porque voc informa exatamente para o Servidor Oracle onde procurar pelas colunas. A exigncia para qualificar os nomes de coluna ambguos tambm aplicvel para colunas que podem ser ambguas em outras clusulas como SELECT ou ORDER BY.

On Targget Treinamento e Consultoria

10

Funes Bsicas

Condies Adicionais de Pesquisa com o Operador AND

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

On Targget Treinamento e Consultoria

11

Funes Bsicas

Utilizando Alias de Tabela


SQL> SELECT 2 3 FROM 4 WHERE emp.empno, emp.ename, emp.deptno, dept.deptno, dept.loc emp, dept emp.deptno = dept.deptno;

SQL> SELECT 2 3 FROM 4 WHERE

e.empno, e.ename, e.deptno, d.deptno, d.loc emp e, dept d e.deptno = d.deptno;

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.

On Targget Treinamento e Consultoria

12

Funes Bsicas

Relacionando mais de Duas Tabelas

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.

SQL> SELECT 2 FROM 3 WHERE 4 AND 5 AND

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

On Targget Treinamento e Consultoria

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 (=).

On Targget Treinamento e Consultoria

14

Funes Bsicas

Recuperando Registros com Non-Equijoins


SQL> SELECT 2 FROM 3 WHERE e.ename, e.sal, s.grade emp e, salgrade s e.sal BETWEEN s.losal AND s.hisal;

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.

On Targget Treinamento e Consultoria

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.

DNAME ------------ACCOUNTING SALES ACCOUNTING RESEARCH SALES SALES SALES

On Targget Treinamento e Consultoria

16

Funes Bsicas

Recuperando Registros sem Correspondncia Direta Utilizando Outer Joins


SELECT FROM WHERE table.column, table.column table1, table2 table1.column(+) = table2.column;

SELECT FROM WHERE

table.column, table.column table1, table2 table1.column = table2.column(+);

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.

On Targget Treinamento e Consultoria

17

Funes Bsicas

Utilizando Outer Joins


SQL> 2 3 4 SELECT FROM WHERE ORDER BY e.ename, d.deptno, d.dname emp e, dept d e.deptno(+) = d.deptno e.deptno;

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.

Restries do Outer Join


O operador outer join s pode aparecer em um dos lados da expresso, o lado que no possui informao correspondente. Ele retorna essas linhas a partir de uma tabela que no possui correspondncia direta para a outra tabela. Uma condio envolvendo um outer join no pode utilizar o operador IN ou ser unida para outra condio pelo operador OR.

On Targget Treinamento e Consultoria

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.

On Targget Treinamento e Consultoria

19

Funes Bsicas

Relacionando uma Tabela com Ela Mesma


SQL> SELECT 2 FROM 3 WHERE worker.ename || ' works for ' || manager.ename emp worker, emp manager worker.mgr = manager.empno;

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.

On Targget Treinamento e Consultoria

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.

On Targget Treinamento e Consultoria

21

Funes Bsicas

ENAME -----ALLEN WARD MARTIN TURNER

DNAME -----SALES SALES SALES SALES

LOC ------------CHICAGO CHICAGO CHICAGO CHICAGO

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.

On Targget Treinamento e Consultoria

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.

On Targget Treinamento e Consultoria

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

On Targget Treinamento e Consultoria

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

On Targget Treinamento e Consultoria

25

Introduo ao Oracle: SQL e PL/SQL

EMPLOYEE_AND_THEIR_SALARIES ---------------------------------------------------------KING ************************************************* FORD ***************************** SCOTT ***************************** JONES **************************** BLAKE *************************** CLARK *********************** ALLEN *************** TURNER ************** MILLER ************ MARTIN *********** WARD *********** ADAMS ********** JAMES ******** SMITH ******* 14 rows selected.

6. Agregando Dados Utilizando Funes de Grupo

On Targget Treinamento e Consultoria

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.

On Targget Treinamento e Consultoria

Funes Bsicas

O que so Funes de Grupo?

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.

On Targget Treinamento e Consultoria

Funes Bsicas

Tipos de Funes de Grupo


Cada uma das funes aceita um argumento. A tabela abaixo identifica as opes que podem ser utilizadas na sintaxe:
Funo AVG( [DISTINCT | ALL] n ) COUNT({*|[DISTINCT|ALL]expr}) MAX( [DISTINCT | ALL] expr) MIN( [DISTINCT | ALL] expr) STDDEV( [DISTINCT | ALL] n) SUM( [DISTINCT | ALL] n) VARIANCE( [DISTINCT | ALL] n) Descrio Valor mdio de n, ignorando valores nulos Nmero de linhas, onde expr computa somente os valores diferente de nulo. Para contar todas as linhas selecionadas utilize *, incluindo linhas duplicadas e com valores nulos Valor mximo de expr, ignorando valores nulos Valor mnimo de expr, ignorando valores nulos Desvio padro de n, ignorando valores nulos Soma dos valores de n, ignorando valores nulos Varincia de n, ignorando valores nulos

On Targget Treinamento e Consultoria

Funes Bsicas

Utilizando Funes de Grupo


SELECT FROM [WHERE [ORDER BY group_function(column) table condition] expr];

Diretrizes para Utilizao de Funes de Grupo


DISTINCT faz a funo avaliar somente valores no duplicados; ALL faz a funo considerar todos os valores, inclusive os duplicados. O padro ALL e portanto no precisa ser especificado. Os tipos de dados para os argumentos podem ser CHAR, VARCHAR2, NUMBER ou DATE onde expr for especificado. Todas as funes de grupo exceto COUNT(*) ignoram valores nulos. Para substituir um valor nulo, utilize a funo NVL.

On Targget Treinamento e Consultoria

Funes Bsicas

Utilizando as Funes AVG e SUM


SQL> SELECT 2 3 FROM 4 WHERE AVG(sal), MAX(sal), MIN(sal), SUM(sal) emp job LIKE 'SALES%';

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).

On Targget Treinamento e Consultoria

Funes Bsicas

Utilizando as Funes MIN e MAX


SQL> SELECT 2 FROM MIN(hiredate), MAX(hiredate) emp;

MIN(HIRED MAX(HIRED --------- --------17-DEC-80 12-JAN-83

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;

MIN(ENAME) MAX(ENAME) ---------- ---------ADAMS WARD

Nota: As funes AVG, SUM, VARIANCE e STDDEV s podem ser utilizadas com tipos de dados numricos.

On Targget Treinamento e Consultoria

Funes Bsicas

Utilizando a Funo COUNT


SQL> SELECT 2 FROM 3 WHERE COUNT(*) emp deptno = 30;

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

Exemplos: Mostre o nmero de departamentos na tabela EMP.

On Targget Treinamento e Consultoria

Funes Bsicas

SQL> SELECT 2 FROM

COUNT(deptno) emp;

COUNT(DEPTNO) ------------14

On Targget Treinamento e Consultoria

Funes Bsicas

Mostre o nmero de departamentos distintos na tabela EMP. SQL> SELECT 2 FROM COUNT(DISTINCT (deptno)) emp;

COUNT(DISTINCT(DEPTNO)) ----------------------3

On Targget Treinamento e Consultoria

10

Funes Bsicas

Funes de Grupo e Valores Nulos


SQL> SELECT 2 FROM AVG(comm) emp;

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).

On Targget Treinamento e Consultoria

11

Funes Bsicas

Utilizando a Funo NVL com Funes de Grupo


SQL> SELECT 2 FROM AVG(NVL(comm,0)) emp;

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).

On Targget Treinamento e Consultoria

12

Funes Bsicas

Criando Grupos de Dados

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.

On Targget Treinamento e Consultoria

13

Funes Bsicas

Criando Grupos de Dados: Clusula GROUP BY


SELECT FROM [WHERE [GROUP BY [ORDER BY column, group_function(column) table condition] group_by_expression] expr];

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.

On Targget Treinamento e Consultoria

14

Funes Bsicas

Utilizando a Clusula GROUP BY


SQL> SELECT deptno, AVG(sal) 2 FROM emp 3 GROUP BY deptno;

DEPTNO AVG(SAL) --------- --------10 2916.6667 20 2175 30 1566.6667

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

On Targget Treinamento e Consultoria

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);

DEPTNO AVG(SAL) ---------- -----------30 1566.6667 20 2175 10 2916.6667

On Targget Treinamento e Consultoria

16

Funes Bsicas

Agrupando por Mais de Uma Coluna

Grupos Dentro de Grupos


s vezes existe a necessidade de visualizar resultados de grupos dentro de outros grupos. O grfico acima mostra um relatrio que exibe o salrio total que pago para cada cargo, dentro de cada departamento. A tabela EMP agrupada primeiro pelo nmero do departamento e ento dentro deste agrupamento ela agrupada pelo cargo. Por exemplo, os empregados com cargo CLERK do departamento 20 se agrupam e um nico resultado (salrio total) produzido para o grupo.

On Targget Treinamento e Consultoria

17

Funes Bsicas

Utilizando a Clusula GROUP BY em Mltiplas Colunas


SQL> SELECT deptno, job, sum(sal) 2 FROM emp 3 GROUP BY deptno, job;

DEPTNO JOB SUM(SAL) --------- --------- --------10 CLERK 1300 10 MANAGER 2450 10 PRESIDENT 5000 20 ANALYST 6000 20 CLERK 1900 ... 9 rows selected.

Grupos Dentro de Grupos


Voc pode retornar resultados sumarizados para grupos e subgrupos listando mais de uma coluna na clusula GROUP BY. A ordem de classificao padro dos resultados baseia-se na ordem das colunas da clusula GROUP BY. A seguir apresentado como o comando SELECT acima, contendo a clusula GROUP BY, avaliado: A clusula SELECT especifica as colunas a serem recuperadas: Nmero do departamento da tabela EMP Cargo da tabela EMP A soma de todos os salrios para o grupo especificado na clusula GROUP BY A clusula FROM especifica as tabelas que o banco de dados deve acessar: tabela EMP. A clusula GROUP BY especifica como as linhas devem ser agrupadas: Primeiro, as linhas so agrupadas atravs do nmero do departamento. Segundo, dentro dos grupos de nmero do departamento, as linhas so agrupadas pelo cargo. Desta forma a funo SUM est sendo aplicada coluna de salrio para todos os cargos dentro de cada grupo de nmero do departamento.

On Targget Treinamento e Consultoria

18

Funes Bsicas

Consultas Ilegais Utilizando Funes de Grupo

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;

DEPTNO COUNT(ENAME) ---------- -----------10 3 20 5 30 6

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;

DEPTNO AVG(SAL) ---------- -------------10 2916.6667 20 2175

On Targget Treinamento e Consultoria

20

Funes Bsicas

Excluindo Resultados de Grupos

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.

On Targget Treinamento e Consultoria

21

Funes Bsicas

Excluindo Resultados de Grupos: Clusula HAVING


SELECT FROM [WHERE [GROUP BY [HAVING [ORDER BY column, group_function table condition] group_by_expression] group_condition] column];

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.

On Targget Treinamento e Consultoria

22

Funes Bsicas

Utilizando a Clusula HAVING


SQL> 2 3 4 SELECT FROM GROUP BY HAVING deptno, max(sal) emp deptno max(sal) > 2900;

DEPTNO MAX(SAL) --------- --------10 5000 20 3000

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;

DEPTNO AVG(SAL) --------- --------10 2916.6667 20 2175

On Targget Treinamento e Consultoria

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);

JOB PAYROLL --------- --------ANALYST 6000 MANAGER 8275

On Targget Treinamento e Consultoria

24

Funes Bsicas

Aninhando Funes de Grupo


SQL> SELECT max(avg(sal)) 2 FROM emp 3 GROUP BY deptno;

MAX(AVG(SAL)) ------------2916.6667

Funes de grupo podem ser aninhadas em qualquer nvel. O exemplo acima exibe a maior mdia de salrio.

On Targget Treinamento e Consultoria

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.

On Targget Treinamento e Consultoria

26

Funes Bsicas

JOB COUNT(*) ---------- -------ANALYST 2 CLERK 4 MANAGER 3 PRESIDENT 1 SALESMAN 4

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.

On Targget Treinamento e Consultoria

27

Funes Bsicas

DNAME -----------ACCOUNTING 2916.67 RESEARCH 2175 SALES 1566.67

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.

On Targget Treinamento e Consultoria

28

Introduo ao Oracle: SQL e PL/SQL

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

On Targget Treinamento e Consultoria

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).

On Targget Treinamento e Consultoria

Funes Bsicas

Utilizando uma Subconsulta para Resolver um Problema

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.

On Targget Treinamento e Consultoria

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.

On Targget Treinamento e Consultoria

Funes Bsicas

Utilizando uma Subconsulta


SQL> SELECT 2 FROM 3 WHERE 4 5 6 ename emp sal > (SELECT FROM WHERE

2975

sal emp empno = 7566);

ENAME ---------KING FORD SCOTT

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.

On Targget Treinamento e Consultoria

Funes Bsicas

Diretrizes para Utilizao de Subconsultas


Uma subconsulta deve ser includa entre parnteses. Uma subconsulta deve estar no lado direito do operador de comparao. Subconsultas no podem conter uma clusula ORDER BY. Voc pode ter somente uma clusula ORDER BY para um comando SELECT, e se especificada ela deve ser a ltima clusula do comando SELECT principal. Duas classes de operadores de comparao so utilizadas em subconsultas: os operadores do tipo single-row e os operadores do tipo multiple-row.

On Targget Treinamento e Consultoria

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.

On Targget Treinamento e Consultoria

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

job emp empno = 7369);

ENAME ---------JAMES SMITH ADAMS MILLER

JOB --------CLERK CLERK CLERK CLERK

On Targget Treinamento e Consultoria

Funes Bsicas

Executando Subconsultas Single-Row


SQL> 2 3 4 5 6 7 8 9 10 SELECT FROM WHERE ename, job emp job = (SELECT FROM WHERE sal > (SELECT FROM WHERE

job emp empno = 7369)

CLERK

AND

1100 sal emp empno = 7876);

ENAME JOB ---------- --------MILLER CLERK

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.

On Targget Treinamento e Consultoria

Funes Bsicas

Utilizando Funes de Grupo em uma Subconsulta


SQL> SELECT 2 FROM 3 WHERE 4 5 ename, job, sal 800 emp sal = (SELECT MIN(sal) FROM emp);

ENAME JOB SAL ---------- --------- --------SMITH CLERK 800

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.

On Targget Treinamento e Consultoria

10

Funes Bsicas

Clusula HAVING com Subconsultas


SQL> 2 3 4 5 6 7 SELECT FROM GROUP BY HAVING deptno, MIN(sal) emp 800 deptno MIN(sal) > (SELECT MIN(sal) FROM emp WHERE deptno = 20);

DEPTNO MIN(SAL) --------- --------10 1300 30 950

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);

On Targget Treinamento e Consultoria

11

Funes Bsicas

Qual o Erro deste Comando?

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.

On Targget Treinamento e Consultoria

12

Funes Bsicas

Este Comando Funcionar?

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.

On Targget Treinamento e Consultoria

13

Funes Bsicas

Subconsultas do Tipo Multiple-Row

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

emp sal IN (SELECT FROM GROUP BY

MIN(sal) emp deptno);

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);

On Targget Treinamento e Consultoria

14

Funes Bsicas

Utilizando o Operador ANY em Subconsultas Multiple-Row


SQL> 2 3 4 5 6 7 SELECT FROM WHERE empno, ename, job emp sal < ANY 1300 1100 (SELECT sal 800 950 FROM emp WHERE job = 'CLERK') job <> 'CLERK';

AND

EMPNO --------7654 7521

ENAME ---------MARTIN WARD

JOB --------SALESMAN SALESMAN

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.

On Targget Treinamento e Consultoria

15

Funes Bsicas

Utilizando o Operador ALL em Subconsultas Multiple-Row


SQL> SELECT 2 FROM 3 WHERE 4 5 6 empno, ename, job emp sal > ALL (SELECT avg(sal) FROM emp GROUP BY deptno);

1566.6667 2175 2916.6667

EMPNO --------7839 7566 7902 7788

ENAME ---------KING JONES FORD SCOTT

JOB --------PRESIDENT MANAGER ANALYST ANALYST

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.

On Targget Treinamento e Consultoria

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.

On Targget Treinamento e Consultoria

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.

On Targget Treinamento e Consultoria

18

Introduo ao Oracle: SQL e PL/SQL

EMPNO ----7566 7788 7902 7698

ENAME -----JONES SCOTT FORD BLAKE

SAL ---2975 3000 3000 2850

8. Subconsultas Multiple-Column

On Targget Treinamento e Consultoria

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

On Targget Treinamento e Consultoria

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);

On Targget Treinamento e Consultoria

Funes Bsicas

Utilizando Subconsultas Multiple-Column


SQL> SELECT 2 FROM 3 WHERE 4 5 6 ename, deptno, sal, comm emp (sal, NVL(comm,-1)) IN (SELECT sal, NVL(comm,-1) FROM emp WHERE deptno = 30);

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.

On Targget Treinamento e Consultoria

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.

On Targget Treinamento e Consultoria

Funes Bsicas

Subconsulta com Comparao Tipo Nonpairwise


SQL> 2 3 4 5 6 7 8 9 SELECT FROM WHERE AND ename, deptno, sal, comm emp sal IN (SELECT sal FROM emp WHERE deptno = 30) NVL(comm,-1) IN (SELECT NVL(comm,-1) FROM emp WHERE deptno = 30);

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.

On Targget Treinamento e Consultoria

Funes Bsicas

Modificando a Tabela EMP


ENAME SAL COMM ---------- --------- --------... CLARK 1500 300 ... ALLEN 1600 300 TURNER 1500 0 ... 14 rows selected.

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.

On Targget Treinamento e Consultoria

Funes Bsicas

Subconsulta Tipo Pairwise


SQL> SELECT 2 FROM 3 WHERE 4 5 6 ename, deptno, sal, comm emp (sal, NVL(comm,-1)) IN (SELECT sal, NVL(comm,-1) FROM emp WHERE deptno = 30);

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.

O resultado da subconsulta pairwise ainda permanece o mesmo, retornando seis linhas.

On Targget Treinamento e Consultoria

Funes Bsicas

Subconsulta Tipo Nonpairwise


SQL> 2 3 4 5 6 7 8 9 SELECT FROM WHERE AND ename,deptno, sal, comm emp sal IN (SELECT sal FROM emp WHERE deptno = 30) NVL(comm,-1) IN (SELECT NVL(comm,-1) FROM emp WHERE deptno = 30);

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.

On Targget Treinamento e Consultoria

Funes Bsicas

Valores Nulos em uma Subconsulta


SQL> SELECT employee.ename 2 FROM emp employee 3 WHERE employee.empno NOT IN 4 (SELECT manager.mgr 5 FROM emp manager); no rows selected.

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

ENAME ---------KING 6 rows selected.

On Targget Treinamento e Consultoria

10

Funes Bsicas

Utilizando uma Subconsulta na Clusula FROM


SQL> SELECT 2 FROM 3 4 5 WHERE 6 AND a.ename, a.sal, a.deptno, b.salavg emp a, (SELECT deptno, avg(sal) salavg FROM emp GROUP BY deptno) b a.deptno = b.deptno a.sal > b.salavg;

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.

On Targget Treinamento e Consultoria

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.

On Targget Treinamento e Consultoria

12

Introduo ao Oracle: SQL e PL/SQL

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.

9. Produzindo Resultados mais Legveis com SQL*Plus

On Targget Treinamento e Consultoria

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.

On Targget Treinamento e Consultoria

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.

On Targget Treinamento e Consultoria

Funes Bsicas

Utilizando Variveis de Substituio com (&)


SQL> SELECT 2 FROM 3 WHERE empno, ename, sal, deptno emp empno = &employee_num;

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.

On Targget Treinamento e Consultoria

Funes Bsicas

Utilizando o Comando SET VERIFY


SQL> SQL> 2 3 SET VERIFY ON SELECT empno, ename, sal, deptno FROM emp WHERE empno = &employee_num;

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.

On Targget Treinamento e Consultoria

Funes Bsicas

Valores Caractere e Data com Variveis de Substituio


SQL> SELECT 2 FROM 3 WHERE ename, deptno, sal*12 emp job = '&job_title';

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.

On Targget Treinamento e Consultoria

Funes Bsicas

Especificando Nomes de Colunas, Expresses e Textos em Tempo de Execuo


Utilize variveis de substituio para completar: Uma condio WHERE Uma clusula ORDER BY Uma expresso de coluna Um nome de tabela Um comando SELECT inteiro

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.

On Targget Treinamento e Consultoria

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

On Targget Treinamento e Consultoria

Funes Bsicas

Utilizando Variveis de Substituio com (&&)


SQL> SELECT empno, ename, job, &&column_name 2 FROM emp 3 ORDER BY &column_name;

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.

On Targget Treinamento e Consultoria

Funes Bsicas

Definindo Variveis de Usurio


Voc pode predefinir variveis de usurio antes de executar um comando SELECT. O SQL*Plus prov dois comandos para definir e setar variveis de usurio: DEFINE e ACCEPT. Se voc precisar especificar espaos quando utilizar o comando DEFINE, voc deve colocar os espaos dentro de aspas simples.
Comando DEFINE variable = value DEFINE variable DEFINE ACCEPT (veja a sintaxe a seguir) Descrio Cria uma varivel de usurio do tipo de dado CHAR e atribui um valor a ela Mostra a varivel, seu valor e seu tipo de dado Mostra todas as variveis de usurio com seus valores e tipos de dados L uma linha de entrada do usurio e a armazena em uma varivel

On Targget Treinamento e Consultoria

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.

FOR[MAT] PROMPT text HIDE

Nota: No prefixe o parmetro de substituio do SQL*Plus com (&) quando referenciar o parmetro no comando ACCEPT.

On Targget Treinamento e Consultoria

11

Funes Bsicas

Utilizando o Comando ACCEPT


ACCEPT ' SELECT FROM WHERE / dept PROMPT 'Provide the department name: * dept dname = UPPER('&dept')

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

On Targget Treinamento e Consultoria

12

Funes Bsicas

Comandos DEFINE e UNDEFINE


As variveis permanecem definidas at que voc: Execute o comando UNDEFINE para a varivel Encerre o SQL*Plus Quando voc remove variveis, voc pode verificar suas mudanas com o comando DEFINE. Quando voc encerra o SQL*Plus, as variveis definidas durante aquela sesso so perdidas. Para definir essas variveis para cada sesso, modifique seu arquivo login.sql de forma que essas variveis sejam criadas durante a inicializao.

On Targget Treinamento e Consultoria

13

Funes Bsicas

Utilizando o Comando DEFINE


SQL> DEFINE deptname = sales SQL> DEFINE deptname

DEFINE DEPTNAME

= "sales" (CHAR)

SQL> SELECT 2 FROM 3 WHERE

* dept dname = UPPER('&deptname');

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

On Targget Treinamento e Consultoria

14

Funes Bsicas

Customizando o Ambiente do SQL*Plus


SET system_variable value

SQL> SET ECHO ON

SQL> SHOW ECHO echo ON

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.

On Targget Treinamento e Consultoria

15

Funes Bsicas

Variveis do Comando SET


Variveis SET e Valores ARRAY[SIZE] {20 | n} COLSEP {_ | text} FEED[BACK] { 6 | n | OFF | ON} HEA[DING] {OFF | ON} LIN[ESIZE] {80 | n} LONG {80 | n} PAGES[IZE] {24 | n} PAU[SE] {OFF | ON | text} TERM[OUT] {OFF|ON} Descrio Configura o tamanho da leitura de dados a partir do banco de dados Configura o texto para ser impresso entre as colunas. O padro um espao simples Exibe o nmero de registros retornados por uma consulta quando a consulta retorna pelo menos n registros Determina quando os cabealhos de coluna devem ser exibidos nos relatrios Configura o nmero de caracteres por linha para n Configura o tamanho mximo para a exibio de valores do tipo LONG Especifica o nmero de linhas por pgina de sada Permite que voc controle o scroll do seu terminal (Voc deve pressionar [Return] aps visualizar cada pausa). Determina quando o resultado deve ser exibido na tela

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.

On Targget Treinamento e Consultoria

16

Funes Bsicas

Salvando as Customizaes no Arquivo login.sql


O arquivo login.sql possui SETs padro e outros comandos do SQL*Plus que voc pode necessitar para todas as sesses. O arquivo lido e os comandos so implementados durante o login. Quando voc encerra sua sesso, todas as configuraes customizadas so perdidas.

Modificando as Configuraes Default


As configuraes implementadas pelo arquivo login.sql podem ser modificadas durante a sesso atual. Mudanas efetuadas ficam ativas apenas para aquela sesso. Assim que voc a encerra, essas configuraes so perdidas. Adiciona configuraes permanentes para o arquivo login.sql.

On Targget Treinamento e Consultoria

17

Funes Bsicas

Comandos de Formatao do SQL*Plus


Obtendo Resultados mais Legveis
Voc pode controlar as caractersticas do relatrio utilizando os seguintes comandos:
Comando COL[UMN] [column option] TTI[TLE] [text | OFF | ON] BTI[TLE] [text | OFF | ON] BRE[AK] [ON report_element] Descrio Controla a formatao de colunas Especifica um cabealho a ser apresentado no topo de cada pgina Especifica um rodap a ser apresentado no final de cada pgina do relatrio Suprime valores duplicados e divide linhas de dados com linhas em branco

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.

On Targget Treinamento e Consultoria

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

On Targget Treinamento e Consultoria

19

Funes Bsicas

Utilizando o Comando COLUMN


Crie cabealhos de coluna: COLUMN ename HEADING 'Employee|Name' FORMAT A15 COLUMN sal JUSTIFY LEFT FORMAT $99,990.00 COLUMN mgr FORMAT 999999999 NULL 'No manager'

Mostre a configurao atual para a coluna ENAME: COLUMN ename

Limpe as configuraes para a coluna ENAME: COLUMN ename CLEAR

Comando COL[UMN] column COL[UMN] COL[UMN] column CLE[AR] CLE[AR] COL[UMN]

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 (-).

On Targget Treinamento e Consultoria

20

Funes Bsicas

Mscaras do Comando COLUMN

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.

On Targget Treinamento e Consultoria

21

Funes Bsicas

Utilizando o Comando BREAK


Para suprimir duplicidades: SQL> BREAK ON ename ON job

Para produzir sumrios gerais: SQL> BREAK ON report

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

Limpe todas as configuraoes de BREAK utilizando o comando CLEAR: CLEAR BREAK

On Targget Treinamento e Consultoria

22

Funes Bsicas

Utilizando os Comandos TTITLE e BTITLE


TTI[TLE] [text|OFF|ON]

Configure o cabealho do relatrio: SQL> TTITLE 'Salary|Report'

Configure o rodap do relatrio: SQL> BTITLE 'Confidential'

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.

On Targget Treinamento e Consultoria

23

Funes Bsicas

Criando um Arquivo de Script para Executar um Relatrio


Voc pode entrar cada um dos comandos do SQL*Plus no prompt de SQL ou coloc-lo todos, incluindo o comando SELECT, em um arquivo de comandos (ou script). Um arquivo de script consiste em pelo menos um comando SELECT e vrios comandos do SQL*Plus.

Passos para Criar um Arquivo de Script


1. Crie o comando SQL SELECT no prompt de SQL. Assegure-se de que os dados necessrios para o relatrio estejam corretos antes de salvar o comando para um arquivo e aplicar os comandos de formatao. Assegura-se que a classificao da clusula ORDER BY esteja de acordo com as quebras que voc venha a definir para o relatrio. 2. Salve o comando SELECT para um arquivo de script. 3. Edite o arquivo de script para colocar os comandos do SQL*Plus. 4. Adicione os comandos de formatao necessrios antes do comando SELECT. Assegure-se de no colocar comandos do SQL*Plus dentro do comando SELECT. 5. Verifica que o comando SELECT seja seguido por um caractere de execuo, ou o caracter (;) ou uma barra (/). 6. Adicione comandos para limpar as formataes aps o caracter de execuo do comando SELECT. Como alternativa, voc pode chamar um arquivo padro que contm todos os comandos de limpeza de formatao. 7. Salve o arquivo de script com suas modificaes. 8. No SQL*Plus, execute o arquivo de script entrando o comando START filename ou @filename. Este comando necessrio para ler e executar o arquivo de script.

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.

On Targget Treinamento e Consultoria

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 /

On Targget Treinamento e Consultoria

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.

On Targget Treinamento e Consultoria

Introduo ao Oracle: SQL e PL/SQL

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

ANNUAL SALARY ---------$34,200.00 $15,000.00 $19,200.00 $18,000.00 $11,400.00 $15,000.00

10. Manipulando Dados

On Targget Treinamento e Consultoria

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.

On Targget Treinamento e Consultoria

Funes Bsicas

Linguagem de Manipulao de Dados


Linguagem de manipulao de dados (DML) uma parte essencial do SQL. Quando voc necessita adicionar, atualizar ou apagar dados no banco de dados, voc executa um comando DML. Um conjunto de comandos DML formam uma unidade lgica de trabalho chamada de transao. Considere um banco de dados bancrio. Quando um cliente do banco transfere dinheiro de uma poupana para uma conta corrente, a transao poderia consistir de trs operaes separadas: diminur da poupana, aumentar na conta corrente e registrar a transao no dirio de transaes. O Servidor Oracle deve garantir que todos os trs comandos SQL sejam executados para manter as contas equilibradas. Quando algo impede um dos comandos da transao de executar, devem ser desfeitas as mudanas causadas pelos outros comandos da transao.

On Targget Treinamento e Consultoria

Funes Bsicas

Inserindo uma Nova Linha em uma Tabela

O grfico acima insere um departamento novo para a tabela DEPT.

On Targget Treinamento e Consultoria

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.

On Targget Treinamento e Consultoria

Funes Bsicas

Inserindo Novas Linhas


SQL> INSERT INTO dept (deptno, dname, loc) 2 VALUES (50, 'DEVELOPMENT', 'DETROIT'); 1 row created.

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.

On Targget Treinamento e Consultoria

Funes Bsicas

Inserindo Linhas com Valores Nulos


Mtodo implcito: SQL> INSERT INTO 2 VALUES 1 row created. dept (deptno, dname ) (60, 'MIS');

Mtodo explcito: SQL> INSERT INTO 2 VALUES 1 row created. dept (70, 'FINANCE', NULL);

Mtodo Implcito Explcito

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.

On Targget Treinamento e Consultoria

Funes Bsicas

Inserindo Valores Especiais


SQL> INSERT INTO 2 3 4 VALUES 5 6 1 row created. emp (empno, ename, job, mgr, hiredate, sal, comm, deptno) (7196, 'GREEN', 'SALESMAN', 7782, SYSDATE, 2000, NULL, 10);

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.

Confirmando Inseres para uma Tabela


SQL> SELECT 2 FROM 3 WHERE empno, ename, job, hiredate, comm emp empno = 7196;

EMPNO ENAME JOB HIREDATE COMM --------- ---------- --------- ---------------7196 GREEN SALESMAN 01-DEC-97

On Targget Treinamento e Consultoria

Funes Bsicas

Inserindo Valores de Data Especficos


Adicione um novo empregado: SQL> INSERT INTO emp 2 VALUES (2296,'AROMANO','SALESMAN',7782, 3 TO_DATE('FEB 3,97', 'MON DD, YY'), 4 1300, NULL, 10); 1 row created.

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.

On Targget Treinamento e Consultoria

Funes Bsicas

Inserindo Valores Utilizando Variveis de Substituio


SQL> INSERT INTO dept (deptno, dname, loc) 2 VALUES (&department_id, 3 '&department_name', '&location');

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.

On Targget Treinamento e Consultoria

10

Funes Bsicas

Criando um Script com Prompts Customizados

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.

On Targget Treinamento e Consultoria

11

Funes Bsicas

Copiando Linhas a Partir de Outra Tabela


SQL> INSERT INTO managers(id, name, salary, hiredate) 2 SELECT empno, ename, sal, hiredate 3 FROM emp 4 WHERE job = 'MANAGER'; 3 rows created.

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.

On Targget Treinamento e Consultoria

12

Funes Bsicas

Alterando Dados em uma Tabela

O grfico acima modifica o nmero do departamento de CLARK de 10 para 20.

On Targget Treinamento e Consultoria

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.

On Targget Treinamento e Consultoria

14

Funes Bsicas

Alterando Linhas em uma Tabela


Linhas especificas so modificadas quando voc utiliza uma clusula WHERE. SQL> UPDATE emp 2 SET deptno = 20 3 WHERE empno = 7782; 1 row updated.

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.

Nota: A tabela EMPLOYEE tem os mesmos dados que a tabela EMP.

On Targget Treinamento e Consultoria

15

Funes Bsicas

Atualizando com Subconsultas Multiple-Column


SQL> UPDATE emp 2 SET (job, deptno) = 3 (SELECT job, deptno 4 FROM emp 5 WHERE empno = 7499) 6 WHERE empno = 7698; 1 row updated.

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

On Targget Treinamento e Consultoria

16

Funes Bsicas

Atualizando Linhas com Valores de Outra Tabela


SQL> UPDATE employee 2 SET deptno = 3 4 5 WHERE job = 6 7 2 rows updated. (SELECT FROM WHERE (SELECT FROM WHERE deptno emp empno = 7788) job emp empno = 7788);

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.

On Targget Treinamento e Consultoria

17

Funes Bsicas

Atualizando Linhas: Erro de Constraint de Integridade

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.

On Targget Treinamento e Consultoria

18

Funes Bsicas

Removendo uma Linha de uma Tabela

O grfico acima remove o departamento DEVELOPMENT da tabela DEPT (assumindo que no existem constraints definidas na tabela DEPT).

On Targget Treinamento e Consultoria

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.

On Targget Treinamento e Consultoria

20

Funes Bsicas

Removendo Linhas de uma Tabela


Linhas especficas so removidas quando voc utiliza a clusula WHERE. SQL> DELETE FROM 2 WHERE 1 row deleted. department dname = 'DEVELOPMENT';

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',

Nota: A tabela DEPARTMENT possui os mesmos dados da tabela DEPT.

On Targget Treinamento e Consultoria

21

Funes Bsicas

Removendo Linhas com Base nos Valores de Outra Tabela


SQL> DELETE FROM 2 WHERE 3 4 5 6 rows deleted. employee deptno = (SELECT deptno FROM dept WHERE dname ='SALES');

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.

On Targget Treinamento e Consultoria

22

Funes Bsicas

Removendo Linhas: Erro de Constraint de Integridade

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.

On Targget Treinamento e Consultoria

23

Funes Bsicas

Transaes de Banco de Dados


O Servidor Oraclle garante a consistncia dos dados baseado em transaes. Transaes fornecem maior flexibilidade e controle para a modificao dos dados, assegurando a consistncia dos mesmos no caso de falha do processo do usurio ou falha do sistema. Transaes consistem em comandos DML que compem uma mudana consistente dos dados. Por exemplo, uma transferncia de fundos entre duas contas deve incluir o dbito para uma conta e o crdito para outra conta no mesmo valor. Ambas as aes devem falhar ou devem ter sucesso juntas. O crdito no pode ser efetuado sem o correspondente dbito.

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

Quando uma Transao Inicia ou Termina?


Uma transao inicia quando o primeiro comando SQL executado e termina quando um dos seguintes eventos acontece: Um comando COMMIT ou ROLLBACK executado Uma comando DDL, como CREATE, executado Uma comando DCL executado O usurio encerra o SQL*Plus Uma mquina ou o sistema falha

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.

On Targget Treinamento e Consultoria

24

Funes Bsicas

Vantagens do COMMIT e ROLLBACK


Garantem a consistncia dos dados Visualizao dos dados modificados antes de tornar as modificaes permanentes Agrupam logicamente operaes relacionadas

On Targget Treinamento e Consultoria

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

Nota: SAVEPOINT no faz parte do padro SQL ANSI.

On Targget Treinamento e Consultoria

26

Funes Bsicas

Processamento Implcito de Transaes


Situao Commit automtico Rollback automtico Circunstncias Comando DDL ou comando DCL executado Sada normal do SQL*Plus, sem explicitamente executar um COMMIT ou ROLLBACK Sada anormal do SQL*Plus ou falha do sistema

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.

On Targget Treinamento e Consultoria

27

Funes Bsicas

Situao dos Dados Antes do COMMIT ou ROLLBACK


Toda mudana dos dados feita durante a transao temporria at a transao sofrer commit.

Situao dos Dados Antes do COMMIT ou ROLLBACK


Operaes de manipulao de dados inicialmente afetam o buffer do banco de dados; portanto, o estado anterior dos dados pode ser recuperado. O usurio atual pode visualizar os resultados das operaes de manipulao de dados examinando as tabelas. Outros usurios no podem visualizar os resultados das operaes de manipulao de dados efetuadas pelo usurio atual. O Servidor Oracle fornece leitura consistente para assegurar que cada usurio visualize os dados como ficaram aps o ltimo commit. As linhas afetadas so bloqueadas; outros usurios no podem modificar os dados destas linhas.

On Targget Treinamento e Consultoria

28

Funes Bsicas

Situao dos Dados Aps o COMMIT


Efetive as mudanas pendentes utilizando o comando COMMIT. Aps o COMMIT: Modificaes para os dados so efetivadas no banco de dados. O estado anterior dos dados fica permanentemente perdido. Todos os usurios podem visualizar os resultados da transao. Os locks nas linhas afetadas so liberados; as linhas ficam disponveis para outros usurios executarem novas mudanas nos dados. Todos o savepoints so eliminados.

On Targget Treinamento e Consultoria

29

Funes Bsicas

Efetivando os Dados
Faa as alteraes: SQL> UPDATE emp 2 SET deptno = 10 3 WHERE empno = 7782; 1 row updated.

Efetive as alteraes: SQL> COMMIT; Commit complete.

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.

SQL> COMMIT; Commit complete.

On Targget Treinamento e Consultoria

30

Funes Bsicas

Situao dos Dados Aps o ROLLBACK


SQL> DELETE FROM employee; 14 rows deleted. SQL> ROLLBACK; Rollback complete.

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.

On Targget Treinamento e Consultoria

31

Funes Bsicas

Desfazendo as Alteraes At uma Marca


SQL> UPDATE... SQL> SAVEPOINT update_done; Savepoint created. SQL> INSERT... SQL> ROLLBACK TO update_done; Rollback complete.

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.

On Targget Treinamento e Consultoria

32

Funes Bsicas

Rollback a Nvel de Comando


Parte de uma transao pode ser descartada por um rollback implcito se um erro de execuo de comando for detectado. Se um comando DML falhar durante sua execuo em uma transao, seu efeito ser descartado por um rollback a nvel de comando, mas as mudanas feitas pelos comandos DML anteriores na transao no sero descartadas. Eles podem ser confirmados ou descartados explicitamente pelo usurio. O Oracle executa um COMMIT implcito antes e depois de qualquer comando de definio de dados (DDL). Portanto, se seu comando DDL no executar prosperamente, voc no poder desfazer as mudanas anteriores porque o servidor j emitiu um commit. Termine suas transaes explicitamente executando um comando COMMIT ou ROLLBACK.

On Targget Treinamento e Consultoria

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.

On Targget Treinamento e Consultoria

34

Funes Bsicas

Implementao de Leitura Consistente

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.

On Targget Treinamento e Consultoria

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).

Como o Oracle Efetua o Lock dos Dados


Lock em um banco de dados Oracle totalmente automtico e no requer nenhuma ao por parte do usurio. Lock implcito ocorre para todos os comandos SQL exceto SELECT. O mecanismo padro de lock Oracle automaticamente utiliza o mais baixo nvel aplicvel de restritividade, fornecendo um nvel maior de concorrncia, tambm provendo o mximo em integridade de dados. O Oracle tambm permite ao usurio efetuar locks dos dados manualmente.

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

On Targget Treinamento e Consultoria

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.

On Targget Treinamento e Consultoria

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.

Torne as inseres permanentes.

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.

On Targget Treinamento e Consultoria

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

18. 19. 20. 21.

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.

Torne a insero dos dados permanente.

On Targget Treinamento e Consultoria

39

Introduo ao Oracle: SQL e PL/SQL

11. Criando e Gerenciando Tabelas

On Targget Treinamento e Consultoria

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

On Targget Treinamento e Consultoria

Funes Bsicas

Objetos do Banco de Dados

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

Estruturas de Tabelas Oracle8i


Tabelas podem ser criadas a qualquer momento, at mesmo enquanto os usurios estiverem utilizando o banco de dados. Voc no precisa especificar o tamanho da tabela. O tamanho pode ser definido posteriormente pela quantidade de espao alocado para o banco de dados como um todo. Porm, importante calcular quanto espao utilizar uma tabela com o passar do tempo. Estruturas de tabelas podem ser modificadas de forma online. Nota: Outros objetos de banco de dados esto disponveis mas no sero estudados neste curso.

On Targget Treinamento e Consultoria

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.

On Targget Treinamento e Consultoria

Funes Bsicas

Comando CREATE TABLE


CREATE TABLE [schema.]table (column datatype [DEFAULT expr]);

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.

On Targget Treinamento e Consultoria

Funes Bsicas

Referenciando Tabelas de Outro Usurio


Um schema uma coleo de objetos. Objetos do schema so as estruturas lgicas que diretamente se referem aos dados em um banco de dados. Objetos de schema incluem tabelas, vises, sinnimos, sequences, stored procedures, ndices, clusters e database links. Se uma tabela no pertence ao usurio, o nome do dono (owner) deve prefixar a tabela.

On Targget Treinamento e Consultoria

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.

On Targget Treinamento e Consultoria

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));

SQL> DESCRIBE dept

Confirme a criao da tabela:

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.

On Targget Treinamento e Consultoria

Funes Bsicas

Consultando o Dicionrio de Dados


Visualize as tabelas criadas pelo usurio: SQL> SELECT 2 FROM * user_tables;

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;

On Targget Treinamento e Consultoria

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

On Targget Treinamento e Consultoria

10

Funes Bsicas

Criando uma Tabela Utilizando uma Subconsulta


CREATE TABLE table [column(, column...)] AS subquery;

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.

Criando uma Tabela a Partir de Linhas em Outra Tabela


SQL> CREATE TABLE 2 AS 3 SELECT hiredate 4 FROM 5 WHERE Table created. dept30 empno, ename, sal*12 ANNSAL, emp deptno = 30;

SQL> DESCRIBE dept30

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.

On Targget Treinamento e Consultoria

12

Funes Bsicas

Comando ALTER TABLE


ALTER TABLE ADD table (column datatype [DEFAULT expr] [, column datatype]...);

ALTER TABLE MODIFY

table (column datatype [DEFAULT expr] [, column datatype]...);

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.

On Targget Treinamento e Consultoria

13

Funes Bsicas

Adicionando uma Coluna

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.

Diretrizes para Adicionar uma Coluna


Voc pode adicionar ou modificar colunas, mas voc no pode remov-las de uma tabela. Voc no pode especificar onde a coluna ir aparecer. A nova coluna se torna a ltima coluna. O exemplo acima adiciona uma coluna chamada JOB para a tabela DEPT30. A coluna JOB se torna a ltima coluna da tabela. Nota: Se uma tabela j possui linhas quando uma coluna adicionada, ento a nova coluna inicialmente nula em todas as linhas.

On Targget Treinamento e Consultoria

14

Funes Bsicas

Modificando uma Coluna


ALTER TABLE dept30 MODIFY (ename VARCHAR2(15)); Table altered.

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.

On Targget Treinamento e Consultoria

15

Funes Bsicas

Removendo uma Tabela


SQL> DROP TABLE dept30; Table dropped.

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;

Onde: table o nome da tabela.

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.

On Targget Treinamento e Consultoria

16

Funes Bsicas

Modificando o Nome de um Objeto


SQL> RENAME dept TO department; Table renamed.

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.

Voc deve ser o dono do objeto que voc quer renomear.

On Targget Treinamento e Consultoria

17

Funes Bsicas

Truncando uma Tabela


SQL> TRUNCATE TABLE department; Table truncated.

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.

On Targget Treinamento e Consultoria

18

Funes Bsicas

Adicionando Comentrios para Tabelas


SQL> COMMENT ON TABLE emp 2 IS 'Employee Information'; Comment created.

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

Sintaxe: COMMENT ON TABLE table | COLUMN table.column IS 'text';

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 ' ';

On Targget Treinamento e Consultoria

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

Name Null? ---------- -------ID NAME

Type ----------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

Name Null? ------------- -------ID LAST_NAME FIRST_NAME DEPT_ID

Type -----------NUMBER(7) VARCHAR2(25) VARCHAR2(25) NUMBER(7)

On Targget Treinamento e Consultoria

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.

On Targget Treinamento e Consultoria

21

Introduo ao Oracle: SQL e PL/SQL

12. Implementando Constraints

On Targget Treinamento e Consultoria

Funes Bsicas

Objetivos
Descrever constraints Criar e administrar constraints

On Targget Treinamento e Consultoria

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.

Constraints de Integridade de Dados


Constraint NOT NULL UNIQUE Key PRIMARY KEY FOREIGN KEY CHECK Descrio Especifica que a coluna no pode conter valores nulos Especifica uma coluna ou combinao de colunas cujo os valores devem ser nicos para todas as linhas da tabela Identifica de forma nica cada linha da tabela Estabelece e garante um relacionamento de chave estrangeira entre a coluna e uma coluna da tabela referenciada Especifica uma condio que deve ser verdadeira

On Targget Treinamento e Consultoria

Funes Bsicas

Diretrizes para Constraints


Todas as constraints so armazenadas no dicionrio de dados. As constraints so fceis de referenciar se voc tiver fornecido um nome significativo. Nomes de constraints devem seguir as regras padro de nomenclatura de objetos. Se voc no fornecer um nome para a constraint, o Oracle gera um nome com o formato SYS_Cn, onde n um inteiro para criar um nome de constraint nico. Contraints podem ser definidas no momento de criao da tabela ou depois que a tabela for criada. Voc pode visualizar as constraints definidas para uma tabela especfica consultando a tabela do dicionrio de dados USER_CONSTRAINTS.

On Targget Treinamento e Consultoria

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

On Targget Treinamento e Consultoria

Funes Bsicas

Sintaxe: constraint_name o nome da constraint. constraint_type o tipo da constraint.

Constraint a nvel de coluna: column [CONSTRAINT constraint_name] constraint_type,

Constraint a nvel de tabela: column,... [CONSTRAINT constraint_name] constraint_type (column, ...),

On Targget Treinamento e Consultoria

Funes Bsicas

Constraint NOT NULL

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.

On Targget Treinamento e Consultoria

Funes Bsicas

Constraint UNIQUE Key

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.

On Targget Treinamento e Consultoria

Funes Bsicas

Constraint PRIMARY KEY

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.

On Targget Treinamento e Consultoria

Funes Bsicas

Constraint FOREIGN KEY

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.

On Targget Treinamento e Consultoria

10

Funes Bsicas

Palavras Chave de Constraints FOREIGN KEY


A chave estrangeira definida na tabela dependente (filha), e a tabela que contm a coluna referenciada a tabela pai. Uma chave estrangeira definida utilizando-se uma combinao das seguintes palavras chaves: FOREIGN KEY: utilizada para definir a coluna da tabela filha quando a constraint for definida a nvel de tabela. REFERENCES: identifica a tabela e coluna da tabela referenciada (pai). ON DELETE CASCADE: indica que quando uma linha da tabela pai apagada, as linhas dependentes da tabela filha tambm sero apagadas. Sem a opo ON DELETE CASCADE, uma linha da tabela pai no pode ser apagada se estiver sendo referenciada na tabela filha.

On Targget Treinamento e Consultoria

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),...

On Targget Treinamento e Consultoria

12

Funes Bsicas

Adicionando uma Constraint


ALTER TABLE table ADD [CONSTRAINT constraint] type (column);

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.

On Targget Treinamento e Consultoria

13

Funes Bsicas

Removendo uma Constraint


Remova a constraint do gerente da tabela EMP: SQL> ALTER TABLE emp 2 DROP CONSTRAINT emp_mgr_fk; Table altered.

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.

On Targget Treinamento e Consultoria

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];

Onde: table constraint o nome da tabela. o nome da constraint.

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.

On Targget Treinamento e Consultoria

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;

Onde: table constraint o nome da tabela. o nome da 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.

On Targget Treinamento e Consultoria

16

Funes Bsicas

Visualizando Constraints
SQL> SELECT 2 3 FROM 4 WHERE constraint_name, constraint_type, search_condition user_constraints table_name = 'EMP';

CONSTRAINT_NAME --------------------------------------------SYS_C00674 SYS_C00675 EMP_EMPNO_PK ...

C SEARCH_CONDITION C EMPNO IS NOT NULL C DEPTNO IS NOT NULL P

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.

On Targget Treinamento e Consultoria

17

Funes Bsicas

Visualizando as Colunas Associadas com Constraints


SQL> SELECT 2 FROM 3 WHERE constraint_name, column_name user_cons_columns table_name = 'EMP';

CONSTRAINT_NAME ------------------------EMP_DEPTNO_FK EMP_EMPNO_PK EMP_MGR_FK SYS_C00674 SYS_C00675

COLUMN_NAME ---------------------DEPTNO EMPNO MGR EMPNO DEPTNO

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.

On Targget Treinamento e Consultoria

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).

On Targget Treinamento e Consultoria

19

Introduo ao Oracle: SQL e PL/SQL

13. Criando Vises

On Targget Treinamento e Consultoria

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

On Targget Treinamento e Consultoria

Funes Bsicas

Objetos do Banco de Dados

On Targget Treinamento e Consultoria

Funes Bsicas

O que uma Viso?

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.

On Targget Treinamento e Consultoria

Funes Bsicas

Porqu Utilizar Vises?


Para restringir o acesso ao banco de dados Para tornar simples consultas complexas Para permitir independncia de dados Para apresentar vises diferentes do mesmo dado

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.

On Targget Treinamento e Consultoria

Funes Bsicas

Vises Simples e Vises Complexas

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

On Targget Treinamento e Consultoria

Funes Bsicas

Criando uma Viso


CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW view [(alias[, alias]...)] AS subquery [WITH CHECK OPTION [CONSTRAINT constraint]] [WITH READ ONLY]

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.

On Targget Treinamento e Consultoria

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)

Diretrizes para Criao de Vises


A subconsulta que define uma viso podem conter uma sintaxe complexa do comando SELECT, incluindo joins, grupos e subconsultas. A subconsulta que define uma viso no pode conter uma clusula ORDER BY. A clusula ORDER BY deve ser especificada quando voc recuperar dados da viso. Se voc no especificar um nome de constraint para a viso criada com CHECK OPTION, o sistema atribui um nome default no formato SYS_Cn. Voc pode utilizar a opo OR REPLACE para modificar a definio da viso sem ter que remov-la e recri-la ou ter que repassar os privilgios de objeto previamente concedidos. Voc pode controlar os nomes de colunas incluindo alias de coluna dentro da subconsulta. SQL> CREATE VIEW salvu30 2 AS SELECT empno EMPLOYEE_NUMBER, ename NAME, 3 sal SALARY 4 FROM emp 5 WHERE deptno = 30; View created.

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.

On Targget Treinamento e Consultoria

Funes Bsicas

Recuperando Dados de uma Viso


SQL> SELECT 2 FROM * salvu30;

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.

On Targget Treinamento e Consultoria

Funes Bsicas

Consultando uma Viso

Vises no Dicionrio de Dados


Uma vez criada a viso, voc pode consultar a tabela do dicionrio de dados chamada USER_VIEWS para obter o nome da viso e sua definio. O texto do comando SELECT que constitui a viso armazenado em uma coluna tipo LONG.

Acesso aos Dados em Vises


Quando voc acessa dados, utilizando uma viso, o Servidor Oracle executa as seguintes operaes: 1. recupera a definio da viso da tabela do dicionrio de dados USER_VIEWS. 2. confere os privilgios de acesso para a tabela bsica da viso. 3. converte a consulta para a viso em uma operao equivalente para a tabela ou tabelas bsicas. Em outras palavras, os dados so recuperados a partir das, ou uma atualizao feita para, as tabelas bsicas.

On Targget Treinamento e Consultoria

10

Funes Bsicas

Modificando uma Viso


SQL> 2 3 4 5 View CREATE OR REPLACE VIEW empvu10 (employee_number, employee_name, job_title) AS SELECT empno, ename, job FROM emp WHERE deptno = 10; created.

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.

On Targget Treinamento e Consultoria

11

Funes Bsicas

Criando uma Viso Complexa


SQL> CREATE VIEW 2 (name, 3 AS SELECT MAX(e.sal), 4 5 FROM 6 WHERE 7 GROUP BY View created. dept_sum_vu minsal, maxsal, avgsal) d.dname, MIN(e.sal), AVG(e.sal) emp e, dept d e.deptno = d.deptno d.dname;

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

On Targget Treinamento e Consultoria

12

Funes Bsicas

Regras para Executar Operaes DML em uma Viso


Voc pode executar operaes DML nos dados atravs de uma viso desde que estas operaes sigam certas regras. Voc pode remover uma linha de uma viso a menos que ela contenha um dos seguintes: Funes de grupo Uma clusula GROUP BY A palavra chave DISTINCT Voc pode modificar dados em uma viso a menos que ela contenha quaisquer das condies mencionadas para a deleo de linhas ou qualquer uma das seguintes: Colunas definidas por expresses, por exemplo: SALARY * 12 A pseudo coluna ROWNUM Voc pode adicionar dados por uma viso a menos que ela contenha quaisquer das condies mencionadas anteriormente ou se existirem colunas NOT NULL, sem um valor default, na tabela bsica que no foram selecionadas pela viso. Todos os valores exigidos devem estar presentes na viso. Lembre-se que voc est adicionando valores diretamente na tabela referenciada pela viso.

On Targget Treinamento e Consultoria

13

Funes Bsicas

Utilizando a Clusula WITH CHECK OPTION


SQL> 2 3 4 5 View CREATE OR REPLACE VIEW empvu20 AS SELECT * FROM emp WHERE deptno = 20 WITH CHECK OPTION CONSTRAINT empvu20_ck; created.

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.

On Targget Treinamento e Consultoria

14

Funes Bsicas

Impedindo Operaes DML


SQL> 2 3 4 5 6 View CREATE OR REPLACE VIEW empvu10 (employee_number, employee_name, job_title) AS SELECT empno, ename, job FROM emp WHERE deptno = 10 WITH READ ONLY; created.

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

On Targget Treinamento e Consultoria

15

Funes Bsicas

Removendo uma Viso


DROP VIEW view;

SQL> DROP VIEW empvu10; View dropped.

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.

On Targget Treinamento e Consultoria

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.

On Targget Treinamento e Consultoria

17

Funes Bsicas

EMPLOYEE DEPTNO ---------- --------KING 10 BLAKE 30 CLARK 10 JONES 20 MARTIN 30 ... 14 rows selected.

On Targget Treinamento e Consultoria

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.

EMPLOYEE_ID ----------7566 7902 7369 7788 7876

EMPLOYEE DEPARTMENT_ID -------- ------------JONES 20 FORD 20 SMITH 20 SCOTT 20 ADAMS 20

7.

Tente alterar o departamento do empregado SMITH para 30 atravs da viso.

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.

On Targget Treinamento e Consultoria

19

Introduo ao Oracle: SQL e PL/SQL

14. Outros Objetos do Banco de Dados

On Targget Treinamento e Consultoria

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

On Targget Treinamento e Consultoria

Funes Bsicas

Objetos do Banco de Dados

On Targget Treinamento e Consultoria

Funes Bsicas

O que uma Sequence?


Um gerador de seqncias pode ser utilizado para gerar nmeros seqnciais automaticamente para linhas em tabelas. Uma sequence um objeto do banco de dados criado por um usurio podendo ser compartilhado por mltiplos usurios Uma sequence um objeto do banco de dados criado por um usurio podendo ser compartilhado por mltiplos usurios. Um uso tpico para sequence criar um valor para uma chave primria, que deve ser nico para cada linha. A sequence gerada e incrementada por uma rotina interna do Oracle8i. Este objeto pode reduzir o tempo de desenvolvimento uma vez que reduz a quantidade de cdigo de aplicao necessria para gerar uma rotina que implemente uma seqncia. Os nmeros das seqncias so armazenados e gerados independentemente das tabelas. Portanto, a mesma sequence pode ser utilizadas em tabelas diferentes.

On Targget Treinamento e Consultoria

Funes Bsicas

Comando CREATE SEQUENCE


CREATE SEQUENCE sequence [INCREMENT BY n] [START WITH n] [{MAXVALUE n | NOMAXVALUE}] [{MINVALUE n | NOMINVALUE}] [{CYCLE | NOCYCLE}] [{CACHE n | NOCACHE}];

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.

START WITH n MAXVALUE n NOMAXVALUE

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).

On Targget Treinamento e Consultoria

Funes Bsicas

Criando uma Sequence


SQL> CREATE SEQUENCE dept_deptno 2 INCREMENT BY 1 3 START WITH 91 4 MAXVALUE 100 5 NOCACHE 6 NOCYCLE; Sequence created.

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.

On Targget Treinamento e Consultoria

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

On Targget Treinamento e Consultoria

Funes Bsicas

Pseudocolunas NEXTVAL e CURRVAL


Uma vez criada a sequence, voc pode utiliz-la para gerar nmeros seqnciais para suas tabelas. Referencie os valores da sequence utilizando as pseudocolunas NEXTVAL e CURRVAL. A pseudocoluna NEXTVAL utilizada para extrair sucessivos nmeros da sequence especificada. Voc deve qualificar NEXTVAL com o nome da sequence. Quando voc referncia sequence.NEXTVAL, um novo nmero da sequence gerado e colocado em CURRVAL. A pseudocoluna CURRVAL utilizada para se referenciar a um nmero da sequence que o usurio atual gerou anteriormente. NEXTVAL deve ser utilizada para gerar um nmero da sequence na sesso do usurio atual antes de CURRVAL poder ser referenciada. Voc deve qualificar CURRVAL com o nome da sequence. Quando sequence.CURRVAL referenciada, o ltimo valor retornado ao processo daquele usurio exibido.

Regras para Utilizar NEXTVAL e CURRVAL


Voc pode utilizar NEXTVAL e CURRVAL no seguinte: Na lista da clusula SELECT de um comando SELECT que no seja parte de uma subconsulta Na lista da clusula SELECT de uma subconsulta em um comando INSERT Na clusula VALUES de um comando INSERT Na clusula SET de um comando UPDATE Voc no pode utilizar NEXTVAL e CURRVAL no seguinte: Na lista da clusula SELECT de uma viso Em um comando SELECT com a palavra chave DISTINCT Em um comando SELECT com as clusulas GROUP BY, HAVING ou ORDER BY Em uma subconsulta no comando SELECT, DELETE ou UPDATE Na expresso da opo DEFAULT em um comando CREATE TABLE ou ALTER TABLE

On Targget Treinamento e Consultoria

Funes Bsicas

Utilizando uma Sequence


SQL> INSERT INTO dept (deptno, dname, loc) 2 VALUES (dept_deptno.NEXTVAL, 3 'MARKETING', 'SAN DIEGO'); 1 row created.

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:

SQL> INSERT INTO emp ... 2 VALUES (emp_empno.NEXTVAL, dept_deptno.CURRVAL, ...

Nota: O exemplo acima assume que uma sequence EMP_EMPNO j foi criada para gerar um nmero de empregado novo.

Mantendo em Memria os Valores da Sequence


Mantenha seqncias em memria para permitir acesso mais rpido aos valores da sequence. O cache populado na primeira referncia sequence. Cada solicitao para o prximo valor da sequence recuperado da memria. Aps a ltima seqncia ser utilizada, a prxima solicitao para a sequence busca outro cache de seqncias para a memria.

On Targget Treinamento e Consultoria

Funes Bsicas

Previna Falhas nos Valores da Sequence


Embora os geradores de seqncia forneam nmeros seqnciais sem falhas, esta ao ocorre independente de um commit ou rollback. Portanto, se voc efetuar o rollback de um comando que contm uma sequence, o nmero ser perdido. Outro evento que pode causar falhas na numerao da sequence uma fallha do sistema. Se a sequence possui valores no cache de memria, esses valores sero perdidos na falha do sistema. Uma vez que as sequences no so relacionadas diretamente s tabelas, a mesma sequence pode ser utilizada em mltiplas tabelas. Se isto ocorrer, cada tabela pode conter falhas nos nmeros seqnciais.

Visualizando o Prximo Valor Disponvel da Sequence sem Increment-lo


possvel visualizar o prximo valor disponvel da sequence sem increment-lo, porm somente se a sequence foi criada com NOCACHE, examinando a tabela USER_SEQUENCES.

On Targget Treinamento e Consultoria

10

Funes Bsicas

Modificando uma Sequence


SQL> ALTER SEQUENCE dept_deptno 2 INCREMENT BY 1 3 MAXVALUE 999999 4 NOCACHE 5 NOCYCLE; Sequence altered.

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}];

Onde: sequence o nome do gerador da sequence.

On Targget Treinamento e Consultoria

11

Funes Bsicas

Diretrizes para Modificar uma Sequence


Voc deve ser o dono ou possuir o privilgio ALTER para a sequence para poder modific-la. Somente os prximos nmeros da sequence sero afetados pelo comando ALTER SEQUENCE. A opo START WITH no pode ser modificada utilizando o comando ALTER SEQUENCE. A sequence deve ser removida e recriada para reiniciar em um nmero diferente. Algumas validaes so executadas. Por exemplo, um novo MAXVALUE no pode ser menor que o nmero atual da sequence. SQL> ALTER SEQUENCE dept_deptno 2 INCREMENT BY 1 3 MAXVALUE 90 4 NOCACHE 5 NOCYCLE; ALTER SEQUENCE dept_deptno * ERROR at line 1: ORA-04009: MAXVALUE cannot be made to be less than the current value

On Targget Treinamento e Consultoria

12

Funes Bsicas

Removendo uma Sequence


SQL> DROP SEQUENCE dept_deptno; Sequence dropped.

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;

Onde: sequence o nome do gerador da seqncia.

On Targget Treinamento e Consultoria

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.

On Targget Treinamento e Consultoria

14

Funes Bsicas

Como os ndices so Criados?


Podem ser criados dois tipos de ndices. Um tipo so os ndices nicos. O Servidor Oracle cria este tipo de ndice automaticamente quando voc define para uma coluna em uma tabela uma constraint PRIMARY KEY ou UNIQUE key. O nome do ndice o nome fornecido para a constraint. O outro tipo de ndice que um usurio pode criar um ndice no nico (nonunique). Por exemplo, voc pode criar um ndice em uma coluna definida como FOREIGN KEY para melhor a performance de um join em uma consulta.

On Targget Treinamento e Consultoria

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.

On Targget Treinamento e Consultoria

16

Funes Bsicas

Diretrizes para a Criao de ndices


Mais nem sempre Melhor
Muitos ndices em uma tabela nem sempre significam melhora na velocidade das consultas. Para cada operao DML que confirmada em uma tabela os ndices devem ser atualizados. Quanto mais ndices voc associou uma tabela, mais esforo o Servidor Oracle ter que realizar para atualizar todos os ndices aps uma operao DML.

Quando Criar um ndice


A coluna freqentemente utilizada na clusula WHERE ou em uma condio de join. A coluna possui uma grande faixa de valores. A coluna possui um grande nmero de valores nulos. Duas ou mais colunas so freqentemente utilizadas juntas em uma clusula WHERE ou condio de join. A tabela grande e a maioria das consultas recuperam menos que 2% a 4% das linhas. Lembre-se que se voc quiser garantir unicidade, voc deve definir uma constraint do tipo UNIQUE na definio da tabela. Ento, um ndice nico ser criado automaticamente.

Quando no Criar um ndice


A tabela for pequena. As colunas no so utilizadas freqentemente como uma condio da consulta. A maioria das consultas recuperam mais que 2% a 4% das linhas. A tabela freqentemente atualizada. Se voc possui um ou mais ndices em uma tabela, os comandos DML que acessam a tabela utilizam relativamente mais tempo para sua execuo devido a manuteno dos ndices.

On Targget Treinamento e Consultoria

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

On Targget Treinamento e Consultoria

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.

On Targget Treinamento e Consultoria

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.

On Targget Treinamento e Consultoria

20

Funes Bsicas

Criando e Removendo Sinnimos


SQL> CREATE SYNONYM d_sum 2 FOR dept_sum_vu; Synonym Created.

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.

On Targget Treinamento e Consultoria

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.

On Targget Treinamento e Consultoria

22

Introduo ao Oracle: SQL e PL/SQL

INDEX_NAME -------------------EMPLOYEE_DEPT_ID_IDX EMPLOYEE_ID_PK

TABLE_NAME -----------EMPLOYEE EMPLOYEE

UNIQUENES --------NONUNIQUE UNIQUE

15. Controlando o Acesso dos Usurios

On Targget Treinamento e Consultoria

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

On Targget Treinamento e Consultoria

Funes Bsicas

Controlando o Acesso dos Usurios

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.

On Targget Treinamento e Consultoria

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.

On Targget Treinamento e Consultoria

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.

Privilgios Tpicos do DBA


Privilgio de Sistema CREATE USER DROP USER DROP ANY TABLE BACKUP ANY TABLE Operaes Autorizadas Permite criar outros usurios Oracle (este privilgio necessrio para a role DBA) Remover outro usurio Remover uma tabela em qualquer schema Efetuar o backup de qualquer tabela em qualquer schema com o utilitrio de exportao

On Targget Treinamento e Consultoria

Funes Bsicas

Criando Usurios
CREATE USER IDENTIFIED BY user password;

SQL> 2 User

CREATE USER IDENTIFIED BY created.

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.

On Targget Treinamento e Consultoria

Funes Bsicas

Privilgios de Sistema do Usurio


GRANT privilege [, privilege...] TO user [, user...];

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

On Targget Treinamento e Consultoria

Funes Bsicas

Concedendo Privilgios de Sistema


SQL> GRANT create table, create sequence, create view 2 TO scott; Grant succeeded.

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.

On Targget Treinamento e Consultoria

Funes Bsicas

O que uma Role?

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.

Criando e Concedendo uma Role


Primeiro, o DBA deve criar a role. Depois o DBA pode associar privilgios e usurios para a role. Sintaxe: CREATE ROLE role;

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.

On Targget Treinamento e Consultoria

Funes Bsicas

Criando e Concedendo Privilgios para uma Role


SQL> CREATE ROLE manager; Role created.

SQL> GRANT create table, create view 2 TO manager; Grant succeeded.

SQL> GRANT manager TO BLAKE, CLARK; Grant succeeded.

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.

On Targget Treinamento e Consultoria

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;

Onde: user password o nome do usurio. especifica a nova senha.

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.

On Targget Treinamento e Consultoria

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];

Sintaxe: object_priv ALL columns ON object TO PUBLIC


On Targget Treinamento e Consultoria

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.

On Targget Treinamento e Consultoria

13

Funes Bsicas

Concedendo Privilgios de Objeto


Conceda privilgios de consulta para a tabela EMP: SQL> GRANT select 2 ON emp 3 TO sue, rich; Grant succeeded.

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.

On Targget Treinamento e Consultoria

14

Funes Bsicas

Utilizando as Opes WITH GRANT OPTION e PUBLIC


Palavra Chave WITH GRANT OPTION
Um privilgio que concedido com WITH GRANT OPTION pode ser passado para outros usurios e roles por quem o recebeu. Privilgios de objeto concedidos atravs de WITH GRANT OPTION so revogados quando o privilgio revogado do concedente. SQL> GRANT select, insert 2 ON dept 3 TO scott 4 WITH GRANT OPTION; Grant succeeded.

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.

Palavra Chave PUBLIC


Um dono de uma tabela pode conceder acesso para todos os usurios utilizando a palavra chave PUBLIC. SQL> GRANT select 2 ON alice.dept 3 TO PUBLIC; Grant succeeded.

O exemplo acima permite a todos os usurios do sistema consultar dados da tabela DEPT do usurio ALICE.

On Targget Treinamento e Consultoria

15

Funes Bsicas

Confirmando Privilgios Concedidos

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.

On Targget Treinamento e Consultoria

16

Funes Bsicas

Como Revogar Privilgios de Objeto


REVOKE {privilege [, privilege...] | ALL} ON object FROM {user[, user...] | role | PUBLIC} [CASCADE CONSTRAINTS];

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.

On Targget Treinamento e Consultoria

17

Funes Bsicas

Revogando Privilgios de Objeto


SQL> REVOKE select, insert 2 ON dept 3 FROM scott; Revoke succeeded.

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.

On Targget Treinamento e Consultoria

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.

On Targget Treinamento e Consultoria

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.

On Targget Treinamento e Consultoria

20

Funes Bsicas

TABLE_NAME OWNER ---------- ----------DEPT <user2>

13.

Revogue o privilgio SELECT do outro grupo.

On Targget Treinamento e Consultoria

21

Introduo ao Oracle: SQL e PL/SQL

16. Declarando Variveis

On Targget Treinamento e Consultoria

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

On Targget Treinamento e Consultoria

Funes Bsicas

Estrutura de um Bloco PL/SQL

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

On Targget Treinamento e Consultoria

Funes Bsicas

Executando Comandos e Blocos PL/SQL a partir do SQL*Plus

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.

On Targget Treinamento e Consultoria

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.

On Targget Treinamento e Consultoria

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

On Targget Treinamento e Consultoria

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.

On Targget Treinamento e Consultoria

Funes Bsicas

Tratando Variveis em PL/SQL


Declare e inicialize variveis dentro da seo de declarao. Voc pode declarar variveis na parte declarativa de qualquer bloco PL/SQL, subprograma ou package. Declaraes alocam espao de armazenamento para um valor, especificam seu tipo de dado e nomeiam a localizao de armazenamento de forma que voc possa referenci-la. Declaraes tambm podem atribuir um valor inicial e impor a constraint NOT NULL. Atribua novos valores a variveis dentro da seo executvel. O valor existente da varivel substitudo pelo novo. Voc deve declarar uma varivel antes de referenci-la em outros comandos, inclusive outros comandos de declarao. Passe valores para subprogramas PL/SQL atravs de parmetros. Existem trs modos de passar parmetros: IN (default), OUT e IN OUT. Voc utiliza um parmetro IN para passar valores para o subprograma chamado. Voc utiliza um parmetro OUT para retornar valores para quem executou o subprograma. E voc utiliza o parmetro IN OUT para passar valores iniciais para o subprograma chamado e retornar valores atualizados ao chamador. Visualize os resultados de um bloco PL/SQL atravs de variveis de sada. Voc pode usar variveis de referncia como entrada ou sada de comandos SQL de manipulao de dados.

On Targget Treinamento e Consultoria

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.

On Targget Treinamento e Consultoria

Funes Bsicas

Declarando Variveis PL/SQL


identifier [CONSTANT] datatype [NOT NULL] [:= | DEFAULT expr];

Declare v_hiredate v_deptno v_location c_comm

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;

On Targget Treinamento e Consultoria

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 ...

date number(2) NOT NULL := 10;

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.

On Targget Treinamento e Consultoria

12

Funes Bsicas

Atribuindo Valores para Variveis


identifier := expr;

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.

On Targget Treinamento e Consultoria

13

Funes Bsicas

Utilizando Variveis e Palavras Chaves


Variveis so inicializadas cada vez que um bloco ou subprograma executado. Por default, variveis so inicializadas com NULL. A menos que voc inicialize uma varivel explicitamente, seu valor indefinido (nulo). Utilize o operador de atribuio (:=) para variveis que no possuem um valor padro. v_hiredate := to_date('15-SEP-99', 'DD-MON-YY');

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'.

On Targget Treinamento e Consultoria

14

Funes Bsicas

Tipos de Dados Escalares


Um tipo de dado escalar armazena um nico valor e no possui componentes internos. Tipos de dados escalares podem ser classificados em quatro categorias: numrico, caractere, data e booleano. Tipos de dados caractere e numrico possuem subtipos que associam um tipo bsico a uma constraint. Por exemplo, INTEGER e POSITIVE so subtipos do tipo bsico NUMBER.
Tipo de Dado VARCHAR2 (maximum_length) NUMBER [(precision, scale)] DATE CHAR [(maximum_length)] LONG LONG RAW BOOLEAN BINARY_INTEGER PLS_INTEGER Descrio Tipo bsico para dados caractere de tamanho varivel de at 32767 bytes. No existe tamanho default para variveis e constantes tipo VARCHAR2. Tipo bsico para nmeros fixos e de ponto flutuante. Tipo bsico para data e hora. Valores tipo DATE incluem a hora do dia em segundos desde a meia-noite. A faixa de valores de datas est entre 4712 AC e 9999 DC. Tipo bsico para dados caractere de tamanho fixo de at 32767 bytes. Se voc no especificar um maximum_length, o tamanho default setado para 1. Tipo bsico para dados caractere de tamanho varivel de at 32760 bytes. O tamanho mximo de uma coluna tipo LONG do banco de dados 2147483647 bytes. Tipo bsico para dados binrios e strings tipo byte de at 32760 bytes. Dados LONG RAW no so interpretados pelo PL/SQL. Tipo bsico que armazena um de trs valores possveis utilizado para clculos lgicos: TRUE, FALSE ou NULL. Tipo bsico para inteiros entre -2147483647 e 2147483647. Tipo bsico para inteiros com sinal entre -2147483647 e 2147483647. Valores PLS_INTEGER necessitam de menos espao de armazenamento e so mais rpidos que valores NUMBER e BINARY_INTEGER.

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.

On Targget Treinamento e Consultoria

15

Funes Bsicas

Declarao de Variveis Escalares


v_job v_count v_total_sal v_orderdate c_tax_rate v_valid VARCHAR2(9); BINARY_INTEGER := 0; NUMBER(9,2) := 0; DATE := SYSDATE + 7; CONSTANT NUMBER(3,2) := 8.25; BOOLEAN NOT NULL := TRUE;

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.

On Targget Treinamento e Consultoria

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.

On Targget Treinamento e Consultoria

17

Funes Bsicas

Declarando Variveis com o Atributo %TYPE


Declare variveis para armazenar o nome de um empregado. ... v_ename ...

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 ...

NUMBER(7,2); v_balance%TYPE := 10;

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.

On Targget Treinamento e Consultoria

18

Funes Bsicas

Declarando Variveis BOOLEAN


Com PL/SQL voc pode comparar variveis em comandos SQL e procedurais. Estas comparaes, chamadas expresses boleanas, consistem em expresses simples ou complexas separadas por operadores relacionais. Em um comando SQL, voc pode utilizar expresses boleanas para especificar as linhas de uma tabela que devem ser afetadas pelo comando. Em um comando procedural, expresses boleanas so a base para o controle condicional. Exemplos: v_sal1 := 50000; v_sal2 := 60000;

A expresso seguinte retorna TRUE: v_sal1 < v_sal2

Declare e inicialize uma varivel boleana: v_comm_sal BOOLEAN := (v_sal1 < v_sal2);

On Targget Treinamento e Consultoria

19

Funes Bsicas

Tipos de Dados Compostos


Tipos de dados compostos (tambm conhecidos como colees) so TABLE, RECORD, nested TABLE (tabela aninhada) e VARRAY. Voc utiliza o tipo de dado RECORD para tratar dados relacionadas, porm diferentes, como uma unidade lgica. Voc utiliza o tipo de dado TABLE para refernciar e manipular colees de dados como um objeto. Os tipos de dados RECORD e TABLE sero apresentados em detalhes em um captulo subseqente.

On Targget Treinamento e Consultoria

20

Funes Bsicas

Variveis com Tipos de Dados LOB

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.

On Targget Treinamento e Consultoria

21

Funes Bsicas

Variveis Tipo Bind

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.

Criando Variveis Bind


No ambiente do SQL*Plus, para declarar uma varivel bind, voc utiliza o comando VARIABLE. Por exemplo, voc declara uma varivel do tipo NUMBER da seguinte forma: VARIABLE return_code NUMBER

Tanto o SQL quanto o SQL*Plus podem referenciar uma varivel bind, e o SQL*Plus pode exibir seu valor.

Exibindo Variveis Bind


No ambiente do SQL*Plus, para exibir o valor atual de variveis bind, voc utiliza o comando PRINT. O exemplo abaixo ilustra um comando PRINT: SQL> VARIABLE n NUMBER ... SQL> PRINT n

On Targget Treinamento e Consultoria

22

Funes Bsicas

Referenciando Variveis No PL/SQL


:g_monthly_sal := v_sal / 12;

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';

On Targget Treinamento e Consultoria

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);

b. DECLARE v_x, v_y, v_z

VARCHAR2(10);

c. DECLARE v_birthdate

DATE NOT NULL;

d. DECLARE v_in_stock

BOOLEAN := 1;

e. DECLARE TYPE name_table_type IS TABLE OF VARCHAR2(20) INDEX BY BINARY_INTEGER; dept_name_table name_table_type;

On Targget Treinamento e Consultoria

24

Funes Bsicas

2. a.

Em cada uma das seguintes atribuies, determine o tipo de dado resultante da expresso.

v_days_to_go := v_due_date - SYSDATE;

b. v_sender := USER || ': ' || TO_CHAR(v_dept_no);

c. v_sum := $100,000 + $250,000;

d. v_flag := TRUE;

e. v_n1 := v_n2 > (2 * v_n3);

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

On Targget Treinamento e Consultoria

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

On Targget Treinamento e Consultoria

26

Introduo ao Oracle: SQL e PL/SQL

G_CHAR --------------------42 is the answer G_NUM --------42

17. Escrevendo Comandos Executveis

On Targget Treinamento e Consultoria

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

On Targget Treinamento e Consultoria

Funes Bsicas

Sintaxe e Diretrizes de um Bloco PL/SQL


Uma vez que PL/SQL uma extenso do SQL, as regras de sintaxe gerais que se aplicam ao SQL tambm so aplicveis a linguagem PL/SQL. Unidades lxicas (por exemplo, identificadores ou literais) podem ser separadas por um ou mais espaos ou outros delimitadores que no podem ser confundidos como sendo parte da unidade lxica. Voc no pode inserir espaos em unidades lxicas com exceo de strings literais e comentrios. Comandos podem ser divididas em vrias linhas, porm palavras chaves no devem ser divididas.

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").

On Targget Treinamento e Consultoria

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).

On Targget Treinamento e Consultoria

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

On Targget Treinamento e Consultoria

Funes Bsicas

Funes SQL em PL/SQL


A maioria das funes disponveis em SQL tambm so vlidas em expresses PL/SQL: Funes numricas Funes de caractere Funes de converso de tipos de dados Funes de data Funes genricas

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);

On Targget Treinamento e Consultoria

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;

Converta o nome do empregado para minsculas. v_ename := LOWER(v_ename);

CHR a funo SQL que converte um cdigo ASCII para o caractere correspondente; 10 o cdigo para uma quebra de linha.

On Targget Treinamento e Consultoria

Funes Bsicas

Converso de Tipos de Dados


O PL/SQL tenta converter dinamicamente os tipos de dados se eles forem diferentes dentro de um comando. Por exemplo, se voc atribuir um valor do tipo NUMBER para uma varivel do tipo CHAR, ento o PL/SQL dinamicamente traduz o nmero em uma representao de caracteres, de forma que ele possa ser armazenado em uma varivel tipo CHAR. A situao inversa tambm se aplica. Desde que sejam compatveis, voc tambm pode atribuir caracteres para variveis tipo DATE, e vice-versa. Dentro de uma expresso, voc deve garantir que os tipos de dados sejam os mesmos. Se tipos de dados diferentes estiverem em uma expresso, voc deve utilizar a funo de converso apropriada para converter os dados. Sintaxe: TO_CHAR (value, fmt)

TO_DATE (value, fmt)

TO_NUMBER (value, fmt)

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.

On Targget Treinamento e Consultoria

Funes Bsicas

Blocos Aninhados e Escopo de Variveis


Blocos Aninhados
Um das vantagens que PL/SQL possui sobre SQL a possibilidade de aninhar declaraes. Voc pode aninhar blocos onde quer que um comando executvel seja permitido e tornando o bloco aninhado desta forma um comando. Portanto voc pode dividir uma parte executvel de um bloco em blocos menores. A seo de exceo tambm pode conter blocos aninhados.

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.

Blocos Aninhados e Escopo de Variveis

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.

On Targget Treinamento e Consultoria

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;

Atribua o valor de um flag boleano. v_equal := (v_n1 = v_n2);

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

On Targget Treinamento e Consultoria

10

Funes Bsicas

Utilizando Variveis Bind


Para referenciar uma varivel bind em PL/SQL, voc deve prefixar seu nome com o caractere (:). DECLARE v_sal emp.sal%TYPE; BEGIN SELECT sal INTO v_sal FROM emp WHERE empno = 7369; :salary := v_sal; END;

Exibindo Variveis Bind


No SQL*Plus voc pode exibir o valor da varivel bind utilizando o comando PRINT. SQL> PRINT salary SALARY -----800

On Targget Treinamento e Consultoria

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

On Targget Treinamento e Consultoria

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

On Targget Treinamento e Consultoria

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;

IF x > y THEN max := x; ELSE max := y; END IF;

Exemplos: BEGIN IF x=0 THEN y=1; END IF; END;

DECLARE v_detpno NUMBER(2); v_location VARCHAR2(13); BEGIN SELECT deptno, location INTO v_deptno, v_location FROM dept WHERE dname = 'SALES'; ... END;

On Targget Treinamento e Consultoria

14

Funes Bsicas

Determine o Escopo das Variveis

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.

On Targget Treinamento e Consultoria

15

Funes Bsicas

Exerccios 17
Bloco PL/SQL DECLARE v_weight v_message BEGIN

NUMBER(3) VARCHAR2(255)

:= 600; := 'Product 10012';

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.

O valor de V_NEW_LOCN no sub-bloco

c.

O valor de V_WEIGHT no bloco principal

d.

O valor de V_MESSAGE no bloco principal

e.

O valor de V_NEW_LOCN no bloco principal

On Targget Treinamento e Consultoria

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.

O valor de V_NAME no sub-bloco

c.

O valor de V_CREDIT_RATING no sub-bloco

d.

O valor de V_CUSTOMER no bloco principal

e.

O valor de V_NAME no bloco principal

f.

O valor de V_CREDIT_RATING no bloco principal

On Targget Treinamento e Consultoria

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.

On Targget Treinamento e Consultoria

18

Introduo ao Oracle: SQL e PL/SQL

Please enter the salary amount: 50000 Please enter the bonus percentage: 10 PL/SQL procedure successfully completed. G_TOTAL ------55000

18. Interagindo com o Servidor Oracle

On Targget Treinamento e Consultoria

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

On Targget Treinamento e Consultoria

Funes Bsicas

Comandos SQL em PL/SQL


Quando voc precisar extrair informaes ou aplicar mudanas para o banco de dados, voc deve utilizar SQL. O PL/SQL suporta completamente a linguagem de manipulao de dados e os comandos de controle de transao do SQL. Voc pode utilizar comandos SELECT para popular variveis com valores consultados a partir de uma linha de uma tabela. Seus comandos DML (manipulao de dados) podem processar vrias linhas.

Comparando Tipos de Comando SQL e PL/SQL


Um bloco PL/SQL no uma unidade de transao. Commits, savepoints e rollbacks so independentes de blocos, mas voc pode executar estes comandos dentro de um bloco. O PL/SQL no suporta a linguagem de definio de dados (DDL), como CREATE TABLE, ALTER TABLE ou DROP TABLE. O PL/SQL no suporta a linguagem de controle de dados (DCL), como GRANT e REVOKE.

On Targget Treinamento e Consultoria

Funes Bsicas

Comandos SELECT em PL/SQL


SELECT INTO FROM WHERE select_list {variable_name[, variable_name]... | record_name} table condition;

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;

NUMBER(2); VARCHAR2(15); deptno, loc v_deptno, v_loc dept dname = 'SALES';

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.

On Targget Treinamento e Consultoria

Funes Bsicas

Consultas devem Retornar uma e Somente uma Linha


Comandos SELECT dentro de um bloco PL/SQL seguem a seguinte regra: consultas devem retornar uma e somente uma linha. Mais de uma linha ou nenhuma linha causa um erro. O PL/SQL trata destes erros retornando excees padres que voc pode tratar na seo de tratamento de excees do bloco com as excees NO_DATA_FOUND e TOO_MANY_ROWS. Voc deve codificar comandos SELECT de forma que retornem uma nica linha.

On Targget Treinamento e Consultoria

Funes Bsicas

Recuperando Dados em PL/SQL


Recupere a data do pedido e a data de expedio para o pedido especificado: DECLARE v_orderdate ord.orderdate%TYPE; v_shipdate ord.shipdate%TYPE; BEGIN SELECT orderdate, shipdate INTO v_orderdate, v_shipdate FROM ord WHERE id = 157; ... END;

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.

On Targget Treinamento e Consultoria

Funes Bsicas

DECLARE v_sum_sal v_deptno BEGIN SELECT INTO FROM WHERE END;

emp.sal%TYPE; NUMBER NOT NULL := 10; SUM(sal) -- group function v_sum_sal emp deptno = v_deptno;

On Targget Treinamento e Consultoria

Funes Bsicas

Manipulando Dados Utilizando PL/SQL

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.

On Targget Treinamento e Consultoria

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.

On Targget Treinamento e Consultoria

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.

On Targget Treinamento e Consultoria

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;

On Targget Treinamento e Consultoria

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.

On Targget Treinamento e Consultoria

12

Funes Bsicas

Comandos COMMIT e ROLLBACK


Voc controla a lgica de transaes com os comandos SQL COMMIT e ROLLBACK, fazendo alguns grupos de modificaes para o banco de dados permanente enquanto descartando outros. Com o Servidor Oracle, transaes DML iniciam no primeiro comando aps um COMMIT ou ROLLBACK e terminam no prximo COMMIT ou ROLLBACK executado com sucesso. Estas aes podem acontecer dentro de um bloco PL/SQL ou como resultado de eventos do ambiente de host (por exemplo, encerrando uma sesso do SQL*Plus automaticamente ocorre o COMMIT da transao pendente).

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.

On Targget Treinamento e Consultoria

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.

On Targget Treinamento e Consultoria

14

Funes Bsicas

Atributos do Cursor SQL

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

On Targget Treinamento e Consultoria

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.

On Targget Treinamento e Consultoria

16

Funes Bsicas

Please enter the department number: 50 Please enter the department location: HOUSTON PL/SQL procedure successfully completed.

On Targget Treinamento e Consultoria

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.

Confirme que o departamento foi removido.

On Targget Treinamento e Consultoria

18

Introduo ao Oracle: SQL e PL/SQL

no rows selected

19. Escrevendo Estruturas de Controle

On Targget Treinamento e Consultoria

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

On Targget Treinamento e Consultoria

Funes Bsicas

Controlando o Fluxo de Execuo PL/SQL


Voc pode modificar o fluxo lgico dos comandos dentro de um bloco PL/SQL com vrias estruturas de controle. Este captulo apresenta dois tipos de estruturas de controle PL/SQL; construes condicionais com o comando IF e estruturas de controle de LOOPs. Existem trs formas de comandos IF: IF-THEN-END IF IF-THEN-ELSE-END IF IF-THEN-ELSIF-END IF

On Targget Treinamento e Consultoria

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

Exemplo: IF v_ename = 'OSBORNE' THEN v_mgr := 22; END IF;

On Targget Treinamento e Consultoria

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.

On Targget Treinamento e Consultoria

Funes Bsicas

Fluxo de Execuo do Comando IF-THEN-ELSE

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;

On Targget Treinamento e Consultoria

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;

On Targget Treinamento e Consultoria

Funes Bsicas

Fluxo de Execuo do Comando IF-THEN-ELSIF

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.

On Targget Treinamento e Consultoria

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;

Nota: Qualquer expresso aritmtica contendo valores nulos retorna NULL.

On Targget Treinamento e Consultoria

Funes Bsicas

Construindo Condies Lgicas


Voc pode construir uma condio boleana simples combinando expresses numricas, caractere ou de data com um operador de comparao. Em geral, trate valores nulos com o operador IS NULL.

Nulos em Expresses e Comparaes


A condio IS NULL retorna TRUE somente se a varivel que est sendo verificado for NULL. Qualquer expresso que possui um valor nulo retorna NULL, exceto uma expresso de concatenao que trata o valor nulo como uma string vazia. Exemplos: v_sal > 1000

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'

On Targget Treinamento e Consultoria

10

Funes Bsicas

Tabelas de Lgica

Condies Boleanas com Operadores Lgicos


Voc pode construir uma condio boleana complexa combinando condies boleanas simples com os operadores lgicos AND, OR e NOT. Nas tabelas de lgica mostradas no grfico acima, FALSE possui precedncia em uma condio AND e TRUE possui precedncia em uma condio OR. AND retorna TRUE somente se ambas as expresses forem TRUE. OR retorna FALSE somente se ambas as expresses forem FALSE. NULL AND TRUE sempre retorna NULL porque o resultado de uma das expresso no conhecido, no sabendo-se se ela retornou TRUE ou no. Nota: A negao de NULL (NOT NULL) resulta em um valor nulo porque valores nulos so indeterminados.

On Targget Treinamento e Consultoria

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.

On Targget Treinamento e Consultoria

12

Funes Bsicas

Controle de Repeties: Comandos de LOOP


O PL/SQL fornece diversos comandos de estruturas de loop para repetir um comando ou seqncia de comandos vrias vezes. Construes de loop so o segundo tipo de estruturas de controle: O loop bsico fornece aes repetitivas sem condies globais O FOR loop fornece controle de repeties de aes basedo em um contador O WHILE loop fornecem controle de repeties de aes baseado em uma condio O comando EXIT encerra um loop

Nota: Outro tipo de FOR LOOP, o cursor FOR LOOP ser discutido em um captulo subseqente.

On Targget Treinamento e Consultoria

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.

On Targget Treinamento e Consultoria

15

Funes Bsicas

FOR i IN 3..3 LOOP statement1; END LOOP;

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;

On Targget Treinamento e Consultoria

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.

On Targget Treinamento e Consultoria

17

Funes Bsicas

Loops Aninhados e Labels


Voc pode aninhar loop em vrios nveis. Voc pode aninhar FOR loops dentro de WHILE loops e WHILE loops dentro de FOR loops. Normalmente o trmino de um loop aninhado no encerra o loop externo, a menos que uma exceo seja disparada. Entretanto, voc pode colocar labels em loops e sair do loop externo com o comando EXIT. Nomes de labels seguem as mesmas regras que os outros identificadores. Um label colocado antes de um comando, na mesma linha ou em uma linha separada. Coloque labels em loops antes da palavra LOOP dentro de delimitadores de label (<<label>>). Se o loop possuir um label, seu nome pode ser opcionalmente includo aps o comando END LOOP. Exemplo: ... BEGIN <<Outer_loop>> LOOP v_counter := v_counter + 1; EXIT WHEN v_counter > 10; <<Inner_loop>> LOOP ... EXIT Outer_loop WHEN total_done = 'YES'; -- Leave both loops EXIT WHEN Inner_done = 'YES'; -- Leave inner loop only ... END LOOP Inner_loop; ... END LOOP Outer_loop; END;

On Targget Treinamento e Consultoria

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.

On Targget Treinamento e Consultoria

Funes Bsicas

8000

NULL

NULL

EMPNO ----8000 7499 7934 7369

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.

On Targget Treinamento e Consultoria

20

Introduo ao Oracle: SQL e PL/SQL

Please PL/SQL Please PL/SQL

enter the procedure enter the procedure

employee number: 7934 successfully completed. employee number: 8000 successfully completed.

EMPNO SAL STARS ----- ------ ---------------8000 7934 1300 *************

20. Trabalhando com Tipos de Dados Compostos

On Targget Treinamento e Consultoria

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

On Targget Treinamento e Consultoria

Funes Bsicas

Tipos de Dados Compostos


Tipos de dados compostos (tambm conhecidos como colees) so RECORD, TABLE, Nested TABLE (tabela aninhada) e VARRAY. Voc utiliza o tipo de dado RECORD para tratar dados relacionados, porm diferentes, como uma unidade lgica. Voc usa o tipo de dado TABLE para referenciar e manipular colees de dados como um nico objeto. No sero discutidos neste curso os tipos de dados Nested TABLE e VARRAY. Um registro um grupo de itens de dados relacionados armazenados em campos, cada um com seu prprio nome e tipo de dado. Uma tabela possui uma coluna e uma chave primria para fornecer acesso para as linhas como um array. Uma vez definidos, tabelas e registros podem ser reutilizados.

On Targget Treinamento e Consultoria

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.

On Targget Treinamento e Consultoria

Funes Bsicas

Criando um PL/SQL Record


Para criar um PL/SQL record, voc define um tipo RECORD e ento declara registros deste tipo. Sintaxe: TYPE type_name IS RECORD (field_declaration[, field_declaration]); identifier type_name;

Onde field_delaration significa: field_name {field_type | variable%TYPE | table.column%TYPE | table%ROWTYPE} [[NOT NULL] {:= | DEFAULT} expr]

type_name field_name field_type

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.

On Targget Treinamento e Consultoria

Funes Bsicas

Estrutura de um PL/SQL Record

Referenciando e Inicializando Registros


Campos em um registro so acessados pelo nome. Para referenciar e inicializar um determinado campo, utilize a seguinte sintaxe: record_name.field_name

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.

Atribuindo Valores para Registros


Voc pode atribuir uma lista de valores comuns para um registro utilizando o comando SELECT ou FETCH. Certifique-se que os nomes de colunas estejam na mesma ordem dos campos do registro. Voc pode tambm atribuir um registro para outro se eles possuem o mesmo tipo de dado. Um registro definido pelo usurio e um registro definido com o atributo %ROWTYPE nunca possuem o mesmo tipo de dado.

On Targget Treinamento e Consultoria

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)

Vantagens da Utilizao de %ROWTYPE


O nmero e tipos de dados das colunas referenciadas do banco de dados no precisam ser conhecidos. O nmero e tipos de dados das colunas referenciadas do banco de dados podem modificarse em tempo de execuo. Bastante til quando recupera-se toda uma linha com o comando SELECT. Exemplos: Declare uma varivel para armazenar a mesma informao de um departamento como ela armazenada na tabela DEPT. dept_record dept%ROWTYPE;

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 ...

On Targget Treinamento e Consultoria

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.

On Targget Treinamento e Consultoria

10

Funes Bsicas

Criando uma PL/SQL Table


TYPE type_name IS TABLE OF {column_type | variable%TYPE | table.column%TYPE} [NOT NULL] [INDEX BY BINARY_INTEGER]; identifier type_name;

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.

On Targget Treinamento e Consultoria

11

Funes Bsicas

DECLARE TYPE date_table_type IS TABLE OF DATE INDEX BY BINARY_INTEGER; date_table date_table_type;

On Targget Treinamento e Consultoria

12

Funes Bsicas

Estrutura de uma PL/SQL Table

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.

On Targget Treinamento e Consultoria

13

Funes Bsicas

Criando uma PL/SQL Table


DECLARE TYPE ename_table_type IS TABLE OF emp.ename%TYPE INDEX BY BINARY_INTEGER; TYPE hiredate_table_type IS TABLE OF DATE INDEX BY BINARY_INTEGER; ename_table ename_table_type; hiredate_table hiredate_table_type; BEGIN ename_table(1) := 'CAMERON'; hiredate_table(8) := SYSDATE + 7; IF ename_table.EXISTS(1) THEN INSERT INTO ... ... END;

Referenciando uma PL/SQL Table


Sintaxe: pl/sql_table_name(primary_key_value)

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.

On Targget Treinamento e Consultoria

14

Funes Bsicas

PL/SQL Table com Registros


Exemplo: Declare uma varivel PL/SQL para armazenar informaes de departamentos. DECLARE TYPE dept_table_type IS TABLE OF dept%ROWTYPE INDEX BY BINARY_INTEGER; dept_table dept_table_type; -- Cada elemento de dept_table um registro

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.

Referenciando uma Tabela com Registros


No exemplo acima, voc pode referenciar os campos do registro dept_table porque cada elemento desta tabela um registro. Sintaxe: table(index).field

Exemplo: dept_table(15).loc := 'Atlanta';

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.

On Targget Treinamento e Consultoria

15

Funes Bsicas

Utilizando Mtodos de PL/SQL Tables


Um mtodo de PL/SQL table uma procedure ou funo do Oracle que opera nas tabelas. Sintaxe: table_name.method_name[ (parameters) ]

Mtodo EXISTS(n) COUNT FIRST LAST PRIOR(n) NEXT(n) EXTEND(n, i)

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.

On Targget Treinamento e Consultoria

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.

On Targget Treinamento e Consultoria

17

Introduo ao Oracle: SQL e PL/SQL

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

21. Escrevendo Cursores Explcitos

On Targget Treinamento e Consultoria

Funes Bsicas

Objetivos
Diferenciar cursores implcitos e explcitos Utilizar uma varivel PL/SQL record Escrever estruturas Cursor FOR loop

On Targget Treinamento e Consultoria

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.

On Targget Treinamento e Consultoria

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 do Cursor Explcito


Pode processar alm da primeira linha retornada pela consulta, linha por linha Mantm o registro da linha que est sendo processada Permite ao programador manualmente control-los no bloco PL/SQL

On Targget Treinamento e Consultoria

Funes Bsicas

Controlando Cursores Explcitos

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.

Controlando Cursores Explcitos Utilizando Quatro Comandos


1. 2. Declare o cursor nomeando e definindo a estrutura de consulta a ser executada dentro dele. Abra o cursor. O comando OPEN executa a consulta. As linhas identificadas pela consulta so chamadas de active set (conjunto ativo) e ficam disponveis para recuperao. Recupere os dados do cursor. O comando FETCH recupera a linha corrente do cursor para variveis. Cada fetch move o ponteiro do cursor para a prxima linha do active set. Portanto, cada fetch acessa uma linha diferente retornada pela consulta. No diagrama apresentado acima, cada fetch verifica se o cursor ainda possui linhas existentes. Se linhas forem encontradas, ele carrega a linha corrente para variveis; caso contrrio, ele fecha o cursor. Feche o cursor. O comando CLOSE libera o conjunto ativo de linhas. Agora possvel reabrir o cursor para estabelecer um novo active set.

3.

4.

On Targget Treinamento e Consultoria

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.

On Targget Treinamento e Consultoria

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 ...

Recupere os empregados um por um. DECLARE v_empno v_ename

emp.empno%TYPE; emp.ename%TYPE;

CURSOR c1 IS SELECT empno, ename FROM emp; BEGIN ...

Nota: Voc pode referenciar variveis na consulta, mas voc deve declar-las antes do comando CURSOR.

On Targget Treinamento e Consultoria

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.

On Targget Treinamento e Consultoria

Funes Bsicas

Recuperando Dados do Cursor


FETCH cursor_name INTO [variable1, variable2,...] | record_name];

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.

Exemplos: FETCH c1 INTO v_empno, v_ename;

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 ;

On Targget Treinamento e Consultoria

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;

On Targget Treinamento e Consultoria

11

Funes Bsicas

Atributos de Cursores Explcitos

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.

On Targget Treinamento e Consultoria

12

Funes Bsicas

Controlando Mltiplos Fetch


Para processar vrias linhas de um cursor explcito, voc normalmente define um loop para executar um fetch a cada repetio. Eventualmente todas as linha no active set so processadas, e um fetch que no recuperou nenhuma linha atribui TRUE para o atributo %NOTFOUND. Utilize os atributos de cursor explcito para testar o sucesso de cada fetch antes de outras referncias serem feitas para o cursor. Se voc omitir o critrio de exit, o resultado ser um loop infinito.

On Targget Treinamento e Consultoria

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.

On Targget Treinamento e Consultoria

14

Funes Bsicas

Atributos %NOTFOUND e %ROWCOUNT


Exemplo: Recupere os primeiros dez empregados um por um. DECLARE v_empno v_ename

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;

On Targget Treinamento e Consultoria

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.

On Targget Treinamento e Consultoria

16

Funes Bsicas

Cursor FOR Loop


FOR record_name IN cursor_name LOOP statement1; statement2; . . . END LOOP;

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.

On Targget Treinamento e Consultoria

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;

On Targget Treinamento e Consultoria

18

Funes Bsicas

Cursor FOR Loop Utilizando Subconsultas


Voc no precisa declarar um cursor porque o PL/SQL permite a voc substitu-lo por uma subconsulta. Exemplo: BEGIN FOR emp_record IN ( SELECT empno, ename FROM emp) LOOP -- open implcito e fetch implcito ocorrem IF emp_record.empno = 7839 THEN ... END LOOP; -- close implcito ocorre END;

On Targget Treinamento e Consultoria

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

On Targget Treinamento e Consultoria

20

Introduo ao Oracle: SQL e PL/SQL

Please enter the number of top money makers: 3 NAME SALARY ------------ -----KING 5000 FORD 3000 SCOTT 3000 JONES 2975

22. Conceitos Avanados de Cursores Explcitos

On Targget Treinamento e Consultoria

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

On Targget Treinamento e Consultoria

Funes Bsicas

Cursores com Parmetros


CURSOR cursor_name [(parameter_name datatype, ...)] IS select_statement;

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

um tipo de dado escalar do parmetro.

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.

On Targget Treinamento e Consultoria

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 ...

On Targget Treinamento e Consultoria

Funes Bsicas

Clusula FOR UPDATE


SELECT ... FROM ... FOR UPDATE [OF column_reference][NOWAIT]

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.

On Targget Treinamento e Consultoria

Funes Bsicas

Clusula WHERE CURRENT OF


WHERE CURRENT OF cursor

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.

On Targget Treinamento e Consultoria

Funes Bsicas

Cursores com Subconsultas


Exemplo: DECLARE CURSOR my_cursor IS SELECT t1.deptno, dname, STAFF FROM dept t1, (SELECT deptno, count(*) STAFF FROM emp GROUP BY deptno) t2 WHERE t1.deptno = t2.deptno AND STAFF >= 5;

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.

On Targget Treinamento e Consultoria

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.

On Targget Treinamento e Consultoria

Introduo ao Oracle: SQL e PL/SQL

EMPNO SAL STARS ----- ------ --------------------8000 7900 950 ********** 7844 1500 ***************

23. Tratamento de Excees

On Targget Treinamento e Consultoria

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

On Targget Treinamento e Consultoria

Funes Bsicas

Tratando Excees com PL/SQL


Uma exceo um identificaddor em PL/SQL, disparado durante a execuo de um bloco que encerrou seu corpo principal de aes. Um bloco sempre termina quando o PL/SQL dispara uma exceo, mas voc pode especificar um tratamento de excees para executar aes finais.

Mtodos de Disparo de Excees


Um erro Oracle ocorre e a execeo associada disparada automaticamente. Por exemplo, se o erro ORA-01403 ocorre quando nenhuma linha for recuperada do banco de dados em um comando SELECT, ento o PL/SQL dispara a exceo NO_DATA_FOUND. Voc dispara uma exceo explicitamente executando o comando RAISE dentro do bloco. A exceo disparada pode ser uma exceo definida pelo usurio ou pr-definida.

On Targget Treinamento e Consultoria

Funes Bsicas

Tratamento de Excees

Tratando uma Exceo


Se a exceo for disparada na seo executvel do bloco, o processamento desvia para o tratamento de exceo correspondente da seo EXCEPTION do bloco. Se o PL/SQL tratar com sucesso a exceo, ento ela no propaga para o bloco ou ambiente chamador. O bloco PL/SQL encerra com sucesso.

Propagando uma Exceo


Voc pode manipular uma exceo propagando-a para o ambiente chamador. Se a exceo for disparada na seo executvel do bloco e no existir um tratamento de exceo correspondente, o bloco PL/SQL encerra com uma falha.

On Targget Treinamento e Consultoria

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.

On Targget Treinamento e Consultoria

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.

Tratamento de Excees com WHEN OTHERS


A seo de tratamento de excees trata somente aquelas excees especificadas; qualquer outra exceo no tratada a menos que voc utilize o tratamento de exceo OTHERS, que trata qualquer exceo no tratada anteriormente. Por esta razo, OTHERS deve ser o ltimo tratamento de exceo definido.

On Targget Treinamento e Consultoria

Funes Bsicas

Diretrizes para o Tratamento de Excees


Inicie a seo de tratamento de excees do bloco com a palavra chave EXCEPTION. Defina vrios tratamentos de excees para o bloco, cada um com seu prprio conjunto de aes. Quando uma exceo ocorrer, o PL/SQL processar somente um tratamento antes de encerrar o bloco. Coloque a clusula OTHERS aps todas as outras clusulas de tratamento de excees. Voc pode possuir no mximo uma clusula OTHERS. Excees no podem aparecer em comandos de atribuio ou comandos SQL.

On Targget Treinamento e Consultoria

Funes Bsicas

Tratando Errors Pr-Definidos do Servidor Oracle


Trate um erro pr-definido do Servidor Oracle referenciando seu nome padro dentro da rotina de tratamento de exceo correspondente. Exemplos de excees pr-definidas:
Nome da Exceo ACCESS_INTO_NULL COLLECTION_IS_NULL CURSOR_ALREADY_OPEN DUP_VAL_ON_INDEX INVALID_CURSOR INVALID_NUMBER LOGIN_DENIED NO_DATA_FOUND NOT_LOGGED_ON PROGRAM_ERROR STORAGE_ERROR SUBSCRIPT_BEYOND_COUNT SUBSCRIPT_OUTSIDE_LIMIT TIMEOUT_ON_RESOURCE TOO_MANY_ROWS VALUE_ERROR ZERO_DIVIDE Erro Oracle ORA-06530 ORA-06531 ORA-06511 ORA-00001 ORA-01001 ORA-01722 ORA-01017 ORA-01403 ORA-01012 ORA-06501 ORA-06500 ORA-06533 ORA-06532 ORA-00051 ORA-01422 ORA-06502 ORA-01476 Descrio Tentativa de atribuir valores para atributos de um objeto no inicializado. Tentativa de aplicar mtodos que no o EXISTS para uma PL/SQL table no inicializada. Tentativa de abrir um cursor que j aberto. Tentativa de inserir um valor duplicado. Ocorreu uma operao ilegal em um cursor. Falha na converso de uma string caractere para numrica. Conexo ao Oracle com um nome de usurio e/ou senha invlida. SELECT do tipo single-row no retornou nenhuma linha. Programa PL/SQL executou uma chamada ao banco de dados sem estar conectado ao Oracle. PL/SQL possui um problema interno. PL/SQL executou alm da memria disponvel ou a memria est corrompida. Referncia para um elemento de uma PL/SQL table utilizando um nmero de ndice maior que o nmero de elementos da tabela. Referncia para um elemento de uma PL/SQL table utilizando um nmero de ndice que est fora da faixa de valores vlidos. Ocorreu um time-out enquanto o Oracle estava aguardando por um recurso. SELECT do tipo single-row retornou mais que uma linha. Ocorreu um erro de aritmtica, converso ou truncamento. Tentativa de diviso por zero.

On Targget Treinamento e Consultoria

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.

On Targget Treinamento e Consultoria

Funes Bsicas

Tratando Erros No Pr-Definidos do Servidor Oracle

...

On Targget Treinamento e Consultoria

10

Introduo ao Oracle: SQL e PL/SQL

Apndice A Solues dos Exerccios

On Targget Treinamento e Consultoria

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.

SQL> DESCRIBE dept SQL> SELECT * 2 FROM 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.

On Targget Treinamento e Consultoria

A-2

Funes Bsicas

SQL> DESCRIBE emp

SQL> SELECT empno, ename, job, hiredate 2 FROM emp; SQL> SAVE e2q7.sql Wrote file e2q7.sql

8.

Execute a consulta do arquivo e2q7.sql.


SQL> START e2q7.sql

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;

On Targget Treinamento e Consultoria

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;

SQL> SELECT 2 || 3 4 FROM

On Targget Treinamento e Consultoria

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

SQL> START e3q3.sql

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

On Targget Treinamento e Consultoria

Funes Bsicas

SQL> 2 3 4

SELECT FROM WHERE ORDER BY

ename, deptno emp deptno IN (10, 30) ename;

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.

On Targget Treinamento e Consultoria

A-6

Funes Bsicas

SQL> 2 3 4

SELECT FROM WHERE ORDER BY

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.

On Targget Treinamento e Consultoria

A-7

Funes Bsicas

SQL> EDIT e3q6.sql SELECT comm FROM WHERE / ename "Employee", sal "Monthly Salary", emp comm > sal * 1.1

SQL> START e3q13.sql

On Targget Treinamento e Consultoria

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.

Execute a consulta do arquivo e4q2.sql. SQL> START e4q2.sql

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

SQL> START e4q2.sql

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.

On Targget Treinamento e Consultoria

A-9

Funes Bsicas

SQL> SELECT 2 3 4 REVIEW 5 FROM

ename, hiredate, TO_CHAR(NEXT_DAY(ADD_MONTHS(hiredate, 6), 'MONDAY'), 'fmDay, "the" Ddspth "of" Month, YYYY') emp;

On Targget Treinamento e Consultoria

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.

On Targget Treinamento e Consultoria

A-11

Funes Bsicas

SQL> SELECT 2 3 FROM 4 WHERE 5 OR 6 OR

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;

On Targget Treinamento e Consultoria

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.

On Targget Treinamento e Consultoria

A-13

Funes Bsicas

SQL> SELECT 2 FROM 3 WHERE 4 AND

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(+)

SQL> START e5q7.sql

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.

On Targget Treinamento e Consultoria

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;

SQL> SELECT Hiredate", 2 3 FROM 4 WHERE 5 AND

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

On Targget Treinamento e Consultoria

Funes Bsicas

SQL> SELECT 2 3 FROM 4 ORDER BY

rpad(ename, 8) ||rpad(' ', sal/100, '*') EMPLOYEE_AND_THEIR_SALARIES emp sal DESC;

On Targget Treinamento e Consultoria

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.

On Targget Treinamento e Consultoria

A-17

Funes Bsicas

SQL> SELECT 2 FROM 3 GROUP BY

job, COUNT(*) emp job;

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.

On Targget Treinamento e Consultoria

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;

SQL> SELECT 2 3 4 5 6 FROM 7 GROUP BY

On Targget Treinamento e Consultoria

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';

deptno emp ename =

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.

On Targget Treinamento e Consultoria

A-20

Funes Bsicas

SQL> SELECT 2 FROM 3 WHERE 4 5 'DALLAS');

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

empno emp ename = 'KING');

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.

On Targget Treinamento e Consultoria

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%')

On Targget Treinamento e Consultoria

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.

On Targget Treinamento e Consultoria

A-23

Funes Bsicas

SQL> 2 3 4 5 6

SELECT FROM WHERE

ename, job, sal emp sal > ALL (SELECT FROM WHERE ORDER BY sal DESC;

sal emp job = 'CLERK')

On Targget Treinamento e Consultoria

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.

On Targget Treinamento e Consultoria

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.

On Targget Treinamento e Consultoria

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.

On Targget Treinamento e Consultoria

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

On Targget Treinamento e Consultoria

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.

Confirme sua insero para a tabela.

On Targget Treinamento e Consultoria

A-29

Funes Bsicas

SQL> SELECT 2 FROM

* 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: '

my_employee (&p_id, '&p_last_name', '&p_first_name', substr('&p_first_name', 1, 1) || substr('&p_last_name', 1, 7),

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.

Confirme suas inseres para a tabela. SQL> SELECT 2 FROM * my_employee;

9.

Torne as inseres permanentes.

SQL> COMMIT; Atualize e remova dados da tabela MY_EMPLOYEE.


On Targget Treinamento e Consultoria A-30

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.

Confirme suas modificaes para a tabela. SQL> SELECT 2 FROM * my_employee;

15.

Execute o commit de todas as modificaes pendentes. SQL> COMMIT;

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;

On Targget Treinamento e Consultoria

A-31

Funes Bsicas

18.

Marque um ponto intermedirio no processamento da transao. SQL> SAVEPOINT a;

19.

Apague a tabela inteira. SQL> DELETE 2 FROM my_employee;

20.

Confirme que a tabela est vazia. SQL> SELECT 2 FROM * my_employee;

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.

Torne a insero dos dados permanente. SQL> COMMIT;

On Targget Treinamento e Consultoria

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

On Targget Treinamento e Consultoria

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

On Targget Treinamento e Consultoria

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.

Remova a tabela EMPLOYEE. DROP TABLE employee;

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.

On Targget Treinamento e Consultoria

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';

On Targget Treinamento e Consultoria

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));

On Targget Treinamento e Consultoria

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.

Mostre o contedo da viso EMP_VU. SQL> SELECT 2 FROM * emp_vu;

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.

On Targget Treinamento e Consultoria

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;

On Targget Treinamento e Consultoria

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;

On Targget Treinamento e Consultoria

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

FROM / SQL> START e14q2.sql

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;

On Targget Treinamento e Consultoria

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

On Targget Treinamento e Consultoria

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.

Consulte todas as linhas da sua tabela DEPT.

On Targget Treinamento e Consultoria

A-43

Funes Bsicas

SQL> SELECT 2 FROM

* 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

On Targget Treinamento e Consultoria

Funes Bsicas

SQL> SELECT 2 FROM 3 WHERE

table_name, owner all_tables owner != <your account>;

13.

Revogue o privilgio SELECT do outro grupo. Grupo 1. SQL> REVOKE 2 ON 3 FROM Grupo 2. SQL> REVOKE 2 ON 3 FROM

select dept user2; select dept user1;

On Targget Treinamento e Consultoria

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

DATE NOT NULL;

d.

Incorreto porque 1 no uma expresso boleana. DECLARE v_in_stock

BOOLEAN := 1;

e.

Correto. DECLARE TYPE name_table_type IS TABLE OF VARCHAR2(20) INDEX BY BINARY_INTEGER; dept_name_table name_table_type;

On Targget Treinamento e Consultoria

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.

String caractere v_sender := USER || ': ' || TO_CHAR(v_dept_no);

c.

Incorreto. PL/SQL no converte smbolos especiais VARCHAR2 para NUMBER v_sum := $100,000 + $250,000;

d.

Boleano v_flag := TRUE;

e.

Boleano v_n1 := v_n2 > (2 * v_n3);

f.

Qualquer tipo de dado escalar v_value := NULL;

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

On Targget Treinamento e Consultoria

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

On Targget Treinamento e Consultoria

A-48

Funes Bsicas

Solues Exerccios 17
Bloco PL/SQL DECLARE v_weight v_message BEGIN

NUMBER(3) VARCHAR2(255)

:= 600; := 'Product 10012';

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.

On Targget Treinamento e Consultoria

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

On Targget Treinamento e Consultoria

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

On Targget Treinamento e Consultoria

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

On Targget Treinamento e Consultoria

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.

Execute o bloco PL/SQL. SQL> START e18q2.sql

e.

Mostre o novo departamento que voc criou.


A-53

On Targget Treinamento e Consultoria

Funes Bsicas

SELECT FROM WHERE

* dept deptno = :g_max_deptno + 10;

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.

On Targget Treinamento e Consultoria

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;

On Targget Treinamento e Consultoria

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

On Targget Treinamento e Consultoria

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

On Targget Treinamento e Consultoria

A-57

Funes Bsicas

SQL> 2 3 4

SELECT FROM WHERE ORDER BY

empno, sal, comm emp empno IN (7369, 7934,7499, 8000) comm;

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);

On Targget Treinamento e Consultoria

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);

On Targget Treinamento e Consultoria

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;

On Targget Treinamento e Consultoria

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;

On Targget Treinamento e Consultoria

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.

On Targget Treinamento e Consultoria

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.

On Targget Treinamento e Consultoria

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;

On Targget Treinamento e Consultoria

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.

DECLARE v_current_deptno v_emp

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.

On Targget Treinamento e Consultoria

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);

On Targget Treinamento e Consultoria

A-66

Potrebbero piacerti anche