Você está na página 1de 19

Introduo ao conceito de Tablespaces

Comecemos com a seguinte pergunta: Qual a relao entre tablespaces e arquivos de dados? Bom, para
responder esta pergunta, primeiro precisamos entender como os dados so armazenados no banco de
dados. O Oracle armazena dados logicamente em tablespaces e fisicamente em arquivos de dados
(datafiles). Apesar dos arquivos de dados e os tablespaces estarem muito "inter-relacionados", os
mesmos possuem diferenas importantes:

Um banco de dados Oracle consiste em uma ou mais unidades de armazenamento lgicas
denominadas tablespaces, que armazenam coletivamente todos os dados do banco de dados.
Cada tablespace em um banco de dados Oracle consiste em um ou mais arquivos denominados
arquivos de dados (datafiles), que so estruturas fsicas compatveis com o sistema operacional no qual o
Oracle executado.
Os dados de um banco de dados so armazenados coletivamente nos arquivos de dados que
constituem cada tablespace do banco de dados.

Como um banco de dados um conjunto de arquivos de dados, muito importante que entendamos
como um banco de dados Oracle agrupa esses arquivos. Como dito anteriormente, o Oracle faz isso sob a
proteo de um objeto de banco de dados chamado tablespace. Antes de poder inserir dados em um
banco de dados Oracle, primeiro necessrio criar um tablespace e depois uma tabela dentro desse
tablespace que conter os dados. Podemos observar que na criao de um banco de dados utilizando o
DBCA, o Oracle como padro sempre cria um tablespace de dados chamado USERS. Ao criar uma tabela
necessrio incluir todas as informaes sobre o tipo de dados que deseja manter. O cdigo abaixo, gerado
para criar a tabela CLIENTE, ilustra como o Oracle armazena informaes sobre o tipo de dado que ir
registrar:

SQL> create table cliente
2 (cod_cliente number constraint pk_cliente primary key,
3 nome varchar2(60) not null,
4 endereco varchar2(100) not null,
5 telefone number,
6 data_cadastro date)
7 tablespace users;

Tabela criada.

SQL> desc cliente
Nome Nulo? Tipo
----------------------------- -------- --------------------
COD_CLIENTE NOT NULL NUMBER
NOME NOT NULL VARCHAR2(60)
ENDERECO NOT NULL VARCHAR2(100)
TELEFONE NUMBER
DATA_CADASTRO DATE




SQL> select table_name,tablespace_name
2 from user_tables
3 where table_name='CLIENTE';

TABLE_NAME TABLESPACE_NAME
------------------------------ ------------------------------
CLIENTE USERS


Na instruo acima, foi criada uma tabela que o meio mais comum de armazenar dados em um banco
de dados. Os dados de um segmento de tabela so armazenados aleatoriamente no tablespace e o DBA
tem pouco controle sobre a localizao das linhas dos blocos de uma tabela. Por falar nisso, o que um
segmento? Os segmentos so objetos que ocupam espao em um banco de dados. Existem vrios tipos
de segmentos como tabelas, ndices, de undo, temporrios, LOB, entre outros. J uma extenso (extent),
um espao usado por um segmento em um tablespace. Para terminar, um bloco Oracle consiste em um
ou mais blocos do sistema operacional e seu tamanho definido na criao do tablespace. Ento a
estrutura lgica de um banco de dados Oracle se resume em tablespaces que contm segmentos que
contm extenses que contm blocos. A figura abaixo ilustra esta estrutura lgica:

estrutura lgica de um banco de dados Oracle

SQL> select segment_name, segment_type, tablespace_name,
2 bytes, blocks, extents
3 fromuser_segments
4 where segment_name='CLIENTE';


SEGMENT_NAME SEGMENT_TYPE TABLESPACE_NAME BYTES BLOCKS EXTENTS
-------------- ------------ ---------------- -------- ------- ---------
CLIENTE TABLE USERS 65536 8 1


Vale a pena salientar que foi includo o nome do tablespace USERS no comando de criao da tabela,
apenas para exemplificar, j que uma tabela sempre ser criada no tablespace padro do usurio definido
na sua criao (create user).

SQL> select default_tablespace from user_users;

DEFAULT_TABLESPACE
------------------------------
USERS







Agora que voc entende porque isso se chama tablespace, vamos tentar compreender porque
precisamos de tablespaces para agrupar arquivos de dados. A melhor analogia para se explicar banco de
dados, tablespace, arquivo de dados, tabelas e dados a imagem de um fichrio. Imagine um banco de
dados como um fichrio: as gavetas dentro do fichrio so os tablespaces; as pastas nessas gavetas so os
arquivos de dados; os papis em cada pasta so as tabelas; a informao escrita no papel de cada pasta
so os dados. Em resumo, o tablespace um modo de agrupar arquivos de dados

aconselhvel no misturar dados de aplicativos no mesmo tablespace. Ento, ao criar tablespaces para
seus aplicativos, d a eles um nome descritivo (por exemplo, dados de um sistema de RH podem ser
mantidos no tablespace RECURSOS_HUMANOS). Em resumo, aplicao separada corresponde a
tablespace separado.

O que o tablespace USERS?

Como demonstrado anteriormente, este geralmente o tablespace padro para os usurios. Se um
usurio criar um objeto, tal como uma tabela ou um ndice, sem especificar o tablespace, o Oracle o cria
no tablespace padro do usurio, isso se o tablespace padro do usurio foi definido para utilizar o
tablespace USERS.

O que o tablespace SYSTEM?

O tablespace SYSTEM (tablespace de sistema) uma parte obrigatria de todo banco de dados Oracle.
onde o Oracle armazena todas as informaes necessrias para o seu prprio gerenciamento. Em resumo,
SYSTEM o tablespace mais crtico do banco de dados porque ele contm o dicionrio de dados. Se por
algum motivo ele se tornar indisponvel, a instncia do Oracle abortar. Por esse motivo, o tablespace
SYSTEM nunca pode ser colocado offline, ao contrrio de um tablespace comum como, por exemplo, o
tablespace USERS.

O que o tablespace TEMP?

O tablespace TEMP (tablespace temporrio) onde o Oracle armazena todas as suas tabelas temporrias.
o quadro branco ou papel de rascunho do banco de dados. Assim como s vezes precisamos de um
lugar para anotar alguns nmeros para pode som-los, o Oracle tambm precisa de algum espao em
disco temporrio. O Oracle geralmente utiliza o tablespace temporrio para armazenar objetos
transitrios durante as classificaes e agrupamentos de dados durante a execuo de uma SQL contendo
as clusulas ORDER BY e GROUP BY, entre outras. importante dizer tambm que os dados de sesso das
tabelas temporrias globais (Global Temporary Tables) tambm ficam no tablespace TEMP. Assim como o
tablespace SYSTEM o tablespace mais crtico do banco dados, o tablespace TEMP o menos crtico do
banco de dados exatamente porque armazena apenas os segmentos temporrios durante as operaes
de classificao de dados e, como tal, no caso de uma falha, ele pode simplesmente ser dropado e
recriado, em vez de ser restaurado e recuperado.

O que o tablespace UNDO?

Todos os bancos de dados Oracle precisam de um local para armazenar informaes a desfazer. O que
isso significa? Esse tablespace que contm seus segmentos de reconstruo em verses anteriores ao
Oracle 9i chamado de RBS (tablespace de rollback), possui a capacidade de recuperar transaes
incompletas ou abortadas. Um segmento de undo usado para salvar o valor antigo quando um processo
altera dados de um banco de dados. Ele armazena a localizao dos dados e tambm os dados da forma
como se encontravam antes da modificao. Basicamente, os objetivos dos segmentos de undo so:

Rollback de transao: Quando uma transao modifica uma linha de uma tabela, a imagem original
das colunas modificadas salvas no segmento de UNDO, e se for feito o rollback da transao, o servidor
Oracle restaurar os valores originais gravando os valores do segmento de UNDO novamente na linha
Recuperao de Transao: Se ocorrer uma falha de instncia enquanto houver transaes em
andamento, o servidor Oracle precisar desfazer as alteraes no submetidas commit quando o banco
de dados for aberto novamente. Esse rollback faz parte da recuperao da transao. Portanto, a
recuperao s possvel porque as alteraes feitas no segmento de UNDO tambm so protegidas
pelos arquivos de redo log online.
Consistncia de Leitura: Enquanto houver transaes em andamento, outros usurios do banco de
dados no devero ver as alteraes no submetidas commit feitas nessas transaes. Alm disso, uma
instruo no dever ver as alteraes submetidas commit aps o incio da execuo dessa instruo.
Os valores antigos (dados de undo) dos segmentos de UNDO tambm so usados para oferecer aos
leitores uma imagem consistente de uma instruo especfica.

O que o tablespace SYSAUX?

Este tablespace auxiliar no existe nas verses anteriores ao Oracle 10g e foi criado especialmente para
aliviar o tablespace SYSTEM de segmentos associados a algumas aplicaes do prprio banco de dados
como o Oracle ultra search, Oracle Text e at mesmo segmentos relacionados ao funcionamento do
Oracle Enterprise Manager entre outros. Como resultado da criao desse tablespace, alguns gargalos de
I/O freqentemente associados ao tablespace SYSTEM foram reduzidos ou eliminados. Vale a pena
salientar que no bom que o tablespace SYSAUX seja colocado no modo offline, pelo fato de correr o
risco do banco de dados no funcionar corretamente. Portanto, podemos dizer que o mesmo parte
integrante e obrigatrio em todos os bancos de dados partir do Oracle 10g. Existe uma view de
dicionrio de dados que mostra os ocupantes neste tablespace:

SQL> select occupant_name, schema_name, space_usage_kbytes 2 from v$sysaux_occupants;

OCCUPANT_NAME SCHEMA_NAME SPACE_USAGE_KBYTES
--------------- -------------------- ------------------
LOGMNR SYSTEM 7488
LOGSTDBY SYSTEM 0
STREAMS SYS 192
AO SYS 960
XSOQHIST SYS 960
SM/AWR SYS 68352
SM/ADVISOR SYS 7360
SM/OPTSTAT SYS 21120
SM/OTHER SYS 3328
STATSPACK PERFSTAT 0
ODM DMSYS 5504
SDO MDSYS 6080
WM WMSYS 6656
ORDIM ORDSYS 512
ORDIM/PLUGINS ORDPLUGINS 0
ORDIM/SQLMM SI_INFORMTN_SCHEMA 0
EM SYSMAN 61632
TEXT CTXSYS 4736
ULTRASEARCH WKSYS 7296
JOB_SCHEDULER SYS 256


Uma outra informao bastante til que esta view oferece o nome de uma procedure que o DBA pode
utilizar para mover dados de um ocupante para um outro tablespace:

SQL> select occupant_name,move_procedure 2
from v$sysaux_occupants
where occupant_name='LOGMNR';

OCCUPANT_NAME MOVE_PROCEDURE
--------------- ---------------------------------------
LOGMNR SYS.DBMS_LOGMNR_D.SET_TABLESPACE


Gerenciamento de Espao em Tablespaces
Os tablespaces alocam espao em extenses (extents). Eles podem ser criados para usar um dos dois
mtodos de controle de espao livre e utilizado:

Tablespaces gerenciados localmente: As extenses so gerenciadas no tablespace por bitmaps. Cada
bitmap corresponde a um bloco ou a um grupo de blocos. Quando uma extenso alocada ou liberada
para reutilizao, o servidor Oracle altera os valores do bitmap para mostrar o novo status dos blocos. A
partir do Oracle 9i este gerenciamento local o padro.
Tablespaces gerenciados por dicionrio: As extenses so gerenciadas pelo dicionrio de dados. O
servidor atualiza as tabelas apropriadas no dicionrio de dados sempre que uma extenso alocada ou
desalocada.

Nas verses anteriores ao Oracle 8i, os extents de todos os tablespaces eram gerenciados centralmente
por meio das tabelas do dicionrio de dados, quando os extents so alocados ou desalocados em
qualquer lugar do banco de dados, o Oracle atualiza as tabelas do dicionrio de dados para registrar o
novo mapa de armazenamento. A partir do Oracle 8i um novo recurso possibilitando o gerenciamento
local dos extents dentro de um tablespace praticamente decretou a morte do tablespace gerenciado por
dicionrio de dados

Como dito anteriormente, o Oracle mantm um bitmap em cada arquivo de dados de um tablespace
gerenciado localmente. Para se criar um tablespace gerenciado localmente, necessrio usar a clusula
EXTENT MANAGEMENT LOCAL como o comando create tablespace. Comparando com os tablespaces
gerenciados por dicionrio, os tablespaces gerenciados localmente tm um modo completamente
diferente de dimensionar os extents. Os parmetros de armazenamento NEXT, PCTINCREASE,
MINEXTENTS, MAXEXTENTS e DEFAULT_STORAGE no so vlidos nos casos dos tablespaces gerenciados
localmente. Em vez disso, existe a opo de especificar um tamanho uniforme para todos os extents ou
especificar apenas o tamanho do extent inicial e deixar que o Oracle determine automaticamente o
tamanho de todos os extents subseqentes. Os extents uniformes ou dimensionados automaticamente
podem ser selecionados especificando as opes UNIFORM ou AUTOALLOCATE, respectivamente, ao criar
um tablespace gerenciado localmente com o comando CREATE TABLESPACE.

OBS: Os tablespaces gerenciados localmente ajudam a reduzir a overhead de gerenciamento de espao
eliminando a necessidade de vrias gravaes nas tabelas do dicionrio de dados ou nos segmentos de
rollback, o que ocorre necessariamente quando o espao gerenciado centralmente por meio do
dicionrio de dados. Segundo a Oracle, os tablespaces gerenciados por dicionrio no sero mais
suportados nas futuras verses do Oracle:

"Oracle strongly recommends that you create only locally managed tablespaces. Locally managed
tablespaces are much more efficiently managed than dictionary-managed tablespaces. The creation of
new dictionary-managed tablespaces is scheduled for desupport."

Outra informao importante que um tablespace gerenciado por dicionrio no pode ser criado caso o
tablespace SYSTEM seja gerenciado localmente:

SQL> create tablespace tbs_test
2 logging
3 datafile /u01/oradata/BD01/test01.dbf' size 5m
4 extent management dictionary;
create tablespace tbs_test
*
ERRO na linha 1:
ORA-12913: No possvel criar um tablespace gerenciado por dicionrio

SQL> select extent_management
2 from dba_tablespaces
3 where tablespace_name='SYSTEM';

EXTENT_MANAGEMENT
-----------------
LOCAL
















ORACLE 11g
Instalar SQL Developer
Criar uma conexo com o banco:
Exibir / Conexes
Em conexes, clicar para NOVA CONEXO
Nome da Conexo: xe mesmo nome do banco
Nome do Usurio: sys as sysdba
Senha: Simone mesmo nome informado durante a instalao
Salvar senha.
Clicar em conectar
Abre janela de script

Para saber se est conectado no banco: select * from v$instance;


Instalar o Oracle 11g
Criar usurios: Menu Iniciar Todos os programas Oracle Conceitos Bsicos

Primeiro, criar WORKSPACE:
Clicar em Application Express
Username: system usamos o usurio system porque ainda no criamos nenhum usurio.
Password: Simone
Database Username: TREINAWEB
Application Express Username: marcos
Password: Simone
Clicar em: Create Workspace
Na aba Application Express, conceitos bsicos, clicar em: log-in no seu espao de trabalho do Application
Express.
Workspace: TREINAWEB
Username: marcos
Password: Simone

Criar usurio:
Clicar na aba: Administrao
Clicar em: Gerenciar usurios e grupos
Clicar em: Criar usurio
Identificao do usurio:
Nome do usurio: TREINA
Endereo de email: treina@treinaweb.com.br
Nome: marcos
Sobrenome: soares
Esquema Default: TREINAWEB
O usurio um administrador do espao de trabalho: Sim
Definir conta disponibilidade: Desbloqueado
Senha: simon
Confirmar: simon
Exibir mudana de senha na primeira utilizao: Sim
Clicar em: Criar usurio
Efetuar logout no cone, no topo superior direito.

Clicar no link login:
Espao de trabalho: TREINAWEB
Nome do usurio: treina
Senha: simon
Aparece a mensagem A senha para essa conta deve ser mudado.
Nome de usurio: treina no pode ser mudado.
Digitar senha atual: treina
Digite nova senha: Simone
Clicar no boto: retornar

Informar a nova senha
Workspace: TREINAWEB
Nome de usurio: treina
Senha: Simone

Criando usurio via cdigo:
Antes, conceder todos os privilgios no banco de dados para o usurio principal TREINAWEB
Executar linha de comando SQL:
conn sys/oracle as sysdba
conectado

Conceder todos os privilgios:
GRANT ALL PRIVILEGES TO TREINAWEB;
concesso bem-sucedida.

Criar novo usurio por comando SQL:
CREATE USER nome_usurio
IDENTIFIED [BY senha_usuario | EXTERNALLY ]
DEFAULT TABLESPACE nome
TEMPORARY TABLESPACE nome
QUOTA [<valor em K ou M> | UNLIMITED]
ON TABLESPACE

Voltar ao Application Express
Selecionar Workshop > Comando SQL
Digitar na tela que aparece
CREATE USER usuario_teste IDENTIFIED BY senha_teste
DEFAULT TABLESPACE USERS
QUOTA UNLIMITED ON USERS;
Resposta: User created

Para acessar o sistema com esse usurio, necessrio dar permisso de conexo para ele.
GRANT CONNECT TO usuario_teste;
Observao: No possvel acessar o Application Service com o usurio: usuario_teste


Excluso de usurios:
DROP USER nome_usuario;

Criar usurio:
CREATE USER vou_ser_excluido IDENTIFIED BY senha;

Excluir usurio:
DROP USER vou_ser_excluido;

Login usando SQL Plus
Conectar ao banco de dados: CONNECT usurio_teste/senha_teste;
Para desconectar: disconnect;

Criando tabelas
CREATE TABLE nome_tabela(
nome_coluna1 tipo_dado,
nome_coluna2 tipo_dado);

Criar tabelas no construtor visual
Abrir o Application Express
Menu: SQL Workshop > Browser de Objetos
Clicar em: Create
Clicar no link table
Nome da tabela: FUNCIONARIO

Nome da Coluna Tipo Preciso Escala No nulo
CODIGO_FUNCIONARIO NUMBER 10 x
CPF CHAR 11
NOME VARCHAR2 60 x
SALARIO NUMBER 10 2
DEPARTAMENTO VARCHAR2 60
Clicar em: Prximo
Marcar: Not populated
Primary Key Constraint Name: Funcionario_pk
Primary Key: CODIGO_FUNCIONARIO(NUMBER)
Composite Primary Key: xxxx
Clicar em: Prximo

Adicionar chave estrangeira
Nome: Funcionario_fk
Marcar: Disallow Delete
Clicar em: Prximo

Esta tela permite a definio de Restries de Constraint de Verificao e Constraint Exclusiva:
Constraint
Adicionar Constraint
Marcar: verificar
Nome: FUNCIONARIO_ck1 clicar em Adicionar e Prxima
Criar tabela
Esquema: TREINAWEB
Nome Tabela: FUNCIONARIO

SQL
CREATE TABLE FUNCIONARIO (
CODIGO_FUNCIONARIO NUMBER NOT NULL,
CPF CHAR(11),
NOME VARCHAR2(60) NOT NULL,
SALARIO NUMBER(10,2),
DEPARTAMENTO VARCHAR(60),
Constraint FUNCIONARIO_PK primary key
(CODIGO_FUNCIOARIO))
/
Alter table FUNCIONARIO add
Constraint FUNCIONARIO_ck1
Check(salario > 0)
/
Clicar em: Criar

Criar tabelas por SQL
Selecionar SQL Workshop > Comandos SQL
Digitar:
CREATE TABLE cidade(
codigo_cidade INT NOT NULL,
nome VARCHAR(50) NOT NULL,
uf VARCHAR(2) NOT NULL,
taxa NUMBER(10,2) NOT NULL,
PRIMARY KEY(codigo_cidade) );
Clicar em: Executar

Tipos de Constraints
NOT NULL: no permite valor nulo.
UNIQUE: exige que cada valor da coluna seja nico (exclusivo) para todos os registros da tabela.
PRIMARY KEY: define uma chave primria para uma tabela.
FOREIGN KEY: cria um relacionamento entre as tabelas.
CHECK: define uma condio a ser satisfeita.











CREATE TABLE cliente(
codigo_cliente INT NOT NULL,
nome VARCHAR(60) NOT NULL,
endereco VARCHAR(60) NOT NULL,
telefone VARCHAR(13) NOT NULL,
email VARCHAR(100) NOT NULL,
renda NUMBER(10,2) NOT NULL,
Primary key(codigo_cliente));
Clicar em: executar

Criar tabela que tenha colunas com chave estrangeira
CREATE TABLE frete(
codigo_frete INT NOT NULL,
data DATE NOT NULL,
descricao VARCHAR(60) NOT NULL,
codigo_cliente INT NOT NULL,
codigo_cidade INT NOT NULL,
codigo_funcionario INT NOT NULL,
peso NUMBER(10,2) NOT NULL,
valor_frete NUMBER(10,2) NOT NULL,
PRIMARY KEY(codigo_frete));

ALTER TABLE frete ADD(FOREIGN KEY(codigo_cliente)
REFERENCES cliente);

ALTER TABLE frete ADD(FOREIGN KEY(codigo_cidade)
REFERENCES cidade);

ALTER TABLE frete ADD(FOREIGN KEY(codigo_funcionario)
REFERENCES funcionario);

Clicar em: Executar

Obs: Popular as tabelas individualmente.

INSERT INTO CIDADE VALUES(1, SO PAULO,SP,10);
INSERT INTO CIDADE VALUES(2, RIO DE JANEIRO,RJ,8);

INSERT INTO CLIENTE
VALUES(1, CARLOS SILVA,RUA DO CONDE,80,33445500,carlos@mail.com.br,1000);
INSERT INTO CLIENTE
VALUES(2, MANOEL ANTONIO,RUA DO ACRE,10,22445512,manoel@mail.com.br,2000);

INSERT INTO FUNCIONARIO (CODIGO_FUNCIONARIO,CPF,NOME,SALARIO,DEPARTAMENTO)
VALUES(1, 11122233344,ALICE,1000,FINANCEIRO);

INSERT INTO FRETE
VALUES(1, SYSDATE,FRETE DE ENTREGA DE SEOJA,1,1,1,100,1000);
Adicionar coluna em tabela existente
ALTER TABLE nome_tabela
ADD nome_do_campo tipo_dado;

ALTER TABLE CLIENTE
ADD CAMPO1 CHAR(25);

Excluir coluna em uma tabela
ALTER TABLE nome_tabela
DROP COLUMN nome_campo;

ALTER TABLE CLIENTE
DROP COLUMN CAMPO1;

Excluir tabela
DROP TABLE nome_tabela;

CRIAR SINNIMOS ( Criar apelido para a referncia de uma tabela )
Usado para simplificar o acesso a um objeto com nome muito longo.
CREATE SYNONYM ref FOR REFERENCIA;
CREATE SYNONYM cid FOR CIDADE;
SELECT * FROM CID;

VIEW ( Consulta, atualizao e eliminao de dados )
CREATE [OR REPLACE] VIEW nome_view
AS
---Instrues---
[WITH READ ONLY];

Com o cdigo abaixo, a View permite a atualizao dos dados.
CREATE OR REPLACE VIEW LISTA_FUNCIONARIOS
AS
SELECT NOME FROM FUNCIONARIOS;

Visualizar dados com a View
SELECT * FROM LISTA_FUNCIONARIOS;

Permite a atualizao de dados
CREATE OR REPLACE VIEW VISAO_CIDADE
AS
SELECT * FROM CIDADE;

Inserir dados com a View
INSERT INTO VISAO_CIDADE VALUES (10,TAUBAT,SP,2);




VIEW apenas de leitura
CREATE OR REPLACE VIEW VISAO_LEITURA_CIDADE
AS
SELECT * FROM CIDADE
WITH READ ONLY;

Ao executar o cdigo abaixo para incluir outro registro na tabela CIDADE, ocorrer um erro.
INSERT INTO VISAO_LEITURA_CIDADE
VALUES( 11, CAMPINAS,SP,18);

Excluir uma VIEW
DROP VIEW nome_view;
DROP VIEW VISAO_LEITURA_CIDADE;

Ver todas as VIEWS de usurio
SELECT * FROM USER_VIEWS;

Sequence
Para criar campos de auto numerao. Utililiza-se esse objeto para que, na insero de determinado
registro, no seja necessrio especificar um valor para o campo que deve possuir um cdigo sequencial.

CREATE SEQUENCE nome_sequencia
[INCREMENT BY n]
[START WITH n]
[MAXVALUE n | NOMAXVALUE] OR [MINVALUE n | NOMINVALUE]
[CYCLE | NOCYCLE]
[CACHE n | NOCACHE];

Criar uma sequncia
CREATE SEQUENCE MINHA_SEQUENCIA
START WITH 1
INCREMENT BY 1
MAXVALUE 999
CYCLE
CACHE 10;

Para executar o exemplo de SEQUENCE, criar a tabela ALUNO.
CREATE TABLE ALUNO (
CODIGO INT NOT NULL,
NOME VARCHAR2(60) NOT NULL,
CURSO VARCHAR2(100) NOT NULL);

Inserir dados na tabela ALUNO
INSERT INTO ALUNO(CODIGO,NOME,CURSO)
VALUES(MINHA_SEQUENCIA.NEXTVAL,CARLOS,SISTEMAS DE INFORMAO);

Para visualizar todas as sequencias que esto no schema
SELECT * FROM USER_SEQUENCES;
Excluir uma sequencia
DROP SEQUENCE nome_sequencia

CONSULTAS SQL
SELECT [DISTINCT] lista_colunas
FROM lista_tabelas
WHERE condies
GROUP BY lista_colunas
HAVING condies_grupo
ORDER BY lista_colunas

DISTINCT: eliminar linhas com registro repetido.

SELECT DISTINCT UF FROM CIDADE;

SELECT DISTINCT SALARIO, DEPARTAMENTO FROM FUNCIONARIO;

AS: DEFINE APELIDO PARA QUAQUER COLUNA DURANTE A SELEO.
SELECT NOME, SALARIO, SALARIO * 12 AS SALRIO ANUAL
FROM FUNCIONARIO
ORDER BY CAMPO DESC;

SELECT CODIGO_CLIENTE, NOME,ENDERECO, TELEFONE, RENDA
FROM CLIENTE
WHERE (RENDA = 1000 AND CODIGO_CLIENTE > 1)
ORDER BY NOME;

COMPARADORES: BETWEEN, AND, IN, LIKE e IS NULL

SELECT CODIGO_CLIENTE, NOME, ENDERECO, TELEFONE, EMAIL, RENDA
FROM CLIENTE
WHERE (RENDA BETWEEN 1000 AND 2000)
ORDER BY NOME;

CLUSULA: IN
Compara o valor da coluna com o conjunto de valores informados.
SELECT CODIGO_CLIENTE, NOME
FROM CLIENTE
WHERE CODIGO_CLIENTE IN (1,2,4)
ORDER BY NOME;

LIKE: utilizado exclusivamente em colunas com sequncia caracteres.
SELECT CODIGO_CLIENTE, NOME, ENDERECO
FROM CLIENTE
WHERE NOME LIKE M%
ORDER BY NOME;


WHERE NOME M% seleciona todos os nomes que iniciam com a letra M.

WHERE NOME %M% qualquer nome que tenha a letra A no nome.

WHERE NOME _M% nomes que tenham obrigatoriamente a letra M na segunda posio.

WHERE CPF IS NULL seleciona as colunas nulas.

LIKE: utilizado exclusivamente em colunas com sequncia de caracteres.
SELECT CODIGO_CLIENTE, NOME, ENDERECO
FROM CLIENTE
WHERE NOME LIKE M%
ORDER BY NOME;

WHERE NOME LIKE M% seleciona todos os nomes que iniciam com a letra M.
WHERE NOME LIKE %M% qualquer nome que tenha a letra A no nome.
WHERE NOME LIKE _A% nomes que tenham obrigatoriamente a letra A na segunda posio.
WHERE CPF IS NULL seleciona as colunas nulas.

Selecionar dados de uma tabela
SELECT * FROM CIDADE, FRETE
WHERE CIDADE.CODIGO_CIDADE = FRETE.CODIGO_CIDADE;
OU
SELECT * FROM CIDADE INNER JOIN FRETE
ON CIDADE.CODIGO_CIDADE = FRETE.CODIGO_CIDADE;

Smbolo + pode ser usado para informar que se quer listar todos os dados da tabela que possua tal
smbolo.
SELECT * FROM CIDADE INNER JOIN FRETE
ON CIDADE.CODIGO_CIDADE = FRETE.CODIGO_CIDADE (+);

Alias
SELECT * FROM CIDADE C INNER JOIN FRETE F
ON C.CODIGO_CIDADE = F.CODIGO_CIDADE;

PRIVILGIOS
PRIVILGIO DESCRICAO
SELECT
INSERT
UPDATE
DELETE
REFERENCES CRIAR CONSTRAINT QUE REFERENCIE ESSA TABELA
ALTER ALTERA AS DEFINIES DA TABELA ATRAVS DO COMANDO ALTER TABLE
INDEX CRIAR NDICES




GRANT: conceder privilgios em uma tabela
GRANT [PRIVILEGES] ON [OBJECT] TO [USER]

EXEMPLO:
CONECTAR AO USURIO: connect usuario_teste/senha_teste;

SELECT * FROM treinaweb.cliente;
Mensagem: Erro na linha 1 a tabela ou view no existe.

Abrir Application Express, logar como usurio TREINAWEB
GRANT SELECT ON CLIENTE TO USUARIO_TESTE;

Voltar ao SQL Plus e executar novamente
SELECT * FROM TREINAWEB.CLIENTE; a instruo executada com sucesso.

Listar schemas de usurios criados
SELECT USERNAME FROM DBA_USERS;

REVOKE: revoga privilgios concedidos a um usurio.

Revogar privilgio concedido ao usurio USUARIO_TESTE
REVOKE SELECT ON CLIENTE FROM USUARIO_TESTE;

Funes de grupo
Podem aparecer na clusula SELECT quanto na clusula HAVING
A clusula GROUP BY divide as linhas de uma ou mais tabelas em grupos de linhas.
HAVING: seleciona os grupos que sero aceitos.
AVG(), COUNT(), MAX(), MIN(), SUM()

AVG(): mdia aritmtica dos valores da coluna.
COUNT(): retorna nmero de linhas que satisfaz a condio, no conta valores nulos.
MAX(): valor mximo da coluna.
MIN(): valor mnimo da coluna.
SUM(): soma dos valores da coluna.

EXEMPLO:
SELECT AVG(RENDA), MAX(RENDA), MIN(RENDA), SUM(RENDA) FROM CLIENTE;

Todo SELECT que possuir colunas com funes de grupo e colunas que no fazem uso das funes,
obrigado a utilizar a clusula GROUP BY.
EXEMPLO:
SELECT RENDA, COUNT(*) FROM CLIENTE
GROUP BY RENDA;





No possvel utilizer a clusula WHERE em conjunto com as funes de grupo.
EXEMPLO:
SELECT RENDA, COUNT(*)
FROM CLIENTE
WHERE COUNT(*) > 2
GROUP BY RENDA; ocorrer um erro.

Para esses casos, utilizar a clusula HAVING
SELECT RENDA, COUNT(*)
FROM CLIENTE
HAVING COUNT(*) > 2; no ocorrer erro.

SUBCONSULTAS
Primeiro executado o SELECT interno, em seguida o resultado utilizado em uma condio da consulta
principal.
SELECT NOME, RENDA FROM CLIENTE WHERE RENDA = (SELECT MAX(RENDA) FROM CLIENTE);

Se a subconsulta retornar mais de um resultado, ser preciso utilizar a clusula IN
SELECT NOME, RENDA FROM CLIENTE
WHERE RENDA IN (SELECT RENDA FROM CLIENTE);

UPDATE
UPDATE tabela
SET nome_coluna1 = valor1
WHERE CONDIO

Aumentar em 10% o salrio do funcionrio Mario
UPDATE FUNCIONARIO
SET SALARIO = SALARIO * 1.1
WHERE NOME = MARIO;

INSERT
INSERT INTO TABELA( COLUNA1, ... )
VALUES( VALOR1,... );

Pag.46 Funcionamento da engine PL/SQL
Pag.47 Blocos PL/SQL

A unidade bsica em PL/SQL um bloco.
Todos os programas em PL/SQL so compostos por blocos que podem estar localizados uns dentro dos
outros. Geralmente, cada bloco efetua uma ao lgica no programa.







Estrutura do Bloco
DECLARE
Seo para declarao de variveis, tipos, cursores e subprogramas locais.

BEGIN
Seo executvel. Nesta seo ficam as instrues, procedimentos e SQL.
Esta a nica seo do bloco que indispensvel e obrigatria.

EXPECTION
Seo/Setor onde ficam as instrues de tratamento de erro.

END

Exemplos de Blocos PL/SQL
Criar tabela
CREATE TABLE TEMP_TABLE(
NUM_COL INT,
CHAR_COL VARCHAR(50));

Bloco annimo no rotulado
DECLARE
/* DECLARA VARIVEIS */
V_NUM1 NUMBER:= 1;
V_NUM2 NUMBER:= 2;
V_STRING1 VARCHAR2(50):='Ol Mundo!';
V_STRING2 VARCHAR2(50):=' Esta mensagem mostrada pelo PL/SQL';
V_OUTPUTSTR VARCHAR2(50);
BEGIN
/* INSERE DUAS LINHAS NA TABELA TEMP_TABLE, USANDO OS VALORES DAS VARIVEIS */
INSERT INTO TEMP_TABLE (NUM_COL, CHAR_COL) VALUES (V_NUM1, V_STRING1);
INSERT INTO TEMP_TABLE (NUM_COL, CHAR_COL) VALUES (V_NUM2, V_STRING2);

/* AGORA SELECIONA AS 2 LINHAS INSERIDAS E MOSTRA-AS NA TELA UTILIZANDO A PACKAGE
DBMS_OUTPUT. */
SELECT CHAR_COL INTO V_OUTPUTSTR
FROM TEMP_TABLE
WHERE NUM_COL = V_NUM1;
DBMS_OUTPUT.PUT_LINE(V_OUTPUTSTR);

SELECT CHAR_COL INTO V_OUTPUTSTR
FROM TEMP_TABLE
WHERE NUM_COL = V_NUM2;
DBMS_OUTPUT.PUT_LINE(V_OUTPUTSTR);

/* EFETUAR ROLLBACK NAS ALTERAES */
ROLLBACK;
END;

PROCEDIMENTO

CREATE OR REPLACE PROCEDURE InsereEmTemp AS
/* DECLARA VARIVEIS */
V_NUM1 NUMBER:= 1;
V_NUM2 NUMBER:= 2;
V_STRING1 VARCHAR2(50):='Ol Mundo!';
V_STRING2 VARCHAR2(50):=' Esta mensagem mostrada pelo PL/SQL';
V_OUTPUTSTR VARCHAR2(50);
BEGIN
/* INSERE DUAS LINHAS NA TABELA TEMP_TABLE, USANDO OS VALORES DAS VARIVEIS */
INSERT INTO TEMP_TABLE (NUM_COL, CHAR_COL) VALUES (V_NUM1, V_STRING1);
INSERT INTO TEMP_TABLE (NUM_COL, CHAR_COL) VALUES (V_NUM2, V_STRING2);

/* AGORA SELECIONA AS 2 LINHAS INSERIDAS E MOSTRA-AS NA TELA UTILIZANDO A PACKAGE
DBMS_OUTPUT. */
SELECT CHAR_COL INTO V_OUTPUTSTR
FROM TEMP_TABLE
WHERE NUM_COL = V_NUM1;
DBMS_OUTPUT.PUT_LINE(V_OUTPUTSTR);

SELECT CHAR_COL INTO V_OUTPUTSTR
FROM TEMP_TABLE
WHERE NUM_COL = V_NUM2;
DBMS_OUTPUT.PUT_LINE(V_OUTPUTSTR);

/* EFETUAR ROLLBACK NAS ALTERAES */
ROLLBACK;
END InsereEmTemp;


Bloco annimo para chamar a procedure
BEGIN obrigatrio
InsereEmTemp;
END; obrigatrio