以下のようなカーソルがあります。
CURSOR employee_cur IS
SELECT * FROM employee where department_id='accounts';
カーソル内の特定の行のデータのみを変更する必要があります。後でこのカーソルを使用する人は、このカーソルから変更されたデータのみを見つける必要があります。
DB テーブルを更新したくありません。誰でもこれについて私を助けることができますか?
できません。
カーソルは読み取り専用の構造です。これは、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
達成しようとしているものを取得する最も簡単な方法は、varray またはネストされたテーブル (パイプライン化または out param による) を返すことです。設定すると、必要なすべての変更を行うことができます。本当にカーソルを返す必要があり、UPDATE CURRENT OF のようなものが必要ない場合は、VARRAY/ネストされたテーブルにデータを配置し、IN パラメータとしてパイプライン化された関数に渡し、パイプライン化された関数から select * としてカーソルを作成できます (準備された vararray/nestedテーブル)。
関数内ですべての処理を行い、結果を任意の一時テーブルに置き、一時テーブルからカーソルを返すことができます。
コレクションを宣言する -
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;