私は一時テーブルを作成し、この一時テーブルからカーソルを使用してデータを抽出し、データを処理して一時テーブルを削除するPL/SQLプロシージャを使用します。ただし、表がデータベースに存在しない場合、Oracleはカーソルの使用を許可しません。Oracleでカーソルを作成する前にテーブルを作成する
私はこれを手伝ってください。
私は一時テーブルを作成し、この一時テーブルからカーソルを使用してデータを抽出し、データを処理して一時テーブルを削除するPL/SQLプロシージャを使用します。ただし、表がデータベースに存在しない場合、Oracleはカーソルの使用を許可しません。Oracleでカーソルを作成する前にテーブルを作成する
私はこれを手伝ってください。
あなたの声明はあまり正しくありません。ほとんど任意のクエリにはカーソルを使用できます。以下を参照してください:
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文のカーソルを使用しない場合)
また、グローバル一時テーブルと「通常の」永続テーブルの違いを避けたい場合は、 (Oracle docs一時テーブルのデータの可用性、有効期間などを参照)、単に最初にテーブルを作成する(nologging)。誰もこのテーブルを使用していないと仮定すると、プロシージャは処理の前後に切り捨てられます。
一時テーブルを作成してから一度作成するのではなく、それらを何度も何度も使用するのはなぜですか? - SQL Serverのバックグラウンドを使用している場合、Oracleは異なります。テンポラリテーブルは、一時的なデータを保持する永続オブジェクトです。 –