Como você cria uma tabela temporária em um banco de dados Oracle?

90

Eu gostaria de criar uma tabela temporária em um banco de dados Oracle

algo como

Declare table @table (int id)

No servidor SQL

E então preencha-o com uma declaração selecionada

É possível?

obrigado

GigaPr
fonte

Respostas:

130

Sim, o Oracle tem tabelas temporárias. Aqui está um link para um artigo do AskTom descrevendo-os e aqui está a documentação oficial do oracle CREATE TABLE.

No entanto, no Oracle, apenas os dados em uma tabela temporária são temporários. A mesa é um objeto regular visível para outras sessões. É uma má prática criar e eliminar tabelas temporárias no Oracle com frequência.

CREATE GLOBAL TEMPORARY TABLE today_sales(order_id NUMBER)
ON COMMIT PRESERVE ROWS;

O Oracle 18c adicionou tabelas temporárias privadas, que são objetos na memória de sessão única. Veja a documentação para mais detalhes. As tabelas temporárias privadas podem ser criadas e eliminadas dinamicamente.

CREATE PRIVATE TEMPORARY TABLE ora$ptt_today_sales AS
SELECT * FROM orders WHERE order_date = SYSDATE;

As tabelas temporárias podem ser úteis, mas costumam ser abusadas no Oracle. Muitas vezes, eles podem ser evitados combinando várias etapas em uma única instrução SQL usando visualizações sequenciais.

Hamishmcn
fonte
40
Nenhum downvote, mas eu nunca recomendaria um CREATE TABLE AS SELECT para uma tabela temporária global - um desenvolvedor menos experiente pode ter a ideia errada de que eles têm que preencher GTTs desta forma todas as vezes. Claro, esta é uma maneira conveniente de copiar a definição de outra tabela, mas o exemplo provavelmente confundirá algumas pessoas.
Jeffrey Kemp de
Concordo totalmente com o Jeffrey Kemp aqui, essa é apenas uma forma de criar essa tabela, me deparei com isso e percebi cara, eu tenho que colocar essa instrução select na minha DDL.
Vijay Kumar
3
você pode apenas adicionar "onde 1 = 0";
Palcente 01 de
@Palcente que ainda implica que você precisaria de uma "mesa real" com a mesma estrutura para criar uma temporária, o que não é o caso (veja também esta resposta . Fora isso, falta nesta resposta apontar que não há apenas a tabela temporária GLOBAL , mas também se pode usar tabelas temporárias "comuns". A diferença para o SQL Server, como apontado por Matthew , é outro ponto importante que deve-se ter certeza de não perder (ou questionar sobre erros na "segunda chamada" sobre o objeto já existente;)
Izzy
2
Caso de uso válido para CREATE TABLE AS SELECT: selecionar a partir de tabelas remotas com colunas LOB, já que você não pode diretamente SELECTdelas. Estou escrevendo um procedimento para copiar registros de um banco de dados remoto e esta foi minha solução: trazer os registros para um GTT e depois copiar para a tabela "real".
rgoliveira
78

Só uma dica ... As tabelas temporárias no Oracle são diferentes do SQL Server. Você o cria UMA VEZ e apenas UMA VEZ, não em todas as sessões. As linhas que você insere são visíveis apenas para a sua sessão e são automaticamente excluídas (ou seja, TRUNCATEnão DROP) quando você encerra a sessão (ou no final da transação, dependendo de qual cláusula "ON COMMIT" você usa).

Matthew Watson
fonte
15
Eu não entendo totalmente. Você disse que o cria uma e apenas uma vez, e não em todas as sessões. No entanto, você também disse que a tabela temporária é excluída a cada sessão. Isso não significa que você precisará criar a tabela temporária a cada sessão?
Chaos
31
DELETED, não DROPped.
Tripp Kinetics
10
Você não cria uma tabela temporária a cada sessão, mas uma vez. A tabela está disponível em todo o sistema. A tabela pode ser acessada em qualquer sessão que você criar, incluindo sessões paralelas. mas quando você insere dados de dentro de uma sessão, esses dados não ficam visíveis de outras sessões paralelas no sistema. Os dados de uma sessão são propriedade apenas dessa sessão. Assim, os dados são específicos da sessão, não visíveis no sistema. Portanto, quando você fecha uma sessão, os dados dessa sessão são excluídos da tabela.
SubhasisM
33
CREATE GLOBAL TEMPORARY TABLE Table_name
    (startdate DATE,
     enddate DATE,
     class CHAR(20))
  ON COMMIT DELETE ROWS;
harish de nit ameerpet
fonte
10
Observe que as linhas sempre serão excluídas no final da sessão; ON COMMIT DELETE ROWSsignifica que eles serão descartados mais cedo, se você fizer commit incrementalmente durante uma sessão.
1
zygimantus, sim, você pode excluir manualmente durante a sessão. Durante a sessão, a mesa temporária se comporta exatamente como uma mesa normal. A única diferença entre uma tabela temporária e uma tabela real, da perspectiva do usuário, é que todas as linhas são excluídas quando a sessão termina e nenhuma outra sessão pode ler o conteúdo da tabela usada pela sessão. Existe uma instância da tabela por sessão; duas sessões podem usar a mesma tabela temporária ao mesmo tempo e ter dois conjuntos diferentes de linhas, sem qualquer conflito.
Hans Deragon 01 de
-2

CRIAR TABELA table_temp_list_objects AS

SELECT o.owner, o.object_name FROM sys.all_objects o WHERE o.object_type = 'TABLE';

Edy Muniz
fonte
Formate sua resposta. Seria bom se você escrever algo sobre seu código.
Hostel