Home - www.devmedia.com.br

Tabelas Temporárias no Banco de Dados Oracle

DEFINIÇÃO

Uma tabela temporária é uma tabela com vida útil de uma sessão ou transação. Ela está vazia quando a sessão ou transação começa e descarta os dados ao fim da sessão ou transação. Uma tabela temporária é associada à transação. Isto significa que ao término da transação os dados da tabela são perdidos, porém sua descrição permanece gravada no banco de dados mesmo após a mudança de sessão.

Nesta solução, o que é temporário é o armazenamento dos dados. Com este tipo de tabela não temos necessidade de remover os dados ao término da transação. Podem ser muito úteis na geração de dados de trabalho temporários. A seguir serão mostrados dois exemplos: O primeiro (Listagem 1) de uma tabela temporária que é associada à transação e o segundo (Listagem 2), de uma tabela temporária que é associada à sessão.

SQL> create global temporary table TEMP_PROD
2 (cod_prod number(5),
3 desc_prod varchar2(30),
4 dat_cadas date);

Table created.

SQL> insert into TEMP_PROD
2 values (1,'Mesa',sysdate);

1 row created.

SQL> select * from TEMP_PROD;

COD_PROD DESC_PROD DAT_CADAS
---------- ------------------------------ ---------
1 Mesa 18-MAR-05

SQL> commit;

Commit complete.

SQL> select * from TEMP_PROD;

no rows selected

SQL> desc TEMP_PROD;
Name Null? Type
------------------------------- -------- ----
COD_PROD NUMBER(5)
DESC_PROD VARCHAR2(30)
DAT_CADAS DATE

SQL>

Listagem 1. Tabela temporária por transação

Neste primeiro exemplo foi criada uma tabela temporária associada à transação. Isto significa que ao término da transação (commit ou rollback) os dados da tabela são perdidos. No exemplo, utilizamos o comando commit para finalizar a transação. Note que após executar o comando commit, o select seguinte não retorna nenhum registro, porém a estrutura da tabela permanece gravada no banco de dados mesmo após a mudança de sessão.

SQL> create global temporary table TEMP_PROD
2 (cod_prod number(5),
3 desc_prod varchar2(30),
4 dat_cadas date) on commit preserve rows;

Table created.

SQL> insert into TEMP_PROD
2 values (100,'Computador',sysdate);

1 row created.

SQL> select * from TEMP_PROD;

COD_PROD DESC_PROD DAT_CADAS
---------- ------------------------------ ---------
100 Computador 18-MAR-05

SQL> commit;

Commit complete.

SQL> select * from TEMP_PROD;

COD_PROD DESC_PROD DAT_CADAS
---------- ------------------------------ ---------
100 Computador 18-MAR-05

SQL> connect dados@data1w
Enter password: *****
Connected.

SQL> select * from TEMP_PROD;

no rows selected

SQL> desc TEMP_PROD;
Name Null? Type
------------------------------- -------- ----
COD_PROD NUMBER(5)
DESC_PROD VARCHAR2(30)
DAT_CADAS DATE


Listagem 2. Tabela temporária por sessão

Neste segundo exemplo, a tabela foi criada com a indicação de que após o término da transação os dados deverão ser mantidos, ou seja, a tabela é temporária, porém seus dados ficam disponíveis por toda a sessão independente de transação. Quando ocorre o fim da sessão (disconnect e connect), os dados são removidos (ou liberados). Note que no exemplo acima, após executar o comando connect, os dados da tabela foram removidos, porém a estrutura da tabela permanece gravada no banco de dados mesmo após a mudança de sessão.

CARACTERÍSTICAS

Segundo Fernandes, as tabelas temporárias possuem as seguintes características:
• Sua definição é visível para todas as sessões, mas seus dados são visíveis e acessíveis somente pela sessão que os inclui.

• O comando LOCK não tem efeito em tabelas temporárias uma vez que cada sessão tem acesso exclusivo a seus dados.

• Um comando TRUNCATE trunca somente os dados referentes à sessão do usuário.
• Os dados são criados na tablespace temporária do usuário.

• Operações de Rollback to Savepoint são suportadas, mas os dados não são recuperáveis caso ocorra um “crash” porque as modificações não são logadas (gravadas no REDO LOG).

• Podemos criar índices para uma tabela temporária usando o comando CREATE INDEX. Estes índices também são temporários.

• Podemos criar triggers para tabelas temporárias assim como views que utilizem simultaneamente tabelas temporárias e permanentes.

• Os utilitários IMPORT e EXPORT podem exportar e importar a definição de uma tabela temporária, porém nenhum dado é exportado.

• Da mesma forma, podemos replicar a definição de uma tabela temporária, mas não podemos replicar seus dados.

• Só podemos executar operações de DDL (ALTER TABLE, DROP TABLE, CREATE INDEX, etc.) para a tabela temporária se não houver nenhuma tabela fazendo acesso a ela.

• Uma tabela temporária associada à transação é acessível por uma determinada transação e suas transações filha. Porém, uma tabela temporária associada à transação não é acessível por duas transações simultâneas na mesma sessão, apesar de poder ser usada por transações em diferentes sessões.

• Se uma transação do usuário faz um INSERT em uma tabela temporária, então nenhuma de suas transações filhas pode usar a tabela temporária após isto.

• Se uma transação filha faz um INSERT em uma tabela temporária, ao fim da transação filha, o dado associado com a tabela temporária é removido. Após isto, tanto a transação do usuário quanto qualquer outra transação podem fazer acesso à tabela temporária.

Conclusões

Vimos neste artigo que o uso da tabelas temporárias é muito interessante, o uso deste mecanismo por transação ou sessão deverá ser analisado em cada caso. Isto pode evitar o problema de se manter tabelas temporárias com volumes grandes armazenados no banco de dados sem real necessidade.

Referências

http://www.oracle.com.br– site da Oracle
http://metalink.oracle.com– Site da Oracle de pesquisa técnica.
Fernandes, Lúcia; Oracle 9i para Desenvolvedores Curso Completo, Axcel Books, 1ª. Edição, 2002.

 

Um abraço.

Marcelo Ferrari.

E-mail: ferrari@datainfo.inf.br

 

Marcelo Ferrari é graduado em Ciência da Computação pela Universidade Regional de Blumenau (FURB) e Sistemas de Informação pela Uniasselvi, mestrado em Ciência da Computação pela UFSC. Atualmente é diretor comercial da Datainfo ( www.datainfo.inf.br ) e também é professor Uniasselvi. Trabalha com ferramentas Oracle a mais de 9 anos. Suas áreas de pesquisa e interesse atuais são banco de dados, Business Intelligence e Workflow.

  Tabelas Temporárias no Banco de Dados Oracle    
  Boas-Vindas    
     

 

Todos os direitos reservados: DevMedia Group
SQL Magazine - 2004