Vous êtes sur la page 1sur 67

Por

Edson Almeida Junior

Consulting Tecnologia & Sistemas Ltda


www.consulting.com.br

Março - 2006

Ultima Atualização 11/04/2006

Consulting Tecnologia & Sistemas Ltda


www.consulting.com.br
2

Objetivo

Este treinamento destina-se a treinando que querem conhecer a filosofia de banco de dados
relacionais, e também a linguagem padrão do Oracle que é a SQL, seus comando principais.

O Objetivo, ao término do curso, é de que os treinandos estejam aptos a começar o trabalho com
o Oracle e suas ferramentas, quer no desenvolvimento de aplicações ou na administração do
Oracle.

Modelo Conceitual

Conceitos

Conjuntos – Conjuntos existem para permitir armazenar informações uma única vez. Os fatos
serão dissociados e relacionados preservando o seu conteúdo.
Ex.: Conjunto de alunos de uma turma, conjunto de pessoas de uma cidade.

Modelo ERA – O Modelo ERA, ou Modelo de Entidades, Relacionamentos e Atributos, qualifica


um item de informação como Entidade, Relacionamento ou Atributo.

Entidade – É um objeto (ou “ente”) em que se tem interesse específico em acompanhar/monitorar


sua existência/vida no sistema e/ou que existe de forma independente de outras informações, e/ou
que se repete muito e possui grau de entidade e/ou que pertence a um conjunto finito e possui
grau de entidade (estabilidade).

Entidade Fraca – São entidades que não tem vida própria. Sua existência dependerá da
existência de uma entidade principal. Exemplo.: Funcionário e Dependente estão unidos por
dependência, ou seja, todo Dependente deve estar associado a um e somente um funcionário.

Entidade-Tipo – É a coleção, ou conjunto, de todas as Entidades que têm a mesma natureza, as


mesmas propriedades, e que possuem atributos do mesmo tipo.
Exemplo:
7670/Rômulo e 7798/Manoel são alunos de um mesmo curso, então, são Entidades da Entidade-
tipo Aluno que o curso possui no seu modelo ERA. Matemática, Português e Física são
Entidades da Entidade-tipo Disciplina.

Relacionamento – É um fato que une duas ou mais entidades.

Relacionamento-tipo – É a coleção, ou conjunto, de todos os relacionamentos que têm a mesma


natureza, as mesmas propriedades, que possuem atributos do mesmo tipo e que unem Entidades
das mesmas Entidades-tipo pelo mesmo fato.
Exemplo:
Todas as informações sobre as Disciplinas que os Alunos cursaram são do tipo Histórico; e sobre
as que estão cursando são do tipo Matrícula (disciplinas em que os alunos estão matriculados).

Consulting Tecnologia & Sistemas Ltda


www.consulting.com.br
3

Atributo – É uma propriedade da Entidade-tipo ou do Relacionamento-tipo. É análogo ao campo


de um registro. Sua posição dentro do modelo é determinada de acordo com a dependência que
existe na sua variação de conteúdo (Dependência funcional).
Exemplo:
7670/Rômulo e 7798/Manoel são entidades da Entidade-tipo Aluno, logo, a Entidade-tipo Aluno
estará representada pelos atributos matrícula e nome. Um atributo pode ser: simples, composto,
multivalorado, global, identificador.

Atributo Simples – É o atributo que guarda em si um único valor indivisível.


Ex.: nome, preço, marca.

Atributo composto – É o atributo resultado da soma de outros atributos. É constituído de sub-


atributos.
Ex.: endereço = rua + número + bairro + cep; data = dia + mês + ano

Atributo Multivalorado – É o atributo que guarda em si repetidos valores. Pode assumir mais de
um valor para cada ocorrência.
Ex.: telefone, formação.

Atributo identificador – É (são) o(s) atributo(s) que diferencia(m) uma ocorrência das demais
dentro de um conjunto. Se nenhum dos atributos naturais serve como Identificador da
ocorrência, um atributo identificador suplementar deve ser acrescentado.
Ex.: código, matrícula.
Existe uma analogia entre o atributo identificador de uma Entidade-tipo e a chave-primária do
arquivo que esta Entidade-tipo vai gerar. O mesmo Não acontece com Relacionamento-tipo. Um
atributo identificador nunca poderá estar vazio.

Banco de Dados Relacional

Um banco de dados relacional pode ser definido como um banco de dados que aparece ao usuário
como uma coleção de tabelas. A característica mais fundamental num banco de dados relacional
é a de que temos que identificar univocamente seus registros (que chamamos de linhas), ou seja,
devemos definir um campo (ou mais de um) dentre os vários campos do registro, para ser o
atributo identificador do mesmo (chave primária).
O Oracle é um SGBD Relacional - Sistema de Gerenciamento de Banco de Dados Relacional
(RDBMS - Relational Database Management System) e foi um dos primeiros sistemas de banco
de dados a utilizar a Linguagem de Pesquisa Estruturada (SQL - Structured Query Language)
como interface do usuário sendo, talvez, por este motivo, agora um dos principais sistemas de
gerenciamento de banco de dados.

Conceitos
No estudo de banco de dados convém sabermos algumas definições importantes:
Tabelas - São as unidades básicas de um SGBD Relacional. É formada por linhas e colunas,
onde as linhas representam os registros e as colunas os campos da tabela. São muito conhecidas
como Tabelas-Base.

Exemplo:

Tabela T_Funcionario

Cod_Funcionario - CHAR(06)
Cod_Departamento - CHAR(05)
Nome_Funcionario - VARCHAR2(40)

Consulting Tecnologia & Sistemas Ltda


www.consulting.com.br
4

Data_Nascimento -- DATE

Colunas - Um nome de coluna é o nome que o usuário informará para representar os valores de
dados que serão entrados sob cada coluna.

Linhas - São os registros da tabela.


Valores de dados - São os valores encontrados na interseção de uma coluna e uma linha.
Chave primária - Uma ou mais de uma coluna que identifica uma linha, facilitando em muito o
acesso aos dados.
Visão ou Tabela Virtual(View) - É uma tabela formada por uma pesquisa em uma ou mais
tabela-base. Ela não existe, mas parece ao usuário como se existisse.

Toda tabela num banco de dados relacional tem que possuir uma Chave Primária. As tabelas
poderão também ter chaves estrangeiras, que são campos que relacionam as tabelas do banco de
dados, fazendo referência entre uma e outra tabela.

SQL - Linguagem de Pesquisa Estruturada

A SQL - Linguagem de Pesquisa Estruturada (Structured Query Language) devido as suas


características tornou-se a linguagem padrão de sistemas gerenciadores de banco de dados
relacionais.
É a linguagem de comunicação de todas as ferramentas e/ou aplicações Oracle com o Oracle
Server.
SQL*Plus é a ferramenta Oracle (interface) que executa os comandos SQL.
Podemos com a SQL*Plus:
-Pesquisar, adicionar, remover, modificar os dados do BD;
-Criar, modificar, remover as estruturas de dados;
-Controlar o acesso aos dados.

Definição

SQL - onde a pronuncia é "ess-kiú-éll" ou "sequel" que é como a maioria das pessoas pronunciam
- "Structured Query Language" (linguagem estruturada de pesquisa) , é composta por um grupo
de facilidades para definição, manipulaçao e controle de dados em um banco de dados relacional.

Como começou essa história de Banco de Dados Relacional e SQL?

Em 1970 , E.F.Codd, nessa ocasião membro do Laboratório de pesquisa da IBM em San Jose,
Califórnia, publicou um trabalho agora clássico, "A Relational Model of Data for Large Shared
Data Banks" - um modelo relacional de dados para grandes bancos de dados compartilhados -
(Communications of the ACM, Vol.13, No. 6, junho de 1970), em que se estabeleceu um grupo
de princípios abstratos sobre gerência de banco de dados: o assim chamado modelo relacional.

Todo o campo da tecnologia de banco de dados relacional tem suas origens nesses trabalho. As
idéias de Codd incentivaram experiências e pesquisas em universidades, laboratóriosde pesquisa
industrial e estabelecimentos semelhantes, que resultaram em diversos produtos relacionais agora
disponíveis no mercado.

Um aspecto em particular da referida pesquisa era o projeto de implementação de protótipo de


uma série de linguagens relacionais. Uma linguagem relacional é uma linguagem que efetua , em
alguma forma sintática ou concreta, alguma ou todas as características do modelo relacional

Consulting Tecnologia & Sistemas Ltda


www.consulting.com.br
5

abastrato. Diversas dessas linguagens foram criadas no início e no meio dos anos 70. Uma
dessas linguagens em particular foi a chamada SEQUEL ("Structured English Query Language"
- Linguagem de Pesquisa em inglês estruturado), definida por D.D. Chamberlin e outros (1974)
no laboratório de Pesquisas da IBM em San Jose, Califórnia, e inicialmente implementada em um
protótipo da IBM chamado SEQUEL-SRM (1974-75).

Em parte como resultado da experiência com o SEQUEL-XRM, foi definida em 1976-77 uma
versão revisada do SEQUEL, chamada SEQUEL/2. (O nome foi subsequentemente alterado para
SQL por razões legais). Começou o trabalho em outro protótipo mais ambicioso da IBM,
chamado System R. O System R., uma implementação de um grande subconjunto da linguagem
SEQUEL/2 (ou SQL) , tornou-se operacional em 1977 e foi subsequentemente instalado em uma
série de estabelecimentos, usuários, tanto internos à IBM quanto (sob um grupo de acordos
comerciais de estudo) clientes selecionados da IBM.

* Uma série de mudanças posteriores foram feitas à linguagem SQL durante a vida útil de projeto
do System R, em parte como resposta a sugestões de ususários. Por exemplo, foi incluída uma
função EXISTS para testar se um dado especificado existia no banco de Dados. Vamos a um
exemplo prático:

SELECT DEPTNO, DNAME


FROM DEPT D
WHERE EXISTS (SELECT 'X' FROM EMP E
WHERE E.DEPTNO = D.DEPTNO);

* Existe outra forma de fazer este query. Porém esta é a forma mais rápida de acesso ao Banco

Em grande parte, graças ao sucesso do System R, tornou-se aparente ao final dos anos 70 que a
IBM provavelmente desenvolveria um ou mais produtos baseados na tecnologia do System R -
especificamente, produtos que implementassem a linguagem SQL. Como resultado, outros
vendedores também começaram a construir seus próprios produtos baseados no SQL. De fato,
pelo menos um desses produtos, a saber o ORACLE, da Relational Software Inc. (que passou a
se chamar Oracle Corporation), foi introduzido no mercado antes dos próprios produtos da IBM.
Depois, em 1981, a IBM anunciou um produto SQL, chamado SQL/DS para o ambiente
DOS/VSE. A seguir a IBM anunciou uma poutra versão do SQL/DS para o ambiente VM/CMS
(1982), e outra para MVS chamada DB2, altamente compatível com o SQL/DS (1983).

Nos anos seguintes , diversos outros vendedores também anunciaram produtos baseados no SQL.
Esses produtos incluíam tanto produtos inteiramente novoscomo o DG/SQL (Data General
Corporation, 1984) e SYBASE (Sybase Inc., 1986), quanto interfaces do SQL para produtos
estabelecidos como o INGRES (Relational Technology INc. , 1981, 1985) e o IDM (Britton-Lee
Inc., 1982). Há atualmente muitos produtos no mercado que dão suporte a algum dialetodo SQL,
rodando em máquinas que cobrem toda a faixa desde microcomputadores até de grande porte. O
SQL se tornou o padrão no mundo do banco de dados relacional.

Padrão ANSI

O SQL também se tornou o padrão oficial. Em 1982, o American National Standards Institute
(ANSI) encarregou seu Comitê de Banco de Dados (chamado X3H2) de desenvolver uma
proposta para uma linguagem relacional padrão.

Funcionalidade

Consulting Tecnologia & Sistemas Ltda


www.consulting.com.br
6

A função da linguagem SQL é dar suporte a definição , manipulação e controle dos dados em um
banco de dados relacional. Um banco de dados relacional é simplesmente um banco de dados que
é percebido pelo usuário como um grupo de tabelas onde tabela é uma coleção de linhas e
colunas.

A Linguagem SQL pode ser usada através de dois modos:

SQL Interativa
Onde os comandos SQL são digitados interativamente, ou seja, logo após a digitação do comando
vemos sua execução.

SQL Embutida
Neste modo os comandos SQL ficam embutidos no programa-fonte de uma linguagem de
programação. Tal linguagem é normalmente chamada linguagem hospedeira. Linguagens de
programação como COBOL, C, PASCAL, PL/1, etc, admitem a SQL Embutida.

A SQL divide-se em três grupos:


- Linguagem de Definição de Dados (DDL)
- Linguagem de Controle de Dados (DCL)
- Linguagem de Manipulação de Dados (DML)

Linguagem de Definição de Dados (DDL)

Tem como objetivo definir, alterar e eliminar as tabelas usadas para armazenar os dados.
CREATE, ALTER, DROP, RENAME, são comandos de definição de dados, dentre outros.

Em SQL as tabelas possuem a função de armazenar os dados do Banco de Dados. O comando


para criação de tabelas no SQL é o CREATE TABLE.

Sintaxe (Básica):

CREATE TABLE nome_da_tabela_base (nome_de_coluna tipo_de_dado (tamanho) [NOT


NULL [UNIQUE] ], ... )
CONSTRAINT nome_da_constraint PRIMARY KEY (nome_de_coluna)
TABLESPACE nome_tablespace;

Onde:

nome_da_tabela_base – É o nome que identifica a tabela.

nome_de_coluna – É o nome identificador da coluna.

Tipo_de_dado(tamanho) – É o tipo de dado da coluna. Os tipos básicos são: CHAR,


VARCHAR2, NUMBER, DATE.

NOT NULL – Pode ser especificado em qualquer coluna da tabela. Faz com que a coluna não
admita nulos, isto é, qualquer tentativa de se introduzir um nulo em tal coluna será rejeitada.

Consulting Tecnologia & Sistemas Ltda


www.consulting.com.br
7

UNIQUE – Pode ser especificado para qualquer coluna ou combinação de coluna da tabela.
Cada uma dessas colunas, ou cada coluna em uma combinação de colunas, também deve Ter a
especificação de NOT NULL. Qualquer tentativa de se introduzir uma linha na tabela, contendo
um valor igual à mesma coluna em alguma outra linha, será rejeitada. Se UNIQUE não for
especificado para uma dada coluna (ou combinação), então essa coluna (ou combinação) pode
conter valores duplicados.

Nome_da_constraint – É o nome da chave primária, atributo identificador da tabela.

nome_tablespace – É o nome do tablespace (Objeto lógico) que armazena os arquivos físicos do


Oracle (datafiles).

Os comandos CREATE TABLE para as tabelas seriam:

a)Para a tabela ALUNO

CREATE TABLE T_Aluno


(MATRICULA VARCHAR2(06) NOT NULL,
NOME_ALUNO VARCHAR2(40) NOT NULL)
CONSTRAINT pk_aluno PRIMARY KEY(MATRICULA),
TABLESPACE st_01;

a)Para a tabela DISCIPLINA

CREATE TABLE T_Disciplina


(COD_DISCIPLINA VARCHAR2(04) NOT NULL,
NOME_DISCIPLINA VARCHAR2(30) NOT NULL)
CONSTRAINT pk_disciplina PRIMARY KEY(COD_DISCIPLINA),
TABLESPACE st_01;

C) Para a tabela CURSA

CREATE TABLE T_Cursa


(MATRICULA VARCHAR2(06) NOT NULL,
COD_DISCIPLINA VARCHAR2(04) NOT NULL,
NOTA1 NUMBER(3,1),
NOTA2 NUMBER(3,1),
NOTA3 NUMBER(3,1))
CONSTRAINT pk_cursa PRIMARY KEY(MATRICULA,COD_DISCIPLINA)
TABLESPACE st_01;

Obs.: O comando CREATE TABLE apenas cria a tabela, ou seja, apenas cria a estrutura da
tabela. Elas precisam, num segundo passo, serem povoadas.

Linguagem de Controle de Dados (DCL)

A DCL (Data Control Language) contém elementos que serão úteis num sistema multiusuário,
onde a privacidade das informações é importante, a segurança das tabelas, bem como o controle
dos privilégios dos usuários do BD. Os comandos Grant, Revoke, Audit, No Audit, Lock são
comandos da DCL.

Consulting Tecnologia & Sistemas Ltda


www.consulting.com.br
8

Exemplos:

1)GRANT SELECT, INSERT ON T_DEPARTAMENTO


TO JOAO;

Dá os privilégios de Select e Insert para o usuário João, na tabela T_Departamento.

1)REVOKE INSERT ON T_DEPARTAMENTO


TO JOAO;

Retira o privilégio de inserção de dados (Insert) do usuário João, na tabela T_Departamento.

Linguagem de Manipulação de Dados (DML)

Esta linguagem contém os componentes da linguagem e conceitos para a manipulação das


informações armazenadas em tabelas. Os comandos SELECT, UPDATE, DELETE, INSERT,
COMMIT, ROLLBACK, dentre outros, são comandos de manipulação de dados.

Exemplos:
INSERT INTO T_ALUNO
VALUES (‘001’,’Joao da Silva’);

Inserirá o registro de João da Silva na tabela T_Aluno.

UPDATE T_SALARIO
SET VAL_SALARIO_MINIMO = VAL_SALARIO_MINIMO * 1.2;

Atualizará o salário mínimo, da tabela salário, em 20%.

Iniciando uma Sessão SQL*Plus

Executar o SQL*Plus e “logar-se”.

C:\>SQLPLUS<Enter>

Enter user name: manoel


Enter password: *******

O “prompt” do SQL*Plus será exibido.

SQL>

Para sair (terminar uma sessão SQL*Plus), digitar “exit”.

SQL>exit

OBS.:

Consulting Tecnologia & Sistemas Ltda


www.consulting.com.br
9

O SQL*Plus possui um help. Basta digitar “help” ou “help <comando>” no “prompt” do


SQL*Plus.

Ex.: HELP UPDATE

Vendo a estrutura de uma tabela

O comando DESCRIBE exibe a estrutura da tabela especificada, isto é, o nome, tipo, tamanho e
se o campo é de preenchimento obrigatório ou não.

EX.:
DESCRIBE T_ALUNO

Name NULL Type


MATRICULA NOT NULL VARCHAR2(06)
NOME_ALUNO NOT NULL VARCHAR2(40)

TIPOS DE DADOS BÁSICOS

CHAR
O tipo CHAR armazena seqüência de caracteres de tamanho fixo que consistem de letras,
números, caracteres especiais. O tamanho não pode ultrapassar 255 bytes. Em SQL Padrão,
quando um dado possui um tamanho menor que o especificado para a coluna, espaços em branco
são acrescentados à direita. O tamanho default é 1. (Não é aconselhável este tipo de dados
apartir do Banco Oracle 8i).

VARCHAR2
Armazena seqüências de caracteres de tamanho variável que consistem de letras, números,
caracteres especiais. O tamanho máximo é de 4000. O tamanho default é 1.

VARCHAR
Idem ao VARCHAR2

NUMBER(T,D)
Onde T significa o tamanho do campo e D a quantidade de casas decimais (se for o caso).

DATE
Tipo de dado usado para datas e horas (intervalo: 01 de janeiro de 4712 AC e 31 de dezembro de
4712 DC).

LONG
Idem ao VARCHAR2, mas com tamanho máximo de 2 Gigabytes.

CLOB
Tipo de Dado usado para armazenamento de caracteres de grandes objetos. O Tamanho máximo
é de 4 Gb.

BLOB
Tipo de Dado usado para armazenamento binário de grandes objetos. O Tamanho máximo é de 4
Gb.

Consulting Tecnologia & Sistemas Ltda


www.consulting.com.br
10

BFILE
Tipo de Dado que contém a localização de um arquivo binário armazenado fora do banco de
dados. Tamanho máximo de 4Gb.

* Existem outros tipos de dados, mas estes são variações dos tipos apresentados acima.

SELECIONANDO DADOS: COMANDO SELECT

O comando mais fundamental da linguagem SQL para manipulação dos dados é o SELECT.
Com ele é que produzimos as “Queries”, ou seja ,as pesquisas no Banco de Dados.

Sua sintaxe é:

SELECT [DISTINCT] (quais colunas queremos)


FROM (de qual(is) tabela(s) )
[WHERE (condição de pesquisa) ]
[GROUP BY colunas [HAVING condição ] ]
[ORDER BY colunas ]

Exemplos de “Queries”:
1)SELECT * FROM ALUNO;
Retorna todas as linhas e todas as colunas da tabela ALUNO.

1)SELECT MATRICULA, NOME_ALUNO


FROM ALUNO;
Idem à “Query” acima.

1)SELECT MATRICULA, NOME_ALUNO


FROM ALUNO
WHERE NOME_ALUNO = ‘JOAO DA SILVA’;
Retorna os dados dos alunos que tenham nome igual a JOAO DA SILVA.

1)SELECT MATRICULA FROM CURSA


WHERE ((NOTA1+NOTA2+NOTA3)/3) > 7
AND CD_DISCIPLINA = ‘PORT’;
Retorna a matrícula de todos os alunos que obtiveram média acima de sete na disciplina
PORT.

1)SELECT MATRICULA, CD_DISCIPLINA, NOTA1


FROM CURSA
WHERE NOTA1 BETWEEN 5 AND 7;
Retorna a relação de todas as matrículas, código da disciplina e nota1, cuja notas1 esteja
contida entre 5 e 7, inclusive;

1)SELECT MATRICULA, CD DISCIPLINA


FROM CURSA
WHERE NOTA3 IS NULL;
Retorna as matrículas e disciplinas que estão sem lançamento da nota3.

1)SELECT MATRICULA, NOME_ALUNO


FROM ALUNO
WHERE NOME_ALUNO LIKE ‘JOAO%’;

Consulting Tecnologia & Sistemas Ltda


www.consulting.com.br
11

Retorna a matrícula e o nome dos alunos chamados JOAO (independente de seus


sobrenomes);

1)SELECT * FROM CURSA


WHERE CD_DISCIPLINA IN (‘MAT’,’PORT’);
Retorna os dados dos alunos que cursam as disciplinas MAT e PORT.

1)SELECT DISTINCT NOME_ALUNO


FROM ALUNO;
Retorna o nome dos alunos da tabela Aluno, não exibindo os nomes duplicados.

Denominamos Tabela_resultado o resultado de uma “Query”, isto é, a tabela resultante de um


SELECT.

OBS.:
a)O predicado LIKE (exemplo 7) determina que a pesquisa será feita em todos os nomes que
comecem com JOAO. O caractere % pode ser colocado também antes da palavra. EX.: ... LIKE
‘%MARIA%’.

b)O CARACTERE * (exemplo 1) “pega” todas as colunas da tabela.

EXPRESSÕES ARITMÉTICAS

Uma expressão é a combinação de um ou mais valores, operadores, e funções os quais avaliam


para um valor.

Expressões Aritméticas podem conter nome de colunas, valores numéricos constantes e


operadores aritméticos:

Operadores Descrições
+ Adição
- Subtração
* Multiplicação
/ Divisão

SQL> SELECT 1+1 FROM DUAL;

1+1
----------
2

SQL> Select 12/4 Divisão from dual;


DIVISÃO
----------
3

Se a sua expressão aritmética conter mais de um operador a prioridade é *,/ primeiro, então +,-
segundo (deixe para direita se existir operadores com a mesma prioridade). No exemplo seguinte
a multiplicação (250*12) é avaliada primeiro; então o valor do salário é adicionado no resultado
da multiplicação (3000). Somente para linha do Smith: 800+3000=3800

Consulting Tecnologia & Sistemas Ltda


www.consulting.com.br
12

select ename, sal + 250 * 12


from emp;

ENAME SAL+250*12
---------- ----------
SMITH 3800
ALLEN 4600
WARD 4250
JONES 5975

Parênteses podem ser usados para especificar a ordem na qual serão executados es operadores,
se, por exemplo, a adição e requerida antes da multiplicação.

select ename, (sal + 250) * 12


from emp;

ENAME (SAL+250)*12
---------- ------------
SMITH 12600
ALLEN 22200
WARD 18000
JONES 38700

FUNÇÕES AGREGADAS

A característica marcante das Funções Agregadas é que produzem um único valor a partir de
uma coluna inteira de dados. Portanto, enquanto qualquer outro tipo de expressão retorna um
valor para cada linha, as funções agregadas retornam um valor que representa um agregado dos
valores referentes às várias linhas.

O atributo de uma função agregada normalmente é um nome de coluna ou uma expressão que
tenha um nome de coluna como componente – por exemplo, salário * 1.25 . As funções MAX,
MIN e COUNT aceitam caracteres e números, entretanto as funções AVG e SUM devem possuir
como atributo coluna que seja do tipo numérico, pois elas operam aritmeticamente.
Podemos utilizar as palavras-chave DISTINCT e ALL em funções agregadas tendo o seguinte
efeito:
-A palavra-chave ALL faz com que todos os valores, inclusive os repetidos, sejam aproveitados.
-A palavra-chave DISTINCT faz com que os valore repetidos sejam ignorados.

Em todas as funções o ALL é o deflua.

Exemplos:

1)SELECT AVG(SALARIO) FROM EMPREGADO;

1)SELECT SUM(SALARIO) FROM EMPREGADO;

Consulting Tecnologia & Sistemas Ltda


www.consulting.com.br
13

1)SELECT MAX(SALARIO) FROM EMPREGADO;

1)SELECT MAX(NOME) FROM EMPREGADO;

1)SELECT MIN(SALARIO) FROM EMPREGADO;

1)SELECT COUNT(NOME) FROM EMPREGADO;

1)SELECT COUNT(DISTINCT NOME) FROM EMPREGADO;

ORDENANDO A TABELA RESULTADO

A cláusula ORDER BY nos permite ordenar as linhas da tabela-resultado alfabética e


numericamente, em ordem crescente ou decrescente. O default é a ordem crescente.

Para fazer a classificação com base em uma expressão ou função, temos que representá-la com
um número que identifique a sua posição na cláusula SELECT. Isto também é verdade para a
cláusula GROUP BY.

Exemplos:

1)SELECT NOME, TEL


FROM FUNC
ORDER BY NOME DESC;

1)SELECT COD_FUNC, NOME, BAIRRO


FROM FUNC
ORDER BY NOME, BAIRRO;

1)SELECT COD_FUNC, NOME, BAIRRO


FROM FUNC
ORDER BY BAIRRO, NOME;

1)SELECT NOME, SALARIO


FROM FUNC
ORDER BY 2 DESC;

Obs:
Normalmente os valores nulos de uma coluna são exibidos em primeiro lugar quando a mesma é
classificada.

REVERTENDO A ORDEM DEFAULT

Usa-se o comando DESC após o nome da coluna especificada na cláusula order by. Exemplo:

Consulting Tecnologia & Sistemas Ltda


www.consulting.com.br
14

SELECT DEPTNO, JOB, ENAME


FROM EMP
ORDER BY HIREDATE DESC;

ORDENANDO POR VÁRIAS COLUNAS

É possível ordenar por mais de uma coluna. De fato, o limite é o número de colunas na tabela.

Para ordenar por duas colunas e mostrar a ordem reversa dos salários, entre:

SELECT DEPTNO, JOB, ENAME


FROM EMP
ORDER BY DEPTNO, SAL DESC;

A CLÁUSULA WHERE

Corresponde ao operador de restrição da álgebra relacional. Ela é colocada após a cláusula


FROM. Exemplo da sintaxe:

SELECT columns
FROM table
WHERE condição de pesquisa

A cláusula WHERE pode comparar valores em colunas, valores literais, expressões aritméticas
ou funções. Sendo assim, a cláusula WHERE espera por 3 elementos, são eles:

1º) Um nome de coluna;


2º) Um operador de comparação;
3º) Um nome de coluna, constante ou lista de valores.

Os operadores de comparação são usados na cláusula WHERE e podem ser divididos entre duas
categorias, que são: LÓGICOS e SQL.

Apresentamos abaixo os Operadores Lógicos, que testarão as seguintes condições:

Operador Significado

= igual a
> maior que
>= maior ou igual que
< menor que
<= menor ou igual que

Utilizando caracteres string e datas na cláusula WHERE, torna-se necessário o uso de (‘’) plicas.

Como exemplo1, para listar nomes, números, funções(jobs) e departamentos de todos os


CLERKS, entre:

SELECT EMPNO, ENAME, JOB, DEPTNO


FROM EMP

Consulting Tecnologia & Sistemas Ltda


www.consulting.com.br
15

WHERE JOB = ‘CLERK’;

Como exemplo2, para encontrar todos os nomes de departamento com número maior que 20,
entre:

SELECT DNAME, DEPTNO


FROM DEPT
WHERE DEPTNO > 20;

COMPARANDO COLUNAS NA MESMA LINHA

Você pode comparar uma coluna a outra na mesma linha, assim como a uma constante. Como
exemplo, suponha que você queira obter todos aqueles empregados cuja comissão é maior que os
seus salários:

SELECT ENAME, SAL, COMM


FROM EMP
WHERE COMM>SAL;

Abaixo apresentaremos os Operadores SQL, os quais operam com todos os tipos de dados:

Operadores Significado

1º) BETWEEN ... AND ... entre dois valores (inclusive);

2º) IN(LIST) verifica um argumento de pesquisa, numa lista de valores


que satisfaçam a esta determinada condição;

3º) LIKE facilita a pesquisa dada uma parte da string;

4º) IS NULL é um valor nulo.

1º) O OPERADOR BETWEEN

Testa condição de valores mediante um limite mínimo e máximo inclusive.

Como exemplo, suponha que você queira obter todos os empregados, cujo salário está entre
1000 e 2000:

SELECT ENAME, SAL


FROM EMP
WHERE SAL BETWEEN 1000 AND 2000;

2°) O OPERADOR IN

Testa valores numa lista específica.

Consulting Tecnologia & Sistemas Ltda


www.consulting.com.br
16

Como exemplo, para obter todos os empregados subordinados a um dos três gerentes
destacados pelos números abaixo, entre:

SELECT EMPNO, ENAME, SAL, MGR


FROM EMP
WHERE MGR IN (7902, 7566, 7788);

Nota: É obrigatório o uso de (‘’) plicas para caracteres e datas especificados na lista.

3º) O OPERADOR LIKE

Algumas vezes, pode ser que você não saiba exatamente o valor à pesquisar. Usando o operador
LIKE será possível então, selecionar linhas mediante a uma parte da string que sirva para o
argumento desejado.

Temos o símbolo abaixo com sua designação:

Símbolo Significado

% Representa qualquer sequência de Zero ou mais caracteres.

Como exemplo, para listar todos os empregados cujo nome se inicia com um S, entre:

SELECT ENAME
FROM EMP
WHERE ENAME LIKE ‘S%’;

4º) O OPERADOR NULL

É o operador específico para testar valores que são nulos.

Como exemplo, para obter todos os empregados que não tenham gerentes, deve ser feito o
teste para um valor nulo.

SELECT ENAME, MGR


FROM EMP
WHERE MGR IS NULL;

EXPRESSÕES DE NEGAÇÃO

Os seguintes operadores são utilizados como teste de negação:

Operador Descrição

!= não é igual a (VAX, UNIX, PC)

<> não é igual a

NOT COLNAME = não é igual a

Consulting Tecnologia & Sistemas Ltda


www.consulting.com.br
17

NOT COLNAME > não é maior que

Abrangendo-se também os operadores SQL:

Operador Descrição

NOT BETWEEN não se encontra entre dois valores dados

NOT IN não se encontra numa lista de valores de dados

NOT LIKE não é como a string

IS NOT NULL não é um valor nulo

Como exemplo1, para encontrar os empregados cujo Salário não está entre um determinado
intervalo, entre:

SELECT ENAME, SAL


FROM EMP
WHERE SAL NOT BETWEEN 1000 AND 2000;

Como exemplo2, para encontrar aqueles empregados cujo nome da função (Job) não comece
com a letra M, entre:

SELECT ENAME, JOB


FROM EMP
WHERE JOB NOT LIKE ‘M%’;

Como exemplo3, para encontrar todos os empregados que tenham um Gerente (MGR), entre:

SELECT ENAME, MGR


FROM EMP
WHERE MGR IS NOT NULL;

CONSULTANDO DADOS COM MÚLTIPLAS CONDIÇÕES

Os operadores AND e OR podem ser usados para estabelecer expressões lógicas compostas. O
operador AND em determinada expressão, é usado para que se atinja um resultado em que ambas
as condições sejem verdadeiras; enquanto o operador OR espera que uma das condições sejem
verdadeiras para que o resultado também seje verdadeiro.

Como exemplo1, para encontrar todos os (CLERKS) que ganhem entre 1000 e 2000, entre:

SELECT EMPNO, ENAME, JOB, SAL


FROM EMP
WHERE SAL BETWEEN 1000 AND 2000
AND JOB = ‘CLERK’;

Consulting Tecnologia & Sistemas Ltda


www.consulting.com.br
18

Como exemplo2, para encontrar todos os empregados que sejam CLERK e/ou todos os
empregados que ganhem entre 1000 e 2000, entre:

SELECT EMPNO, ENAME, JOB, SAL


FROM EMP
WHERE SAL BETWEEN 1000 AND 2000
OR JOB = ‘CLERK’;

Nota: Você pode combinar AND e OR na mesma expressão lógica. Quando AND e OR
aparecerem na mesma cláusula WHERE, todos os AND’s serão executados primeiro e os OR’s
em seguida sucessivamente; pois o AND tem maior precedência sobre o OR.

Como exemplo3, o comando abaixo retornará todos os gerentes com salário > 1.500,00 ou
todos que sejem vendedores.

SELECT EMPNO, ENAME, JOB, SAL, DEPTNO


FROM EMP
WHERE SAL > 1.500,00
AND JOB = ‘MANAGER’
OR JOB = ‘SALESMAN’;

Os parêntesis especificam a sequência em que os operadores serão executados.

Como exemplo, selecionar todos os gerentes e vendedores com salário maior que 1.500,00,
entre:

SELECT EMPNO, ENAME, JOB, SAL, DEPTNO


FROM EMP
WHERE SAL > 1,500.00
AND (JOB = `MANAGER` OR JOB = `SALESMAN`);

PRECEDÊNCIA DE OPERADORES

Todos os operadores obedecem a uma forma hierárquica de precedência. Numa expressão, as


operações são executadas em ordem de suas precedências, sempre da de maior precedência para a
de menor. E quando de mesma precedência, serão executadas da esquerda para a direita. Estão
assim na ordem abaixo:

1º Todos operadores de comparação e os operadores SQL têm igual precedência (=, !=, <,
>, <=, >=, BETWEEN ... AND, IN, LIKE, IS NULL;

2º NOT ( reverte resultados de expressões lógicas);

3º AND;

4º OR.

SUBQUERYS

Consulting Tecnologia & Sistemas Ltda


www.consulting.com.br
19

Uma subquery é um comando select dentro de um outro comando select onde retorna uma ou
mais linhas a fim de satisfazer uma clausula WHERE. No exemplo abaixo temos um select em
s_emp onde procuramos trazer o last_name e o title, onde o title pesquisado seja o mesmo do "
Smith", para isso é realizado uma subquery que nada mais é que um select, que neste caso
retorna um valor somente para a comparação na where.

SQL> select last_name, title


2 from s_emp
3 where title =
4 (select title
5 from s_emp
6 where last_name = 'Smith');

LAST_NAME TITLE
------------------------- -------------------------
Maduro Stock Clerk
Smith Stock Clerk
Nozaki Stock Clerk
Patel Stock Clerk
Newman Stock Clerk
Markarian Stock Clerk
Chang Stock Clerk
Patel Stock Clerk
Dancs Stock Clerk
Schwartz Stock Clerk

10 rows selected.

Outro exemplo de subquery, que neste caso está comparando os valores da coluna SALARY com
a média dos salários da tabela s_emp. A função AVG está trazendo a média dos salários.

SQL> select last_name, title, salary


2 from s_emp
3 where salary<
4 (select avg(salary)
5 from s_emp);

LAST_NAME TITLE SALARY


------------------------- ------------------------- ---------
Urguhart Warehouse Manager 1200
Menchu Warehouse Manager 1250
Biri Warehouse Manager 1100
Smith Stock Clerk 940
Nozaki Stock Clerk 1200
Patel Stock Clerk 795
Newman Stock Clerk 750
Markarian Stock Clerk 850
Chang Stock Clerk 800
Patel Stock Clerk 795
Dancs Stock Clerk 860

Consulting Tecnologia & Sistemas Ltda


www.consulting.com.br
20

Schwartz Stock Clerk 1100

12 rows selected.

Nos exemplos anteriores vemos que retornavam só um único valor para comparação na clausula
where, neste caso agora há o retorno de mais de um valor para a comparação na clausula where,
mas para que ocorra a comparação com mais de um valor temos que usar o IN em vez do "=" no
exemplo abaixo ocorre um erro:

SQL> select last_name, title


2 from s_emp
3 where dept_id =
4 (select id from s_dept
5 where name = 'finance or region_id = 2);
select last_name, title
*
ERROR at line 1:
ORA-01756: quoted string not properly terminated

Agora usando o IN na clausula where poderá o dept_id ser comparado com as duas condições, o
select trará os registros que na tabela s_dept que tenham o nome igual a 'Finace' ou que a
region_id seja igual a 2.

SQL> select last_name,first_name,title


2 from s_emp
3 where dept_id in
4 (select id
5 from s_dept
6 where name = 'Finance' or region_id =2);

LAST_NAME FIRST_NAME TITLE


------------------------- ------------------------- -------------------------
Quick-To-See Mark VP, Finance
Menchu Roberta Warehouse Manager
Giljum Henry Sales Representative
Nozaki Akira Stock Clerk
Patel Vikram Stock Clerk

O uso do having em subquery

Neste exemplo estamos querendo selecionar o dept_id e a média dos salários de s_emp, grupados
pelo dept_id, com a condição de que a média dos salários de s_emp seja maior que a média dos
salários do dept 32 para isso usamos o HAVING.

Vamos ao Exemplo:

SQL> select dept_id,avg(salary)


2 from s_emp
3 group by dept_id
4 having avg(salary)>
5 (select avg(salary)
6 from s_emp
7 where dept_id = 32);

Consulting Tecnologia & Sistemas Ltda


www.consulting.com.br
21

DEPT_ID AVG(SALARY)
--------- -----------
33 1515
50 2025

Agora dentro do group by estamos usando o having e dentro da subquery selecionando o menor
valor da média da tabela s_emp grupado por title

SQL>
1 select title,avg(salary)
2 from s_emp
3 group by title
4 having avg(salary) =
5 (select min(avg(salary))
6 from s_emp
7* group by title)

TITLE AVG(SALARY)
------------------------- -----------
Stock Clerk 949

SQL> select min(avg(salary))


2 from s_emp
3 group by title;

MIN(AVG(SALARY))
----------------
949

EDITANDO COMANDOS SQL

Podemos editar comandos que foram digitados.

Comando Descrição
L[IST] Lista o último comando SQL digitado.
A[PPEND] texto Acrescenta texto no fim da linha corrente
C[HANGE]/texto_anterior/texto_novo Troca o texto_anterior para texto_novo
DEL Apaga a linha corrente
I[NPUT] Acrescenta uma ou mais linhas após a linha corrente;
para sair no modo Input pressione Enter
n Faz com que a linha n passe a ser a linha corrente.
n texto Troca o texto da linha pelo texto.

Executando Pesquisas Padrões com Variáveis Substituíveis

Variáveis Substituíveis são usadas em declarações SQL e permitem valores serem identificados
na execução. Explicação dessa Unidade

Única Variável Substituível

Consulting Tecnologia & Sistemas Ltda


www.consulting.com.br
22

Você pode usar variáveis substituíveis no arquivo comando ou nas declarações SELECT para
representar valores que sejam entrados na hora da execução. Uma variável pode ser uma idéia de
como uma valor pode ser armazenado temporariamente.

Uma variável é representado por um único i comercial(&), e o valor é atribuído nela. A seguinte
declaração apresenta ao usuário um número de departamento na execução:

SELECT EMPNO, ENAME, SAL


FROM EMP
WHERE DEPTNO = &DEPARTMENT_NUMBER;

Enter value for department_number : 10

EMPNO ENAME SAL


----- ---------- ----------
7782 CLARK 2,450.00
7839 KING 5,000.00
7934 MILLER 1,300.00

O exemplo acima usa a condição WHERE DEPTNO = 10.


Com o único "e" comercial o usuário é solicitado toda vez que o comando é executado, porque a
variável não é definida e consequentemente o valor digitado não é salvo.

Um valor alfanumérico ou data precisa ser incluído entre aspas simples na entrada. Para evitar a
entrada das aspas simples na execução, declara-se a variável entre aspas simples.

Na declaração seguinte, as variáveis estão incluídas entre aspas simples, só que as aspas simples
não são requeridas na execução:

SELECT ENAME, DEPTNO, SAL*12


FROM EMP
WHERE JOB = '&JOB_TITLE';

Enter value for job_title: MANGER

ENAME DEPTNO SAL*12


---------- ------ ----------
JONES 20 35700
BLAKE 30 34200
CLARK 10 29400

O tamanho da variável é indefinido, o valor será entrado todo vez que for executado a declaração
É possível entrar com um nome de coluna de um tabela na execução.

No seguinte exemplo você entrará com um expressão aritmética.

SELECT DEPTNO, &ARITHMETIC_EXPRESSION


FROM EMP
Enter value for arithmetic_expression: sal/12

DEPTNO SAL/12
------ -------
20 66.6667

Consulting Tecnologia & Sistemas Ltda


www.consulting.com.br
23

30 133.333
30 104.167
20 247.917
30 104.167
30 237.5
10 204.167
20 250
10 416.667
30 125
20 91.6667
30 79.1667
20 250
10 108.333

Duplo & para Variáveis substituíveis

Se uma variável é prefixada com um duplo "e" comercial(&&), SQL*Plus preenche o valor da
variável com o primeiro valor fornecido na execução da declaração SQL.

SELECT ENAME, DEPTNO, JOB


FROM EMP
WHERE DEPTNO = &&DEPTNO_PLEASE;

Enter value for deptno_please: 10

ENAME DEPTNO JOB


-------------- ------------ -------------
CLARK 10 MANAGER
KING 10 PRESIDENT
MILLER 10 CLERK

É perguntado uma vez e não mais.


Você pode usar o comando DEFINE para determinar se uma variável já está definida. Se a
variável é definida, ela mostra o valor atribuído.
SQL>DEFINE
DEFINE DEPTNO_PLEASE = "10" (CHAR)

O comando DEFINE é então usado para criar uma variável para o usuário.

O Comando DEFINE

Um valor pode ser atribuído para uma variável usando o comando DEF[INE] do SQL*Plus. O
valor atribuído pode ser referenciado na declaração SELECT ou comando de arquivo pelo nome
de variável predefinido de um (&). Despreenchida usando o comando UNDEF[INE].

No exemplo seguinte, uma variável tem seu conteúdo definido como uma expressão aritmética
que calcula a remuneração. Na subsequente declaração, a variável REM é referenciada para um
número de vezes. A variável é então despreenchida usando UNDEF(INE).

DEFINE REM = "SAL*12+NVL(COMM,0)"

SELECT ENAME, JOB, &REM

Consulting Tecnologia & Sistemas Ltda


www.consulting.com.br
24

FROM EMP
ORDER BY &REM;

UNDEFINE REM

ENAME JOB SAL*12+NVL(COMM,0)


---------- ---------- ------------------
SMITH CLERK 9600
JAMES CLERK 11400
ADAMS CLERK 13200
WARD SALESMAN 15500
MILLER CLERK 15600
MARTIN SALESMAN 16400
TURNER SALESMAN 18000
ALLEN SALESMAN 19500
CLARK MANAGER 29400
BLAKE MANAGER 34200
JONES MANAGER 35700
SCOTT ANALYST 36000
FORD ANALYST 36000
KING PRESIDENT 60000

As Aspas duplas em volta da expressão são opcionais a menos que a expressão tenha espaços.
Iniciando um Arquivo comando Contendo Variáveis Substituíveis.

Suponhamos que você queira uma série de relatórios para listar os empregados com vários cargos
por exemplo; um para Vendedores, um para escriturário, um para gerentes, etc. Você já sabe
como usar variáveis substituíveis para obter esses diversos relatórios de uma única declaração
SELECT.

Porém, existe uma alternativa técnica que você pode usar , se você quiser armazenar a declaração
SELECT em um arquivo e então usar o comando START para executá-lo.

Essa técnica requer o uso de algumas variáveis substituíveis especiais. Existem nove dessas
variáveis e seus nomes vão de um á nove.

Para e usar essas variáveis no "e" comercial ‘&’ coloca-se um numeral (1-9) no comando SQL.
Essas variáveis podem ser usados vários números ao mesmo tempo e em várias ordens. Cada vez
que o comando é executado, cada ‘&1’ no comando é alterado pelo primeiro parâmetro depois de
START arquivo, cada ‘&2’ é substituído pelo segundo parâmetro, e assim por diante.

Para criar um arquivo comando com um parâmetro especificando o cargo para ser mostrado,
faça:

SELECT EMPNO, ENAME, SAL


FROM EMP
WHERE JOB = '&1';

SQL> SAVE JOB1

SQL retornará a mensagem


Created File Job1

Consulting Tecnologia & Sistemas Ltda


www.consulting.com.br
25

Agora execute o comando com o parâmetro ‘CLERK’. SQL*Plus substituirá a variável com o
parâmetro.
SQL> START JOB1 CLERK

EMPNO ENAME SAL


----- ----- -----
7369 SMITH 800
7876 ADAMS 1100
7900 JAMES 950

Note que você não pode usar essas variáveis quando executar um comando com RUN. Você
somente armazena o comando em um arquivo e executa ele com o comando START.

O comando ACCEPT

O comando ACCEPT permite criar um variável com valor, a qual é entrada na execução,
armazenando nela. O ACCEPT é geralmente usado num arquivo comando. Esta variável então
pode ser referenciada na declaração do SQL. Existem benefícios em usar o ACCEPT para
definir Variáveis Substituíveis.

•Dados tipo Data podem ser checados.


•A mensagem de entrada de dados pode ser mais explicativa
•Valores da resposta pode ser escondido

A sintaxe do comando é:
ACC(EPT) variable (NUMERICO/ALFANUMERICO) (PROMPT/NOPROMPT 'texto')
(HIDE)

Sintaxe Descrição

NUMBER/CHAR determina o tipo de variável. Se o valor entrado for inválido


uma mensagem será mostrada.

PROMPT ‘texto’ mostra o texto se for especificado

NOPROMPT faz o ACCEPT omitir uma linha aguardando a entrada

HIDE esconde entrada para o usuário. No caso de senha

Exemplos
SQL> ACCEPT SALARY NUMBER PROMPT 'Salary figure : '

Salary figure : 30000

SQL> ACCEPT PASSWORD CHAR PROMPT 'Password : ' HIDE

Consulting Tecnologia & Sistemas Ltda


www.consulting.com.br
26

Password :

SQL> ACCEPT COMM NUMBER NOPROMPT

500

SQL> DEFINE

DEFINE SALARY = 30000 (NUMBER)


DEFINE PASSWORD = "FREEBIES" (CHAR)
DEFINE COMM = 500 (NUMER)

GUARDANDO COMANDOS EM ARQUIVOS

Podemos arquivar os comandos SQL que digitamos interativamente, em arquivos para uso
futuro. Basta utilizarmos um editor de textos qualquer. Devemos no entanto, salvar tal arquivo
com uma extensão “.SQL”.
Para executar o “script” criado digitar @ e o nome do arquivo, no “prompt do SQL*Plus.

Exemplo:

SQL>@lista_deptos.sql

EXERCÍCIO

1)Logar-se no SQL*Plus
2)Criar a tabela abaixo:
TABELA ALIMENTOS
NOME DO CAMPO TIPO TAMANHO OBRIGATÓRIO
COD_ALIMENTO NUMÉRICO 04 S
NOME_ALIMENTO ALFANUMÉRICO 30 S
PREÇO NUMÉRICO 6,2 N
PROTEÍNAS NUMÉRICO 6,2 N

1)Inserir 3 (três) registros quaisquer na tabela Alimentos


2)Ver a estrutura da tabela
3)Exibir o alimento mais caro
4)Exibir o somatório dos preços dos alimentos (inseridos na questão 3).

MANIPULANDO DADOS
Conforme já vimos anteriormente os comando de manipulação dos dados do Oracle são:
INSERT Adiciona novas linhas (registros) à tabela.

Consulting Tecnologia & Sistemas Ltda


www.consulting.com.br
27

DELETE Remove/Deleta linhas da tabela.


UPDATE Altera/Modifica linhas.
COMMIT Ratifica transações efetuadas.
ROLLBACK Desfaz as transações (ainda não ratificadas por um COMMIT).

Inserindo Dados
Para incluirmos dados em uma tabela utilizamos o comando INSERT. Sua sintaxe é:

INSERT INTO [USUARIO.]TABELA [ (COLUNA1 [, COLUNAN ] ...) ]


{VALUES (VALOR [, VALOR] ...) | QUERY }

Exemplos:
1)INSERT INTO CURSA
VALUES (‘TEC001’,’APD1’,NULL,NULL,NULL);

1)INSERT INTO CURSA


VALUES (‘TEC001’,’MAT1’,80,NULL,NULL);

Obs.:
a)Não é necessário especificar no comando INSERT os nomes das colunas caso você queira
incluir a linha inteira, ou seja, todas as colunas (exemplo 1).
b)Todo campo do tipo “NOT NULL” deve sempre ser preenchido.
c)Campo do tipo não numérico devem ser delimitados com plics. Se você precisar incluir um
apóstrofe no seu string de caracteres use dois apóstrofes seguidos, por exemplo: ‘JOHN’’S” para
inserir JOHN’S.
d)Podemos usar a expressão “NEXTVAL” para inserirmos o próximo valor para, por exemplo,
uma chave primária.
Ex.: INSERT INTO T_DEPARTAMENTO(COD_DEPTO, NOME_DEPTO)
VALUES (T_DEPARTAMENTO_COD_DEPTO.NEXTVAL,’FINANCAS’);

Para tal, o campo T_DEPARTAMENTO_COD_DEPTO deve Ter sido criado como um objeto
do tipo ‘SEQUENCE’.

INSERINDO COM UMA “QUERY”


O comando INSERT pode utilizar uma “query” para incluir dados em uma tabela.

Exemplos:
1)INSERT INTO FUNC_SUL
SELECT * FROM FUNC
WHERE BAIRRO IN (‘COPACABANA’,’IPANEMA’,’LEBLON’);

1)INSERT INTO FUNC_CHEFE


SELECT * FROM FUNC
WHERE SALARIO > 600;

Obs.:

Consulting Tecnologia & Sistemas Ltda


www.consulting.com.br
28

a)Para utilizar as “queries” acima, as tabelas FUNC_SUL e FUNC_CHEFE devem existir e


possuir a mesma estrutura da tabela da “query”.
b)Campos que são NOT NULL na tabela original também deverão ser preenchido na tabela onde
os dados serão inseridos.

ALTERANDO DADOS

O Comando UPDATE atualiza linhas em uma tabela.

Sintaxe:

UPDATE nome_da_tabela
SET coluna = valor
[WHERE condição]

Exemplos:
1)UPDATE T_SALARIO
SET VAL_SALARIO = VAL_SALARIO * 1.5
WHERE VAL_SALARIO < 1000;
Atualiza os salários menores que 1000, em 50%.

1)UPDATE T_FUNCIONARIO
SET VAL_SALARIO = 1800, COD_DEPTO = 13
WHERE COD_FUNCIONARIO = 2392;
Altera o salário do funcionário 2392, para R$ 1.800,00, transferindo-o para o departamento
de número 13.

EXCLUINDO DADOS DA TABELA


Utilizamos o comando DELETE para removermos linhas de uma tabela ou visão. Se não houver
uma cláusula WHERE todas as linhas da tabela ou visão serão eliminadas.

Sintaxe:

DELETE FROM {tabela | visão }


[ WHERE condição ]

Exemplos:

1)DELETE FROM FUNC


WHERE NASC > ‘11-JAN-62’;

1)DELETE FROM DEPENDENTES


WHERE NOME LIKE ‘MANOEL%’;

CONTROLANDO TRANSAÇÕES
O controle de transações lógicas no Oracle é feito através dos comando COMMIT e
ROLLBACK.

Consulting Tecnologia & Sistemas Ltda


www.consulting.com.br
29

RATIFICANDO TRANSAÇÕES
O trabalho no Banco de Dados, deve ser processado em agrupamentos lógicos, ou seja, o Banco
de Dados deve receber alterações quaisquer mantendo-se coerente com o que o mesmo representa.
Por exemplo, se um aumento na “quantidade de fitas alugadas” tiver sido entrado, o BD pode não
estar coerente até que “Estoque_fitas_disponíveis” tenha sido diminuído deste valor.
Com isto definimos então Transação como um grupo de mudanças que constitui um agrupamento
lógico de entradas, isto é, a Transação é o conjunto de mudanças feitas no BD entre os comandos
COMMIT.

COMANDO COMMIT
Ratifica a transação corrente fazendo todas as trocas no BD (grava fisicamente).
Mudanças como INSERT, DELETE, UPDATE devem ser feitas em grupos como transações
lógicas, e depois submetidas, através do comando COMMIT, ao Banco de Dados. Isto assegura
a gerência e a integridade dos dados.

Sintaxe:

COMMIT

Após uma falha do sistema, somente as mudanças com COMMIT serão salvas.
Como os comandos INSERT, UPDATE e DELETE podem fazer com que muitas linhas
diferentes sejam alteradas, deve-se Ter o cuidado de não se fazer muitas mudanças antes de um
COMMIT. Pode ocorrer também que, após muitas mudanças (ainda não submetidas), aconteça
uma falha no sistema, necessitando que tais mudanças sejam feitas novamente.

Obs.:
a)Existe também a opção AUTOCOMMIT que faz com que cada mudança seja submetida após
a entrada. Só deve ser usada quando as mudanças que serão feitas não estão logicamente
relacionadas.
b)Comandos que causam um COMMIT automático: ALTER, AUDIT, CREATE,
DISCONNECT, DROP, EXIT, GRANT, NOAUDIT, QUIT, REVOKE. Se você digitou outros
comandos e ainda não os submeteu com um COMMIT, e entrar com um dos comandos acima,
então todo o trabalho anterior será submetido.

COMANDO ROLLBACK
O comando ROLLBACK cancela mudanças completadas, mas não submetidas ao BD, deixando
assim o BD como se tais mudanças nunca tivessem sido feitas.

Sintaxe:

ROLLBACK

O ROLLBACK é executado quando ocorre uma falha no sistema (falta de energia, por exemplo).

COMMIT
INSERT
DELETE

Consulting Tecnologia & Sistemas Ltda


www.consulting.com.br
30

INSERT
INSERT
ROLLBACK
UPDATE
INSERT
COMMIT

COMANDO SAVEPOINT

Dentro de uma transação extensa, podemos declarar pontos de salvamento (SAVEPOINT’s)


intermediários dividindo o trabalho na Transação:

INSERT...
DELETE...
UPDATE...
SAVEPOINT PRIMEIRO
INSERT...
UPDATE...
DELETE...
SAVEPOINT SEGUNDO
INSERT...
UPDATE...
DELETE...
.
.
.

Através dos SAVEPOINT’s que declaramos, podemos desfazer partes de uma transação,
deixando outras partes intactas.

Exemplo.:
ROLLBACK TO SAVEPOINT SEGUNDO

Esta instrução anula os efeitos de todas as instruções posteriores ao SAVEPOINT SEGUNDO.


Sua transação libera também quaisquer bloqueios que as instruções desfeitas adquiriram, para
que outras transações possam modificar os dados. Depois de um cancelamento até um
SAVEPOINT, a transação ainda permanece ativa.

Exercício

Criar uma tabela de equipamentos com 3 campos: COD_EQUIPAMENTO,


NOME_EQUIPAMENTO, MARCA.

Ex.:

a)INSERT INTO T_EQUIPAMENTO


VALUES (‘080’,’TELEVISAO CORES’,’SHARP’);
a)SAVEPOINT UM;
b)INSERT INTO T_EQUIPAMENTO
VALUES (‘081’,’MINI SYSTEM’,’AIWA’);

Consulting Tecnologia & Sistemas Ltda


www.consulting.com.br
31

a)SAVEPOINT DOIS;
b)INSERT INTO T_EQUIPAMENTO
VALUES (‘082’,’WALKMAN’,’SONY’);
a)SELECT * FROM T_EQUIPAMENTO;
b)ROLLBACK TO SAVEPOINT UM;
c)COMMIT;
d)SELECT * FROM T_EQUIPAMENTO;

CRIANDO TABELAS E VISÕES (VIEW’s)


Conforme já vimos criamos tabelas em SQL com o comando CREATE TABLE.

Ex.:
CREATE TABLE T_ACESSORIO-ROUPA
(COD_ACESSORIO NUMBER(03),
NOME_ACESSORIO VARCHAR2(30),
TAMANHO_ACESSORIO VARCHAR2(10),
DATA_COMPRA DATE DEFAULT SYSDATE

CONSTRAINT PK_T_ACESSORIO_ROUPA PRIMARY KEY (COD_ACESSORIO));

CRIANDO SEQUENCES DO ORACLE

Este objeto é utilizado dentro do banco de dados para fazer uma especie de "auto-incremento",
utilizando números sequenciais positivos ou negativos para uma coluna especifíca.

Utilizaremos este objeto quando queremos uma coluna que organize os registro do banco, um
exemplo, seria a utilização do Sequence para criação de colunas de Código ou Matrícula.

Abaixo demonstrarei um exemplo de criação do Sequence determinando suas opções de uso:

SQL> CREATE SEQUENCE CONSULTING


2 START WITH 1
3 INCREMENT BY 1
4 MAXVALUE 999
5 CYCLE
6 CACHE 10 ;

Na 1º Linha estamos dizendo para o Oracle criar uma sequencia com o nome CONSULTING.

Na 2º Linha será especificado o primeiro número da sequencia, no exemplo está 1.

A 3º Linha vamos determinar o numero de incremento, no caso 1 em 1.

Na 4º Linha será determinada o número máximo que a sequencia atingirá, exemplo 999 números.

A 5º Linha indica que a geração dos números será após ter atingido o número máximo ou o
número minimo para as sequencias decrescentes.

Consulting Tecnologia & Sistemas Ltda


www.consulting.com.br
32

E a 6º Linha irá especificar para o banco uma quantidade de números que será guardado na
memoria para posteriormente fazer uma consulta rápida.

Bom, agora deu para entender a criação de um objeto sequence dentro do banco, precisamos
saber agora como utilizá-la, e para isso basta você incluir o sequence dentro do seu comando
Insert, veja o exemplo :

SQL> INSERT INTO TABELA (CODIGO, NOME, EMAIL, SITE)


2 VALUES ( CONSULTING.NextVal,
'Edson Junior', 'edson@consulting.com.br','www.consulting.com.br');

A linha acima foi incluída com sucesso, mas perceba que apareceu uma palavra-chave em
NEGRITO após digitar o nome da sequence, essa palavra-chave é para obter o próximo número
sequencial (NextVal), poderiamos utilizar outra palavra-chave a CurrVal que nos daria o valor
atual da sequencia.

Depois de termos criado a sequence para a tabela, falarei sobre alguns pontos bons e ruins na sua
utilização no dia-dia.

Pontos Bons

- Ajuda na organização dos registros.

- Podemos utilizar uma unica sequence para várias tabelas do banco de dados, economizando
tempo e mão-de-obra.

Pontos Ruins

- Caso tenha uma perca de memoria ou uma falha do sistema, o objeto perderá toda numeração
sequencial, ficando totalmente inutilizavel.

- Caso você execute o comando DELETE na sua tabela, o número da sequencia que você deleto
será pedido, então ficará um "burraco" na sua coluna, pois a sequence não é um auto-incremento
que deixará sempre o registro com numeração correta.

Depois de citar o empate tecnico entre os pontos bons e ruins, vamos pensar que você queira ter
um controle sobre as Sequences que você criou no banco. Como fazer isso ?

Seus problemas acabaram, pois o maravilhoso Oracle sabe como fazer isso bem facilmente, cada
usuário tem seu schema onde é guardada todas as sequences, type, type_methods e etc.. e um
simples comando você consegue ver as sequences que estão no seu Shema.

SQL > DESC SYS.USER_SEQUENCES

Ele retornará a descrição resumida da User_Sequence do SChema para você.

VISÕES OU TABELAS VIRTUAIS (VIEW´s)

Uma visão é uma tabela resultante de uma “query” à qual damos um nome. Depois que você
tiver criado uma visão, isto é, dado um nome à tabela resultado de uma determinada “query”,
poderá pesquisar os seus dados exatamente como faria com uma tabela qualquer.

Consulting Tecnologia & Sistemas Ltda


www.consulting.com.br
33

As visões têm várias funções, dentre elas Independência de dados, Segurança de acesso e
facilidade de acesso.

Com as visões podemos restringir o acesso aos dados especificando que colunas e/ou linhas um
determinado usuário, aplicação ou grupo pode ver, assim como o que eles podem fazer (Incluir,
Modificar, Excluir).
Muitas vezes o acesso aos dados exigem “queries” complexas. Um usuário pode construir uma
visão que contenha uma certa complexidade e disponibilizá-la para usuários finais e
programadores, que farão “queries” mais simples sobre esta Visão. Você estará então, retirando
a complexidade da navegação de uma aplicação ou de um usuário no acesso aos dados.

Sintaxe:

CREATE VIEW nome_visão (coluna1, coluna2,... colunaN)


AS SELECT (cláusula Select);

Exemplos:
Vamos supor que muitos usuários e aplicações necessitem do nome do funcionário, nome dos
seus dependentes e o endereço dos seus dependentes.

O DBA poderia criar uma Visão que fornecesse esse conjunto de informações da seguinte forma:

CRATE VIEW VISAO_01


(NOME_FUNC, NOME_DEP, ENDERECO)
AS SELECT T1.NOME, T2.NOME, T1.END
FROM FUNC T1, DEPENDENTES T2
WHERE T1.COD_FUNC = T2.COD_FUNC;

Obs.: Após a execução do CREATE VIEW podemos acessar os dados dessa VISÃO da mesma
forma que uma tabela. Por exemplo, poderíamos digitar a seguinte “query”:

SELECT * FROM VISAO_01


ORDER BY 2,1;

Existem algumas restrições no uso de View’s, que variam de implementação para implementação.
Vejamos as principais, que são comuns a quase todos os banco de dados relacionais:

1)Não podemos colocar a cláusula UNION nem ORDER BY em um CREATE VIEW;


2)Não podemos atualizar uma coluna que seja derivada de uma função ou de uma expressão;
3):Não podemos atualizar uma visão que seja composta por mais de uma tabela (JOIN ou
Junção);
4)Não podemos atualizar uma visão que contenha um GROUP BY;
5)Não podemos inserir dados em uma visão se ela for composta por mais de uma tabela ou se
não contiver todas as coluna definidas como NOT NULL na tabela básica.

VISÕES MATERIALIZADAS

O que essas Views Materializadas (ou Snapshots) fazem de interessante?

Consulting Tecnologia & Sistemas Ltda


www.consulting.com.br
34

Utilizamos elas para fazermos cálculos, armazenamentos de dados e dar agilidade na troca de
informações entre um banco de dados ou entre tabelas. Este recurso é muito utilizado em
ambientes de Data Warehouse, que trabalha com uma enorme quantidade de informações. Pois
com elas conseguimos melhorar a performance do sistema e trazer diversos benefícios ao Oracle.

As Views Materializadas são utilizadas para fazer atualizações, a própria Oracle garante que as
atualizações são feitas com sucesso numa tabela destinatária após terem sido efetivadas nas
tabelas originais. Isso nos dá mais tranqüilidade na administração e no desenvolvimento.

Agora vamos ver um exemplo de como se faz uma Views Materializadas, olhe abaixo:

SQL > CREATE MATERIALIZED VIEW CONSULTING


2 BUILD IMMEDIATE
3 REFRESH FAST
4 ENABLE QUERY REWRITE
5 AS (SELECT QUALQUER - Pórem com Restrições.)
6/

Linha 1 - ( CREATE MATERIALIZED VIEW CONSULTING)

Aqui estamos começando a criar nossa View Materializada, veja que depois da palavra VIEW
devemos definir um nome para ela, no nosso exemplo utilizei meu nickname, CONSULTING.
Para as versões anteriores ao 9i, criávamos sendo Snapshots, exemplo, CREATE SNAPSHOT
NOME, então mudou em relação a versão 9i. OBS: a versão 10g mantém o padrão da versão 9i.

Linha 2 - ( BUILD IMMEDIATE )

Nesse ponto estamos dizendo que a View Materializada deverá utilizar os dados imediatamente
na query rewrite (Seu SELECT), desde modo os dados serão processados com mais agilidade.

Existe também outro método, chamado build dedferred que significa que a view não terá nenhum
tipo de dados a ser utilizada automaticamente, esse modo seria um processamento manual das
informações, que será depois atualizado pelo Refresh, resumindo, que com essa opção o comando
SELECT não será executado imediatamente.

Linha 3 - ( REFRESH FAST )

Esse método é para dizer que as modificações serão utilizadas somente pela View Materializada,
para utilizar este recurso com segurança, sugiro criar uma View Materializada Log, para ter
controle sobre as modificações que estão sendo feitas, explicarei isso na próxima coluna.

Linha 4 - ( ENABLE QUERY REWRITE )

Essa linha de comando é o que indica que o SELECT presente dentro da View Materializada será
reescrita e atualizada para os novos valores passados pela VIEW. A query rewrite pode ter três
níveis de integridade que vai desde o modo ENFORCED até o STALE_TOLERATED, que
indicará ao banco de dados que tipo de confiança ele poderá ter nos dados. Sobre as integridades,
falaremos na próxima coluna também, pois e um pouco mais delicado.

Linha 5 - ( AS SELECT )

Aqui será colocado seu SELECT, onde poderá fazer alguns cálculos ou visualizações de
informações para outras tabelas, como no exemplo de SELECT que irei passar.

Consulting Tecnologia & Sistemas Ltda


www.consulting.com.br
35

SELECT SUM(mulheres) FROM mundo WHERE nome='Cristiane'

Então o que acontecerá? Estou pegando algumas informações que será atualizada no banco de
dados, esse meu SELECT ele está bem simples, porém os SELECTS que devemos utilizar dentro
das Views Materializadas devem seguir um padrão delas, como, por exemplo, não utilizar
cláusulas como UNION, UNION ALL, INTERSECT e MINUS. Se utilizar alguma dessas
cláusulas a view não irá atualizar os dados, assim como tem que seguir alguns outros critérios.

CRIANDO RESTRIÇÕES (CONSTRAINT’s)


Na criação de tabelas podemos definir algumas restrições (constraint’s), visando manter a
integridade/consistência do banco de dados.

São elas:

CONSTRAINT OBJETIVO
NOT NULL Não permitir campos nulos (usada para campos de
preenchimento obrigatório).
UNIQUE Especifica que o campo não poderá conter valores duplicados.
PRIMARY KEY Especifica-se esta Constraint para os atributos identificadores
das tabelas (chaves primárias)
FOREIGN KEY Para definição de chaves estrangeiras (foreign key),
estabelecendo relacionamentos entre tabelas do BD.
CHECK Valida o preenchimento de uma coluna da tabela.

ADICIONANDO, MODIFICANDO COLUNA DE UMA TABELA


Para adicionar ou modificar colunas em uma tabela usamos o comando ALTER TABLE.

Adicionar

Sintaxe:

ALTER TABLE nome_da_tabela


ADD (nome_da_coluna tipo [ , nome_da coluna tipo] ... )

Exemplo:

ALTER TABLE T_ACESSORIO_ROUPA


ADD (PRECO_ACESSORIO NUMBER(6,2));

Modificar

Sintaxe:

ALTER TABLE nome_da_tabela


MODIFY (nome_da_coluna tipo [ , nome_da coluna tipo] ...)

Exemplos:
1)ALTER TABLE T_ACESSORIO
MODIFY (NOME_ACESSORIO NOT NULL);

Consulting Tecnologia & Sistemas Ltda


www.consulting.com.br
36

1)2) ALTER TABLE T_ACESSORIO


MODIFY (TAMANHO_ACESSORIO VARCHAR2(15));

Podemos também adicionar e remover restrições (Constraint’s) das tabelas.

Exemplos:

a)ALTER TABLE T_EMP


ADD CONSTRAINT T_EMP_COD_GERENTE_FK
FOREIGN KEY (COD_GERENTE) REFERENCES T_EMP(COD_EMP);

a)ALTER TABLE T_EMP


DROP CONSTRAINT T_EMP_COD_GERENTE_FK;

Obs.:
A tabela do dicionário de dados Oracle, denominada USER_CONSTRAINTS contém as
restrições (Constraint’s) do Banco de Dados.

Exemplos:

1)DESCRIBE USER_CONSTRAINTS

1)SELECT CONSTRAINT_NAME, CONSTRAINT_TYPE, SEARCH_CONDITION


FROM USER_CONSTRAINTS
WHERE TABLE_NAME = ‘T_ACESSORIO_ROUPA’;

REMOVENDO COLUNA DE UMA TABELA


Para remover colunas em uma tabela usamos o comando ALTER TABLE DROP Column

Sintaxe:

ALTER TABLE NOTA DROP COLUMN Nome_da_Coluna

DELETANDO TABELAS OU VISÕES(VIEW’s)


Usamos o comando DROP TABLE | VIEW para deletarmos tabelas/visões.

Sintaxe:

DROP {TABLE | VIEW } nome_da_tabela|visão;

Exemplo:

DROP TABLE T_ALUNO;

EXERCÍCIO III

Consulting Tecnologia & Sistemas Ltda


www.consulting.com.br
37

1)Crie a tabela T_ACESSORIO_ROUPA


2)Altere a tabela, incluindo uma coluna à mesma
3)Modifique a tabela, alterando a coluna criada acima
4)Crie uma visão da tabela T_ACESSORIO_ROUPA
5)Delete a visão criada acima

CRIANDO ÍNDICES

O objetivo da criação de índices é agilizar a recuperação de dados, ou seja, acelerar a procura


dos dados na tabela. Quando criamos índices para uma tabela, especificando uma coluna, tal
tabela é classificada de tal forma que, sempre que for mencionada uma query, o sistema usará o
índice para Ter acesso direto aos dados desejados, ao invés de vasculhar a coluna toda.
Um índice é um objeto do Banco de dados como uma tabela ou visão. Criamos um índice com a
declaração CREATE INDEX, e ele é automaticamente atualizado quando a coluna (ou colunas)
a ele associada(s) sofre(m) alguma alteração.
Quando colocamos num índice várias colunas chamamos este de índice composto ou
concatenado.
A manipulação de índices é uma tarefa administrativa, cabendo sua execução ao DBA do
sistema, portanto para criar e eliminar índices no Oracle o usuário deve ser o DBA, ou seja, deve
possuir o privilégio DBA.

Sintaxe:

CREATE [UNIQUE] INDEX <nome_índice>


ON nome_da_tabela (coluna1 [ ASC | DESC ]
[ coluna2 [ ASC | DESC ] ] ... );

Usamos a palavra-chave UNIQUE para criar um índice para a chave-primária da tabela, pois
com UNIQUE valores duplicados na tabela não serão mais aceitos.

Exemplos:
1)CREATE UNIQUE INDEX IND_COD_F
ON FUNC(COD_FUNC);

1)CREATE INDEX NOM_BAIR


ON FUNC (NOME, BAIRRO);

Obs.:
a)Convém criarmos índices para colunas que, dentre outras características:
-São usadas com freqüência em cláusulas WHERE ou em Junções (JOIN’s);
-Todos os valores da coluna são únicos (UNIQUE);
-Contém intervalo grande.

a)Não convém criarmos índices:


-Se a tabela é pequena,
-A tabela é alterada com freqüência.

Consulting Tecnologia & Sistemas Ltda


www.consulting.com.br
38

a)A tabela do dicionário de dados denominada USER_INDEXES possui as informações sobre os


índices do BD.

ELIMINANDO ÍNDICES

Qualquer índice de uma tabela é eliminado automaticamente quando a tabela é eliminada. Para
eliminarmos somente o índice usamos o comando DROP.

Sintaxe:

DROP INDEX NOM_BAIR;

A tabela ou visão onde foi criado o índice não é afetada pela sua eliminação.

PRIVILÉGIOS

Nem todos os usuários do Oracle podem acessar todas as tabelas do Banco de Dados. Para
conceder ou revogar privilégios de acesso/manipulação aos usuários o DBA utiliza os comando
GRANT e REVOKE.
Podemos conceder/revogar diversos tipos de privilégios, dependendo do usuário. Se um usuário
final irá somente consultar Tabelas, Visões O DBA concederá somente privilégios de consulta
(SELECT). Entretanto para um desenvolvedor o DBA deverá dar, além de privilégios de
consulta, outros privilégios (por exemplo, privilégios de Criação/Alteração de tabelas, visões,
etc.)
Um privilégio de sistema é um privilégio poderoso que, se concedido ao usuário, dará ao mesmo
o direito de executar uma operação em nível de banco de dados. Cabe portanto ao DBA a tarefa
de definir quais usuários do Banco terão tais privilégios (poderão ser outros administradores e/ou
desenvolvedores de aplicações).

Exemplo:
Um usuário com privilégio SELECT ANY TABLE pode consultar qualquer tabela do banco.
Um usuário com o privilégio ALTER DATABASE pode alterar a estrutura física do banco,
incluindo novos arquivos.

Um privilégio de objetos do BD administra uma operação do banco de dados sobre um objeto


específico do BD (uma tabela, uma visão, ...).

Exemplo:
Um usuário com privilégio de SELECT na tabela SALÁRIOS, pode consultar a mesma.
Um outro usuário com privilégio de UPDATE, na tabela SALARIOS, poderá alterar a mesma
(ação que não poderá ser realizada pelo usuário com privilégio de SELECT apenas).

Consulting Tecnologia & Sistemas Ltda


www.consulting.com.br
39

COMANDO GRANT
Concede privilégios aos usuários Oracle cadastrados.

Sintaxe:

GRANT <privilégio> to { usuário | role | public }


[ WITH ADMIN OPTION ];

Exemplos:

1) GRANT CREATE SESSION, CREATE TABLE TO JOAO;

2) GRANT SELECT ANY TABLE TO manoel;

1)GRANT SELECT, INSERT, UPDATE, DELETE


ON T_Salario TO joaquim;

COMANDO REVOKE

O comando REVOKE retira (revoga) o privilégio concedido através do GRANT.

Sintaxe:

REVOKE {privilégio | role } FROM {usuário | role | PUBLIC };

Exemplos:

1)REVOKE SELECT ANY TABLE FROM manoel;


2)REVOKE UPDATE FROM joaquim;

AGRUPANDO PRIVILÉGIOS: “ROLE”

Tendo em vista que o Oracle possui uma infinidade de privilégios e que a quantidade e
diversidade de perfis de usuários em um banco de dados também é grande, a administração dos
privilégios de todos eles (usuários) seria um tarefa no mínimo bastante trabalhosa. Visando
dirimir este problema existe o objeto Oracle denominado ROLE. Em uma ROLE podemos
agrupar diversos privilégios e conceder aos usuários, não mais os privilégios e sim as ROLES.

Exemplo:

1)CREATE ROLE admin_salarios;

1)GRANT SELECT, INSERT, UPDATE,DELETE


ON T_SALARIOS
TO admin_salarios;
1)GRANT SELECT,INSERT, UPDATE, DELETE
ON T_COMISSOES
TO admin_salarios;

Consulting Tecnologia & Sistemas Ltda


www.consulting.com.br
40

1)GRANT admin_salarios to USUARIO_A, USUARIO_B, USUARIO_C, ...

No exemplo acima, os usuários A, B e C receberam os privilégios da ROLE admin_salarios (que


Seleciona, Insere, Altera e Elimina dados das Tabelas T_SALARIOS e T_COMISSOES).

Obs.:

O Comando REVOKE (revoga privilégios) também é utilizado com ROLES.

Exemplo:

1)REVOKE UPDATE ON T_COMISSOES FROM admin_salarios;


2)REVOKE USUARIO_B FROM admin_salarios;

ACESSANDO O SISTEMA OPERACIONAL

Para utilizar um comando do sistema operacional sem sair do SQL*Plus basta digitar o comando
HOST.

Exemplo:

HOST <comando_do_sistema_operacional>

ou

$ <comando_do_sistema_operacional>

Obs.:

-Para “ir” para o sistema operacional sem tirar o SQL*Plus da memória basta digitar o sinal de
“!” no prompt do SQL*Plus.

FUNÇÕES

Funções fazem a pesquisa de bloco mais potente, e são usadas para manipular valores. Nessa
Unidade falaremos de funções numéricas e alfanuméricas. Funções de Data, funções de
Conversão, e funções as quais operam sobre tipos de dados.

Introdução a Funções

Funções são usadas para manipular dados. Elas aceitam um ou mais argumentos e retorna um
valor. Um argumento é uma constante, refece-se a variável ou coluna. O formato para uma
função é a seguinte:

função_nome (arumento1,argument2,...)

Consulting Tecnologia & Sistemas Ltda


www.consulting.com.br
41

Funções podem ser usadas para:

•Cálculos sobre datas

•modificar valores de itens individuais

•manipular saída para grupos de linhas

•alterar formatos de datas para mostrá-los

Existem diferentes tipos de funções:


•ALFANUMÉRICAS

•NUMÉRICAS

•DATA

•CONVERSÃO

•FUNÇÕES QUE ACEITAM VÁRIOS TIPOS DE DADOS

•GRUPO

Algumas funções operam unicamente sobre linhas simples; outras manipulam grupo de linhas. A
mais comuns funções usadas estão nesse manual.

Funções de Linha Única

•age sobre cada linha retornada na pesquisa

•retorna um resultado por linha

•espera um ou mais argumento do usuário

•pode ser aninhada

•podem ser usadas com variáveis do usuário, colunas, expressões podem ser usadas por exemplo
nas : clausulas SELECT, WHERE, ORDER BY.

Explicação da notação

Notação Significado

Col qualquer nome de coluna do Banco de Dados

Value qualquer valor literal (alfanumérico/data/numérico)

n representa um número

‘string’ representa a linha de caracter

Consulting Tecnologia & Sistemas Ltda


www.consulting.com.br
42

chars representa o número de caracteres especificados

date representa uma coluna data ou valor de data

FUNÇÕES ALFANUMÉRICAS E NUMÉRICAS

Funções Alfanuméricas

Funções Alfanuméricas aceitam dados alfanuméricos e podem retornar alfanumérico ou valores


numéricos. A função seguinte influência na construção de valores alfanuméricos.

LOWER
LOWER(col/value) fornece valores alfanuméricos os quais estão em letra
maiúscula ou minúscula e retornam em letra minúscula

Para mostrar o nome dos departamentos em letra minúscula e a constante SQL COURSE, faça:
SELECT LOWER(DNAME), LOWER('SQL COURSE')
FROM DEPT;

LOWER(DNSAME) LOWER(SQL COURSE)


------------- -------------------
reseatch sql course
sales sql course
operations sql course
accounting sql course

UPPER
UPPER(col/value) fornece caracteres alfanuméricos, os quais estão em letra
maiúscula ou minúscula e retornar em letra maiúscula.

No exemplo seguinte, a função UPPER força o usuário entrar em letra maiúscula.

SELECT ENAME
FROM EMP
WHERE ENAME = UPPER('&ENAME');

Enter value for ename : smith

ENAME
----------
SMITH

INITCAP
INITCAP(col/value) força a primeira letra da Palavras ser em maiúscula e o resto
minúscula

INITCAP(DANAME) INITCAO(LOC)
--------------- ------------

Consulting Tecnologia & Sistemas Ltda


www.consulting.com.br
43

Accounting New York


Research Dallas
Sales Chicago
Operations Boston

SELECT INITCAP(DNAME), INITCAP(LOC)


FROM DEPT;

LPAD e RPAD
As funções LPAD e RPAD enchem valores alfanuméricos para tamanhos especificados.
LPAD(col/value,n,’caracter’) preenche a coluna ou valor literal da esquerda para o
total tamanho de n posições. Os principais espaços
estão preenchidos com o ‘caracter’. Se o caracter for
omitido o valor padrão é espaços.

SELECT LPAD(DNAME,20,'*'), LPAD(DNAME,20), LPAD(DEPTNO,20,'.')


FROM DEPT;

LPAD(DNAME,20,'*') LPAD(DNAME,20) LPAD(DEPTNO,20,'.')


-------------------- -------------------- --------------------
*************RESEACH RESEACH ..................20
***************SALES SALES ..................30
**********OPERATIONS OPERATIONS ..................40
***********ACCOUTING ACCOUNTING ..................10

RPAD(col/value,n,’caracter’) preenche a coluna ou valor literal da direita para o


total tamanho de n posições. Os espaços a direita são
preenchidos com o ‘caracter’. Se o ‘caracter’ for
omitido o preenchimento fica em branco.

SELECT RPAD(DNAME,20,'*'), RPAD(DNAME,20), RPAD(DEPTNO,20,'.')


FROM DEPT;

RPAD(DNAME,20,'*') RPAD(DNAME,20) RPAD(DEPTNO,20,'.')


-------------------- -------------------- --------------------
RESEACH************* RESEACH 20..................
SALES*************** SALES 30..................
OPERATIONS********** OPERATIONS 40..................
ACCOUTING*********** ACCOUNTING 10..................

Essa vez a segunda coluna é alinhada para a direita com brancos por padrão.

SUBSTR
A função seguinte assume os caracteres na linha estando numerados da esquerda para a direita
começando com 1.
SUBSTR(col/value,pos,n) Retorna um linha de n caracteres da coluna ou valor
literal, iniciando na posição número pos. Se n é omitido

Consulting Tecnologia & Sistemas Ltda


www.consulting.com.br
44

a linha é extraída da posição pos até o fim.

O próximo exemplo mostra o seguinte “sublinha”;

•quatro caracteres do literal ORACLE iniciando na segunda posição.

•conteúdo do Dname iniciando no segundo caracter.

•cinco caracteres do DNAME iniciando na terceira posição.

SELECT SUBSTR('ORACLE',2,4), SUBSTR(DNAME,2), SUBSTR(DNAME,3,5)


FROM DEPT;

SUBSTR('ORACLE',2,4) SUBSTR(DNAME,2) SUBSTR(DNAME,3,5)


-------------------- ---------------------- -----------------------
RACL ESEARCH SEAC
RACL ALES LES
RACL PERATIONS ERATI
RACL CCOUNTING COUNT

Note que os valores estão alinhados para a esquerda. Isso porque SQL*Plus sempre mostra dados
alfanuméricos alinhados para a esquerda por padrão.

INSTR
INSTR(col/value,’caracter’) encontra a primeira ocorrência do ‘caracter’.

INSTR(col/value,’caracter’,pos,n) encontra a posição do caracter do tamanho do


‘caracter’ na coluna ou valor literal iniciando na
posição número pos

SELECT DNAME, INSTR(DNAME,'A'), INSTR(DNAME,'ES'), INSTR(DNAME,'C',1,2)


FROM DEPT;

DNAME INSTR(DNAME,'A') INSTR(DNAME,'ES') INSTR(DNAME,'C',1,2)


-------------- ----------------- ----------------- --------------------
ACCOUNTING 1 0 3
RESEACH 5 2 0
SALES 2 4 0
OPERATIONS 5 0 0

LTRIM e RTRIM
LTRIM e RTRIM removem específicos caracteres de um linha.
LTRIM(col/value,’caractere(s)’) removem da esquerda principalmente ocorrências

Consulting Tecnologia & Sistemas Ltda


www.consulting.com.br
45

de caracteres (ou combinação de caracteres


específicos). Se o caracter não é especificado
cortará os brancos da esquerda

SELECT DNAME, LTRIM(DNAME,'A'), LTRIM,'AS'), LTRIM(DNAME,'ASOP')


FROM DEPT;

DNAME LTRIM(DNAME,'A') LTRIM(DNAME,'AS') LTRIM(DNAME,'ASO


P')
---------------- ---------------- ----------------- -------------------
RESEARCH RESEARCH RESEARCH RESEARCH
SALES SALES LES LES
OPERATIONS OPERATIONS OPERATIONS ERATIONS
ACCOUNTING CCOUNTING CCOUTING CCOUTING

Consulting Tecnologia & Sistemas Ltda


www.consulting.com.br
46

RTRIM(col/value,’caractere(s)’) remove da direita ocorrência de caracter(s) (ou


combinações de caracteres específicos). Se os
caracteres não forem especificados serão removidos
os brancos.

SELECT DNAME, RTRIM(DNAME,'G'), RTRIM,'GHS'), RTRIM(DNAME,'N')


FROM DEPT;

DNAME RTRM(DNAME,'G') RTRIM(DNAME,'GHS') RTRIM(DNAME


,'N')
---------------- ---------------- ------------------ -------------------
RESEARCH RESEARCH RESEARC RESEARCH
SALES SALES SALE SALES
OPERATIONS OPERATIONS OPERATION OPERATIONS
ACCOUNTING ACCOUNTING ACCOUTIN ACCOUTING

RTRIM pode ser usada para ajudar na remoção de brancos ou caracter do final de um campo.
SOUNDEX(col/value) retorna uma linha de caracteres representando o som da
palavra para um coluna ou um valor literal. Esta função
retorna a fonética representação de uma palavra, você pode
comparar palavras que tenham escrita diferente e sons iguais.

SELECT ENAME, SOUNDEX(ENAME)


FROM EMP
WHERE SOUNDEX(ENAME) = SOUNDEX('FRED');

ENAME SOUNDEX(ENAME)
---------- ---------------
FORD F630

LENGTH
LENGTH(col/value) retorna o número de caracteres na coluna ou valor literal.

SELECT LENGTH('SQL COURSE'), LENGTH(DEPTNO), LENGTH(DNAME)


FROM DEPT;

LENGTH('SQL COURSE') LENGTH(DEPTNO) LENGTH(DNAME)


-------------------- -------------- -------------
10 2 8
10 2 5
10 2 10
10 2 10

Note como a função INSTR, LENGTH retorna um valor numérico.

Consulting Tecnologia & Sistemas Ltda


www.consulting.com.br
47

TRANSLATE e REPLACE
As funções TRANSLATE e REPLACE são usadas para substituir caracteres.
TRANSLATE(col/value,from,to) transforma caracteres de para. Mais de um
caracter pode ser combinado. Todas as
ocorrências from são substituídas com a
correspondente caracter no to. Se o correspondente
to não for digitado o from será removido

SELECT ENAME, TRANSLATE(ENAME,'C','P'), JOB,


TRANSLATE(JOB,'AR','IT')
FROM EMP
WHERE DEPTNO = 10;

ENAME TRANSLATE(ENAME,'C','P') JOB TRANSLATE(JOB,'AR','IT')


----------- ------------------------ ----------- ------------------------
CLARK PLARK MENAGER MINIGET
KING KING PRESIDENT PTESIDENT
MILLER MILLER CLERK CLETK

REPLACE(col/value,linha,linha_alterada) Retorna o valor da coluna com toda a


ocorrência da linha de alteração. Se a linha
alterada for omitida todo a linha
especificada será removida.

SELECT JOB, REPLACE(JOB,'SALESMAN','SALESPERSON'),


ENAME, REPLACE(ENAME,'CO','PX')
FROM EMP;

JOB REPLACE(JOB,'SALESMAN','SALESPERSON') ENAME


REPLACE(ENAME,'CO','PX')
----------- ------------------------------------- ------------- ------------------------
ANALYST ANALYST SCOTT SPXTT
SALESMAN SALESPERSON TURNER TURNER
SALESMAN SALESPERSON ALLEN ALLEN
MANAGER MANAGER CLARK CLARK

A Função REPLACE é um complemento da função TRANSLATE que substitui caracteres um a


um e o REPLACE substitui um linha por outra.
Aninhamento de Funções
Funções de linhas únicas podem ser aninhadas para várias finalidades. Se funções são
aninhadas, elas são avaliadas de dentro para fora. Isto é por exemplo:
X(D(A(B(C(caracter))))) ordem lógica de execução “C,B,A,D e X.”

Suponhamos que você queira encontrar o número de vezes que um determinado caracter ocorre
em uma linha. Como você faria isso?

Consulting Tecnologia & Sistemas Ltda


www.consulting.com.br
48

Você pode aninhar as funções LENGTH e TRANSLATE para realizar um requisitado resultado.
O exemplo seguinte permite contar o número de Ss em uma linha
SELECT DNAME, LENGTH(DNAME),
LENGTH(DNAME) - LENGTH(TRANSLATE(DNAME,'AS','A'))
FROM DEPT;

DNAME LENGHT(DNAME) LENGTH(DNAME)-


LENGTH(TRANSLATE(DNAME,'AS','A'))
---------- ------------- -----------------------------------------------
RESEARCH 8 1
SALES 5 2
OPERATIONS 10 1
ACCOUNTING 10 0

Aqui estão os passos para realizar esse resultado


1.Usa-se o LENGTH para identificar o número de caracteres da linha.

2.Então usa a função TRANSLATE para fazer todas as ocorrências de S sair da linha.

SELECT LENGTH(TRANSLATE(DNAME,'AS','A'))
FROM DEPT;

LENGTH(TRANSLATE(DNAME,'AS','A'))
---------------------------------
REEARCH
ALE
OPERATION
ACCOUNTING
3. Note que A é modificado para A, e S não corresponde a nenhum caracter para ser alterado.
Como S não tem nenhum caracter correspondente ele é removido da linha..
4. Agora subtrai o tamanho da linha retirado os Ss do tamanho da linha original.(com os Ss)

LENGTH(DNAME)-LENGTH(TRANSLATE(DNAME,'AS','A'))

5- O Resultado é o número de ocorrências do caracter S na linha.

Funções Numéricas
As funções aceitam entrada de números e retornam valores numéricos.

ROUND
ROUND(col/value,n) arredonda um coluna, expressão ou valor para n casas decimais.
Se n é omitido não tem casas decimais. Se n for negativo, os
números para esquerda do decimal são arredondados.

SELECT ROUND(45.923,1),
ROUND(45.923),
ROUND(45.323,1),
ROUND(45.323,-1),
ROUND(SAL/32,2)
FROM EMP

Consulting Tecnologia & Sistemas Ltda


www.consulting.com.br
49

WHERE DEPTNO = 10;

ROUND(45.923,1) ROUND(45.923) ROUND(45.323,1) ROUND(45.323,-1) ROUND(SAL/32,2)


--------------- ------------- --------------- ---------------- ---------------
45.9 46 45.3 40 76.56
45.9 46 45.3 40 156.25
45.9 46 45.3 40 40.63

TRUNC
TRUNC(col/value.n) trunca a coluna, expressão ou valor para n casas decimais, ou
se n é omitido não têm casas decimais. Se n é negativo os
números para esquerda das casas decimais são truncados para
zero.

SELECT TRUNC(45.923,1),
TRUNC(45.923),
TRUNC(45.323,1),
TRUNC(45.323,-1),
TRUNC(SAL/32,2)
FROM EMP
WHERE DEPTNO = 10;

TRUNC(45.923,1) TRUNC(45.923) TRUNC(45.323,1) TRUNC(45.323,-1) TRUNC(SAL/32,2)


--------------- ------------- --------------- ---------------- ---------------
45.9 45 45.3 40 76.56
45.9 45 45.3 40 156.25
45.9 45 45.3 40 40.62

CEIL
CEIL(col/value) encontra o menor valor maior que ou igual para a coluna,
expressão ou valor.

SELECT CEIL(SAL), CEIL(99.9), CEIL(101.76), CEIL(-11.1)


FROM EMP
WHERE SAL BETWEEN 3000 AND 5000;

CEIL(SAL) CEIL(99.9) CEIL(101.76) CEIL(-11.1)


--------- ---------- ------------ -----------
3000 100 102 -11
5000 100 102 -11
3000 100 102 -11

Consulting Tecnologia & Sistemas Ltda


www.consulting.com.br
50

FLOOR
FLOOR(col/value) encontra o maior valor menor que ou igual para a coluna,
expressão ou valor

SELECT FLOOR(SAL), FLOOR(99.9), FLOOR(101.76), FLOOR(-11.1)


FROM EMP
WHERE SAL BETWEEN 3000 AND 5000;

FLOOR(SAL) FLOOR(99.9) FLOOR(101.76) FLOOR(-11.1)


---------- ----------- ------------- ------------
3000 99 101 -12
5000 99 101 -12
5000 99 101 -12

POWER
POWER(col/value,n) eleva uma coluna, expressão ou valor por uma potência, n pode
ser negativo mas deve ser um número, se não um erro será
retornado

SELECT SAL, POWER(SAL,2), POWER(SAL,3), POWER(50,5)


FROM EMP
WHERE DEPTNO = 10;

SAL POWER(SAL,2) POWER(SAL,3) POWER(50,5)


--------------- --------------- --------------- ---------------
2450.0 6002500 14706125000 312500000
5000.0 25000000 125000000000 312500000
1300.00 1690000 2197000000 312500000

SQRT
SQRT(col/value) encontra a raiz quadrada da coluna ou valor. Se a coluna ou valor
for menor que zero será retornado nulo.

SELECT SAL, SQRT(SAL), SQRT(40), SQRT(COMM)


FROM EMP
WHERE COMM > 0;
SAL SQRT(SAL) SQRT(40) SQRT(COMM)
------------ ----------------- ------------ --------------
1600.00 40 6.32455532 17.3205081
1250.00 35.3553391 6.32455532 22.3606798
1250.00 35.3553391 6.32455532 37.4165739

SIGN
SIGM(col/value) retorna -1 se a coluna, expressão ou valor é negativa ou zero e 1 se
for positivo

SELECT SAL-COMM, SIGN(SAL-COMM), COMM-SAL, SIGN(COMM-SAL)


FROM EMP
WHERE DEPTNO = 30;

Consulting Tecnologia & Sistemas Ltda


www.consulting.com.br
51

SAL-COMM SIGN(SAL-COMM) COMM-SAL SIGN(SAL-COMM)


---------------- ---------------- ---------------- ----------------
1300 1 -1300 -1
750 1 -750 -1
-150 -1 150 1
1500 1 -1500 -1

Freqüentemente a função SIGN é usada para testar um valor se é menor, maior ou igual a um
segundo valor. O seguinte exemplo apresenta todos os empregados os quais o salário é maior que
sua comissão.
SELECT ENAME, SAL, COMM
FROM EMP
WHERE SIGN(SAL-COMM) = 1;

ENAME SAL COMM


------------- ---------------- --------------
ALLEN 1600 300
WARD 1250 500
TURNER 1500 0

ABS
ABS(col/value) encontra o valor absoluto de um coluna, expressão ou valor

SELECT SAL, COMM, COMM-SAL, ABS(COMM-SAL), ABS(-35)


FROM EMP
WHERE DEPTNO = 30;

SAL COMM COMM-SAL ABS(COMM-SAL) ABS(-35)


------------ ------------ ------------ ------------ ------------
1600.00 300.00 -1300 1300 35
1250.00 500.00 -750 750 35
1250.00 1400.00 150 150 35
2850.00 35
1500.00 .00 -1500 1500 35
950.00 35

MOD
MOD(val1,val2) encontra o resto da divisão val1 por val2

SELECT SAL, COMM, MOD(SAL,COMM), MOD(100,40)


FROM EMP
WHERE DEPTNO = 30
ORDER BY COMM;

SAL COMM MOD(SAL,COMM) MOD(100,40)


--------------- --------------- --------------- ---------------
2,850.00 20
950.00 20
1,600.00 300.00 100 20
1,250.00 500.00 250 20
1,250.00 1,400.00 1250 20

Consulting Tecnologia & Sistemas Ltda


www.consulting.com.br
52

1,500.00 .00 1500 20

Exercício - Usando Funções


Esses exercícios convém o uso de funções não somente para o SELECT mas no WHERE e
ORDER BY. Se colunas sinônimas são usadas no resultado, use então na clausula SELECT da
sua declaração SQL.
Oficina
1. Liste os nomes e salários incrementados de 15% dos empregados e também os valores
mostrados inteiros.

DEPTNO ENAME PCTSAL


------ ---------- ----------
20 SMITH 920
30 ALLEN 1840
30 WARD 1438
20 JONES 3421
30 MARTIN 1438
30 BLAKE 3278
10 CLARK 3818
20 SCOTT 3450
10 KING 5750
30 TURNER 1725
20 ADAMS 1265
30 JAMES 1093
20 FORD 3450
10 MILLER 1495

2. Fazer a seguinte saída.

EMPLOYEE_AND_JOB
--------------------
SMITH CLERK
ALLEN SALESMAN
WARD SALESMAN
JONES MANAGER
MARTIN SALESMAN
BLAKE MANAGER
CLARK MANAGER
SCOTT ANALYST
KING PRESIDENT
TURNER SALESMAN
ADAMS CLERK
JAMES CLERK
FORD ANALYST
MILLER CLERK

3. Mostrar uma lista de todos os empregados com um identificador o qual é composto das
primeiras duas letras de seu cargo, o meio de dois dígitos de seu número e o código soundex do
seu nome.

NAME CODE

Consulting Tecnologia & Sistemas Ltda


www.consulting.com.br
53

---------- -----------
SMITH CL36S530
ALLEN SA49A450
WARD SA52W630
JONES MA56J520
MARTIN SA65M635
BLAKE MA69B420
CLARK MA78C462
SCOTT AN78S300
KING PR83K520
TURNER SA84T656
ADAMS CL87A352
JAMES CL90J520
FORD AN90F630
MILLER CL93M460

4. Fazer uma ferramenta intensiva de pesquisa para listar os empregados com o cargo que o
usuário entrar.

Enter value for job : clerk


EMPNO ENAME JOB MG HIREDATE SAL COMM DEPT
R NO
----- ---------- ---------- ----- --------- ---------- ---------- ------
7369 SMITH CLERK 7902 13-JUN-83 800.00 20
7876 ADAMS CLERK 7788 04-JUN-84 1,100.00 20
7900 JAMES CLERK 7698 23-JUL-84 950.00 30
7934 MILLER CLERK 7782 21-NOV-83 1,300.00 10

Se você tiver tempo:


5. Imprima um lista dos nomes de departamentos centralizados. Assuma a coluna com a largura
de 20 caracteres.

DEPARTMENT
--------------------
ACCOUNTING
OPERATIONS
RESEACH
SALES

6. Encontrar a primeira ocorrência de L no nome do empregado, e substituí-la por X.

ENAME FIRST_OCCURENCE_OF_L
---------- -------------------
SMITH SMITH
ALLEN AXLEN
WARD WARD
JONES JONES
MARTIN MARTIN
BLAKE BXAKE
CLARK CXARK
SCOTT SCOTT
KING KING
TURNER TURNER

Consulting Tecnologia & Sistemas Ltda


www.consulting.com.br
54

ADAMS ADAMS
JAMES JAMES
FORD FORD
MILLER MIXLER

Funções Numéricas e Alfanuméricas


1. SELECT DEPTNO, ENAME, ROUND(SAL*1.15)PCTSAL
FROM EMP;

2. SELECT RPAD(ENAME,10)||LPAD(JOB,10) EMPLOYEE_AND_JOB


FROM EMP;

3. SELECT ENAME NAME,


SUBSTR(JOB,1,2)||
SUBSTR(EMPNO,2,2)||
SOUNDEX(ENAME CODE
FROM EMP;

4. SELECT *
FROM EMP
WHERE UPPER(JOB) = UPPER('&JOB');

5. SELECT LPAD(' ',(20-LRNGTH(DNAME))/2)||DNAME DEPARTMENT


FROM DEPT;

6. SELECT ENAME,
TRANSLATE(SUBSTR(ENAME,1,INSTR(ENAME,'L')),'L','X')||
SUBSTR(ENAME,INSTR(ENAME,'L') + 1) FIRST_OCCURRENCE_OF_L
FROM EMP;

Mais Funções de Linha Única


Explicação dessa Unidade
Nessa Unidade nós cobriremos funções de Data, de conversão e funções que aceitam vários tipos
de entrada de dados.

Funções de Data
Funções de data operam sobre datas do ORACLE. Todas as funções de datas retornam valores
de tipo data exceto MONTHS_BETWEEN o qual retorna um valor numérico.

Consulting Tecnologia & Sistemas Ltda


www.consulting.com.br
55

Armazenamento de Datas no ORACLE

Armazenamento de Datas internamente no ORACLE formato numérico, representação:

•Século
•Ano
•Mês
•Dia
•Horas
•Minutos
•Segundos

O padrão de data mostrados nas pesquisas é DD-MON-YY.

Sysdate
Sysdate é uma coluna que retorna a data e horário corrente. Você pode usar o SYSDATE como
uma outra coluna qualquer. Por exemplo, você pode mostrar data corrente selecionando o sysdate
de uma tabela simulada chamada DUAL. A tabela DUAL é uma tabela do sistema e deve ser
permitido acessá-la para todos os usuários. Ela contém uma coluna DUMMY e uma linha com o
valor X. A tabela DUAL é usada quando você quer retornar apenas uma linha.
Para mostrar a data corrente:
SELECT SYSDATE FROM DUAL;

Você poderia facilmente selecionar o sysdate da tabela EMP, mas 14 sysdate seriam retornados.
Usando Operadores Aritméticos
Devido o fato das datas serem armazenadas como número, é possível fazer cálculos com datas
usando operadores aritméticos tal como adição e subtração. Você pode adicionar e subtrair
números constantes e bem como data de data.

As operações que você pode realizar são:

data + número Adicionando um número de dias em uma data, produzindo uma nova data

data - número subtraindo um número de dias de uma data, produzindo uma nova data

data - data subtraindo uma data de outra, produzindo um número de dias

data+número/24 adicionando um número de horas em uma data produzindo um nova data

SELECT HIREDATE, HIREDATE+7, HIREDATE-7, SYSDATE - HIREDATE


FROM EMP
WHERE HIREDATE LIKE '%JUN%';

HIREDATE HIREDATE+7 HIREDATE-7 SYSDATE-


HIREDATE
---------------- ---------------- ---------------- ----------------
13-JUN-83 20-JUN-83 06-JUN-83 1982.70628
11-JUN-84 18-JUN-84 04-JUN-84 1618.70628
04-JUN-84 11-JUN-84 28-MAY-84 1625.70628

Consulting Tecnologia & Sistemas Ltda


www.consulting.com.br
56

04-JUN-84 11-JUN-84 28-MAY-84 1625.70628

Subtraindo SYSDATE de HIREDATE coluna da tabela EMP retorna o números de dias que o
empregado está admitido.

MONSTHS_BEETWEEN
MONTHS_BETWEEN(data1,data2) encontra o número de meses entre data 1 e data2. O
resultado pode ser positivo ou negativo. Se a data 1
for posterior a data2, então o resultado será
positivo, se a data 1 for menor que a data 2 o
resultado será negativo.

SELECT MONTHS_BETWEEN(SYSDATE,HIREDATE),
MONTHS_BETWEEN('01-JAN-84','05-NOV-88')
FROM EMP
WHERE MONTHS_BETWEEN(SYSDATE,HIREDATE)> 59;

MONTHS_BETWEEN(SYSDATE,HIR MONTHS_BETWEEN('01-JAN-84','05-NOV-
EDATE) 88')
-------------------------------- ---------------------------------------
65.0873622 -58.429332
63 -58.429332
60.5067171 -58.429332
59.3454267 -58.429332
59.3454267 -58.429332
59.8292977 -58.429332

A parte não inteira do resultado representa um parcela do mês.

ADD_MONTHS
ADD_MONTHS(data,n) adiciona n números de meses na data. n deve ser inteiro e
pode ser negativo.

SELECT HIREDATE, ADD_MONTHS)HIREDATE,3), ADD_MOSTHS(HIREDATE,-3)


FROM EMP
WHERE DEPTNO = 20;

HIREDATE ADD_MONTHS)HIREDATE,3) ADD_MOSTHS(HIREDATE,-3)


---------------------- ---------------------- ----------------------
13-JUN-83 13-SEP-83 13-MAR-83
31-OCT-83 31-JAN-84 31-JUL-83
05-MAR-84 05-JUN-84 05-DEC-83
04-JUN-84 04-SEP-84 04-MAR-84
05-DEC-83 05-MAR-84 05-SEP-83

Consulting Tecnologia & Sistemas Ltda


www.consulting.com.br
57

NEXT_DAY
NEXT_DAY(data1,’caracter’) data do próximo dia especificado da semana(caracter)
seguinte data.1. Caracter deve ser um número
representado um dia, ou o dia semana descrito em
inglês.

SELECT HIREDATE, NEXT_DAY(HIREDATE,'FRIDAY'),


NEXT_DAY(HIREDATE,6)
FROM EMP
WHERE DEPTNO = 20;

HIREDATE NEXT_DAY(HIREDATE,'FRIDAY') NEXT_DAY(HIREDATE,


6)
----------------- --------------------------- --------------------
14-MAY-84 18-MAY-84 18-MAY-84
09-JUL-84 13-JUL-84 13-JUL-84
21-NOV-83 25-NOV-83 25-NOV-83

LAST_DAY
LAST_DAY(data) encontra a data do ultimo dia do mês da data especificada

SELECT SYSDATE, LAST_DAY(SYSDATE), HIREDATE,


LAST_DAY(HIREDATE), LAST_DAY('15-FEB-88')
FROM EMP
WHERE DEPTNO = 20;

SYSDATE LAST_DAY(SYSDATE) HIREDATE LAST_DAY(HIREDATE) LAST_DAY(‘15-FEB-88’)


-------------- ------------------------------- --------------- -------------------------------- ----------------------------
04-DEC-89 31-DEC-89 17-DEC-80 31-DEC-80 29-FEB-88
04-DEC-89 31-DEC-89 02-APR-81 30-APR-81 29-FEB-88
04-DEC-89 31-DEC-89 09-DEC-82 31-DEC-82 29-FEB-88
04-DEC-89 31-DEC-89 12-JAN-83 31-JAN-83 29-FEB-88
04-DEC-89 31-DEC-89 03-DEC-81 31-DEC-81 29-FEB-88

A função ROUND pode ser aplicada para datas.


ROUND(data) retorna a data com o horário em 12:00(meio-dia) Isso
usamos quando comparamos datas que tenham diferentes
horários.

ROUND(data,’MONTH’) retorna o primeiro dia do mês da data, Se a data estiver na


primeira metade do mês; se não retorna o primeiro do mês
seguinte.

ROUND(data,’YEAR’) retorna o primeiro dia do ano da data se data estiver na


primeira metade do ano; se não retorna o primeiro do ano
seguinte.

SELECT SYSDATE, ROUND(SYSDATE,'MONTH'), ROUND(SYSDATE,'YEAR')


FROM DUAL;

Consulting Tecnologia & Sistemas Ltda


www.consulting.com.br
58

SYSDATE ROUND(SYSDATE,'MONTH') ROUND(SYSDATE,'YEAR')


---------------------- ---------------------- ----------------------
04-DEC-89 01-DEC-89 01-JAN-90

TRUNC
TRUNC(data,’caracter’) encontra a data do primeiro dia do mês da data quando o
caracter = ‘MONTH’. Se o caracter = ‘YEAR’ ele encontra o
primeiro dia do ano.

SELECT SYSDATE, TRUNC(SYSDATE,'MONTH'), TRUNC(SYSDATE,'YEAR')


FROM DUAL;

SYSDATE TRUNC(SYSDATE,'MONTH') TRUNC(SYSDATE,'YEAR')


---------------------- ---------------------- ----------------------
04-DEC-89 01-DEC-89 01-JAN-89

TRUNC é usado se você quiser remover o horário do dia. O horário contido no dia é removido
por padrão.

Funções de Conversão

SQL possui um número de funções para controlar os tipos de conversão de dados. Essas funções
de conversões converte um valor de um tipo de dado para outro.

TO_CHAR(número,data,’formato’) converte números e datas para formatos


alfanuméricos

TO_NUMER(caracter) converte alfanuméricos os quais possuem números


para numéricos.

TO_DATE(‘caracter’,’formato’) converte um alfanumérico representando uma data,


para um valor de data de acordo com o formato
especificado. Se o formato é omitido o formato
padrão é ‘DD=MON-YY’.

TO_CHAR
A função TO_CHAR é freqüentemente usada para modificar um formato de data padrão para um
formato alternativo para mostrar.
TO_CHAR(data,’máscara’) especifica que a data está sendo convertida para um novo
formato na saída.

Para converter a data corrente do formato padrão (DD-MON-YY) para uma nova máscara.
SELECT TO_CHAR(SYSDATE,'DAY, DDTH MONTH YYYY')
FROM DUAL;

TO_CHAR(SYSDATE,'DAY, DDTH MONTH YYYY')


---------------------------------------
TUESDAY , 05TH SEPTEMBER 1989

Consulting Tecnologia & Sistemas Ltda


www.consulting.com.br
59

Note que:
•A ‘máscara’ a qual deve estar entre aspas simples, pode ser incluída em vários formatos
listados anteriormente. A coluna e ‘máscara’ deve ser separadas por uma vírgula.

•DAY e MONTH na saída são espaçados automaticamente com brancos no tamanho de 9


caracteres

Para remover um espaço em branco usar o FM(maneira de enchimento) prefixo:


SELECT TO_CHAR(SYSDATE,'DAY, DDTH MONTH YYYY')
FROM DUAL;

TO_CHAR(SYSDATE,'DAY, DDTH MONTH YYYY')


---------------------------------------
TUESDAY, 05TH SEPTEMBER 1989

•FM pode ser usado para suprimir zeros para o formato ddth, ex.:
05TH é alterado para 5TH

•A formato que a data será entrada é o formato que será mostrado.

TO_CHAR pode também ser usado para extrair o horário de um único dia, e mostrá-lo no
especificado formato.
Para mostrar o formato de um dia:
SELECT TO_CHAR(SYSDATE,'HH:MI:SS')
FROM DUAL;

TO_CHAR(SYSDATE,'HH:MI:SS')
---------------------------------------
08:16:24

A função TO_CHAR é também usada para converter um valor do tipo numérico para um valor
do tipo alfanumérico.
TO_CHAR(numer,’número máscara’)
SELECT TO_CHAR(SAL,'$9,999')
FROM EMP;

TO_CHAR(SAL,'$9,999')
----------------------
$1,000
$1,600
$1,250
$2,975

Note que os formatos das máscaras são opcionais. Se a ‘máscara’ é omitida, a data é convertida
para um alfanumérico valor ORACLE que é padrão DD-MON-YY. Se o ‘máscara’ não é
especificada, o número é convertido para alfanumérico.
Então note que o formato modelo não afetam o valor interno que representam o valor das
colunas. Eles somente afetam como a coluna é mostrada quando retirada com uma declaração
SELECT.

Consulting Tecnologia & Sistemas Ltda


www.consulting.com.br
60

Formatos de Data
Máscara Significado

SCC ou CC Século, prefixo ‘S’ “BC”data com ‘-’

YYYY ou SYYYY Ano, prefixo ‘S’ “BC” data com ‘-’

YYY ou YY ou Y Último 3, 2 ou 1 digito(s) do ano

Y,YYY Ano com vírgula nessa posição

SYEAR ou YEAR Ano, soletrado na saída ‘S’ prefixo “BC” data com ‘-’

BC ou AD BC/AD período

B.C. ou A.D. BC/AD indicador com períodos

Q Um quarto do Ano

MM Mês

MONTH nome do mês, espaçamento com brancos do tamanho de 9


caracteres

MON nome do mês, 3 letras abreviadas

WW ou W Semana do ano ou mês

DDD ou DD ou D dia do ano, mês ou semana

DAY nome do dia, espaçado com brancos com 9 caracteres de


tamanho

DY nome do dia, 3 letras abreviadas

J data Juliana, o número de dias desde 31 dezembro 4713


antes de Cristo

AM ou PM Indicador meridiano

A.M. ou P.M. indicador meridiano com períodos

HH ou HH12 horas do dia (1-12)

HH24 horas do dia (0-23)

MI minuto

SS segundos

SSSSS segundos passado meia-noite(0-86399)

/.,etc. pontuação é reproduzida no resultado

Consulting Tecnologia & Sistemas Ltda


www.consulting.com.br
61

“...” cotas de linhas são representadas no resultado.

Os prefixos abaixo devem ser adicionados em frente aos códigos.


Fm (mode de enchimento) Prefixo para MONTH ou DAY suprime
os espaçamentos em brancos, partindo um tamanho de uma
variável, FM suprimirá zeros para o formato ddth. Não significa
que em outros códigos uma segunda ocorrência for FM torne
brancos os espaços de novo.

Os sufixos abaixo devem ser adicionados em frente dos códigos:


TH número ordinal(“DDTH” para “4TH”)

SP soletrando saída do número(“DDSP” para “FOUR”)

SPTH ou thsp soletra o número ordinal na saída(“DDSPTH”para “FOURTH”)

Nota: Os códigos são ferramentas sensitivas e afetaram a amostragem dos elementos da data:
DAY MONDAY
Day Monday
Month July
Ddth 14th
DdTh 14Th

Formatos Numéricos
Os elementos do formato numérico modelo são:

Máscara Significado Exemplo

9 posição numérica (número de 9s determinam a 999999 1234


largura mostrada)

0 mostra zeros 0999999 001234

$ mostra sinal de dólar $999999 $1234

. ponto decimal na posição especificada 999999.99 1234.00

, vírgula na posição especificada 999,999 1,234

MI sinal de menos à direita(valores negativos) 999999MI 1234-

PR parênteses para números negativos 999999PR <1234>

EEEE notação científica(formato de conter quatro Es 99.999EEEE 1.234E+


unicamente) 03

V multiplica pela décima potência 10n(n = número 9s 9999V99 123400


depois da V

B mostra valores zero em branco, não zero B9999.99 1234.00

Nota:

Consulting Tecnologia & Sistemas Ltda


www.consulting.com.br
62

A lista de formatos numéricos listas acima na tabela podem ser usados no comando Column do
SQL*Plus (Ver Unidade 10).

TO_NUMBER

No seguinte exemplo a função TO_NUMBER é usada para transformar um número armazenado


como um alfanumérico para um tipo numérico:

SELECT EMPNO, ENAME, JOB, SAL


FROM EMP
WHERE SAL > TO_NUMBER('1500');

EMPNO ENAME JOB SAL


----- ---------- ---------- ----------
7499 ALLEN SALESMAN 1600
7566 JONES MANAGER 2975
7698 BLAKE MANAGER 2850
7782 CLARK MANAGER 2450
7788 SCOTT ANALYST 3000
7839 KING PRESIDENT 5000
7902 FORD ANALYST 3000

TO_DATE

Para mostrar todos os empregados admitidos em 4 de junho de 1984 (não formato padrão), nós
podemos usar a função TO_DATE:

SELECT EMPNO, ENAME, HIREDATE


FROM EMP
WHERE HIREDATE = TO_DATE('June 4,1984','Month dd, yyyy');

EMPNO ENAME HIREDATE


----- ---------- ---------
7844 TURNER 04-JUN-84

O conteúdo é convertido para data e comparado com o valor de HIREDATE.


A função TO_DATE é freqüentemente usada para suprir o valor ORACLE em um outro valor
que o do padrão, Por exemplo, quando você insere um data, o ORACLE espera ser passado o
valor no formato padrão DD-MON-YY. Se você não quer usar o formato padrão, você deve
usar a função TO_DATE e apropriar o alternativo formato

Por exemplo:

Para entrar um linha na tabela EMP com a data não no formato padrão:

INSERT INTO EMP (EMPNO, DEPTNO,HIREDATE)

Consulting Tecnologia & Sistemas Ltda


www.consulting.com.br
63

VALUES(7777,20,TO_DATE('19/08/90','DD/MM/YY'));

Funções que Aceitam Vários Tipos de Entrada de Dados

DECODE

DECODE é a mais potente função do SQL. Ele facilita pesquisas condicionais fazendo o
trabalho de ‘ferramentas’ ou comandos ‘se-então-se não’.
Sintaxe:
DECODE(col/expressão,
procurado1,resultado1,...,padrão)

Col/expressão é comparado com cada um dos valores procurado e retorna o resultado se a


col/expressão é igual ao valor procurado. Se não for encontrada nenhum dos valores procurados,
a função DECODE retorna o valor padrão. Se o valor padrão for omitido ele retornará um valor
nulo.

Argumentos

DECODE deve ter no mínimo 4 parâmetros ou argumentos.

•COL/EXPRESSÃO - a nome da coluna ou expressão a ser avaliado.

•PROCURADO1 - o primeiro valor para ser testado

•RESULTADO1- o valor para ser retornado se o procurado1 for encontrado.

•PROCURADO1 e RESULTADO1 podem ser repetidos quantas vezes forem necessários.-


(PROCURADO2,RESULTADO2, PROCURADO3,RESULTADO3,...)

•PADRÃO - o valor a ser retornado se nenhum procurado for encontrado.

Nota:
•col/expressão pode ser vários tipos de dados.

•PROCURADO deve ser um dado do tipo coluna ou expressão

•O valor retornado é forçado para alguns tipos de dados como o terceiro


argumento(resultado1).

O seguinte exemplo decodifica os cargos dos tipos MANAGER e CLERK unicamente. Os


outros cargos serão padrão alterados para UNDEFINED.

SELECT ENAME, JOB,


DECODE(JOB,'CLERK','WORKER',

Consulting Tecnologia & Sistemas Ltda


www.consulting.com.br
64

'MANAGER','BOSS',
'UNDEFINED' DECODE_JOB
FROM EMP;

ENAME JOB DECODE_JOB


---------- ---------- ----------
SMITH CLERK WORKER
ALLEN SALESMAN UNDEFINED
WARD SALESMAN UNDEFINED
JONES MANAGER BOSS
MARTIN SALESMAN UNDEFINED
BLAKE MANAGER BOSS
CLARK MANAGER BOSS
SCOTT ANALYST UNDEFINED
KING PRESIDENT UNDEFINED
TURNER SALESMAN UNDEFINED
ADAMS CLERK WORKER
JAMES CLERK WORKER
FORD ANALYST UNDEFINED
MILLER CLERK WORKER

Para mostrar a gratificação percentual dependendo do grau do salário:


SELECT GRADE,
DECODE(GRADE,'1','15%',
'2','10%'
'3','8%',
'5%') BONUS FROM SALGRADE;

GRADE BONUS
--------- -----
1 15%
2 10%
3 8%
4 5%
5 5%

Esse exemplo ilustra como a função decode, o valor retornado é forçado a ter um tipo de dado no
terceiro argumento.
Nós permitimos o usuário especificar a ordem na qual a informação empregado é mostrada por
entrada de um valor na hora da execução

select * from emp


order by decode(&orderby,
1,sal,
2,ename
sal);
Enter value for orderby: 2

Consulting Tecnologia & Sistemas Ltda


www.consulting.com.br
65

ERROR at line 2: ORA-1722: invalid number

Note que esse comando causa um erro porque o tipo de dado de ename (alfanumérico) diferente
que o do sal (numérico) o qual é o terceiro argumento. No exemplo abaixo, nós queremos
retornar o salário incrementado de acordo com o tipo de cargo.
SELECT JOB, SAL, DECODE(JOB,'ANALYST',SAL*1.1,
'CLERK',SAL*1.15,
'MANAGER',SAL*.095,
SAL)
FROM EMP;

NVL
NVL(col/valor,valor) converte um valor nulo para um valor desejado. Tipo de dados
devem combinar(col/valor e valor).

SELECT SAL*12+NVL(COMM,0), NVL(COMM,1000), SAL*12+NVL(COMM,1000)


FROM EMP
WHERE DEPTNO = 10;

SAL*12+NVL(COMM,0) NVL(COMM,1000) SAL*12+NVL(COMM,1000)


--------------------- --------------------- ---------------------
29400 1000 30400
60000 1000 61000
15600 1000 16600

GREATEST
GREATEST(col/valor1,col/valor2,...) retorna o maior da lista de valores. Todos os
col/valores são convertidos para um valor antes da
comparação.

SELECT GREATEST(1000,2000), GREATEST(SAL,COMM)


FROM EMP
WHERE DEPTNO = 30;

GREATEST(1000,2000), GREATEST(1000,2000),
----------------------- -----------------------
2000 1600
2000 1250
2000 1400
2000
2000 1500

Nota: Na função GREATEST quando na lista de valores existe um valor nulo ele é considerado
como o maior.

LEAST
LEAST(col/valor1,col/valor2,...) retorna o menor valor de um lista de valores. Todos os
valores são convertidos antes da comparação.

SELECT LEAST(1000,2000), LEAST(SAL,COMM)

Consulting Tecnologia & Sistemas Ltda


www.consulting.com.br
66

FROM EMP
WHERE DEPTNO = 30;

LEAST(1000,2000), LEAST(1000,2000),
----------------------- -----------------------
1000 300
1000 500
1000 1250
1000
1000 0

Nota: Na função LEAST quando na lista de valores existe um valor nulo ele é considerado como
o menor.

VSIZE
VSIZE(col/valor) retorna o número de bytes interno do ORACLE representando um
col/valor.

SELECT DEPTNO, VSIZE(DEPTNO), VSIZE(HIREDATE), VSIZE(SAL), VSIZE(ENAME)


FROM EMP
WHERE DEPTNO = 10;

DEPTNO VSIZE(DEPTNO) VSIZE(HIREDATE) VSIZE(SAL) VSIZE(ENAME)


------- ------------- ------------- ------------- -------------
10 2 7 3 5
10 2 7 2 4
10 2 7 2 6

Revisando Aninhamento de Funções


Relembrando que funções podem ser aninhadas em vários níveis, e que o interior do aninhamento
é avaliado primeiro, trabalhamos com a última função externa. Ela é então seguida de um trilha
de abertura e fechamento de parênteses, que deve ser o número de cada uma.

As funções abaixo tem sido aninhadas e são executadas como a seguir:

SELECT ENAME, NVL(TO_CHAR(MGR),'UNMANAGEABLE')


FROM EMP
WHERE MGR IS NULL;

ENAME NVL(TO_CHAR(MGR),'UNMANAGEABLE')
--------- ---------------------------------
KING UNMANAGEABLE

1. MGR é um coluna convertida para alfanumérica com a função TO_CHAR.


2. A função NVL troca um MGR nulo por uma linha de caracteres ‘UNMANAGEABLE’.

Consulting Tecnologia & Sistemas Ltda


www.consulting.com.br
67

Funções aninhadas podem então serem usadas para mostrar a data de Quinta-feira que é de dois
meses de hoje no formato de ‘Day dd Month YYYY’.
SELECT SYSDATE,
TO_CHAR(NEXT_DAY(ADD_MONTHS(SYSDATE,2),'FRIDAY'),'Day dd Month YYYY')
FROM DUAL;

SYSDATE TO_CHAR(NEXT_DAY(ADD_MONTHS(SYSDATE,2),'FRIDAY'),'Day
dd Month YYYY')
--------- ---------------------------------------------------------------------
04-DEC-89 09 February 1990

1. A função ADD_MONTHS adiciona dois meses para o corrente mês (dezembro).


2. A função NEXT_DAY encontra a Quinta-feira dois meses de SYSDATE.
3. A função TO_CHAR converte a coluna data para um tipo de alfanumérico na ordem para
mostrar um não formato padrão de data ‘Day dd Month YYYY’.

Continuidade do Aprendizado

Todas as dúvidas poderão ser enviadas para

Edson Almeida Junior


edson@consulting.com.br
MSN: eajr@hotmail.com

Ou

Maximiliano Henriques
maxh@bol.com.br
MSN: maxh@bol.com.br

Dica:

É importante que todos façam sua inscrição no Fórum Oracle Tools

http://br.groups.yahoo.com/group/oracle_tools/

Para Entrar no grupo envie uma mensagem para:


oracle_tools-subscribe@yahoogrupos.com.br

Para Sair do grupo envie uma mensagem para:


oracle_tools-unsubscribe@yahoogrupos.com.br

Consulting Tecnologia & Sistemas Ltda


www.consulting.com.br

Vous aimerez peut-être aussi