Usando GLOBAL TEMPORARY TABLE

Global temporary table é um objeto que possui um comportamento equivalente a uma tabela, sendo que os dados inseridos estarão disponíveis apenas dentro de uma determinada sessão ou até que sejam “comitados” (mantidos até o fim da transação)… isso depende de como a GTT foi criada. Pode ser muito útil para trabalhar dados temporários antes de serem retornados ao usuário ou gravados numa tabela comum.

Exemplo de criação de GTT onde os dados são mantidos durante a sessão:

CREATE GLOBAL TEMPORARY TABLE TESTE1_GTT
(“EMAIL” VARCHAR2(120 BYTE) NOT NULL ENABLE,
“NOME” VARCHAR2(100 BYTE) NOT NULL ENABLE,
“SOBRENOME” VARCHAR2(100 BYTE) NOT NULL ENABLE)
ON COMMIT PRESERVE ROWS;

Exemplo de criação de GTT onde os dados são mantidos até o fim da transação:

CREATE GLOBAL TEMPORARY TABLE TESTE2_GTT
(“EMAIL” VARCHAR2(120 BYTE) NOT NULL ENABLE,
“NOME” VARCHAR2(100 BYTE) NOT NULL ENABLE,
“SOBRENOME” VARCHAR2(100 BYTE) NOT NULL ENABLE)
ON COMMIT DELETE ROWS;

Atenção as seguintes características das GTTs:

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