2011-10-25 23 views
0

私は毎日のジョブに応じて実行されるPL-SQLストアド・プロシージャを使用しています。ストアドプロシージャ内 は、私はそのようなグローバルな一時テーブルを使用しようとしています:ジョブ内のグローバル・テンポラリ・テーブルを使用

CREATE GLOBAL TEMPORARY TABLE A_Table 
ON COMMIT PRESERVE ROWS 
AS SELECT * from B_Table 

をして、私はそのようなインデックスを作成しようとします:

:私は2つの問題を抱えている

CREATE INDEX idx_a ON A_Table (id) 

  1. 作成したテーブルは常に空です。つまり、ストアドプロシージャの計算はすべてゼロになります。
  2. 私はこのエラーを得たインデックスを作成しようとしているとき:

    ORA-14452:すでに使用何かアドバイス

に一時テーブルにインデックスを作成、変更またはドロップしようとしてください。 ??

よろしく

答えて

3
  1. (あなたがon commit delete rowsを指定した場合、またはトランザクション)のみのセッションの残りの部分があるだろう一時テーブルに置かれた任意のデータ。セッション間でデータを保存する場合は、通常の表を使用します。

  2. 一時テーブルを使用するセッションを閉じて、もう一度やり直してください。

0
  1. 作成した表は、空でないかもしれないが、唯一のセッションのために、それはそれを埋めます。各セッションは、つまり、それは一時テーブルの独自のインスタンスです。ところで、それは一時テーブルの主な機能です。

  2. 温度の変更。今までそれを使用していたすべてのセッションが生きている間、テーブルには、あなたは一時テーブルを作成しているが、おそらくあなたが一度それを作成して、それのすべてを再作成しようとしていない言及

1

(アクティブではないかもしれない)、不可能ですplsqlコードが実行され、インデックス定義がtempテーブルに残ることもあります。これは、コードを実行するたびに作成する必要はありません。

グローバル・テンポラリ・テーブルには静的な定義があります。作成するだけで、そこには存在しますが、リドゥ/アンドゥを生成せず、そこに含まれるデータは、

SQL*Plus: Release 10.1.0.4.2 - Production on Wed Oct 26 01:23:17 2011 

    Copyright (c) 1982, 2005, Oracle. All rights reserved. 


    Connected to: 
    Oracle Database 10g Express Edition Release 10.2.0.1.0 - Production 

    SQL> select * from test; 

    no rows selected 

    SQL> insert into test values ('three'); 

    1 row created. 

    SQL> select * from test; 

    NAME 
    -------------------- 
    three 

バック最初のセッション SQL>コミット内の別のセッションで次に

SQL*Plus: Release 10.1.0.4.2 - Production on Wed Oct 26 01:22:30 2011 

    Copyright (c) 1982, 2005, Oracle. All rights reserved. 


    Connected to: 
    Oracle Database 10g Express Edition Release 10.2.0.1.0 - Production 

    SQL> create global temporary table test (name varchar2(20)); 

    Table created. 

    SQL> insert into test values ('one'); 

    1 row created. 

    SQL> insert into test values ('two'); 

    1 row created. 

    SQL> select * from test; 

    NAME 
    -------------------- 
    one 
    two 

Commit complete. 

    SQL> select * from test; 

    no rows selected 

    SQL> drop table test; 
    drop table test 
       * 
    ERROR at line 1: 
    ORA-14452: attempt to create, alter or drop an index on temporary table already 
    in use 

私たちは私たちの第二のセッションにデータを挿入しているので、我々は第二のセッションでコミットするまで、我々は一時テーブル に何かを傾けるし、ドロップが

を成功あなたは内容を持っているためのオプションを持っていますコミット(行のコミット時)またはセッションが終了するまでのデータの保持(コミット行の保存時)のいずれかで作成されたセッションに対してクリアされます。

関連する問題