24
Introdução ao conceito de Tablespaces Comecemos com a seguinte pergunta: Qual é a relação entre tablespaces e arquivos de dados? Bom, para responder esta pergunta, primeiro precisamos entender como os dados são 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 diferenças importantes: Um banco de dados Oracle consiste em uma ou mais unidades de armazenamento lógicas 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 são estruturas físicas compatíveis com o sistema operacional no qual o Oracle é executado. Os dados de um banco de dados são 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 proteção de um objeto de banco de dados chamado tablespace. Antes de poder inserir dados em um banco de dados Oracle, primeiro é necessário criar um tablespace e depois uma tabela dentro desse tablespace que conterá os dados. Podemos observar que na criação de um banco de dados utilizando o DBCA, o Oracle como padrão sempre cria um tablespace de dados chamado USERS. Ao criar uma tabela é necessário incluir todas as informações sobre o tipo de dados que deseja manter. O código abaixo, gerado para criar a tabela CLIENTE, ilustra como o Oracle armazena informações 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.

Oracle 11g resumo

Embed Size (px)

DESCRIPTION

RESUMO ORACLE

Citation preview

Page 1: Oracle 11g resumo

Introdução ao conceito de Tablespaces

Comecemos com a seguinte pergunta: Qual é a relação entre tablespaces e arquivos de dados? Bom, para responder esta pergunta, primeiro precisamos entender como os dados são 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 diferenças importantes:

Um banco de dados Oracle consiste em uma ou mais unidades de armazenamento lógicas 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 são estruturas físicas compatíveis com o sistema operacional no qual o Oracle é executado. Os dados de um banco de dados são 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 proteção de um objeto de banco de dados chamado tablespace. Antes de poder inserir dados em um banco de dados Oracle, primeiro é necessário criar um tablespace e depois uma tabela dentro desse tablespace que conterá os dados. Podemos observar que na criação de um banco de dados utilizando o DBCA, o Oracle como padrão sempre cria um tablespace de dados chamado USERS. Ao criar uma tabela é necessário incluir todas as informações sobre o tipo de dados que deseja manter. O código abaixo, gerado para criar a tabela CLIENTE, ilustra como o Oracle armazena informações 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 clienteNome Nulo? Tipo----------------------------- -------- --------------------COD_CLIENTE NOT NULL NUMBERNOME NOT NULL VARCHAR2(60)ENDERECO NOT NULL VARCHAR2(100)TELEFONE NUMBERDATA_CADASTRO DATE

Page 2: Oracle 11g resumo

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

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

Na instrução 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 são armazenados aleatoriamente no tablespace e o DBA tem pouco controle sobre a localização das linhas dos blocos de uma tabela. Por falar nisso, o que é um segmento? Os segmentos são objetos que ocupam espaço em um banco de dados. Existem vários tipos de segmentos como tabelas, índices, de undo, temporários, LOB, entre outros. Já uma extensão (extent), é um espaço 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 criação do tablespace. Então a estrutura lógica de um banco de dados Oracle se resume em tablespaces que contém segmentos que contém extensões que contém blocos. A figura abaixo ilustra esta estrutura lógica:

estrutura lógica 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 incluído o nome do tablespace USERS no comando de criação da tabela, apenas para exemplificar, já que uma tabela sempre será criada no tablespace padrão do usuário definido na sua criação (create user).

SQL> select default_tablespace from user_users;

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

Page 3: Oracle 11g resumo

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 fichário. Imagine um banco de dados como um fichário: as gavetas dentro do fichário são os tablespaces; as pastas nessas gavetas são os arquivos de dados; os papéis em cada pasta são as tabelas; a informação escrita no papel de cada pasta são os dados. Em resumo, o tablespace é um modo de agrupar arquivos de dados

É aconselhável não misturar dados de aplicativos no mesmo tablespace. Então, 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, aplicação separada corresponde a tablespace separado.

O que é o tablespace USERS?

Como demonstrado anteriormente, este geralmente é o tablespace padrão para os usuários. Se um usuário criar um objeto, tal como uma tabela ou um índice, sem especificar o tablespace, o Oracle o cria no tablespace padrão do usuário, isso se o tablespace padrão do usuário foi definido para utilizar o tablespace USERS.

O que é o tablespace SYSTEM?

O tablespace SYSTEM (tablespace de sistema) é uma parte obrigatória de todo banco de dados Oracle. É onde o Oracle armazena todas as informações necessárias para o seu próprio gerenciamento. Em resumo, SYSTEM é o tablespace mais crítico do banco de dados porque ele contém o dicionário de dados. Se por algum motivo ele se tornar indisponível, a instância do Oracle abortará. Por esse motivo, o tablespace SYSTEM nunca pode ser colocado offline, ao contrário de um tablespace comum como, por exemplo, o tablespace USERS.

O que é o tablespace TEMP?

O tablespace TEMP (tablespace temporário) é onde o Oracle armazena todas as suas tabelas temporárias. É o quadro branco ou papel de rascunho do banco de dados. Assim como às vezes precisamos de um lugar para anotar alguns números para pode somá-los, o Oracle também precisa de algum espaço em disco temporário. O Oracle geralmente utiliza o tablespace temporário para armazenar objetos transitórios durante as classificações e agrupamentos de dados durante a execução de uma SQL contendo as cláusulas ORDER BY e GROUP BY, entre outras. É importante dizer também que os dados de sessão das tabelas temporárias globais (Global Temporary Tables) também ficam no tablespace TEMP. Assim como o tablespace SYSTEM é o tablespace mais crítico do banco dados, o tablespace TEMP é o menos crítico do banco de dados exatamente porque armazena apenas os segmentos temporários durante as operações de classificação 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 informações a desfazer. O que isso significa? Esse tablespace que contém seus segmentos de reconstrução em versões anteriores ao Oracle 9i chamado de RBS (tablespace de rollback), possui a capacidade de recuperar transações incompletas ou abortadas. Um segmento de undo é usado para salvar o valor antigo quando um processo

Page 4: Oracle 11g resumo

altera dados de um banco de dados. Ele armazena a localização dos dados e também os dados da forma como se encontravam antes da modificação. Basicamente, os objetivos dos segmentos de undo são:

Rollback de transação: Quando uma transação modifica uma linha de uma tabela, a imagem original das colunas modificadas é salvas no segmento de UNDO, e se for feito o rollback da transação, o servidor Oracle restaurará os valores originais gravando os valores do segmento de UNDO novamente na linha Recuperação de Transação: Se ocorrer uma falha de instância enquanto houver transações em andamento, o servidor Oracle precisará desfazer as alterações não submetidas à commit quando o banco de dados for aberto novamente. Esse rollback faz parte da recuperação da transação. Portanto, a recuperação só é possível porque as alterações feitas no segmento de UNDO também são protegidas pelos arquivos de redo log online. Consistência de Leitura: Enquanto houver transações em andamento, outros usuários do banco de dados não deverão ver as alterações não submetidas à commit feitas nessas transações. Além disso, uma instrução não deverá ver as alterações submetidas à commit após o início da execução dessa instrução. Os valores antigos (dados de undo) dos segmentos de UNDO também são usados para oferecer aos leitores uma imagem consistente de uma instrução específica.

O que é o tablespace SYSAUX?

Este tablespace auxiliar não existe nas versões anteriores ao Oracle 10g e foi criado especialmente para aliviar o tablespace SYSTEM de segmentos associados a algumas aplicações do próprio 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 criação desse tablespace, alguns gargalos de I/O freqüentemente associados ao tablespace SYSTEM foram reduzidos ou eliminados. Vale a pena salientar que não é bom que o tablespace SYSAUX seja colocado no modo offline, pelo fato de correr o risco do banco de dados não funcionar corretamente. Portanto, podemos dizer que o mesmo é parte integrante e obrigatório em todos os bancos de dados à partir do Oracle 10g. Existe uma view de dicionário 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 7488LOGSTDBY SYSTEM 0STREAMS SYS 192AO SYS 960XSOQHIST SYS 960SM/AWR SYS 68352SM/ADVISOR SYS 7360SM/OPTSTAT SYS 21120SM/OTHER SYS 3328STATSPACK PERFSTAT 0ODM DMSYS 5504SDO MDSYS 6080WM WMSYS 6656ORDIM ORDSYS 512ORDIM/PLUGINS ORDPLUGINS 0

Page 5: Oracle 11g resumo

ORDIM/SQLMM SI_INFORMTN_SCHEMA 0EM SYSMAN 61632TEXT CTXSYS 4736ULTRASEARCH WKSYS 7296JOB_SCHEDULER SYS 256

Uma outra informação 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 Espaço em TablespacesOs tablespaces alocam espaço em extensões (extents). Eles podem ser criados para usar um dos dois métodos de controle de espaço livre e utilizado:

Tablespaces gerenciados localmente: As extensões são gerenciadas no tablespace por bitmaps. Cada bitmap corresponde a um bloco ou a um grupo de blocos. Quando uma extensão é alocada ou liberada para reutilização, o servidor Oracle altera os valores do bitmap para mostrar o novo status dos blocos. A partir do Oracle 9i este gerenciamento local é o padrão. Tablespaces gerenciados por dicionário: As extensões são gerenciadas pelo dicionário de dados. O servidor atualiza as tabelas apropriadas no dicionário de dados sempre que uma extensão é alocada ou desalocada.

Nas versões anteriores ao Oracle 8i, os extents de todos os tablespaces eram gerenciados centralmente por meio das tabelas do dicionário de dados, quando os extents são alocados ou desalocados em qualquer lugar do banco de dados, o Oracle atualiza as tabelas do dicionário 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 dicionário de dados

Como dito anteriormente, o Oracle mantém um bitmap em cada arquivo de dados de um tablespace gerenciado localmente. Para se criar um tablespace gerenciado localmente, é necessário usar a cláusula EXTENT MANAGEMENT LOCAL como o comando create tablespace. Comparando com os tablespaces gerenciados por dicionário, os tablespaces gerenciados localmente têm um modo completamente diferente de dimensionar os extents. Os parâmetros de armazenamento NEXT, PCTINCREASE, MINEXTENTS, MAXEXTENTS e DEFAULT_STORAGE não são válidos nos casos dos tablespaces gerenciados localmente. Em vez disso, existe a opção 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 subseqüentes. Os extents uniformes ou dimensionados automaticamente

Page 6: Oracle 11g resumo

podem ser selecionados especificando as opções 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 espaço eliminando a necessidade de várias gravações nas tabelas do dicionário de dados ou nos segmentos de rollback, o que ocorre necessariamente quando o espaço é gerenciado centralmente por meio do dicionário de dados. Segundo a Oracle, os tablespaces gerenciados por dicionário não serão mais suportados nas futuras versões 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 informação importante é que um tablespace gerenciado por dicionário não 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: Não é possível criar um tablespace gerenciado por dicionário

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

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

Page 7: Oracle 11g resumo

ORACLE 11gInstalar SQL DeveloperCriar uma conexão com o banco: Exibir / Conexões Em conexões, clicar para NOVA CONEXÃO Nome da Conexão: xe mesmo nome do banco Nome do Usuário: sys as sysdba Senha: Simone mesmo nome informado durante a instalação Salvar senha. Clicar em conectar Abre janela de script Para saber se está conectado no banco: select * from v$instance;

Instalar o Oracle 11gCriar usuários: Menu Iniciar Todos os programas Oracle Conceitos Básicos

Primeiro, criar WORKSPACE: Clicar em Application Express Username: system usamos o usuário system porque ainda não criamos nenhum usuário. Password: Simone Database Username: TREINAWEB Application Express Username: marcos Password: Simone Clicar em: Create Workspace Na aba Application Express, conceitos básicos, clicar em: log-in no seu espaço de trabalho do Application Express. Workspace: TREINAWEB Username: marcos Password: Simone

Criar usuário:Clicar na aba: AdministraçãoClicar em: Gerenciar usuários e gruposClicar em: Criar usuárioIdentificação do usuário:Nome do usuário: TREINAEndereço de email: [email protected]: marcosSobrenome: soaresEsquema Default: TREINAWEBO usuário é um administrador do espaço de trabalho: SimDefinir conta disponibilidade: DesbloqueadoSenha: simonConfirmar: simonExibir mudança de senha na primeira utilização: SimClicar em: Criar usuário

Page 8: Oracle 11g resumo

Efetuar logout no ícone, no topo superior direito.

Clicar no link login:Espaço de trabalho: TREINAWEBNome do usuário: treinaSenha: simonAparece a mensagem A senha para essa conta deve ser mudado.Nome de usuário: treina não pode ser mudado.Digitar senha atual: treinaDigite nova senha: SimoneClicar no botão: retornar

Informar a nova senhaWorkspace: TREINAWEBNome de usuário: treinaSenha: Simone

Criando usuário via código:Antes, conceder todos os privilégios no banco de dados para o usuário principal TREINAWEBExecutar linha de comando SQL:conn sys/oracle as sysdbaconectado

Conceder todos os privilégios:GRANT ALL PRIVILEGES TO TREINAWEB;concessão bem-sucedida.

Criar novo usuário por comando SQL:CREATE USER nome_usuárioIDENTIFIED [BY senha_usuario | EXTERNALLY ]DEFAULT TABLESPACE nomeTEMPORARY TABLESPACE nomeQUOTA [<valor em K ou M> | UNLIMITED]ON TABLESPACE

Voltar ao Application ExpressSelecionar Workshop > Comando SQLDigitar na tela que apareceCREATE USER usuario_teste IDENTIFIED BY senha_testeDEFAULT TABLESPACE USERSQUOTA UNLIMITED ON USERS;Resposta: User created

Para acessar o sistema com esse usuário, é necessário dar permissão de conexão para ele.GRANT CONNECT TO usuario_teste;Observação: Não é possível acessar o Application Service com o usuário: usuario_teste

Page 9: Oracle 11g resumo

Exclusão de usuários:DROP USER nome_usuario;

Criar usuário:CREATE USER vou_ser_excluido IDENTIFIED BY senha;

Excluir usuário:DROP USER vou_ser_excluido;

Login usando SQL PlusConectar ao banco de dados: CONNECT usuário_teste/senha_teste;Para desconectar: disconnect;

Criando tabelasCREATE TABLE nome_tabela( nome_coluna1 tipo_dado, nome_coluna2 tipo_dado);

Criar tabelas no construtor visualAbrir o Application ExpressMenu: SQL Workshop > Browser de ObjetosClicar em: CreateClicar no link tableNome da tabela: FUNCIONARIO

Nome da Coluna Tipo Precisão Escala Não nulo CODIGO_FUNCIONARIO NUMBER 10 x CPF CHAR 11NOME VARCHAR2 60 xSALARIO NUMBER 10 2DEPARTAMENTO VARCHAR2 60Clicar em: PróximoMarcar: Not populatedPrimary Key Constraint Name: Funcionario_pkPrimary Key: CODIGO_FUNCIONARIO(NUMBER)Composite Primary Key: xxxxClicar em: Próximo

Adicionar chave estrangeiraNome: Funcionario_fk Marcar: Disallow DeleteClicar em: Próximo

Esta tela permite a definição de Restrições de Constraint de Verificação e Constraint Exclusiva:ConstraintAdicionar ConstraintMarcar: verificarNome: FUNCIONARIO_ck1 clicar em Adicionar e Próxima

Page 10: Oracle 11g resumo

Criar tabelaEsquema: TREINAWEBNome Tabela: FUNCIONARIO

SQLCREATE 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” addConstraint “FUNCIONARIO_ck1”Check(salario > 0)/Clicar em: Criar

Criar tabelas por SQLSelecionar SQL Workshop > Comandos SQLDigitar: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 ConstraintsNOT NULL: não permite valor nulo.UNIQUE: exige que cada valor da coluna seja único (exclusivo) para todos os registros da tabela.PRIMARY KEY: define uma chave primária para uma tabela.FOREIGN KEY: cria um relacionamento entre as tabelas.CHECK: define uma condição a ser satisfeita.

Page 11: Oracle 11g resumo

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 estrangeiraCREATE 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, ‘SÃO 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’,’[email protected]’,1000);INSERT INTO CLIENTE VALUES(2, ‘MANOEL ANTONIO’,’RUA DO ACRE,10’,’22445512’,’[email protected]’,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);

Page 12: Oracle 11g resumo

Adicionar coluna em tabela existenteALTER TABLE nome_tabelaADD nome_do_campo tipo_dado;

ALTER TABLE CLIENTEADD CAMPO1 CHAR(25);

Excluir coluna em uma tabelaALTER TABLE nome_tabelaDROP COLUMN nome_campo;

ALTER TABLE CLIENTEDROP COLUMN CAMPO1;

Excluir tabelaDROP TABLE nome_tabela;

CRIAR SINÔNIMOS ( Criar apelido para a referência 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, atualização e eliminação de dados )CREATE [OR REPLACE] VIEW nome_viewAS---Instruções---[WITH READ ONLY];

Com o código abaixo, a View permite a atualização dos dados.CREATE OR REPLACE VIEW LISTA_FUNCIONARIOSASSELECT NOME FROM FUNCIONARIOS;

Visualizar dados com a ViewSELECT * FROM LISTA_FUNCIONARIOS;

Permite a atualização de dadosCREATE OR REPLACE VIEW VISAO_CIDADEASSELECT * FROM CIDADE;

Inserir dados com a ViewINSERT INTO VISAO_CIDADE VALUES (10,’TAUBATÉ’,’SP’,2);

Page 13: Oracle 11g resumo

VIEW apenas de leituraCREATE OR REPLACE VIEW VISAO_LEITURA_CIDADE ASSELECT * FROM CIDADEWITH READ ONLY;

Ao executar o código abaixo para incluir outro registro na tabela CIDADE, ocorrerá um erro.INSERT INTO VISAO_LEITURA_CIDADEVALUES( 11, ‘CAMPINAS’,’SP’,18);

Excluir uma VIEWDROP VIEW nome_view;DROP VIEW VISAO_LEITURA_CIDADE;

Ver todas as VIEWS de usuárioSELECT * FROM USER_VIEWS;

SequencePara criar campos de auto numeração. Utililiza-se esse objeto para que, na inserção de determinado registro, não seja necessário especificar um valor para o campo que deve possuir um código 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 sequênciaCREATE SEQUENCE MINHA_SEQUENCIASTART WITH 1INCREMENT BY 1MAXVALUE 999CYCLECACHE 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 ALUNOINSERT INTO ALUNO(CODIGO,NOME,CURSO)VALUES(MINHA_SEQUENCIA.NEXTVAL,’CARLOS’,’SISTEMAS DE INFORMAÇÃO’);

Para visualizar todas as sequencias que estão no schemaSELECT * FROM USER_SEQUENCES;

Page 14: Oracle 11g resumo

Excluir uma sequenciaDROP SEQUENCE nome_sequencia

CONSULTAS SQLSELECT [DISTINCT] lista_colunasFROM lista_tabelasWHERE condiçõesGROUP BY lista_colunasHAVING condições_grupoORDER 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 SELEÇÃO.SELECT NOME, SALARIO, SALARIO * 12 AS “SALÁRIO ANUAL”FROM FUNCIONARIOORDER BY CAMPO DESC;

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

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

SELECT CODIGO_CLIENTE, NOME, ENDERECO, TELEFONE, EMAIL, RENDAFROM CLIENTEWHERE (RENDA BETWEEN 1000 AND 2000)ORDER BY NOME;

CLÁUSULA: INCompara o valor da coluna com o conjunto de valores informados.SELECT CODIGO_CLIENTE, NOME FROM CLIENTEWHERE CODIGO_CLIENTE IN (1,2,4)ORDER BY NOME;

LIKE: utilizado exclusivamente em colunas com sequência caracteres.SELECT CODIGO_CLIENTE, NOME, ENDERECOFROM CLIENTEWHERE NOME LIKE ‘M%’ORDER BY NOME;

Page 15: Oracle 11g resumo

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 posição.

WHERE CPF IS NULL seleciona as colunas nulas.

LIKE: utilizado exclusivamente em colunas com sequência de caracteres.SELECT CODIGO_CLIENTE, NOME, ENDERECOFROM CLIENTEWHERE 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 posição.WHERE CPF IS NULL seleciona as colunas nulas.

Selecionar dados de uma tabelaSELECT * FROM CIDADE, FRETEWHERE CIDADE.CODIGO_CIDADE = FRETE.CODIGO_CIDADE;OUSELECT * FROM CIDADE INNER JOIN FRETEON CIDADE.CODIGO_CIDADE = FRETE.CODIGO_CIDADE;

Símbolo + pode ser usado para informar que se quer listar todos os dados da tabela que possua tal símbolo.SELECT * FROM CIDADE INNER JOIN FRETEON CIDADE.CODIGO_CIDADE = FRETE.CODIGO_CIDADE (+);

AliasSELECT * FROM CIDADE C INNER JOIN FRETE FON C.CODIGO_CIDADE = F.CODIGO_CIDADE;

PRIVILÉGIOSPRIVILÉGIO DESCRICAOSELECTINSERTUPDATEDELETEREFERENCES CRIAR CONSTRAINT QUE REFERENCIE À ESSA TABELAALTER ALTERA AS DEFINIÇÕES DA TABELA ATRAVÉS DO COMANDO ALTER TABLEINDEX CRIAR ÍNDICES

Page 16: Oracle 11g resumo

GRANT: conceder privilégios em uma tabelaGRANT [PRIVILEGES] ON [OBJECT] TO [USER]

EXEMPLO:CONECTAR AO USUÁRIO: connect usuario_teste/senha_teste;

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

Abrir Application Express, logar como usuário TREINAWEBGRANT SELECT ON CLIENTE TO USUARIO_TESTE;

Voltar ao SQL Plus e executar novamenteSELECT * FROM TREINAWEB.CLIENTE; a instrução é executada com sucesso.

Listar schemas de usuários criadosSELECT USERNAME FROM DBA_USERS;

REVOKE: revoga privilégios concedidos a um usuário.

Revogar privilégio concedido ao usuário “USUARIO_TESTE”REVOKE SELECT ON CLIENTE FROM USUARIO_TESTE;

Funções de grupoPodem aparecer na cláusula SELECT quanto na cláusula HAVINGA cláusula GROUP BY divide as linhas de uma ou mais tabelas em grupos de linhas.HAVING: seleciona os grupos que serão aceitos.AVG(), COUNT(), MAX(), MIN(), SUM()

AVG(): média aritmética dos valores da coluna.COUNT(): retorna número de linhas que satisfaz a condição, não conta valores nulos.MAX(): valor máximo da coluna.MIN(): valor mínimo 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 funções de grupo e colunas que não fazem uso das funções, é obrigado a utilizar a cláusula GROUP BY.EXEMPLO:SELECT RENDA, COUNT(*) FROM CLIENTE GROUP BY RENDA;

Page 17: Oracle 11g resumo

Não é possível utilizer a cláusula WHERE em conjunto com as funções de grupo.EXEMPLO:SELECT RENDA, COUNT(*)FROM CLIENTE WHERE COUNT(*) > 2GROUP BY RENDA; ocorrerá um erro.

Para esses casos, utilizar a cláusula HAVINGSELECT RENDA, COUNT(*) FROM CLIENTEHAVING COUNT(*) > 2; não ocorrerá erro.

SUBCONSULTASPrimeiro é executado o SELECT interno, em seguida o resultado é utilizado em uma condição 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 cláusula INSELECT NOME, RENDA FROM CLIENTE WHERE RENDA IN (SELECT RENDA FROM CLIENTE);

UPDATEUPDATE tabelaSET nome_coluna1 = valor1WHERE CONDIÇÃO

Aumentar em 10% o salário do funcionário MarioUPDATE FUNCIONARIOSET SALARIO = SALARIO * 1.1WHERE NOME = ‘MARIO’;

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

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

A unidade básica em PL/SQL é um bloco.Todos os programas em PL/SQL são compostos por blocos que podem estar localizados uns dentro dos outros. Geralmente, cada bloco efetua uma ação lógica no programa.

Page 18: Oracle 11g resumo

Estrutura do BlocoDECLARE Seção para declaração de variáveis, tipos, cursores e subprogramas locais.

BEGINSeção executável. Nesta seção ficam as instruções, procedimentos e SQL.Esta é a única seção do bloco que é indispensável e obrigatória.

EXPECTIONSeção/Setor onde ficam as instruções de tratamento de erro.

END

Exemplos de Blocos PL/SQLCriar tabelaCREATE TABLE TEMP_TABLE( NUM_COL INT, CHAR_COL VARCHAR(50));

Bloco anônimo não rotuladoDECLARE /* DECLARA VARIÁVEIS */ 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 VARIÁVEIS */ 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 ALTERAÇÕES */ ROLLBACK;END;

Page 19: Oracle 11g resumo

PROCEDIMENTO

CREATE OR REPLACE PROCEDURE InsereEmTemp AS /* DECLARA VARIÁVEIS */ 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 VARIÁVEIS */ 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 ALTERAÇÕES */ ROLLBACK;END InsereEmTemp;

Bloco anônimo para chamar a procedureBEGIN obrigatório InsereEmTemp;END; obrigatório