Oracleデータベースに一時テーブルをどのように作成しますか?


90

Oracleデータベースに一時テーブルを作成したい

何かのようなもの

Declare table @table (int id)

SQLサーバー

次に、selectステートメントを入力します

出来ますか?

ありがとう

回答:


130

はい、Oracleには一時テーブルがあります。ここへのリンクですAskTomのそれらを説明した記事は、とここで公式OracleがTABLEのマニュアルを作成することです。

ただし、Oracleでは、一時テーブルのデータのみが一時的です。テーブルは、他のセッションから見える通常のオブジェクトです。Oracleで一時テーブルを頻繁に作成および削除することは悪い習慣です。

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

Oracle 18cは、単一セッションのメモリ内オブジェクトであるプライベート一時テーブルを追加しました。詳細については、ドキュメントを参照しください。プライベート一時テーブルは動的に作成および削除できます。

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

一時テーブルは役立つ場合がありますが、一般的にOracleで悪用されます。多くの場合、インラインビューを使用して複数のステップを1つのSQLステートメントに結合することで回避できます。


40
反対投票はありませんが、グローバル一時テーブルにはCREATE TABLE AS SELECTをお勧めしません。経験の浅い開発者は、毎回この方法でGTTを入力する必要があるという誤った考えを理解するかもしれません。確かに、これは別のテーブルから定義をコピーする便利な方法ですが、この例はおそらく一部の人々を混乱させるでしょう。
Jeffrey Kemp、

私はここでJeffrey Kempに完全に同意します。これはこのテーブルを作成する方法の1つにすぎません。私はこれに出くわし、DDLにこのselectステートメントを配置する必要があることに気付きました。
Vijay Kumar

3
「where 1 = 0」を追加するだけです。
Palcente 2017

@Palcenteは、一時的なものを作成するために同じ構造の「実際のテーブル」が必要であることを依然として示唆していますが、そうではありません(これこの回答を参照してください。それとは別に、この回答は、GLOBAL一時テーブルには、しかし、1つはまた、「普通の」一時テーブルを使用することができます。SQL Serverへの違いは、とマシューが指摘し、もう一つの重要なポイントの1を作るべきであることを確認していない「2回目の呼び出し」のエラーに関するミス(または不思議にすでに存在するオブジェクトについて;)
Izzy

2
有効な使用例CREATE TABLE AS SELECT:LOB列を持つリモートテーブルSELECTから直接選択することはできないため、リモートテーブルから選択します。私はリモートデータベースからレコードをコピーする手順を書いており、これが私の解決策でした。レコードをGTTに取り込み、そこから「実際の」テーブルにコピーします。
rgoliveira

78

ほんのヒントです。Oracleの一時テーブルはSQL Serverとは異なります。すべてのセッションではなく、一度だけ作成してください。挿入した行はセッションでのみ表示され、セッションを終了すると(またはトランザクションの終了時、使用する "ON COMMIT"句に応じて)、自動的に削除されます(つまり、TRUNCATEではなくDROP)。


15
よくわかりません。すべてのセッションではなく、1回だけ作成したとおっしゃっていました。ただし、一時テーブルはセッションごとに削除されるとも言っています。これは、セッションごとに一時テーブルを作成する必要があるという意味ではありませんか?
カオス

31
DELETEDDROPped ではありません。
Tripp Kinetics 2014年

10
セッションごとにではなく、一度だけ一時テーブルを作成する必要はありません。テーブルはシステム全体で使用できます。テーブルには、並列セッションを含む、作成したすべてのセッションからアクセスできます。ただし、1つのセッション内からデータを挿入すると、そのデータはシステム全体の他の並列セッションからは見えません。1つのセッションのデータは、そのセッションのみのプロパティです。したがって、データはセッション固有であり、システムごとに表示されません。したがって、1つのセッションを閉じると、そのセッションのデータはテーブルから削除されます。
SubhasisM 2016

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

10
行は常にセッションの終了時に削除されることに注意してください。ON COMMIT DELETE ROWSセッション中に段階的にコミットすると、それらはすぐに破棄されます。

1
zygimantus、はい、セッション中に手動で削除できます。セッション中、一時テーブルは通常のテーブルとまったく同じように動作します。ユーザーの観点から見ると、一時テーブルと実際のテーブルの唯一の違いは、セッションが終了するとすべての行が削除され、他のセッションがセッションで使用されているテーブルの内容を読み取れないことです。セッションごとにテーブルのインスタンスがあります。2つのセッションが同じ一時テーブルを同時に使用し、競合することなく2つの異なる行セットを持つことができます。
Hans Deragon 2017年

-2

CREATE TABLE table_temp_list_objects AS

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


回答をフォーマットしてください。あなたのコードについて何か書いたらいいでしょう。
ホステル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.