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.
|
|