Wie erstellen Sie eine temporäre Tabelle in einer Oracle-Datenbank?

90

Ich möchte eine temporäre Tabelle in einer Oracle-Datenbank erstellen

etwas wie

Declare table @table (int id)

In SQL Server

Und füllen Sie es dann mit einer select-Anweisung

Ist es möglich?

Vielen Dank

GigaPr
quelle

Antworten:

130

Ja, Oracle hat temporäre Tabellen. Hier ist ein Link zu einem AskTom- Artikel, der sie beschreibt, und hier ist die offizielle Oracle CREATE TABLE-Dokumentation.

In Oracle sind jedoch nur die Daten in einer temporären Tabelle temporär. Die Tabelle ist ein reguläres Objekt, das für andere Sitzungen sichtbar ist. Es wird empfohlen, häufig temporäre Tabellen in Oracle zu erstellen und zu löschen.

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

Oracle 18c fügte private temporäre Tabellen hinzu, bei denen es sich um speicherinterne Objekte für eine Sitzung handelt. Weitere Informationen finden Sie in der Dokumentation . Private temporäre Tabellen können dynamisch erstellt und gelöscht werden.

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

Temporäre Tabellen können nützlich sein, werden jedoch in Oracle häufig missbraucht. Sie können häufig vermieden werden, indem mehrere Schritte mithilfe von Inline-Ansichten zu einer einzigen SQL-Anweisung kombiniert werden.

hamishmcn
quelle
40
Kein Downvote, aber ich würde niemals eine CREATE TABLE AS SELECT für eine globale temporäre Tabelle empfehlen - ein weniger erfahrener Entwickler könnte die falsche Vorstellung haben, dass er GTTs jedes Mal auf diese Weise füllen muss. Sicher, dies ist eine bequeme Möglichkeit, die Definition aus einer anderen Tabelle zu kopieren, aber das Beispiel wird wahrscheinlich einige Leute verwirren.
Jeffrey Kemp
Ich stimme Jeffrey Kemp hier voll und ganz zu. Dies ist nur eine Möglichkeit, diese Tabelle zu erstellen. Ich bin darauf gestoßen und habe festgestellt, dass ich diese ausgewählte Anweisung in meine DDL aufnehmen muss.
Vijay Kumar
3
Sie können einfach "wobei 1 = 0" hinzufügen;
Palcente
@Palcente, das immer noch impliziert, dass Sie eine "echte Tabelle" mit derselben Struktur benötigen, um eine temporäre Tabelle zu erstellen, was nicht der Fall ist (siehe auch diese Antwort . Abgesehen davon wird in dieser Antwort nicht darauf hingewiesen, dass es nicht nur eine gibt die temporäre GLOBAL- Tabelle, aber man kann auch "normale" temporäre Tabellen verwenden. Der Unterschied zu SQL Server, wie von Matthew hervorgehoben , ist ein weiterer wichtiger Punkt, den man nicht verpassen sollte (oder sich über Fehler beim "zweiten Aufruf" wundern sollte). über das bereits vorhandene Objekt;)
Izzy
2
Gültiger Anwendungsfall für CREATE TABLE AS SELECT: Wählen Sie aus Remote-Tabellen mit LOB-Spalten aus, da Sie nicht direkt SELECTdaraus auswählen können. Ich schreibe eine Prozedur zum Kopieren von Datensätzen aus einer entfernten Datenbank, und dies war meine Lösung: Bringen Sie die Datensätze in eine GTT und kopieren Sie sie dann in die "echte" Tabelle.
Rgoliveira
78

Nur ein Tipp. Temporäre Tabellen in Oracle unterscheiden sich von SQL Server. Sie erstellen es EINMAL und nur EINMAL, nicht jede Sitzung. Die Zeilen, die Sie einfügen, sind nur für Ihre Sitzung sichtbar und werden automatisch gelöscht (dh TRUNCATEnicht DROP), wenn Sie Ihre Sitzung beenden (oder die Transaktion beenden, je nachdem, welche "ON COMMIT" -Klausel Sie verwenden).

Matthew Watson
quelle
15
Ich verstehe nicht ganz. Sie sagten, Sie erstellen es einmal und nur einmal und nicht bei jeder Sitzung. Sie haben jedoch auch gesagt, dass die temporäre Tabelle bei jeder Sitzung gelöscht wird. Bedeutet das nicht, dass Sie die temporäre Tabelle in jeder Sitzung erstellen müssen?
Chaos
31
DELETED, nicht DROPped.
Tripp Kinetics
10
Sie erstellen nicht jede Sitzung, sondern nur einmal eine temporäre Tabelle. Die Tabelle ist systemweit verfügbar. Auf die Tabelle kann von jeder von Ihnen erstellten Sitzung aus zugegriffen werden, einschließlich paralleler Sitzungen. Wenn Sie jedoch Daten aus einer Sitzung einfügen, sind diese Daten in anderen parallelen Sitzungen im gesamten System nicht sichtbar. Die Daten einer Sitzung sind nur Eigentum dieser Sitzung. Somit sind die Daten sitzungsspezifisch und systemweit nicht sichtbar. Wenn Sie eine Sitzung schließen, werden die Daten dieser Sitzung aus der Tabelle gelöscht.
SubhasisM
33
CREATE GLOBAL TEMPORARY TABLE Table_name
    (startdate DATE,
     enddate DATE,
     class CHAR(20))
  ON COMMIT DELETE ROWS;
Harish aus Nit Ameerpet
quelle
10
Beachten Sie, dass die Zeilen immer am Ende der Sitzung gelöscht werden. ON COMMIT DELETE ROWSbedeutet, dass sie früher verworfen werden, wenn Sie während einer Sitzung schrittweise Festschreibungen vornehmen.
1
zygimantus, ja, Sie können während der Sitzung manuell löschen. Während der Sitzung verhält sich die temporäre Tabelle genau wie eine normale Tabelle. Der einzige Unterschied zwischen einer temporären Tabelle und einer realen Tabelle besteht aus Benutzersicht darin, dass alle Zeilen nach Beendigung der Sitzung gelöscht werden und keine andere Sitzung den Inhalt der von der Sitzung verwendeten Tabelle lesen kann. Pro Sitzung gibt es eine Instanz der Tabelle. Zwei Sitzungen können dieselbe temporäre Tabelle gleichzeitig verwenden und ohne Konflikte zwei verschiedene Zeilensätze haben.
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
quelle
Bitte formatieren Sie Ihre Antwort. Es wäre gut, wenn Sie etwas über Ihren Code schreiben würden.
Hostel