Oracle veritabanında nasıl geçici bir tablo oluşturursunuz?


94

Oracle veritabanında geçici bir tablo oluşturmak istiyorum

gibi bir şey

Declare table @table (int id)

SQL sunucusunda

Ve sonra bunu bir select deyimiyle doldurun

Mümkün mü?

Teşekkürler

Yanıtlar:


132

Evet, Oracle'da geçici tablolar var. İşte bunları açıklayan bir AskTom makalesine bağlantı ve işte oracle CREATE TABLE belgeleri.

Ancak Oracle'da yalnızca geçici tablodaki veriler geçicidir. Tablo, diğer oturumlar tarafından görülebilen normal bir nesnedir. Oracle'da sık sık geçici tablolar oluşturmak ve bırakmak kötü bir uygulamadır.

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

Oracle 18c, tek oturumluk bellek içi nesneler olan özel geçici tablolar ekledi. Daha fazla ayrıntı için belgelere bakın. Özel geçici tablolar dinamik olarak oluşturulabilir ve çıkarılabilir.

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

Geçici tablolar yararlı olabilir ancak genellikle Oracle'da kötüye kullanılırlar. Satır içi görünümler kullanılarak birden çok adımı tek bir SQL deyiminde birleştirerek genellikle bunlardan kaçınılabilir.


41
Olumsuz oy yok, ancak küresel bir geçici tablo için SEÇİLEN BİR TABLO OLUŞTURMA'yı asla önermem - daha az deneyimli bir geliştirici, GTT'leri her seferinde bu şekilde doldurmaları gerektiği konusunda yanlış bir fikre kapılabilir. Elbette bu, tanımı başka bir tablodan kopyalamak için uygun bir yoldur, ancak örnek muhtemelen bazı kişilerin kafasını karıştıracaktır.
Jeffrey Kemp

Jeffrey Kemp'e burada tamamen katılıyorum, bu bu masayı yaratmanın sadece bir yolu, bununla karşılaştım ve anladım ki adamım, bu seçme ifadesini DDL'me koymalı mıyım?
Vijay Kumar

3
"1 = 0 olduğu yerde" ekleyebilirsiniz;
Palcente

@Palcente hala geçici bir tane oluşturmak için aynı yapıya sahip "gerçek bir tablo" ya ihtiyacınız olduğunu ima ediyor, ki durum böyle değil ( bu yanıta da bakın . Bunun dışında, bu cevap sadece KÜRESEL geçici tablo, ama bir de "sıradan" geçici tablolar kullanabilirsiniz. SQL Server fark olarak Matta tarafından işaret , bir başka önemli nokta bir yapmalıdır olup olmadığından emin olmadıklarını "ikinci çağrı" konulu hatalar hakkında bayan (ya da meraka zaten var olan nesne hakkında;)
Izzy

2
Şunlar için geçerli kullanım durumu CREATE TABLE AS SELECT: Doğrudan SELECTonlardan yapamayacağınız için LOB sütunları olan uzak tablolardan seçim yapın . Uzak bir veritabanından kayıtları kopyalamak için bir prosedür yazıyorum ve bu benim çözümümdü: kayıtları bir GTT'ye getirin ve ondan "gerçek" tabloya kopyalayın.
rgoliveira

78

Sadece bir ipucu .. Oracle'daki geçici tablolar SQL Server'dan farklıdır. Her oturumda değil, BİR KEZ ve sadece BİR KEZ yaratırsınız. İçine eklediğiniz satırlar yalnızca oturumunuz tarafından görülebilir ve oturumunuzu bitirdiğinizde (veya kullandığınız "ON COMMIT" maddesine bağlı olarak işlemin sonunda) otomatik olarak silinir (yani TRUNCATE, değil DROP).


15
Tam olarak anlamıyorum Her seansta değil, sadece bir kez yarattığını söyledin. Ancak geçici tablonun her oturumda silindiğini de söylediniz. Bu, her oturumda geçici bir masa oluşturmanız gerektiği anlamına gelmiyor mu?
Kaos

31
DELETED, DROPped değil .
Tripp Kinetics

10
Her seansta geçici tablo oluşturmazsınız, ancak bir kez. Tablo, sistem genelinde mevcuttur. Tabloya, paralel oturumlar da dahil olmak üzere oluşturduğunuz herhangi bir oturumdan erişilebilir. ancak bir oturumun içinden veri eklediğinizde, bu veriler sistemdeki diğer paralel oturumlardan görünmez. Bir oturumun verileri yalnızca o oturumun özelliğidir. Bu nedenle veriler oturuma özeldir, sistem açısından görünmez. Dolayısıyla, bir oturumu kapattığınızda, o oturumun verileri tablodan silinir.
SubhasisM

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

10
Satırların her zaman oturumun sonunda silineceğini unutmayın; ON COMMIT DELETE ROWSoturum sırasında aşamalı olarak taahhütte bulunursanız, daha erken atılacakları anlamına gelir.

1
zygimantus, evet, seans sırasında manuel olarak silebilirsiniz. Oturum sırasında, geçici masa tam olarak normal bir masa gibi davranır. Bir kullanıcının bakış açısından, geçici bir tablo ile gerçek bir tablo arasındaki tek fark, oturum sona erdiğinde tüm satırların silinmesi ve başka hiçbir oturumun oturum tarafından kullanılan tablonun içeriğini okuyamamasıdır. Oturum başına bir tablo örneği vardır; iki oturum aynı geçici tabloyu aynı anda kullanabilir ve herhangi bir çakışma olmaksızın iki farklı satır kümesine sahip olabilir.
Hans Deragon

-2

TABLO OLUŞTUR table_temp_list_objects AS

SEÇİN o.owner, o.object_name sys.all_objects'ten o NEREDE o.object_type = 'TABLO';


Lütfen cevabınızı biçimlendirin. Kodunuz hakkında bir şeyler yazarsanız iyi olur.
Hostel
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.