Tabelas Temporárias
Autor: Luciana Carvalho | Publicado: 2011-07-20T13:16:00-07:00

Olá Pessoal .. Espero que estejam bem!!

Bom hoje e nas proxímas semanas &nbsp;irei falar sobre um dos pricipais objetos de armazenamento do Oracle que são as tabelas.
Irei falar sobre os vários tipos , então fiquem atentos e acompanhem este e os Próximos Posts.

Uma tabela temporária só será proveitosa durante a permanência em uma&nbsp; sessão ou a duração de uma &nbsp;transação, ou seja, quando uma sessão ou transação se inicia ela esta vazia. Após varias operações de insert, update, delete nesta tabela quando um usuário se desconectar de sua sessão ou sua transação for efetivada os dados da tabela serão perdidos. Mas seus metadados ficarão armazenados no dicionário de dados para operações posteriores até que seja excluída definitivamente do Banco de Dados.Irei mostrar dois exemplos de tabelas temporárias uma associada à transação e outra associada a uma sessão:
Exemplo 1 (Transação)
SQL&gt; create global temporary table luciana.TEMP_PESSOA
(CPF number(11),
Nome varchar2(40),
data_nasci date);&nbsp;&nbsp; 
Table created.

SQL&gt; insert into luciana.TEMP_PESSOA
values (27846888767,'LUIZ','09-MAY-11');&nbsp; &nbsp;
1 row created.
SQL&gt; select * from luciana.TEMP_PESSOA ;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CPF NOME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DATA_NASC---------- ---------------------------------------- ---------27846888767 LUIZ&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 09-MAY-11
SQL&gt; commit ;
Commit complete.

SQL&gt; select * from luciana.TEMP_PESSOA ;
no rows selected
SQL&gt; desc luciana.TEMP_PESSOA ;
Name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Null?&nbsp;&nbsp;&nbsp; Type&nbsp;----------------------------------------- -------- ----------------------------&nbsp;CPF&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NUMBER(11)&nbsp;NOME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VARCHAR2(40)&nbsp;DATA_NASCI&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;

Percebam que neste exemplo após criarmos a tabela e inserirmos dados na mesma, quando efetuamos uma transação (commit ou rollback) os dados da tabela são perdidos , mas sua estrutura continuará criada independente da desconexão do usuário até que seja dropada. 
Exemplo 2 (Sessão)
SQL&gt; create global temporary table luciana.TEMP_PESSOA2(CPF number(11),Nome varchar2(40),data_nasci date) ON COMMIT PRESERVE ROWS;&nbsp;&nbsp; 
Table created.
SQL&gt; insert into luciana.TEMP_PESSOA2&nbsp; 2&nbsp; values (27846888767,'LUIZ','09-MAY-11'); 
1 row created.
SQL&gt; COMMIT ;
Commit complete.
SQL&gt; select * from luciana.TEMP_PESSOA ;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CPF NOME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DATA_NASC---------- ---------------------------------------- ---------27846888767 LUIZ&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;09-MAY-11
[oracle@localhost ~]$ sqlplus luciana/*****@orcl ;
SQL&gt; select * from luciana.TEMP_PESSOA2 ;
no rows selected
SQL&gt; desc luciana.TEMP_PESSOA2 ;&nbsp;Name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Null?&nbsp;&nbsp;&nbsp; Type&nbsp;----------------------------------------- -------- ----------------------------&nbsp;CPF&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NUMBER(11)&nbsp;NOME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VARCHAR2(40)&nbsp;DATA_NASCI&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DATE

Note que no segundo exemplo&nbsp; na sintaxe de criação da tabela, utilizamos a cláusula ON COMMIT PRESERVE ROWS. Isto significa que após o término da transação os dados deverão ser mantidos independentemente da utilização de um (commit ou rollback) . Mas quando&nbsp; desconectar-mos e reconectar-mos de novo os dados serão limpos e só poderemos visualizar a estrutura da tabela.
Oracle Quick Tip :
Após a criação das tabela temporária ela poderá ficar visível para todas as sessões,porém seus dados serão acessíveis somente pela sessão que os inclui.
Isso &nbsp;é bom em relação aos locks pois eles não terão efeitos nesse tipo de tabela partindo do principio de que cada sessão tem acesso exclusivo a seus dados. Os dados serão criados na tablespace temporária do usuário e um comando TRUNCATE trunca somente os dados referentes à sua própria sessão.Os utilitários EXPD e IMPD podem exportar e importar a estrutura de uma tabela temporária,menos os seus dados.Também podemos criar índices temporários para estas tabelas.Além disto operações Rollback to Savepoint são suportadas mas caso ocorra uma falha no sistema os dados serão perdidos pois não existem logs gerados para as mesmas.Podemos criar triggers e views que utilizem simultaneamente tabelas temporárias.
Para mais informações sobre tabelas Temporárias visitem os sites que usei como referência :
http://www.oracle.com.br
Muito Obrigada.