Comment créer une table temporaire dans une base de données Oracle?

90

Je souhaite créer une table temporaire dans une base de données Oracle

quelque chose comme

Declare table @table (int id)

Dans le serveur SQL

Et puis remplissez-le avec une instruction de sélection

C'est possible?

Merci

GigaPr
la source

Réponses:

130

Oui, Oracle a des tables temporaires. Voici un lien vers un article AskTom les décrivant et voici la documentation officielle d'Oracle CREATE TABLE.

Cependant, dans Oracle, seules les données d'une table temporaire sont temporaires. La table est un objet régulier visible par les autres sessions. Il est déconseillé de créer et de supprimer fréquemment des tables temporaires dans Oracle.

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

Oracle 18c a ajouté des tables temporaires privées, qui sont des objets en mémoire à session unique. Consultez la documentation pour plus de détails. Les tables temporaires privées peuvent être créées et supprimées dynamiquement.

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

Les tables temporaires peuvent être utiles, mais elles sont couramment utilisées de manière abusive dans Oracle. Ils peuvent souvent être évités en combinant plusieurs étapes en une seule instruction SQL à l'aide de vues en ligne.

hamishmcn
la source
40
Pas de vote négatif, mais je ne recommanderais jamais un CREATE TABLE AS SELECT pour une table temporaire globale - un développeur moins expérimenté pourrait se faire une fausse idée qu'il doit remplir les GTT de cette façon à chaque fois. Bien sûr, c'est un moyen pratique de copier la définition d'une autre table, mais l'exemple déroutera probablement certaines personnes.
Jeffrey Kemp
Je suis tout à fait d'accord avec Jeffrey Kemp ici, ce n'est qu'une façon de créer cette table, je suis tombé dessus, et je me suis rendu compte, dois-je mettre cette instruction select dans mon DDL.
Vijay Kumar
3
vous pouvez simplement ajouter "où 1 = 0";
Palcente
@Palcente qui implique toujours que vous auriez besoin d'une "vraie table" avec la même structure afin d'en créer une temporaire, ce qui n'est pas le cas (voir aussi cette réponse . En dehors de cela, cette réponse manque de souligner qu'il n'y a pas que la table temporaire GLOBAL , mais on peut aussi utiliser des tables temporaires "ordinaires". La différence avec SQL Server, comme le souligne Matthew , est un autre point important à ne pas manquer (ou à s'interroger sur les erreurs sur "le deuxième appel" à propos de l'objet déjà existant;)
Izzy
2
Cas d'utilisation valide pour CREATE TABLE AS SELECT: sélectionnez parmi les tables distantes avec des colonnes LOB, car vous ne pouvez pas directement à SELECTpartir d'elles. J'écris une procédure pour copier des enregistrements à partir d'une base de données distante, et c'était ma solution: amener les enregistrements dans un GTT, puis les copier dans la table "réelle".
rgoliveira
78

Juste un conseil. Les tables temporaires dans Oracle sont différentes de SQL Server. Vous le créez UNE FOIS et seulement UNE FOIS, pas à chaque session. Les lignes que vous y insérez ne sont visibles que par votre session et sont automatiquement supprimées (c'est-à-dire TRUNCATEnon DROP) lorsque vous terminez votre session (ou la fin de la transaction, selon la clause "ON COMMIT" que vous utilisez).

Matthew Watson
la source
15
Je ne comprends pas tout à fait. Vous avez dit que vous le créez une et une seule fois, et non à chaque session. Cependant, vous avez également dit que la table temporaire est supprimée à chaque session. Cela ne signifie-t-il pas que vous devrez créer la table temporaire à chaque session?
Chaos
31
DELETED, pas DROPped.
Tripp Kinetics
10
Vous ne créez pas de table temporaire à chaque session, mais une fois. Le tableau est disponible dans tout le système. La table est accessible à partir de n'importe quelle session que vous créez, y compris les sessions parallèles. mais lorsque vous insérez des données à partir d'une session, ces données ne sont pas visibles à partir d'autres sessions parallèles à travers le système. Les données d'une session sont la propriété de cette session uniquement. Ainsi, les données sont spécifiques à la session, non visibles par système. Par conséquent, lorsque vous fermez une session, les données de cette session sont supprimées de la table.
SubhasisM
33
CREATE GLOBAL TEMPORARY TABLE Table_name
    (startdate DATE,
     enddate DATE,
     class CHAR(20))
  ON COMMIT DELETE ROWS;
harish de nit ameerpet
la source
10
Notez que les lignes seront toujours supprimées à la fin de la session; ON COMMIT DELETE ROWSsignifie qu'ils seront supprimés plus tôt, si vous vous engagez de manière incrémentielle au cours d'une session.
1
zygimantus, oui, vous pouvez supprimer manuellement pendant la session. Pendant la session, la table temporaire se comporte exactement comme une table normale. La seule différence entre une table temporaire et une table réelle, du point de vue de l'utilisateur, est que toutes les lignes sont supprimées une fois la session terminée et qu'aucune autre session ne peut lire le contenu de la table utilisée par la session. Il existe une instance de la table par session; deux sessions peuvent utiliser la même table temporaire en même temps et avoir deux ensembles de lignes différents, sans aucun conflit.
Hans Deragon
-2

CREATE TABLE table_temp_list_objects AS

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

Edy Muniz
la source
Veuillez formater votre réponse. Ce serait bien si vous écrivez quelque chose sur votre code.
Auberge le