4

私はSybase/SQLサーバーに精通しており、一時的なものを作成できます。このようなテーブル:

SELECT * 
INTO   #temp
FROM   tab1 , 
       tab2 
WHERE  tab1.key = tab2.fkey

SELECT * 
FROM   #temp 
WHERE  field1 = 'value' 

#tempはこのセッションの間のみ存在し、私だけが見ることができます。

Oracleでも同様のことをしたいのですが、「グローバル一時テーブル」について読んでいますが、同じようには聞こえません。

OracleでSybaseと同じことを行うにはどうすればよいですか?

ありがとう :)

4

6 に答える 6

4

グローバル一時テーブルは同じではありません。定義はセッションの終了後も残り、テーブル(データではない)もすべてのセッションに表示されます。

ストアドプロシージャを作成している場合、カーソルを調べましたか?これはもう少し複雑ですが、一時データセットを操作するための非常に効率的でクリーンな方法です。

于 2008-10-21T13:35:41.403 に答える
4

最初のアプローチは、これを単一のクエリとして実行することです。

SELECT * 
FROM   
(
SELECT * 
FROM   tab1 , 
       tab2 
WHERE  tab1.key = tab2.fkey
)
WHERE  field1 = 'value';

非常に複雑な状況や temp# が非常に大きい場合は、オプションでマテリアライズ ヒントを使用して、サブクエリの因数分解句を試してください。

with #temp as
(
SELECT /*+ materialize */ 
       * 
FROM   tab1 , 
       tab2 
WHERE  tab1.key = tab2.fkey
)
SELECT * 
FROM   temp#
WHERE  field1 = 'value';

それでも問題が解決しない場合は、グローバル一時テーブルの方法に進んでください。

于 2008-10-22T13:31:06.733 に答える
2

Oracle は、この機能に直接対応する機能を提供していません。グローバル一時テーブルも同様ですが、事前に作成する必要があり、ロックの問題により変更が難しい場合があります。

この性質のほとんどのニーズは、カーソルまたはさまざまな pl/sql コレクション タイプ (ネストされたテーブル、VARRAY、連想配列) のいずれかで満たすことができますが、それらをテーブルのように使用することはできません。つまり、それらから SELECT することはできません。

于 2008-10-21T19:25:05.083 に答える
1

一時テーブルモデルはOracleでは多少異なり、「CREATE GLOBALTEMPORARYTABLE..」ステートメントを中心にしています。一時テーブルの定義は常にグローバルですが、データは常にセッションに対してプライベートであり、データがコミットを超えて存続するかどうかは、「コミット保存行」または「コミット削除行」のどちらの条件が指定されているかによって異なります。

いくつかのPerlスクリプトと、ブログの特定の動作またはOracle一時テーブルを調査するブログ投稿があります。

于 2008-10-22T13:38:34.533 に答える
1

グローバル一時テーブルは同じだと思います。これらは、セッションが終了すると終了する一時テーブルへのプライベートアクセスを提供します。

グローバル一時テーブルのデータはプライベートであるため、セッションによって挿入されたデータには、そのセッションからのみアクセスできます。グローバル一時テーブルのセッション固有の行は、セッション全体、または現在のトランザクションのみで保持できます。ON COMMIT DELETE ROWS句は、トランザクションの最後にデータを削除する必要があることを示します。

質問をもう数回読んだ後、それが主な違いだと思います。おそらくあなたの問題は、一時テーブルがセッション間で存続することです。したがって、Oracleで想像するように、正確に同等のものは不可能です。

CREATE GLOBAL TEMPORARY TABLE my_temp_table ON COMMIT DELETE ROWS select * from other table;

そのテーブルは、その中のデータはそうではありませんが、セッションを介してもドロップされるまで存続します。代わりに、事前に一時テーブルを作成する必要があります。

于 2008-10-21T13:28:06.023 に答える
0

はい、カーソンはそれを正しく持っています。グローバル一時テーブルは、それらを作成するセッションにのみ表示され、最初のコミットまたはロールバック、あるいはセッションの終了時に非表示になります。gttを作成するときに設定できます。

于 2008-10-21T13:30:31.820 に答える