2011-12-25 16 views
-1

私は一時テーブルを作成し、この一時テーブルからカーソルを使用してデータを抽出し、データを処理して一時テーブルを削除するPL/SQLプロシージャを使用します。ただし、表がデータベースに存在しない場合、Oracleはカーソルの使用を許可しません。Oracleでカーソルを作成する前にテーブルを作成する

私はこれを手伝ってください。

+4

一時テーブルを作成してから一度作成するのではなく、それらを何度も何度も使用するのはなぜですか? - SQL Serverのバックグラウンドを使用している場合、Oracleは異なります。テンポラリテーブルは、一時的なデータを保持する永続オブジェクトです。 –

答えて

8

あなたの声明はあまり正しくありません。ほとんど任意のクエリにはカーソルを使用できます。以下を参照してください:

create or replace procedure fooproc 
IS 
    type acursor is ref cursor; 
    mycur acursor; 
    mydate date; 
BEGIN 
    execute immediate 'create global temporary table footmp (bar date) on commit delete rows'; 
    execute immediate 'insert into footmp values (SYSDATE)'; 
    open mycur for 'select * from footmp'; 
    loop 
     fetch mycur into mydate; 
     exit when mycur%notfound; 
     dbms_output.put_line(mydate); 
    end loop; 
    close mycur; 
    execute immediate 'drop table footmp'; 
END fooproc; 
/

(詳細hereを - テーブル名が固定され、セッションに依存していない、まったくので、特にこの短いprocは安全ではありません)。

これはかなり醜いです。私はそれを使用することをお勧めしません - むしろ、プロシージャ固有の一時テーブルが必要かどうかを考える必要があります。

this other articleを参照してください:

が動的に[一時テーブル]を作成しないでください、それらを動的に作成しない、してください - それらを動的に作成しないでください。

グローバル一時テーブルを使用できませんでしたか?実際に一時テーブルが必要ですか? (つまり、そのテーブルの作業に使用するSELECT文のカーソルを使用しない場合)

1

また、グローバル一時テーブルと「通常の」永続テーブルの違いを避けたい場合は、 (Oracle docs一時テーブルのデータの可用性、有効期間などを参照)、単に最初にテーブルを作成する(nologging)。誰もこのテーブルを使用していないと仮定すると、プロシージャは処理の前後に切り捨てられます。

関連する問題