1

以下のようなカーソルがあります。

CURSOR employee_cur IS
       SELECT * FROM employee where department_id='accounts';

カーソル内の特定の行のデータのみを変更する必要があります。後でこのカーソルを使用する人は、このカーソルから変更されたデータのみを見つける必要があります。

DB テーブルを更新したくありません。誰でもこれについて私を助けることができますか?

4

3 に答える 3

4

できません。

カーソルは読み取り専用の構造です。これは、SQL ステートメントへのポインターです。その SQL ステートメントが実行されると、データベースからデータがフェッチされます。SELECTステートメント自体のデータを好きなだけ操作できます。ただし、カーソルが開かれると、カーソルが返すデータを変更することはできません。

もちろん、SELECTステートメント内のデータを操作することもできます。たとえば、クエリは次のようなことができます

SELECT employee_id, 
       first_name,
       last_name,
       (CASE WHEN last_name = 'King' 
             THEN salary*2
             ELSE salary
         END) salary
  FROM employee

結果セット内の「King」という名前の従業員の給与を 2 倍にします。a を使用しUNION ALLて、データベースに存在しない行を返すことができます。つまり、

SELECT employee_id, 
       first_name,
       last_name,
       salary
  FROM employee
UNION ALL
SELECT -1,
       'Justin',
       'Cave',
       17
  FROM dual
于 2012-08-30T18:00:24.313 に答える
2

達成しようとしているものを取得する最も簡単な方法は、varray またはネストされたテーブル (パイプライン化または out param による) を返すことです。設定すると、必要なすべての変更を行うことができます。本当にカーソルを返す必要があり、UPDATE CURRENT OF のようなものが必要ない場合は、VARRAY/ネストされたテーブルにデータを配置し、IN パラメータとしてパイプライン化された関数に渡し、パイプライン化された関数から select * としてカーソルを作成できます (準備された vararray/nestedテーブル)。

関数内ですべての処理を行い、結果を任意の一時テーブルに置き、一時テーブルからカーソルを返すことができます。

于 2012-08-30T18:24:10.337 に答える
1

コレクションを宣言する -

type my_emp_table_type is table of employee%rowtype;
myEmpTable  my_emp_table_type;

そしてBULK COLLECT、カーソルデータを収集するために使用します。

SELECT * BULK COLLECT INTO myEmpTable 
  FROM employee 
 WHERE department_id='accounts';

次のようなコレクション要素を変更します-

myEmpTable(10).id := 10;
myEmpTable(10).first_name  := 'John';
myEmpTable(10).last_name   := 'Doe';

そして、myEmpTable好きな場所で使用してください。 、次のようにコレクションをループできます

 for i in myEmpTable.first .. myEmpTable.last loop
    if myEmpTable.(i)last_name = 'Doe'
    then
          myEmpTable.(i)sal := 50000;
    end if;
    ...
    ....
 end loop;
于 2012-08-30T21:39:04.790 に答える