Bagaimana Anda membuat tabel sementara di database Oracle?

93

Saya ingin membuat tabel sementara dalam database Oracle

sesuatu seperti

Declare table @table (int id)

Di server SQL

Dan kemudian mengisinya dengan pernyataan pilih

Apa itu mungkin?

Terima kasih

GigaPr
sumber

Jawaban:

131

Ya, Oracle memiliki tabel sementara. Berikut ini adalah link ke AskTom artikel yang menjelaskan mereka dan di sini adalah oracle resmi MENCIPTAKAN dokumentasi TABLE.

Namun, di Oracle, hanya data di tabel sementara yang bersifat sementara. Tabel adalah objek biasa yang terlihat pada sesi lain. Merupakan praktik yang buruk untuk sering membuat dan menjatuhkan tabel sementara di Oracle.

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

Oracle 18c menambahkan tabel sementara pribadi, yang merupakan objek dalam memori sesi tunggal. Lihat dokumentasi untuk lebih jelasnya. Tabel sementara pribadi dapat dibuat dan dibuang secara dinamis.

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

Tabel sementara dapat berguna tetapi biasanya disalahgunakan di Oracle. Mereka sering dapat dihindari dengan menggabungkan beberapa langkah menjadi satu pernyataan SQL menggunakan tampilan sebaris.

hamishmcn
sumber
41
Tidak ada suara negatif, tetapi saya tidak akan merekomendasikan BUAT TABEL SEBAGAI PILIH untuk tabel sementara global - pengembang yang kurang berpengalaman mungkin mendapatkan ide yang salah bahwa mereka harus mengisi GTT dengan cara ini setiap saat. Tentu, ini adalah cara mudah untuk menyalin definisi dari tabel lain, tetapi contoh tersebut mungkin akan membingungkan sebagian orang.
Jeffrey Kemp
Saya sangat setuju dengan Jeffrey Kemp di sini, ini hanyalah salah satu cara untuk membuat tabel ini, saya menemukan ini, dan sadarlah, apakah saya harus meletakkan pernyataan pilih ini di DDL saya.
Vijay Kumar
3
Anda bisa menambahkan "di mana 1 = 0";
Palcente
@Palcente yang masih mengimplikasikan bahwa Anda memerlukan "tabel nyata" dengan struktur yang sama untuk membuat tabel sementara, yang sebenarnya tidak demikian (lihat juga jawaban ini . Selain itu, jawaban ini tidak menunjukkan bahwa tidak hanya yang GLOBAL tabel sementara, tapi satu juga dapat menggunakan tabel sementara "biasa". perbedaan ke SQL Server, seperti yang ditunjukkan oleh Matthew , adalah satu lagi poin penting harus memastikan untuk tidak kehilangan (atau bertanya-tanya tentang kesalahan pada "panggilan kedua" tentang objek yang sudah ada;)
Izzy
2
Kasus penggunaan yang valid untuk CREATE TABLE AS SELECT: pilih dari tabel jarak jauh dengan kolom LOB, karena Anda tidak dapat langsung SELECTdari tabel tersebut . Saya sedang menulis prosedur untuk menyalin catatan dari database jarak jauh, dan inilah solusi saya: bawa catatan ke dalam GTT, dan kemudian salin dari situ ke tabel "nyata".
rgoliveira
78

Sekadar tip .. Tabel sementara di Oracle berbeda dengan SQL Server. Anda membuatnya SEKALI dan hanya SEKALI, tidak setiap sesi. Baris yang Anda masukkan ke dalamnya hanya terlihat untuk sesi Anda, dan secara otomatis dihapus (yaitu, TRUNCATEtidak DROP) ketika Anda mengakhiri sesi Anda (atau akhir transaksi, tergantung pada klausa "ON COMMIT" yang Anda gunakan).

Matthew Watson
sumber
15
Saya tidak sepenuhnya mengerti. Anda bilang Anda membuatnya sekali dan hanya sekali, dan tidak setiap sesi. Namun Anda juga mengatakan bahwa tabel sementara dihapus setiap sesi. Bukankah itu berarti Anda harus membuat tabel sementara setiap sesi?
Chaos
31
DELETED, bukan DROPped.
Tripp Kinetics
10
Anda tidak membuat tabel sementara setiap sesi, tetapi sekali. Tabel tersedia di seluruh sistem. Tabel dapat diakses dari sesi apa pun yang Anda buat, termasuk sesi paralel. tetapi ketika Anda memasukkan data dari dalam satu sesi, data tersebut tidak terlihat dari sesi paralel lainnya di seluruh sistem. Data satu sesi adalah properti sesi itu saja. Dengan demikian, data bersifat khusus sesi, tidak terlihat secara sistematis. Karenanya, saat Anda menutup satu sesi, data sesi tersebut dihapus dari tabel.
SubhasisM
33
CREATE GLOBAL TEMPORARY TABLE Table_name
    (startdate DATE,
     enddate DATE,
     class CHAR(20))
  ON COMMIT DELETE ROWS;
harish dari nit ameerpet
sumber
10
Perhatikan bahwa baris akan selalu dihapus di akhir sesi; ON COMMIT DELETE ROWSberarti mereka akan dibuang lebih cepat, jika Anda berkomitmen secara bertahap selama sesi.
1
zygimantus, ya, Anda dapat menghapus secara manual selama sesi. Selama sesi, tabel sementara berperilaku persis seperti tabel normal. Satu-satunya perbedaan antara tabel sementara dan tabel nyata, dari sudut pandang pengguna, adalah bahwa semua baris dihapus setelah sesi berakhir dan tidak ada sesi lain yang dapat membaca konten tabel yang digunakan oleh sesi tersebut. Ada contoh tabel per sesi; dua sesi dapat menggunakan tabel sementara yang sama pada waktu yang sama dan memiliki dua kumpulan baris yang berbeda, tanpa konflik apa pun.
Hans Deragon
-2

BUAT TABEL table_temp_list_objects AS

PILIH o.owner, o.object_name DARI sys.all_objects o WHERE o.object_type = 'TABLE';

Edy Muniz
sumber
Harap format jawaban Anda. Akan lebih baik jika Anda menulis sesuatu tentang kode Anda.
Hostel