Click here to load reader

Treinamento Oracle SQL

Embed Size (px)

Citation preview

Oracle SQL

Oracle SQL

61.Introduo

61.1.Banco de Dados

71.2.Banco Oracle

82.Ambiente Oracle 9i

93.Ambiente do curso

104.Programas SQL*Plus e ISQL*Plus

104.1.Apresentao das ferramentas

104.2.Diferena entre SQL*Plus e iSQL*Plus

115.Comando SELECT bsico

115.1.Apresentao do comando SELECT

115.2.SELECT [CAMPO1], [CAMPO...N] FROM [TABELA]

135.3.Utilizao de expresses

145.4.Aliases de Colunas e Literais

166.Seleo e Ordenao

166.1.Clusulas WHERE e ORDER BY

186.2.Operadores Lgicos e Relacionais para Formao de Seleo

227.Funes

227.1.Funes nas clusulas de consulta

237.2.Funes para tratamento de Strings, Nmeros, Datas e Diversos.

237.2.1.Funes Numricas:

247.2.2.Funes de String:

257.2.3.Funes de Data e Hora

267.2.4.Funes de Converso

267.2.5.Funes de Agrupamento

267.2.6.Outras Funes

277.2.7.Formatos Numricos

277.2.8.Formatos de Datas e Horas

288.Joins

288.1.Definio e utilidade dos Joins

298.2.Tipos de Joins

298.2.1.Equijoins

298.2.2.SelfJoins

298.2.3.InnerJoins

298.2.4.OuterJoins

308.3.Alias para Tabelas

318.4.Produto Cartesiano

318.5.Joins no padro SQL 1999

318.5.1.Cross-Joins

318.5.2.Natural Joins

328.5.3.Outer Joins

349.Agrupamento de Dados

349.1.Clusula GROUP BY

359.2.Funes de Grupo

369.3.Clusula HAVING

3810.SubQueries

3810.1.Tipos de Subqueries

3810.1.1.Inline Views

3810.1.2.Nested subqueries

3910.1.3.Subqueries Co-Relacionadas

4011.Comando INSERT

4011.1.Limitaes

4011.2.Utilizao do comando SELECT

4212.Comando UPDATE

4212.1.Atualizao de Mltiplas Colunas

4212.2.Utilizao com subqueries

4413.Comando DELETE

4413.1.Utilizao com subqueries

4514.Comando MERGE

4514.1.Comparaes com verses anteriores do Oracle

4514.2.Clusula INTO

4514.3.Clusula USING

4614.4.Clusula ON

4715.Controle de Transao

4715.1.Comandos COMMIT, ROLLBACK e SAVEPOINT

4715.1.1.COMMIT

4715.1.2.ROLLBACK

4715.1.3.SAVEPOINT

4916.Criao de Tabelas

4916.1.Nomenclatura de Tabelas e Colunas

5016.2.Tipos de Dados (DataTypes)

5116.3.Restries ( Constraints )

5216.4.Utilizao de Subqueries

5216.5.Comando ALTER TABLE

5316.5.1.Clusula ADD

5316.5.2.Clusula MODIFY

5416.5.3.Clusula DROP

5416.6.Comando DROP TABLE

5416.7.Comando TRUNCATE TABLE

5516.8.Atribuio de Comentrios s Tabelas

5617.Views

5617.1.Criao e Utilizao

5717.1.1.Clusula OR REPLACE

5717.1.2.Clusula WITH READ ONLY

5717.1.3.Clusula WITH CHECK OPTION

5717.2.Problemas mais Comuns

5817.3.Comando ALTER VIEW

5817.4.Comando DROP VIEW

5918.Sequences

5918.1.Criao e Utilizao

5918.1.1.Clusula INCREMENT BY

5918.1.2.Clusula START WITH

5918.1.3.Clusula MAXVALUE e MINVALUE

6018.1.4.Clusula NOMAXVALUE e NOMINVALUE

6018.1.5.Clusula CYCLE e NOCYCLE

6119.ndices

6119.1.Criao e utilizao

6119.1.1.ndices UNIQUE e NONUNIQUE

6119.1.2.ndices COMPOSITE

6219.2.Comando DROP INDEX

6219.3.Comando ALTER INDEX

6219.3.1.Clusula DEALLOCATE UNUSED

6219.3.2.Clusula SHRINK

6219.3.3.Clusula REBUILD

6319.4.Gerao automtica de ndices para chaves primrias

6420.Sinnimos

6420.1.Criao e utilizao

6620.2.Comando DROP SYNONYM

6620.3.Sinnimos para Procedures

6721.Database Links

6721.1.Criao e utilizao

6821.2.Viso Geral sobre Banco de Dados Distribudos

6921.2.1.Sistemas homogneos

6921.2.2.Sistemas heterogneos

7022.Privilgios

7022.1.Tipos de privilgios

7022.1.1.System privilege

7022.1.2.Object privilege

7022.1.3.Roles

7022.2.Comando GRANT

7122.3.Comando REVOKE

7222.4.Opes WITH GRANT e WITH ADMIN

7222.5.Opo PUBLIC

7222.6.Privilgios e segurana

7222.6.1.A importncia de uma poltica de segurana

7222.6.2.Gerenciamento de usurios e recursos

7323.Operadores de Conjunto

7323.1.Concatenando Resultados de Queries

7323.2.Operadores UNION, MINUS e INTERSECT

7323.2.1.UNION

7323.2.2.MINUS

7323.2.3.INTERSECT

7523.3.Restries e requisitos

7624.Queries Hierrquicas

7624.1.Solues para representao

7624.2.Pesquisas em estruturxas hierrquicas

7624.2.1.Clusula START WITH

7624.2.2.Clusula CONNECT BY

7624.2.3.Clusula PRIOR

7724.2.4.Clusula NOCYCLE

7724.2.5.Clusula CONNECT_BY_ISCYCLE

7724.2.6.Clusula CONNECT_BY_ROOT

7724.2.7.Clusula LEVEL

8025.Respostas dos Exerccios

8025.1.Resposta do Item 5.2

8025.2.Resposta do Item 5.3

8025.3.Resposta do Item 5.4

8025.4.Resposta do Item 6.2

8025.5.Resposta do Item 7.2.1

8025.6.Resposta do Item 7.2.2

8125.7.Resposta do Item 7.2.3

8125.8.Respostas do Item 9.2.

8125.9.Respostas do Item 9.3

8125.10.Respostas do Item 10

8125.11.Respostas do Item 11

8225.12.Respostas do Item 12

8225.13.Respostas do Item 13

8225.14.Respostas do Item 16.2

8225.15.Respostas do Item 16.3

8225.16.Respostas do Item 16.5.1

8225.17.Respostas do Item 16.5.2

8225.18.Respostas do Item 16.5.3

8225.19.Respostas do Item 16.6

8325.20.Respostas do Item 17.1

8325.21.Respostas do Item 17.3

8325.22.Respostas do Item 18

8325.23.Respostas do Item 19.1

8325.24.Respostas do Item 19.2

8325.25.Respostas do Item 20.1

8325.26.Respostas do Item 20.2

8325.27.Respostas do Item 22.2

8425.28.Respostas do Item 22.3

1. Introduo

Em meados de 1970, o Dr. Edgar Frank Codd publicou um artigo sobre o modelo relacional de banco de dados, no qual aceito at hoje como um modelo definitivo para SGBDs (Sistema Gerenciador de Banco de Dados).

A linguagem SQL, (Structured Query Language) desenvolvida pela IBM, foi criada para utilizar o modelo de Codd, sendo aceita tambm hoje com a linguagem padro para recuperao de dados em SGBDs.

O Oracle um SGBD relacional e orientado a objetos. Um dos objetivos principais armazenar e recuperar as informaes relacionadas. Ele pode gerenciar uma quantidade muito grande de informaes que podem ser acessadas por milhares de usurios simultaneamente, tudo isso com uma performance extremamente eficiente. Solues eficientes para recuperao de falhas e controle de acesso tambm fazem parte da sua arquitetura. Tendo o SQL como linguagem padro, o Oracle segue as determinaes dos rgos norte-americanos de padres internacionais como ANSI e ISO.

1.1. Banco de Dados

Um banco de dados consiste em um conjunto de informaes organizadas de alguma maneira, seja por meio manual atravs de pastas em uma gaveta, por exemplo, ou por meio magntico, atravs do computador, utilizado-se de sistemas especficos chamados SGBDs.

O modelo de banco de dados relacional consiste basicamente de tabelas que por sua vez so compostas de colunas, linhas e campos.

CODIGONOME

1NOME1

2NOME2

3NOME3

Alm desta estrutura, um SGBD composto por vrios objetos que interagem entre si para produzir diversos tipos de aes de gerenciamento de informaes, como operaes de atualizao dos dados (insero, excluso, alterao), definio de regras de negcios, aspectos de segurana como direitos e restries, e ferramentas que auxiliam no desenvolvimento, documentao e manuteno banco de dados.

1.2. Banco Oracle

O Oracle possui um conjunto muito extenso de ferramentas de gerenciamento dos dados. Sua estrutura principal composta pelo SGBD propriamente dito, que controla o armazenamento, a definio, as restries e as regras de negcios que so aplicadas aos dados.

Em seguida esto presentes as ferramentas de apoio a desenvolvimento de aplicaes e extrao de informaes, como o SQL* Plus . Estas ferramentas, bem como os objetos que compem o Oracle sero estudados no decorrer deste curso.

2. Ambiente Oracle 9i

O Oracle 9i possui 3 tipos de edies diferentes:

Standard Edition: Fcil para usar, capacidade, melhor custo/benefcio para grupos, nveis departamentais, aplicaes para internet e intranet. Fornece ferramentas integradas para gerenciamento do banco de dados podendo ser utilizado em ambientes com servidor simples em ambientes menores ou at em ambientes distribudos. Inclui as facilidades necessrias para construir aplicaes de misses crticas. A verso standard pode ser somente licenciada em servidores com at 4 processadores. Enterprise Edition: Inclui as caractersticas da Edio Standard alm de permitir replicao, grandes volumes de acesso, atravs de consultas por processamento de transas on line (OLTP), utilizada em data warehouse e que requerem aplicaes baseadas na internet.

Personal Edition: Criada para um computador pessoal, utilizado por um usurio, com total compatibilidade com as edies standard e enterprise. Combina a facilidade e poder das verses anteriores em um computador pessoal.Caractersticas principais comuns s 3 edies:

Capacidade SQL Objeto-relacional;

Programao atravs de PL/SQL;

Interface atravs de programao JAVA ;

Aplicaes rodam nas 3 edies igualmente (a verso enterprise tem a performance, disponibilizao e funes de segurana melhor, de forma transparente para o desenvolvedor );

As verses so compatveis nas mais diversas plataformas sem necessidade de reengenharia;

Facilidade para migrar de uma edio para outra ( Standard Edition para Enterprise Edition, por exemplo ) .

Opes Avanadas (disponibilizadas de acordo com as edies) :

Oracle Real Application Clusters;

Oracle Partitioning;

Oracle Advanced Security;

Oracle Label Security;

Oracle OLAP;

Oracle Data Mining;

Oracle Spatial;

Oracle Enterprise Manager Packs.

Algumas Ferramentas disponibilizadas aps a instalao do produto:

SQL Plus;

SQL Plus WorkSheet;

Configurao e Assistente da rede para acesso ao Oracle;

Assistente para nvel de performance;

Oracle Http Server;

Configurao e Assistente de Banco de Dados;

ODBC Administrator;

Enterprise manager;

Universal Installer;

3. Ambiente do curso

O nvel 1 deste curso, Oracle SQL estar abordando os comandos, instrues e todas as funcionalidades do Oracle em relao a utilizao da linguagem SQL para a manipulao do banco de dados.

Os exemplos sero efetuados na ferramenta SQL PLUS do Oracle de maneira que o aluno possa estar verificando todos os passos necessrios para conseguir os resultados esperados assim como facilitar a compreenso e resoluo de erros que possam surgir na execuo das instrues.

4. Programas SQL*Plus e ISQL*Plus

4.1. Apresentao das ferramentas

O SQL*Plus uma ferramenta interativa instalada por padro no ambiente Oracle. (Fig 1)

Sua interface baseada em linha de comando, onde o usurio pode executar diversos tipos de comandos SQL que permitem recuperar os dados, formatar, armazenar, realizar clculos, gerar relatrios, imprimir, salvar para arquivo texto ou HTML. Permite tambm examinar tabelas e definies, bem como rodar scripts e administrar o banco de dados.

Fig. 1

4.2. Diferena entre SQL*Plus e iSQL*Plus

Trata-se da mesma ferramenta, diferenciando-se unicamente pelo modo de acesso.

O SQL*Plus iniciado atravs de um programa especfico criado durante a instalao.

O iSQL*Plus iniciado atravs de um browser, iniciando-se a partir de um endereo de Internet em um servidor (URL)

5. Comando SELECT bsico

5.1. Apresentao do comando SELECT

O comando SELECT faz parte da DML (Data Manipulation Language), e serve para recuperar informaes de objetos do banco de dados, tais como tabelas, views, etc. (views sero discutidas posteriormente).

Nele devemos informar quais os atributos (campos, por exemplo), a origem destes atributos (clusula FROM), e finalmente o objeto (tabela, por exemplo) para recuperarmos os dados. Podemos utilizar tambm o caracter (*), para retornar todos os campos da tabela. O SQL*Plus retornar um erro de sintaxe caso alguns destes requisitos no forem devidamente informados. O conjunto de instrues do select compe uma clusula de consulta (query).

A sintaxe bsica apresentada a seguir, sendo que uma query pode se estender a complexas estruturas conforme a necessidade da obteno de informaes. Sintaxes mais avanadas sero estudadas no decorrer deste curso.

5.2. SELECT [CAMPO1], [CAMPO...N] FROM [TABELA]

Ex.: Vamos selecionar 2 campos da tabela EMP : (fig 2)

SELECT N_EMP, NOME_EMP FROM EMP

Fig. 2

Podemos utilizar tambm o caracter (*) conforme especificado acima (fig 3)

SELECT * FROM EMP

Fig. 3

Um exemplo de sintaxe invlida :

SELECT N_EMP, NOME_EMP EMP (fig 4)

Fig. 4

Como a clusula FROM no foi informada, o SQL*Plus retorna o respectivo erro (fig 4)Exerccios:

1) Selecionar os campos cdigo e descrio da tabela PRODUTO.

SELECT COD_PROD, DESCRICAO FROM PRODUTO

2) Selecionar todos os campos da tabela DEPARTAMENTO.

3) Selecionar os campos nome e endereo da tabela FORNECEDOR.

5.3. Utilizao de expresses

As expresses utilizadas no Oracle consistem na combinao de um ou mais valores, campos e valores de uma tabela, operadores aritmticos (+, -, /, *) e funes SQL que retornam valores. Podemos utilizar as expresses para clculos ou informao retornada por uma query, bem como manipular / atualizar informaes no banco de dados.

Ex. : Retornando valores atravs de expresses

Adicionando 10 dias no campo DATA_EMP da tabela EMP :

SELECT N_EMP, NOME_EMP, DATA_EMP, DATA_EMP + 10 FROM EMP (fig 5)

Fig. 5

Utilizando uma funo para manipulao de texto : (fig 6)

SELECT N_EMP, NOME_EMP, INITCAP(NOME_EMP) FROM EMP

Fig. 6

Exerccios:

1) Selecione os campos nome e data de admisso da tabela FUNCIONARIO, subtraindo 20 dias da data de admisso.

SELECT NOME, DT_ADIMISSAO, DT_ADMISSAO - 10 FROM FUNCIONARIO

2) Selecionar o campo municpio da tabela CIDADE, utilizando a funo de manipulao de texto INITCAP.

3) Selecione os campos cdigo, descrio e preo da tabela PRODUTO, multiplicando por dois o preo dos produtos.

5.4. Aliases de Colunas e Literais

Os Alias so utilizados para nomear colunas ou expresses em uma query, simplificando a identificao de um determinado clculo ou campo de uma tabela. Devem ser colocados logo aps a coluna ou expresso especificada na query.

Uma query permite que sejam informados quaisquer caracteres, valores ou expresses que no sejam oriundos de colunas ou alias, so os chamados Literais. So teis para o auxlio em clculos e exibio de informaes e so mostrados para cada linha retornada. Datas e caracteres string devem ser colocados entre apstrofes.

Ex.: Definindo alias para colunas e utilizao de literais. (Fig 7)

SELECT NOME_EMP FUNCIONRIO, SAL SALRIO, '10 %' PERC,

SAL+(SAL*0.10) REAJUSTE FROM EMP

Fig. 7

Exerccios:

1) Selecionar os campos municpio e estado da tabela CIDADE, utilizando alias.

SELECT MUNICIPIO CIDADE, ESTADO UF FROM CIDADE

2) Selecionar o campo nmero do pedido e o resultado da diferena entre a data de entrega e data do pedido da tabela PEDIDOCOMPRA, utilizando alias.

3) Selecionar, da tabela PEDIDOCOMPRA, os campos nmero do pedido, o resultado do clculo do frete, que de 5% sobre o valor total do pedido, trazendo esta porcentagem como campo literal e o resultado do valor total mais o frete. Utilize alias.

6. Seleo e Ordenao

6.1. Clusulas WHERE e ORDER BY

A clusula WHERE permite fazer restrio de informaes que satisfaam uma ou mais condies. Funciona como um filtro de informaes, podendo ser utilizada nas instrues SQL que utilizam expresses, funes, colunas, literais, etc. Ela tambm muito utilizada para realizar juno de tabelas (JOINS), que sero estudadas no decorrer deste curso.

Para utilizar a clusula WHERE, devemos informar um ou mais nomes de coluna e, para cada coluna informada, um operador de condio (tab. 1), um nome de coluna ou uma lista de valores. Podemos utilizar mltiplas condies, utilizando os operadores AND e OR para uni-las, filtrando ainda mais os resultados retornados.

Ex.: SELECT * FROM EMP WHERE N_EMP = 110 AND CARGO = DIRETOR

SELECT * FROM EMP WHERE SAL > 1000 AND CARGO=DIRETOR OR

CARGO = PRESIDENTE

A clusula ORDER BY utilizada para ordenar os resultados de uma query. Podemos utilizar a ordenao com qualquer coluna das tabelas utilizadas.

Para campos numricos e data, a clusula segue um default (padro inicial) com a ordenao sequencial e para campos alfanumricos a ordenao alfabtica. Podemos alterar estes padres utilizando o identificador DESC , que causa uma inverso na ordenao.

Para utilizar ORDER BY, devemos informar a clusula propriamente dita seguida do(s) nome(s) da(s) coluna(s) desejadas. O identificador DESC dever vir logo aps a coluna que se deseja inverter a ordenao.

A deve clusula ORDER BY dever ser sempre a ltima de todas as sentenas em um query.

Ex.:SELECT * FROM EMP ORDER BY N_EMP (Fig 9, 10)

SELECT * FROM EMP ORDER BY NOME_EMP

SELECT * FROM EMP ORDER BY NOME_EMP DESC

Fig. 9

Fig. 10

6.2. Operadores Lgicos e Relacionais para Formao de Seleo

OperadorComparaoExemplo

=IgualSELECT * FROM EMP WHERE N_EMP = 110

DiferenteSELECT * FROM EMP WHERE N_EMP 110

MaiorSELECT * FROM EMP WHERE N_EMP > 100

>=Maior ou igualSELECT * FROM EMP WHERE N_EMP >= 200

= TO_DATE(15/01/2004, DD/MM/YYYY) AND

CARGO = VENDEDOR OR CARGO = GERENTE

2) Selecionar todos os campos da tabela LOCALARMAZENAGEM, onde os cdigos dos locais estejam presentes nesta lista de valores (1,3,7) e ordenar em ordem crescente o campo endereo.

3) Selecionar os campos cdigo do produto, cdigo do local e estoque atual da tabela ESTOQUE, onde o cdigo do local seja diferente de 100 e a data da ltima compra for maior que 20/09/2003 e menor que 20/12/2003. Ordenar em ordem decrescente pelo cdigo do produto.

7. Funes

As funes so similares aos operadores, que podem manipular valores e retornar resultados. Diferem apenas pelo formato de seus argumentos, que podem ser colunas, expresses, valores, etc.

Disponveis na estrutura nativa do Oracle, existem diversos tipos como funes numricas, de caracteres, datas, converso, etc, que podem realizar clculos, modificar dados, converter tipos de dados, alterar formato de dados, etc. As funes se dividem basicamente em 2 grupos : Funes de uma nica linha, que retornam resultados para todas as linhas da query, e as Funes agregadas, que retornam resultados baseados em grupos de linhas, conforme a clusula GROUP BY que ser analisada posteriormente.

7.1. Funes nas clusulas de consulta

Podemos utilizar as funes para manipular os resultados retornados por uma clusula de consulta., como o exemplo a seguir : fig 14.

SELECT INITCAP(NOME_EMP) FROM EMP

SELECT LENGTH(NOME_EMP) FROM EMP

SELECT REPLACE(NOME_EMP,A,B) FROM EMP

Fig. 14

7.2. Funes para tratamento de Strings, Nmeros, Datas e Diversos.

7.2.1. Funes Numricas:

FunoDescrio

ABS(VALOR)Retorna o valor absoluto de VALOR

ACOS(VALOR)Retorna o arco coseno de VALOR

ASIN(VALOR)Retorna o arco seno de VALOR

ATAN(VALOR)Retorna o arco tangente de VALOR

ATAN2(VALOR1, VALOR2)Retorna o arco tangente de VALOR1 e VALOR2

BITAND (ARG1,ARG2)Retorna o resultado de uma operao boleana (AND) entre dois argumentos ARG1 e ARG2. Geralmente utilizada em conjunto com a funo DECODE

CEIL(VALOR)Retorna o menor inteiro, maior ou igual a VALOR

COS(VALOR)Retorna o coseno de VALOR

COSH(VALOR)Retorna o coseno hiperblico de VALOR

EXP(VALOR)Retorna e elevado potncia VALOR, onde e = 2.71828183

FLOOR(VALOR)Arredonda p/ baixo sem casas decimais

LN(VALOR)Retorna o logaritmo natural de VALOR, onde VALOR maior que 0

LOG(VALOR2,VALOR1)Retorna o logaritmo base VALOR2 de VALOR1. A base m poder ser qualquer nmero positivo diferente de 0 ou 1 e VALOR pode ser qualquer nmero positivo

MOD(VALOR2,VALOR1)Retorna o resultado da diviso de VALOR2 por VALOR1. Retornar VALOR1 se VALOR1=0

POWER(VALOR2,VALOR1)Retorna VALOR2 elevado potncia VALOR1

ROUVALORD(VALOR1[,VALOR2])Arredonda VALOR conforme as casas decimais definidas por VALOR2. Se o valor VALOR2 for omitido, seu contedo ser 0

SIGN(VALOR)A funo retorna 1, se VALOR0

SIN(VALOR)Retorna o seno de VALOR

SINH(VALOR)Retorna o seno hiperblico de VALOR

SQRT(VALOR)Retorna a raiz quadrada de VALOR. O valor de VALOR no pode ser negativo

TAN(VALOR)Retorna a tangente de VALOR

TANH(VALOR)Retorna a tangente hiperblica de VALOR

TRUNC(VALOR1[,VALOR2])Remove o nmero de casas direita do ponto decimal de acordo com o parmetro VALOR2. Se omitido, remove as casas decimais

Exerccios:

1) Selecionar os campos numero do pedido, data do pedido e total da tabela PEDIDOCOMPRA, onde a data do pedido for maior ou igual que 01/03/2004 e arredondar as casas a direita do ponto decimal do campo total, para duas casas decimais.

SELECT NUM_PEDIDO, DT_PEDIDO, ROUND( TOTAL,2) FROM PEDIDOCOMPRA

WHERE DT_PEDIDO >= TO_DATE(01/03/2004,DD/MM/YYYY)

2) Selecionar os campos cdigo, descrio e preo da tabela PRODUTO e arredondar o campo preo para cima sem casas decimais.

3) Selecionar os campos nome, data de admisso, salrio e comisso da tabela FUNCIONRIO, onde o salrio for maior que 2000 e remover as casas decimais do campo salrio.

7.2.2. Funes de String:

FunoDescrio

ASCII(VALOR)Retorna a representao decimal do conjunto de caracteres do banco de dados.

CHR(VALOR)Retorna o caractere que tem o binrio equivalente a VALOR

CONCAT(VALOR1,VALOR2)Retorna o VALOR1 concatenado com o VALOR2.

INITCAP(VALOR)Retorna a string contida em VALOR com a primeira letra em maisculo

INSTR(VALOR1,VALOR2[,N[,M]]Procura a localizao de um conjunto de caracteres VALOR1 na string, iniciando a partir da posio N e na ocorrncia de M.

INSTR2(VALOR1,VALOR2[,N[,M]]Similar funo INSTR, exceto q a posio N retorna o valor expresso em UCS2

INSTR4(VALOR1,VALOR2[,N[,M]]Similar funo INSTR, exceto q a posio N retorna o valor expresso em UCS4

INSTRB(VALOR1,VALOR2[,N[,M]]Similar funo INSTR, exceto q a posio N retorna o valor expresso em bytes

INSTRC(VALOR1,VALOR2[,N[,M]]Similar funo INSTR, exceto q a posio N retorna o valor expresso em UNICODE.

LENGTH(VALOR)Retorna o nmero de caracteres contidos em VALOR

LENGTH2(VALOR)Retorna o tamanho (em caracter USC2) de uma string ou expresso.

LENGTH4(VALOR)Retorna o tamanho (em caracter USC4) de uma string ou expresso.

LENGTHB(VALOR)Retorna o tamanho (em bytes) de uma string ou expresso.

LENGTHC(VALOR)Retorna o tamanho (em caracter UNICODE) de uma string ou expresso.

LOWER(VALOR)Retorna todos os caracteres em letras minsculas

LPAD(VALOR1,N, VALOR2)Retorna uma string de N caracteres com o contedo de VALOR1, e o restante em branco preenchido esquerda com o contedo de VALOR2

LTRIM(VALOR1, VALOR2)Remove da string contida esquerda em VALOR1, o contedo de VALOR2. Se VALOR2 for omitido, remove espaos em branco.

REPLACE(VALOR1,

VALOR2, VALOR3)Procura a ocorrncia contida em VALOR2 no contedo de VALOR1, substituindo pelo contedo de VALOR3.

RPAD(VALOR1,N,

VALOR2)Retorna uma string de N caracteres com o contedo de VALOR1, e o restante em branco preenchido direita com o contedo de VALOR2

RTRIM(VALOR1,

VALOR2)Remove da string contida direita em VALOR1, o contedo de VALOR2. Se VALOR2 for omitido, remove espaos em branco.

SUBSTR(VALOR, POS. INICIAL, N)Retorna uma parte da string de N caracteres contida em VALOR, iniciando a string na posio POS.INICIAL,

TRANSLATE(TEXT, FROM, TO)Traduz todas as ocorrncias de cada caractere, substituindo pelo caractere especificado pelo usurio.

UPPER(VALOR)Retorna todos os caracteres em letras maisculas

Exerccios:

1) Selecionar os campos municpio e estado da tabela CIDADE, onde o estado for igual a MG, retornando o nmero de caracteres contidos no campo municpio.

SELECT LENGTH(MUNICIPIO), ESTADO FROM CIDADE

WHERE ESTADO = MG

2) Selecionar os campos cdigo e descrio da tabela DEPARTAMENTO, removendo os espaos em brancos do campo descrio.

3) Selecionar os campos cdigo, nome e endereo da tabela FORNECEDOR, retornando os campos nome e endereo em letra maiscula.

7.2.3. Funes de Data e Hora

FunoDescrio

ADD_MONTHS(VALOR, N)Retorna a data contida em VALOR acrescido de N meses

CURRENT_DATERetorna a data corrente em uma sesso.

CURRENT_TIMESTAMPRetorna a data e a hora corrente em uma sesso.

DBTIMEZONERetorna a zona de tempo do banco de dados.

EXTRACT(datetime)Extrai a data e hora de um campo do tipo datetime

LAST_DAY(VALOR)Retorna o ultimo dia do ms

MONTHS_BETWEEN(

VALOR1,VALOR2Retorna o nmero de meses entre as datas contidas em VALOR1 e VALOR2.

NEW_TIME(VALOR, Z1, Z2)Retorna a data e a hora conforme as zonas Z1 e Z2. Zonas so caracteres definidos pelos valores da zona de tempo.

NEXT_DAY(VALOR1, VALOR2)Retorna a data do primeiro dia til, maior que a data VALOR1. O primeiro dia til da semana expresso pelo VALOR 2.

ROUND(VALOR[,FORMATO])Arredonda o valor de VALOR de acordo com a unidade especificada pelo formato.

SESSIONTIMEZONERetorna o valor corrente da regio de tempo(time zone).

SYSDATERetorna a data e a hora correntes

SYSTIMESTAMPRetorna a data e a hora, incluindo as fraes de segundo e as zonas de tempo do banco de dados

TRUNC(VALOR[,FORMATO])Trunca o VALOR especificado pelo formato.

Exerccios:

1) Selecionar os campos cdigo do produto, cdigo do local e data da ltima compra da tabela ESTOQUE, onde o cdigo do produto esteja dentro desta lista (100,200,300,400). Adicionar 2 meses na data da ltima compra e ordenar por cdigo do local.

SELECT COD_PROD, COD_LOCAL, ADD_MONTHS(DT_ULTCOMPRA,2) FROM ESTOQUE

WHERE COD_PROD IN(100,200,300,400)

ORDER BY COD_LOCAL

2) Selecionar o nmero do pedido, a data do pedido, a data de entrega e o total da tabela PEDIDOCOMPRA, onde o cdigo do fornecedor for igual a 1. Adicionar 1 ms na data de entrega e ordenar em ordem decrescente pela data do pedido.

3) Selecionar o cdigo do funcionrio, nome e data de admisso, formatando o campo data de admisso e ordenar pelo nome

7.2.4. Funes de Converso

FunoDescrio

TO_CHAR(STRING)Converte um tipo de dado NCHAR, NVARCHAR2, CLOB OU NCLOB para um tipo de dado especificado no banco de dados.

TO_DATE( STRING, FORMATO )Converte um tipo de dado CHAR, VARCHAR2, NCHAR OU NVARCHAR2 para um tipo de dado DATE.

TO_NUMBER(STRING[,FORMATO]) Converte um tipo de dado CHAR, VARCHAR2, NCHAR OU NVARCHAR2 para o tipo de dados NUMBER.

7.2.5. Funes de Agrupamento

FunoDescrio

AVG([DISTINCT|ALL]VALOR)Retorna o valor mdio de VALOR

COUNT({*|[DISTINCT|ALL]EXPR})Retorna o nmero de linhas de uma consulta. Se o parmetro EXPR for especificado, a funo retornar o nmero de linhas onde a expresso no for nula. Se especificado (*), a funo retornar todas as linhas, incluindo duplicaes e valores nulos.

MAX([DISTINCT|ALL]EXPR)Retorna o valor mximo de EXPR.

MIN([DISTINCT|ALL]EXPR)Retorna o valor mnimo de EXPR.

SUM([DISTINCT|ALL]VALOR)Retorna a soma dos valores de VALOR.

VARIANCE([DISTINCT|ALL]EXPR)Retorna a varincia de EXPR.

7.2.6. Outras Funes

FunoDescrio

DECODE(EXPR, SEARCH, RESULT, DEFAULT)Compara valores para cada expresso EXPR.Se a expresso EXPR for igual ao valor pesquisado SEARCH, o Oracle retorna o resultado correspondente result, caso contrrio o Oracle retornar um valor padro(default) ou um valor nulo.

NULLIF(EXPR1, EXPR2)Compara a expresso EXPR1 com a expresso EXPR2; se elas forem iguais, a funo retornar o valor nulo; se elas forem diferentes, retornar o valor da expresso EXPR1.

NVL(EXPR1,EXPR2)Se EXPR1 for nula, retornar EXPR2; se EXPR1 no for nula, devolver EXPR1

NVL2(EXPR1,EXPR2,EXPR3)Se EXPR1 no for nula, retornar EXPR2; se EXPR1 for nula, devolver EXPR3. Os argumentos EXPR1 e EXPR2 podem ter qualquer tipo de dado exceto tipo de dados LONG.

USER Retorna o nome do usurio corrente no banco de dados.

7.2.7. Formatos Numricos

FormatoExemploSignificado

99999Retorna o valor com o nmero de dgitos.

00999Retorna o valor precedido de zeros.

9990Retorna o valor de zeros aps o resultado.

$ $9999Retorna o valor precedido do smbolo de dlar.

7.2.8. Formatos de Datas e Horas

FormatoSignificado

DDias da semana (1-7).

DAYNome do dia da semana.

DDDias da ms (1-31).

HH OU HH12Hora diria (1-12), formato de 12 horas.

HH24Hora diria (1-12), formato de 24 horas.

MIMinutos (0-59)

MMMeses do ano (01-12)

MONTHNome do ms

YYYYQuatro dgitos para o ano.

Yyltimos dois dgitos do ano.

8. Joins

8.1. Definio e utilidade dos Joins

A combinao de informaes de 2 ou mais tabelas em uma mesma query denomina-se Join. Os Joins so extremamente teis pois atravs deles que podemos extrair o mais alto nvel de detalhes e objetividade na recuperao de informaes.

As condies para construo de joins so especificadas na clusula WHERE de uma query. Nela so definidas as colunas que possuem um valor em comum para todas as tabelas. Para executar um Join, o Oracle faz a juno de 2 tabelas baseado nas colunas que contm as condies de join na clusula WHERE, comparando suas colunas. Com este resultado, faz novamente a juno com outra tabela baseado nas colunas que contm as condies de join do resultado e da prxima tabela. O Oracle repete o processo at que todas as condies de join sejam satisfeitas. Ex.:

[ [ [ Tabela1 Tabela2 ] Tabela3 ] .....TabelaN]

Para construir joins devemos informar as colunas em comum pertencentes s tabelas que estamos fazendo a unio, atravs do operador [ = ]. A sintaxe bsica :

COLUNA (da Tabela1) = COLUNA (da Tabela2)

Se em qualquer uma destas tabelas existir um nome igual de coluna, deve-se especificar o nome da tabela antes de se especificar o nome da coluna, seguindo a seguinte sintaxe :

TABELA1.COLUNA = TABELA2.COLUNA

O Oracle ento consegue distinguir as colunas evitando qualquer tipo de ambigidade. Podemos utilizar tambm Alias para as tabelas, discutidos posteriormente neste tpico.

Podemos continuar a sentena unindo mais tabelas. Para isso utilizamos o operador de conjuno [AND], quantas vezes for necessrio:

TABELA1.COLUNA1 = TABELA2.COLUNA 1

AND

TABELA1.COLUNA2 = TABELA3.COLUNA2

AND

TABELA2.COLUNA3 = TABELA4.COLUNA3

AND

TABELA(X).COLUNA(X) = TABELA (X1).COLUNA(X)...

Obs.: A clusula WHERE e o operador AND contm outras condies para restrio de informaes, (filtros) descritos no item 4.1, e podem ser utilizadas juntamente com as condies de join.

8.2. Tipos de Joins

8.2.1. Equijoins

So joins que contm um operador de igualdade ( = ) em sua condio. Um equijoin combina linhas que tm valores iguais para as colunas especificadas.

8.2.2. SelfJoins

So joins realizados na prpria tabela, que aparece 2 vezes na clusula FROM, respeitando as condies de join especificadas no item 6.2

8.2.3. InnerJoins

So joins que retornam somente as linhas que satisfazem a condio de join, ou seja, todas as linhas referentes as colunas que contm as condies de join devero existir em todas as tabelas que fazem parte do join. Ex.:

Tabela1Tabela2Tabela3

001001001

001001003

002003002

002002002

8.2.4. OuterJoins

Diferente de InnerJoin, as linhas referentes as colunas que contm as condies de join podem no existir em todas as tabelas, mas retorna-as mesmo assim dependendo de qual tabela se deseja retornar todas as linhas. Em uma query com 2 tabelas por exemplo, para retornar todas as linhas da Tabela1, independentemente se existem na Tabela2, devemos utilizar o operador (+) na Tabela onde no existem todas as linhas, que neste caso a Tabela2. A sintaxe bsica :

TABELA1.COLUNA1 = TABELA2.COLUNA1(+)

Tabela1Tabela2

001

001001

003

002002

8.3. Alias para Tabelas

Os alias (apelidos) possuem o mesmo conceito discutido no item 3.3, com a diferena de que os utilizamos tambm para as tabelas. Os alias so teis para facilitar a construo de querys. Uma vez definido um alias para tabelas, podemos utiliza-lo em qualquer posio da query, sempre que for necessrio referenci-las. Se houver nomes iguais de colunas para mais de uma tabela em uma query, obrigatria a utilizao do alias nestas colunas. No necessrio utilizar o alias para colunas que no so comuns nas tabelas de uma query, porm recomendvel sua utilizao para facilitar a leitura e entendimento de uma query, visto que desta maneira possvel distinguir a origem de uma coluna.

SELECT A.COLUNA1, B.COLUNA1, COLUNA99

FROM TABELA1 A, TABELA2 B

WHERE A.COLUNA1=B.COLUNA1

8.4. Produto Cartesiano

Se uma condio de join no for vlida em uma query, o Oracle combina cada linha de uma tabela com cada linha de outra, retornando um Produto Cartesiano, gerando vrias linhas e raramente utilizado. Para 2 tabelas com 8 linhas cada uma, por exemplo, o Oracle retornar 64 linhas. Sempre que possvel deve-se utilizar joins a menos que seja necessrio utilizar um produto cartesiano.

8.5. Joins no padro SQL 1999

O Oracle 9i agora d suporte a sintaxe padro SQL 1999 para joins, cross-joins, natural joins e uma sintaxe especial para OuterJoins.

8.5.1. Cross-Joins

No so muito utilizados, produzem apenas um produto cartesiano:

SELECT COLUNA1, COLUNA2 FROM TABELA1 CROSS JOIN TABELA28.5.2. Natural Joins

Realizam um join para todas as colunas que possuem nomes iguais em 2 tabelas. So muito utilizados pois a clusula WHERE no utilizada para condies de join, somente para condies de filtragem de linhas. A query a seguir:

SELECT A.COLUNA1, B.COLUNA1 FROM TABELA1 A, TABELA2 BWHERE A.COLUNA1 = B.COLUNA1

o equivalente, com Natural Join a:

SELECT COLUNA1, COLUNA2 FROM TABELA1 NATURAL JOIN TABELA2

8.5.3. Outer Joins

Utilizam o mesmo conceito visto no tpico 8.2.4, com uma sintaxe diferenciada, subdividida em 2 subtipos, LEFT OUTER JOIN e RIGHT OUTER JOIN.

Utiliza-se LEFT(esquerda) e RIGHT(direita) como uma forma de apontar para a tabela onde as linhas sero retornadas independentemente se existirem na outra tabela. Em uma query com 2 tabelas, se desejarmos retornar todas as linhas da primeira tabela, utilizamos LEFT OUTER JOIN:

SELECT A.COLUNA1, B.COLUNA1 FROM

TABELA1 A LEFT OUTER JOIN TABELA2 B

ON (A.COLUNA1 = B.COLUNA1)

O equivalente de Outer Join na sintaxe padro do Oracle :

SELECT A.COLUNA1, B.COLUNA1 FROM TABELA1 A, TABELA2 BWHERE

A.COLUNA1 = B.COLUNA1(+)

Para mais de 2 tabelas, se desejarmos continuar a trazer todos os dados da primeira tabela, pegamos o resultado da unio das 2 tabelas e aplicamos o OUTER JOIN com a terceira tabela:

SELECT A.COLUNA1, B.COLUNA1, C.COLUNA1 FROM

(TABELA1 A LEFT OUTER JOIN TABELA2 B ON (A.COLUNA1 = B.COLUNA1))

LEFT OUTER JOIN TABELA3 C ON (A.COLUNA1=C.COLUNA1)

9. Agrupamento de Dados

9.1. Clusula GROUP BY

Para agrupar linhas de uma tabela dentro de grupos especficos, utilizamos a clusula GROUP BY. O Oracle calcula as linhas selecionadas baseadas no parmetro fornecido pelas funes de grupo e retorna uma nica linha com o resumo das informaes para cada grupo. O GROUP BY agrupa as linhas, mas no as ordena, sendo necessrio utilizar a clusula ORDER BY para isso. Ex.: Na seguinte query, no h agrupamento de dados, e as informaes so repetidas. (Fig.15)

Fig. 15

Se utilizarmos a clausula GROUP BY na coluna CARGO, podemos utilizar uma funo de grupo SUM() para somarmos todos os salrios. Obs.: Se omitirmos a clusula GROUP BY de uma query que possui funes de grupo, um erro ser mostrado indicando que no podemos utilizar funes de grupo sem agrupar as linhas. Ex.: (Fig 16)

Fig. 16

9.2. Funes de Grupo

FunoDescrio

AVG(VALOR)Retorna a mdia do parmetro VALOR.

COUNT(VALOR)Retorna o nmero linhas retornadas pela query. Se o parmetro VALOR for uma coluna, retorna todas as linhas no nulas referentes a esta coluna. Se for especificado um (*), retorna todas as linhas, duplicadas e nulas.

SUM(VALOR)Retorna a soma do parmetro VALOR.

MAX(VALOR)Retorna o valor mximo do parmetro VALOR

MIN(VALOR)Mesmo que MAX, retornando o valor mnimo.

Exerccios:

1) Selecionar da tabela ITEM, os campos cdigo do produto e a somatria da quantidade. Agrupar e ordenar pelo cdigo do produto

SELECT COD_PROD, SUM(QUANTIDADE) FROM ITEM A

GROUP BY COD_PROD

ORDER BY COD_PROD

2) Selecionar da tabela PEDIDOCOMPRA, os campos nmero do pedido e data do pedido, trazendo o total de pedidos, agrupar e ordenar em ordem decrescente pela data do pedido.

3) Selecionar da tabela FORNECEDOR os campos cdigo do fornecedor e cdigo da cidade, trazendo o nmero total de fornecedores por cidade e o campo municpio da tabela CIDADE. Agrupar e ordenar pelo cdigo da cidade.

9.3. Clusula HAVING

Utilizada com GROUP BY, a clusula HAVING usada para selecionar os grupos que sero mostrados com base nas informaes das funes de grupos. No possvel utilizar a clusula WHERE em sentenas de grupos. Ex.: (fig 17)

Fig. 17

Exerccios:

1) Selecionar da tabela PEDIDOCOMPRA, os campos nmero do pedido e data do pedido, trazendo o total de pedidos, dentro do perodo de 01/01/2004 a 01/03/2004. Agrupar e ordenar pela data do pedido em ordem decrescente.

SELECT COUNT(NUM_PEDIDO) AS TOTAL, DT_PEDIDO FROM PEDIDOCOMPRA

HAVING DT_PEDIDO BETWEEN TO_DATE(01/02/2004, DD/MM/YYYY) AND

TO_DATE(01/03/2004, DD/MM/YYYY)

GROUP BY DT_PEDIDO

ORDER BY DT_PEDIDO DESC

2) Selecionar da Tabela Estoque, os campos cdigo do produto e data da ltima compra, trazendo o total de produtos, dentro do perodo de 20/11/2003 at 20/01/2004. Agrupar e ordenar pela data da ltima compra.

3) Selecionar da Tabela PEDIDOCOMPRA os campos nmero do pedido, total e data do pedido, trazendo a mdia do campo total e o nmero total de pedidos, dentro do perodo de 25/01/2004 at 25/03/2004. Agrupar pela data do pedido

10. SubQueries

So queries auxiliares utilizadas para retornar resultados intermedirios para completar a condio da query principal ou um nvel acima. As regras de nomenclatura e Alias para as subqueries se aplicam da mesma forma como foi discutido no item 5.3. Deve-se nomear as subqueries utilizando alias para evitar ambigidade com outras tabelas e subqueries.

10.1. Tipos de Subqueries

10.1.1. Inline Views

So as subqueries da clusula FROM, como tabelas temporrias paralelas, que unidas com as tabelas da query principal retornam o resultado final. Ex.:

SELECT A.COLUNA1, B.COLUNA1, C.COLUNA10

FROM TABELA1 A, TABELA 2 B,

(SELECT COLUNA1, COLUNA10 FROM TABELA10) C ,

WHERE A.COLUNA1=B.COLUNA1 AND A.COLUNA1 = C.COLUNA1

10.1.2. Nested subqueries

So as subqueries da clusula WHERE, ou subqueries encadeadas, que podem conter outras subqueries. Ex.:

SELECT COLUNA FROM TABELA1 WHERE

COLUNA = (SELECT COLUNA FROM TABELA2 WHERE COLUNA =

(SELECT COLUNA FROM TABELA3 WHERE COLUNA =

(SELECT COLUNA FROM TABELA4 WHERE {condio})))Obs.: O Oracle no impe limites para encadeamento de subqueries inline view, mas para nested subqueries so permitidos at 255 nveis de encadeamento.

10.1.3. Subqueries Co-Relacionadas

So subqueries relacionadas diretamente com a query principal, e so executadas para cada linha processada por ela. O operador EXISTS muito utilizado neste tipo de subquery. Ex.:

SELECT A.COLUNA1, A.COLUNA2 FROM TABELA1 AWHERE NOT EXISTS (SELECT B.COLUNA1 FROM TABELA2 BWHERE B.COLUNA1 = A.COLUNA1)

Exerccios:

1) Selecionar usando tabela PEDIDOCOMPRA, os campos nmero do pedido, a quantidade total de pedidos e as quantidades totais de pedidos em Maro/2003 e Junho/2003. Agrupar pelo numero do pedido.

SELECT NUM_PEDIDO, COUNT(NUM_PEDIDO) AS TOTAL, (SELECT COUNT(NUM_PEDIDO) FROM PEDIDOCOMPRA WHERE TO_CHAR(DT_PEDIDO, 'MM') = 03 AND TO_CHAR(DT_PEDIDO, 'YYYY') = 2003) AS TOTAL_MARCO2000, (SELECT COUNT(NUM_PEDIDO) FROM PEDIDOCOMPRA WHERE TO_CHAR(DT_PEDIDO, 'MM') = 06 AND TO_CHAR(DT_PEDIDO, 'YYYY') = 2003) AS TOTAL_JUNHO2000 FROM PEDIDOCOMPRA GROUP BY NUM_PEDIDO

2) Selecionar os pedidos de compra somente dos que no possuem itens, usando as tabelas PEDIDOCOMPRA e ITEM.

3) Selecionar somente os funcionrios que possuem departamentos relacionados, usando as tabelas FUNCIONARIO e DEPARTAMENTO.

11. Comando INSERT

Insere informaes em uma tabela. A sintaxe bsica :

INSERT INTO TABELA(COLUNA1, COLUNA2, ...COLUNAn)

VALUES(VALOR1, VALOR2, ...VALORn)

11.1. Limitaes

( necessrio possuir os privilgios necessrios definidos pelo Administrador do Banco de Dados (DBA).;

(Cada VALOR deve corresponder a uma COLUNA na tabela. O Oracle retorna um erro se uma coluna for especificada sem o seu valor, ou um valor sem uma coluna.

(Os valores nos parmetros VALOR1, VALOR2... podem ser expresses, clculos, literais, desde respeitem os tipos de dados correspondentes as colunas;

(Os tipos de dados String devero estar entre apstrofes ( );

(Os tipos de dados Data devero tambm estar entre apstrofes, ou convertendo para tipo Data atravs da funo to_date.

(As restries (CONSTRAINTS Discutidas posteriormente) podem impedir a incluso de informaes na tabela, dependendo do que foi definido pelo Administrador do Banco de Dados. Um comando INSERT, por exemplo, no ser executado se :

Os dados j existirem na tabela;

No existirem informaes suficientes em alguma tabela relacionada com a tabela que se est tentando inserir dados;

Inserir valores nulos em colunas que no permitem valores nulos.

11.2. Utilizao do comando SELECT

A sintaxe analisada anteriormente tinha como objetivo a insero de uma nica linha. Para insero de vrias linhas em uma tabela, utilizamos uma lista de valores retornados por uma subquery. Como regra principal, cada valor retornado deve se referenciar a uma coluna especificada na clusula INSERT. A regra no se aplica se a subquery possuir exatamente as mesmas colunas especificadas na clusula INSERT. Pode-se especificar valores default para colunas. Se no for especificado nenhum valor, o Oracle insere valores null, caso no se encaixe nas restries descritas no item 11.1.

Ex.: Assumindo-se que TABELA1 possui 5 colunas:

INSERT INTO TABELA1 (COLUNA1, COLUNA2, COLUNA3)

SELECT COL1, COL2 COL3 FROM TABELA2

INSERT INTO TABELA1

SELECT COL1, COL2, COL3, COL4 COL5 FROM TABELA2

Exemplo:

CREATE TABLE FUNCIONARIO_COPIA AS SELECT * FROM FUNCIONARIO

UPDATE FUNCIONARIO_COPIA SET COD_FUNCIONARIO = ROWNUM + 50

INSERT INTO FUNCIONARIO SELECT * FROM FUNCIONARIO_COPIAExerccios:

1) Adicionar um fornecedor novo na tabela Fornecedor.

INSERT INTO FORNECEDOR(COD_FORNECEDOR,NOME,ENDERECO,COD_CIDADE)VALUES(9, 'GATEC - SOLUES EM TI', 'AV.LIMEIRA,222', 2)

2) Adicionar uma cidade nova na tabela Cidade

3) Adicionar um departamento novo na tabela Departamento

12. Comando UPDATE

Altera informaes em uma tabela. A sintaxe bsica :

UPDATE TABELA SET

COLUNA1=VALOR1, COLUNA2=VALOR2, ...COLUNAn=VALORn

WHERE {condio}

As regras do item 11.1 tambm se aplicam a esta clusula.

A clusula WHERE possui o mesmo critrio para filtragem de informaes. Se for omitida, atualiza todas as linhas existentes na tabela.

12.1. Atualizao de Mltiplas Colunas

Podemos atualizar todas ou qualquer coluna de uma tabela, sendo necessrio apenas especific-las na lista de colunas da clusula UPDATE. Colunas no especificadas permanecero com seus valores inalterados.

12.2. Utilizao com subqueries

O Oracle permite utilizar uma sintaxe especial, onde especificamos primeiro todas as colunas, e depois os valores para atualizao atravs de uma subquery. Os valores desta subquery podem ser de qualquer origem, desde respeitem o tipo de dados de cada coluna da tabela e que retornem apenas uma nica linha. Se for especificado mltiplas colunas, a subquery dever retornar todos os valores correspondentes a estas colunas. Se a subquery no retornar linhas, ser associado o valor null para as colunas, que podero ou no ser atualizadas, dependendo das restries descritas no item 9.1.

UPDATE TABELA1 SET(COLUNA1, COLUNA2, ...COLUNAn) =

(SELECT VALOR1, VALOR2, ...VALORn FROM TABELA2 WHERE {condio})

WHERE {condio}

Exerccios:

1) Alterar o endereo do fornecedor da tabela FORNECEDOR, onde o cdigo do fornecedor for igual a 1.

UPDATE FORNECEDOR SET ENDERECO = 'RUA ARMANDO SALLES, 1525' WHERE COD_FORNECEDOR = 1

2) Alterar o endereo do local de armazenagem da tabela LOCALARMAZENAGEM, onde o cdigo do local for igual a 5.

3) Alterar a data da ltima compra da tabela ESTOQUE, onde o cdigo do local for igual a 3.

13. Comando DELETE

Exclui informaes de uma tabela. A sintaxe bsica :

DELETE FROM TABELA WHERE {condio}

As regras do item 11.1 tambm se aplicam a esta clusula.

A clusula WHERE possui o mesmo critrio para filtragem de informaes. Se for omitida, exclui todas as linhas existentes na tabela.

13.1. Utilizao com subqueries

Tambm podem ser utilizadas subqueries seguindo as regras normais de sintaxe discutidas anteriormente:

DELETE FROM (SELECT * FROM TABELA WHERE {condio})DELETE FROM TABELA WHERE COLUNA IN (SELECT COLUNA FROM TABELA2)Exerccios:

1) Excluir da tabela ESTOQUE as informaes referentes ao estoque, onde os locais pertencerem cidade 5.

DELETE FROM ESTOQUE WHERE COD_LOCAL IN (SELECT COD_LOCAL FROM LOCALARMAZENAGEM WHERE COD_CIDADE = 5)

2) Excluir da tabela LOCALARMAZENAGEM as informaes referentes s cidades do estado de Santa Catarina.

3) Excluir da tabela FUNCIONARIO as informaes referentes aos funcionrios que pertencem ao departamento 10.

14. Comando MERGE

O comando MERGE utilizado para selecionar linhas de uma ou mais fontes de dados(tabelas, subqueries, views) para incluso ou alterao tambm em uma ou mais tabelas. Pode-se estabelecer condies para determinar operaes de incluso ou alterao nas tabelas de destino. uma forma conveniente de combinar mltiplas operaes. MERGE uma sentena determinstica, ou seja, no se pode atualizar uma tabela mltiplas vezes na mesma sentena.

As regras do item 11.1 tambm se aplicam a esta clusula.

14.1. Comparaes com verses anteriores do Oracle

Em um ambiente com um grande volume de informaes, onde as atualizaes so muito freqentes, o Oracle deve gerenciar os dados de maneira precisa, determinando, por exemplo, atualizaes para os dados que j existem e insero de novas informaes.

Nas verses anteriores do Oracle, estas operaes eram expressas como uma seqncia de DMLs (Data Manipulation Language), ou nada mais do que INSERTs e UPDATEs implementados em blocos de estrutura de comandos de deciso. A performance ento era comprometida, pois exigia mltiplas anlises dos dados e operaes linha a linha. O Oracle 9i implementa o novo comando MERGE, com o objetivo de solucionar estes problemas, alm de ser mais simples e intuitivo.

14.2. Clusula INTO

Especifica a tabela de destino onde ser feita a atualizao

14.3. Clusula USING

Especifica a origem dos dados, que pode ser uma tabela, subquery ou view(discutido posteriormente)

14.4. Clusula ON

Especifica as condies de atualizao para o comando MERGE. Para cada linha da fonte de dados, o Oracle faz a atualizao na tabela de destino com as linhas correspondentes, dependendo do que for especificado, um UPDATE ou DELETE. Se a linha no for encontrada, faz a insero na tabela.

MERGE INTO TABELA1

USING {Fonte de dados}

ON ({condio})

WHEN MATCHED THEN UPDATE SET TABELA1.COLUNA1 = VALOR

Ou DELETE WHERE {condio}

WHEN NOT MATCHED THEN INSERT(TABELA1.COLUNA1TABELA1.COLUNAn)

VALUES(VALOR) WHERE {condio}

Exemplo:

MERGE INTO bonuses D

USING (SELECT employee_id, salary, department_id FROM employees

WHERE department_id = 80) S

ON (D.employee_id = S.employee_id)

WHEN MATCHED THEN UPDATE SET D.bonus = D.bonus + S.salary*.01

DELETE WHERE (S.salary > 8000)

WHEN NOT MATCHED THEN INSERT (D.employee_id, D.bonus)

VALUES (S.employee_id, S.salary*0.1)

WHERE (S.salary SELECT NOME FROM FUNCIONARIO WHERE COD_FUNCIONARIO = 1;

NOME

----------------------------------------

JOSE MANOEL DA SILVA

SQL> UPDATE FUNCIONARIO SET NOME = 'TESTE' WHERE COD_FUNCIONARIO = 1;

1 row updated

SQL> SELECT NOME FROM FUNCIONARIO WHERE COD_FUNCIONARIO = 1;

NOME

----------------------------------------

TESTE

SQL> SAVEPOINT A;

Savepoint created

SQL> UPDATE FUNCIONARIO SET NOME = 'JOANA' WHERE COD_FUNCIONARIO = 1;

1 row updated

SQL> SELECT NOME FROM FUNCIONARIO WHERE COD_FUNCIONARIO = 1;

NOME

----------------------------------------

JOANA

SQL> ROLLBACK TO A;

Rollback complete

SQL> SELECT NOME FROM FUNCIONARIO WHERE COD_FUNCIONARIO = 1;

NOME

----------------------------------------

TESTE

SQL> ROLLBACK;

Rollback complete

SQL> SELECT NOME FROM FUNCIONARIO WHERE COD_FUNCIONARIO = 1;

NOME

----------------------------------------

JOSE MANOEL DA SILVA

16. Criao de Tabelas

Os comandos para definio dos dados so conhecidos no Oracle como comandos DDL (Data Definition Language) enquanto os comandos DML so utilizados para a manipulao dos dados propriamente ditos os comandos DDL criam, alteram as estruturas, manipula os direitos, analisa as informaes dos objetos, estabelece opes para auditoria.

Utilizamos a clusula CREATE TABLE para criar tabelas no Oracle. As tabelas podem ser criadas a qualquer momento, desde que se tenham privilgios (direitos) para isso. Privilgios sero discutidos posteriormente.

Inicialmente so criadas sem nenhum valor, a menos que uma subquery seja especificada.

Aps criar a tabela, deve-se definir as colunas, tipos de dados e restries.

A sintaxe bsica :

CREATE TABLE {nome_tabela}

( {nome_coluna} [Tipo de dados] ( [Tamanho] ) [Restrio] , ..........)

Ex.:

CREATE TABLE TABELA1

(COLUNA1 NUMBER(2) NOT NULL, COLUNA2 VARCHAR2(20))

16.1. Nomenclatura de Tabelas e Colunas

No Oracle podemos representar nomes de objetos como identificadores sem aspas ou identificadores com aspas. Objetos nomeados com aspas sempre devero estar neste formato quando forem referenciados.

Ex.: Para um objeto com o nome de TABELA-TESTE

SELECT * FROM TABELA-TESTE

SELECT * FROM TABELA-TESTE

Isto vale para a maioria dos objetos que compem a estrutura do Oracle, como tabelas, colunas, views, etc.

As seguintes regras so aplicadas para nomenclatura de objetos no Oracle:

Os nomes podem ter at 30 caracteres;

Identificadores sem aspas no podem ter o mesmo nome de palavras reservadas (lista de palavras utilizadas pela estrutura interna do Oracle). Devem iniciar com cacteres alfabticos, entretanto, possvel utilizar cacteres como o smbolo underscore (_), o dlar ($) e o sustenido(#), mas recomenda-se no utiliza-los. So identificados pelo Oracle sempre como nomes em letra maiscula.

Identificadores com aspas podem ter qualquer nome, inclusive palavras reservadas, e iniciar com qualquer caracter, porm no recomendvel a utilizao de caracteres incomuns para nomenclatura. So sensveis a maisculas e minsculas, sendo que o Oracle os identifica de acordo como foram criados. Ex. Tabela, TAbela, tabelA

Utilizar caracteres comuns para nomenclatura permite maior compatibilidade entre plataformas e sistemas operacionais;

Objetos de tipos diferentes no podem ter o mesmo nome; Ex.: Uma Tabela no pode ter o mesmo nome de uma View.

Colunas de uma mesma tabela no podem ter o mesmo nome, entretanto, podem ter o mesmo nome em tabelas diferentes;

16.2. Tipos de Dados (DataTypes)

Todo valor manipulado pelo Oracle possui um tipo de dados. O tipo de dados de um valor associa-se com um conjunto fixo de propriedades necessrias para diferencia-lo de outros valores. Na criao de uma tabela, deve-se especificar o tipo de dados para cada coluna. So os tipos de dados que determinam o tipo de valor que cada uma deve conter. Ex.: Em um tipo de dados Data ou Numrico, a coluna no ir aceitar um caracter em seu contedo. A seguir uma tabela com os tipos de dados mais comuns:

Tipo de DadosDescrio

VARCHAR2(N)Tipo string de largura varivel, com o mximo de 4000 caracteres e mnimo de 1 caracter. Deve-se especificar um tamanho para este tipo

NUMBER(N,D)Tipo numrico com uma faixa de 1 a 38 posies para casas inteiras, e uma faixa de 84 a 127

LONGTipo string de largura varivel com at 2GB de largura

DATETipo data e hora, com uma faixa de valores de 01/01/4712 a.c. at 31/12/9999 d.c.

CHAR(N)Tipo string de largura fixa, com o mximo de 2000 caracteres e mnimo de 1 caracter. Deve-se especificar um tamanho para este tipo

Exerccios:

1) Criar uma tabela CLIENTE, com os seguintes campos: Cdigo do Cliente, Nome e Endereo.

CREATE TABLE CLIENTE (COD_CLIENTE NUMBER(2), NOME VARCHAR2(30), ENDERECO VARCHAR2(40))

2) Criar uma tabela PEDIDOVENDA, com os seguintes campos: Nmero do Pedido, Cdigo do Cliente, Data do Pedido e Total do Pedido.

16.3. Restries ( Constraints )

Constraints so regras utilizadas para restringir valores no banco de dados, garantir a integridade das informaes e o relacionamento entre tabelas. O Oracle disponibiliza 6 tipos de Constraints:

NOT NULL no permite que valores null sejam atualizados no banco de dados;

UNIQUE no permite que mltiplas linhas de uma mesma coluna ou combinao de colunas tenham o mesmo valor, porm permite valores null;

PRIMARY KEY combina a constraint NOT NULL e UNIQUE em uma s declarao, com a funcionalidade de todas ao mesmo tempo;

FOREIGN KEY no permite que valores sejam atualizados se no existirem em uma tabela especificada;

CHECK no permite que valores sejam atualizados caso no satisfaam uma condio especificada;

Exemplos:

Pode-se definir as constraints de duas maneiras:

Como parte da definio das colunas ou atributos, chamadas inline. A constraint NOT NULL a nica que deve ser declarada somente inline:

CREATE TABLE TABELA(COLUNA1 NUMBER(2) CONSTRAINT {nome} UNIQUE, COLUNA2 VARCHAR2(20))

Como parte da definio da tabela, ou out-of-line:

CREATE TABLE TABELA(COLUNA1 NUMBER(2), COLUNA2 VARCHAR2(20), CONSTRAINT {nome}UNIQUE (COLUNA1))

Exerccios:

Obs.: Aps a excluso das tabelas CLIENTE e PEDIDOVENDA no item 16.6.

1) Criar uma tabela CLIENTE, com os seguintes campos: Cdigo do Cliente, Nome e Endereo, sendo que o cdigo do cliente chave primria.

CREATE TABLE CLIENTE (COD_CLIENTE NUMBER(2) PRIMARY KEY, NOME VARCHAR2(30), ENDERECO VARCHAR2(40))

2) Criar uma tabela PEDIDOVENDA, com os seguintes campos: Nmero do Pedido, Cdigo do Cliente, Data do Pedido e Total do Pedido, sendo que o nmero do pedido chave primria, o cdigo do cliente chave estrangeira e o total do pedido no pode ser nulo

16.4. Utilizao de Subqueries

Pode-se criar tabelas com linhas retornadas de uma subquery. A Tabela criada herda os tipos de dados e largura da subquery. Ex.:

CREATE TABLE TABELA1 AS

SELECT COLUNA1, COLUNA2, COLUNA3 FROM TABELA2 WHERE {condio}

O Oracle segue algumas regras para utilizao deste recurso:

O Oracle define automaticamente qualquer constraint NOT NULL que foi explicitamente criada na tabela da subquery correspondente. Se qualquer linha violar a constraint, ele no cria a tabela e retorna um erro;

Constraints NOT NULL que foram criadas implicitamente pelo Oracle nas colunas da tabela da subquery (por exemplo, PRIMARY KEY) no so transportadas para a nova tabela;

Outros atributos de coluna, como primary key e foreign key no so transportados para nova tabela;

Se todas as tabelas so colunas, pode-se omitir as colunas da definio (aps a clusula CREATE TABLE). Neste caso, os nomes das colunas ficaro idnticos aos da subquery;

As definies no podem conter tipos de dadossomente nomes de colunas, valores default e constraints de integridade, no tipos de dados;

CREATE TABLE TABELA1(COLUNA1, COLUNA2) AS

SELECT COLUNA1, COLUNA2 FROM TABELA2

16.5. Comando ALTER TABLE

Utilizamos a clusula ALTER TABLE para alterar definies de tabelas no Oracle, sendo necessrio possuir os privilgios necessrios para isso. Podemos criar ou alterar colunas, seguindo algumas regras bsicas:

No se pode alterar uma coluna NULL que contm valores nulos para NOT NULL;

No se pode adicionar uma nova coluna NOT NULL. Deve-se criar como NULL depois preencher completamente e ento alterar para NOT NULL;

Pode-se diminuir o tamanho de uma coluna, desde que esta esteja vazia, ou os dados existentes no excedam o novo limite. Se isto acontecer, o Oracle retorna um erro para os dados que excederam o limite.

No permitido alterar o tipo de dados, a menos que a coluna esteja vazia.

No permitido excluir colunas PRIMARY KEY ou UNIQUE KEY, se estas possurem referncias para outras tabelas (FOREIGN KEY). Para isso, deve-se incluir a clusula

CASCADE CONSTRAINTS, que remove todas as referncias existentes antes de excluir a coluna.

No permitido excluir restries PRIMARY KEY ou UNIQUE KEY, se fizerem parte de uma integridade referencial sem excluir as restries FOREIGN KEY. Deve-se utilizar a clusula CASCADE para isso.

16.5.1. Clusula ADD

Adiciona uma coluna ou restrio (constraint) para a tabela:

ALTER TABLE {nome_tabela}

ADD ({nome_coluna} [Tipo de dados] ([Tamanho]) [Restrio de tabela])

ou

ADD CONSTRAINT {nome_restrio} [Restrio] ({nome_coluna})

Exerccios:

1) Adicionar na tabela CLIENTE os campos e-mail e data de nascimento.

ALTER TABLE CLIENTE ADD EMAIL VARCHAR2(60)

ADD DT_NASCTO DATE

2) Adicionar na tabela CLIENTE o cdigo da cidade, sendo uma chave estrangeira da tabela CIDADE

16.5.2. Clusula MODIFY

Altera definies em uma coluna:

ALTER TABLE {nome_tabela}

MODIFY ({nome_coluna} [Tipo de dados] ([Tamanho]))

Exerccios:

1) Modificar o tamanho do campo nome da tabela CLIENTE para 20.

ALTER TABLE CLIENTE MODIFY (NOME VARCHAR2(30))

2) Modificar o tamanho do campo total da tabela PEDIDOVENDA para 16 com duas casas decimais.

16.5.3. Clusula DROP

Remove colunas ou restries da tabela:

ALTER TABLE {nome_tabela}

DROP COLUMN {nome_coluna} {CASCADE CONSTRAINTS}

ou

DROP CONSTRAINT {nome_constraint} {CASCADE}

Exerccios:

1) Excluir a coluna email da tabela CLIENTE.

ALTER TABLE CLIENTE DROP COLUMN EMAIL

2) Excluir a coluna cdigo da cidade da tabela CLIENTE.

16.6. Comando DROP TABLE

Remove a tabela e todos os dados e ndices existentes nela. Deve-se possuir os privilgios necessrios para isso.

Se a tabela possuir restries de PRIMARY KEY ou UNIQUE KEY, deve-se utilizar a clusula CASCADE CONSTRAINTS para remover as referncias de integridade referencial, caso contrrio o Oracle retorna um erro e no remove a tabela:

DROP TABLE {nome_tabela} {CASCADE CONSTRAINTS}

Exerccios:

1) Excluir a tabela CLIENTE.

DROP TABLE CLIENTE CASCADE CONSTRAINTS

2) Excluir a tabela PEDIDOVENDA.

16.7. Comando TRUNCATE TABLE

Remove todos os dados de uma tabela. Pode ser mais eficiente do que excluir e recriar uma tabela, pois os objetos que dependem desta tabela, como ndices e restries tornam-se invlidos, sendo necessrio recria-los. O comando no executado em tabelas que possuem restries de integridade referencial. Para isso deve-se remover as restries antes de executar o comando.

TRUNCATE TABLE {nome_tabela}

Exemplo:

TRUNCATE TABLE PRODUTO

16.8. Atribuio de Comentrios s Tabelas

O comando COMMENT permite adicionar comentrios a uma tabela e s colunas da tabela, desde que se tenha tambm privilgio necessrio para isso. Os comentrios suportam at 255 caracteres para uma tabela ou coluna.

Para adicionar comentrio a uma tabela:

COMMENT ON TABLE {nome_tabela} IS {comentrio}

Para adicionar comentrio a uma coluna:

COMMENT ON COLUMN {nome_tabela}.{nome_coluna} IS {comentrio}

Para visualizar o comentrio, selecione a coluna COMMENTS dos objetos ALL_COL_COMMENTS ou USER_COL_COMMENTS.

SELECT COMMENTS FROM USER_COL_COMMENTS

WHERE TABLE_NAME = {nome_tabela}

Exemplo:

SQL> COMMENT ON COLUMN PEDIDOCOMPRA.NUM_PEDIDO IS 'CHAVE PRIMRIA';

Comment added

SQL> COMMENT ON COLUMN PEDIDOCOMPRA.COD_FORNECEDOR IS 'CHAVE ESTRANGEIRA';

Comment added

SQL> COMMENT ON COLUMN PEDIDOCOMPRA.COD_FUNCIONARIO IS 'CHAVE ESTRANGEIRA';

Comment added

SQL> SELECT COMMENTS FROM USER_COL_COMMENTS WHERE TABLE_NAME = 'PEDIDOCOMPRA';

COMMENTS

--------------------------------------------------------------------------------

CHAVE PRIMRIA

CHAVE ESTRANGEIRA

CHAVE ESTRANGEIRA

6 rows selected

SQL> SELECT * FROM USER_COL_COMMENTS WHERE TABLE_NAME = 'PEDIDOCOMPRA';

TABLE_NAME COLUMN_NAME COMMENTS

------------------------------ ------------------------------ ----------------------------------------------------------------------PEDIDOCOMPRA DT_PEDIDO

PEDIDOCOMPRA NUM_PEDIDO CHAVE PRIMRIA

PEDIDOCOMPRA DT_ENTREGA

PEDIDOCOMPRA TOTAL

PEDIDOCOMPRA COD_FORNECEDOR CHAVE ESTRANGEIRA

PEDIDOCOMPRA COD_FUNCIONARIO CHAVE ESTRANGEIRA

6 rows selected

17. Views

So representaes virtuais de uma ou mais tabelas ou mesmo outras Views. Uma View tem todas as caractersticas de uma tabela, e pode ser vista como um tabela lgica baseada na tabela original (fsica).

Pode ser utilizada como uma tabela normal na maioria dos casos, pois manipula os dados da mesma forma.

Deve-se possuir privilgios necessrios para criao de Views.

As views podem ser simples, onde os dados so originados de uma nica tabela, ou complexas, onde os dados so originados de vrias tabelas, funes, clculos e grupos de dados.

TABELA:

COLUNA1COLUNA2COLUNA3COLUNA4COLUNA5COLUNA6COLUNA..N

99999999999999

99999999999999

99999999999999

99999999999999

99999999999999

VIEW:

COLUNA3COLUNA6

9999

9999

9999

9999

9999

17.1. Criao e Utilizao

So muito teis, pois diversas representaes diferentes dos dados podem ser exibidas para diferentes tipos de usurios. As views so muito utilizadas para:

Fornecer um nvel maior de segurana das tabelas, restringindo o acesso a determinadas linhas e colunas;

Evitar consultas complexas, como por exemplo, uma consulta que utiliza vrias tabelas com vrios tipos de joins. A view oculta tudo isso, permitindo recuperar os dados de maneira convencional;

Apresentam os dados em diferentes perspectivas da que existe na tabela base. Pode-se renomear colunas sem afetar a tabela original;

Executar queries que no poderiam ser executadas sem o seu uso;

Armazenar queries complexas.

A sintaxe bsica :

CREATE VIEW [OR REPLACE] {nome_view} AS

SELECT COLUNA1, COLUNA2 FROM TABELA

[WITH CHECK OPTION] [WITH READ ONLY]

17.1.1. Clusula OR REPLACE

Utilizada para recriar uma View se ela j existir. Pode ser muito ltil por exemplo, se houver mudanas na definio de uma view, utilizando OR REPLACE no ser necessrio excluir, recriar e reconfigurar os privilgios para a view.

17.1.2. Clusula WITH READ ONLY

Indica que a view no pode ser atualizada

17.1.3. Clusula WITH CHECK OPTION

Se as linhas geradas no existirem na subquery , no permite alteraes na tabela. Ex.:

CREATE VIEW VIEW1 AS

SELECT COLUNA1, COLUNA2 FROM TABELA

WHERE COLUNA2 IN(10,20)

WITH CHECK OPTION

As seguintes queries retornam um erro:

INSERT INTO VIEW1(COLUNA1, COLUNA2) VALUES(1000, 30)

UPDATE VIEW1 SET COLUNA2 = 3017.2. Problemas mais Comuns

Se uma tabela for removida ou tiver suas definies alteradas, e existir uma View pertencente a ela, a View no ser removida, mas se tornar um objeto invlido. A view poder ser utilizada novamente se a tabela for recriada, e possuir os mesmos atributos sobre os quais a view foi criada;

A subquery no pode retornar colunas de SEQUENCES(discutido posteriormente);

Se a view for criada com uma subquery que retorna todas as colunas (*), e for adicionada uma nova coluna para a tabela original mais tarde, a coluna no far parte da view, at que esta seja recriada novamente atravs da clusula CREATE OR REPLACE VIEW.

Exerccios:

1) Criar uma view que selecione os campos cdigo do local e endereo da tabela LOCALARAMAZENAGEM, onde os cdigos da cidade sejam iguais a 1, 3 e 7.

CREATE VIEW LOCALVIEW AS SELECT COD_LOCAL, ENDERECO FROM LOCALARMAZENAGEM WHERE COD_CIDADE IN (1,3,7) WITH CHECK OPTION

2) Criar uma view que selecione os nmeros, as datas e os totais dos pedidos de compra, onde os cdigos do produto sejam iguais a 2, 4 e 6, usando as tabelas PEDIDOCOMPRA e ITEM.

17.3. Comando ALTER VIEW

Como visto no item anterior, uma view se torna invlida se removermos ou alterarmos as definies da tabela original. Este comando tem o objetivo de verificar a validade de uma view e dos objetos que dependem dela, como outras views, por exemplo. Se a tabela for removida, a view se torna invlida. Se a tabela tiver definies alteradas, o ALTER VIEW verifica possveis erros, validando a view e os objetos depententes dela. As definies da view no so alteradas. Definies s podem ser alteradas pelo comando CREATE OR REPLACE VIEW.

A sintaxe bsica :

ALTER VIEW {nome_view} COMPILE

Se o Oracle no retornar erros a View torna-se vlida, caso contrrio permanece invlida.

17.4. Comando DROP VIEW

Remove a view do banco de dados. Pode-se utilizar este comando para excluir uma view invlida e depois recria-la com o CREATE VIEW. Se houver views dependentes da view que se deseja excluir, elas no sero excludas, mas se tornaro invlidas.

A sintaxe bsica :

DROP VIEW {nome_view}

Exerccios:

1) Excluir a view LOCALVIEW, criada no exerccio 1 do item 17.1.

DROP VIEW LOCALVIEW

2) Excluir a view criada no exerccio 2 do item 17.1.

18. Sequences

O gerador de seqncias do Oracle utilizado para fornecer nmeros seqenciais. Muito utilizado em ambientes multi-usurio para gerao de nmeros seqenciais nicos sem sobrecarga de disco e bloqueio de transaes.

Os nmeros seqenciais definidos no Oracle so inteiros de at 38 dgitos. O Oracle armazena as definies de todas as sequences em uma rea especial de sua estrutura, mas as definies permanecem disponveis para todas as reas.

18.1. Criao e Utilizao

Deve-se possuir os privilgios necessrios para criao de sequences. Quanto uma sequence gerada, ela incrementada, independente do tipo de transao. Um usurio nunca ir adquirir um nmero de seqncia gerado por outro. Uma vez que um valor de sequence gerado por um usurio, ele pode continuar acessando aquele nmero indepentente se a sequence incrementada por um outro usurio.

Os nmeros seqenciais so gerados independentemente de tabelas, pois a mesma sequence pode ser utilizada por uma ou mais tabelas.

Pode-se acessar valores de uma sequence atravs de sentenas SQL com a pseudo-coluna CURRVAL, que retorna o valor atual da sequence, ou NEXTVAL, que incrementa a sequence e retorna o novo valor.

A sintaxe bsica :

CREATE SEQUENCE {nome_sequence}

START WITH {valor}

INCREMENT BY {valor}

MAXVALUE 10000

MINVALUE 1

NOCYCLE

18.1.1. Clusula INCREMENT BY

Determina o intervalo entre nmeros de seqncia. Pode ser inteiro positivo ou negativo, mas no 0. Se a clusula no for informada, o valor de incremento default 1.

18.1.2. Clusula START WITH

Determina o primeiro nmero de seqncia a ser gerado. Para sequences ascendentes, o valor default o valor mnimo da seqncia. Para sequences descendentes, o valor default o valor mximo.

18.1.3. Clusula MAXVALUE e MINVALUE

Determina o valor mximo e mnimo respectivamente, que uma sequence pode gerar. MAXVALUE deve ser maior ou igual a START WITH e MINVALUE.

MINVALUE deve ser menor ou igual a START WITH e MAXVALUE.

18.1.4. Clusula NOMAXVALUE e NOMINVALUE

Default. Determina o valor mximo e mnimo para uma sequence suportado pelo Oracle. Para NOMAXVALUE, o valor mximo de 10e27 para ascendente e 1 para descendente. Para NOMINVALUE, o valor mnimo 1 para ascendente e 10e27 para descendente

18.1.5. Clusula CYCLE e NOCYCLE

Determina se a sequence continua ou no a gerar valores depois de atingir o seu valor mximo ou mnimo, respectivamente. Para CYCLE, inicia com valor mnimo quando atingir o valor mximo, e com valor mximo quando atingir o valor mnimo. Para NOCYCLE, que o Default, a sequence no pode gerar mais valores quando atingir o limite.

Obs.: Se uma sequence atingir o limite, a sentena SQL falha ao tentar retornar valores.

Exerccios:

1) Criar uma sequence para gerao dos nmeros de pedidos da tabela PEDIDOCOMPRA.

CREATE SEQUENCE SEQ_PEDIDO

START WITH 1

INCREMENT BY 1

2) Criar uma sequence para gerao dos cdigos da cidade da tabela CIDADE.

19. ndices

So estruturas opcionais associadas com as tabelas, que aumentam a performance de acesso a elas atravs de sentenas SQL. Os ndices no Oracle fornecem um caminho muito mais veloz para o acesso aos dados de uma tabela. Nenhuma alterao em sentenas SQL necessria pois afetam somente a velocidade de execuo. Quando utilizados corretamente so um dos itens mais importantes para reduzir operaes de acesso fsico ao disco (I/O).

19.1. Criao e utilizao

Pode-se criar muitos ndices para uma tabela bem como uma combinao de diferentes colunas para cada ndice. Pode-se criar mais do que um ndice utilizando a mesma coluna se for especificado diferentes combinaes distintas das colunas.

Os ndices so independentes dos dados de uma tabela, ou seja, podem ser criados ou removidos a qualquer momento sem afetar as tabelas ou outros ndices. Se um ndice for removido, por exemplo, tudo continua funcionando normalmente, entretanto, o acesso aos dados anteriormente indexados pode se tornar mais lento. Por serem independentes, requerem espao para armazenamento.

O Oracle gerencia os ndices automaticamente, ou seja, em aes como insero, atualizao e excluso de linhas permanecem transparentes para o usurio, no sendo necessria sua interveno na manuteno dos ndices. A performance de recuperao de dados indexados permanece quase constante, mesmo com operaes de insero de novas linhas.

Obs.: A performance de inseres, atualizaes e excluses podem ser comprometidas se existirem muitos ndices em uma tabela.

A sintaxe bsica :

CREATE {opes} INDEX {nome_ndice} ON

{nome_tabela} ([COLUNA1], [COLUNA2],...[COLUNAn])

19.1.1. ndices UNIQUE e NONUNIQUE

UNIQUE garantem que valores em uma coluna chave no sejam duplicados, nem nulos. NONUNIQUE no impem restries para valores de colunas.

Recomenda-se que ndices UNIQUE sejam criados explicitamente, e no atravs de constraints UNIQUE em uma tabela. Ex.:

CREATE UNIQUE INDEX ON TABELA (COLUNA1)

19.1.2. ndices COMPOSITE

Tambm chamado de ndice concatenado, so ndices criados em vrias colunas em uma tabela. As colunas neste tipo de ndice podem aparecer em qualquer ordem e no necessrio estar adjacentes na tabela. ndices COMPOSITE podem aumentar a velocidade de sentenas SELECT quando a clusula WHERE faz referncia a todas ou uma parte das colunas do ndice concatenado. Entretanto, a ordem utilizada na definio importante, pois geralmente as colunas mais comumente acessadas vm primeiro.

CREATE INDEX ON TABELA (COLUNA1, COLUNA2)

Exerccios:

1) Criar um ndice na tabela FUNCIONARIO para o campo cdigo do departamento.

CREATE INDEX IND_FUNC ON FUNCIONARIO (COD_DEPARTAMENTO)

2) Criar um ndice concatenado na tabela PRODUTO para os campos descrio e preo.

3) Criar um ndice concatenado na tabela PEDIDOCOMPRA para os campos data e total do pedido.

19.2. Comando DROP INDEX

Remove ndices do banco de dados. O Oracle invalida todos os objetos dependentes da tabela sobre a qual o ndice pertence. A sintaxe bsica :

DROP INDEX {nome_ndice}

Exerccios:

1) Excluir o ndice criado no exerccio 1 do item 19.1 na tabela FUNCIONARIO.

DROP INDEX IND_FUNC

2) Excluir o ndice criado no exerccio 3 do item 19.1 na tabela

19.3. Comando ALTER INDEX

Utilizado para modificar ou reconstruir um ndice existente. A sintaxe bsica :

ALTER INDEX {nome_ndice} {opes}

19.3.1. Clusula DEALLOCATE UNUSED

Elimina espaos no utilizados no fim do ndice. Ex.:

ALTER INDEX INDICE1 DEALLOCATE UNUSED

19.3.2. Clusula SHRINK

Compacta segmentos do ndice. Ex.:

ALTER INDEX INDICE1 SHRINK

19.3.3. Clusula REBUILD

Recria um ndice existente. Ex:

ALTER INDEX INDICE1 REBUILD

Exemplo:

ALTER INDEX IND_PRD REBUILD

19.4. Gerao automtica de ndices para chaves primrias

Para as constraints de integridade UNIQUE KEY e PRIMARY KEY, o Oracle cria um ndice nico na chave primria, assim que a constraint ativada. No necessrio, por exemplo, nenhum tipo de sintaxe diferente para criao de ndices em sentenas CREATE TABLE ou ALTER TABLE. Ex.:

CREATE TABLE TABELA1

(COLUNA1 NUMBER(2) PRIMARY KEY, COLUNA2 VARCHAR2(20))

20. Sinnimos

So uma espcie de Alias (apelido) para tabelas e outros objetos.

Os sinnimos so muito utilizados principalmente por questes de segurana e convenincia:

Facilitam o acesso a uma tabela, eliminando a utilizao do proprietrio. (Ver exemplo);

Simplificam sentenas SQL para usurios do banco de dados;

Ocultam a identidade de uma tabela;

20.1. Criao e utilizao

Sinnimos podem ser PUBLIC ou PRIVATE.

Sinnimos PUBLIC so criados somente pelo DBA, e podem ser acessados por todos os usurios. No se pode criar outros objetos no banco de dados com o mesmo nome dos sinnimos.

Sinnimos PRIVATE so criados por um usurio qualquer, que e ser vlido somente para este.

Uma das vantagens de um sinnimo que se, por exemplo, for necessrio renomear ou mover uma tabela, somente o sinnimo precisar ser redefinido. Aplicaes baseadas em sinnimos continuam a funcionar sem modificaes. A sintaxe bsica :

CREATE {opes} SYNONYM {nome_qualquer} FOR {usurio}.{nome_tabela}

Ex.: Assumindo-se que TABELA_DE_DADOS pertence ao usurio USER1:

CREATE PUBLIC SYNONYM TABELA1 FOR USER1.TABELA_DE_DADOS

Agora podemos utilizar uma query mais simplificada para acessar os dados:

SELECT * FROM TABELA1

Exerccios:

1) Criar um sinnimo para a tabela FUNCIONARIO pertencente ao usurio TREINAMENTO.

SQL> CREATE PUBLIC SYNONYM FUNCIONARIO FOR TREINAMENTO.FUNCIONARIO;

Synonym created

SQL> CONNECT TESTE/SENHA@BANCO

Connected to Oracle9i Enterprise Edition Release 9.2.0.1.0

Connected as TESTE

SQL> SELECT COD_FUNCIONARIO, NOME FROM FUNCIONARIO;

SELECT COD_FUNCIONARIO, NOME FROM FUNCIONARIO

ORA-00942: table or view does not exist

SQL> CONNECT TREINAMENTO/SENHA@BANCO

Connected to Oracle9i Enterprise Edition Release 9.2.0.1.0

Connected as TREINAMENTO

SQL> GRANT SELECT ON FUNCIONARIO TO TESTE;

Grant succeeded

SQL> CONNECT TESTE/SENHA@BANCO

Connected to Oracle9i Enterprise Edition Release 9.2.0.1.0

Connected as TESTE

SQL> SELECT COD_FUNCIONARIO, NOME FROM FUNCIONARIO;

COD_FUNCIONARIO NOME

------------------------- ----------------------------------------

1 JOSE MANOEL DA SILVA

3 PEDRO DA SILVA

4 MANOEL TAVARES

5 JOAO DOS SANTOS

6 BENEDITO CRISPIM

7 JOSE MARIA

2 JOAQUIM PASCOAL

8 JOAO PEDRO

9 PEDRO ANTONIO

10 ANTONIO MOURA

11 PASCOAL TAVARES

11 rows selected

2) Criar um sinnimo para a tabela CIDADE pertencente ao usurio TREINAMENTO

20.2. Comando DROP SYNONYM

Remove o sinnimo do banco de dados. Para remover sinnimos pblicos deve-se especificar a opo PUBLIC. Deve-se possuir direitos necessrios para remover estes sinnimos.

A sintaxe bsica :

DROP {opes} SYNONYM {nome_sinnimo}

No se pode remover sinnimos com tabelas relacionadas a ele. Para isso, deve-se especificar a clusula FORCE. Ex.: Assumindo-se que TABELA1 um sinnimo.

DROP PUBLIC SYNONYM TABELA1 FORCE

Exerccios:

1) Excluir o sinnimo criado para a tabela FUNCIONARIO no exerccio 1 do item 20.1.

DROP PUBLIC SYNONYM FUNCIONARIO FORCE

2) Excluir o sinnimo criado para a tabela FUNCIONARIO no exerccio 2 do item 20.1.

20.3. Sinnimos para Procedures

Se um sinnimo para procedures for criado em um banco de dados remoto, deve-se especificar o usurio pertencente quele banco de dados na sentena CREATE. Pode-se tambm criar um sinnimo pblico local no banco de dados remoto, entretanto, DATABASE LINK (discutido posteriormente) deve ser includo em todas as chamadas procedure.

21. Database Links

So ponteiros que definem uma rota nica de comunicao de um servidor de banco de dados Oracle com outros servidores de banco de dados, que podem ser inclusive de outros fabricantes.

Por se tratar de rota nica, no possvel o acesso inverso, ou seja, do banco de dados remoto para o banco de dados local, a menos que haja um DATABASE LINK para o servidor remoto, permanecendo assim o mesmo conceito original de DATABASE LINKS, porm sob uma tica inversa. Ex.:

A seguir uma tabela com os tipos de link:

Tipo de LinkDescrio

Usurio ConectadoO usurio deve possuir uma conta no banco de dados remoto com o mesmo nome e senha do banco de dados local

Usurio FixoO usurio se conecta utilizando um usurio e senha fixos referenciados pelo link

Usurio AtualO usurio local se conecta como um usurio global no contexto de uma procedure, por exemplo, sem armazenar a senha do usurio global em uma definio de link

21.1. Criao e utilizao

Um DATABASE LINK permite que usurios locais acessem dados em banco de dados remotos. Para acessa-lo, o usurio deve estar conectado ao banco de dados local que contm a informao para o link.

DATABASE LINKS podem ser pblicos, onde todos os usurios possuem acesso, ou privados onde somente o usurio que criou o link possui o acesso.

A sintaxe bsica :

CREATE {opes} DATABASE LINK {nome_link}

CONNECT TO {usuario}

IDENTIFIED BY {senha}

USING {banco_de_dados_remoto}

Ex.: Assumindo um banco de dados remoto de nome BANCO1 com uma tabela TABELA1:

CREATE PUBLIC DATABASE LINK BANCO_TESTE

CONNECT TO USER1

IDENTIFIED BY SENHA1

USING BANCO1

Para acessarmos uma tabela, com uma query, temos:

SELECT * FROM TABELA1@BANCO_TESTE

Exemplo:

Acessar os dados da tabela FUNCIONARIO em outro servidor ORACLE.

SQL> SELECT * FROM FUNCIONARIO;

SELECT * FROM FUNCIONARIO

ORA-00942: table or view does not exist

SQL> CREATE DATABASE LINK BANCOTREINAMENTO

2 CONNECT TO TREINAMENTO

3 IDENTIFIED BY TREINAMENTO

4 USING 'BANCO2';

Database link created

SQL>SELECT * FROM FUNCIONARIO@BANCOTREINAMENTO;

CODIGO NOME CARGO SALARIO

------ ---------------------------------------- -------------------- ------------

1 Andre de Souza Gerente 1000,00

1 Pedro Antunes Aux. Escritrio 240,00

21.2. Viso Geral sobre Banco de Dados Distribudos

Sistemas de banco de dados distribudos permitem acessar dados de servidores locais e remotos, utilizando uma arquitetura cliente/servidor para o processamento de informaes. Estes sistemas podem ser de 2 tipos: homogneos e heterogneos.

21.2.1. Sistemas homogneos

Sistemas de dois ou mais bancos de dados Oracle que residem em um ou mais servidores. Uma aplicao pode acessar dados simultaneamente em vrios bancos de dados em um nico ambiente distribudo, ou seja, informaes de uma tabela em um banco de dados podem ser unidas com informaes de outro banco de dados em outro local produzindo um resultado nico e coerente.

21.2.2. Sistemas heterogneos

Pelo menos um dos bancos de dados no Oracle. Para a aplicao, estes sistemas so vistos como um banco de dados Oracle local nico. O servidor de banco de dados Oracle oculta a distribuio e heterogeneidade dos dados, e utiliza ferramentas especiais para acesso a sistemas de bancos de dados diferentes.

22. Privilgios

So utilizados para controlar o acesso de usurios aos dados em sentenas SQL.

Os privilgios e regras so atribudos por usurios que foram atribudos por outros usurios e assim sucessivamente. A atribuio de regras e privlgios inicia-se no nvel de Administrador. Na criao do banco de dados, o usurio administrativo SYS criado e todos os privilgios e regras predefinidos no Oracle so atribudos a ele. O usurio SYS pode ento atribuir privilgios e regras para outros usurios, alm de atribuir direitos para usurios especficos poderem atribuir privilgios e regras para os demais usurios.

22.1. Tipos de privilgios

22.1.1. System privilege

Permitem que os usurios realizem operaes especficas de banco de dados. Geralmente so atribudos somente por administradores.

22.1.2. Object privilege

Controlam o acesso a um objeto especfico, como tabelas, views, etc.

22.1.3. Roles

Uma coleo de privilgios e outras regras que juntas facilitam a atribuio de vrios privilgios e regras para os usurios.

22.2. Comando GRANT

Utiliza-se o comando GRANT atribuir:

Privilgios de sistema para usurios e regras;

Regras para usurios e regras. Privilgios e regras podem ser do tipo local, global ou externo;

Privilgios para manipulao de objetos particulares de usurios e operaes que eles executam. Ex.: Privilgios para criar tabelas, e privilgios para inserir dados em tabelas;

Para executar o comando GRANT tambm deve-se possuir privilgios necessrios.

A sintaxe bsica :

Para usurios ou regras:

GRANT {privilegio ou regra} TO {usurio ou regra} [PUBLIC]

Para objetos:

GRANT {privilegio} ON {objeto} TO {usurio} [PUBLIC]

Exerccios:

1) Criar um privilgio para o usurio TESTE, liberando o acesso de consulta a tabela PRODUTO pertencente ao usurio TREINAMENTO.

SQL> CONNECT TREINAMENTOSENHA@BANCO

Connected to Oracle9i Enterprise Edition Release 9.2.0.1.0

Connected as TREINAMENTO

SQL> GRANT SELECT ON PRODUTO TO TESTE;

Grant succeeded

SQL> CONNECT TESTE/SENHA@BANCO

Connected to Oracle9i Enterprise Edition Release 9.2.0.1.0

Connected as TESTE

SQL> SELECT COD_PROD, DESCRICAO FROM TREINAMENTO.PRODUTO;

COD_PROD DESCRICAO

--------------- ----------------------------------------

1CANETA ESFEROGRAFICA

2ARTEFATO DE METAL

3ARTEFATO DE MADEIRA

4OBJETO DE PLASTICO

5CINZEIRO

6FOLHAS A4

7CARTUCHO HP

7 rows selected

2) Criar um privilgio para o usurio TESTE, liberando o acesso de consulta a tabela FORNECEDOR pertencente ao usurio TREINAMENTO.

22.3. Comando REVOKE

Utilizado para retirar os privilgios e regras atribudos. Deve-se possuir os privilgios necessrios para utilizao do comando.

O comando s retira os privilgios e regras que foram previamente atribudos com o comando REVOKE. Regras ou privilgios de objeto atribudos pelo sistema operacional, e privilgios ou regras atribudos para retirar regras no podem ser utilizados com REVOKE.

Para usurios ou regras:

REVOKE {privilgio ou regra} FROM {usurio ou regra}

Para objetos:

REVOKE {privilgio ou regra} on {objeto} FROM {usurio ou regra}

Exerccios:

1) Retirar o privilgio do usurio TESTE de consulta da tabela PRODUTO pertencente ao usurio TREINAMENTO.

SQL> REVOKE SELECT ON PRODUTO FROM TESTE;

Revoke succeeded

2) Retirar o privilgio do usurio TESTE de consulta da tabela FORNECEDOR pertencente ao usurio TREINAMENTO.

22.4. Opes WITH GRANT e WITH ADMIN

Estas opes fazem parte do comando GRANT.

A clusula WITH ADMIN permite:

Atribuir regras para outro usurio ou regra, a menos que a regra seja global;

Retirar de um outro usurio ou regra;

Alterar regras para mudar as configuraes de acesso;

Remover as regras;

Se a opo WITH ADMIN for omitida na atribuio de um privilgio de sistema ou regra para um usurio, mas for atribudo mais tarde, o usurio ter a ADMIN OPTION no privilgio ou regra.

Para retirar esta opo, deve-se retirar completamente os privilgios ou regras e ento atribuir o privilgio ou regra para o usurio sem esta opo.

A opo WITH GRANT permite que se atribua privilgios de objeto para outros usurios e regras.

22.5. Opo PUBLIC

Permite atribuir privilgios para todos os usurios.

22.6. Privilgios e segurana

22.6.1. A importncia de uma poltica de segurana

muito importante desenvolver polticas de segurana para todo banco de dados. Polticas de segurana estabelecem mtodos para proteo de seu banco de dados contra destruio de dados acidental ou maliciosa ou danos na infra-estrutura do banco de dados.

Cada banco de dados deve ter um administrador, que responsvel por implementar e dar manuteno na poltica de segurana do banco de dados.

22.6.2. Gerenciamento de usurios e recursos

Para se conectar a um banco de dados, cada usurio deve possuir uma conta com informaes sobre o mesmo, como:

Nome do usurio;

Mtodos de autenticao;

Espao em disco necessrio;

Perfis de usurio;

23. Operadores de Conjunto

Combinam o resultado dos componentes de duas queries em um nico resultado. Queries que contm operadores de conjunto so chamadas de queries compostas.

23.1. Concatenando Resultados de Queries

Pode-se combinas mltiplas queries utilizando os operadores de conjunto UNION, UNION ALL, INTERSECT e MINUS. Se uma sentena SQL contm vrios operadores, o Oracle analisa-os da esquerda para a direita a menos que outra ordem seja especificada atravs de parnteses.

O nmero de expresses correspondentes em uma query composta deve ser igual. Tambm devem estar na mesma ordem e possuir o mesmo tipo de dados.

23.2. Operadores UNION, MINUS e INTERSECT

23.2.1. UNION

Elimina linhas duplicadas. UNION ALL retorna todas as linhas, mesmo duplicadas. Ex.:

SELECT COLUNA1, COLUNA2 FROM TABELA1

UNION

SELECT OUTRA1, OUTRA2 FROM TABELA2

23.2.2. MINUS

Retorna somente as linhas presentes na primeira query desde que no existam na segunda.

23.2.3. INTERSECT

Retorna somente as linhas comuns nas duas queries. Recomenda-se utilizar parnteses em queries que utilizam outros tipos de operadores.

Exemplos:

1) Combinar os resultados das queries que selecionam os campos cdigo do produto, descrio e preo das tabelas PRODUTO e PRODUTO_OFERTA, eliminando as linhas duplicadas.

SQL> SELECT COD_PROD, DESCRICAO, PRECO FROM PRODUTO;

COD_PROD DESCRICAO PRECO

-------------- -----------------------