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 Entidadetipo 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 subatributos.
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
Cod_Departamento
Nome_Funcionario
- CHAR(06)
- CHAR(05)
- 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.
VARCHAR2, NUMBER, DATE.
Os tipos básicos são:
CHAR,
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
MATRICULA
NOME_ALUNO
NULL
NOT NULL
NOT NULL
Type
VARCHAR2(06)
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
---------SMITH
ALLEN
WARD
JONES
SAL+250*12
---------3800
4600
4250
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
---------SMITH
ALLEN
WARD
JONES
(SAL+250)*12
-----------12600
22200
18000
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
NOT BETWEEN
NOT IN
Descrição
não se encontra entre dois valores dados
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
L[IST]
A[PPEND] texto
C[HANGE]/texto_anterior/texto_novo
DEL
I[NPUT]
n
n texto
Descrição
Lista o último comando SQL digitado.
Acrescenta texto no fim da linha corrente
Troca o texto_anterior para texto_novo
Apaga a linha corrente
Acrescenta uma ou mais linhas após a linha corrente;
para sair no modo Input pressione Enter
Faz com que a linha n passe a ser a linha corrente.
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
FROM
WHERE
EMPNO, ENAME, SAL
EMP
DEPTNO = &DEPARTMENT_NUMBER;
Enter value for department_number : 10
EMPNO ENAME
-------------7782 CLARK
7839 KING
7934 MILLER
SAL
---------2,450.00
5,000.00
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
FROM
WHERE
ENAME, DEPTNO, SAL*12
EMP
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
30
20
30
30
10
20
10
30
20
30
20
10
133.333
104.167
247.917
104.167
237.5
204.167
250
416.667
125
91.6667
79.1667
250
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
-------------CLARK
KING
MILLER
DEPTNO
-----------10
10
10
JOB
------------MANAGER
PRESIDENT
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
---------SMITH
JAMES
ADAMS
WARD
MILLER
MARTIN
TURNER
ALLEN
CLARK
BLAKE
JONES
SCOTT
FORD
KING
JOB
---------CLERK
CLERK
CLERK
SALESMAN
CLERK
SALESMAN
SALESMAN
SALESMAN
MANAGER
MANAGER
MANAGER
ANALYST
ANALYST
PRESIDENT
SAL*12+NVL(COMM,0)
-----------------9600
11400
13200
15500
15600
16400
18000
19500
29400
34200
35700
36000
36000
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)
(HIDE)
variable (NUMERICO/ALFANUMERICO) (PROMPT/NOPROMPT
'texto')
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
COD_ALIMENTO
NUMÉRICO
04
NOME_ALIMENTO
ALFANUMÉRICO
30
PREÇO
NUMÉRICO
6,2
PROTEÍNAS
NUMÉRICO
6,2
OBRIGATÓRIO
S
S
N
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
UPDATE
COMMIT
ROLLBACK
Remove/Deleta linhas da tabela.
Altera/Modifica linhas.
Ratifica transações efetuadas.
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', '[email protected]','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
NOT NULL
preenchimento obrigatório).
UNIQUE
PRIMARY KEY
FOREIGN KEY
CHECK
OBJETIVO
Não permitir campos nulos (usada para campos de
Especifica que o campo não poderá conter valores duplicados.
Especifica-se esta Constraint para os atributos identificadores
das tabelas (chaves primárias)
Para definição de chaves estrangeiras (foreign key),
estabelecendo relacionamentos entre tabelas do BD.
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,'*')
-------------------*************RESEACH
***************SALES
**********OPERATIONS
***********ACCOUTING
RPAD(col/value,n,’caracter’)
LPAD(DNAME,20)
-------------------RESEACH
SALES
OPERATIONS
ACCOUNTING
LPAD(DEPTNO,20,'.')
-------------------..................20
..................30
..................40
..................10
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,'*')
-------------------RESEACH*************
SALES***************
OPERATIONS**********
ACCOUTING***********
RPAD(DNAME,20)
-------------------RESEACH
SALES
OPERATIONS
ACCOUNTING
RPAD(DEPTNO,20,'.')
-------------------20..................
30..................
40..................
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’)
INSTR(col/value,’caracter’,pos,n)
encontra a primeira ocorrência do ‘caracter’.
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')
---------------RESEARCH
SALES
OPERATIONS
ACCOUNTING
---------------RESEARCH
SALES
OPERATIONS
ACCOUNTING
-----------------RESEARC
SALE
OPERATION
ACCOUTIN
RTRIM(DNAME
,'N')
------------------RESEARCH
SALES
OPERATIONS
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')
REPLACE(ENAME,'CO','PX')
----------- ------------------------------------- ------------- -----------------------ANALYST ANALYST
SCOTT
SPXTT
SALESMAN SALESPERSON
TURNER
TURNER
SALESMAN SALESPERSON
ALLEN
ALLEN
MANAGER MANAGER
CLARK
CLARK
ENAME
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(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
LENGTH(DNAME)-
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
45.9
45.9
------------46
46
46
--------------45.3
45.3
45.3
---------------40
40
40
--------------76.56
156.25
40.63
TRUNC
TRUNC(col/value.n)
SELECT
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.
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.9
45.9
------------45
45
45
--------------45.3
45.3
45.3
---------------40
40
40
--------------76.56
156.25
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)
--------3000
5000
3000
CEIL(99.9)
---------100
100
100
CEIL(101.76)
-----------102
102
102
CEIL(-11.1)
-----------11
-11
-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)
---------3000
5000
5000
FLOOR(99.9)
----------99
99
99
POWER
POWER(col/value,n)
FLOOR(101.76)
------------101
101
101
FLOOR(-11.1)
------------12
-12
-12
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
--------------2450.0
5000.0
1300.00
SQRT
SQRT(col/value)
POWER(SAL,2)
--------------6002500
25000000
1690000
POWER(SAL,3)
--------------14706125000
125000000000
2197000000
POWER(50,5)
--------------312500000
312500000
312500000
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
---------------1300
750
-150
1500
SIGN(SAL-COMM)
---------------1
1
-1
1
COMM-SAL
----------------1300
-750
150
-1500
SIGN(SAL-COMM)
----------------1
-1
1
-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
------------ALLEN
WARD
TURNER
SAL
---------------1600
1250
1500
ABS
ABS(col/value)
COMM
-------------300
500
0
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
-----------1600.00
1250.00
1250.00
2850.00
1500.00
950.00
COMM
-----------300.00
500.00
1400.00
COMM-SAL
------------1300
-750
150
ABS(COMM-SAL)
-----------1300
750
150
.00
-1500
1500
ABS(-35)
-----------35
35
35
35
35
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
--------------2,850.00
950.00
1,600.00
1,250.00
1,250.00
COMM
---------------
MOD(SAL,COMM)
---------------
300.00
500.00
1,400.00
100
250
1250
Consulting Tecnologia & Sistemas Ltda
www.consulting.com.br
MOD(100,40)
--------------20
20
20
20
20
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
-----20
30
30
20
30
30
10
20
10
30
20
30
20
10
ENAME
---------SMITH
ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
SCOTT
KING
TURNER
ADAMS
JAMES
FORD
MILLER
PCTSAL
---------920
1840
1438
3421
1438
3278
3818
3450
5750
1725
1265
1093
3450
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
ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
SCOTT
KING
TURNER
ADAMS
JAMES
FORD
MILLER
----------CL36S530
SA49A450
SA52W630
MA56J520
SA65M635
MA69B420
MA78C462
AN78S300
PR83K520
SA84T656
CL87A352
CL90J520
AN90F630
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
----7369
7876
7900
7934
---------SMITH
ADAMS
JAMES
MILLER
---------CLERK
CLERK
CLERK
CLERK
MG
R
----7902
7788
7698
7782
HIREDATE
SAL
--------13-JUN-83
04-JUN-84
23-JUL-84
21-NOV-83
---------800.00
1,100.00
950.00
1,300.00
COMM
----------
DEPT
NO
-----20
20
30
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
---------SMITH
ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
SCOTT
KING
TURNER
FIRST_OCCURENCE_OF_L
------------------SMITH
AXLEN
WARD
JONES
MARTIN
BXAKE
CXARK
SCOTT
KING
TURNER
Consulting Tecnologia & Sistemas Ltda
www.consulting.com.br
54
ADAMS
JAMES
FORD
MILLER
ADAMS
JAMES
FORD
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
---------------13-JUN-83
11-JUN-84
04-JUN-84
---------------20-JUN-83
18-JUN-84
11-JUN-84
---------------06-JUN-83
04-JUN-84
28-MAY-84
Consulting Tecnologia & Sistemas Ltda
www.consulting.com.br
SYSDATEHIREDATE
---------------1982.70628
1618.70628
1625.70628
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
EDATE)
-------------------------------65.0873622
63
60.5067171
59.3454267
59.3454267
59.8292977
MONTHS_BETWEEN('01-JAN-84','05-NOV88')
---------------------------------------58.429332
-58.429332
-58.429332
-58.429332
-58.429332
-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
---------------------13-JUN-83
31-OCT-83
05-MAR-84
04-JUN-84
05-DEC-83
ADD_MONTHS)HIREDATE,3)
---------------------13-SEP-83
31-JAN-84
05-JUN-84
04-SEP-84
05-MAR-84
ADD_MOSTHS(HIREDATE,-3)
---------------------13-MAR-83
31-JUL-83
05-DEC-83
04-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
----------------14-MAY-84
09-JUL-84
21-NOV-83
NEXT_DAY(HIREDATE,'FRIDAY') NEXT_DAY(HIREDATE,
6)
---------------------------------------------18-MAY-84
18-MAY-84
13-JUL-84
13-JUL-84
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
-------------04-DEC-89
04-DEC-89
04-DEC-89
04-DEC-89
04-DEC-89
LAST_DAY(SYSDATE)
------------------------------31-DEC-89
31-DEC-89
31-DEC-89
31-DEC-89
31-DEC-89
HIREDATE
--------------17-DEC-80
02-APR-81
09-DEC-82
12-JAN-83
03-DEC-81
LAST_DAY(HIREDATE)
-------------------------------31-DEC-80
30-APR-81
31-DEC-82
31-JAN-83
31-DEC-81
LAST_DAY(‘15-FEB-88’)
---------------------------29-FEB-88
29-FEB-88
29-FEB-88
29-FEB-88
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
---------------------04-DEC-89
ROUND(SYSDATE,'MONTH')
---------------------01-DEC-89
TRUNC
TRUNC(data,’caracter’)
ROUND(SYSDATE,'YEAR')
---------------------01-JAN-90
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
---------------------04-DEC-89
TRUNC(SYSDATE,'MONTH')
---------------------01-DEC-89
TRUNC(SYSDATE,'YEAR')
---------------------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
alfanuméricos
e
datas
para
formatos
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
largura mostrada)
1234
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
unicamente)
1.234E+
03
V
multiplica pela décima potência 10n(n = número 9s 9999V99
depois da V
123400
B
mostra valores zero em branco, não zero
1234.00
Nota:
Consulting Tecnologia & Sistemas Ltda
www.consulting.com.br
B9999.99
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
----7499
7566
7698
7782
7788
7839
7902
ENAME
---------ALLEN
JONES
BLAKE
CLARK
SCOTT
KING
FORD
JOB
---------SALESMAN
MANAGER
MANAGER
MANAGER
ANALYST
PRESIDENT
ANALYST
SAL
---------1600
2975
2850
2450
3000
5000
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
---------SMITH
ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
SCOTT
KING
TURNER
ADAMS
JAMES
FORD
MILLER
JOB
---------CLERK
SALESMAN
SALESMAN
MANAGER
SALESMAN
MANAGER
MANAGER
ANALYST
PRESIDENT
SALESMAN
CLERK
CLERK
ANALYST
CLERK
DECODE_JOB
---------WORKER
UNDEFINED
UNDEFINED
BOSS
UNDEFINED
BOSS
BOSS
UNDEFINED
UNDEFINED
UNDEFINED
WORKER
WORKER
UNDEFINED
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)
--------------------29400
60000
15600
NVL(COMM,1000)
--------------------1000
1000
1000
SAL*12+NVL(COMM,1000)
--------------------30400
61000
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),
----------------------2000
2000
2000
2000
2000
GREATEST(1000,2000),
----------------------1600
1250
1400
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),
----------------------1000
1000
1000
1000
1000
LEAST(1000,2000),
----------------------300
500
1250
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
------10
10
10
VSIZE(DEPTNO)
------------2
2
2
VSIZE(HIREDATE)
------------7
7
7
VSIZE(SAL)
------------3
2
2
VSIZE(ENAME)
------------5
4
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
--------KING
NVL(TO_CHAR(MGR),'UNMANAGEABLE')
--------------------------------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
--------04-DEC-89
TO_CHAR(NEXT_DAY(ADD_MONTHS(SYSDATE,2),'FRIDAY'),'Day
dd Month YYYY')
--------------------------------------------------------------------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
[email protected]
MSN: [email protected]
Ou
Maximiliano Henriques
[email protected]
MSN: [email protected]
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:
[email protected]
Para Sair do grupo envie uma mensagem para:
[email protected]
Consulting Tecnologia & Sistemas Ltda
www.consulting.com.br
Download

Curso de Introdução a Banco de Dados Oracle SQL