Jak utworzyć tabelę tymczasową w bazie danych Oracle?


93

Chciałbym utworzyć tymczasową tabelę w bazie danych Oracle

coś jak

Declare table @table (int id)

Na serwerze SQL

A następnie wypełnij go instrukcją Select

Czy to możliwe?

Dzięki

Odpowiedzi:


131

Tak, Oracle ma tymczasowe tabele. Tutaj jest link do artykułu AskTom opisującego je, a tutaj jest oficjalna dokumentacja Oracle CREATE TABLE.

Jednak w Oracle tylko dane w tabeli tymczasowej są tymczasowe. Tabela jest zwykłym obiektem widocznym dla innych sesji. Częste tworzenie i usuwanie tabel tymczasowych w Oracle jest złą praktyką.

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

Oracle 18c dodał prywatne tabele tymczasowe, które są obiektami w pamięci pojedynczej sesji. Więcej informacji można znaleźć w dokumentacji . Prywatne tabele tymczasowe można dynamicznie tworzyć i usuwać.

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

Tabele tymczasowe mogą być przydatne, ale w Oracle są często nadużywane. Często można ich uniknąć, łącząc wiele kroków w jedną instrukcję SQL przy użyciu widoków wbudowanych.


40
Bez głosu negatywnego, ale nigdy nie polecałbym tworzenia tabeli CREATE TABLE AS SELECT dla globalnej tabeli tymczasowej - mniej doświadczony programista może mieć zły pomysł, że za każdym razem musi wypełniać GTT w ten sposób. Jasne, jest to wygodny sposób kopiowania definicji z innej tabeli, ale przykład prawdopodobnie wprowadzi w błąd niektórych ludzi.
Jeffrey Kemp

Całkowicie zgadzam się tutaj z Jeffreyem Kempem, to tylko jeden ze sposobów tworzenia tej tabeli, natknąłem się na to i zdałem sobie sprawę, człowieku, czy muszę umieścić tę instrukcję wyboru w moim DDL.
Vijay Kumar

3
możesz po prostu dodać "gdzie 1 = 0";
Palcente

@Palcente, co nadal sugeruje, że potrzebujesz „prawdziwej tabeli” o tej samej strukturze, aby utworzyć tymczasową tabelę, co nie ma miejsca (zobacz także tę odpowiedź . Poza tym, ta odpowiedź nie wskazuje, że nie ma tylko GLOBAL tabeli tymczasowej, ale można też użyć „zwykłej” tabel tymczasowych. różnica w stosunku do SQL Server, jak wskazał przez Mateusza , to kolejny ważny punkt powinien upewnić się, aby nie przegapić (lub zastanawiać błędów na „drugiego naboru” o obiekcie już istniejącym;)
Izzy

2
Prawidłowy przypadek użycia CREATE TABLE AS SELECT: wybierz ze zdalnych tabel z kolumnami LOB, ponieważ nie możesz bezpośrednio SELECTz nich. Piszę procedurę kopiowania rekordów ze zdalnej bazy danych i to było moje rozwiązanie: przenieś rekordy do GTT, a następnie skopiuj z tego do „prawdziwej” tabeli.
rgoliveira,

78

Wskazówka… Tymczasowe tabele w Oracle różnią się od SQL Server. Tworzysz ją RAZ i TYLKO RAZ, nie w każdej sesji. Wiersze, które w nim wstawisz, są widoczne tylko dla Twojej sesji i są automatycznie usuwane (tj. TRUNCATENie DROP) po zakończeniu sesji (lub zakończeniu transakcji, w zależności od używanej klauzuli „ON COMMIT”).


15
Nie do końca rozumiem. Powiedziałeś, że tworzysz to raz i tylko raz, a nie w każdej sesji. Jednak powiedziałeś również, że tabela tymczasowa jest usuwana podczas każdej sesji. Czy to nie oznacza, że ​​będziesz musiał tworzyć tymczasową tabelę w każdej sesji?
Chaos

31
DELETED, nie DROPped.
Tripp Kinetics

10
Nie tworzysz tymczasowej tabeli w każdej sesji, ale tylko raz. Tabela jest dostępna w całym systemie. Tabela jest dostępna z każdej utworzonej sesji, w tym z sesji równoległych. ale kiedy wstawiasz dane z jednej sesji, dane te nie są widoczne z innych równoległych sesji w systemie. Dane jednej sesji są własnością tylko tej sesji. W ten sposób dane są specyficzne dla sesji i nie są widoczne systemowo. Dlatego po zamknięciu jednej sesji dane tej sesji są usuwane z tabeli.
SubhasisM

33
CREATE GLOBAL TEMPORARY TABLE Table_name
    (startdate DATE,
     enddate DATE,
     class CHAR(20))
  ON COMMIT DELETE ROWS;

10
Zwróć uwagę, że wiersze będą zawsze usuwane na koniec sesji; ON COMMIT DELETE ROWSoznacza, że ​​zostaną odrzucone wcześniej, jeśli będziesz zatwierdzać stopniowo podczas sesji.

1
zygimantus, tak, możesz usunąć ręcznie podczas sesji. Podczas sesji tabela tymczasowa zachowuje się dokładnie tak, jak zwykła tabela. Jedyną różnicą między tabelą tymczasową a tabelą rzeczywistą z perspektywy użytkownika jest to, że wszystkie wiersze są usuwane po zakończeniu sesji i żadna inna sesja nie może odczytać zawartości tabeli używanej przez sesję. Na sesję przypada jedna instancja tabeli; dwie sesje mogą używać tej samej tabeli tymczasowej w tym samym czasie i mieć dwa różne zestawy wierszy bez żadnego konfliktu.
Hans Deragon

-2

UTWÓRZ TABELĘ table_temp_list_objects AS

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


Sformatuj swoją odpowiedź. Byłoby dobrze, gdybyś napisał coś o swoim kodzie.
Hostel
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.